summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/core.c22
-rw-r--r--src/core/iconcache.c34
-rw-r--r--src/core/iconcache.h5
-rw-r--r--src/core/main.c4
-rw-r--r--src/include/core.h2
-rw-r--r--src/ui/ui.c9
6 files changed, 69 insertions, 7 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;
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));