From 67b92a7d5f5472b0fb2b8cc730d95bd5cc6b6ff5 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 2 May 2020 22:07:43 +0200 Subject: [PATCH] WindowServer+LibGUI: Support the 4th and 5th mouse buttons We'll call the "Back" and "Forward" since that's what they are normally mapped to in some other systems. --- Libraries/LibGUI/Event.h | 2 ++ Libraries/LibGUI/WindowServerConnection.cpp | 4 ++++ Servers/WindowServer/Event.h | 2 ++ Servers/WindowServer/Screen.cpp | 2 ++ Servers/WindowServer/WindowManager.cpp | 4 ++++ Servers/WindowServer/WindowManager.h | 2 ++ 6 files changed, 16 insertions(+) diff --git a/Libraries/LibGUI/Event.h b/Libraries/LibGUI/Event.h index 6c2374ccfb..2b2adf7bac 100644 --- a/Libraries/LibGUI/Event.h +++ b/Libraries/LibGUI/Event.h @@ -257,6 +257,8 @@ enum MouseButton : u8 { Left = 1, Right = 2, Middle = 4, + Back = 8, + Forward = 16, }; class KeyEvent final : public Event { diff --git a/Libraries/LibGUI/WindowServerConnection.cpp b/Libraries/LibGUI/WindowServerConnection.cpp index 036cf64869..441294598d 100644 --- a/Libraries/LibGUI/WindowServerConnection.cpp +++ b/Libraries/LibGUI/WindowServerConnection.cpp @@ -178,6 +178,10 @@ MouseButton to_gmousebutton(u32 button) return MouseButton::Right; case 4: return MouseButton::Middle; + case 8: + return MouseButton::Back; + case 16: + return MouseButton::Forward; default: ASSERT_NOT_REACHED(); break; diff --git a/Servers/WindowServer/Event.h b/Servers/WindowServer/Event.h index 781f2df903..48def26519 100644 --- a/Servers/WindowServer/Event.h +++ b/Servers/WindowServer/Event.h @@ -70,6 +70,8 @@ enum class MouseButton : u8 { Left = 1, Right = 2, Middle = 4, + Back = 8, + Forward = 16, }; class KeyEvent final : public Event { diff --git a/Servers/WindowServer/Screen.cpp b/Servers/WindowServer/Screen.cpp index 3658dcd8dd..3f0fbb04fd 100644 --- a/Servers/WindowServer/Screen.cpp +++ b/Servers/WindowServer/Screen.cpp @@ -145,6 +145,8 @@ void Screen::on_receive_mouse_data(const MousePacket& packet) post_mousedown_or_mouseup_if_needed(MouseButton::Left); post_mousedown_or_mouseup_if_needed(MouseButton::Right); post_mousedown_or_mouseup_if_needed(MouseButton::Middle); + post_mousedown_or_mouseup_if_needed(MouseButton::Back); + post_mousedown_or_mouseup_if_needed(MouseButton::Forward); if (m_cursor_location != prev_location) { auto message = make(Event::MouseMove, m_cursor_location, buttons, MouseButton::None, m_modifiers); Core::EventLoop::current().post_event(WindowManager::the(), move(message)); diff --git a/Servers/WindowServer/WindowManager.cpp b/Servers/WindowServer/WindowManager.cpp index 98b9e62860..7503a637e5 100644 --- a/Servers/WindowServer/WindowManager.cpp +++ b/Servers/WindowServer/WindowManager.cpp @@ -683,6 +683,10 @@ auto WindowManager::DoubleClickInfo::metadata_for_button(MouseButton button) -> return m_right; case MouseButton::Middle: return m_middle; + case MouseButton::Back: + return m_back; + case MouseButton::Forward: + return m_forward; default: ASSERT_NOT_REACHED(); } diff --git a/Servers/WindowServer/WindowManager.h b/Servers/WindowServer/WindowManager.h index 945f555f0c..85611f400a 100644 --- a/Servers/WindowServer/WindowManager.h +++ b/Servers/WindowServer/WindowManager.h @@ -241,6 +241,8 @@ private: ClickMetadata m_left; ClickMetadata m_right; ClickMetadata m_middle; + ClickMetadata m_back; + ClickMetadata m_forward; }; DoubleClickInfo m_double_click_info; int m_double_click_speed { 0 };