summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew P. <pan.pav.7c5@gmail.com>2013-12-02 07:28:34 +0300
committerAndrew P. <pan.pav.7c5@gmail.com>2013-12-02 07:28:34 +0300
commit3867661ba872cbad27d9ddc1c3c0f6cb2010ebe0 (patch)
tree5410c617f8581dda6c4ebda0435db19aeca15292
parentc65e62de2a9123e74d7e0c6bbca82f127d133f19 (diff)
downloadlightdm-gtk-greeter-3867661ba872cbad27d9ddc1c3c0f6cb2010ebe0.tar.gz
password_entry/username_entry: user switching with Up/Down keys
-rw-r--r--src/lightdm-gtk-greeter.c67
-rw-r--r--src/lightdm-gtk-greeter.glade1
2 files changed, 68 insertions, 0 deletions
diff --git a/src/lightdm-gtk-greeter.c b/src/lightdm-gtk-greeter.c
index 4e16b61..45985bf 100644
--- a/src/lightdm-gtk-greeter.c
+++ b/src/lightdm-gtk-greeter.c
@@ -752,6 +752,63 @@ language_selected_cb(GtkMenuItem *menuitem, gpointer user_data)
}
gboolean
+password_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
+G_MODULE_EXPORT
+gboolean
+password_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+#if GTK_CHECK_VERSION (3, 0, 0)
+ if ((event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down) &&
+ gtk_widget_get_visible(GTK_WIDGET(user_combo)))
+#else
+ if ((event->keyval == GDK_Up || event->keyval == GDK_Down) &&
+ gtk_widget_get_visible(GTK_WIDGET(user_combo)))
+#endif
+ {
+ gboolean up;
+ gboolean available;
+ GtkTreeIter iter;
+ GtkTreeModel *model = gtk_combo_box_get_model (user_combo);
+ #if GTK_CHECK_VERSION (3, 0, 0)
+ up = event->keyval == GDK_KEY_Up;
+ #else
+ up = event->keyval == GDK_Up;
+ #endif
+
+ /* Back to username_entry if it is available */
+ if (up && gtk_widget_get_visible (GTK_WIDGET (username_entry)) && widget == GTK_WIDGET (password_entry))
+ {
+ gtk_widget_grab_focus (GTK_WIDGET (username_entry));
+ return TRUE;
+ }
+
+ if (!gtk_combo_box_get_active_iter (user_combo, &iter))
+ return FALSE;
+
+ if (up)
+ {
+ #if GTK_CHECK_VERSION (3, 0, 0)
+ available = gtk_tree_model_iter_previous (model, &iter);
+ #else
+ GtkTreePath *path = gtk_tree_model_get_path (model, &iter);
+ available = gtk_tree_path_prev (path);
+ if (available)
+ available = gtk_tree_model_get_iter (model, &iter, path);
+ gtk_tree_path_free (path);
+ #endif
+ }
+ else
+ available = gtk_tree_model_iter_next (model, &iter);
+
+ if (available)
+ gtk_combo_box_set_active_iter (user_combo, &iter);
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
+gboolean
username_focus_out_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data);
G_MODULE_EXPORT
gboolean
@@ -793,6 +850,15 @@ username_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data
}
return TRUE;
}
+#if GTK_CHECK_VERSION (3, 0, 0)
+ else if (event->keyval == GDK_KEY_Up)
+#else
+ else if (event->keyval == GDK_Up)
+#endif
+ {
+ /* Acts as password_entry */
+ return password_key_press_cb (widget, event, user_data);
+ }
return FALSE;
}
@@ -892,6 +958,7 @@ user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter)
{
gtk_widget_hide (GTK_WIDGET (username_entry));
gtk_widget_hide (GTK_WIDGET (cancel_button));
+ gtk_widget_grab_focus (GTK_WIDGET (password_entry));
}
set_login_button_label (greeter, user);
diff --git a/src/lightdm-gtk-greeter.glade b/src/lightdm-gtk-greeter.glade
index d82b8aa..63ad30f 100644
--- a/src/lightdm-gtk-greeter.glade
+++ b/src/lightdm-gtk-greeter.glade
@@ -65,6 +65,7 @@
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<signal name="activate" handler="login_cb" swapped="no"/>
+ <signal name="key-press-event" handler="password_key_press_cb" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>