Don’t foreground minimized windows when changing displays (#48902)

on windows 10, When a laptop is plugged into or unplugged from a
monitor, Zed and my using GPUI app will restore from minimized state to
the foreground.



Closes #ISSUE

- [ ] Tests or screenshots needed?
- [ ] Code Reviewed
- [ ] Manual QA

Release Notes:

- N/A *or* Added/Fixed/Improved ...

---------

Co-authored-by: John Tur <john-tur@outlook.com>
This commit is contained in:
JaryandJohn Tur authored and GitHub committed 2026-02-13 16:56:31 -05:00
1 parent f4d07667ae
commit c3af737347
2 files changed
-31

No files matched your search

@@ -199,11 +199,6 @@ impl WindowsDisplay {
.collect()
}
/// Check if this monitor is still online
pub fn is_connected(hmonitor: HMONITOR) -> bool {
available_monitors().iter().contains(&hmonitor)
}
pub fn physical_bounds(&self) -> Bounds<DevicePixels> {
self.physical_bounds
}
@@ -812,34 +812,8 @@ impl WindowsWindowInner {
Some(0)
}
/// The following conditions will trigger this event:
/// 1. The monitor on which the window is located goes offline or changes resolution.
/// 2. Another monitor goes offline, is plugged in, or changes resolution.
///
/// In either case, the window will only receive information from the monitor on which
/// it is located.
///
/// For example, in the case of condition 2, where the monitor on which the window is
/// located has actually changed nothing, it will still receive this event.
fn handle_display_change_msg(&self, handle: HWND) -> Option<isize> {
// NOTE:
// Even the `lParam` holds the resolution of the screen, we just ignore it.
// Because WM_DPICHANGED, WM_MOVE, WM_SIZE will come first, window reposition and resize
// are handled there.
// So we only care about if monitor is disconnected.
let previous_monitor = self.state.display.get();
if WindowsDisplay::is_connected(previous_monitor.handle) {
// we are fine, other display changed
return None;
}
// display disconnected
// in this case, the OS will move our window to another monitor, and minimize it.
// we deminimize the window and query the monitor after moving
unsafe {
let _ = ShowWindow(handle, SW_SHOWNORMAL);
};
let new_monitor = unsafe { MonitorFromWindow(handle, MONITOR_DEFAULTTONULL) };
// all monitors disconnected
if new_monitor.is_invalid() {
log::error!("No monitor detected!");
return None;