WindowServer/LibGUI: Add window focus events
This commit is contained in:
parent
2f3fd6867d
commit
f11bb082e4
|
@ -335,6 +335,10 @@ namespace LibGUI
|
||||||
if (m_window_shown_event_callback)
|
if (m_window_shown_event_callback)
|
||||||
m_window_shown_event_callback(TRY_OR_BREAK(EventPacket::WindowShownEvent::deserialize(packet_data.span())).event);
|
m_window_shown_event_callback(TRY_OR_BREAK(EventPacket::WindowShownEvent::deserialize(packet_data.span())).event);
|
||||||
break;
|
break;
|
||||||
|
case PacketType::WindowFocusEvent:
|
||||||
|
if (m_window_focus_event_callback)
|
||||||
|
m_window_focus_event_callback(TRY_OR_BREAK(EventPacket::WindowFocusEvent::deserialize(packet_data.span())).event);
|
||||||
|
break;
|
||||||
case PacketType::KeyEvent:
|
case PacketType::KeyEvent:
|
||||||
if (m_key_event_callback)
|
if (m_key_event_callback)
|
||||||
m_key_event_callback(TRY_OR_BREAK(EventPacket::KeyEvent::deserialize(packet_data.span())).event);
|
m_key_event_callback(TRY_OR_BREAK(EventPacket::KeyEvent::deserialize(packet_data.span())).event);
|
||||||
|
|
|
@ -217,6 +217,7 @@ namespace LibGUI
|
||||||
CloseWindowEvent,
|
CloseWindowEvent,
|
||||||
ResizeWindowEvent,
|
ResizeWindowEvent,
|
||||||
WindowShownEvent,
|
WindowShownEvent,
|
||||||
|
WindowFocusEvent,
|
||||||
KeyEvent,
|
KeyEvent,
|
||||||
MouseButtonEvent,
|
MouseButtonEvent,
|
||||||
MouseMoveEvent,
|
MouseMoveEvent,
|
||||||
|
@ -333,6 +334,14 @@ namespace LibGUI
|
||||||
event_t, event
|
event_t, event
|
||||||
);
|
);
|
||||||
|
|
||||||
|
DEFINE_PACKET_EXTRA(
|
||||||
|
WindowFocusEvent,
|
||||||
|
struct event_t {
|
||||||
|
bool focused;
|
||||||
|
},
|
||||||
|
event_t, event
|
||||||
|
);
|
||||||
|
|
||||||
DEFINE_PACKET_EXTRA(
|
DEFINE_PACKET_EXTRA(
|
||||||
KeyEvent,
|
KeyEvent,
|
||||||
using event_t = LibInput::KeyEvent,
|
using event_t = LibInput::KeyEvent,
|
||||||
|
|
|
@ -76,6 +76,7 @@ namespace LibGUI
|
||||||
void set_mouse_move_event_callback(BAN::Function<void(EventPacket::MouseMoveEvent::event_t)> callback) { m_mouse_move_event_callback = callback; }
|
void set_mouse_move_event_callback(BAN::Function<void(EventPacket::MouseMoveEvent::event_t)> callback) { m_mouse_move_event_callback = callback; }
|
||||||
void set_mouse_scroll_event_callback(BAN::Function<void(EventPacket::MouseScrollEvent::event_t)> callback) { m_mouse_scroll_event_callback = callback; }
|
void set_mouse_scroll_event_callback(BAN::Function<void(EventPacket::MouseScrollEvent::event_t)> callback) { m_mouse_scroll_event_callback = callback; }
|
||||||
void set_window_shown_event_callback(BAN::Function<void(EventPacket::WindowShownEvent::event_t)> callback) { m_window_shown_event_callback = callback; }
|
void set_window_shown_event_callback(BAN::Function<void(EventPacket::WindowShownEvent::event_t)> callback) { m_window_shown_event_callback = callback; }
|
||||||
|
void set_window_focus_event_callback(BAN::Function<void(EventPacket::WindowFocusEvent::event_t)> callback) { m_window_focus_event_callback = callback; }
|
||||||
|
|
||||||
int server_fd() const { return m_server_fd; }
|
int server_fd() const { return m_server_fd; }
|
||||||
|
|
||||||
|
@ -108,6 +109,7 @@ namespace LibGUI
|
||||||
BAN::Function<void()> m_close_window_event_callback;
|
BAN::Function<void()> m_close_window_event_callback;
|
||||||
BAN::Function<void()> m_resize_window_event_callback;
|
BAN::Function<void()> m_resize_window_event_callback;
|
||||||
BAN::Function<void(EventPacket::WindowShownEvent::event_t)> m_window_shown_event_callback;
|
BAN::Function<void(EventPacket::WindowShownEvent::event_t)> m_window_shown_event_callback;
|
||||||
|
BAN::Function<void(EventPacket::WindowFocusEvent::event_t)> m_window_focus_event_callback;
|
||||||
BAN::Function<void(EventPacket::KeyEvent::event_t)> m_key_event_callback;
|
BAN::Function<void(EventPacket::KeyEvent::event_t)> m_key_event_callback;
|
||||||
BAN::Function<void(EventPacket::MouseButtonEvent::event_t)> m_mouse_button_event_callback;
|
BAN::Function<void(EventPacket::MouseButtonEvent::event_t)> m_mouse_button_event_callback;
|
||||||
BAN::Function<void(EventPacket::MouseMoveEvent::event_t)> m_mouse_move_event_callback;
|
BAN::Function<void(EventPacket::MouseMoveEvent::event_t)> m_mouse_move_event_callback;
|
||||||
|
|
|
@ -90,7 +90,7 @@ void WindowServer::on_window_create(int fd, const LibGUI::WindowPacket::WindowCr
|
||||||
|
|
||||||
window_popper.disable();
|
window_popper.disable();
|
||||||
|
|
||||||
if (packet.attributes.focusable)
|
if (packet.attributes.shown && packet.attributes.focusable)
|
||||||
set_focused_window(window);
|
set_focused_window(window);
|
||||||
else if (m_client_windows.size() > 1)
|
else if (m_client_windows.size() > 1)
|
||||||
BAN::swap(m_client_windows[m_client_windows.size() - 1], m_client_windows[m_client_windows.size() - 2]);
|
BAN::swap(m_client_windows[m_client_windows.size() - 1], m_client_windows[m_client_windows.size() - 2]);
|
||||||
|
@ -197,6 +197,9 @@ void WindowServer::on_window_set_attributes(int fd, const LibGUI::WindowPacket::
|
||||||
};
|
};
|
||||||
if (auto ret = event_packet.send_serialized(target_window->client_fd()); ret.is_error())
|
if (auto ret = event_packet.send_serialized(target_window->client_fd()); ret.is_error())
|
||||||
dwarnln("could not send window shown event: {}", ret.error());
|
dwarnln("could not send window shown event: {}", ret.error());
|
||||||
|
|
||||||
|
if (packet.attributes.focusable && packet.attributes.shown)
|
||||||
|
set_focused_window(target_window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowServer::on_window_set_mouse_relative(int fd, const LibGUI::WindowPacket::WindowSetMouseRelative& packet)
|
void WindowServer::on_window_set_mouse_relative(int fd, const LibGUI::WindowPacket::WindowSetMouseRelative& packet)
|
||||||
|
@ -781,6 +784,17 @@ void WindowServer::set_focused_window(BAN::RefPtr<Window> window)
|
||||||
invalidate(cursor_area());
|
invalidate(cursor_area());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_focused_window)
|
||||||
|
{
|
||||||
|
LibGUI::EventPacket::WindowFocusEvent packet;
|
||||||
|
packet.event.focused = false;
|
||||||
|
if (auto ret = packet.send_serialized(m_focused_window->client_fd()); ret.is_error())
|
||||||
|
{
|
||||||
|
dwarnln("could not send window focus event: {}", ret.error());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (size_t i = m_client_windows.size(); i > 0; i--)
|
for (size_t i = m_client_windows.size(); i > 0; i--)
|
||||||
{
|
{
|
||||||
if (m_client_windows[i - 1] == window)
|
if (m_client_windows[i - 1] == window)
|
||||||
|
@ -792,6 +806,17 @@ void WindowServer::set_focused_window(BAN::RefPtr<Window> window)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_focused_window)
|
||||||
|
{
|
||||||
|
LibGUI::EventPacket::WindowFocusEvent packet;
|
||||||
|
packet.event.focused = true;
|
||||||
|
if (auto ret = packet.send_serialized(m_focused_window->client_fd()); ret.is_error())
|
||||||
|
{
|
||||||
|
dwarnln("could not send window focus event: {}", ret.error());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t alpha_blend(uint32_t color_a, uint32_t color_b)
|
static uint32_t alpha_blend(uint32_t color_a, uint32_t color_b)
|
||||||
|
|
Loading…
Reference in New Issue