gdm r6140 - in trunk: . gui/simple-greeter gui/user-switch-applet



Author: mccann
Date: Wed Apr  9 17:47:01 2008
New Revision: 6140
URL: http://svn.gnome.org/viewvc/gdm?rev=6140&view=rev

Log:
2008-04-09  William Jon McCann  <jmccann redhat com>

	* gui/simple-greeter/gdm-user.c: (on_icon_monitor_changed),
	(update_icon_monitor), (gdm_user_finalize), (_gdm_user_update):
	* gui/user-switch-applet/applet.c: (gdm_applet_data_free),
	(reset_icon), (on_user_icon_changed), (setup_current_user),
	(fill_applet):
	Monitor ~/.face for changes.



Modified:
   trunk/ChangeLog
   trunk/gui/simple-greeter/gdm-user.c
   trunk/gui/user-switch-applet/applet.c

Modified: trunk/gui/simple-greeter/gdm-user.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-user.c	(original)
+++ trunk/gui/simple-greeter/gdm-user.c	Wed Apr  9 17:47:01 2008
@@ -72,6 +72,8 @@
         char           *shell;
         GList          *sessions;
         gulong          login_frequency;
+
+        GFileMonitor   *icon_monitor;
 };
 
 typedef struct _GdmUserClass
@@ -306,6 +308,61 @@
                               G_TYPE_NONE, 0);
 }
 
+
+static void
+on_icon_monitor_changed (GFileMonitor     *monitor,
+                         GFile            *file,
+                         GFile            *other_file,
+                         GFileMonitorEvent event_type,
+                         GdmUser          *user)
+{
+        g_debug ("Icon changed: %d", event_type);
+
+        if (event_type != G_FILE_MONITOR_EVENT_CHANGED &&
+            event_type != G_FILE_MONITOR_EVENT_CREATED) {
+                return;
+        }
+
+        _gdm_user_icon_changed (user);
+}
+
+static void
+update_icon_monitor (GdmUser *user)
+{
+        GFile  *file;
+        GError *error;
+        char   *path;
+
+        if (user->home_dir == NULL) {
+                return;
+        }
+
+        if (user->icon_monitor != NULL) {
+                g_file_monitor_cancel (user->icon_monitor);
+                user->icon_monitor = NULL;
+        }
+
+        path = g_build_filename (user->home_dir, ".face", NULL);
+        g_debug ("adding monitor for '%s'", path);
+        file = g_file_new_for_path (path);
+        error = NULL;
+        user->icon_monitor = g_file_monitor_file (file,
+                                                  G_FILE_MONITOR_NONE,
+                                                  NULL,
+                                                  &error);
+        if (user->icon_monitor != NULL) {
+                g_signal_connect (user->icon_monitor,
+                                  "changed",
+                                  G_CALLBACK (on_icon_monitor_changed),
+                                  user);
+        } else {
+                g_warning ("Unable to monitor %s: %s", path, error->message);
+                g_error_free (error);
+        }
+        g_object_unref (file);
+        g_free (path);
+}
+
 static void
 gdm_user_init (GdmUser *user)
 {
@@ -322,6 +379,8 @@
 
         user = GDM_USER (object);
 
+        g_file_monitor_cancel (user->icon_monitor);
+
         g_free (user->user_name);
         g_free (user->real_name);
 
@@ -419,6 +478,8 @@
                 g_object_notify (G_OBJECT (user), "shell");
         }
 
+        update_icon_monitor (user);
+
         g_object_thaw_notify (G_OBJECT (user));
 }
 

Modified: trunk/gui/user-switch-applet/applet.c
==============================================================================
--- trunk/gui/user-switch-applet/applet.c	(original)
+++ trunk/gui/user-switch-applet/applet.c	Wed Apr  9 17:47:01 2008
@@ -52,6 +52,7 @@
 
         GConfClient    *client;
         GdmUserManager *manager;
+        GdmUser        *user;
 
         GtkWidget      *menubar;
         GtkWidget      *menuitem;
@@ -63,6 +64,8 @@
         gboolean        active_only;
 
         guint           client_notify_lockdown_id;
+
+        guint           user_icon_changed_id;
         guint           user_notify_id;
         GQuark          user_menu_item_quark;
         gint8           pixel_size;
@@ -477,6 +480,12 @@
 {
         gconf_client_notify_remove (adata->client, adata->client_notify_lockdown_id);
 
+        g_signal_handler_disconnect (adata->user, adata->user_notify_id);
+        g_signal_handler_disconnect (adata->user, adata->user_icon_changed_id);
+
+        if (adata->user != NULL) {
+                g_object_unref (adata->user);
+        }
         g_object_unref (adata->client);
         g_object_unref (adata->manager);
         g_object_unref (tooltips);
@@ -977,17 +986,16 @@
 }
 
 static void
-reset_icon (GdmAppletData *adata,
-            GdmUser       *user)
+reset_icon (GdmAppletData *adata)
 {
         GdkPixbuf *pixbuf;
         GtkWidget *image;
 
-        if (user == NULL || !gtk_widget_has_screen (GTK_WIDGET (adata->menuitem))) {
+        if (adata->user == NULL || !gtk_widget_has_screen (GTK_WIDGET (adata->menuitem))) {
                 return;
         }
 
-        pixbuf = gdm_user_render_icon (user, 24);
+        pixbuf = gdm_user_render_icon (adata->user, 24);
         if (pixbuf != NULL) {
                 image = gtk_image_menu_item_get_image (GTK_IMAGE_MENU_ITEM (adata->menuitem));
                 gtk_image_set_from_pixbuf (GTK_IMAGE (image), pixbuf);
@@ -995,6 +1003,49 @@
         }
 }
 
+static void
+on_user_icon_changed (GdmUser         *user,
+                      GdmAppletData   *adata)
+{
+        g_debug ("User icon changed");
+        reset_icon (adata);
+}
+
+static void
+setup_current_user (GdmAppletData *adata)
+{
+        const char *name;
+
+        adata->user = gdm_user_manager_get_user_by_uid (adata->manager, getuid ());
+        if (adata->user != NULL) {
+                g_object_ref (adata->user);
+                name = gdm_user_get_real_name (adata->user);
+        } else {
+                name = _("Unknown");
+        }
+
+        adata->menuitem = gtk_image_menu_item_new_with_label (name);
+        gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (adata->menuitem),
+                                       gtk_image_new ());
+        gtk_menu_shell_append (GTK_MENU_SHELL (adata->menubar), adata->menuitem);
+        gtk_widget_show (adata->menuitem);
+
+        if (adata->user != NULL) {
+                reset_icon (adata);
+
+                adata->user_icon_changed_id =
+                        g_signal_connect (adata->user,
+                                          "icon-changed",
+                                          G_CALLBACK (on_user_icon_changed),
+                                          adata);
+                adata->user_notify_id =
+                        g_signal_connect (adata->user,
+                                         "notify::display-name",
+                                         G_CALLBACK (user_notify_display_name_cb),
+                                         adata);
+        }
+}
+
 static gboolean
 fill_applet (PanelApplet *applet)
 {
@@ -1133,32 +1184,9 @@
         gtk_container_add (GTK_CONTAINER (applet), adata->menubar);
         gtk_widget_show (adata->menubar);
 
-        {
-                GdmUser    *user;
-                const char *name;
+        setup_current_user (adata);
 
-                user = gdm_user_manager_get_user_by_uid (adata->manager, getuid ());
-                if (user != NULL) {
-                        name = gdm_user_get_real_name (user);
-                } else {
-                        name = _("Unknown");
-                }
-
-                adata->menuitem = gtk_image_menu_item_new_with_label (name);
-                gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (adata->menuitem),
-                                               gtk_image_new ());
-                gtk_menu_shell_append (GTK_MENU_SHELL (adata->menubar), adata->menuitem);
-                gtk_widget_show (adata->menuitem);
-
-                if (user != NULL) {
-                        reset_icon (adata, user);
 
-                        adata->user_notify_id = g_signal_connect (user,
-                                                                  "notify::display-name",
-                                                                  G_CALLBACK (user_notify_display_name_cb),
-                                                                  adata);
-                }
-        }
 
         adata->menu = gtk_menu_new ();
         gtk_menu_item_set_submenu (GTK_MENU_ITEM (adata->menuitem), adata->menu);



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