summaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorWilliam Jon McCann <mccann@jhu.edu>2005-07-24 09:22:13 +0000
committerWilliam Jon McCann <mccann@src.gnome.org>2005-07-24 09:22:13 +0000
commitd0afc39c32ba7050e713d4427c225925d4f7b9ee (patch)
treef10ee8df8bfb2155ab3131030d736aa4a5d4b4d0 /gui
parentf295abaa4e0cb409925908ae5ea4c08a0b0c3725 (diff)
downloadgdm-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.c17
-rw-r--r--gui/greeter/greeter_item_ulist.c414
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;
}