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.
This commit is contained in:
Andrea Martinelli 2021-07-08 21:27:05 +02:00 committed by Andreas Kling
parent dac7b25b8a
commit ab1caad1e9
Notes: sideshowbarker 2024-07-18 10:03:10 +09:00
2 changed files with 23 additions and 0 deletions

View file

@ -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<GUI::MouseEvent&>(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() };

View file

@ -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;