diff --git a/Userland/Services/WindowServer/Window.cpp b/Userland/Services/WindowServer/Window.cpp index e9ec0c5456..09d6da2ec3 100644 --- a/Userland/Services/WindowServer/Window.cpp +++ b/Userland/Services/WindowServer/Window.cpp @@ -255,6 +255,8 @@ void Window::update_window_menu_items() m_window_menu_maximize_item->set_text(m_maximized ? "&Restore" : "Ma&ximize"); m_window_menu_maximize_item->set_enabled(m_resizable); + + m_window_menu_move_item->set_enabled(!m_minimized && !m_maximized && !m_fullscreen); } void Window::set_minimized(bool minimized) @@ -639,6 +641,10 @@ void Window::ensure_window_menu() m_window_menu_maximize_item = maximize_item.ptr(); m_window_menu->add_item(move(maximize_item)); + auto move_item = make(*m_window_menu, (unsigned)WindowMenuAction::Move, "&Move"); + m_window_menu_move_item = move_item.ptr(); + m_window_menu->add_item(move(move_item)); + m_window_menu->add_item(make(*m_window_menu, MenuItem::Type::Separator)); auto menubar_visibility_item = make(*m_window_menu, (unsigned)WindowMenuAction::ToggleMenubarVisibility, "Menu &Bar"); @@ -674,6 +680,9 @@ void Window::handle_window_menu_action(WindowMenuAction action) WindowManager::the().maximize_windows(*this, !m_maximized); WindowManager::the().move_to_front_and_make_active(*this); break; + case WindowMenuAction::Move: + WindowManager::the().start_window_move(*this, Screen::the().cursor_location()); + break; case WindowMenuAction::Close: request_close(); break; diff --git a/Userland/Services/WindowServer/Window.h b/Userland/Services/WindowServer/Window.h index 53f9f67d75..401607e056 100644 --- a/Userland/Services/WindowServer/Window.h +++ b/Userland/Services/WindowServer/Window.h @@ -51,6 +51,7 @@ enum class WindowMenuAction { MaximizeOrRestore, ToggleMenubarVisibility, Close, + Move, }; enum class WindowMenuDefaultAction { @@ -392,6 +393,7 @@ private: RefPtr m_window_menu; MenuItem* m_window_menu_minimize_item { nullptr }; MenuItem* m_window_menu_maximize_item { nullptr }; + MenuItem* m_window_menu_move_item { nullptr }; MenuItem* m_window_menu_close_item { nullptr }; MenuItem* m_window_menu_menubar_visibility_item { nullptr }; int m_minimize_animation_step { -1 }; diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp index 4abfaf3fe7..41cfba60b0 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -477,7 +477,7 @@ bool WindowManager::pick_new_active_window(Window* previous_active) return new_window_picked; } -void WindowManager::start_window_move(Window& window, const MouseEvent& event) +void WindowManager::start_window_move(Window& window, const Gfx::IntPoint& origin) { MenuManager::the().close_everyone(); @@ -486,11 +486,16 @@ void WindowManager::start_window_move(Window& window, const MouseEvent& event) move_to_front_and_make_active(window); m_move_window = window; m_move_window->set_default_positioned(false); - m_move_origin = event.position(); + m_move_origin = origin; m_move_window_origin = window.position(); window.invalidate(true, true); } +void WindowManager::start_window_move(Window& window, const MouseEvent& event) +{ + start_window_move(window, event.position()); +} + void WindowManager::start_window_resize(Window& window, const Gfx::IntPoint& position, MouseButton button) { MenuManager::the().close_everyone(); diff --git a/Userland/Services/WindowServer/WindowManager.h b/Userland/Services/WindowServer/WindowManager.h index 58d5ca5ce0..f5bd3032d1 100644 --- a/Userland/Services/WindowServer/WindowManager.h +++ b/Userland/Services/WindowServer/WindowManager.h @@ -162,6 +162,8 @@ public: void start_window_resize(Window&, const Gfx::IntPoint&, MouseButton); void start_window_resize(Window&, const MouseEvent&); + void start_window_move(Window&, const MouseEvent&); + void start_window_move(Window&, const Gfx::IntPoint&); const Window* active_fullscreen_window() const { @@ -237,7 +239,7 @@ private: bool process_ongoing_window_resize(const MouseEvent&, Window*& hovered_window); bool process_ongoing_window_move(MouseEvent&, Window*& hovered_window); bool process_ongoing_drag(MouseEvent&, Window*& hovered_window); - void start_window_move(Window&, const MouseEvent&); + template IterationDecision for_each_visible_window_of_type_from_back_to_front(WindowType, Callback, bool ignore_highlight = false); template