[gnome-shell] ShellButtonBox: Use default handlers, not self-connections



commit 0e3cea41e0aa75b3e9603429215009f65d61144d
Author: Owen W. Taylor <otaylor fishsoup net>
Date:   Sat Aug 29 12:31:15 2009 -0400

    ShellButtonBox: Use default handlers, not self-connections
    
    There's seldom a good justification for connecting to signals on
    yourself rather than using the default handler slots in the class.
    
    But in particular using the default handler slots means that
    an application can connect to ::button-press-event and get in
    before the default handling, to implement a button that does
    something on press.
    
    http://bugzilla.gnome.org/show_bug.cgi?id=593503

 src/shell-button-box.c |   52 +++++++++++++++++++++++------------------------
 1 files changed, 25 insertions(+), 27 deletions(-)
---
diff --git a/src/shell-button-box.c b/src/shell-button-box.c
index 25808a4..56dd944 100644
--- a/src/shell-button-box.c
+++ b/src/shell-button-box.c
@@ -79,13 +79,14 @@ shell_button_box_contains (ShellButtonBox     *box,
 }
 
 static gboolean
-shell_button_box_on_enter (ShellButtonBox     *box,
-                           ClutterEvent       *event,
-                           gpointer            user_data)
+shell_button_box_enter_event (ClutterActor         *actor,
+                              ClutterCrossingEvent *event)
 {
-  if (shell_button_box_contains (box, event->crossing.related))
+  ShellButtonBox *box = SHELL_BUTTON_BOX (actor);
+
+  if (shell_button_box_contains (box, event->related))
     return TRUE;
-  if (!shell_button_box_contains (box, clutter_event_get_source (event)))
+  if (!shell_button_box_contains (box, event->source))
     return TRUE;
 
   set_hover (box, TRUE);
@@ -96,11 +97,12 @@ shell_button_box_on_enter (ShellButtonBox     *box,
 }
 
 static gboolean
-shell_button_box_on_leave (ShellButtonBox     *box,
-                           ClutterEvent       *event,
-                           gpointer            user_data)
+shell_button_box_leave_event (ClutterActor         *actor,
+                              ClutterCrossingEvent *event)
 {
-  if (shell_button_box_contains (box, event->crossing.related))
+  ShellButtonBox *box = SHELL_BUTTON_BOX (actor);
+
+  if (shell_button_box_contains (box, event->related))
     return TRUE;
 
   set_hover (box, FALSE);
@@ -110,17 +112,15 @@ shell_button_box_on_leave (ShellButtonBox     *box,
 }
 
 static gboolean
-shell_button_box_on_press (ShellButtonBox     *box,
-                           ClutterEvent       *event,
-                           gpointer            user_data)
+shell_button_box_button_press_event (ClutterActor       *actor,
+                                     ClutterButtonEvent *event)
 {
-  ClutterActor *source;
+  ShellButtonBox *box = SHELL_BUTTON_BOX (actor);
 
   if (box->priv->held)
     return TRUE;
 
-  source = clutter_event_get_source (event);
-  if (!shell_button_box_contains (box, source))
+  if (!shell_button_box_contains (box, event->source))
     return FALSE;
 
   box->priv->held = TRUE;
@@ -132,21 +132,18 @@ shell_button_box_on_press (ShellButtonBox     *box,
 }
 
 static gboolean
-shell_button_box_on_release (ShellButtonBox     *box,
-                             ClutterEvent       *event,
-                             gpointer            user_data)
+shell_button_box_button_release_event (ClutterActor       *actor,
+                                       ClutterButtonEvent *event)
 {
-  ClutterActor *source;
+  ShellButtonBox *box = SHELL_BUTTON_BOX (actor);
 
   if (!box->priv->held)
     return TRUE;
 
-  source = clutter_event_get_source (event);
-
   box->priv->held = FALSE;
   clutter_ungrab_pointer ();
 
-  if (!shell_button_box_contains (box, source))
+  if (!shell_button_box_contains (box, event->source))
     return FALSE;
 
   set_pressed (box, FALSE);
@@ -204,10 +201,16 @@ static void
 shell_button_box_class_init (ShellButtonBoxClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
 
   gobject_class->get_property = shell_button_box_get_property;
   gobject_class->set_property = shell_button_box_set_property;
 
+  actor_class->enter_event = shell_button_box_enter_event;
+  actor_class->leave_event = shell_button_box_leave_event;
+  actor_class->button_press_event = shell_button_box_button_press_event;
+  actor_class->button_release_event = shell_button_box_button_release_event;
+
   /**
    * ShellButtonBox::activate
    * @box: The #ShellButtonBox
@@ -275,9 +278,4 @@ shell_button_box_init (ShellButtonBox *self)
 {
   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, SHELL_TYPE_BUTTON_BOX,
                                             ShellButtonBoxPrivate);
-
-  g_signal_connect (G_OBJECT (self), "enter-event", G_CALLBACK(shell_button_box_on_enter), NULL);
-  g_signal_connect (G_OBJECT (self), "leave-event", G_CALLBACK(shell_button_box_on_leave), NULL);
-  g_signal_connect (G_OBJECT (self), "button-press-event", G_CALLBACK(shell_button_box_on_press), NULL);
-  g_signal_connect (G_OBJECT (self), "button-release-event", G_CALLBACK(shell_button_box_on_release), NULL);
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]