Browse Source

WindowServer: Fix switching between shadows and no shadows with themes

We weren't properly handling switching between having a shadow and
not having a shadow when switching themes. This allows an empty string
in the theme configuration for a shadow path, meaning no shadow should
be rendered.
Tom 4 years ago
parent
commit
a807d92a32

+ 8 - 8
Userland/Libraries/LibGfx/SystemTheme.cpp

@@ -85,14 +85,14 @@ Core::AnonymousBuffer load_system_theme(const String& path)
         return metric;
     };
 
-    auto get_path = [&](auto& name, auto role) {
+    auto get_path = [&](auto& name, auto role, bool allow_empty) {
         auto path = file->read_entry("Paths", name);
         if (path.is_empty()) {
             switch (role) {
             case (int)PathRole::TitleButtonIcons:
                 return "/res/icons/16x16/";
             default:
-                return "/res/";
+                return allow_empty ? "" : "/res/";
             }
         }
         return &path[0];
@@ -111,17 +111,17 @@ Core::AnonymousBuffer load_system_theme(const String& path)
     DO_METRIC(TitleButtonWidth);
     DO_METRIC(TitleButtonHeight);
 
-#define DO_PATH(x)                                                                                               \
+#define DO_PATH(x, allow_empty)                                                                                  \
     do {                                                                                                         \
-        auto path = get_path(#x, (int)PathRole::x);                                                              \
+        auto path = get_path(#x, (int)PathRole::x, allow_empty);                                                 \
         memcpy(data->path[(int)PathRole::x], path, min(strlen(path) + 1, sizeof(data->path[(int)PathRole::x]))); \
         data->path[(int)PathRole::x][sizeof(data->path[(int)PathRole::x]) - 1] = '\0';                           \
     } while (0)
 
-    DO_PATH(TitleButtonIcons);
-    DO_PATH(MenuShadow);
-    DO_PATH(TooltipShadow);
-    DO_PATH(WindowShadow);
+    DO_PATH(TitleButtonIcons, false);
+    DO_PATH(MenuShadow, true);
+    DO_PATH(TooltipShadow, true);
+    DO_PATH(WindowShadow, true);
 
     return buffer;
 }

+ 13 - 2
Userland/Services/WindowServer/WindowFrame.cpp

@@ -169,9 +169,20 @@ void WindowFrame::reload_config()
     s_last_title_button_icons_scale = icons_scale;
 
     auto load_shadow = [](const String& path, String& last_path, Gfx::Bitmap*& shadow_bitmap) {
-        if (!shadow_bitmap || shadow_bitmap->scale() != s_last_title_button_icons_scale || last_path != path) {
+        if (path.is_empty()) {
+            last_path = String::empty();
+            if (shadow_bitmap) {
+                shadow_bitmap->unref();
+                shadow_bitmap = nullptr;
+            }
+        } else if (!shadow_bitmap || shadow_bitmap->scale() != s_last_title_button_icons_scale || last_path != path) {
+            if (shadow_bitmap)
+                shadow_bitmap->unref();
             shadow_bitmap = Gfx::Bitmap::load_from_file(path, s_last_title_button_icons_scale).leak_ref();
-            last_path = path;
+            if (shadow_bitmap)
+                last_path = path;
+            else
+                last_path = String::empty();
         }
     };
     load_shadow(WindowManager::the().palette().window_shadow_path(), s_last_window_shadow_path, s_window_shadow);

+ 4 - 0
Userland/Services/WindowServer/WindowFrame.h

@@ -90,6 +90,10 @@ public:
     void theme_changed()
     {
         m_dirty = m_shadow_dirty = true;
+        m_top_bottom = nullptr;
+        m_left_right = nullptr;
+        m_bottom_y = m_right_x = 0;
+
         layout_buttons();
         set_button_icons();
     }

+ 0 - 1
Userland/Services/WindowServer/WindowManager.cpp

@@ -1526,7 +1526,6 @@ void WindowManager::reload_icon_bitmaps_after_scale_change(bool allow_hidpi_icon
 {
     m_allow_hidpi_icons = allow_hidpi_icons;
     reload_config();
-    WindowFrame::reload_config();
     for_each_window([&](Window& window) {
         auto& window_frame = window.frame();
         window_frame.theme_changed();