]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtktipsquery.c
Removed DEFS "+=" mess that breaks recent automakes. INCLUDES is the
[~andy/gtk] / gtk / gtktipsquery.c
index 22fa1b0aa51196d3029b5bee4022741e5a64b726..e54cf5a2506347ab648d99be7bff1c4e029e69bc 100644 (file)
  * Library General Public License for more details.
  *
  * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id$
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
  */
 #include       "gtktipsquery.h"
 #include       "gtksignal.h"
@@ -46,18 +45,6 @@ enum
   SIGNAL_WIDGET_SELECTED,
   SIGNAL_LAST
 };
-typedef        void    (*SignalWidgetEntered)          (GtkObject      *object,
-                                                GtkWidget      *widget,
-                                                const gchar    *tip_text,
-                                                const gchar    *tip_private,
-                                                gpointer        func_data);
-typedef        gint    (*SignalWidgetSelected)         (GtkObject      *object,
-                                                GtkWidget      *widget,
-                                                const gchar    *tip_text,
-                                                const gchar    *tip_private,
-                                                GdkEventButton *event,
-                                                gpointer        func_data);
-
 
 /* --- prototypes --- */
 static void    gtk_tips_query_class_init       (GtkTipsQueryClass      *class);
@@ -65,10 +52,10 @@ static void gtk_tips_query_init             (GtkTipsQuery           *tips_query);
 static void    gtk_tips_query_destroy          (GtkObject              *object);
 static gint    gtk_tips_query_event            (GtkWidget              *widget,
                                                 GdkEvent               *event);
-static void    gtk_tips_query_set_arg          (GtkTipsQuery           *tips_query,
+static void    gtk_tips_query_set_arg          (GtkObject              *object,
                                                 GtkArg                 *arg,
                                                 guint                   arg_id);
-static void    gtk_tips_query_get_arg          (GtkTipsQuery           *tips_query,
+static void    gtk_tips_query_get_arg          (GtkObject              *object,
                                                 GtkArg                 *arg,
                                                 guint                  arg_id);
 static void    gtk_tips_query_real_start_query (GtkTipsQuery           *tips_query);
@@ -81,8 +68,7 @@ static void   gtk_tips_query_widget_entered   (GtkTipsQuery           *tips_query,
 
 /* --- variables --- */
 static GtkLabelClass   *parent_class = NULL;
-static gint             tips_query_signals[SIGNAL_LAST] = { 0 };
-static const gchar     *key_event_mask = "gtk-tips-query-saved-event-mask";
+static guint            tips_query_signals[SIGNAL_LAST] = { 0 };
 
 
 /* --- functions --- */
@@ -100,8 +86,9 @@ gtk_tips_query_get_type (void)
        sizeof (GtkTipsQueryClass),
        (GtkClassInitFunc) gtk_tips_query_class_init,
        (GtkObjectInitFunc) gtk_tips_query_init,
-       (GtkArgSetFunc) gtk_tips_query_set_arg,
-       (GtkArgGetFunc) gtk_tips_query_get_arg,
+        /* reserved_1 */ NULL,
+       /* reserved_2 */ NULL,
+       (GtkClassInitFunc) NULL,
       };
 
       tips_query_type = gtk_type_unique (gtk_label_get_type (), &tips_query_info);
@@ -110,40 +97,6 @@ gtk_tips_query_get_type (void)
   return tips_query_type;
 }
 
-static void
-gtk_tips_query_marshal_widget_entered (GtkObject      *object,
-                                      GtkSignalFunc  func,
-                                      gpointer       func_data,
-                                      GtkArg         *args)
-{
-  SignalWidgetEntered sfunc = (SignalWidgetEntered) func;
-
-  (* sfunc) (object,
-            (GtkWidget*) GTK_VALUE_OBJECT (args[0]),
-            GTK_VALUE_STRING (args[1]),
-            GTK_VALUE_STRING (args[2]),
-            func_data);
-}
-
-static void
-gtk_tips_query_marshal_widget_selected (GtkObject      *object,
-                                       GtkSignalFunc  func,
-                                       gpointer       func_data,
-                                       GtkArg         *args)
-{
-  gint *return_val;
-
-  SignalWidgetSelected sfunc = (SignalWidgetSelected) func;
-  return_val = GTK_RETLOC_BOOL (args[4]);
-  
-  *return_val = (* sfunc) (object,
-                          (GtkWidget*) GTK_VALUE_OBJECT (args[0]),
-                          GTK_VALUE_STRING (args[1]),
-                          GTK_VALUE_STRING (args[2]),
-                          GTK_VALUE_BOXED (args[3]),
-                          func_data);
-}
-
 static void
 gtk_tips_query_class_init (GtkTipsQueryClass *class)
 {
@@ -165,39 +118,42 @@ gtk_tips_query_class_init (GtkTipsQueryClass *class)
                    GTK_RUN_FIRST,
                    object_class->type,
                    GTK_SIGNAL_OFFSET (GtkTipsQueryClass, start_query),
-                   gtk_signal_default_marshaller,
+                   gtk_marshal_NONE__NONE,
                    GTK_TYPE_NONE, 0);
   tips_query_signals[SIGNAL_STOP_QUERY] =
     gtk_signal_new ("stop_query",
                    GTK_RUN_FIRST,
                    object_class->type,
                    GTK_SIGNAL_OFFSET (GtkTipsQueryClass, stop_query),
-                   gtk_signal_default_marshaller,
+                   gtk_marshal_NONE__NONE,
                    GTK_TYPE_NONE, 0);
   tips_query_signals[SIGNAL_WIDGET_ENTERED] =
     gtk_signal_new ("widget_entered",
-                   GTK_RUN_FIRST,
+                   GTK_RUN_LAST,
                    object_class->type,
                    GTK_SIGNAL_OFFSET (GtkTipsQueryClass, widget_entered),
-                   gtk_tips_query_marshal_widget_entered,
+                   gtk_marshal_NONE__POINTER_STRING_STRING,
                    GTK_TYPE_NONE, 3,
                    GTK_TYPE_WIDGET,
                    GTK_TYPE_STRING,
                    GTK_TYPE_STRING);
   tips_query_signals[SIGNAL_WIDGET_SELECTED] =
     gtk_signal_new ("widget_selected",
-                   GTK_RUN_FIRST,
+                   GTK_RUN_LAST,
                    object_class->type,
                    GTK_SIGNAL_OFFSET (GtkTipsQueryClass, widget_selected),
-                   gtk_tips_query_marshal_widget_selected,
-                   GTK_TYPE_INT, 4,
+                   gtk_marshal_BOOL__POINTER_STRING_STRING_POINTER,
+                   GTK_TYPE_BOOL, 4,
                    GTK_TYPE_WIDGET,
                    GTK_TYPE_STRING,
                    GTK_TYPE_STRING,
-                   GTK_TYPE_BOXED);
+                   GTK_TYPE_GDK_EVENT);
   gtk_object_class_add_signals (object_class, tips_query_signals, SIGNAL_LAST);
 
+  object_class->set_arg = gtk_tips_query_set_arg;
+  object_class->get_arg = gtk_tips_query_get_arg;
   object_class->destroy = gtk_tips_query_destroy;
+
   widget_class->event = gtk_tips_query_event;
 
   class->start_query = gtk_tips_query_real_start_query;
@@ -215,16 +171,20 @@ gtk_tips_query_init (GtkTipsQuery *tips_query)
   tips_query->label_no_tip = g_strdup ("--- No Tip ---");
   tips_query->caller = NULL;
   tips_query->last_crossed = NULL;
-  tips_query->event_restore_list = NULL;
+  tips_query->query_cursor = NULL;
 
   gtk_label_set (GTK_LABEL (tips_query), tips_query->label_inactive);
 }
 
 static void
-gtk_tips_query_set_arg (GtkTipsQuery           *tips_query,
+gtk_tips_query_set_arg (GtkObject              *object,
                        GtkArg                 *arg,
                        guint                   arg_id)
 {
+  GtkTipsQuery *tips_query;
+
+  tips_query = GTK_TIPS_QUERY (object);
+
   switch (arg_id)
     {
     case ARG_EMIT_ALWAYS:
@@ -240,16 +200,19 @@ gtk_tips_query_set_arg (GtkTipsQuery           *tips_query,
       gtk_tips_query_set_labels (tips_query, tips_query->label_inactive, GTK_VALUE_STRING (*arg));
       break;
     default:
-      arg->type = GTK_TYPE_INVALID;
       break;
     }
 }
 
 static void
-gtk_tips_query_get_arg (GtkTipsQuery           *tips_query,
-                       GtkArg                 *arg,
+gtk_tips_query_get_arg (GtkObject             *object,
+                       GtkArg                *arg,
                        guint                  arg_id)
 {
+  GtkTipsQuery *tips_query;
+
+  tips_query = GTK_TIPS_QUERY (object);
+
   switch (arg_id)
     {
     case ARG_EMIT_ALWAYS:
@@ -344,6 +307,7 @@ gtk_tips_query_start_query (GtkTipsQuery *tips_query)
   g_return_if_fail (tips_query != NULL);
   g_return_if_fail (GTK_IS_TIPS_QUERY (tips_query));
   g_return_if_fail (tips_query->in_query == FALSE);
+  g_return_if_fail (GTK_WIDGET_REALIZED (tips_query));
 
   tips_query->in_query = TRUE;
   gtk_signal_emit (GTK_OBJECT (tips_query), tips_query_signals[SIGNAL_START_QUERY]);
@@ -360,51 +324,49 @@ gtk_tips_query_stop_query (GtkTipsQuery *tips_query)
   tips_query->in_query = FALSE;
 }
 
-void
+static void
 gtk_tips_query_real_start_query (GtkTipsQuery *tips_query)
 {
+  gint failure;
+  
   g_return_if_fail (tips_query != NULL);
   g_return_if_fail (GTK_IS_TIPS_QUERY (tips_query));
-
+  
+  tips_query->query_cursor = gdk_cursor_new (GDK_QUESTION_ARROW);
+  failure = gdk_pointer_grab (GTK_WIDGET (tips_query)->window,
+                             TRUE,
+                             GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
+                             GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK,
+                             NULL,
+                             tips_query->query_cursor,
+                             GDK_CURRENT_TIME);
+  if (failure)
+    {
+      gdk_cursor_destroy (tips_query->query_cursor);
+      tips_query->query_cursor = NULL;
+    }
   gtk_grab_add (GTK_WIDGET (tips_query));
 }
 
-void
+static void
 gtk_tips_query_real_stop_query (GtkTipsQuery *tips_query)
 {
-  GSList *list;
-
   g_return_if_fail (tips_query != NULL);
   g_return_if_fail (GTK_IS_TIPS_QUERY (tips_query));
   
   gtk_grab_remove (GTK_WIDGET (tips_query));
+  if (tips_query->query_cursor)
+    {
+      gdk_pointer_ungrab (GDK_CURRENT_TIME);
+      gdk_cursor_destroy (tips_query->query_cursor);
+      tips_query->query_cursor = NULL;
+    }
   if (tips_query->last_crossed)
     {
       gtk_widget_unref (tips_query->last_crossed);
       tips_query->last_crossed = NULL;
     }
   
-  list = tips_query->event_restore_list;
-  while (list)
-    {
-      GtkWidget *win_widget;
-      GdkEventMask *event_mask;
-      
-      win_widget = list->data;
-      event_mask = gtk_object_get_data (GTK_OBJECT (win_widget), key_event_mask);
-      if (event_mask)
-       {
-         gtk_object_remove_data (GTK_OBJECT (win_widget), key_event_mask);
-         if (GTK_WIDGET_REALIZED (win_widget))
-           gdk_window_set_events (win_widget->window, *event_mask);
-         g_free (event_mask);
-       }
-      gtk_widget_unref (win_widget);
-      list = list->next;
-    }
-  g_slist_free (tips_query->event_restore_list);
-  tips_query->event_restore_list = NULL;
-
   gtk_label_set (GTK_LABEL (tips_query), tips_query->label_inactive);
 }
 
@@ -488,7 +450,6 @@ gtk_tips_query_event (GtkWidget            *widget,
   event_handled = FALSE;
   switch (event->type)
     {
-      GdkEventMask *event_mask;
       GdkWindow *pointer_window;
       
     case  GDK_LEAVE_NOTIFY:
@@ -499,27 +460,11 @@ gtk_tips_query_event (GtkWidget          *widget,
       event_widget = NULL;
       if (pointer_window)
        gdk_window_get_user_data (pointer_window, (gpointer*) &event_widget);
-      /* fall through */
+      gtk_tips_query_emit_widget_entered (tips_query, event_widget);
+      event_handled = TRUE;
+      break;
+
     case  GDK_ENTER_NOTIFY:
-      if (event_widget)
-       {
-         event_mask = gtk_object_get_data (GTK_OBJECT (event_widget), key_event_mask);
-         if (!event_mask)
-           {
-             event_mask = g_new (GdkEventMask, 1);
-             *event_mask = gdk_window_get_events (event_widget->window);
-             gtk_object_set_data (GTK_OBJECT (event_widget), key_event_mask, event_mask);
-             gdk_window_set_events (event_widget->window,
-                                    *event_mask |
-                                    GDK_BUTTON_PRESS_MASK |
-                                    GDK_BUTTON_RELEASE_MASK |
-                                    GDK_ENTER_NOTIFY_MASK |
-                                    GDK_LEAVE_NOTIFY_MASK);
-             tips_query->event_restore_list =
-               g_slist_prepend (tips_query->event_restore_list, event_widget);
-             gtk_widget_ref (event_widget);
-           }
-       }
       gtk_tips_query_emit_widget_entered (tips_query, event_widget);
       event_handled = TRUE;
       break;