mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:42:43 +00:00 
			
		
		
		
	 0363cd3d55
			
		
	
	
		0363cd3d55
		
	
	
	
	
		
			
			This commit adds two new IPC calls for WindowServer: apply_cursor_theme and get_cursor_theme.
		
			
				
	
	
		
			187 lines
		
	
	
	
		
			8.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
	
		
			8.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/Badge.h>
 | |
| #include <AK/Function.h>
 | |
| #include <AK/HashMap.h>
 | |
| #include <AK/Optional.h>
 | |
| #include <AK/OwnPtr.h>
 | |
| #include <AK/WeakPtr.h>
 | |
| #include <LibCore/Object.h>
 | |
| #include <LibGfx/Bitmap.h>
 | |
| #include <LibGfx/Rect.h>
 | |
| #include <LibIPC/ClientConnection.h>
 | |
| #include <WindowServer/Event.h>
 | |
| #include <WindowServer/Menu.h>
 | |
| #include <WindowServer/ScreenLayout.h>
 | |
| #include <WindowServer/WindowClientEndpoint.h>
 | |
| #include <WindowServer/WindowServerEndpoint.h>
 | |
| 
 | |
| namespace WindowServer {
 | |
| 
 | |
| class Compositor;
 | |
| class Window;
 | |
| class Menu;
 | |
| class Menubar;
 | |
| class ScreenLayout;
 | |
| class WMClientConnection;
 | |
| 
 | |
| class ClientConnection final
 | |
|     : public IPC::ClientConnection<WindowClientEndpoint, WindowServerEndpoint> {
 | |
|     C_OBJECT(ClientConnection)
 | |
| public:
 | |
|     ~ClientConnection() override;
 | |
| 
 | |
|     bool is_unresponsive() const { return m_unresponsive; }
 | |
| 
 | |
|     static ClientConnection* from_client_id(int client_id);
 | |
|     static void for_each_client(Function<void(ClientConnection&)>);
 | |
| 
 | |
|     void notify_about_new_screen_rects();
 | |
|     void post_paint_message(Window&, bool ignore_occlusion = false);
 | |
| 
 | |
|     Menu* find_menu_by_id(int menu_id)
 | |
|     {
 | |
|         auto menu = m_menus.get(menu_id);
 | |
|         if (!menu.has_value())
 | |
|             return nullptr;
 | |
|         return menu.value();
 | |
|     }
 | |
|     const Menu* find_menu_by_id(int menu_id) const
 | |
|     {
 | |
|         auto menu = m_menus.get(menu_id);
 | |
|         if (!menu.has_value())
 | |
|             return nullptr;
 | |
|         return menu.value();
 | |
|     }
 | |
| 
 | |
|     template<typename Callback>
 | |
|     void for_each_window(Callback callback)
 | |
|     {
 | |
|         for (auto& it : m_windows) {
 | |
|             if (callback(*it.value) == IterationDecision::Break)
 | |
|                 break;
 | |
|         }
 | |
|     }
 | |
|     template<typename Callback>
 | |
|     void for_each_menu(Callback callback)
 | |
|     {
 | |
|         for (auto& it : m_menus) {
 | |
|             if (callback(*it.value) == IterationDecision::Break)
 | |
|                 break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     void notify_display_link(Badge<Compositor>);
 | |
| 
 | |
| private:
 | |
|     explicit ClientConnection(NonnullRefPtr<Core::LocalSocket>, int client_id);
 | |
| 
 | |
|     // ^ClientConnection
 | |
|     virtual void die() override;
 | |
|     virtual void may_have_become_unresponsive() override;
 | |
|     virtual void did_become_responsive() override;
 | |
| 
 | |
|     void set_unresponsive(bool);
 | |
|     void destroy_window(Window&, Vector<i32>& destroyed_window_ids);
 | |
| 
 | |
|     virtual void create_menu(i32, String const&) override;
 | |
|     virtual void destroy_menu(i32) override;
 | |
|     virtual void add_menu(i32, i32) override;
 | |
|     virtual void add_menu_item(i32, i32, i32, String const&, bool, bool, bool, bool, String const&, Gfx::ShareableBitmap const&, bool) override;
 | |
|     virtual void add_menu_separator(i32) override;
 | |
|     virtual void update_menu_item(i32, i32, i32, String const&, bool, bool, bool, bool, String const&) override;
 | |
|     virtual void create_window(i32, Gfx::IntRect const&, bool, bool, bool, bool,
 | |
|         bool, bool, bool, bool, bool, float, float, Gfx::IntSize const&, Gfx::IntSize const&, Gfx::IntSize const&,
 | |
|         Optional<Gfx::IntSize> const&, i32, String const&, i32, Gfx::IntRect const&) override;
 | |
|     virtual Messages::WindowServer::DestroyWindowResponse destroy_window(i32) override;
 | |
|     virtual void set_window_title(i32, String const&) override;
 | |
|     virtual Messages::WindowServer::GetWindowTitleResponse get_window_title(i32) override;
 | |
|     virtual Messages::WindowServer::IsMaximizedResponse is_maximized(i32) override;
 | |
|     virtual void set_maximized(i32, bool) override;
 | |
|     virtual void start_window_resize(i32) override;
 | |
|     virtual Messages::WindowServer::SetWindowRectResponse set_window_rect(i32, Gfx::IntRect const&) override;
 | |
|     virtual Messages::WindowServer::GetWindowRectResponse get_window_rect(i32) override;
 | |
|     virtual void set_window_minimum_size(i32, Gfx::IntSize const&) override;
 | |
|     virtual Messages::WindowServer::GetWindowMinimumSizeResponse get_window_minimum_size(i32) override;
 | |
|     virtual Messages::WindowServer::GetAppletRectOnScreenResponse get_applet_rect_on_screen(i32) override;
 | |
|     virtual void invalidate_rect(i32, Vector<Gfx::IntRect> const&, bool) override;
 | |
|     virtual void did_finish_painting(i32, Vector<Gfx::IntRect> const&) override;
 | |
|     virtual void set_global_cursor_tracking(i32, bool) override;
 | |
|     virtual void set_window_opacity(i32, float) override;
 | |
|     virtual void set_window_backing_store(i32, i32, i32, IPC::File const&, i32, bool, Gfx::IntSize const&, bool) override;
 | |
|     virtual void set_window_has_alpha_channel(i32, bool) override;
 | |
|     virtual void set_window_alpha_hit_threshold(i32, float) override;
 | |
|     virtual void move_window_to_front(i32) override;
 | |
|     virtual void set_fullscreen(i32, bool) override;
 | |
|     virtual void set_frameless(i32, bool) override;
 | |
|     virtual void set_forced_shadow(i32, bool) override;
 | |
|     virtual void set_wallpaper(String const&) override;
 | |
|     virtual void set_background_color(String const&) override;
 | |
|     virtual void set_wallpaper_mode(String const&) override;
 | |
|     virtual Messages::WindowServer::GetWallpaperResponse get_wallpaper() override;
 | |
|     virtual Messages::WindowServer::SetScreenLayoutResponse set_screen_layout(ScreenLayout const&, bool) override;
 | |
|     virtual Messages::WindowServer::GetScreenLayoutResponse get_screen_layout() override;
 | |
|     virtual Messages::WindowServer::SaveScreenLayoutResponse save_screen_layout() override;
 | |
|     virtual Messages::WindowServer::ApplyVirtualDesktopSettingsResponse apply_virtual_desktop_settings(u32, u32, bool) override;
 | |
|     virtual Messages::WindowServer::GetVirtualDesktopSettingsResponse get_virtual_desktop_settings() override;
 | |
|     virtual void show_screen_numbers(bool) override;
 | |
|     virtual void set_window_cursor(i32, i32) override;
 | |
|     virtual void set_window_custom_cursor(i32, Gfx::ShareableBitmap const&) override;
 | |
|     virtual void popup_menu(i32, Gfx::IntPoint const&) override;
 | |
|     virtual void dismiss_menu(i32) override;
 | |
|     virtual void set_window_icon_bitmap(i32, Gfx::ShareableBitmap const&) override;
 | |
|     virtual Messages::WindowServer::StartDragResponse start_drag(String const&, HashMap<String, ByteBuffer> const&, Gfx::ShareableBitmap const&) override;
 | |
|     virtual Messages::WindowServer::SetSystemThemeResponse set_system_theme(String const&, String const&) override;
 | |
|     virtual Messages::WindowServer::GetSystemThemeResponse get_system_theme() override;
 | |
|     virtual void apply_cursor_theme(String const&) override;
 | |
|     virtual Messages::WindowServer::GetCursorThemeResponse get_cursor_theme() override;
 | |
|     virtual Messages::WindowServer::SetSystemFontsResponse set_system_fonts(String const&, String const&) override;
 | |
|     virtual void set_window_base_size_and_size_increment(i32, Gfx::IntSize const&, Gfx::IntSize const&) override;
 | |
|     virtual void set_window_resize_aspect_ratio(i32, Optional<Gfx::IntSize> const&) override;
 | |
|     virtual void enable_display_link() override;
 | |
|     virtual void disable_display_link() override;
 | |
|     virtual void set_window_progress(i32, Optional<i32> const&) override;
 | |
|     virtual void refresh_system_theme() override;
 | |
|     virtual void pong() override;
 | |
|     virtual void set_global_cursor_position(Gfx::IntPoint const&) override;
 | |
|     virtual Messages::WindowServer::GetGlobalCursorPositionResponse get_global_cursor_position() override;
 | |
|     virtual void set_mouse_acceleration(float) override;
 | |
|     virtual Messages::WindowServer::GetMouseAccelerationResponse get_mouse_acceleration() override;
 | |
|     virtual void set_scroll_step_size(u32) override;
 | |
|     virtual Messages::WindowServer::GetScrollStepSizeResponse get_scroll_step_size() override;
 | |
|     virtual Messages::WindowServer::GetScreenBitmapResponse get_screen_bitmap(Optional<Gfx::IntRect> const&, Optional<u32> const&) override;
 | |
|     virtual Messages::WindowServer::GetScreenBitmapAroundCursorResponse get_screen_bitmap_around_cursor(Gfx::IntSize const&) override;
 | |
|     virtual void set_double_click_speed(i32) override;
 | |
|     virtual Messages::WindowServer::GetDoubleClickSpeedResponse get_double_click_speed() override;
 | |
|     virtual void set_window_modified(i32, bool) override;
 | |
|     virtual Messages::WindowServer::IsWindowModifiedResponse is_window_modified(i32) override;
 | |
|     virtual Messages::WindowServer::GetDesktopDisplayScaleResponse get_desktop_display_scale(u32) override;
 | |
|     virtual void set_flash_flush(bool) override;
 | |
|     virtual void set_window_parent_from_client(i32, i32, i32) override;
 | |
|     virtual Messages::WindowServer::GetWindowRectFromClientResponse get_window_rect_from_client(i32, i32) override;
 | |
|     virtual void add_window_stealing_for_client(i32, i32) override;
 | |
|     virtual void remove_window_stealing_for_client(i32, i32) override;
 | |
|     virtual void remove_window_stealing(i32) override;
 | |
| 
 | |
|     Window* window_from_id(i32 window_id);
 | |
| 
 | |
|     HashMap<int, NonnullRefPtr<Window>> m_windows;
 | |
|     HashMap<int, NonnullRefPtr<Menu>> m_menus;
 | |
| 
 | |
|     RefPtr<Core::Timer> m_ping_timer;
 | |
| 
 | |
|     bool m_has_display_link { false };
 | |
|     bool m_show_screen_number { false };
 | |
|     bool m_unresponsive { false };
 | |
| 
 | |
|     // Need this to get private client connection stuff
 | |
|     friend WMClientConnection;
 | |
| };
 | |
| 
 | |
| }
 |