windows: Handle scale factor change while window is maximized (#35686)
Fixes https://github.com/zed-industries/zed/issues/33257 Previously, the scale-factor-change-handling logic relied on `SetWindowPos` enqueuing a `WM_SIZE` window event. But that does not happen when the window is maximized. So when the scale factor changed, maximized windows neglected to call their `resize` callback, and would misinterpret the positions of mouse events. This PR adds special logic for maximized windows, to ensure that the size is updated appropriately. Release Notes: - N/A
This commit is contained in:
parent
9caa9d042a
commit
d0de81b0b4
1 changed files with 32 additions and 6 deletions
|
@ -174,20 +174,37 @@ impl WindowsWindowInner {
|
||||||
let width = lparam.loword().max(1) as i32;
|
let width = lparam.loword().max(1) as i32;
|
||||||
let height = lparam.hiword().max(1) as i32;
|
let height = lparam.hiword().max(1) as i32;
|
||||||
let new_size = size(DevicePixels(width), DevicePixels(height));
|
let new_size = size(DevicePixels(width), DevicePixels(height));
|
||||||
|
|
||||||
let scale_factor = lock.scale_factor;
|
let scale_factor = lock.scale_factor;
|
||||||
|
let mut should_resize_renderer = false;
|
||||||
if lock.restore_from_minimized.is_some() {
|
if lock.restore_from_minimized.is_some() {
|
||||||
lock.callbacks.request_frame = lock.restore_from_minimized.take();
|
lock.callbacks.request_frame = lock.restore_from_minimized.take();
|
||||||
} else {
|
} else {
|
||||||
lock.renderer.resize(new_size).log_err();
|
should_resize_renderer = true;
|
||||||
|
}
|
||||||
|
drop(lock);
|
||||||
|
|
||||||
|
self.handle_size_change(new_size, scale_factor, should_resize_renderer);
|
||||||
|
Some(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn handle_size_change(
|
||||||
|
&self,
|
||||||
|
device_size: Size<DevicePixels>,
|
||||||
|
scale_factor: f32,
|
||||||
|
should_resize_renderer: bool,
|
||||||
|
) {
|
||||||
|
let new_logical_size = device_size.to_pixels(scale_factor);
|
||||||
|
let mut lock = self.state.borrow_mut();
|
||||||
|
lock.logical_size = new_logical_size;
|
||||||
|
if should_resize_renderer {
|
||||||
|
lock.renderer.resize(device_size).log_err();
|
||||||
}
|
}
|
||||||
let new_size = new_size.to_pixels(scale_factor);
|
|
||||||
lock.logical_size = new_size;
|
|
||||||
if let Some(mut callback) = lock.callbacks.resize.take() {
|
if let Some(mut callback) = lock.callbacks.resize.take() {
|
||||||
drop(lock);
|
drop(lock);
|
||||||
callback(new_size, scale_factor);
|
callback(new_logical_size, scale_factor);
|
||||||
self.state.borrow_mut().callbacks.resize = Some(callback);
|
self.state.borrow_mut().callbacks.resize = Some(callback);
|
||||||
}
|
}
|
||||||
Some(0)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_size_move_loop(&self, handle: HWND) -> Option<isize> {
|
fn handle_size_move_loop(&self, handle: HWND) -> Option<isize> {
|
||||||
|
@ -747,7 +764,9 @@ impl WindowsWindowInner {
|
||||||
) -> Option<isize> {
|
) -> Option<isize> {
|
||||||
let new_dpi = wparam.loword() as f32;
|
let new_dpi = wparam.loword() as f32;
|
||||||
let mut lock = self.state.borrow_mut();
|
let mut lock = self.state.borrow_mut();
|
||||||
lock.scale_factor = new_dpi / USER_DEFAULT_SCREEN_DPI as f32;
|
let is_maximized = lock.is_maximized();
|
||||||
|
let new_scale_factor = new_dpi / USER_DEFAULT_SCREEN_DPI as f32;
|
||||||
|
lock.scale_factor = new_scale_factor;
|
||||||
lock.border_offset.update(handle).log_err();
|
lock.border_offset.update(handle).log_err();
|
||||||
drop(lock);
|
drop(lock);
|
||||||
|
|
||||||
|
@ -771,6 +790,13 @@ impl WindowsWindowInner {
|
||||||
.log_err();
|
.log_err();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// When maximized, SetWindowPos doesn't send WM_SIZE, so we need to manually
|
||||||
|
// update the size and call the resize callback
|
||||||
|
if is_maximized {
|
||||||
|
let device_size = size(DevicePixels(width), DevicePixels(height));
|
||||||
|
self.handle_size_change(device_size, new_scale_factor, true);
|
||||||
|
}
|
||||||
|
|
||||||
Some(0)
|
Some(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue