gdm r6178 - in trunk: . gui/simple-greeter



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]