diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/core.c | 22 | ||||
-rw-r--r-- | src/core/iconcache.c | 34 | ||||
-rw-r--r-- | src/core/iconcache.h | 5 | ||||
-rw-r--r-- | src/core/main.c | 4 |
4 files changed, 61 insertions, 4 deletions
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 @@ -556,6 +560,18 @@ meta_icon_cache_free (MetaIconCache *icon_cache) } 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, Atom atom) @@ -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 <glib-object.h> #include <glib/gprintf.h> @@ -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; |