From 14fe7283e1146cfdedf181c89db7acc9925021e5 Mon Sep 17 00:00:00 2001 From: Tom Date: Sat, 19 Jun 2021 12:21:01 -0600 Subject: [PATCH] WindowServer: Update compositor reference to cursor on reload When we reload a cursor we should make sure the compositor has a valid reference to the updated cursor. --- Userland/Services/WindowServer/Compositor.h | 2 + .../Services/WindowServer/WindowManager.cpp | 41 +++++++++++-------- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/Userland/Services/WindowServer/Compositor.h b/Userland/Services/WindowServer/Compositor.h index 4040c972aa..357aa56944 100644 --- a/Userland/Services/WindowServer/Compositor.h +++ b/Userland/Services/WindowServer/Compositor.h @@ -48,6 +48,8 @@ public: void invalidate_cursor(bool = false); Gfx::IntRect current_cursor_rect() const; + const Cursor* current_cursor() const { return m_current_cursor; } + void current_cursor_was_reloaded(const Cursor* new_cursor) { m_current_cursor = new_cursor; } void increment_display_link_count(Badge); void decrement_display_link_count(Badge); diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp index 97638fd2d8..274ed411c0 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -59,22 +59,31 @@ void WindowManager::reload_config() m_config = Core::ConfigFile::open("/etc/WindowServer.ini"); m_double_click_speed = m_config->read_num_entry("Input", "DoubleClickSpeed", 250); - m_hidden_cursor = get_cursor("Hidden"); - m_arrow_cursor = get_cursor("Arrow"); - m_hand_cursor = get_cursor("Hand"); - m_help_cursor = get_cursor("Help"); - m_resize_horizontally_cursor = get_cursor("ResizeH"); - m_resize_vertically_cursor = get_cursor("ResizeV"); - m_resize_diagonally_tlbr_cursor = get_cursor("ResizeDTLBR"); - m_resize_diagonally_bltr_cursor = get_cursor("ResizeDBLTR"); - m_resize_column_cursor = get_cursor("ResizeColumn"); - m_resize_row_cursor = get_cursor("ResizeRow"); - m_i_beam_cursor = get_cursor("IBeam"); - m_disallowed_cursor = get_cursor("Disallowed"); - m_move_cursor = get_cursor("Move"); - m_drag_cursor = get_cursor("Drag"); - m_wait_cursor = get_cursor("Wait"); - m_crosshair_cursor = get_cursor("Crosshair"); + + auto* current_cursor = Compositor::the().current_cursor(); + auto reload_cursor = [&](RefPtr& cursor, const String& name) { + bool is_current_cursor = current_cursor && current_cursor == cursor.ptr(); + cursor = get_cursor(name); + if (is_current_cursor) + Compositor::the().current_cursor_was_reloaded(cursor.ptr()); + }; + + reload_cursor(m_hidden_cursor, "Hidden"); + reload_cursor(m_arrow_cursor, "Arrow"); + reload_cursor(m_hand_cursor, "Hand"); + reload_cursor(m_help_cursor, "Help"); + reload_cursor(m_resize_horizontally_cursor, "ResizeH"); + reload_cursor(m_resize_vertically_cursor, "ResizeV"); + reload_cursor(m_resize_diagonally_tlbr_cursor, "ResizeDTLBR"); + reload_cursor(m_resize_diagonally_bltr_cursor, "ResizeDBLTR"); + reload_cursor(m_resize_column_cursor, "ResizeColumn"); + reload_cursor(m_resize_row_cursor, "ResizeRow"); + reload_cursor(m_i_beam_cursor, "IBeam"); + reload_cursor(m_disallowed_cursor, "Disallowed"); + reload_cursor(m_move_cursor, "Move"); + reload_cursor(m_drag_cursor, "Drag"); + reload_cursor(m_wait_cursor, "Wait"); + reload_cursor(m_crosshair_cursor, "Crosshair"); WindowFrame::reload_config(); }