mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 17:47:44 +00:00
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:
parent
2bc3cc4cab
commit
634e652b6c
4 changed files with 21 additions and 3 deletions
|
@ -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_text(m_maximized ? "&Restore" : "Ma&ximize");
|
||||||
m_window_menu_maximize_item->set_enabled(m_resizable);
|
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)
|
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_maximize_item = maximize_item.ptr();
|
||||||
m_window_menu->add_item(move(maximize_item));
|
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));
|
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");
|
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().maximize_windows(*this, !m_maximized);
|
||||||
WindowManager::the().move_to_front_and_make_active(*this);
|
WindowManager::the().move_to_front_and_make_active(*this);
|
||||||
break;
|
break;
|
||||||
|
case WindowMenuAction::Move:
|
||||||
|
WindowManager::the().start_window_move(*this, Screen::the().cursor_location());
|
||||||
|
break;
|
||||||
case WindowMenuAction::Close:
|
case WindowMenuAction::Close:
|
||||||
request_close();
|
request_close();
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -51,6 +51,7 @@ enum class WindowMenuAction {
|
||||||
MaximizeOrRestore,
|
MaximizeOrRestore,
|
||||||
ToggleMenubarVisibility,
|
ToggleMenubarVisibility,
|
||||||
Close,
|
Close,
|
||||||
|
Move,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class WindowMenuDefaultAction {
|
enum class WindowMenuDefaultAction {
|
||||||
|
@ -392,6 +393,7 @@ private:
|
||||||
RefPtr<Menu> m_window_menu;
|
RefPtr<Menu> m_window_menu;
|
||||||
MenuItem* m_window_menu_minimize_item { nullptr };
|
MenuItem* m_window_menu_minimize_item { nullptr };
|
||||||
MenuItem* m_window_menu_maximize_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_close_item { nullptr };
|
||||||
MenuItem* m_window_menu_menubar_visibility_item { nullptr };
|
MenuItem* m_window_menu_menubar_visibility_item { nullptr };
|
||||||
int m_minimize_animation_step { -1 };
|
int m_minimize_animation_step { -1 };
|
||||||
|
|
|
@ -477,7 +477,7 @@ bool WindowManager::pick_new_active_window(Window* previous_active)
|
||||||
return new_window_picked;
|
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();
|
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);
|
move_to_front_and_make_active(window);
|
||||||
m_move_window = window;
|
m_move_window = window;
|
||||||
m_move_window->set_default_positioned(false);
|
m_move_window->set_default_positioned(false);
|
||||||
m_move_origin = event.position();
|
m_move_origin = origin;
|
||||||
m_move_window_origin = window.position();
|
m_move_window_origin = window.position();
|
||||||
window.invalidate(true, true);
|
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)
|
void WindowManager::start_window_resize(Window& window, const Gfx::IntPoint& position, MouseButton button)
|
||||||
{
|
{
|
||||||
MenuManager::the().close_everyone();
|
MenuManager::the().close_everyone();
|
||||||
|
|
|
@ -162,6 +162,8 @@ public:
|
||||||
|
|
||||||
void start_window_resize(Window&, const Gfx::IntPoint&, MouseButton);
|
void start_window_resize(Window&, const Gfx::IntPoint&, MouseButton);
|
||||||
void start_window_resize(Window&, const MouseEvent&);
|
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
|
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_resize(const MouseEvent&, Window*& hovered_window);
|
||||||
bool process_ongoing_window_move(MouseEvent&, Window*& hovered_window);
|
bool process_ongoing_window_move(MouseEvent&, Window*& hovered_window);
|
||||||
bool process_ongoing_drag(MouseEvent&, Window*& hovered_window);
|
bool process_ongoing_drag(MouseEvent&, Window*& hovered_window);
|
||||||
void start_window_move(Window&, const MouseEvent&);
|
|
||||||
template<typename Callback>
|
template<typename Callback>
|
||||||
IterationDecision for_each_visible_window_of_type_from_back_to_front(WindowType, Callback, bool ignore_highlight = false);
|
IterationDecision for_each_visible_window_of_type_from_back_to_front(WindowType, Callback, bool ignore_highlight = false);
|
||||||
template<typename Callback>
|
template<typename Callback>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue