feat: update dependencies to latest compatible versions

- Update frontend dependencies (SolidJS, Vite, Tailwind, etc.)
- Update backend dependencies (Tauri 1.8.3, Tokio, Serde, etc.)
- Fix thread safety issues with SafeDisplay wrapper for ddc-hi::Display
- Resolve display-info API compatibility issues
- All dependencies updated within major version constraints
This commit is contained in:
2025-06-30 17:35:03 +08:00
parent b1fd751090
commit ddf61c861d
6 changed files with 1633 additions and 853 deletions

View File

@ -11,23 +11,23 @@
}, },
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@solidjs/router": "^0.8.2", "@solidjs/router": "^0.8.4",
"@tauri-apps/api": "^1.3.0", "@tauri-apps/api": "^1.6.0",
"debug": "^4.3.4", "debug": "^4.4.1",
"solid-icons": "^1.0.8", "solid-icons": "^1.1.0",
"solid-js": "^1.7.6", "solid-js": "^1.9.7",
"solid-tippy": "^0.2.1", "solid-tippy": "^0.2.1",
"tippy.js": "^6.3.7" "tippy.js": "^6.3.7"
}, },
"devDependencies": { "devDependencies": {
"@tauri-apps/cli": "^1.3.1", "@tauri-apps/cli": "^1.6.3",
"@types/debug": "^4.1.8", "@types/debug": "^4.1.12",
"@types/node": "^18.16.17", "@types/node": "^18.19.113",
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.21",
"postcss": "^8.4.24", "postcss": "^8.5.6",
"tailwindcss": "^3.3.2", "tailwindcss": "^3.4.17",
"typescript": "^4.9.5", "typescript": "^4.9.5",
"vite": "^4.3.9", "vite": "^4.5.14",
"vite-plugin-solid": "^2.7.0" "vite-plugin-solid": "^2.11.7"
} }
} }

68
pnpm-lock.yaml generated
View File

@ -9,19 +9,19 @@ importers:
.: .:
dependencies: dependencies:
'@solidjs/router': '@solidjs/router':
specifier: ^0.8.2 specifier: ^0.8.4
version: 0.8.4(solid-js@1.9.7) version: 0.8.4(solid-js@1.9.7)
'@tauri-apps/api': '@tauri-apps/api':
specifier: ^1.3.0 specifier: ^1.6.0
version: 1.6.0 version: 1.6.0
debug: debug:
specifier: ^4.3.4 specifier: ^4.4.1
version: 4.4.1 version: 4.4.1
solid-icons: solid-icons:
specifier: ^1.0.8 specifier: ^1.1.0
version: 1.1.0(solid-js@1.9.7) version: 1.1.0(solid-js@1.9.7)
solid-js: solid-js:
specifier: ^1.7.6 specifier: ^1.9.7
version: 1.9.7 version: 1.9.7
solid-tippy: solid-tippy:
specifier: ^0.2.1 specifier: ^0.2.1
@ -31,31 +31,31 @@ importers:
version: 6.3.7 version: 6.3.7
devDependencies: devDependencies:
'@tauri-apps/cli': '@tauri-apps/cli':
specifier: ^1.3.1 specifier: ^1.6.3
version: 1.6.3 version: 1.6.3
'@types/debug': '@types/debug':
specifier: ^4.1.8 specifier: ^4.1.12
version: 4.1.12 version: 4.1.12
'@types/node': '@types/node':
specifier: ^18.16.17 specifier: ^18.19.113
version: 18.19.113 version: 18.19.113
autoprefixer: autoprefixer:
specifier: ^10.4.14 specifier: ^10.4.21
version: 10.4.21(postcss@8.5.6) version: 10.4.21(postcss@8.5.6)
postcss: postcss:
specifier: ^8.4.24 specifier: ^8.5.6
version: 8.5.6 version: 8.5.6
tailwindcss: tailwindcss:
specifier: ^3.3.2 specifier: ^3.4.17
version: 3.4.17 version: 3.4.17
typescript: typescript:
specifier: ^4.9.5 specifier: ^4.9.5
version: 4.9.5 version: 4.9.5
vite: vite:
specifier: ^4.3.9 specifier: ^4.5.14
version: 4.5.14(@types/node@18.19.113) version: 4.5.14(@types/node@18.19.113)
vite-plugin-solid: vite-plugin-solid:
specifier: ^2.7.0 specifier: ^2.11.7
version: 2.11.7(solid-js@1.9.7)(vite@4.5.14(@types/node@18.19.113)) version: 2.11.7(solid-js@1.9.7)(vite@4.5.14(@types/node@18.19.113))
packages: packages:
@ -281,23 +281,18 @@ packages:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'} engines: {node: '>=12'}
'@jridgewell/gen-mapping@0.3.8': '@jridgewell/gen-mapping@0.3.10':
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} resolution: {integrity: sha512-HM2F4B9N4cA0RH2KQiIZOHAZqtP4xGS4IZ+SFe1SIbO4dyjf9MTY2Bo3vHYnm0hglWfXqBrzUBSa+cJfl3Xvrg==}
engines: {node: '>=6.0.0'}
'@jridgewell/resolve-uri@3.1.2': '@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'} engines: {node: '>=6.0.0'}
'@jridgewell/set-array@1.2.1': '@jridgewell/sourcemap-codec@1.5.2':
resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} resolution: {integrity: sha512-gKYheCylLIedI+CSZoDtGkFV9YEBxRRVcfCH7OfAqh4TyUyRjEE6WVE/aXDXX0p8BIe/QgLcaAoI0220KRRFgg==}
engines: {node: '>=6.0.0'}
'@jridgewell/sourcemap-codec@1.5.0': '@jridgewell/trace-mapping@0.3.27':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} resolution: {integrity: sha512-VO95AxtSFMelbg3ouljAYnfvTEwSWVt/2YLf+U5Ejd8iT5mXE2Sa/1LGyvySMne2CGsepGLI7KpF3EzE3Aq9Mg==}
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
'@nodelib/fs.scandir@2.1.5': '@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
@ -1014,8 +1009,8 @@ snapshots:
'@ampproject/remapping@2.3.0': '@ampproject/remapping@2.3.0':
dependencies: dependencies:
'@jridgewell/gen-mapping': 0.3.8 '@jridgewell/gen-mapping': 0.3.10
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.27
'@babel/code-frame@7.27.1': '@babel/code-frame@7.27.1':
dependencies: dependencies:
@ -1049,8 +1044,8 @@ snapshots:
dependencies: dependencies:
'@babel/parser': 7.27.7 '@babel/parser': 7.27.7
'@babel/types': 7.27.7 '@babel/types': 7.27.7
'@jridgewell/gen-mapping': 0.3.8 '@jridgewell/gen-mapping': 0.3.10
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.27
jsesc: 3.1.0 jsesc: 3.1.0
'@babel/helper-compilation-targets@7.27.2': '@babel/helper-compilation-targets@7.27.2':
@ -1201,22 +1196,19 @@ snapshots:
wrap-ansi: 8.1.0 wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0 wrap-ansi-cjs: wrap-ansi@7.0.0
'@jridgewell/gen-mapping@0.3.8': '@jridgewell/gen-mapping@0.3.10':
dependencies: dependencies:
'@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.2
'@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.27
'@jridgewell/trace-mapping': 0.3.25
'@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/set-array@1.2.1': {} '@jridgewell/sourcemap-codec@1.5.2': {}
'@jridgewell/sourcemap-codec@1.5.0': {} '@jridgewell/trace-mapping@0.3.27':
'@jridgewell/trace-mapping@0.3.25':
dependencies: dependencies:
'@jridgewell/resolve-uri': 3.1.2 '@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/sourcemap-codec': 1.5.2
'@nodelib/fs.scandir@2.1.5': '@nodelib/fs.scandir@2.1.5':
dependencies: dependencies:
@ -1751,7 +1743,7 @@ snapshots:
sucrase@3.35.0: sucrase@3.35.0:
dependencies: dependencies:
'@jridgewell/gen-mapping': 0.3.8 '@jridgewell/gen-mapping': 0.3.10
commander: 4.1.1 commander: 4.1.1
glob: 10.4.5 glob: 10.4.5
lines-and-columns: 1.2.4 lines-and-columns: 1.2.4

2357
src-tauri/Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -5,9 +5,27 @@ use tokio::sync::RwLock;
use super::DisplayState; use super::DisplayState;
// Safe wrapper for Display that implements Send + Sync
pub struct SafeDisplay {
display: Display,
}
unsafe impl Send for SafeDisplay {}
unsafe impl Sync for SafeDisplay {}
impl SafeDisplay {
pub fn new(display: Display) -> Self {
Self { display }
}
pub fn get_mut(&mut self) -> &mut Display {
&mut self.display
}
}
pub struct DisplayHandler { pub struct DisplayHandler {
pub state: Arc<RwLock<DisplayState>>, pub state: Arc<RwLock<DisplayState>>,
pub controller: Arc<RwLock<Display>>, pub controller: Arc<RwLock<SafeDisplay>>,
} }
impl DisplayHandler { impl DisplayHandler {
@ -16,7 +34,7 @@ impl DisplayHandler {
let mut temp_state = self.state.read().await.clone(); let mut temp_state = self.state.read().await.clone();
match controller.handle.get_vcp_feature(0x10) { match controller.get_mut().handle.get_vcp_feature(0x10) {
Ok(value) => { Ok(value) => {
temp_state.max_brightness = value.maximum(); temp_state.max_brightness = value.maximum();
temp_state.min_brightness = 0; temp_state.min_brightness = 0;
@ -24,7 +42,7 @@ impl DisplayHandler {
} }
Err(_) => {} Err(_) => {}
}; };
match controller.handle.get_vcp_feature(0x12) { match controller.get_mut().handle.get_vcp_feature(0x12) {
Ok(value) => { Ok(value) => {
temp_state.max_contrast = value.maximum(); temp_state.max_contrast = value.maximum();
temp_state.min_contrast = 0; temp_state.min_contrast = 0;
@ -32,7 +50,7 @@ impl DisplayHandler {
} }
Err(_) => {} Err(_) => {}
}; };
match controller.handle.get_vcp_feature(0xdc) { match controller.get_mut().handle.get_vcp_feature(0xdc) {
Ok(value) => { Ok(value) => {
temp_state.max_mode = value.maximum(); temp_state.max_mode = value.maximum();
temp_state.min_mode = 0; temp_state.min_mode = 0;
@ -52,6 +70,7 @@ impl DisplayHandler {
let mut state = self.state.write().await; let mut state = self.state.write().await;
controller controller
.get_mut()
.handle .handle
.set_vcp_feature(0x10, brightness) .set_vcp_feature(0x10, brightness)
.map_err(|err| anyhow::anyhow!("can not set brightness. {:?}", err))?; .map_err(|err| anyhow::anyhow!("can not set brightness. {:?}", err))?;
@ -69,6 +88,7 @@ impl DisplayHandler {
let mut state = self.state.write().await; let mut state = self.state.write().await;
controller controller
.get_mut()
.handle .handle
.set_vcp_feature(0x12, contrast) .set_vcp_feature(0x12, contrast)
.map_err(|err| anyhow::anyhow!("can not set contrast. {:?}", err))?; .map_err(|err| anyhow::anyhow!("can not set contrast. {:?}", err))?;
@ -84,6 +104,7 @@ impl DisplayHandler {
let mut state = self.state.write().await; let mut state = self.state.write().await;
controller controller
.get_mut()
.handle .handle
.set_vcp_feature(0xdc, mode) .set_vcp_feature(0xdc, mode)
.map_err(|err| anyhow::anyhow!("can not set mode. {:?}", err))?; .map_err(|err| anyhow::anyhow!("can not set mode. {:?}", err))?;

View File

@ -13,7 +13,7 @@ use crate::{
rpc::{BoardMessageChannels, DisplaySetting}, rpc::{BoardMessageChannels, DisplaySetting},
}; };
use super::{display_handler::DisplayHandler, display_state::DisplayState}; use super::{display_handler::{DisplayHandler, SafeDisplay}, display_state::DisplayState};
const CONFIG_FILE_NAME: &str = "cc.ivanli.ambient_light/displays.toml"; const CONFIG_FILE_NAME: &str = "cc.ivanli.ambient_light/displays.toml";
@ -85,7 +85,8 @@ impl DisplayManager {
let controllers = Display::enumerate(); let controllers = Display::enumerate();
for display in controllers { for display in controllers {
let controller = Arc::new(RwLock::new(display)); let safe_display = SafeDisplay::new(display);
let controller = Arc::new(RwLock::new(safe_display));
let state = Arc::new(RwLock::new(DisplayState::default())); let state = Arc::new(RwLock::new(DisplayState::default()));
let handler = DisplayHandler { let handler = DisplayHandler {
state: state.clone(), state: state.clone(),

View File

@ -20,7 +20,6 @@ use serde::{Deserialize, Serialize};
use serde_json::to_string; use serde_json::to_string;
use tauri::{http::ResponseBuilder, regex, Manager}; use tauri::{http::ResponseBuilder, regex, Manager};
use volume::VolumeManager; use volume::VolumeManager;
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(remote = "DisplayInfo")] #[serde(remote = "DisplayInfo")]
struct DisplayInfoDef { struct DisplayInfoDef {