diff options
author | William Jon McCann <mccann@jhu.edu> | 2005-07-24 09:22:13 +0000 |
---|---|---|
committer | William Jon McCann <mccann@src.gnome.org> | 2005-07-24 09:22:13 +0000 |
commit | d0afc39c32ba7050e713d4427c225925d4f7b9ee (patch) | |
tree | f10ee8df8bfb2155ab3131030d736aa4a5d4b4d0 /gui | |
parent | f295abaa4e0cb409925908ae5ea4c08a0b0c3725 (diff) | |
download | gdm-d0afc39c32ba7050e713d4427c225925d4f7b9ee.tar.gz |
A few more tweaks to the face browser.
2005-07-24 William Jon McCann <mccann@jhu.edu>
* gui/greeter/greeter_item_ulist.c (check_for_displays)
(greeter_generate_userlist, greeter_populate_user_list):
A few more tweaks to the face browser.
* gui/gdmphotosetup.c (maybe_migrate_old_config): Fix leak.
(main): Freeing result of gdm_common_get_config file
causes memory corruption. So, don't free it until
we find the problem.
Diffstat (limited to 'gui')
-rw-r--r-- | gui/gdmphotosetup.c | 17 | ||||
-rw-r--r-- | gui/greeter/greeter_item_ulist.c | 414 |
2 files changed, 245 insertions, 186 deletions
diff --git a/gui/gdmphotosetup.c b/gui/gdmphotosetup.c index 74b7efbe..569799e7 100644 --- a/gui/gdmphotosetup.c +++ b/gui/gdmphotosetup.c @@ -337,6 +337,7 @@ maybe_migrate_old_config (void) gdk_pixbuf_save (pixbuf, photofile, "png", NULL, NULL); } + g_object_unref (pixbuf); } g_free (name); @@ -473,13 +474,15 @@ main (int argc, char *argv[]) maybe_migrate_old_config (); - config_file = gdm_common_get_config_file (); - if (config_file == NULL) { - g_print (_("Could not access GDM configuration file.\n")); - exit (EXIT_FAILURE); - } + config_file = gdm_common_get_config_file (); + if (config_file == NULL) { + g_print (_("Could not access GDM configuration file.\n")); + exit (EXIT_FAILURE); + } + + config_prefix = g_strdup_printf ("=%s=/", config_file); + /*g_free (config_file);*/ - config_prefix = g_strdup_printf("=%s=/", config_file); gnome_config_push_prefix (config_prefix); face_browser = gnome_config_get_bool (GDM_KEY_BROWSER); max_size = gnome_config_get_int (GDM_KEY_MAXFILE); @@ -489,8 +492,8 @@ main (int argc, char *argv[]) facedir = gnome_config_get_string (GDM_KEY_FACEDIR); gnome_config_pop_prefix (); + g_free (config_prefix); - g_free (config_file); gtk_window_set_default_icon_name ("stock_person"); diff --git a/gui/greeter/greeter_item_ulist.c b/gui/greeter/greeter_item_ulist.c index 1cfc3b36..10065ba3 100644 --- a/gui/greeter/greeter_item_ulist.c +++ b/gui/greeter/greeter_item_ulist.c @@ -37,33 +37,78 @@ #include "gdm.h" #include "gdmcommon.h" +#include "gdmcomm.h" #include "gdmuser.h" #include "greeter.h" #include "greeter_item_ulist.h" #include "greeter_parser.h" #include "greeter_configuration.h" -static GList *users = NULL; -static GList *users_string = NULL; -static GdkPixbuf *defface; +static GList *users = NULL; +static GList *users_string = NULL; +static GdkPixbuf *defface; +static GHashTable *displays_hash = NULL; -static GtkWidget *pam_entry = NULL; -static GtkWidget *user_list = NULL; +static GtkWidget *pam_entry = NULL; +static GtkWidget *user_list = NULL; -static gboolean selecting_user = FALSE; +static gboolean selecting_user = FALSE; enum { - GREETER_ULIST_ICON_COLUMN = 0, - GREETER_ULIST_LABEL_COLUMN, - GREETER_ULIST_LOGIN_COLUMN + GREETER_ULIST_ICON_COLUMN = 0, + GREETER_ULIST_LABEL_COLUMN, + GREETER_ULIST_LOGIN_COLUMN, + GREETER_ULIST_ACTIVE_COLUMN }; +static void +check_for_displays (void) +{ + char *ret; + char **vec; + char *auth_cookie = NULL; + int i; + + ret = gdmcomm_call_gdm (GDM_SUP_ATTACHED_SERVERS, auth_cookie, "2.2.4.0", 5); + if (ve_string_empty (ret) || strncmp (ret, "OK ", 3) != 0) { + g_free (ret); + return; + } + + vec = g_strsplit (&ret[3], ";", -1); + g_free (ret); + if (vec == NULL) + return; + + if (displays_hash == NULL) + displays_hash = g_hash_table_new_full (g_str_hash, + g_str_equal, + g_free, + g_free); + + for (i = 0; vec[i] != NULL; i++) { + char **rvec; + + rvec = g_strsplit (vec[i], ",", -1); + if (rvec == NULL || ve_vector_len (rvec) != 3) + continue; + + g_hash_table_insert (displays_hash, + g_strdup (rvec[1]), + g_strdup (rvec[0])); + + g_strfreev (rvec); + } + + g_strfreev (vec); +} + static void gdm_greeter_users_init (void) { - gint size_of_users = 0; - time_t time_started; + gint size_of_users = 0; + time_t time_started; defface = gdm_common_get_face (NULL, GdmDefaultFace, @@ -82,75 +127,79 @@ gdm_greeter_users_init (void) static void greeter_populate_user_list (GtkTreeModel *tm) { - GList *li; - - for (li = users; li != NULL; li = li->next) - { - GdmUser *usr = li->data; - GtkTreeIter iter = {0}; - char *label; - char *login, *gecos; - - login = g_markup_escape_text (usr->login, -1); - gecos = g_markup_escape_text (usr->gecos, -1); - - if (usr->gecos && strcmp (usr->gecos, "") != 0) { - label = g_strdup_printf ("<b>%s</b>\n %s", - gecos, - login); - } else { - label = g_strdup_printf ("<b>%s</b>\n%s", - login, - gecos); - } - - g_free (login); - g_free (gecos); - gtk_list_store_append (GTK_LIST_STORE (tm), &iter); - gtk_list_store_set (GTK_LIST_STORE (tm), &iter, - GREETER_ULIST_ICON_COLUMN, usr->picture, - GREETER_ULIST_LOGIN_COLUMN, usr->login, - GREETER_ULIST_LABEL_COLUMN, label, - -1); - g_free (label); - } + GList *li; + + for (li = users; li != NULL; li = li->next) { + GdmUser *usr = li->data; + GtkTreeIter iter = {0}; + char *label; + char *name; + gboolean active; + + if (usr->gecos && strcmp (usr->gecos, "") != 0) { + name = g_markup_escape_text (usr->gecos, -1); + } else { + name = g_markup_escape_text (usr->login, -1); + } + + if (g_hash_table_lookup (displays_hash, usr->login)) + active = TRUE; + else + active = FALSE; + + if (active) { + label = g_strdup_printf ("<b>%s</b>\n <i><small>%s</small></i>", + name, + _("Already logged in")); + } else { + label = g_strdup_printf ("<b>%s</b>\n", + name); + } + + g_free (name); + gtk_list_store_append (GTK_LIST_STORE (tm), &iter); + gtk_list_store_set (GTK_LIST_STORE (tm), &iter, + GREETER_ULIST_ICON_COLUMN, usr->picture, + GREETER_ULIST_LOGIN_COLUMN, usr->login, + GREETER_ULIST_LABEL_COLUMN, label, + GREETER_ULIST_ACTIVE_COLUMN, active, + -1); + g_free (label); + } } static void user_selected (GtkTreeSelection *selection, gpointer data) { - GtkTreeModel *tm = NULL; - GtkTreeIter iter = {0}; - - if (gtk_tree_selection_get_selected (selection, &tm, &iter)) - { - char *login; - gtk_tree_model_get (tm, &iter, GREETER_ULIST_LOGIN_COLUMN, - &login, -1); - if (login != NULL) - { - GreeterItemInfo *pamlabel; - - if (selecting_user && greeter_probably_login_prompt) - { - gtk_entry_set_text (GTK_ENTRY (pam_entry), login); - } - pamlabel = greeter_lookup_id ("pam-message"); - if (selecting_user && pamlabel != NULL) - { - printf ("%c%c%c%s\n", STX, BEL, - GDM_INTERRUPT_SELECT_USER, login); - fflush (stdout); - } + GtkTreeModel *tm = NULL; + GtkTreeIter iter = {0}; + + if (gtk_tree_selection_get_selected (selection, &tm, &iter)) { + char *login; + + gtk_tree_model_get (tm, &iter, GREETER_ULIST_LOGIN_COLUMN, + &login, -1); + if (login != NULL) { + GreeterItemInfo *pamlabel; + + if (selecting_user && greeter_probably_login_prompt) { + gtk_entry_set_text (GTK_ENTRY (pam_entry), login); + } + pamlabel = greeter_lookup_id ("pam-message"); + if (selecting_user && pamlabel != NULL) { + printf ("%c%c%c%s\n", STX, BEL, + GDM_INTERRUPT_SELECT_USER, login); + fflush (stdout); + } + } } - } } static void browser_change_focus (GtkWidget *widget, GdkEventButton *event, gpointer data) { - gtk_widget_grab_focus (pam_entry); + gtk_widget_grab_focus (pam_entry); } static void @@ -163,37 +212,38 @@ greeter_generate_userlist (GtkWidget *tv) GList *list, *li; gdm_greeter_users_init (); + + check_for_displays (); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (tv), FALSE); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tv)); gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); - if (users != NULL) - { + if (users != NULL) { g_signal_connect (selection, "changed", - G_CALLBACK (user_selected), - NULL); + G_CALLBACK (user_selected), + NULL); g_signal_connect (GTK_TREE_VIEW (tv), "button_release_event", - G_CALLBACK (browser_change_focus), - NULL); - - tm = (GtkTreeModel *)gtk_list_store_new (3, - GDK_TYPE_PIXBUF, - G_TYPE_STRING, - G_TYPE_STRING); + G_CALLBACK (browser_change_focus), + NULL); + + tm = (GtkTreeModel *)gtk_list_store_new (4, + GDK_TYPE_PIXBUF, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_BOOLEAN); gtk_tree_view_set_model (GTK_TREE_VIEW (tv), tm); - column_one = gtk_tree_view_column_new_with_attributes - (_("Icon"), - gtk_cell_renderer_pixbuf_new (), - "pixbuf", GREETER_ULIST_ICON_COLUMN, - NULL); + column_one = gtk_tree_view_column_new_with_attributes (_("Icon"), + gtk_cell_renderer_pixbuf_new (), + "pixbuf", GREETER_ULIST_ICON_COLUMN, + NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column_one); - column_two = gtk_tree_view_column_new_with_attributes - (_("Username"), - gtk_cell_renderer_text_new (), - "markup", GREETER_ULIST_LABEL_COLUMN, - NULL); + column_two = gtk_tree_view_column_new_with_attributes (_("Username"), + gtk_cell_renderer_text_new (), + "markup", GREETER_ULIST_LABEL_COLUMN, + NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (tv), column_two); greeter_populate_user_list (tm); @@ -206,7 +256,7 @@ greeter_generate_userlist (GtkWidget *tv) if (info->data.list.icon_color != NULL) g_object_set (cell, "cell-background", - info->data.list.icon_color, NULL); + info->data.list.icon_color, NULL); } list = gtk_tree_view_column_get_cell_renderers (column_two); @@ -215,9 +265,13 @@ greeter_generate_userlist (GtkWidget *tv) if (info->data.list.label_color != NULL) g_object_set (cell, "background", - info->data.list.label_color, NULL); + info->data.list.label_color, NULL); } } + + /* we are done with the hash */ + g_hash_table_destroy (displays_hash); + displays_hash = NULL; } static inline void @@ -244,108 +298,110 @@ force_no_tree_separators (GtkWidget *widget) gboolean greeter_item_ulist_setup (void) { - GreeterItemInfo *info; - - info = greeter_lookup_id ("user-pw-entry"); - if (info && info->item && - GNOME_IS_CANVAS_WIDGET (info->item) && - GTK_IS_ENTRY (GNOME_CANVAS_WIDGET (info->item)->widget)) - { - pam_entry = GNOME_CANVAS_WIDGET (info->item)->widget; - } - info = greeter_lookup_id ("userlist"); - if (info && info->item && - GNOME_IS_CANVAS_WIDGET (info->item)) - { - GtkWidget *sw = GNOME_CANVAS_WIDGET (info->item)->widget; - if (GTK_IS_SCROLLED_WINDOW (sw) && - GTK_IS_TREE_VIEW (GTK_BIN (sw)->child)) - { - GtkRequisition req; - gdouble height; - - user_list = GTK_BIN (sw)->child; - - force_no_tree_separators (user_list); - - greeter_generate_userlist (user_list); - if ( ! DOING_GDM_DEVELOPMENT) - greeter_item_ulist_disable (); - - /* Reset size of the widget canvas item so it is the same - * size as the userlist. This avoids the ugly white background - * displayed below the Face Browser when the list isn't as large - * as the rectangle defined in the GDM theme file. - */ - gtk_widget_size_request (user_list, &req); - g_object_get (info->item, "height", &height, NULL); - - if (req.height < height) - g_object_set (info->item, "height", (double)req.height, NULL); - } - } - return TRUE; + GreeterItemInfo *info; + + info = greeter_lookup_id ("user-pw-entry"); + if (info && info->item && + GNOME_IS_CANVAS_WIDGET (info->item) && + GTK_IS_ENTRY (GNOME_CANVAS_WIDGET (info->item)->widget)) { + pam_entry = GNOME_CANVAS_WIDGET (info->item)->widget; + } + + info = greeter_lookup_id ("userlist"); + + if (info && info->item && + GNOME_IS_CANVAS_WIDGET (info->item)) { + GtkWidget *sw = GNOME_CANVAS_WIDGET (info->item)->widget; + + if (GTK_IS_SCROLLED_WINDOW (sw) && + GTK_IS_TREE_VIEW (GTK_BIN (sw)->child)) { + GtkRequisition req; + gdouble height; + + user_list = GTK_BIN (sw)->child; + + force_no_tree_separators (user_list); + + greeter_generate_userlist (user_list); + if ( ! DOING_GDM_DEVELOPMENT) + greeter_item_ulist_disable (); + + /* Reset size of the widget canvas item so it + * is the same size as the userlist. This + * avoids the ugly white background displayed + * below the Face Browser when the list isn't + * as large as the rectangle defined in the + * GDM theme file. + */ + + gtk_widget_size_request (user_list, &req); + g_object_get (info->item, "height", &height, NULL); + + if (req.height < height) + g_object_set (info->item, "height", (double)req.height, NULL); + } + } + + return TRUE; } void greeter_item_ulist_enable (void) { - selecting_user = TRUE; - if (user_list != NULL) - gtk_widget_set_sensitive (user_list, TRUE); + selecting_user = TRUE; + if (user_list != NULL) + gtk_widget_set_sensitive (user_list, TRUE); } void greeter_item_ulist_disable (void) { - selecting_user = FALSE; - if (user_list != NULL) - gtk_widget_set_sensitive (user_list, FALSE); + selecting_user = FALSE; + if (user_list != NULL) + gtk_widget_set_sensitive (user_list, FALSE); } void greeter_item_ulist_set_user (const char *user) { - gboolean old_selecting_user = selecting_user; - GtkTreeSelection *selection; - GtkTreeIter iter = {0}; - GtkTreeModel *tm = NULL; - - if (user_list == NULL) - return; - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (user_list)); - gtk_tree_selection_unselect_all (selection); - - if (ve_string_empty (user)) - return; - - /* Make sure we don't set the pam_entry and pam label stuff, - this is programatic selection, not user selection */ - selecting_user = FALSE; - - tm = gtk_tree_view_get_model (GTK_TREE_VIEW (user_list)); - - if (gtk_tree_model_get_iter_first (tm, &iter)) - { - do - { - char *login; - gtk_tree_model_get (tm, &iter, GREETER_ULIST_LOGIN_COLUMN, - &login, -1); - if (login != NULL && strcmp (user, login) == 0) - { - GtkTreePath *path = gtk_tree_model_get_path (tm, &iter); - gtk_tree_selection_select_iter (selection, &iter); - gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (user_list), - path, NULL, - FALSE, 0.0, 0.0); - gtk_tree_path_free (path); - break; - } + gboolean old_selecting_user = selecting_user; + GtkTreeSelection *selection; + GtkTreeIter iter = {0}; + GtkTreeModel *tm = NULL; + + if (user_list == NULL) + return; + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (user_list)); + gtk_tree_selection_unselect_all (selection); + + if (ve_string_empty (user)) + return; + + /* Make sure we don't set the pam_entry and pam label stuff, + this is programatic selection, not user selection */ + selecting_user = FALSE; + + tm = gtk_tree_view_get_model (GTK_TREE_VIEW (user_list)); + + if (gtk_tree_model_get_iter_first (tm, &iter)) { + do { + char *login; + + gtk_tree_model_get (tm, &iter, GREETER_ULIST_LOGIN_COLUMN, + &login, -1); + if (login != NULL && strcmp (user, login) == 0) { + GtkTreePath *path = gtk_tree_model_get_path (tm, &iter); + + gtk_tree_selection_select_iter (selection, &iter); + gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (user_list), + path, NULL, + FALSE, 0.0, 0.0); + gtk_tree_path_free (path); + break; + } - } - while (gtk_tree_model_iter_next (tm, &iter)); - } - selecting_user = old_selecting_user; + } while (gtk_tree_model_iter_next (tm, &iter)); + } + selecting_user = old_selecting_user; } |