mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 13:37:45 +00:00
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.
This commit is contained in:
parent
5d4c4bd372
commit
a807d92a32
4 changed files with 25 additions and 11 deletions
|
@ -85,14 +85,14 @@ Core::AnonymousBuffer load_system_theme(const String& path)
|
||||||
return metric;
|
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);
|
auto path = file->read_entry("Paths", name);
|
||||||
if (path.is_empty()) {
|
if (path.is_empty()) {
|
||||||
switch (role) {
|
switch (role) {
|
||||||
case (int)PathRole::TitleButtonIcons:
|
case (int)PathRole::TitleButtonIcons:
|
||||||
return "/res/icons/16x16/";
|
return "/res/icons/16x16/";
|
||||||
default:
|
default:
|
||||||
return "/res/";
|
return allow_empty ? "" : "/res/";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return &path[0];
|
return &path[0];
|
||||||
|
@ -111,17 +111,17 @@ Core::AnonymousBuffer load_system_theme(const String& path)
|
||||||
DO_METRIC(TitleButtonWidth);
|
DO_METRIC(TitleButtonWidth);
|
||||||
DO_METRIC(TitleButtonHeight);
|
DO_METRIC(TitleButtonHeight);
|
||||||
|
|
||||||
#define DO_PATH(x) \
|
#define DO_PATH(x, allow_empty) \
|
||||||
do { \
|
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]))); \
|
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'; \
|
data->path[(int)PathRole::x][sizeof(data->path[(int)PathRole::x]) - 1] = '\0'; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
DO_PATH(TitleButtonIcons);
|
DO_PATH(TitleButtonIcons, false);
|
||||||
DO_PATH(MenuShadow);
|
DO_PATH(MenuShadow, true);
|
||||||
DO_PATH(TooltipShadow);
|
DO_PATH(TooltipShadow, true);
|
||||||
DO_PATH(WindowShadow);
|
DO_PATH(WindowShadow, true);
|
||||||
|
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
|
@ -169,9 +169,20 @@ void WindowFrame::reload_config()
|
||||||
s_last_title_button_icons_scale = icons_scale;
|
s_last_title_button_icons_scale = icons_scale;
|
||||||
|
|
||||||
auto load_shadow = [](const String& path, String& last_path, Gfx::Bitmap*& shadow_bitmap) {
|
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();
|
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);
|
load_shadow(WindowManager::the().palette().window_shadow_path(), s_last_window_shadow_path, s_window_shadow);
|
||||||
|
|
|
@ -90,6 +90,10 @@ public:
|
||||||
void theme_changed()
|
void theme_changed()
|
||||||
{
|
{
|
||||||
m_dirty = m_shadow_dirty = true;
|
m_dirty = m_shadow_dirty = true;
|
||||||
|
m_top_bottom = nullptr;
|
||||||
|
m_left_right = nullptr;
|
||||||
|
m_bottom_y = m_right_x = 0;
|
||||||
|
|
||||||
layout_buttons();
|
layout_buttons();
|
||||||
set_button_icons();
|
set_button_icons();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1526,7 +1526,6 @@ void WindowManager::reload_icon_bitmaps_after_scale_change(bool allow_hidpi_icon
|
||||||
{
|
{
|
||||||
m_allow_hidpi_icons = allow_hidpi_icons;
|
m_allow_hidpi_icons = allow_hidpi_icons;
|
||||||
reload_config();
|
reload_config();
|
||||||
WindowFrame::reload_config();
|
|
||||||
for_each_window([&](Window& window) {
|
for_each_window([&](Window& window) {
|
||||||
auto& window_frame = window.frame();
|
auto& window_frame = window.frame();
|
||||||
window_frame.theme_changed();
|
window_frame.theme_changed();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue