mirror of
https://github.com/RGBCube/serenity
synced 2025-05-22 23:25:07 +00:00
LibGUI+WindowServer: Replace WindowInput{Enter,Leave} Events
with WindowInput{Preempted,Restored} Events and allow Widgets to save the state of their focus preemption. As of now, only Popups will preempt input and trigger these events.
This commit is contained in:
parent
901878bad9
commit
5d567565a4
11 changed files with 50 additions and 45 deletions
|
@ -120,16 +120,16 @@ void ConnectionToWindowServer::window_deactivated(i32 window_id)
|
||||||
Core::EventLoop::current().post_event(*window, make<Event>(Event::WindowBecameInactive));
|
Core::EventLoop::current().post_event(*window, make<Event>(Event::WindowBecameInactive));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionToWindowServer::window_input_entered(i32 window_id)
|
void ConnectionToWindowServer::window_input_preempted(i32 window_id)
|
||||||
{
|
{
|
||||||
if (auto* window = Window::from_window_id(window_id))
|
if (auto* window = Window::from_window_id(window_id))
|
||||||
Core::EventLoop::current().post_event(*window, make<Event>(Event::WindowInputEntered));
|
Core::EventLoop::current().post_event(*window, make<Event>(Event::WindowInputPreempted));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionToWindowServer::window_input_left(i32 window_id)
|
void ConnectionToWindowServer::window_input_restored(i32 window_id)
|
||||||
{
|
{
|
||||||
if (auto* window = Window::from_window_id(window_id))
|
if (auto* window = Window::from_window_id(window_id))
|
||||||
Core::EventLoop::current().post_event(*window, make<Event>(Event::WindowInputLeft));
|
Core::EventLoop::current().post_event(*window, make<Event>(Event::WindowInputRestored));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConnectionToWindowServer::window_close_request(i32 window_id)
|
void ConnectionToWindowServer::window_close_request(i32 window_id)
|
||||||
|
|
|
@ -37,8 +37,8 @@ private:
|
||||||
virtual void key_up(i32, u32, u32, u32, u32) override;
|
virtual void key_up(i32, u32, u32, u32, u32) override;
|
||||||
virtual void window_activated(i32) override;
|
virtual void window_activated(i32) override;
|
||||||
virtual void window_deactivated(i32) override;
|
virtual void window_deactivated(i32) override;
|
||||||
virtual void window_input_entered(i32) override;
|
virtual void window_input_preempted(i32) override;
|
||||||
virtual void window_input_left(i32) override;
|
virtual void window_input_restored(i32) override;
|
||||||
virtual void window_close_request(i32) override;
|
virtual void window_close_request(i32) override;
|
||||||
virtual void window_resized(i32, Gfx::IntRect const&) override;
|
virtual void window_resized(i32, Gfx::IntRect const&) override;
|
||||||
virtual void window_moved(i32, Gfx::IntRect const&) override;
|
virtual void window_moved(i32, Gfx::IntRect const&) override;
|
||||||
|
|
|
@ -42,8 +42,8 @@ public:
|
||||||
WindowLeft,
|
WindowLeft,
|
||||||
WindowBecameInactive,
|
WindowBecameInactive,
|
||||||
WindowBecameActive,
|
WindowBecameActive,
|
||||||
WindowInputEntered,
|
WindowInputPreempted,
|
||||||
WindowInputLeft,
|
WindowInputRestored,
|
||||||
FocusIn,
|
FocusIn,
|
||||||
FocusOut,
|
FocusOut,
|
||||||
WindowCloseRequest,
|
WindowCloseRequest,
|
||||||
|
|
|
@ -214,6 +214,9 @@ public:
|
||||||
bool is_focused() const;
|
bool is_focused() const;
|
||||||
void set_focus(bool, FocusSource = FocusSource::Programmatic);
|
void set_focus(bool, FocusSource = FocusSource::Programmatic);
|
||||||
|
|
||||||
|
bool focus_preempted() const { return m_focus_preempted; }
|
||||||
|
void set_focus_preempted(bool b) { m_focus_preempted = b; }
|
||||||
|
|
||||||
Function<void(bool const, const FocusSource)> on_focus_change;
|
Function<void(bool const, const FocusSource)> on_focus_change;
|
||||||
|
|
||||||
// Returns true if this widget or one of its descendants is focused.
|
// Returns true if this widget or one of its descendants is focused.
|
||||||
|
@ -440,6 +443,7 @@ private:
|
||||||
bool m_visible { true };
|
bool m_visible { true };
|
||||||
bool m_greedy_for_hits { false };
|
bool m_greedy_for_hits { false };
|
||||||
bool m_auto_focusable { true };
|
bool m_auto_focusable { true };
|
||||||
|
bool m_focus_preempted { false };
|
||||||
bool m_enabled { true };
|
bool m_enabled { true };
|
||||||
bool m_updates_enabled { true };
|
bool m_updates_enabled { true };
|
||||||
bool m_accepts_command_palette { true };
|
bool m_accepts_command_palette { true };
|
||||||
|
|
|
@ -522,15 +522,14 @@ void Window::handle_resize_event(ResizeEvent& event)
|
||||||
m_main_widget->set_relative_rect({ {}, new_size });
|
m_main_widget->set_relative_rect({ {}, new_size });
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::handle_input_entered_or_left_event(Core::Event& event)
|
void Window::handle_input_preemption_event(Core::Event& event)
|
||||||
{
|
{
|
||||||
m_is_active_input = event.type() == Event::WindowInputEntered;
|
if (on_input_preemption_change)
|
||||||
if (on_active_input_change)
|
on_input_preemption_change(event.type() == Event::WindowInputPreempted);
|
||||||
on_active_input_change(m_is_active_input);
|
if (!m_focused_widget)
|
||||||
if (m_main_widget)
|
return;
|
||||||
m_main_widget->dispatch_event(event, this);
|
m_focused_widget->set_focus_preempted(event.type() == Event::WindowInputPreempted);
|
||||||
if (m_focused_widget)
|
m_focused_widget->update();
|
||||||
m_focused_widget->update();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::handle_became_active_or_inactive_event(Core::Event& event)
|
void Window::handle_became_active_or_inactive_event(Core::Event& event)
|
||||||
|
@ -543,8 +542,11 @@ void Window::handle_became_active_or_inactive_event(Core::Event& event)
|
||||||
on_active_window_change(event.type() == Event::WindowBecameActive);
|
on_active_window_change(event.type() == Event::WindowBecameActive);
|
||||||
if (m_main_widget)
|
if (m_main_widget)
|
||||||
m_main_widget->dispatch_event(event, this);
|
m_main_widget->dispatch_event(event, this);
|
||||||
if (m_focused_widget)
|
if (m_focused_widget) {
|
||||||
|
if (event.type() == Event::WindowBecameActive)
|
||||||
|
m_focused_widget->set_focus_preempted(false);
|
||||||
m_focused_widget->update();
|
m_focused_widget->update();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::handle_close_request()
|
void Window::handle_close_request()
|
||||||
|
@ -678,8 +680,8 @@ void Window::event(Core::Event& event)
|
||||||
if (event.type() == Event::WindowBecameActive || event.type() == Event::WindowBecameInactive)
|
if (event.type() == Event::WindowBecameActive || event.type() == Event::WindowBecameInactive)
|
||||||
return handle_became_active_or_inactive_event(event);
|
return handle_became_active_or_inactive_event(event);
|
||||||
|
|
||||||
if (event.type() == Event::WindowInputEntered || event.type() == Event::WindowInputLeft)
|
if (event.type() == Event::WindowInputPreempted || event.type() == Event::WindowInputRestored)
|
||||||
return handle_input_entered_or_left_event(event);
|
return handle_input_preemption_event(event);
|
||||||
|
|
||||||
if (event.type() == Event::WindowCloseRequest)
|
if (event.type() == Event::WindowCloseRequest)
|
||||||
return handle_close_request();
|
return handle_close_request();
|
||||||
|
|
|
@ -97,6 +97,7 @@ public:
|
||||||
Function<void()> on_close;
|
Function<void()> on_close;
|
||||||
Function<CloseRequestDecision()> on_close_request;
|
Function<CloseRequestDecision()> on_close_request;
|
||||||
Function<void(bool is_active_input)> on_active_input_change;
|
Function<void(bool is_active_input)> on_active_input_change;
|
||||||
|
Function<void(bool is_preempted)> on_input_preemption_change;
|
||||||
Function<void(bool is_active_window)> on_active_window_change;
|
Function<void(bool is_active_window)> on_active_window_change;
|
||||||
Function<void(InputPreemptor)> on_input_preemption;
|
Function<void(InputPreemptor)> on_input_preemption;
|
||||||
|
|
||||||
|
@ -259,7 +260,7 @@ private:
|
||||||
void handle_multi_paint_event(MultiPaintEvent&);
|
void handle_multi_paint_event(MultiPaintEvent&);
|
||||||
void handle_key_event(KeyEvent&);
|
void handle_key_event(KeyEvent&);
|
||||||
void handle_resize_event(ResizeEvent&);
|
void handle_resize_event(ResizeEvent&);
|
||||||
void handle_input_entered_or_left_event(Core::Event&);
|
void handle_input_preemption_event(Core::Event&);
|
||||||
void handle_became_active_or_inactive_event(Core::Event&);
|
void handle_became_active_or_inactive_event(Core::Event&);
|
||||||
void handle_close_request();
|
void handle_close_request();
|
||||||
void handle_theme_change_event(ThemeChangeEvent&);
|
void handle_theme_change_event(ThemeChangeEvent&);
|
||||||
|
|
|
@ -31,8 +31,8 @@ public:
|
||||||
KeyUp,
|
KeyUp,
|
||||||
WindowActivated,
|
WindowActivated,
|
||||||
WindowDeactivated,
|
WindowDeactivated,
|
||||||
WindowInputEntered,
|
WindowInputPreempted,
|
||||||
WindowInputLeft,
|
WindowInputRestored,
|
||||||
WindowCloseRequest,
|
WindowCloseRequest,
|
||||||
WindowResized,
|
WindowResized,
|
||||||
WindowMoved,
|
WindowMoved,
|
||||||
|
|
|
@ -452,7 +452,7 @@ void Window::event(Core::Event& event)
|
||||||
|
|
||||||
if (blocking_modal_window()) {
|
if (blocking_modal_window()) {
|
||||||
// Allow windows to process their inactivity after being blocked
|
// Allow windows to process their inactivity after being blocked
|
||||||
if (event.type() != Event::WindowDeactivated && event.type() != Event::WindowInputLeft)
|
if (event.type() != Event::WindowDeactivated && event.type() != Event::WindowInputPreempted)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,11 +482,11 @@ void Window::event(Core::Event& event)
|
||||||
case Event::WindowDeactivated:
|
case Event::WindowDeactivated:
|
||||||
m_client->async_window_deactivated(m_window_id);
|
m_client->async_window_deactivated(m_window_id);
|
||||||
break;
|
break;
|
||||||
case Event::WindowInputEntered:
|
case Event::WindowInputPreempted:
|
||||||
m_client->async_window_input_entered(m_window_id);
|
m_client->async_window_input_preempted(m_window_id);
|
||||||
break;
|
break;
|
||||||
case Event::WindowInputLeft:
|
case Event::WindowInputRestored:
|
||||||
m_client->async_window_input_left(m_window_id);
|
m_client->async_window_input_restored(m_window_id);
|
||||||
break;
|
break;
|
||||||
case Event::WindowCloseRequest:
|
case Event::WindowCloseRequest:
|
||||||
m_client->async_window_close_request(m_window_id);
|
m_client->async_window_close_request(m_window_id);
|
||||||
|
|
|
@ -13,8 +13,8 @@ endpoint WindowClient
|
||||||
mouse_wheel(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y, i32 wheel_raw_delta_x, i32 wheel_raw_delta_y) =|
|
mouse_wheel(i32 window_id, Gfx::IntPoint mouse_position, u32 button, u32 buttons, u32 modifiers, i32 wheel_delta_x, i32 wheel_delta_y, i32 wheel_raw_delta_x, i32 wheel_raw_delta_y) =|
|
||||||
window_entered(i32 window_id) =|
|
window_entered(i32 window_id) =|
|
||||||
window_left(i32 window_id) =|
|
window_left(i32 window_id) =|
|
||||||
window_input_entered(i32 window_id) =|
|
window_input_preempted(i32 window_id) =|
|
||||||
window_input_left(i32 window_id) =|
|
window_input_restored(i32 window_id) =|
|
||||||
key_down(i32 window_id, u32 code_point, u32 key, u32 modifiers, u32 scancode) =|
|
key_down(i32 window_id, u32 code_point, u32 key, u32 modifiers, u32 scancode) =|
|
||||||
key_up(i32 window_id, u32 code_point, u32 key, u32 modifiers, u32 scancode) =|
|
key_up(i32 window_id, u32 code_point, u32 key, u32 modifiers, u32 scancode) =|
|
||||||
window_activated(i32 window_id) =|
|
window_activated(i32 window_id) =|
|
||||||
|
|
|
@ -1828,20 +1828,6 @@ Window* WindowManager::set_active_input_window(Window* window)
|
||||||
return previous_input_window;
|
return previous_input_window;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowManager::notify_new_active_input_window(Window& new_input_window)
|
|
||||||
{
|
|
||||||
Core::EventLoop::current().post_event(new_input_window, make<Event>(Event::WindowInputEntered));
|
|
||||||
if (new_input_window.is_capturing_input() && !new_input_window.is_frameless())
|
|
||||||
new_input_window.invalidate(true, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WindowManager::notify_previous_active_input_window(Window& previous_input_window)
|
|
||||||
{
|
|
||||||
Core::EventLoop::current().post_event(previous_input_window, make<Event>(Event::WindowInputLeft));
|
|
||||||
if (previous_input_window.is_capturing_input() && !previous_input_window.is_frameless())
|
|
||||||
previous_input_window.invalidate(true, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void WindowManager::set_active_window(Window* new_active_window, bool make_input)
|
void WindowManager::set_active_window(Window* new_active_window, bool make_input)
|
||||||
{
|
{
|
||||||
if (new_active_window) {
|
if (new_active_window) {
|
||||||
|
@ -1905,6 +1891,18 @@ void WindowManager::notify_previous_active_window(Window& previously_active_wind
|
||||||
tell_wms_window_state_changed(previously_active_window);
|
tell_wms_window_state_changed(previously_active_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WindowManager::notify_active_window_input_preempted()
|
||||||
|
{
|
||||||
|
if (active_window())
|
||||||
|
Core::EventLoop::current().post_event(*active_window(), make<Event>(Event::WindowInputPreempted));
|
||||||
|
}
|
||||||
|
|
||||||
|
void WindowManager::notify_active_window_input_restored()
|
||||||
|
{
|
||||||
|
if (active_window())
|
||||||
|
Core::EventLoop::current().post_event(*active_window(), make<Event>(Event::WindowInputRestored));
|
||||||
|
}
|
||||||
|
|
||||||
bool WindowManager::set_hovered_window(Window* window)
|
bool WindowManager::set_hovered_window(Window* window)
|
||||||
{
|
{
|
||||||
if (m_hovered_window == window)
|
if (m_hovered_window == window)
|
||||||
|
|
|
@ -341,9 +341,9 @@ private:
|
||||||
explicit WindowManager(Gfx::PaletteImpl const&);
|
explicit WindowManager(Gfx::PaletteImpl const&);
|
||||||
|
|
||||||
void notify_new_active_window(Window&);
|
void notify_new_active_window(Window&);
|
||||||
void notify_new_active_input_window(Window&);
|
|
||||||
void notify_previous_active_window(Window&);
|
void notify_previous_active_window(Window&);
|
||||||
void notify_previous_active_input_window(Window&);
|
void notify_active_window_input_preempted();
|
||||||
|
void notify_active_window_input_restored();
|
||||||
|
|
||||||
void process_mouse_event(MouseEvent&);
|
void process_mouse_event(MouseEvent&);
|
||||||
void process_event_for_doubleclick(Window& window, MouseEvent& event);
|
void process_event_for_doubleclick(Window& window, MouseEvent& event);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue