gdm r6178 - in trunk: . gui/simple-greeter
- From: halfline svn gnome org
- To: svn-commits-list gnome org
- Subject: gdm r6178 - in trunk: . gui/simple-greeter
- Date: Tue, 29 Apr 2008 04:40:12 +0100 (BST)
Author: halfline
Date: Tue Apr 29 03:40:12 2008
New Revision: 6178
URL: http://svn.gnome.org/viewvc/gdm?rev=6178&view=rev
Log:
2008-04-28 Ray Strode <rstrode redhat com>
* gui/simple-greeter/gdm-scrollable-widget.[ch]:
(on_key_event), (gdm_scrollable_redirect_input_to_event_sink),
(gdm_scrollable_unredirect_input), (gdm_scrollable_widget_finalize),
(gdm_scrollable_widget_add_invisible_event_sink),
(gdm_scrollable_widget_has_queued_key_events),
(gdm_scrollable_widget_replay_queued_key_events):
* gui/simple-greeter/gdm-greeter-login-window.c:
(reset_dialog), (gdm_greeter_login_window_info_query),
(gdm_greeter_login_window_secret_info_query),
* gui/simple-greeter/gdm-chooser-widget.[ch]:
(gdm_chooser_widget_propagate_pending_key_events):
If the user types while an animation is going on, keep track of
what they are typing and replay it at the end of the animation.
Modified:
trunk/ChangeLog
trunk/gui/simple-greeter/gdm-chooser-widget.c
trunk/gui/simple-greeter/gdm-chooser-widget.h
trunk/gui/simple-greeter/gdm-greeter-login-window.c
trunk/gui/simple-greeter/gdm-scrollable-widget.c
trunk/gui/simple-greeter/gdm-scrollable-widget.h
Modified: trunk/gui/simple-greeter/gdm-chooser-widget.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-chooser-widget.c (original)
+++ trunk/gui/simple-greeter/gdm-chooser-widget.c Tue Apr 29 03:40:12 2008
@@ -775,7 +775,7 @@
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget->priv->items_view));
gtk_tree_selection_unselect_all (selection);
- window = gtk_widget_get_ancestor (widget, GTK_TYPE_WINDOW);
+ window = gtk_widget_get_ancestor (GTK_WIDGET (widget), GTK_TYPE_WINDOW);
if (window != NULL) {
gtk_window_set_focus (GTK_WINDOW (window), NULL);
@@ -2282,3 +2282,13 @@
activate_if_one_item (widget);
}
}
+
+void
+gdm_chooser_widget_propagate_pending_key_events (GdmChooserWidget *widget)
+{
+ if (!gdm_scrollable_widget_has_queued_key_events (GDM_SCROLLABLE_WIDGET (widget->priv->scrollable_widget))) {
+ return;
+ }
+
+ gdm_scrollable_widget_replay_queued_key_events (GDM_SCROLLABLE_WIDGET (widget->priv->scrollable_widget));
+}
Modified: trunk/gui/simple-greeter/gdm-chooser-widget.h
==============================================================================
--- trunk/gui/simple-greeter/gdm-chooser-widget.h (original)
+++ trunk/gui/simple-greeter/gdm-chooser-widget.h Tue Apr 29 03:40:12 2008
@@ -129,6 +129,7 @@
int gdm_chooser_widget_get_number_of_items (GdmChooserWidget *widget);
void gdm_chooser_widget_activate_on_one_item (GdmChooserWidget *widget,
gboolean should_activate);
+void gdm_chooser_widget_propagate_pending_key_events (GdmChooserWidget *widget);
G_END_DECLS
Modified: trunk/gui/simple-greeter/gdm-greeter-login-window.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-greeter-login-window.c (original)
+++ trunk/gui/simple-greeter/gdm-greeter-login-window.c Tue Apr 29 03:40:12 2008
@@ -685,6 +685,7 @@
set_sensitive (login_window, TRUE);
set_ready (login_window);
set_focus (GDM_GREETER_LOGIN_WINDOW (login_window));
+ gdm_chooser_widget_propagate_pending_key_events (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser));
}
static void
@@ -835,6 +836,8 @@
set_ready (GDM_GREETER_LOGIN_WINDOW (login_window));
set_focus (GDM_GREETER_LOGIN_WINDOW (login_window));
+ gdm_chooser_widget_propagate_pending_key_events (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser));
+
return TRUE;
}
@@ -860,6 +863,8 @@
set_ready (GDM_GREETER_LOGIN_WINDOW (login_window));
set_focus (GDM_GREETER_LOGIN_WINDOW (login_window));
+ gdm_chooser_widget_propagate_pending_key_events (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser));
+
return TRUE;
}
Modified: trunk/gui/simple-greeter/gdm-scrollable-widget.c
==============================================================================
--- trunk/gui/simple-greeter/gdm-scrollable-widget.c (original)
+++ trunk/gui/simple-greeter/gdm-scrollable-widget.c Tue Apr 29 03:40:12 2008
@@ -55,6 +55,10 @@
GdmScrollableWidgetAnimation *animation;
GtkWidget *invisible_event_sink;
+ guint key_press_signal_id;
+ guint key_release_signal_id;
+
+ GQueue *key_event_queue;
guint child_adjustments_stale : 1;
};
@@ -135,6 +139,15 @@
}
static gboolean
+on_key_event (GdmScrollableWidget *scrollable_widget,
+ GdkEventKey *key_event)
+{
+ g_queue_push_tail (scrollable_widget->priv->key_event_queue,
+ gdk_event_copy ((GdkEvent *)key_event));
+ return FALSE;
+}
+
+static gboolean
gdm_scrollable_redirect_input_to_event_sink (GdmScrollableWidget *scrollable_widget)
{
GdkGrabStatus status;
@@ -152,12 +165,29 @@
return FALSE;
}
+ scrollable_widget->priv->key_press_signal_id =
+ g_signal_connect_swapped (scrollable_widget->priv->invisible_event_sink,
+ "key-press-event", G_CALLBACK (on_key_event),
+ scrollable_widget);
+
+ scrollable_widget->priv->key_release_signal_id =
+ g_signal_connect_swapped (scrollable_widget->priv->invisible_event_sink,
+ "key-release-event", G_CALLBACK (on_key_event),
+ scrollable_widget);
+
return TRUE;
}
static void
gdm_scrollable_unredirect_input (GdmScrollableWidget *scrollable_widget)
{
+ g_signal_handler_disconnect (scrollable_widget->priv->invisible_event_sink,
+ scrollable_widget->priv->key_press_signal_id);
+ scrollable_widget->priv->key_press_signal_id = 0;
+
+ g_signal_handler_disconnect (scrollable_widget->priv->invisible_event_sink,
+ scrollable_widget->priv->key_release_signal_id);
+ scrollable_widget->priv->key_release_signal_id = 0;
gdk_keyboard_ungrab (GDK_CURRENT_TIME);
gdk_pointer_ungrab (GDK_CURRENT_TIME);
}
@@ -426,6 +456,8 @@
scrollable_widget = GDM_SCROLLABLE_WIDGET (object);
+ g_queue_free (scrollable_widget->priv->key_event_queue);
+
G_OBJECT_CLASS (gdm_scrollable_widget_parent_class)->finalize (object);
}
@@ -609,6 +641,8 @@
widget->priv->invisible_event_sink =
gtk_invisible_new_for_screen (gtk_widget_get_screen (GTK_WIDGET (widget)));
gtk_widget_show (widget->priv->invisible_event_sink);
+
+ widget->priv->key_event_queue = g_queue_new ();
}
static void
@@ -699,3 +733,24 @@
gdm_scrollable_widget_animation_start (scrollable_widget->priv->animation);
}
+
+gboolean
+gdm_scrollable_widget_has_queued_key_events (GdmScrollableWidget *widget)
+{
+ g_return_val_if_fail (GDM_IS_SCROLLABLE_WIDGET (widget), FALSE);
+
+ return !g_queue_is_empty (widget->priv->key_event_queue);
+}
+
+void
+gdm_scrollable_widget_replay_queued_key_events (GdmScrollableWidget *widget)
+{
+ GtkWidget *toplevel;
+ GdkEvent *event;
+
+ toplevel = gtk_widget_get_toplevel (GTK_WIDGET (widget));
+
+ while ((event = g_queue_pop_head (widget->priv->key_event_queue)) != NULL) {
+ gtk_propagate_event (toplevel, event);
+ }
+}
Modified: trunk/gui/simple-greeter/gdm-scrollable-widget.h
==============================================================================
--- trunk/gui/simple-greeter/gdm-scrollable-widget.h (original)
+++ trunk/gui/simple-greeter/gdm-scrollable-widget.h Tue Apr 29 03:40:12 2008
@@ -68,4 +68,6 @@
gpointer step_user_data,
GdmScrollableWidgetSlideDoneFunc done_func,
gpointer data);
+gboolean gdm_scrollable_widget_has_queued_key_events (GdmScrollableWidget *widget);
+void gdm_scrollable_widget_replay_queued_key_events (GdmScrollableWidget *widget);
#endif /* __GDM_SCROLLABLE_WIDGET_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]