LibGUI: Add query keymap request

This commit is contained in:
2026-07-04 19:12:56 +03:00
parent 6aa2329267
commit a41a3eeb66
6 changed files with 61 additions and 0 deletions

View File

@@ -288,6 +288,12 @@ namespace LibGUI
send_packet(packet, __FUNCTION__); send_packet(packet, __FUNCTION__);
} }
void Window::query_keymap()
{
const WindowPacket::QueryKeymap packet {};
send_packet(packet, __FUNCTION__);
}
void Window::on_socket_error(BAN::StringView function) void Window::on_socket_error(BAN::StringView function)
{ {
if (m_handling_socket_error) if (m_handling_socket_error)
@@ -473,6 +479,10 @@ namespace LibGUI
if (m_query_pointer_event_callback) if (m_query_pointer_event_callback)
m_query_pointer_event_callback(TRY_OR_BREAK(EventPacket::QueryPointerEvent::deserialize(packet_span)).event); m_query_pointer_event_callback(TRY_OR_BREAK(EventPacket::QueryPointerEvent::deserialize(packet_span)).event);
break; break;
case PacketType::QueryKeymapEvent:
if (m_query_keymap_event_callback)
m_query_keymap_event_callback(TRY_OR_BREAK(EventPacket::QueryKeymapEvent::deserialize(packet_span)).event);
break;
#undef TRY_OR_BREAK #undef TRY_OR_BREAK
default: default:
dprintln("unhandled packet type: {}", static_cast<uint32_t>(header.type)); dprintln("unhandled packet type: {}", static_cast<uint32_t>(header.type));

View File

@@ -214,6 +214,8 @@ namespace LibGUI
QueryPointer, QueryPointer,
QueryPointerEvent, QueryPointerEvent,
QueryKeymap,
QueryKeymapEvent,
}; };
struct PacketHeader struct PacketHeader
@@ -310,6 +312,10 @@ namespace LibGUI
QueryPointer QueryPointer
); );
DEFINE_PACKET(
QueryKeymap
);
} }
namespace EventPacket namespace EventPacket
@@ -406,6 +412,15 @@ namespace LibGUI
event_t, event event_t, event
); );
DEFINE_PACKET_EXTRA(
QueryKeymapEvent,
struct event_t {
uint16_t modifiers[4];
uint32_t keymap[4][0x100];
},
event_t, event
);
} }
} }

View File

@@ -64,6 +64,7 @@ namespace LibGUI
void request_resize(uint32_t width, uint32_t height); void request_resize(uint32_t width, uint32_t height);
void query_cursor_position(); void query_cursor_position();
void query_keymap();
uint32_t width() const { return m_width; } uint32_t width() const { return m_width; }
uint32_t height() const { return m_height; } uint32_t height() const { return m_height; }
@@ -83,6 +84,7 @@ namespace LibGUI
void set_window_fullscreen_event_callback(BAN::Function<void(EventPacket::WindowFullscreenEvent::event_t)> callback) { m_window_fullscreen_event_callback = callback; } void set_window_fullscreen_event_callback(BAN::Function<void(EventPacket::WindowFullscreenEvent::event_t)> callback) { m_window_fullscreen_event_callback = callback; }
void set_window_move_event_callback(BAN::Function<void(EventPacket::WindowMoveEvent::event_t)> callback) { m_window_move_event_callback = callback; } void set_window_move_event_callback(BAN::Function<void(EventPacket::WindowMoveEvent::event_t)> callback) { m_window_move_event_callback = callback; }
void set_query_pointer_event_callback(BAN::Function<void(EventPacket::QueryPointerEvent::event_t)> callback) { m_query_pointer_event_callback = callback; } void set_query_pointer_event_callback(BAN::Function<void(EventPacket::QueryPointerEvent::event_t)> callback) { m_query_pointer_event_callback = callback; }
void set_query_keymap_event_callback(BAN::Function<void(EventPacket::QueryKeymapEvent::event_t)> callback) { m_query_keymap_event_callback = callback; }
int server_fd() const { return m_server_fd; } int server_fd() const { return m_server_fd; }
@@ -132,6 +134,7 @@ namespace LibGUI
BAN::Function<void(EventPacket::MouseMoveEvent::event_t)> m_mouse_move_event_callback; BAN::Function<void(EventPacket::MouseMoveEvent::event_t)> m_mouse_move_event_callback;
BAN::Function<void(EventPacket::MouseScrollEvent::event_t)> m_mouse_scroll_event_callback; BAN::Function<void(EventPacket::MouseScrollEvent::event_t)> m_mouse_scroll_event_callback;
BAN::Function<void(EventPacket::QueryPointerEvent::event_t)> m_query_pointer_event_callback; BAN::Function<void(EventPacket::QueryPointerEvent::event_t)> m_query_pointer_event_callback;
BAN::Function<void(EventPacket::QueryKeymapEvent::event_t)> m_query_keymap_event_callback;
size_t m_in_buffer_size { 0 }; size_t m_in_buffer_size { 0 };
BAN::Array<uint8_t, 64 * 1024> m_in_buffer; BAN::Array<uint8_t, 64 * 1024> m_in_buffer;

View File

@@ -53,6 +53,37 @@ void WindowServer::on_query_pointer(int fd, const LibGUI::WindowPacket::QueryPoi
} }
} }
void WindowServer::on_query_keymap(int fd, const LibGUI::WindowPacket::QueryKeymap&)
{
LibGUI::EventPacket::QueryKeymapEvent event_packet {};
const uint16_t modifiers[4] {
0,
LibInput::KeyEvent::LShift,
LibInput::KeyEvent::RAlt,
LibInput::KeyEvent::LShift | LibInput::KeyEvent::RAlt,
};
const auto& layout = LibInput::KeyboardLayout::get();
for (size_t i = 0; i < 4; i++)
{
event_packet.event.modifiers[i] = modifiers[i];
for (size_t keycode = 0; keycode < 0x100; keycode++)
{
event_packet.event.keymap[i][keycode] = static_cast<uint32_t>(layout.key_event_from_raw({
.modifier = modifiers[i],
.keycode = static_cast<uint8_t>(keycode),
}).key);
}
}
if (auto ret = append_serialized_packet(event_packet, fd); ret.is_error())
{
dwarnln("could not respond to query pointer request: {}", ret.error());
return;
}
}
void WindowServer::on_window_create(int fd, const LibGUI::WindowPacket::WindowCreate& packet) void WindowServer::on_window_create(int fd, const LibGUI::WindowPacket::WindowCreate& packet)
{ {
for (auto& window : m_client_windows) for (auto& window : m_client_windows)

View File

@@ -32,6 +32,7 @@ public:
BAN::ErrorOr<void> set_background_image(BAN::UniqPtr<LibImage::Image>); BAN::ErrorOr<void> set_background_image(BAN::UniqPtr<LibImage::Image>);
void on_query_pointer(int fd, const LibGUI::WindowPacket::QueryPointer&); void on_query_pointer(int fd, const LibGUI::WindowPacket::QueryPointer&);
void on_query_keymap(int fd, const LibGUI::WindowPacket::QueryKeymap&);
void on_window_create(int fd, const LibGUI::WindowPacket::WindowCreate&); void on_window_create(int fd, const LibGUI::WindowPacket::WindowCreate&);
void on_window_invalidate(int fd, const LibGUI::WindowPacket::WindowInvalidate&); void on_window_invalidate(int fd, const LibGUI::WindowPacket::WindowInvalidate&);

View File

@@ -474,6 +474,7 @@ int main()
WINDOW_PACKET_CASE(WindowSetTitle, on_window_set_title); WINDOW_PACKET_CASE(WindowSetTitle, on_window_set_title);
WINDOW_PACKET_CASE(WindowSetCursor, on_window_set_cursor); WINDOW_PACKET_CASE(WindowSetCursor, on_window_set_cursor);
WINDOW_PACKET_CASE(QueryPointer, on_query_pointer); WINDOW_PACKET_CASE(QueryPointer, on_query_pointer);
WINDOW_PACKET_CASE(QueryKeymap, on_query_keymap);
#undef WINDOW_PACKET_CASE #undef WINDOW_PACKET_CASE
default: default:
dprintln("unhandled packet type: {}", static_cast<uint32_t>(header.type)); dprintln("unhandled packet type: {}", static_cast<uint32_t>(header.type));