gdm r6140 - in trunk: . gui/simple-greeter gui/user-switch-applet
- From: mccann svn gnome org
- To: svn-commits-list gnome org
- Subject: gdm r6140 - in trunk: . gui/simple-greeter gui/user-switch-applet
- Date: Wed, 9 Apr 2008 17:47:01 +0100 (BST)
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]