forked from Bananymous/banan-os
				
			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