mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-30 08:41:15 +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
Notes:
sideshowbarker
2024-07-18 18:24:11 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/634e652b6c4
|
@ -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;
|
||||
|
|
|
@ -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 };
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue