From 54d6dd4cd27c97c3560c3ff2eb66fcfbbe5a51c0 Mon Sep 17 00:00:00 2001 From: osch Date: Fri, 12 Apr 2019 23:48:52 +0200 Subject: reload icons if icon size preference changed --- src/core/core.c | 22 ++++++++++++++++++++++ src/core/iconcache.c | 34 ++++++++++++++++++++++++++++++---- src/core/iconcache.h | 5 +++++ src/core/main.c | 4 ++++ src/include/core.h | 2 ++ src/ui/ui.c | 9 ++++++--- 6 files changed, 69 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/core/core.c b/src/core/core.c index 535a3820..0e98959f 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -812,3 +812,25 @@ meta_invalidate_default_icons (void) g_slist_free (windows); } +void +meta_invalidate_all_icons (void) +{ + MetaDisplay *display = meta_get_display (); + GSList *windows; + GSList *l; + + if (display == NULL) + return; /* We can validly be called before the display is opened. */ + + windows = meta_display_list_windows (display); + for (l = windows; l != NULL; l = l->next) + { + MetaWindow *window = (MetaWindow*)l->data; + + meta_icon_cache_invalidate (&(window->icon_cache)); + meta_window_update_icon_now (window); + } + + g_slist_free (windows); +} + diff --git a/src/core/iconcache.c b/src/core/iconcache.c index d3b5c67b..3c0f1b8d 100644 --- a/src/core/iconcache.c +++ b/src/core/iconcache.c @@ -523,6 +523,10 @@ meta_icon_cache_init (MetaIconCache *icon_cache) icon_cache->wm_hints_dirty = TRUE; icon_cache->kwm_win_icon_dirty = TRUE; icon_cache->net_wm_icon_dirty = TRUE; + + icon_cache->wm_hints_dirty_forced = FALSE; + icon_cache->kwm_win_icon_dirty_forced = FALSE; + icon_cache->fallback_icon_dirty_forced = FALSE; } static void @@ -555,6 +559,18 @@ meta_icon_cache_free (MetaIconCache *icon_cache) clear_icon_cache (icon_cache, FALSE); } +void +meta_icon_cache_invalidate (MetaIconCache *icon_cache) +{ + icon_cache->wm_hints_dirty = TRUE; + icon_cache->kwm_win_icon_dirty = TRUE; + icon_cache->net_wm_icon_dirty = TRUE; + + icon_cache->wm_hints_dirty_forced = TRUE; + icon_cache->kwm_win_icon_dirty_forced = TRUE; + icon_cache->fallback_icon_dirty_forced = TRUE; +} + void meta_icon_cache_property_changed (MetaIconCache *icon_cache, MetaDisplay *display, @@ -773,9 +789,12 @@ meta_read_icons (MetaScreen *screen, * hints change */ if ((pixmap != icon_cache->prev_pixmap || - mask != icon_cache->prev_mask) && + mask != icon_cache->prev_mask || + icon_cache->wm_hints_dirty_forced) && pixmap != None) { + icon_cache->wm_hints_dirty_forced = FALSE; + if (try_pixmap_and_mask (screen->display, pixmap, mask, iconp, ideal_width, ideal_height, @@ -800,9 +819,12 @@ meta_read_icons (MetaScreen *screen, get_kwm_win_icon (screen->display, xwindow, &pixmap, &mask); if ((pixmap != icon_cache->prev_pixmap || - mask != icon_cache->prev_mask) && + mask != icon_cache->prev_mask || + icon_cache->kwm_win_icon_dirty_forced) && pixmap != None) { + icon_cache->kwm_win_icon_dirty_forced = FALSE; + if (try_pixmap_and_mask (screen->display, pixmap, mask, iconp, ideal_width, ideal_height, mini_iconp, ideal_mini_width, ideal_mini_height)) @@ -818,9 +840,13 @@ meta_read_icons (MetaScreen *screen, } } - if (icon_cache->want_fallback && - icon_cache->origin < USING_FALLBACK_ICON) + if ((icon_cache->want_fallback && + icon_cache->origin < USING_FALLBACK_ICON) + || (icon_cache->fallback_icon_dirty_forced && + icon_cache->origin == USING_FALLBACK_ICON)) { + icon_cache->fallback_icon_dirty_forced = FALSE; + get_fallback_icons (screen, iconp, ideal_width, diff --git a/src/core/iconcache.h b/src/core/iconcache.h index adb15d9b..4614da02 100644 --- a/src/core/iconcache.h +++ b/src/core/iconcache.h @@ -51,10 +51,15 @@ struct _MetaIconCache guint wm_hints_dirty : 1; guint kwm_win_icon_dirty : 1; guint net_wm_icon_dirty : 1; + + guint wm_hints_dirty_forced : 1; + guint kwm_win_icon_dirty_forced : 1; + guint fallback_icon_dirty_forced : 1; }; void meta_icon_cache_init (MetaIconCache *icon_cache); void meta_icon_cache_free (MetaIconCache *icon_cache); +void meta_icon_cache_invalidate (MetaIconCache *icon_cache); void meta_icon_cache_property_changed (MetaIconCache *icon_cache, MetaDisplay *display, Atom atom); diff --git a/src/core/main.c b/src/core/main.c index 6f6170d6..72542bff 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -52,6 +52,7 @@ #include "ui.h" #include "session.h" #include "prefs.h" +#include "core.h" #include #include @@ -659,6 +660,9 @@ prefs_changed_callback (MetaPreference pref, meta_display_set_cursor_theme (meta_prefs_get_cursor_theme (), meta_prefs_get_cursor_size ()); break; + case META_PREF_ICON_SIZE: + meta_invalidate_all_icons(); + break; default: /* handled elsewhere or otherwise */ break; diff --git a/src/include/core.h b/src/include/core.h index faf792ed..c95d0fce 100644 --- a/src/include/core.h +++ b/src/include/core.h @@ -205,6 +205,8 @@ void meta_core_increment_event_serial (Display *display); void meta_invalidate_default_icons (void); +void meta_invalidate_all_icons (void); + #endif diff --git a/src/ui/ui.c b/src/ui/ui.c index 7b5bcdfc..f44b68cf 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -586,13 +586,16 @@ GdkPixbuf* meta_ui_get_default_window_icon (MetaUI *ui) { static GdkPixbuf *default_icon = NULL; - int scale; + static int icon_size = 0; + int current_icon_size = meta_prefs_get_icon_size(); - if (default_icon == NULL) + int scale; + if (default_icon == NULL || current_icon_size != icon_size) { scale = gtk_widget_get_scale_factor (GTK_WIDGET (ui->frames)); - default_icon = load_default_window_icon (meta_prefs_get_icon_size(), scale); + default_icon = load_default_window_icon (current_icon_size, scale); g_assert (default_icon); + icon_size = current_icon_size; } g_object_ref (G_OBJECT (default_icon)); -- cgit v1.2.1