[libwnck/wip/muktupavels/icons: 8/11] icon-cache: cache only one size
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libwnck/wip/muktupavels/icons: 8/11] icon-cache: cache only one size
- Date: Thu, 17 Feb 2022 14:03:48 +0000 (UTC)
commit 654000964d3f900c0d9c16b443d05e7d2131f4fa
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date: Sun Dec 19 23:46:16 2021 +0200
icon-cache: cache only one size
Create icon cache for each size - mini and normal.
This will allow in future commits to load only icon size that is
actually used by someone.
libwnck/application.c | 39 ++++++++++------
libwnck/class-group.c | 6 +--
libwnck/tasklist.c | 3 +-
libwnck/window.c | 43 +++++++++++------
libwnck/wnck-icon-cache-private.h | 6 +--
libwnck/wnck-icon-cache.c | 98 +++++++--------------------------------
libwnck/xutils.c | 9 +---
libwnck/xutils.h | 6 +--
8 files changed, 81 insertions(+), 129 deletions(-)
---
diff --git a/libwnck/application.c b/libwnck/application.c
index 174ad241..deea5b94 100644
--- a/libwnck/application.c
+++ b/libwnck/application.c
@@ -66,6 +66,7 @@ struct _WnckApplicationPrivate
GdkPixbuf *mini_icon;
WnckIconCache *icon_cache;
+ WnckIconCache *mini_icon_cache;
WnckWindow *icon_window;
@@ -101,6 +102,9 @@ wnck_application_init (WnckApplication *application)
application->priv->icon_cache = _wnck_icon_cache_new ();
_wnck_icon_cache_set_want_fallback (application->priv->icon_cache, FALSE);
+
+ application->priv->mini_icon_cache = _wnck_icon_cache_new ();
+ _wnck_icon_cache_set_want_fallback (application->priv->mini_icon_cache, FALSE);
}
static void
@@ -170,6 +174,9 @@ wnck_application_finalize (GObject *object)
_wnck_icon_cache_free (application->priv->icon_cache);
application->priv->icon_cache = NULL;
+ _wnck_icon_cache_free (application->priv->mini_icon_cache);
+ application->priv->mini_icon_cache = NULL;
+
g_free (application->priv->startup_id);
application->priv->startup_id = NULL;
@@ -315,31 +322,35 @@ get_icons (WnckApplication *app)
{
GdkPixbuf *icon;
GdkPixbuf *mini_icon;
- gsize normal_size;
- gsize mini_size;
icon = NULL;
mini_icon = NULL;
- normal_size = _wnck_get_default_icon_size ();
- mini_size = _wnck_get_default_mini_icon_size ();
-
- if (_wnck_read_icons (app->priv->screen,
- app->priv->xwindow,
- app->priv->icon_cache,
- &icon,
- normal_size,
- &mini_icon,
- mini_size))
+
+ if (_wnck_read_icon (app->priv->screen,
+ app->priv->xwindow,
+ app->priv->icon_cache,
+ &icon,
+ _wnck_get_default_icon_size ()))
{
app->priv->need_emit_icon_changed = TRUE;
if (app->priv->icon)
g_object_unref (G_OBJECT (app->priv->icon));
+ app->priv->icon = icon;
+ }
+
+ if (_wnck_read_icon (app->priv->screen,
+ app->priv->xwindow,
+ app->priv->mini_icon_cache,
+ &mini_icon,
+ _wnck_get_default_mini_icon_size ()))
+ {
+ app->priv->need_emit_icon_changed = TRUE;
+
if (app->priv->mini_icon)
g_object_unref (G_OBJECT (app->priv->mini_icon));
- app->priv->icon = icon;
app->priv->mini_icon = mini_icon;
}
@@ -653,6 +664,8 @@ _wnck_application_process_property_notify (WnckApplication *app,
{
_wnck_icon_cache_property_changed (app->priv->icon_cache,
xevent->xproperty.atom);
+ _wnck_icon_cache_property_changed (app->priv->mini_icon_cache,
+ xevent->xproperty.atom);
emit_icon_changed (app);
}
else if (xevent->xproperty.atom ==
diff --git a/libwnck/class-group.c b/libwnck/class-group.c
index 2d4f8a34..0f32f709 100644
--- a/libwnck/class-group.c
+++ b/libwnck/class-group.c
@@ -444,10 +444,8 @@ set_icon (WnckClassGroup *class_group)
if (!icon || !mini_icon)
{
- _wnck_get_fallback_icons (&icon,
- _wnck_get_default_icon_size (),
- &mini_icon,
- _wnck_get_default_mini_icon_size ());
+ _wnck_get_fallback_icon (&icon, _wnck_get_default_icon_size ());
+ _wnck_get_fallback_icon (&mini_icon, _wnck_get_default_mini_icon_size ());
icons_reffed = TRUE;
}
diff --git a/libwnck/tasklist.c b/libwnck/tasklist.c
index 8791b103..c12527e8 100644
--- a/libwnck/tasklist.c
+++ b/libwnck/tasklist.c
@@ -3709,8 +3709,7 @@ wnck_task_get_icon (WnckTask *task)
if (pixbuf == NULL)
{
- _wnck_get_fallback_icons (NULL, 0,
- &pixbuf, MINI_ICON_SIZE);
+ _wnck_get_fallback_icon (&pixbuf, MINI_ICON_SIZE);
}
#endif
break;
diff --git a/libwnck/window.c b/libwnck/window.c
index 8f6c8b77..cd7f6101 100644
--- a/libwnck/window.c
+++ b/libwnck/window.c
@@ -91,6 +91,7 @@ struct _WnckWindowPrivate
GdkPixbuf *mini_icon;
WnckIconCache *icon_cache;
+ WnckIconCache *mini_icon_cache;
WnckWindowActions actions;
@@ -223,6 +224,7 @@ wnck_window_init (WnckWindow *window)
window->priv = wnck_window_get_instance_private (window);
window->priv->icon_cache = _wnck_icon_cache_new ();
+ window->priv->mini_icon_cache = _wnck_icon_cache_new ();
window->priv->icon_geometry.width = -1; /* invalid cached value */
window->priv->workspace = -1;
window->priv->sort_order = G_MAXINT;
@@ -422,6 +424,9 @@ wnck_window_finalize (GObject *object)
_wnck_icon_cache_free (window->priv->icon_cache);
window->priv->icon_cache = NULL;
+ _wnck_icon_cache_free (window->priv->mini_icon_cache);
+ window->priv->mini_icon_cache = NULL;
+
g_free (window->priv->startup_id);
window->priv->startup_id = NULL;
g_free (window->priv->res_class);
@@ -2105,31 +2110,35 @@ get_icons (WnckWindow *window)
{
GdkPixbuf *icon;
GdkPixbuf *mini_icon;
- gsize normal_size;
- gsize mini_size;
icon = NULL;
mini_icon = NULL;
- normal_size = _wnck_get_default_icon_size ();
- mini_size = _wnck_get_default_mini_icon_size ();
- if (_wnck_read_icons (window->priv->screen,
- window->priv->xwindow,
- window->priv->icon_cache,
- &icon,
- normal_size,
- &mini_icon,
- mini_size))
+ if (_wnck_read_icon (window->priv->screen,
+ window->priv->xwindow,
+ window->priv->icon_cache,
+ &icon,
+ _wnck_get_default_icon_size ()))
{
window->priv->need_emit_icon_changed = TRUE;
if (window->priv->icon)
g_object_unref (G_OBJECT (window->priv->icon));
+ window->priv->icon = icon;
+ }
+
+ if (_wnck_read_icon (window->priv->screen,
+ window->priv->xwindow,
+ window->priv->mini_icon_cache,
+ &mini_icon,
+ _wnck_get_default_mini_icon_size ()))
+ {
+ window->priv->need_emit_icon_changed = TRUE;
+
if (window->priv->mini_icon)
g_object_unref (G_OBJECT (window->priv->mini_icon));
- window->priv->icon = icon;
window->priv->mini_icon = mini_icon;
}
@@ -2601,6 +2610,8 @@ _wnck_window_process_property_notify (WnckWindow *window,
{
_wnck_icon_cache_property_changed (window->priv->icon_cache,
xevent->xproperty.atom);
+ _wnck_icon_cache_property_changed (window->priv->mini_icon_cache,
+ xevent->xproperty.atom);
queue_update (window);
}
else if (xevent->xproperty.atom ==
@@ -3167,8 +3178,12 @@ update_wmhints (WnckWindow *window)
{
if ((hints->flags & IconPixmapHint) ||
(hints->flags & IconMaskHint))
- _wnck_icon_cache_property_changed (window->priv->icon_cache,
- _wnck_atom_get ("WM_HINTS"));
+ {
+ _wnck_icon_cache_property_changed (window->priv->icon_cache,
+ _wnck_atom_get ("WM_HINTS"));
+ _wnck_icon_cache_property_changed (window->priv->mini_icon_cache,
+ _wnck_atom_get ("WM_HINTS"));
+ }
if (hints->flags & WindowGroupHint)
window->priv->group_leader = hints->window_group;
diff --git a/libwnck/wnck-icon-cache-private.h b/libwnck/wnck-icon-cache-private.h
index 6a3d5ecb..50a72c9f 100644
--- a/libwnck/wnck-icon-cache-private.h
+++ b/libwnck/wnck-icon-cache-private.h
@@ -38,13 +38,11 @@ void _wnck_icon_cache_set_want_fallback (WnckIconCache *icon_cache
gboolean setting);
gboolean _wnck_icon_cache_get_is_fallback (WnckIconCache *icon_cache);
-gboolean _wnck_read_icons (WnckScreen *screen,
+gboolean _wnck_read_icon (WnckScreen *screen,
Window xwindow,
WnckIconCache *icon_cache,
GdkPixbuf **iconp,
- int ideal_size,
- GdkPixbuf **mini_iconp,
- int ideal_mini_size);
+ int ideal_size);
G_END_DECLS
diff --git a/libwnck/wnck-icon-cache.c b/libwnck/wnck-icon-cache.c
index 17495853..014d194b 100644
--- a/libwnck/wnck-icon-cache.c
+++ b/libwnck/wnck-icon-cache.c
@@ -46,9 +46,7 @@ struct _WnckIconCache
Pixmap prev_pixmap;
Pixmap prev_mask;
GdkPixbuf *icon;
- GdkPixbuf *mini_icon;
int ideal_size;
- int ideal_mini_size;
guint want_fallback : 1;
/* TRUE if these props have changed */
guint wm_hints_dirty : 1;
@@ -177,13 +175,9 @@ static gboolean
read_rgb_icon (Screen *screen,
Window xwindow,
int ideal_size,
- int ideal_mini_size,
int *width,
int *height,
- guchar **pixdata,
- int *mini_width,
- int *mini_height,
- guchar **mini_pixdata)
+ guchar **pixdata)
{
Display *display;
Atom type;
@@ -194,8 +188,6 @@ read_rgb_icon (Screen *screen,
gulong *data;
gulong *best;
int w, h;
- gulong *best_mini;
- int mini_w, mini_h;
display = DisplayOfScreen (screen);
@@ -227,22 +219,10 @@ read_rgb_icon (Screen *screen,
return FALSE;
}
- if (!find_best_size (data, nitems,
- ideal_mini_size,
- &mini_w, &mini_h, &best_mini))
- {
- XFree (data);
- return FALSE;
- }
-
*width = w;
*height = h;
- *mini_width = mini_w;
- *mini_height = mini_h;
-
argbdata_to_pixdata (best, w * h, pixdata);
- argbdata_to_pixdata (best_mini, mini_w * mini_h, mini_pixdata);
XFree (data);
@@ -254,9 +234,7 @@ try_pixmap_and_mask (Screen *screen,
Pixmap src_pixmap,
Pixmap src_mask,
GdkPixbuf **iconp,
- int ideal_size,
- GdkPixbuf **mini_iconp,
- int ideal_mini_size)
+ int ideal_size)
{
cairo_surface_t *surface, *mask_surface, *image;
GdkDisplay *gdk_display;
@@ -339,11 +317,6 @@ try_pixmap_and_mask (Screen *screen,
ideal_size,
ideal_size,
GDK_INTERP_BILINEAR);
- *mini_iconp =
- gdk_pixbuf_scale_simple (unscaled,
- ideal_mini_size,
- ideal_mini_size,
- GDK_INTERP_BILINEAR);
g_object_unref (G_OBJECT (unscaled));
return TRUE;
@@ -408,10 +381,6 @@ clear_icon_cache (WnckIconCache *icon_cache,
g_object_unref (G_OBJECT (icon_cache->icon));
icon_cache->icon = NULL;
- if (icon_cache->mini_icon)
- g_object_unref (G_OBJECT (icon_cache->mini_icon));
- icon_cache->mini_icon = NULL;
-
icon_cache->origin = USING_NO_ICON;
if (dirty_all)
@@ -425,8 +394,7 @@ clear_icon_cache (WnckIconCache *icon_cache,
static void
replace_cache (WnckIconCache *icon_cache,
IconOrigin origin,
- GdkPixbuf *new_icon,
- GdkPixbuf *new_mini_icon)
+ GdkPixbuf *new_icon)
{
clear_icon_cache (icon_cache, FALSE);
@@ -436,11 +404,6 @@ replace_cache (WnckIconCache *icon_cache,
g_object_ref (G_OBJECT (new_icon));
icon_cache->icon = new_icon;
-
- if (new_mini_icon)
- g_object_ref (G_OBJECT (new_mini_icon));
-
- icon_cache->mini_icon = new_mini_icon;
}
static void
@@ -516,9 +479,7 @@ _wnck_icon_cache_new (void)
icon_cache->origin = USING_NO_ICON;
icon_cache->prev_pixmap = None;
icon_cache->icon = NULL;
- icon_cache->mini_icon = NULL;
icon_cache->ideal_size = -1; /* won't be a legit size */
- icon_cache->ideal_mini_size = -1;
icon_cache->want_fallback = TRUE;
icon_cache->wm_hints_dirty = TRUE;
icon_cache->kwm_win_icon_dirty = TRUE;
@@ -585,20 +546,16 @@ _wnck_icon_cache_get_is_fallback (WnckIconCache *icon_cache)
}
gboolean
-_wnck_read_icons (WnckScreen *screen,
- Window xwindow,
- WnckIconCache *icon_cache,
- GdkPixbuf **iconp,
- int ideal_size,
- GdkPixbuf **mini_iconp,
- int ideal_mini_size)
+_wnck_read_icon (WnckScreen *screen,
+ Window xwindow,
+ WnckIconCache *icon_cache,
+ GdkPixbuf **iconp,
+ int ideal_size)
{
Screen *xscreen;
Display *display;
guchar *pixdata;
int w, h;
- guchar *mini_pixdata;
- int mini_w, mini_h;
Pixmap pixmap;
Pixmap mask;
XWMHints *hints;
@@ -611,14 +568,11 @@ _wnck_read_icons (WnckScreen *screen,
display = DisplayOfScreen (xscreen);
*iconp = NULL;
- *mini_iconp = NULL;
- if (ideal_size != icon_cache->ideal_size ||
- ideal_mini_size != icon_cache->ideal_mini_size)
+ if (ideal_size != icon_cache->ideal_size)
clear_icon_cache (icon_cache, TRUE);
icon_cache->ideal_size = ideal_size;
- icon_cache->ideal_mini_size = ideal_mini_size;
if (!_wnck_icon_cache_get_icon_invalidated (icon_cache))
return FALSE; /* we have no new info to use */
@@ -640,19 +594,11 @@ _wnck_read_icons (WnckScreen *screen,
{
icon_cache->net_wm_icon_dirty = FALSE;
- if (read_rgb_icon (xscreen, xwindow,
- ideal_size,
- ideal_mini_size,
- &w, &h, &pixdata,
- &mini_w, &mini_h, &mini_pixdata))
+ if (read_rgb_icon (xscreen, xwindow, ideal_size, &w, &h, &pixdata))
{
*iconp = scaled_from_pixdata (pixdata, w, h, ideal_size, ideal_size);
- *mini_iconp = scaled_from_pixdata (mini_pixdata, mini_w, mini_h,
- ideal_mini_size, ideal_mini_size);
-
- replace_cache (icon_cache, USING_NET_WM_ICON,
- *iconp, *mini_iconp);
+ replace_cache (icon_cache, USING_NET_WM_ICON, *iconp);
return TRUE;
}
@@ -687,15 +633,12 @@ _wnck_read_icons (WnckScreen *screen,
mask != icon_cache->prev_mask) &&
pixmap != None)
{
- if (try_pixmap_and_mask (xscreen, pixmap, mask,
- iconp, ideal_size,
- mini_iconp, ideal_mini_size))
+ if (try_pixmap_and_mask (xscreen, pixmap, mask, iconp, ideal_size))
{
icon_cache->prev_pixmap = pixmap;
icon_cache->prev_mask = mask;
- replace_cache (icon_cache, USING_WM_HINTS,
- *iconp, *mini_iconp);
+ replace_cache (icon_cache, USING_WM_HINTS, *iconp);
return TRUE;
}
@@ -713,15 +656,12 @@ _wnck_read_icons (WnckScreen *screen,
mask != icon_cache->prev_mask) &&
pixmap != None)
{
- if (try_pixmap_and_mask (xscreen, pixmap, mask,
- iconp, ideal_size,
- mini_iconp, ideal_mini_size))
+ if (try_pixmap_and_mask (xscreen, pixmap, mask, iconp, ideal_size))
{
icon_cache->prev_pixmap = pixmap;
icon_cache->prev_mask = mask;
- replace_cache (icon_cache, USING_KWM_WIN_ICON,
- *iconp, *mini_iconp);
+ replace_cache (icon_cache, USING_KWM_WIN_ICON, *iconp);
return TRUE;
}
@@ -731,13 +671,9 @@ _wnck_read_icons (WnckScreen *screen,
if (icon_cache->want_fallback &&
icon_cache->origin < USING_FALLBACK_ICON)
{
- _wnck_get_fallback_icons (iconp,
- ideal_size,
- mini_iconp,
- ideal_mini_size);
+ _wnck_get_fallback_icon (iconp, ideal_size);
- replace_cache (icon_cache, USING_FALLBACK_ICON,
- *iconp, *mini_iconp);
+ replace_cache (icon_cache, USING_FALLBACK_ICON, *iconp);
return TRUE;
}
diff --git a/libwnck/xutils.c b/libwnck/xutils.c
index 08e6325a..532b51a1 100644
--- a/libwnck/xutils.c
+++ b/libwnck/xutils.c
@@ -1461,16 +1461,11 @@ default_icon_at_size (int size)
}
void
-_wnck_get_fallback_icons (GdkPixbuf **iconp,
- int ideal_size,
- GdkPixbuf **mini_iconp,
- int ideal_mini_size)
+_wnck_get_fallback_icon (GdkPixbuf **iconp,
+ int ideal_size)
{
if (iconp)
*iconp = default_icon_at_size (ideal_size);
-
- if (mini_iconp)
- *mini_iconp = default_icon_at_size (ideal_mini_size);
}
void
diff --git a/libwnck/xutils.h b/libwnck/xutils.h
index 4e5c6204..7b26c920 100644
--- a/libwnck/xutils.h
+++ b/libwnck/xutils.h
@@ -156,10 +156,8 @@ void _wnck_keyboard_size (WnckScreen *screen,
void _wnck_toggle_showing_desktop (Screen *screen,
gboolean show);
-void _wnck_get_fallback_icons (GdkPixbuf **iconp,
- int ideal_size,
- GdkPixbuf **mini_iconp,
- int ideal_mini_size);
+void _wnck_get_fallback_icon (GdkPixbuf **iconp,
+ int ideal_size);
void _wnck_get_window_geometry (Screen *screen,
Window xwindow,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]