Skip to content

Commit b328a04

Browse files
committed
fix(bg): betteries state not being updated
1 parent 9071e4f commit b328a04

File tree

2 files changed

+39
-39
lines changed

2 files changed

+39
-39
lines changed

src/background/modules/power/application.rs

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
use std::sync::{Arc, LazyLock};
1+
use std::sync::LazyLock;
22

3-
use parking_lot::Mutex;
43
use seelen_core::system_state::{Battery, PowerMode, PowerStatus};
54
use windows::Win32::{
65
Foundation::HANDLE,
@@ -22,22 +21,16 @@ use crate::{
2221
error::{Result, ResultLogExt},
2322
event_manager,
2423
modules::power::domain::power_mode_to_serializable,
25-
trace_lock,
24+
utils::lock_free::TracedMutex,
2625
windows_api::{event_window::subscribe_to_background_window, WindowsApi},
2726
};
2827

2928
use super::domain::{battery_to_slu_battery, power_status_to_serializable};
3029

31-
static POWER_MANAGER: LazyLock<Arc<Mutex<PowerManager>>> = LazyLock::new(|| {
32-
let mut pm = PowerManager::new();
33-
pm.init().log_error();
34-
Arc::new(Mutex::new(pm))
35-
});
36-
3730
#[derive(Debug)]
3831
pub struct PowerManager {
3932
pub power_status: PowerStatus,
40-
pub current_power_mode: PowerMode,
33+
pub power_mode: PowerMode,
4134
pub batteries: Vec<Battery>,
4235

4336
power_setting_battery_percent_token: Option<HPOWERNOTIFY>,
@@ -47,7 +40,12 @@ pub struct PowerManager {
4740
event_manager!(PowerManager, PowerManagerEvent);
4841

4942
impl PowerManager {
50-
pub fn instance() -> &'static Arc<Mutex<Self>> {
43+
pub fn instance() -> &'static TracedMutex<Self> {
44+
static POWER_MANAGER: LazyLock<TracedMutex<PowerManager>> = LazyLock::new(|| {
45+
let mut pm = PowerManager::new();
46+
pm.init().log_error();
47+
TracedMutex::new(pm)
48+
});
5149
&POWER_MANAGER
5250
}
5351

@@ -60,6 +58,22 @@ impl PowerManager {
6058
self.power_status = Self::get_power_status()?;
6159
self.batteries = Self::get_batteries()?;
6260

61+
let eid = Self::subscribe(|event| {
62+
let mut guard = Self::instance().lock();
63+
match event {
64+
PowerManagerEvent::BatteriesChanged(batteries) => {
65+
guard.batteries = batteries;
66+
}
67+
PowerManagerEvent::PowerStatusChanged(status) => {
68+
guard.power_status = status;
69+
}
70+
PowerManagerEvent::PowerModeChanged(mode) => {
71+
guard.power_mode = mode;
72+
}
73+
}
74+
});
75+
Self::set_event_handler_priority(&eid, 1);
76+
6377
// https://learn.microsoft.com/en-us/windows/win32/api/powersetting/nf-powersetting-powerregisterforeffectivepowermodenotifications#remarks
6478
unsafe {
6579
let mut unregister_token_ptr = std::ptr::null_mut();
@@ -101,11 +115,11 @@ impl PowerManager {
101115
mode: EFFECTIVE_POWER_MODE,
102116
_ctx: *const std::ffi::c_void,
103117
) {
104-
let mut guard = trace_lock!(POWER_MANAGER);
118+
let mut guard = Self::instance().lock();
105119
let mode: PowerMode = power_mode_to_serializable(mode);
106-
if guard.current_power_mode != mode {
120+
if guard.power_mode != mode {
107121
log::trace!("Power mode changed to {mode:?}");
108-
guard.current_power_mode = mode;
122+
guard.power_mode = mode;
109123
Self::send(PowerManagerEvent::PowerModeChanged(mode));
110124
}
111125
}
@@ -143,15 +157,13 @@ impl PowerManager {
143157

144158
match w_param as u32 {
145159
PBT_APMPOWERSTATUSCHANGE => {
146-
let mut guard = trace_lock!(POWER_MANAGER);
147160
let new_status = Self::get_power_status()?;
148-
if guard.power_status.ac_line_status != new_status.ac_line_status {
149-
let batteries = Self::get_batteries()?;
150-
guard.batteries = batteries.clone();
151-
Self::send(PowerManagerEvent::BatteriesChanged(batteries));
161+
if Self::instance().lock().power_status.ac_line_status != new_status.ac_line_status
162+
{
163+
Self::send(PowerManagerEvent::BatteriesChanged(Self::get_batteries()?));
152164
}
165+
153166
log::trace!("Power status changed to {new_status:?}");
154-
guard.power_status = new_status.clone();
155167
Self::send(PowerManagerEvent::PowerStatusChanged(new_status));
156168
}
157169
PBT_APMRESUMESUSPEND | PBT_APMRESUMEAUTOMATIC => {
@@ -163,20 +175,12 @@ impl PowerManager {
163175

164176
log::trace!("Refreshing power state after wake up");
165177
if let Ok(new_status) = Self::get_power_status() {
166-
let mut guard = trace_lock!(POWER_MANAGER);
167-
guard.power_status = new_status.clone();
168178
Self::send(PowerManagerEvent::PowerStatusChanged(new_status));
169179
}
170180

171181
if let Ok(batteries) = Self::get_batteries() {
172-
let mut guard = trace_lock!(POWER_MANAGER);
173-
guard.batteries = batteries.clone();
174182
Self::send(PowerManagerEvent::BatteriesChanged(batteries));
175183
}
176-
177-
let guard = trace_lock!(POWER_MANAGER);
178-
let current_mode = guard.current_power_mode;
179-
Self::send(PowerManagerEvent::PowerModeChanged(current_mode));
180184
});
181185
}
182186
_ => {}
@@ -198,7 +202,7 @@ impl Default for PowerManager {
198202
fn default() -> Self {
199203
Self {
200204
power_status: power_status_to_serializable(SYSTEM_POWER_STATUS::default()),
201-
current_power_mode: PowerMode::Unknown,
205+
power_mode: PowerMode::Unknown,
202206
batteries: Vec::new(),
203207
power_mode_event_token: None,
204208
power_setting_battery_percent_token: None,

src/background/modules/power/infrastructure.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ use crate::{
1111
error::Result,
1212
log_error,
1313
modules::power::application::{PowerManager, PowerManagerEvent},
14-
trace_lock,
14+
utils::lock_free::TracedMutex,
1515
windows_api::WindowsApi,
1616
};
1717

1818
/// Lazy initialization wrapper that registers Tauri events on first access
1919
/// This keeps Tauri logic separate from system logic while ensuring lazy initialization
20-
fn get_power_manager() {
20+
fn get_power_manager() -> &'static TracedMutex<PowerManager> {
2121
static TAURI_EVENT_REGISTRATION: Once = Once::new();
2222
TAURI_EVENT_REGISTRATION.call_once(|| {
2323
PowerManager::subscribe(|event| match event {
@@ -32,26 +32,22 @@ fn get_power_manager() {
3232
}
3333
});
3434
});
35-
// Access the lazy lock to ensure initialization
36-
let _ = &*trace_lock!(PowerManager::instance());
35+
PowerManager::instance()
3736
}
3837

3938
#[tauri::command(async)]
4039
pub fn get_power_status() -> PowerStatus {
41-
get_power_manager();
42-
trace_lock!(PowerManager::instance()).power_status.clone()
40+
get_power_manager().lock().power_status.clone()
4341
}
4442

4543
#[tauri::command(async)]
4644
pub fn get_power_mode() -> PowerMode {
47-
get_power_manager();
48-
trace_lock!(PowerManager::instance()).current_power_mode
45+
get_power_manager().lock().power_mode
4946
}
5047

5148
#[tauri::command(async)]
5249
pub fn get_batteries() -> Vec<Battery> {
53-
get_power_manager();
54-
trace_lock!(PowerManager::instance()).batteries.clone()
50+
get_power_manager().lock().batteries.clone()
5551
}
5652

5753
#[tauri::command(async)]

0 commit comments

Comments
 (0)