[libwnck/wip/muktupavels/icons: 23/24] application: get icons in getters




commit 58f811724572bed39ea58f978acc063e25b722d1
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sun Dec 19 22:16:20 2021 +0200

    application: get icons in getters
    
    libwnck users might not use icons at all or might use only normal
    or mini icon. Redo code to get icons only when getters are used.

 libwnck/application.c | 98 +++++++++++++++++++++------------------------------
 libwnck/private.h     |  2 +-
 libwnck/util.c        |  2 +-
 3 files changed, 43 insertions(+), 59 deletions(-)
---
diff --git a/libwnck/application.c b/libwnck/application.c
index 6e4c3651..ad3755ac 100644
--- a/libwnck/application.c
+++ b/libwnck/application.c
@@ -73,8 +73,6 @@ struct _WnckApplicationPrivate
   char *startup_id;
 
   guint name_from_leader : 1; /* name is from group leader */
-
-  guint need_emit_icon_changed : 1;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (WnckApplication, wnck_application, G_TYPE_OBJECT);
@@ -86,7 +84,6 @@ enum {
 };
 
 static void emit_name_changed (WnckApplication *app);
-static void emit_icon_changed (WnckApplication *app);
 
 static void reset_name  (WnckApplication *app);
 static void update_name (WnckApplication *app);
@@ -318,67 +315,62 @@ wnck_application_get_pid (WnckApplication *app)
 }
 
 static void
-get_icons (WnckApplication *app)
+get_icon (WnckApplication *app)
 {
   WnckHandle *handle;
-  GdkPixbuf *icon;
-  GdkPixbuf *mini_icon;
-  gsize normal_size;
-  gsize mini_size;
+  gsize size;
 
-  handle = _wnck_screen_get_handle (app->priv->screen);
+  if (app->priv->icon != NULL)
+    return;
 
-  icon = NULL;
-  mini_icon = NULL;
-  normal_size = _wnck_handle_get_default_icon_size (handle);
-  mini_size = _wnck_handle_get_default_mini_icon_size (handle);
+  handle = _wnck_screen_get_handle (app->priv->screen);
+  size = _wnck_handle_get_default_icon_size (handle);
 
-  if (_wnck_read_icon (app->priv->screen,
-                       app->priv->xwindow,
-                       app->priv->icon_cache,
-                       &icon,
-                       normal_size))
-    {
-      app->priv->need_emit_icon_changed = TRUE;
+  _wnck_read_icon (app->priv->screen,
+                   app->priv->xwindow,
+                   app->priv->icon_cache,
+                   &app->priv->icon,
+                   size);
 
-      if (app->priv->icon)
-        g_object_unref (G_OBJECT (app->priv->icon));
+  /* FIXME we should really fall back to using the icon
+   * for one of the windows. But then we need to be more
+   * complicated about icon_changed and when the icon
+   * needs updating and all that.
+   */
+}
 
-      app->priv->icon = icon;
-    }
+static void
+get_mini_icon (WnckApplication *app)
+{
+  WnckHandle *handle;
+  gsize size;
 
-  if (_wnck_read_icon (app->priv->screen,
-                       app->priv->xwindow,
-                       app->priv->mini_icon_cache,
-                       &mini_icon,
-                       mini_size))
-    {
-      app->priv->need_emit_icon_changed = TRUE;
+  if (app->priv->mini_icon != NULL)
+    return;
 
-      if (app->priv->mini_icon)
-        g_object_unref (G_OBJECT (app->priv->mini_icon));
+  handle = _wnck_screen_get_handle (app->priv->screen);
+  size = _wnck_handle_get_default_mini_icon_size (handle);
 
-      app->priv->mini_icon = mini_icon;
-    }
+  _wnck_read_icon (app->priv->screen,
+                   app->priv->xwindow,
+                   app->priv->mini_icon_cache,
+                   &app->priv->mini_icon,
+                   size);
 
   /* FIXME we should really fall back to using the icon
    * for one of the windows. But then we need to be more
    * complicated about icon_changed and when the icon
    * needs updating and all that.
    */
-
-  g_assert ((app->priv->icon && app->priv->mini_icon) ||
-            !(app->priv->icon || app->priv->mini_icon));
 }
 
 void
-_wnck_application_load_icons (WnckApplication *app)
+_wnck_application_icon_changed (WnckApplication *app)
 {
-  g_return_if_fail (WNCK_IS_APPLICATION (app));
+  g_clear_object (&app->priv->icon);
+  g_clear_object (&app->priv->mini_icon);
 
-  get_icons (app);
-  if (app->priv->need_emit_icon_changed)
-    emit_icon_changed (app);
+  g_signal_emit (app, signals[ICON_CHANGED], 0);
 }
 
 /* Prefer to get group icon from a window of type "normal" */
@@ -421,7 +413,7 @@ wnck_application_get_icon (WnckApplication *app)
 {
   g_return_val_if_fail (WNCK_IS_APPLICATION (app), NULL);
 
-  _wnck_application_load_icons (app);
+  get_icon (app);
 
   if (app->priv->icon)
     return app->priv->icon;
@@ -452,7 +444,7 @@ wnck_application_get_mini_icon (WnckApplication *app)
 {
   g_return_val_if_fail (WNCK_IS_APPLICATION (app), NULL);
 
-  _wnck_application_load_icons (app);
+  get_mini_icon (app);
 
   if (app->priv->mini_icon)
     return app->priv->mini_icon;
@@ -612,7 +604,7 @@ _wnck_application_add_window (WnckApplication *app,
   /* see if we're using icon from a window */
   if (app->priv->icon == NULL ||
       app->priv->mini_icon == NULL)
-    emit_icon_changed (app);
+    _wnck_application_icon_changed (app);
 }
 
 void
@@ -636,7 +628,7 @@ _wnck_application_remove_window (WnckApplication *app,
   /* see if we're using icon from a window */
   if (app->priv->icon == NULL ||
       app->priv->mini_icon == NULL)
-    emit_icon_changed (app);
+    _wnck_application_icon_changed (app);
 }
 
 void
@@ -673,7 +665,8 @@ _wnck_application_process_property_notify (WnckApplication *app,
                                          xevent->xproperty.atom);
       _wnck_icon_cache_property_changed (app->priv->mini_icon_cache,
                                          xevent->xproperty.atom);
-      emit_icon_changed (app);
+
+      _wnck_application_icon_changed (app);
     }
   else if (xevent->xproperty.atom ==
            _wnck_atom_get ("_NET_STARTUP_ID"))
@@ -690,15 +683,6 @@ emit_name_changed (WnckApplication *app)
                  0);
 }
 
-static void
-emit_icon_changed (WnckApplication *app)
-{
-  app->priv->need_emit_icon_changed = FALSE;
-  g_signal_emit (G_OBJECT (app),
-                 signals[ICON_CHANGED],
-                 0);
-}
-
 static void
 reset_name  (WnckApplication *app)
 {
diff --git a/libwnck/private.h b/libwnck/private.h
index bc83b65b..dbe02c2a 100644
--- a/libwnck/private.h
+++ b/libwnck/private.h
@@ -88,7 +88,7 @@ void _wnck_application_remove_window (WnckApplication *app,
 WnckApplication* _wnck_application_create  (Window           xwindow,
                                             WnckScreen      *screen);
 void             _wnck_application_destroy (WnckApplication *app);
-void             _wnck_application_load_icons (WnckApplication *app);
+void             _wnck_application_icon_changed (WnckApplication *app);
 
 WnckClassGroup  *_wnck_class_group_create        (WnckScreen     *screen,
                                                   const char     *res_class);
diff --git a/libwnck/util.c b/libwnck/util.c
index b1023585..cd0b24b6 100644
--- a/libwnck/util.c
+++ b/libwnck/util.c
@@ -212,7 +212,7 @@ wnck_set_default_mini_icon_size (gsize size)
           _wnck_window_load_icons (window);
 
           if (WNCK_IS_APPLICATION (application))
-            _wnck_application_load_icons (application);
+            _wnck_application_icon_changed (application);
         }
     }
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]