WindowServer: Add "Move" action to window menus

This can be used to initiate a window move. It's only enabled while
the window is normal (not minimized, maximized or fullscreen.)
This commit is contained in:
Andreas Kling 2021-05-10 09:04:05 +02:00
parent 2bc3cc4cab
commit 634e652b6c
Notes: sideshowbarker 2024-07-18 18:24:11 +09:00
4 changed files with 21 additions and 3 deletions

View file

@ -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<MenuItem>(*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<MenuItem>(*m_window_menu, MenuItem::Type::Separator));
auto menubar_visibility_item = make<MenuItem>(*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;

View file

@ -51,6 +51,7 @@ enum class WindowMenuAction {
MaximizeOrRestore,
ToggleMenubarVisibility,
Close,
Move,
};
enum class WindowMenuDefaultAction {
@ -392,6 +393,7 @@ private:
RefPtr<Menu> 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 };

View file

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

View file

@ -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<typename Callback>
IterationDecision for_each_visible_window_of_type_from_back_to_front(WindowType, Callback, bool ignore_highlight = false);
template<typename Callback>