diff --git a/Userland/Libraries/LibGUI/ConnectionToWindowManagerServer.cpp b/Userland/Libraries/LibGUI/ConnectionToWindowManagerServer.cpp index ddc099b2a9..ed472e50d0 100644 --- a/Userland/Libraries/LibGUI/ConnectionToWindowManagerServer.cpp +++ b/Userland/Libraries/LibGUI/ConnectionToWindowManagerServer.cpp @@ -64,6 +64,12 @@ void ConnectionToWindowManagerServer::super_space_key_pressed(i32 wm_id) Core::EventLoop::current().post_event(*window, make(wm_id)); } +void ConnectionToWindowManagerServer::super_d_key_pressed(i32 wm_id) +{ + if (auto* window = Window::from_window_id(wm_id)) + Core::EventLoop::current().post_event(*window, make(wm_id)); +} + void ConnectionToWindowManagerServer::super_digit_key_pressed(i32 wm_id, u8 digit) { if (auto* window = Window::from_window_id(wm_id)) diff --git a/Userland/Libraries/LibGUI/ConnectionToWindowManagerServer.h b/Userland/Libraries/LibGUI/ConnectionToWindowManagerServer.h index 05c6ae925f..2761070aef 100644 --- a/Userland/Libraries/LibGUI/ConnectionToWindowManagerServer.h +++ b/Userland/Libraries/LibGUI/ConnectionToWindowManagerServer.h @@ -34,6 +34,7 @@ private: virtual void applet_area_size_changed(i32, Gfx::IntSize const&) override; virtual void super_key_pressed(i32) override; virtual void super_space_key_pressed(i32) override; + virtual void super_d_key_pressed(i32) override; virtual void super_digit_key_pressed(i32, u8) override; virtual void workspace_changed(i32, u32, u32) override; virtual void keymap_changed(i32, String const&) override; diff --git a/Userland/Libraries/LibGUI/Event.h b/Userland/Libraries/LibGUI/Event.h index 6bbf5c37ba..8a1afddfd6 100644 --- a/Userland/Libraries/LibGUI/Event.h +++ b/Userland/Libraries/LibGUI/Event.h @@ -67,6 +67,7 @@ public: WM_AppletAreaSizeChanged, WM_SuperKeyPressed, WM_SuperSpaceKeyPressed, + WM_SuperDKeyPressed, WM_SuperDigitKeyPressed, WM_WorkspaceChanged, WM_KeymapChanged, @@ -117,6 +118,14 @@ public: } }; +class WMSuperDKeyPressedEvent : public WMEvent { +public: + explicit WMSuperDKeyPressedEvent(int client_id) + : WMEvent(Event::Type::WM_SuperDKeyPressed, client_id, 0) + { + } +}; + class WMSuperDigitKeyPressedEvent : public WMEvent { public: WMSuperDigitKeyPressedEvent(int client_id, u8 digit) diff --git a/Userland/Services/Taskbar/TaskbarWindow.cpp b/Userland/Services/Taskbar/TaskbarWindow.cpp index 0d5e09014d..5b615936d7 100644 --- a/Userland/Services/Taskbar/TaskbarWindow.cpp +++ b/Userland/Services/Taskbar/TaskbarWindow.cpp @@ -344,6 +344,10 @@ void TaskbarWindow::wm_event(GUI::WMEvent& event) warnln("failed to spawn 'Assistant' when requested via Super+Space"); break; } + case GUI::Event::WM_SuperDKeyPressed: { + toggle_show_desktop(); + break; + } case GUI::Event::WM_SuperDigitKeyPressed: { auto& digit_event = static_cast(event); auto index = digit_event.digit() != 0 ? digit_event.digit() - 1 : 9; diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp index 0091446114..9d45e9326c 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -542,6 +542,17 @@ void WindowManager::tell_wms_super_space_key_pressed() }); } +void WindowManager::tell_wms_super_d_key_pressed() +{ + for_each_window_manager([](WMConnectionFromClient& conn) { + if (conn.window_id() < 0) + return IterationDecision::Continue; + + conn.async_super_d_key_pressed(conn.window_id()); + return IterationDecision::Continue; + }); +} + void WindowManager::tell_wms_super_digit_key_pressed(u8 digit) { for_each_window_manager([digit](WMConnectionFromClient& conn) { @@ -1605,6 +1616,11 @@ void WindowManager::process_key_event(KeyEvent& event) return; } + if (event.type() == Event::KeyDown && event.key() == Key_D) { + tell_wms_super_d_key_pressed(); + return; + } + if (event.type() == Event::KeyDown && event.key() >= Key_0 && event.key() <= Key_9) { auto digit = event.key() - Key_0; tell_wms_super_digit_key_pressed(digit); diff --git a/Userland/Services/WindowServer/WindowManager.h b/Userland/Services/WindowServer/WindowManager.h index 115b718350..d49665793b 100644 --- a/Userland/Services/WindowServer/WindowManager.h +++ b/Userland/Services/WindowServer/WindowManager.h @@ -187,6 +187,7 @@ public: void tell_wms_applet_area_size_changed(Gfx::IntSize const&); void tell_wms_super_key_pressed(); void tell_wms_super_space_key_pressed(); + void tell_wms_super_d_key_pressed(); void tell_wms_super_digit_key_pressed(u8); void tell_wms_current_window_stack_changed(); diff --git a/Userland/Services/WindowServer/WindowManagerClient.ipc b/Userland/Services/WindowServer/WindowManagerClient.ipc index 676af0a21f..17d110dfdb 100644 --- a/Userland/Services/WindowServer/WindowManagerClient.ipc +++ b/Userland/Services/WindowServer/WindowManagerClient.ipc @@ -9,6 +9,7 @@ endpoint WindowManagerClient applet_area_size_changed(i32 wm_id, Gfx::IntSize size) =| super_key_pressed(i32 wm_id) =| super_space_key_pressed(i32 wm_id) =| + super_d_key_pressed(i32 wm_id) =| super_digit_key_pressed(i32 wm_id, u8 digit) =| workspace_changed(i32 wm_id, u32 row, u32 column) =| keymap_changed(i32 wm_id, [UTF8] String keymap) =|