forked from Bananymous/banan-os
				
			LibGUI/WindowServer: Implement per-window cursor hiding
This commit is contained in:
		
							parent
							
								
									7dcf1797e9
								
							
						
					
					
						commit
						273e9bbc92
					
				|  | @ -234,6 +234,7 @@ namespace LibGUI | ||||||
| 			bool alpha_channel; | 			bool alpha_channel; | ||||||
| 			bool resizable; | 			bool resizable; | ||||||
| 			bool shown; | 			bool shown; | ||||||
|  | 			bool cursor_visible; | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
| 		DEFINE_PACKET( | 		DEFINE_PACKET( | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ namespace LibGUI | ||||||
| 			.alpha_channel   = false, | 			.alpha_channel   = false, | ||||||
| 			.resizable       = false, | 			.resizable       = false, | ||||||
| 			.shown           = true, | 			.shown           = true, | ||||||
|  | 			.cursor_visible  = true, | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
| 	public: | 	public: | ||||||
|  | @ -48,6 +49,8 @@ namespace LibGUI | ||||||
| 
 | 
 | ||||||
| 		void set_position(int32_t x, int32_t y); | 		void set_position(int32_t x, int32_t y); | ||||||
| 
 | 
 | ||||||
|  | 		void set_cursor_visible(bool visible); | ||||||
|  | 
 | ||||||
| 		Attributes get_attributes() const { return m_attributes; } | 		Attributes get_attributes() const { return m_attributes; } | ||||||
| 		void set_attributes(Attributes attributes); | 		void set_attributes(Attributes attributes); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1201,6 +1201,8 @@ void WindowServer::sync() | ||||||
| 
 | 
 | ||||||
| Rectangle WindowServer::cursor_area() const | Rectangle WindowServer::cursor_area() const | ||||||
| { | { | ||||||
|  | 	if (auto window = find_hovered_window(); window && !window->get_attributes().cursor_visible) | ||||||
|  | 		return { m_cursor.x, m_cursor.y, 0, 0 }; | ||||||
| 	return { m_cursor.x, m_cursor.y, s_cursor_width, s_cursor_height }; | 	return { m_cursor.x, m_cursor.y, s_cursor_width, s_cursor_height }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -1241,14 +1243,19 @@ Rectangle WindowServer::resize_area(Position cursor) const | ||||||
| 	}; | 	}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| BAN::RefPtr<Window> WindowServer::find_window_with_fd(int fd) | BAN::RefPtr<Window> WindowServer::find_window_with_fd(int fd) const | ||||||
| { | { | ||||||
| 	for (auto window : m_client_windows) | 	for (auto window : m_client_windows) | ||||||
| 	{ | 		if (window->client_fd() == fd) | ||||||
| 		if (window->client_fd() != fd) | 			return window; | ||||||
| 			continue; | 	return {}; | ||||||
| 		return window; | } | ||||||
| 	} | 
 | ||||||
|  | BAN::RefPtr<Window> WindowServer::find_hovered_window() const | ||||||
|  | { | ||||||
|  | 	for (auto window : m_client_windows) | ||||||
|  | 		if (window->full_area().contains(m_cursor)) | ||||||
|  | 			return window; | ||||||
| 	return {}; | 	return {}; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -66,7 +66,8 @@ private: | ||||||
| 
 | 
 | ||||||
| 	bool resize_window(BAN::RefPtr<Window> window, uint32_t width, uint32_t height) const; | 	bool resize_window(BAN::RefPtr<Window> window, uint32_t width, uint32_t height) const; | ||||||
| 
 | 
 | ||||||
| 	BAN::RefPtr<Window> find_window_with_fd(int fd); | 	BAN::RefPtr<Window> find_window_with_fd(int fd) const; | ||||||
|  | 	BAN::RefPtr<Window> find_hovered_window() const; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
| 	struct RangeList | 	struct RangeList | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue