diff --git a/crates/gpui/examples/window.rs b/crates/gpui/examples/window.rs index 0f0d4287da..78a47782c9 100644 --- a/crates/gpui/examples/window.rs +++ b/crates/gpui/examples/window.rs @@ -150,6 +150,18 @@ impl Render for WindowDemo { ) .unwrap(); })) + .child(button("Hide Application", |cx| { + cx.hide(); + + // Restore the application after 3 seconds + cx.spawn(|mut cx| async move { + Timer::after(std::time::Duration::from_secs(3)).await; + cx.update(|cx| { + cx.activate(false); + }) + }) + .detach(); + })) } } diff --git a/crates/gpui/src/platform/windows/platform.rs b/crates/gpui/src/platform/windows/platform.rs index 30e7c402d2..7f6677973b 100644 --- a/crates/gpui/src/platform/windows/platform.rs +++ b/crates/gpui/src/platform/windows/platform.rs @@ -33,6 +33,8 @@ use crate::*; pub(crate) struct WindowsPlatform { state: RefCell, raw_window_handles: RwLock>, + // The window handles that are hided by `hide` method. + hidden_windows: RwLock>, // The below members will never change throughout the entire lifecycle of the app. icon: HICON, main_receiver: flume::Receiver, @@ -100,6 +102,7 @@ impl WindowsPlatform { Self { state, raw_window_handles, + hidden_windows: RwLock::new(SmallVec::new()), icon, main_receiver, dispatch_event, @@ -295,12 +298,25 @@ impl Platform for WindowsPlatform { } } - // todo(windows) - fn activate(&self, _ignoring_other_apps: bool) {} + fn activate(&self, _ignoring_other_apps: bool) { + let mut state = self.hidden_windows.write(); + state.iter().for_each(|handle| unsafe { + ShowWindow(*handle, SW_SHOW).ok().log_err(); + }); + state.clear(); + } - // todo(windows) fn hide(&self) { - unimplemented!() + let mut state = self.hidden_windows.write(); + self.raw_window_handles + .read() + .iter() + .for_each(|handle| unsafe { + if IsWindowVisible(*handle).as_bool() { + state.push(*handle); + ShowWindow(*handle, SW_HIDE).ok().log_err(); + } + }); } // todo(windows)