diff --git a/Userland/Services/WindowServer/Button.cpp b/Userland/Services/WindowServer/Button.cpp index 7265494b31..e428260b1b 100644 --- a/Userland/Services/WindowServer/Button.cpp +++ b/Userland/Services/WindowServer/Button.cpp @@ -62,22 +62,36 @@ void Button::on_mouse_event(const MouseEvent& event) { auto& wm = WindowManager::the(); - if (event.type() == Event::MouseDown && event.button() == MouseButton::Left) { + if (event.type() == Event::MouseDown && (event.button() == MouseButton::Left || event.button() == MouseButton::Right || event.button() == MouseButton::Middle)) { m_pressed = true; wm.set_cursor_tracking_button(this); m_frame.invalidate(m_relative_rect); return; } - if (event.type() == Event::MouseUp && event.button() == MouseButton::Left) { + if (event.type() == Event::MouseUp && (event.button() == MouseButton::Left || event.button() == MouseButton::Right || event.button() == MouseButton::Middle)) { if (wm.cursor_tracking_button() != this) return; wm.set_cursor_tracking_button(nullptr); bool old_pressed = m_pressed; m_pressed = false; if (rect().contains(event.position())) { - if (on_click) - on_click(*this); + switch (event.button()) { + case MouseButton::Left: + if (on_click) + on_click(*this); + break; + + case MouseButton::Right: + if (on_right_click) + on_right_click(*this); + break; + + default: + if (on_middle_click) + on_middle_click(*this); + break; + } } if (old_pressed != m_pressed) { // Would like to compute: diff --git a/Userland/Services/WindowServer/Button.h b/Userland/Services/WindowServer/Button.h index e6c0433025..29de9488c4 100644 --- a/Userland/Services/WindowServer/Button.h +++ b/Userland/Services/WindowServer/Button.h @@ -53,6 +53,8 @@ public: void on_mouse_event(const MouseEvent&); Function on_click; + Function on_right_click; + Function on_middle_click; bool is_visible() const { return m_visible; } diff --git a/Userland/Services/WindowServer/Window.cpp b/Userland/Services/WindowServer/Window.cpp index 2d8889c7ea..04095761a3 100644 --- a/Userland/Services/WindowServer/Window.cpp +++ b/Userland/Services/WindowServer/Window.cpp @@ -360,7 +360,21 @@ void Window::set_maximized(bool maximized, Optional fixed_point) Core::EventLoop::current().post_event(*this, make(m_rect)); set_default_positioned(false); } +void Window::set_vertically_maximized() +{ + if (m_maximized) + return; + if (!is_resizable() || resize_aspect_ratio().has_value()) + return; + auto max_rect = WindowManager::the().maximized_window_rect(*this); + + auto new_rect = Gfx::IntRect( + Gfx::IntPoint(rect().x(), max_rect.y()), + Gfx::IntSize(rect().width(), max_rect.height())); + set_rect(new_rect); + Core::EventLoop::current().post_event(*this, make(new_rect)); +} void Window::set_resizable(bool resizable) { if (m_resizable == resizable) diff --git a/Userland/Services/WindowServer/Window.h b/Userland/Services/WindowServer/Window.h index 3e8e2b18b3..9debf465b3 100644 --- a/Userland/Services/WindowServer/Window.h +++ b/Userland/Services/WindowServer/Window.h @@ -106,6 +106,8 @@ public: bool is_maximized() const { return m_maximized; } void set_maximized(bool, Optional fixed_point = {}); + void set_vertically_maximized(); + bool is_fullscreen() const { return m_fullscreen; } void set_fullscreen(bool); diff --git a/Userland/Services/WindowServer/WindowFrame.cpp b/Userland/Services/WindowServer/WindowFrame.cpp index 49fd3b2cd8..85b13b554d 100644 --- a/Userland/Services/WindowServer/WindowFrame.cpp +++ b/Userland/Services/WindowServer/WindowFrame.cpp @@ -83,6 +83,9 @@ WindowFrame::WindowFrame(Window& window) auto button = make