]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/win_gtk.c
For consistency with other ports, send TEXT event after SELECTED event
[wxWidgets.git] / src / gtk / win_gtk.c
index 27e2d156bb50c6ce4a580f9e999e70e88e94cfdf..44222ba55c5b2c39ded0ce126bd129c4a456cfd5 100644 (file)
@@ -1,12 +1,12 @@
 /* ///////////////////////////////////////////////////////////////////////////
 // Name:        win_gtk.c
-// Purpose:     Native GTK+ widget for wxWindows, based on GtkLayout and
+// Purpose:     Native GTK+ widget for wxWidgets, based on GtkLayout and
 //              GtkFixed. It makes use of the gravity window property and
 //              therefore does not work with GTK 1.0.
 // Author:      Robert Roebling
 // Id:          $Id$
 // Copyright:   (c) 1998 Robert Roebling
-// Licence:     wxWindows licence
+// Licence:     wxWidgets licence
 /////////////////////////////////////////////////////////////////////////// */
 
 #ifdef VMS
@@ -60,6 +60,8 @@ static void gtk_pizza_draw          (GtkWidget        *widget,
 #endif /* __WXGTK20__ */
 static gint gtk_pizza_expose        (GtkWidget        *widget,
                                      GdkEventExpose   *event);
+static void gtk_pizza_style_set     (GtkWidget *widget,
+                                     GtkStyle  *previous_style);
 static void gtk_pizza_add           (GtkContainer     *container,
                                      GtkWidget        *widget);
 static void gtk_pizza_remove        (GtkContainer     *container,
@@ -68,7 +70,7 @@ static void gtk_pizza_forall        (GtkContainer     *container,
                                      gboolean          include_internals,
                                      GtkCallback       callback,
                                      gpointer          callback_data);
-                                     
+
 static void     gtk_pizza_allocate_child     (GtkPizza      *pizza,
                                               GtkPizzaChild *child);
 static void     gtk_pizza_adjust_allocations_recurse (GtkWidget *widget,
@@ -100,16 +102,18 @@ static void  gtk_pizza_scroll_set_adjustments (GtkPizza      *pizza,
 static GtkContainerClass *pizza_parent_class = NULL;
 #endif
 
+#ifndef __WXGTK20__
 static gboolean gravity_works;
+#endif
 
-guint
+GtkType
 gtk_pizza_get_type ()
 {
-    static guint pizza_type = 0;
+    static GtkType pizza_type = 0;
 
     if (!pizza_type)
     {
-    
+
 #ifdef __WXGTK20__
         static const GTypeInfo pizza_info =
         {
@@ -123,7 +127,7 @@ gtk_pizza_get_type ()
             16,             /* n_preallocs */
             (GInstanceInitFunc) gtk_pizza_init,
         };
-        pizza_type = g_type_register_static (GTK_TYPE_CONTAINER, "GtkPizza", &pizza_info, 0);
+        pizza_type = g_type_register_static (GTK_TYPE_CONTAINER, "GtkPizza", &pizza_info, (GTypeFlags)0);
 #else
         GtkTypeInfo pizza_info =
         {
@@ -143,6 +147,47 @@ gtk_pizza_get_type ()
     return pizza_type;
 }
 
+#ifdef __WXGTK20__
+/* Marshaller needed for set_scroll_adjustments signal,
+   generated with GLib-2.4.6 glib-genmarshal */
+#define g_marshal_value_peek_object(v)   g_value_get_object (v)
+static void
+g_cclosure_user_marshal_VOID__OBJECT_OBJECT (GClosure     *closure,
+                                             GValue       *return_value,
+                                             guint         n_param_values,
+                                             const GValue *param_values,
+                                             gpointer      invocation_hint,
+                                             gpointer      marshal_data)
+{
+  typedef void (*GMarshalFunc_VOID__OBJECT_OBJECT) (gpointer     data1,
+                                                    gpointer     arg_1,
+                                                    gpointer     arg_2,
+                                                    gpointer     data2);
+  register GMarshalFunc_VOID__OBJECT_OBJECT callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+
+  g_return_if_fail (n_param_values == 3);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_VOID__OBJECT_OBJECT) (marshal_data ? marshal_data : cc->callback);
+
+  callback (data1,
+            g_marshal_value_peek_object (param_values + 1),
+            g_marshal_value_peek_object (param_values + 2),
+            data2);
+}
+#endif /* __WXGTK20__ */
+
 static void
 gtk_pizza_class_init (GtkPizzaClass *klass)
 {
@@ -164,6 +209,7 @@ gtk_pizza_class_init (GtkPizzaClass *klass)
     widget_class->draw = gtk_pizza_draw;
 #endif
     widget_class->expose_event = gtk_pizza_expose;
+    widget_class->style_set = gtk_pizza_style_set;
 
     container_class->add = gtk_pizza_add;
     container_class->remove = gtk_pizza_remove;
@@ -174,16 +220,27 @@ gtk_pizza_class_init (GtkPizzaClass *klass)
     klass->set_scroll_adjustments = gtk_pizza_scroll_set_adjustments;
 
     widget_class->set_scroll_adjustments_signal =
-    gtk_signal_new ("set_scroll_adjustments",
-                    GTK_RUN_LAST,
 #ifdef __WXGTK20__
-                    GTK_CLASS_TYPE(object_class),
+        g_signal_new(
+            "set_scroll_adjustments",
+            G_TYPE_FROM_CLASS(object_class),
+            G_SIGNAL_RUN_LAST,
+            G_STRUCT_OFFSET(GtkPizzaClass, set_scroll_adjustments),
+            NULL,
+            NULL,
+            g_cclosure_user_marshal_VOID__OBJECT_OBJECT,
+            G_TYPE_NONE,
+            2,
+            GTK_TYPE_ADJUSTMENT,
+            GTK_TYPE_ADJUSTMENT);
 #else
+    gtk_signal_new ("set_scroll_adjustments",
+                    GTK_RUN_LAST,
                     object_class->type,
-#endif
                     GTK_SIGNAL_OFFSET (GtkPizzaClass, set_scroll_adjustments),
                     gtk_marshal_NONE__POINTER_POINTER,
                     GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
+#endif /* __WXGTK20__ */
 }
 
 static GtkType
@@ -310,11 +367,11 @@ gtk_pizza_put (GtkPizza   *pizza,
 
     pizza->children = g_list_append (pizza->children, child_info);
 
-    gtk_widget_set_parent (widget, GTK_WIDGET (pizza));
-
     if (GTK_WIDGET_REALIZED (pizza))
       gtk_widget_set_parent_window (widget, pizza->bin_window);
 
+    gtk_widget_set_parent (widget, GTK_WIDGET (pizza));
+
 #ifndef __WXGTK20__ /* FIXME? */
     if (!IS_ONSCREEN (x, y))
        GTK_PRIVATE_SET_FLAG (widget, GTK_IS_OFFSCREEN);
@@ -349,7 +406,7 @@ gtk_pizza_move (GtkPizza     *pizza,
 
             child->x = x;
             child->y = y;
-            
+
             if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (pizza))
                 gtk_widget_queue_resize (widget);
             break;
@@ -587,7 +644,7 @@ gtk_pizza_realize (GtkWidget *widget)
     widget->style = gtk_style_attach (widget->style, widget->window);
     gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
     gtk_style_set_background (widget->style, pizza->bin_window, GTK_STATE_NORMAL );
-    
+
 /*
     gdk_window_set_back_pixmap( widget->window, NULL, FALSE );
     gdk_window_set_back_pixmap( pizza->bin_window, NULL, FALSE );
@@ -597,10 +654,10 @@ gtk_pizza_realize (GtkWidget *widget)
     /* add filters for intercepting visibility and expose events */
     gdk_window_add_filter (widget->window, gtk_pizza_main_filter, pizza);
     gdk_window_add_filter (pizza->bin_window, gtk_pizza_filter, pizza);
-#endif
 
     /* we NEED gravity or we'll give up */
     gravity_works = gdk_window_set_static_gravities (pizza->bin_window, TRUE);
+#endif // !__WXGTK20__
 
     /* cannot be done before realisation */
     children = pizza->children;
@@ -781,9 +838,9 @@ gtk_pizza_expose (GtkWidget      *widget,
 #ifdef __WXGTK20__
 
     (* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, event);
-    
+
     return FALSE;
-    
+
 #else
 
     children = pizza->children;
@@ -801,12 +858,24 @@ gtk_pizza_expose (GtkWidget      *widget,
             gtk_widget_event (child->widget, (GdkEvent*) &child_event);
         }
     }
-    
+
     return TRUE;
-    
+
 #endif
 }
 
+static void
+gtk_pizza_style_set(GtkWidget *widget, GtkStyle  *previous_style)
+{
+    if (GTK_WIDGET_REALIZED(widget))
+    {
+        gtk_style_set_background(widget->style, widget->window, GTK_STATE_NORMAL);
+        gtk_style_set_background(widget->style, GTK_PIZZA(widget)->bin_window, GTK_STATE_NORMAL );
+    }
+
+    (* GTK_WIDGET_CLASS (pizza_parent_class)->style_set) (widget, previous_style);
+}
+
 static void
 gtk_pizza_add (GtkContainer *container,
                GtkWidget    *widget)
@@ -1037,7 +1106,7 @@ gtk_pizza_scroll (GtkPizza *pizza, gint dx, gint dy)
 
     if (pizza->bin_window)
         gdk_window_scroll( pizza->bin_window, -dx, -dy );
-#else
+#else // !__WXGTK20__
     GtkWidget *widget;
     XEvent xevent;
     XID win;
@@ -1169,7 +1238,7 @@ gtk_pizza_scroll (GtkPizza *pizza, gint dx, gint dy)
             }
         }
     }
-#endif /* __WXGTK20__ */
+#endif /* __WXGTK20__/!__WXGTK20__ */
 }