forked from Bananymous/banan-os
				
			LibGUI: Add support for changing window title
This commit is contained in:
		
							parent
							
								
									ccb81de85d
								
							
						
					
					
						commit
						76d4e6bd18
					
				|  | @ -287,6 +287,15 @@ namespace LibGUI | ||||||
| 			return on_socket_error(__FUNCTION__); | 			return on_socket_error(__FUNCTION__); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	void Window::set_title(BAN::StringView title) | ||||||
|  | 	{ | ||||||
|  | 		WindowPacket::WindowSetTitle packet; | ||||||
|  | 		MUST(packet.title.append(title)); | ||||||
|  | 
 | ||||||
|  | 		if (auto ret = packet.send_serialized(m_server_fd); ret.is_error()) | ||||||
|  | 			return on_socket_error(__FUNCTION__); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	void Window::set_position(int32_t x, int32_t y) | 	void Window::set_position(int32_t x, int32_t y) | ||||||
| 	{ | 	{ | ||||||
| 		WindowPacket::WindowSetPosition packet; | 		WindowPacket::WindowSetPosition packet; | ||||||
|  |  | ||||||
|  | @ -165,6 +165,7 @@ namespace LibGUI | ||||||
| 		WindowSetMouseCapture, | 		WindowSetMouseCapture, | ||||||
| 		WindowSetSize, | 		WindowSetSize, | ||||||
| 		WindowSetFullscreen, | 		WindowSetFullscreen, | ||||||
|  | 		WindowSetTitle, | ||||||
| 
 | 
 | ||||||
| 		DestroyWindowEvent, | 		DestroyWindowEvent, | ||||||
| 		CloseWindowEvent, | 		CloseWindowEvent, | ||||||
|  | @ -230,6 +231,11 @@ namespace LibGUI | ||||||
| 			bool, fullscreen | 			bool, fullscreen | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
|  | 		DEFINE_PACKET( | ||||||
|  | 			WindowSetTitle, | ||||||
|  | 			BAN::String, title | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	namespace EventPacket | 	namespace EventPacket | ||||||
|  |  | ||||||
|  | @ -68,6 +68,7 @@ namespace LibGUI | ||||||
| 
 | 
 | ||||||
| 		void set_mouse_capture(bool captured); | 		void set_mouse_capture(bool captured); | ||||||
| 		void set_fullscreen(bool fullscreen); | 		void set_fullscreen(bool fullscreen); | ||||||
|  | 		void set_title(BAN::StringView title); | ||||||
| 
 | 
 | ||||||
| 		void set_position(int32_t x, int32_t y); | 		void set_position(int32_t x, int32_t y); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -52,6 +52,8 @@ public: | ||||||
| 	LibGUI::Window::Attributes get_attributes() const { return m_attributes; }; | 	LibGUI::Window::Attributes get_attributes() const { return m_attributes; }; | ||||||
| 	void set_attributes(LibGUI::Window::Attributes attributes) { m_attributes = attributes; }; | 	void set_attributes(LibGUI::Window::Attributes attributes) { m_attributes = attributes; }; | ||||||
| 
 | 
 | ||||||
|  | 	BAN::ErrorOr<void> set_title(BAN::StringView title) { m_title.clear(); TRY(m_title.append(title)); TRY(prepare_title_bar()); return {}; } | ||||||
|  | 
 | ||||||
| 	const uint32_t* framebuffer() const { return m_fb_addr; } | 	const uint32_t* framebuffer() const { return m_fb_addr; } | ||||||
| 
 | 
 | ||||||
| 	uint32_t title_bar_pixel(int32_t abs_x, int32_t abs_y, Position cursor) const | 	uint32_t title_bar_pixel(int32_t abs_x, int32_t abs_y, Position cursor) const | ||||||
|  |  | ||||||
|  | @ -307,7 +307,7 @@ void WindowServer::on_window_set_fullscreen(int fd, const LibGUI::WindowPacket:: | ||||||
| 
 | 
 | ||||||
| 	if (!target_window) | 	if (!target_window) | ||||||
| 	{ | 	{ | ||||||
| 		dwarnln("client tried to set window size while not owning a window"); | 		dwarnln("client tried to set window fullscreen while not owning a window"); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -316,6 +316,32 @@ void WindowServer::on_window_set_fullscreen(int fd, const LibGUI::WindowPacket:: | ||||||
| 	invalidate(m_framebuffer.area()); | 	invalidate(m_framebuffer.area()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void WindowServer::on_window_set_title(int fd, const LibGUI::WindowPacket::WindowSetTitle& packet) | ||||||
|  | { | ||||||
|  | 	BAN::RefPtr<Window> target_window; | ||||||
|  | 	for (auto& window : m_client_windows) | ||||||
|  | 	{ | ||||||
|  | 		if (window->client_fd() != fd) | ||||||
|  | 			continue; | ||||||
|  | 		target_window = window; | ||||||
|  | 		break; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (!target_window) | ||||||
|  | 	{ | ||||||
|  | 		dwarnln("client tried to set window title while not owning a window"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (auto ret = target_window->set_title(packet.title); ret.is_error()) | ||||||
|  | 	{ | ||||||
|  | 		dwarnln("failed to set window title: {}", ret.error()); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	invalidate(target_window->title_bar_area()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void WindowServer::on_key_event(LibInput::KeyEvent event) | void WindowServer::on_key_event(LibInput::KeyEvent event) | ||||||
| { | { | ||||||
| 	// Mod key is not passed to clients
 | 	// Mod key is not passed to clients
 | ||||||
|  |  | ||||||
|  | @ -38,6 +38,7 @@ public: | ||||||
| 	void on_window_set_mouse_capture(int fd, const LibGUI::WindowPacket::WindowSetMouseCapture&); | 	void on_window_set_mouse_capture(int fd, const LibGUI::WindowPacket::WindowSetMouseCapture&); | ||||||
| 	void on_window_set_size(int fd, const LibGUI::WindowPacket::WindowSetSize&); | 	void on_window_set_size(int fd, const LibGUI::WindowPacket::WindowSetSize&); | ||||||
| 	void on_window_set_fullscreen(int fd, const LibGUI::WindowPacket::WindowSetFullscreen&); | 	void on_window_set_fullscreen(int fd, const LibGUI::WindowPacket::WindowSetFullscreen&); | ||||||
|  | 	void on_window_set_title(int fd, const LibGUI::WindowPacket::WindowSetTitle&); | ||||||
| 
 | 
 | ||||||
| 	void on_key_event(LibInput::KeyEvent event); | 	void on_key_event(LibInput::KeyEvent event); | ||||||
| 	void on_mouse_button(LibInput::MouseButtonEvent event); | 	void on_mouse_button(LibInput::MouseButtonEvent event); | ||||||
|  |  | ||||||
|  | @ -379,6 +379,10 @@ int main() | ||||||
| 						if (auto ret = LibGUI::WindowPacket::WindowSetFullscreen::deserialize(client_data.packet_buffer.span()); !ret.is_error()) | 						if (auto ret = LibGUI::WindowPacket::WindowSetFullscreen::deserialize(client_data.packet_buffer.span()); !ret.is_error()) | ||||||
| 							window_server.on_window_set_fullscreen(fd, ret.release_value()); | 							window_server.on_window_set_fullscreen(fd, ret.release_value()); | ||||||
| 						break; | 						break; | ||||||
|  | 					case LibGUI::PacketType::WindowSetTitle: | ||||||
|  | 						if (auto ret = LibGUI::WindowPacket::WindowSetTitle::deserialize(client_data.packet_buffer.span()); !ret.is_error()) | ||||||
|  | 							window_server.on_window_set_title(fd, ret.release_value()); | ||||||
|  | 						break; | ||||||
| 					default: | 					default: | ||||||
| 						dprintln("unhandled packet type: {}", *reinterpret_cast<uint32_t*>(client_data.packet_buffer.data())); | 						dprintln("unhandled packet type: {}", *reinterpret_cast<uint32_t*>(client_data.packet_buffer.data())); | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue