windows: More precise handling of WM_SETTINGCHANGE
and appearance updates (#33829)
This PR adds more fine-grained handling of the `WM_SETTINGCHANGE` message. Plus, we now only trigger the `appearance_changed` callback when the actual window appearance has changed, rather than calling it every time. Release Notes: - N/A
This commit is contained in:
parent
968587a745
commit
cdb7564d89
4 changed files with 89 additions and 46 deletions
|
@ -93,7 +93,7 @@ pub(crate) fn handle_msg(
|
|||
WM_IME_STARTCOMPOSITION => handle_ime_position(handle, state_ptr),
|
||||
WM_IME_COMPOSITION => handle_ime_composition(handle, lparam, state_ptr),
|
||||
WM_SETCURSOR => handle_set_cursor(handle, lparam, state_ptr),
|
||||
WM_SETTINGCHANGE => handle_system_settings_changed(handle, lparam, state_ptr),
|
||||
WM_SETTINGCHANGE => handle_system_settings_changed(handle, wparam, lparam, state_ptr),
|
||||
WM_INPUTLANGCHANGE => handle_input_language_changed(lparam, state_ptr),
|
||||
WM_GPUI_CURSOR_STYLE_CHANGED => handle_cursor_changed(lparam, state_ptr),
|
||||
_ => None,
|
||||
|
@ -1152,37 +1152,23 @@ fn handle_set_cursor(
|
|||
|
||||
fn handle_system_settings_changed(
|
||||
handle: HWND,
|
||||
wparam: WPARAM,
|
||||
lparam: LPARAM,
|
||||
state_ptr: Rc<WindowsWindowStatePtr>,
|
||||
) -> Option<isize> {
|
||||
let mut lock = state_ptr.state.borrow_mut();
|
||||
let display = lock.display;
|
||||
// system settings
|
||||
lock.system_settings.update(display);
|
||||
// mouse double click
|
||||
lock.click_state.system_update();
|
||||
// window border offset
|
||||
lock.border_offset.update(handle).log_err();
|
||||
drop(lock);
|
||||
|
||||
// lParam is a pointer to a string that indicates the area containing the system parameter
|
||||
// that was changed.
|
||||
let parameter = PCWSTR::from_raw(lparam.0 as _);
|
||||
if unsafe { !parameter.is_null() && !parameter.is_empty() } {
|
||||
if let Some(parameter_string) = unsafe { parameter.to_string() }.log_err() {
|
||||
log::info!("System settings changed: {}", parameter_string);
|
||||
match parameter_string.as_str() {
|
||||
"ImmersiveColorSet" => {
|
||||
handle_system_theme_changed(handle, state_ptr);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if wparam.0 != 0 {
|
||||
let mut lock = state_ptr.state.borrow_mut();
|
||||
let display = lock.display;
|
||||
lock.system_settings.update(display, wparam.0);
|
||||
lock.click_state.system_update(wparam.0);
|
||||
lock.border_offset.update(handle).log_err();
|
||||
} else {
|
||||
handle_system_theme_changed(handle, lparam, state_ptr)?;
|
||||
};
|
||||
// Force to trigger WM_NCCALCSIZE event to ensure that we handle auto hide
|
||||
// taskbar correctly.
|
||||
notify_frame_changed(handle);
|
||||
|
||||
Some(0)
|
||||
}
|
||||
|
||||
|
@ -1199,17 +1185,34 @@ fn handle_system_command(wparam: WPARAM, state_ptr: Rc<WindowsWindowStatePtr>) -
|
|||
|
||||
fn handle_system_theme_changed(
|
||||
handle: HWND,
|
||||
lparam: LPARAM,
|
||||
state_ptr: Rc<WindowsWindowStatePtr>,
|
||||
) -> Option<isize> {
|
||||
let mut callback = state_ptr
|
||||
.state
|
||||
.borrow_mut()
|
||||
.callbacks
|
||||
.appearance_changed
|
||||
.take()?;
|
||||
callback();
|
||||
state_ptr.state.borrow_mut().callbacks.appearance_changed = Some(callback);
|
||||
configure_dwm_dark_mode(handle);
|
||||
// lParam is a pointer to a string that indicates the area containing the system parameter
|
||||
// that was changed.
|
||||
let parameter = PCWSTR::from_raw(lparam.0 as _);
|
||||
if unsafe { !parameter.is_null() && !parameter.is_empty() } {
|
||||
if let Some(parameter_string) = unsafe { parameter.to_string() }.log_err() {
|
||||
log::info!("System settings changed: {}", parameter_string);
|
||||
match parameter_string.as_str() {
|
||||
"ImmersiveColorSet" => {
|
||||
let new_appearance = system_appearance()
|
||||
.context("unable to get system appearance when handling ImmersiveColorSet")
|
||||
.log_err()?;
|
||||
let mut lock = state_ptr.state.borrow_mut();
|
||||
if new_appearance != lock.appearance {
|
||||
lock.appearance = new_appearance;
|
||||
let mut callback = lock.callbacks.appearance_changed.take()?;
|
||||
drop(lock);
|
||||
callback();
|
||||
state_ptr.state.borrow_mut().callbacks.appearance_changed = Some(callback);
|
||||
configure_dwm_dark_mode(handle, new_appearance);
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
Some(0)
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue