From ab1caad1e95acafa04fc4a65a75810d3763407c6 Mon Sep 17 00:00:00 2001 From: Andrea Martinelli Date: Thu, 8 Jul 2021 21:27:05 +0200 Subject: [PATCH] Taskbar: Make clicks at the edges and corners work as expected This makes it easy for the user to just throw the mouse at the corner of the screen and obtain the desired outcome (eg. opening the start menu), without having to precisely position the cursor over one of the buttons. --- Userland/Services/Taskbar/TaskbarWindow.cpp | 22 +++++++++++++++++++++ Userland/Services/Taskbar/TaskbarWindow.h | 1 + 2 files changed, 23 insertions(+) diff --git a/Userland/Services/Taskbar/TaskbarWindow.cpp b/Userland/Services/Taskbar/TaskbarWindow.cpp index 3c2c36e116..0d49e07eab 100644 --- a/Userland/Services/Taskbar/TaskbarWindow.cpp +++ b/Userland/Services/Taskbar/TaskbarWindow.cpp @@ -244,6 +244,28 @@ void TaskbarWindow::update_window_button(::Window& window, bool show_as_active) return parent; } +void TaskbarWindow::event(Core::Event& event) +{ + if (event.type() == GUI::Event::MouseDown) { + // If the cursor is at the edge/corner of the screen but technically not within the start button (or other taskbar buttons), + // we adjust it so that the nearest button ends up being clicked anyways. + + auto& mouse_event = static_cast(event); + const int ADJUSTMENT = 4; + auto adjusted_x = AK::clamp(mouse_event.x(), ADJUSTMENT, width() - ADJUSTMENT); + auto adjusted_y = AK::min(mouse_event.y(), height() - ADJUSTMENT); + Gfx::IntPoint adjusted_point = { adjusted_x, adjusted_y }; + + if (adjusted_point != mouse_event.position()) { + GUI::WindowServerConnection::the().async_set_global_cursor_position(position() + adjusted_point); + GUI::MouseEvent adjusted_event = { (GUI::Event::Type)mouse_event.type(), adjusted_point, mouse_event.buttons(), mouse_event.button(), mouse_event.modifiers(), mouse_event.wheel_delta() }; + Window::event(adjusted_event); + return; + } + } + Window::event(event); +} + void TaskbarWindow::wm_event(GUI::WMEvent& event) { WindowIdentifier identifier { event.client_id(), event.window_id() }; diff --git a/Userland/Services/Taskbar/TaskbarWindow.h b/Userland/Services/Taskbar/TaskbarWindow.h index 2fbb17d402..1f35507048 100644 --- a/Userland/Services/Taskbar/TaskbarWindow.h +++ b/Userland/Services/Taskbar/TaskbarWindow.h @@ -30,6 +30,7 @@ private: void update_window_button(::Window&, bool); ::Window* find_window_owner(::Window&) const; + virtual void event(Core::Event&) override; virtual void wm_event(GUI::WMEvent&) override; virtual void screen_rects_change_event(GUI::ScreenRectsChangeEvent&) override;