X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3fc6e5fa23909c701654001a895f2ba95751e0af..76471ff7f52b9b579b699e53e7811d22f12bff89:/src/gtk1/win_gtk.c diff --git a/src/gtk1/win_gtk.c b/src/gtk1/win_gtk.c index 27e2d156bb..44222ba55c 100644 --- a/src/gtk1/win_gtk.c +++ b/src/gtk1/win_gtk.c @@ -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__ */ }