Platform for LinuxPlatform {
.detach();
}
- fn on_quit(&self, callback: Box) {
+ fn on_quit(&self, callback: Box bool>) {
self.inner.with_common(|common| {
common.callbacks.quit = Some(callback);
});
diff --git a/crates/gpui_macos/src/platform.rs b/crates/gpui_macos/src/platform.rs
index 3ec54e8452..c1d857c78a 100644
--- a/crates/gpui_macos/src/platform.rs
+++ b/crates/gpui_macos/src/platform.rs
@@ -178,7 +178,7 @@ pub(crate) struct MacPlatformState {
on_thermal_state_change: Option>,
on_system_wake: Option>,
system_wake_observer_registered: bool,
- quit: Option>,
+ quit: Option bool>>,
menu_command: Option>,
validate_menu_command: Option bool>>,
will_open_menu: Option>,
@@ -940,7 +940,7 @@ impl Platform for MacPlatform {
.detach();
}
- fn on_quit(&self, callback: Box) {
+ fn on_quit(&self, callback: Box bool>) {
self.0.lock().quit = Some(callback);
}
diff --git a/crates/gpui_web/src/platform.rs b/crates/gpui_web/src/platform.rs
index 6e6f9c0c77..a546173198 100644
--- a/crates/gpui_web/src/platform.rs
+++ b/crates/gpui_web/src/platform.rs
@@ -106,7 +106,7 @@ impl std::error::Error for WebWindowError {}
#[derive(Default)]
struct WebPlatformCallbacks {
open_urls: Option)>>,
- quit: Option>,
+ quit: Option bool>>,
reopen: Option>,
app_menu_action: Option>,
will_open_app_menu: Option>,
@@ -458,7 +458,7 @@ impl Platform for WebPlatform {
fn open_with_system(&self, _path: &Path) {}
- fn on_quit(&self, callback: Box) {
+ fn on_quit(&self, callback: Box bool>) {
self.callbacks.borrow_mut().quit = Some(callback);
}
diff --git a/crates/gpui_windows/src/events.rs b/crates/gpui_windows/src/events.rs
index 1bd18493d0..e700cb0fc5 100644
--- a/crates/gpui_windows/src/events.rs
+++ b/crates/gpui_windows/src/events.rs
@@ -28,6 +28,7 @@ pub(crate) const WM_GPUI_FORCE_UPDATE_WINDOW: u32 = WM_USER + 5;
pub(crate) const WM_GPUI_KEYBOARD_LAYOUT_CHANGED: u32 = WM_USER + 6;
pub(crate) const WM_GPUI_GPU_DEVICE_LOST: u32 = WM_USER + 7;
pub(crate) const WM_GPUI_KEYDOWN: u32 = WM_USER + 8;
+pub(crate) const WM_GPUI_END_SESSION: u32 = WM_USER + 9;
const SIZE_MOVE_LOOP_TIMER_ID: usize = 1;
@@ -108,6 +109,8 @@ impl WindowsWindowInner {
WM_PAINT => self.handle_paint_msg(handle),
WM_CLOSE => self.handle_close_msg(),
WM_DESTROY => self.handle_destroy_msg(handle),
+ WM_QUERYENDSESSION => Some(1),
+ WM_ENDSESSION => self.handle_end_session_msg(wparam),
WM_MOUSEMOVE => self.handle_mouse_move_msg(handle, lparam, wparam),
WM_MOUSELEAVE | WM_NCMOUSELEAVE => self.handle_mouse_leave_msg(),
WM_NCMOUSEMOVE => self.handle_nc_mouse_move_msg(handle, lparam),
@@ -170,6 +173,20 @@ impl WindowsWindowInner {
}
}
+ fn handle_end_session_msg(&self, wparam: WPARAM) -> Option {
+ if wparam.0 != 0 {
+ unsafe {
+ SendMessageW(
+ self.platform_window_handle,
+ WM_GPUI_END_SESSION,
+ Some(WPARAM(self.validation_number)),
+ None,
+ );
+ }
+ }
+ Some(0)
+ }
+
fn handle_move_msg(&self, handle: HWND, lparam: LPARAM) -> Option {
let origin = logical_point(
lparam.signed_loword() as f32,
diff --git a/crates/gpui_windows/src/platform.rs b/crates/gpui_windows/src/platform.rs
index 0c0f18a0ee..9147ce51f2 100644
--- a/crates/gpui_windows/src/platform.rs
+++ b/crates/gpui_windows/src/platform.rs
@@ -79,7 +79,7 @@ pub(crate) struct WindowsPlatformState {
#[derive(Default)]
struct PlatformCallbacks {
open_urls: Cell