Serenity Operating System
at master 214 lines 12 kB view raw
1/* 2 * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <AK/Badge.h> 10#include <AK/Function.h> 11#include <AK/HashMap.h> 12#include <AK/Optional.h> 13#include <AK/OwnPtr.h> 14#include <AK/WeakPtr.h> 15#include <LibCore/Object.h> 16#include <LibGfx/Bitmap.h> 17#include <LibGfx/Rect.h> 18#include <LibIPC/ConnectionFromClient.h> 19#include <WindowServer/Event.h> 20#include <WindowServer/Menu.h> 21#include <WindowServer/ScreenLayout.h> 22#include <WindowServer/WindowClientEndpoint.h> 23#include <WindowServer/WindowServerEndpoint.h> 24 25namespace WindowServer { 26 27class Compositor; 28class Window; 29class Menu; 30class Menubar; 31class ScreenLayout; 32class WMConnectionFromClient; 33 34class ConnectionFromClient final 35 : public IPC::ConnectionFromClient<WindowClientEndpoint, WindowServerEndpoint> { 36 C_OBJECT(ConnectionFromClient) 37public: 38 ~ConnectionFromClient() override; 39 40 bool is_unresponsive() const { return m_unresponsive; } 41 bool does_global_mouse_tracking() const { return m_does_global_mouse_tracking; } 42 43 static ConnectionFromClient* from_client_id(int client_id); 44 static void for_each_client(Function<void(ConnectionFromClient&)>); 45 46 void notify_about_new_screen_rects(); 47 void post_paint_message(Window&, bool ignore_occlusion = false); 48 49 Menu* find_menu_by_id(int menu_id) 50 { 51 auto menu = m_menus.get(menu_id); 52 if (!menu.has_value()) 53 return nullptr; 54 return menu.value(); 55 } 56 Menu const* find_menu_by_id(int menu_id) const 57 { 58 auto menu = m_menus.get(menu_id); 59 if (!menu.has_value()) 60 return nullptr; 61 return menu.value(); 62 } 63 64 template<typename Callback> 65 void for_each_window(Callback callback) 66 { 67 for (auto& it : m_windows) { 68 if (callback(*it.value) == IterationDecision::Break) 69 break; 70 } 71 } 72 template<typename Callback> 73 void for_each_menu(Callback callback) 74 { 75 for (auto& it : m_menus) { 76 if (callback(*it.value) == IterationDecision::Break) 77 break; 78 } 79 } 80 81 void notify_display_link(Badge<Compositor>); 82 83 void notify_about_theme_change(); 84 85private: 86 explicit ConnectionFromClient(NonnullOwnPtr<Core::LocalSocket>, int client_id); 87 88 // ^ConnectionFromClient 89 virtual void die() override; 90 virtual void may_have_become_unresponsive() override; 91 virtual void did_become_responsive() override; 92 93 void set_unresponsive(bool); 94 void destroy_window(Window&, Vector<i32>& destroyed_window_ids); 95 96 virtual void create_menu(i32, DeprecatedString const&) override; 97 virtual void destroy_menu(i32) override; 98 virtual void add_menu(i32, i32) override; 99 virtual void add_menu_item(i32, i32, i32, DeprecatedString const&, bool, bool, bool, bool, bool, DeprecatedString const&, Gfx::ShareableBitmap const&, bool) override; 100 virtual void add_menu_separator(i32) override; 101 virtual void update_menu_item(i32, i32, i32, DeprecatedString const&, bool, bool, bool, bool, bool, DeprecatedString const&, Gfx::ShareableBitmap const&) override; 102 virtual void remove_menu_item(i32 menu_id, i32 identifier) override; 103 virtual void flash_menubar_menu(i32, i32) override; 104 virtual void create_window(i32, Gfx::IntRect const&, bool, bool, bool, 105 bool, bool, bool, bool, bool, float, float, Gfx::IntSize, Gfx::IntSize, Gfx::IntSize, 106 Optional<Gfx::IntSize> const&, i32, i32, DeprecatedString const&, i32, Gfx::IntRect const&) override; 107 virtual Messages::WindowServer::DestroyWindowResponse destroy_window(i32) override; 108 virtual void set_window_title(i32, DeprecatedString const&) override; 109 virtual Messages::WindowServer::GetWindowTitleResponse get_window_title(i32) override; 110 virtual Messages::WindowServer::IsMaximizedResponse is_maximized(i32) override; 111 virtual void set_maximized(i32, bool) override; 112 virtual Messages::WindowServer::IsMinimizedResponse is_minimized(i32) override; 113 virtual void set_minimized(i32, bool) override; 114 virtual void start_window_resize(i32, i32) override; 115 virtual Messages::WindowServer::SetWindowRectResponse set_window_rect(i32, Gfx::IntRect const&) override; 116 virtual Messages::WindowServer::GetWindowRectResponse get_window_rect(i32) override; 117 virtual void set_window_minimum_size(i32, Gfx::IntSize) override; 118 virtual Messages::WindowServer::GetWindowMinimumSizeResponse get_window_minimum_size(i32) override; 119 virtual Messages::WindowServer::GetAppletRectOnScreenResponse get_applet_rect_on_screen(i32) override; 120 virtual void invalidate_rect(i32, Vector<Gfx::IntRect> const&, bool) override; 121 virtual void did_finish_painting(i32, Vector<Gfx::IntRect> const&) override; 122 virtual void set_global_mouse_tracking(bool) override; 123 virtual void set_window_opacity(i32, float) override; 124 virtual void set_window_backing_store(i32, i32, i32, IPC::File const&, i32, bool, Gfx::IntSize, Gfx::IntSize, bool) override; 125 virtual void set_window_has_alpha_channel(i32, bool) override; 126 virtual void set_window_alpha_hit_threshold(i32, float) override; 127 virtual void move_window_to_front(i32) override; 128 virtual void set_fullscreen(i32, bool) override; 129 virtual void set_frameless(i32, bool) override; 130 virtual void set_forced_shadow(i32, bool) override; 131 virtual Messages::WindowServer::SetWallpaperResponse set_wallpaper(Gfx::ShareableBitmap const&) override; 132 virtual void set_background_color(DeprecatedString const&) override; 133 virtual void set_wallpaper_mode(DeprecatedString const&) override; 134 virtual Messages::WindowServer::GetWallpaperResponse get_wallpaper() override; 135 virtual Messages::WindowServer::SetScreenLayoutResponse set_screen_layout(ScreenLayout const&, bool) override; 136 virtual Messages::WindowServer::GetScreenLayoutResponse get_screen_layout() override; 137 virtual Messages::WindowServer::SaveScreenLayoutResponse save_screen_layout() override; 138 virtual Messages::WindowServer::ApplyWorkspaceSettingsResponse apply_workspace_settings(u32, u32, bool) override; 139 virtual Messages::WindowServer::GetWorkspaceSettingsResponse get_workspace_settings() override; 140 virtual void show_screen_numbers(bool) override; 141 virtual void set_window_cursor(i32, i32) override; 142 virtual void set_window_custom_cursor(i32, Gfx::ShareableBitmap const&) override; 143 virtual void popup_menu(i32, Gfx::IntPoint, Gfx::IntRect const&) override; 144 virtual void dismiss_menu(i32) override; 145 virtual void set_window_icon_bitmap(i32, Gfx::ShareableBitmap const&) override; 146 virtual Messages::WindowServer::StartDragResponse start_drag(DeprecatedString const&, HashMap<DeprecatedString, ByteBuffer> const&, Gfx::ShareableBitmap const&) override; 147 virtual void set_accepts_drag(bool) override; 148 virtual Messages::WindowServer::SetSystemThemeResponse set_system_theme(DeprecatedString const&, DeprecatedString const&, bool keep_desktop_background, Optional<DeprecatedString> const& color_scheme_path) override; 149 virtual Messages::WindowServer::GetSystemThemeResponse get_system_theme() override; 150 virtual Messages::WindowServer::SetSystemThemeOverrideResponse set_system_theme_override(Core::AnonymousBuffer const&) override; 151 virtual Messages::WindowServer::GetSystemThemeOverrideResponse get_system_theme_override() override; 152 virtual void clear_system_theme_override() override; 153 virtual Messages::WindowServer::IsSystemThemeOverriddenResponse is_system_theme_overridden() override; 154 virtual Messages::WindowServer::GetPreferredColorSchemeResponse get_preferred_color_scheme() override; 155 virtual void apply_cursor_theme(DeprecatedString const&) override; 156 virtual void set_cursor_highlight_radius(int radius) override; 157 virtual Messages::WindowServer::GetCursorHighlightRadiusResponse get_cursor_highlight_radius() override; 158 virtual void set_cursor_highlight_color(Gfx::Color color) override; 159 virtual Messages::WindowServer::GetCursorHighlightColorResponse get_cursor_highlight_color() override; 160 virtual Messages::WindowServer::GetCursorThemeResponse get_cursor_theme() override; 161 virtual Messages::WindowServer::SetSystemFontsResponse set_system_fonts(DeprecatedString const&, DeprecatedString const&, DeprecatedString const&) override; 162 virtual void set_system_effects(Vector<bool> const&, u8) override; 163 virtual void set_window_base_size_and_size_increment(i32, Gfx::IntSize, Gfx::IntSize) override; 164 virtual void set_window_resize_aspect_ratio(i32, Optional<Gfx::IntSize> const&) override; 165 virtual void enable_display_link() override; 166 virtual void disable_display_link() override; 167 virtual void set_window_progress(i32, Optional<i32> const&) override; 168 virtual void refresh_system_theme() override; 169 virtual void pong() override; 170 virtual void set_global_cursor_position(Gfx::IntPoint) override; 171 virtual Messages::WindowServer::GetGlobalCursorPositionResponse get_global_cursor_position() override; 172 virtual void set_mouse_acceleration(float) override; 173 virtual Messages::WindowServer::GetMouseAccelerationResponse get_mouse_acceleration() override; 174 virtual void set_scroll_step_size(u32) override; 175 virtual Messages::WindowServer::GetScrollStepSizeResponse get_scroll_step_size() override; 176 virtual Messages::WindowServer::GetScreenBitmapResponse get_screen_bitmap(Optional<Gfx::IntRect> const&, Optional<u32> const&) override; 177 virtual Messages::WindowServer::GetScreenBitmapAroundCursorResponse get_screen_bitmap_around_cursor(Gfx::IntSize) override; 178 virtual Messages::WindowServer::GetScreenBitmapAroundLocationResponse get_screen_bitmap_around_location(Gfx::IntSize, Gfx::IntPoint) override; 179 virtual void set_double_click_speed(i32) override; 180 virtual Messages::WindowServer::GetDoubleClickSpeedResponse get_double_click_speed() override; 181 virtual void set_mouse_buttons_switched(bool) override; 182 virtual Messages::WindowServer::AreMouseButtonsSwitchedResponse are_mouse_buttons_switched() override; 183 virtual void set_natural_scroll(bool) override; 184 virtual Messages::WindowServer::IsNaturalScrollResponse is_natural_scroll() override; 185 virtual void set_window_modified(i32, bool) override; 186 virtual Messages::WindowServer::IsWindowModifiedResponse is_window_modified(i32) override; 187 virtual Messages::WindowServer::GetDesktopDisplayScaleResponse get_desktop_display_scale(u32) override; 188 virtual void set_flash_flush(bool) override; 189 virtual void set_window_parent_from_client(i32, i32, i32) override; 190 virtual Messages::WindowServer::GetWindowRectFromClientResponse get_window_rect_from_client(i32, i32) override; 191 virtual void add_window_stealing_for_client(i32, i32) override; 192 virtual void remove_window_stealing_for_client(i32, i32) override; 193 virtual void remove_window_stealing(i32) override; 194 virtual void set_always_on_top(i32, bool) override; 195 virtual Messages::WindowServer::GetColorUnderCursorResponse get_color_under_cursor() override; 196 197 Window* window_from_id(i32 window_id); 198 199 HashMap<int, NonnullRefPtr<Window>> m_windows; 200 HashMap<int, NonnullRefPtr<Menu>> m_menus; 201 202 RefPtr<Core::Timer> m_flashed_menu_timer; 203 RefPtr<Core::Timer> m_ping_timer; 204 205 bool m_has_display_link { false }; 206 bool m_show_screen_number { false }; 207 bool m_unresponsive { false }; 208 bool m_does_global_mouse_tracking { false }; 209 210 // Need this to get private client connection stuff 211 friend WMConnectionFromClient; 212}; 213 214}