← Back to team overview

ayatana-commits team mailing list archive

[Branch ~indicator-applet-developers/indicator-me/trunk] Rev 83: merge monitor-avatar branch

 

Merge authors:
  David Barth (dbarth)
Related merge proposals:
  https://code.launchpad.net/~dbarth/indicator-me/monitor-avatar/+merge/21141
  proposed by: David Barth (dbarth)
  review: Approve - Conor Curran (cjcurran)
------------------------------------------------------------
revno: 83 [merge]
committer: David Barth <david.barth@xxxxxxxxxxxxx>
branch nick: indicator-me
timestamp: Thu 2010-03-11 18:15:17 +0100
message:
  merge monitor-avatar branch
modified:
  src/about-me-menu-item.c
  src/about-me-menu-item.h
  src/dbus-shared-names.h
  src/indicator-me.c
  src/me-service.c


--
lp:indicator-me
https://code.launchpad.net/~indicator-applet-developers/indicator-me/trunk

Your team ayatana-commits is subscribed to branch lp:indicator-me.
To unsubscribe from this branch go to https://code.launchpad.net/~indicator-applet-developers/indicator-me/trunk/+edit-subscription.
=== modified file 'src/about-me-menu-item.c'
--- src/about-me-menu-item.c	2010-03-02 14:08:42 +0000
+++ src/about-me-menu-item.c	2010-03-11 13:15:06 +0000
@@ -203,25 +203,24 @@
 	return pixbuf;
 }
 
-
-static gboolean
-load_avatar (gpointer data)
+gboolean
+about_me_menu_item_load_avatar (AboutMeMenuItem *self, const gchar *file)
 {
-  g_return_val_if_fail (ABOUT_IS_ME_MENU_ITEM (data), FALSE);
-
-  AboutMeMenuItemPrivate *priv = GET_PRIVATE (data);
-
-  /* check if the user defined an avatar */
-	gchar *file = g_build_filename (g_get_home_dir (), ".face", NULL);
+  g_return_val_if_fail (ABOUT_IS_ME_MENU_ITEM (self), FALSE);
+
+  AboutMeMenuItemPrivate *priv = GET_PRIVATE (self);
+
+  g_debug ("loading avatar from file %s", file);
 
   struct stat buf;
   if (! (g_stat (file, &buf) == 0 && buf.st_size > 0)) {
-    goto load_avatar_fail;
+    g_warning ("%s: not found or empty", file);
+    return FALSE;
   }
 
   if (buf.st_size > 1024*1024) {
     g_warning ("avatar file too large (%lld)", (long long)buf.st_size);
-    goto load_avatar_fail;
+    return FALSE;
   }
 
   GError *error = NULL;
@@ -234,20 +233,28 @@
       g_warning ("Couldn't read file %s: %s", file, error->message);
       g_error_free (error);
     }
-    goto load_avatar_fail;
+    return FALSE;
   }
 
   gtk_image_set_from_pixbuf (GTK_IMAGE (priv->image), pixbuf);
 
   g_object_unref (pixbuf);
 
-load_avatar_fail:
+  return TRUE;
+}
+
+static gboolean
+load_avatar_task (gpointer object)
+{
+  g_return_val_if_fail (ABOUT_IS_ME_MENU_ITEM (object), FALSE);
+
+	gchar *file = g_build_filename (g_get_home_dir (), ".face", NULL);
+  about_me_menu_item_load_avatar (ABOUT_ME_MENU_ITEM(object), file);
   g_free (file);
 
   return FALSE;
 }
 
-
 static void
 image_size_allocate (GtkWidget *widget,
                      GtkAllocation *allocation,
@@ -282,7 +289,7 @@
   gtk_container_add (GTK_CONTAINER (frame), priv->image);
 
   /* try to load a personalized icon */
-  g_idle_add (load_avatar, (gpointer)object);
+  g_idle_add (load_avatar_task, (gpointer)object);
 
   align = gtk_alignment_new (0, 0.3, 0, 0);
   priv->label = gtk_label_new (priv->realname);

=== modified file 'src/about-me-menu-item.h'
--- src/about-me-menu-item.h	2010-02-18 00:35:28 +0000
+++ src/about-me-menu-item.h	2010-03-11 12:20:48 +0000
@@ -59,6 +59,7 @@
 
 GType	   about_me_menu_item_get_type            (void) G_GNUC_CONST;
 GtkWidget *about_me_menu_item_new                 (const gchar *name);
+gboolean   about_me_menu_item_load_avatar         (AboutMeMenuItem *self, const gchar *file);
 
 G_END_DECLS
 

=== modified file 'src/dbus-shared-names.h'
--- src/dbus-shared-names.h	2010-02-17 22:52:43 +0000
+++ src/dbus-shared-names.h	2010-03-11 12:20:48 +0000
@@ -35,5 +35,6 @@
 
 #define DBUSMENU_ABOUT_ME_MENUITEM_TYPE           "x-canonical-about-me-item"
 #define DBUSMENU_ABOUT_ME_MENUITEM_PROP_NAME      "name"
+#define DBUSMENU_ABOUT_ME_MENUITEM_PROP_ICON      "icon"
 
 #endif /* __DBUS_SHARED_NAMES_H__ */

=== modified file 'src/indicator-me.c'
--- src/indicator-me.c	2010-02-24 19:54:33 +0000
+++ src/indicator-me.c	2010-03-11 13:06:53 +0000
@@ -274,6 +274,23 @@
 	return TRUE;
 }
 
+/* Whenever we have a property change on a DbusmenuMenuitem
+   we need to be responsive to that. */
+static void
+about_me_prop_change_cb (DbusmenuMenuitem * mi, gchar * prop, GValue * value, AboutMeMenuItem *item)
+{
+  g_return_if_fail (ABOUT_IS_ME_MENU_ITEM (item));
+
+	if (!g_strcmp0(prop, DBUSMENU_ABOUT_ME_MENUITEM_PROP_ICON)) {
+    /* reload the avatar icon */
+    about_me_menu_item_load_avatar (item, g_value_get_string(value));
+	} else {
+		g_warning("Indicator Item property '%s' unknown", prop);
+	}
+
+	return;
+}
+
 static gboolean
 new_about_me_item (DbusmenuMenuitem * newitem,
                    DbusmenuMenuitem * parent,
@@ -287,6 +304,7 @@
 	AboutMeMenuItem *about = ABOUT_ME_MENU_ITEM (about_me_menu_item_new (name));
 
 	dbusmenu_gtkclient_newitem_base(DBUSMENU_GTKCLIENT(client), newitem, GTK_MENU_ITEM(about), parent);
+	g_signal_connect(G_OBJECT(newitem), DBUSMENU_MENUITEM_SIGNAL_PROPERTY_CHANGED, G_CALLBACK(about_me_prop_change_cb), about);
 
 	return TRUE;
 }

=== modified file 'src/me-service.c'
--- src/me-service.c	2010-03-10 14:39:43 +0000
+++ src/me-service.c	2010-03-11 13:06:53 +0000
@@ -32,6 +32,8 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-bindings.h>
 
+#include <gio/gio.h>
+
 #include <gconf/gconf-client.h>
 
 #include <libdbusmenu-glib/client.h>
@@ -84,6 +86,7 @@
 static GMainLoop * mainloop = NULL;
 static StatusServiceDbus * dbus_interface = NULL;
 static StatusProviderStatus global_status = STATUS_PROVIDER_STATUS_DISCONNECTED;
+static GFileMonitor *avatar_monitor = NULL;
 
 static void
 status_update (void) {
@@ -244,6 +247,21 @@
 }
 
 static void
+avatar_changed_cb (GFileMonitor * monitor, GFile * file, GFile * other_file, GFileMonitorEvent event_type, gpointer user_data)
+{
+	g_debug("avatar changed!");
+
+  g_return_if_fail (DBUSMENU_IS_MENUITEM (user_data));
+
+  DbusmenuMenuitem *mi = DBUSMENU_MENUITEM (user_data);
+
+  /* whatever happened, we just update the icon property
+     and let the indicator reload the image */
+  gchar * path = g_file_get_path (file);
+  dbusmenu_menuitem_property_set (mi, DBUSMENU_ABOUT_ME_MENUITEM_PROP_ICON, path);
+}
+
+static void
 build_user_item (DbusmenuMenuitem * root)
 {
 	struct passwd * pwd = NULL;
@@ -267,6 +285,16 @@
   dbusmenu_menuitem_property_set(useritem, DBUSMENU_MENUITEM_PROP_TYPE, DBUSMENU_ABOUT_ME_MENUITEM_TYPE);
   dbusmenu_menuitem_child_append(root, useritem);
 
+  /* avatar icon */
+	gchar *filename = g_build_filename (g_get_home_dir (), ".face", NULL);
+  dbusmenu_menuitem_property_set (useritem, DBUSMENU_ABOUT_ME_MENUITEM_PROP_ICON, filename);
+  GFile *file = g_file_new_for_path (filename);
+  avatar_monitor = g_file_monitor (file, G_FILE_MONITOR_NONE, NULL, NULL);
+  if (avatar_monitor != NULL)
+		g_signal_connect (G_OBJECT (avatar_monitor), "changed", G_CALLBACK (avatar_changed_cb), useritem);
+
+  g_free (filename);
+
   gchar *gam = g_find_program_in_path("gnome-about-me");
   if (gam != NULL) {
     dbusmenu_menuitem_property_set_bool(useritem, DBUSMENU_MENUITEM_PROP_ENABLED, TRUE);
@@ -342,6 +370,10 @@
 service_shutdown (IndicatorService * service, gpointer user_data)
 {
 	g_debug("Service shutting down");
+
+  if (avatar_monitor != NULL)
+    g_object_unref (avatar_monitor);
+
 	g_main_loop_quit(mainloop);
 	return;
 }