From 710b896a84d9126da383e16ca139cdb03d18d54d Mon Sep 17 00:00:00 2001 From: Oskari Alaranta Date: Sun, 22 Feb 2026 21:57:10 +0200 Subject: [PATCH] LibGUI/WindowServer: Add fullscreen events --- LibGUI/Window.cpp | 4 ++++ LibGUI/include/LibGUI/Packet.h | 9 ++++++++ LibGUI/include/LibGUI/Window.h | 38 ++++++++++++++++++---------------- WindowServer/WindowServer.cpp | 33 +++++++++++++++++++++++++---- 4 files changed, 62 insertions(+), 22 deletions(-) diff --git a/LibGUI/Window.cpp b/LibGUI/Window.cpp index 17370ef..6b81933 100644 --- a/LibGUI/Window.cpp +++ b/LibGUI/Window.cpp @@ -348,6 +348,10 @@ namespace LibGUI if (m_window_focus_event_callback) m_window_focus_event_callback(TRY_OR_BREAK(EventPacket::WindowFocusEvent::deserialize(packet_data.span())).event); break; + case PacketType::WindowFullscreenEvent: + if (m_window_fullscreen_event_callback) + m_window_fullscreen_event_callback(TRY_OR_BREAK(EventPacket::WindowFullscreenEvent::deserialize(packet_data.span())).event); + break; case PacketType::KeyEvent: if (m_key_event_callback) m_key_event_callback(TRY_OR_BREAK(EventPacket::KeyEvent::deserialize(packet_data.span())).event); diff --git a/LibGUI/include/LibGUI/Packet.h b/LibGUI/include/LibGUI/Packet.h index c0e721a..c1a274c 100644 --- a/LibGUI/include/LibGUI/Packet.h +++ b/LibGUI/include/LibGUI/Packet.h @@ -219,6 +219,7 @@ namespace LibGUI ResizeWindowEvent, WindowShownEvent, WindowFocusEvent, + WindowFullscreenEvent, KeyEvent, MouseButtonEvent, MouseMoveEvent, @@ -345,6 +346,14 @@ namespace LibGUI event_t, event ); + DEFINE_PACKET_EXTRA( + WindowFullscreenEvent, + struct event_t { + bool fullscreen; + }, + event_t, event + ); + DEFINE_PACKET_EXTRA( KeyEvent, using event_t = LibInput::KeyEvent, diff --git a/LibGUI/include/LibGUI/Window.h b/LibGUI/include/LibGUI/Window.h index 1a31c4c..a3ea642 100644 --- a/LibGUI/include/LibGUI/Window.h +++ b/LibGUI/include/LibGUI/Window.h @@ -68,15 +68,16 @@ namespace LibGUI void wait_events(); void poll_events(); - void set_socket_error_callback(BAN::Function callback) { m_socket_error_callback = callback; } - void set_close_window_event_callback(BAN::Function callback) { m_close_window_event_callback = callback; } - void set_resize_window_event_callback(BAN::Function callback) { m_resize_window_event_callback = callback; } - void set_key_event_callback(BAN::Function callback) { m_key_event_callback = callback; } - void set_mouse_button_event_callback(BAN::Function callback) { m_mouse_button_event_callback = callback; } - void set_mouse_move_event_callback(BAN::Function callback) { m_mouse_move_event_callback = callback; } - void set_mouse_scroll_event_callback(BAN::Function callback) { m_mouse_scroll_event_callback = callback; } - void set_window_shown_event_callback(BAN::Function callback) { m_window_shown_event_callback = callback; } - void set_window_focus_event_callback(BAN::Function callback) { m_window_focus_event_callback = callback; } + void set_socket_error_callback(BAN::Function callback) { m_socket_error_callback = callback; } + void set_close_window_event_callback(BAN::Function callback) { m_close_window_event_callback = callback; } + void set_resize_window_event_callback(BAN::Function callback) { m_resize_window_event_callback = callback; } + void set_key_event_callback(BAN::Function callback) { m_key_event_callback = callback; } + void set_mouse_button_event_callback(BAN::Function callback) { m_mouse_button_event_callback = callback; } + void set_mouse_move_event_callback(BAN::Function callback) { m_mouse_move_event_callback = callback; } + void set_mouse_scroll_event_callback(BAN::Function callback) { m_mouse_scroll_event_callback = callback; } + void set_window_shown_event_callback(BAN::Function callback) { m_window_shown_event_callback = callback; } + void set_window_focus_event_callback(BAN::Function callback) { m_window_focus_event_callback = callback; } + void set_window_fullscreen_event_callback(BAN::Function callback) { m_window_fullscreen_event_callback = callback; } int server_fd() const { return m_server_fd; } @@ -107,15 +108,16 @@ namespace LibGUI Texture m_texture; BAN::RefPtr m_root_widget; - BAN::Function m_socket_error_callback; - BAN::Function m_close_window_event_callback; - BAN::Function m_resize_window_event_callback; - BAN::Function m_window_shown_event_callback; - BAN::Function m_window_focus_event_callback; - BAN::Function m_key_event_callback; - BAN::Function m_mouse_button_event_callback; - BAN::Function m_mouse_move_event_callback; - BAN::Function m_mouse_scroll_event_callback; + BAN::Function m_socket_error_callback; + BAN::Function m_close_window_event_callback; + BAN::Function m_resize_window_event_callback; + BAN::Function m_window_shown_event_callback; + BAN::Function m_window_focus_event_callback; + BAN::Function m_window_fullscreen_event_callback; + BAN::Function m_key_event_callback; + BAN::Function m_mouse_button_event_callback; + BAN::Function m_mouse_move_event_callback; + BAN::Function m_mouse_scroll_event_callback; friend class BAN::UniqPtr; }; diff --git a/WindowServer/WindowServer.cpp b/WindowServer/WindowServer.cpp index b5a0338..5a5eee7 100644 --- a/WindowServer/WindowServer.cpp +++ b/WindowServer/WindowServer.cpp @@ -94,7 +94,7 @@ void WindowServer::on_window_create(int fd, const LibGUI::WindowPacket::WindowCr window_popper.disable(); - if (packet.attributes.shown && packet.attributes.focusable) + if (packet.attributes.shown && packet.attributes.focusable && m_state == State::Normal) set_focused_window(window); 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]); @@ -177,9 +177,15 @@ void WindowServer::on_window_set_attributes(int fd, const LibGUI::WindowPacket:: if ((!packet.attributes.focusable || !packet.attributes.shown) && m_focused_window == target_window) { + if (m_state == State::Fullscreen && m_focused_window->get_attributes().resizable) + { + if (!resize_window(m_focused_window, m_non_full_screen_rect.width, m_non_full_screen_rect.height)) + return; + m_focused_window->set_position({ m_non_full_screen_rect.x, m_non_full_screen_rect.y }); + } + m_focused_window = nullptr; - if (m_state == State::Moving || m_state == State::Resizing) - m_state = State::Normal; + m_state = State::Normal; for (size_t i = m_client_windows.size(); i > 0; i--) { auto& window = m_client_windows[i - 1]; @@ -202,7 +208,7 @@ 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()) dwarnln("could not send window shown event: {}", ret.error()); - if (packet.attributes.focusable && packet.attributes.shown) + if (packet.attributes.focusable && packet.attributes.shown && m_state == State::Normal) set_focused_window(target_window); } @@ -302,6 +308,13 @@ void WindowServer::on_window_set_fullscreen(int fd, const LibGUI::WindowPacket:: return; m_focused_window->set_position({ m_non_full_screen_rect.x, m_non_full_screen_rect.y }); } + + auto event_packet = LibGUI::EventPacket::WindowFullscreenEvent { + .event = { .fullscreen = false } + }; + if (auto ret = event_packet.send_serialized(m_focused_window->client_fd()); ret.is_error()) + dwarnln("could not send window fullscreen event: {}", ret.error()); + m_state = State::Normal; invalidate(m_framebuffer.area()); return; @@ -331,6 +344,12 @@ void WindowServer::on_window_set_fullscreen(int fd, const LibGUI::WindowPacket:: m_non_full_screen_rect = old_area; } + auto event_packet = LibGUI::EventPacket::WindowFullscreenEvent { + .event = { .fullscreen = true } + }; + if (auto ret = event_packet.send_serialized(target_window->client_fd()); ret.is_error()) + dwarnln("could not send window fullscreen event: {}", ret.error()); + m_state = State::Fullscreen; set_focused_window(target_window); invalidate(m_framebuffer.area()); @@ -486,6 +505,12 @@ void WindowServer::on_key_event(LibInput::KeyEvent event) m_state = State::Fullscreen; } + auto event_packet = LibGUI::EventPacket::WindowFullscreenEvent { + .event = { .fullscreen = (m_state == State::Fullscreen) } + }; + if (auto ret = event_packet.send_serialized(m_focused_window->client_fd()); ret.is_error()) + dwarnln("could not send window fullscreen event: {}", ret.error()); + invalidate(m_framebuffer.area()); return; }