X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b420fb6a37c3aa1c268983925280da7b4d7a2ee7..f77034779a71f8d52796b355ce961b73a6a9c2a2:/src/gtk1/win_gtk.c diff --git a/src/gtk1/win_gtk.c b/src/gtk1/win_gtk.c index 4d925f373c..2ad696189b 100644 --- a/src/gtk1/win_gtk.c +++ b/src/gtk1/win_gtk.c @@ -9,11 +9,13 @@ // Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////// */ -#include "wx/gtk/win_gtk.h" #ifdef __VMS #define gtk_widget_get_child_requisition gtk_widget_get_child_requisitio #define gtk_marshal_NONE__POINTER_POINTER gtk_marshal_NONE__POINTER_POINT #endif + +#include "wx/gtk/setup.h" +#include "wx/gtk/win_gtk.h" #include "gtk/gtksignal.h" #include "gtk/gtkprivate.h" #include "gdk/gdkx.h" @@ -80,8 +82,12 @@ static void gtk_pizza_expose_area (GtkPizza *pizza, gint y, gint width, gint height); +/* unused */ +#if 0 static void gtk_pizza_adjustment_changed (GtkAdjustment *adjustment, GtkPizza *pizza); +#endif + static GdkFilterReturn gtk_pizza_filter (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data); @@ -155,7 +161,7 @@ gtk_pizza_class_init (GtkPizzaClass *klass) widget_class->set_scroll_adjustments_signal = gtk_signal_new ("set_scroll_adjustments", GTK_RUN_LAST, - object_class->type, + GTK_CLASS_TYPE(object_class), GTK_SIGNAL_OFFSET (GtkPizzaClass, set_scroll_adjustments), gtk_marshal_NONE__POINTER_POINTER, GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT); @@ -290,8 +296,10 @@ gtk_pizza_put (GtkPizza *pizza, if (GTK_WIDGET_REALIZED (pizza)) gtk_widget_set_parent_window (widget, pizza->bin_window); +#ifndef __WXGTK20__ /* FIXME? */ if (!IS_ONSCREEN (x, y)) GTK_PRIVATE_SET_FLAG (widget, GTK_IS_OFFSCREEN); +#endif /* if (GTK_WIDGET_REALIZED (pizza)) @@ -424,6 +432,33 @@ gtk_pizza_set_size (GtkPizza *pizza, } } +gint +gtk_pizza_child_resized (GtkPizza *pizza, + GtkWidget *widget) +{ + GtkPizzaChild *child; + GList *children; + + g_return_val_if_fail (pizza != NULL, FALSE); + g_return_val_if_fail (GTK_IS_PIZZA (pizza), FALSE); + g_return_val_if_fail (widget != NULL, FALSE); + + children = pizza->children; + while (children) + { + child = children->data; + children = children->next; + + if (child->widget == widget) + { + return ((child->width == widget->allocation.width) && + (child->height == widget->allocation.height)); + } + } + + return FALSE; +} + static void gtk_pizza_map (GtkWidget *widget) { @@ -445,7 +480,11 @@ gtk_pizza_map (GtkWidget *widget) if ( GTK_WIDGET_VISIBLE (child->widget) && !GTK_WIDGET_MAPPED (child->widget) && +#ifdef __WXGTK20__ + TRUE) +#else !GTK_WIDGET_IS_OFFSCREEN (child->widget)) +#endif { gtk_widget_map (child->widget); } @@ -563,19 +602,19 @@ gtk_pizza_realize (GtkWidget *widget) static void gtk_pizza_unrealize (GtkWidget *widget) { - GtkPizza *pizza; + GtkPizza *pizza; - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_PIZZA (widget)); + g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_PIZZA (widget)); - pizza = GTK_PIZZA (widget); + pizza = GTK_PIZZA (widget); - gdk_window_set_user_data (pizza->bin_window, NULL); - gdk_window_destroy (pizza->bin_window); - pizza->bin_window = NULL; + gdk_window_set_user_data (pizza->bin_window, NULL); + gdk_window_destroy (pizza->bin_window); + pizza->bin_window = NULL; - if (GTK_WIDGET_CLASS (parent_class)->unrealize) - (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); + if (GTK_WIDGET_CLASS (parent_class)->unrealize) + (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); } static void @@ -712,7 +751,7 @@ gtk_pizza_expose (GtkWidget *widget, /* Sometimes, We handle all expose events in window.cpp now. */ if (pizza->external_expose) - return; + return FALSE; if (event->window != pizza->bin_window) return FALSE; @@ -780,7 +819,9 @@ gtk_pizza_remove (GtkContainer *container, /* security checks */ g_return_if_fail (GTK_IS_WIDGET (widget)); +#ifndef __WXGTK20__ GTK_PRIVATE_UNSET_FLAG (widget, GTK_IS_OFFSCREEN); +#endif break; } @@ -838,13 +879,17 @@ gtk_pizza_position_child (GtkPizza *pizza, gtk_widget_map (child->widget); } +#ifndef __WXGTK20__ if (GTK_WIDGET_IS_OFFSCREEN (child->widget)) GTK_PRIVATE_UNSET_FLAG (child->widget, GTK_IS_OFFSCREEN); +#endif } else { +#ifndef __WXGTK20__ if (!GTK_WIDGET_IS_OFFSCREEN (child->widget)) GTK_PRIVATE_SET_FLAG (child->widget, GTK_IS_OFFSCREEN); +#endif if (GTK_WIDGET_MAPPED (child->widget)) gtk_widget_unmap (child->widget); @@ -965,12 +1010,12 @@ gtk_pizza_expose_predicate (Display *display, XEvent *xevent, XPointer arg) { - if ((xevent->type == Expose) || - ((xevent->xany.window == *(Window *)arg) && + if ((xevent->type == Expose) || + ((xevent->xany.window == *(Window *)arg) && (xevent->type == ConfigureNotify))) - return True; - else - return False; + return True; + else + return False; } /* This is the main routine to do the scrolling. Scrolling is @@ -988,40 +1033,40 @@ gtk_pizza_expose_predicate (Display *display, void gtk_pizza_scroll (GtkPizza *pizza, gint dx, gint dy) { - GtkWidget *widget; - XEvent xevent; + GtkWidget *widget; + XEvent xevent; - gint x,y,w,h,border; + gint x,y,w,h,border; - widget = GTK_WIDGET (pizza); + widget = GTK_WIDGET (pizza); - pizza->xoffset += dx; - pizza->yoffset += dy; + pizza->xoffset += dx; + pizza->yoffset += dy; - if (!GTK_WIDGET_MAPPED (pizza)) + if (!GTK_WIDGET_MAPPED (pizza)) { - gtk_pizza_position_children (pizza); - return; + gtk_pizza_position_children (pizza); + return; } - gtk_pizza_adjust_allocations (pizza, -dx, -dy); + gtk_pizza_adjust_allocations (pizza, -dx, -dy); - if (pizza->shadow_type == GTK_MYSHADOW_NONE) - border = 0; - else - if (pizza->shadow_type == GTK_MYSHADOW_THIN) - border = 1; - else - border = 2; + if (pizza->shadow_type == GTK_MYSHADOW_NONE) + border = 0; + else + if (pizza->shadow_type == GTK_MYSHADOW_THIN) + border = 1; + else + border = 2; - x = 0; - y = 0; - w = widget->allocation.width - 2*border; - h = widget->allocation.height - 2*border; + x = 0; + y = 0; + w = widget->allocation.width - 2*border; + h = widget->allocation.height - 2*border; - if (dx > 0) + if (dx > 0) { - if (gravity_works) + if (gravity_works) { gdk_window_resize (pizza->bin_window, w + dx, @@ -1029,20 +1074,14 @@ gtk_pizza_scroll (GtkPizza *pizza, gint dx, gint dy) gdk_window_move (pizza->bin_window, x-dx, y); gdk_window_move_resize (pizza->bin_window, x, y, w, h ); } - else + else { /* FIXME */ } - - gtk_pizza_expose_area (pizza, - MAX ((gint)w - dx, 0), - 0, - MIN (dx, w), - h); } - else if (dx < 0) + else if (dx < 0) { - if (gravity_works) + if (gravity_works) { gdk_window_move_resize (pizza->bin_window, x + dx, @@ -1052,102 +1091,73 @@ gtk_pizza_scroll (GtkPizza *pizza, gint dx, gint dy) gdk_window_move (pizza->bin_window, x, y); gdk_window_resize (pizza->bin_window, w, h ); } - else + else { /* FIXME */ } - - gtk_pizza_expose_area (pizza, - 0, - 0, - MIN (-dx, w), - h); } - if (dy > 0) + if (dy > 0) { - if (gravity_works) + if (gravity_works) { gdk_window_resize (pizza->bin_window, w, h + dy); gdk_window_move (pizza->bin_window, x, y-dy); gdk_window_move_resize (pizza->bin_window, x, y, w, h ); } - else + else { /* FIXME */ } - - gtk_pizza_expose_area (pizza, - 0, - MAX ((gint)h - dy, 0), - w, - MIN (dy, h)); } - else if (dy < 0) + else if (dy < 0) { - if (gravity_works) + if (gravity_works) { gdk_window_move_resize (pizza->bin_window, x, y+dy, w, h - dy ); gdk_window_move (pizza->bin_window, x, y); gdk_window_resize (pizza->bin_window, w, h ); } - else + else { /* FIXME */ } - gtk_pizza_expose_area (pizza, - 0, - 0, - w, - MIN (-dy, (gint)h)); } - gtk_pizza_position_children (pizza); - - /* We have to make sure that all exposes from this scroll get - * processed before we scroll again, or the expose events will - * have invalid coordinates. - * - * We also do expose events for other windows, since otherwise - * their updating will fall behind the scrolling - * - * This also avoids a problem in pre-1.0 GTK where filters don't - * have access to configure events that were compressed. - */ - - gdk_flush(); - while (XCheckIfEvent(GDK_WINDOW_XDISPLAY (pizza->bin_window), - &xevent, - gtk_pizza_expose_predicate, - (XPointer)&GDK_WINDOW_XWINDOW (pizza->bin_window))) + gtk_pizza_position_children (pizza); + + gdk_flush(); + while (XCheckIfEvent(GDK_WINDOW_XDISPLAY (pizza->bin_window), + &xevent, + gtk_pizza_expose_predicate, + (XPointer)&GDK_WINDOW_XWINDOW (pizza->bin_window))) { - GdkEvent event; - GtkWidget *event_widget; + GdkEvent event; + GtkWidget *event_widget; - if ((xevent.xany.window == GDK_WINDOW_XWINDOW (pizza->bin_window)) && - (gtk_pizza_filter (&xevent, &event, pizza) == GDK_FILTER_REMOVE)) - continue; + if ((xevent.xany.window == GDK_WINDOW_XWINDOW (pizza->bin_window)) ) + gtk_pizza_filter (&xevent, &event, pizza); - if (xevent.type == Expose) + if (xevent.type == Expose) { - event.expose.window = gdk_window_lookup (xevent.xany.window); - gdk_window_get_user_data (event.expose.window, + event.expose.window = gdk_window_lookup (xevent.xany.window); + gdk_window_get_user_data (event.expose.window, (gpointer *)&event_widget); - if (event_widget) + if (event_widget) { - event.expose.type = GDK_EXPOSE; - event.expose.area.x = xevent.xexpose.x; - event.expose.area.y = xevent.xexpose.y; - event.expose.area.width = xevent.xexpose.width; - event.expose.area.height = xevent.xexpose.height; - event.expose.count = xevent.xexpose.count; - - gdk_window_ref (event.expose.window); - gtk_widget_event (event_widget, &event); - gdk_window_unref (event.expose.window); + event.expose.type = GDK_EXPOSE; + event.expose.area.x = xevent.xexpose.x; + event.expose.area.y = xevent.xexpose.y; + event.expose.area.width = xevent.xexpose.width; + event.expose.area.height = xevent.xexpose.height; + event.expose.count = xevent.xexpose.count; + + gdk_window_ref (event.expose.window); + gtk_widget_event (event_widget, &event); + gdk_window_unref (event.expose.window); } } } @@ -1178,25 +1188,17 @@ gtk_pizza_filter (GdkXEvent *gdk_xevent, if (!pizza->use_filter) return GDK_FILTER_CONTINUE; - switch (xevent->type) + switch (xevent->type) { case Expose: if (xevent->xexpose.serial == pizza->configure_serial) { - if (pizza->visibility == GDK_VISIBILITY_UNOBSCURED) - return GDK_FILTER_REMOVE; - else - { - xevent->xexpose.x += pizza->scroll_x; - xevent->xexpose.y += pizza->scroll_y; - - break; - } + xevent->xexpose.x += pizza->scroll_x; + xevent->xexpose.y += pizza->scroll_y; } break; case ConfigureNotify: - if ((xevent->xconfigure.x != 0) || (xevent->xconfigure.y != 0)) { pizza->configure_serial = xevent->xconfigure.serial; pizza->scroll_x = xevent->xconfigure.x; @@ -1250,8 +1252,6 @@ gtk_pizza_main_filter (GdkXEvent *gdk_xevent, } - - #ifdef __cplusplus } #endif /* __cplusplus */