X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a31bb9442581e64799025a86153a0af9aec5317c..35a7f94b940c450206190b7ca2fe4135f006c46c:/src/gtk/win_gtk.c?ds=sidebyside diff --git a/src/gtk/win_gtk.c b/src/gtk/win_gtk.c index 8d31fb8675..4f396aafd1 100644 --- a/src/gtk/win_gtk.c +++ b/src/gtk/win_gtk.c @@ -20,8 +20,26 @@ extern "C" { #endif /* __cplusplus */ +typedef struct _GtkPizzaChild GtkPizzaChild; +typedef struct _GtkPizzaClass GtkPizzaClass; typedef struct _GtkPizzaAdjData GtkPizzaAdjData; +struct _GtkPizzaClass +{ + GtkContainerClass parent_class; + + void (*set_scroll_adjustments) (GtkPizza *pizza, + GtkAdjustment *hadjustment, + GtkAdjustment *vadjustment); +}; + +struct _GtkPizzaChild +{ + GtkWidget *widget; + gint x; + gint y; +}; + struct _GtkPizzaAdjData { gint dx; @@ -40,8 +58,6 @@ static void gtk_pizza_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_pizza_size_allocate (GtkWidget *widget, GtkAllocation *allocation); -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, @@ -55,8 +71,6 @@ static void gtk_pizza_forall (GtkContainer *container, static void gtk_pizza_allocate_child (GtkPizza *pizza, GtkPizzaChild *child); -static void gtk_pizza_adjust_allocations_recurse (GtkWidget *widget, - gpointer cb_data); static GtkType gtk_pizza_child_type (GtkContainer *container); @@ -64,8 +78,7 @@ static void gtk_pizza_scroll_set_adjustments (GtkPizza *pizza, GtkAdjustment *hadj, GtkAdjustment *vadj); -/* static */ -GtkContainerClass *pizza_parent_class = NULL; +static GtkWidgetClass* pizza_parent_class; GtkType gtk_pizza_get_type () @@ -74,7 +87,7 @@ gtk_pizza_get_type () if (!pizza_type) { - static const GTypeInfo pizza_info = + const GTypeInfo pizza_info = { sizeof (GtkPizzaClass), NULL, /* base_init */ @@ -85,6 +98,7 @@ gtk_pizza_get_type () sizeof (GtkPizza), 16, /* n_preallocs */ (GInstanceInitFunc) gtk_pizza_init, + NULL }; pizza_type = g_type_register_static (GTK_TYPE_CONTAINER, "GtkPizza", &pizza_info, (GTypeFlags)0); } @@ -148,7 +162,6 @@ gtk_pizza_class_init (GtkPizzaClass *klass) widget_class->unrealize = gtk_pizza_unrealize; widget_class->size_request = gtk_pizza_size_request; widget_class->size_allocate = gtk_pizza_size_allocate; - widget_class->expose_event = gtk_pizza_expose; widget_class->style_set = gtk_pizza_style_set; container_class->add = gtk_pizza_add; @@ -183,21 +196,15 @@ gtk_pizza_child_type (GtkContainer *container) static void gtk_pizza_init (GtkPizza *pizza) { + GTK_WIDGET_SET_FLAGS (pizza, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (pizza, GTK_NO_WINDOW); - pizza->shadow_type = GTK_MYSHADOW_NONE; - pizza->children = NULL; - pizza->m_width = 20; - pizza->m_height = 20; - pizza->bin_window = NULL; pizza->m_xoffset = 0; pizza->m_yoffset = 0; - - pizza->external_expose = FALSE; } GtkWidget* @@ -206,24 +213,22 @@ gtk_pizza_new () GtkPizza *pizza; pizza = g_object_new (gtk_pizza_get_type (), NULL); + + pizza->m_noscroll = FALSE; return GTK_WIDGET (pizza); } -gint gtk_pizza_get_width (GtkPizza *pizza) +GtkWidget* +gtk_pizza_new_no_scroll () { - g_return_val_if_fail ( (pizza != NULL), -1 ); - g_return_val_if_fail ( (GTK_IS_PIZZA (pizza)), -1 ); + GtkPizza *pizza; - return pizza->m_width; -} + pizza = g_object_new (gtk_pizza_get_type (), NULL); -gint gtk_pizza_get_height (GtkPizza *pizza) -{ - g_return_val_if_fail ( (pizza != NULL), -1 ); - g_return_val_if_fail ( (GTK_IS_PIZZA (pizza)), -1 ); + pizza->m_noscroll = TRUE; - return pizza->m_height; + return GTK_WIDGET (pizza); } gint gtk_pizza_get_xoffset (GtkPizza *pizza) @@ -260,41 +265,27 @@ void gtk_pizza_set_yoffset (GtkPizza *pizza, gint yoffset) // do something } -static void -gtk_pizza_scroll_set_adjustments (GtkPizza *pizza, - GtkAdjustment *hadj, - GtkAdjustment *vadj) +gint gtk_pizza_get_rtl_offset (GtkPizza *pizza) { - /* We handle scrolling in the wxScrolledWindow, not here. */ -} + gint border; -void -gtk_pizza_set_shadow_type (GtkPizza *pizza, - GtkMyShadowType type) -{ - g_return_if_fail (pizza != NULL); - g_return_if_fail (GTK_IS_PIZZA (pizza)); + g_return_val_if_fail ( (pizza != NULL), 0 ); + g_return_val_if_fail ( (GTK_IS_PIZZA (pizza)), 0 ); - if (pizza->shadow_type != type) - { - pizza->shadow_type = type; + if (!pizza->bin_window) return 0; - if (GTK_WIDGET_VISIBLE (pizza)) - { - gtk_widget_size_allocate (GTK_WIDGET (pizza), &(GTK_WIDGET (pizza)->allocation)); - gtk_widget_queue_draw (GTK_WIDGET (pizza)); - } - } + border = pizza->container.border_width; + + return GTK_WIDGET(pizza)->allocation.width - border*2; } -void -gtk_pizza_set_external (GtkPizza *pizza, - gboolean expose) -{ - g_return_if_fail (pizza != NULL); - g_return_if_fail (GTK_IS_PIZZA (pizza)); - pizza->external_expose = expose; +static void +gtk_pizza_scroll_set_adjustments (GtkPizza *pizza, + GtkAdjustment *hadj, + GtkAdjustment *vadj) +{ + /* We handle scrolling in the wxScrolledWindow, not here. */ } void @@ -316,17 +307,17 @@ gtk_pizza_put (GtkPizza *pizza, child_info->widget = widget; child_info->x = x; child_info->y = y; - child_info->width = width; - child_info->height = height; pizza->children = g_list_append (pizza->children, child_info); if (GTK_WIDGET_REALIZED (pizza)) - gtk_widget_set_parent_window (widget, pizza->bin_window); + gtk_widget_set_parent_window (widget, pizza->bin_window); gtk_widget_set_parent (widget, GTK_WIDGET (pizza)); - gtk_widget_set_size_request (widget, width, height); + gtk_widget_set_size_request( widget, width, height ); + if (GTK_WIDGET_REALIZED (pizza)) + gtk_pizza_allocate_child (pizza, child_info); } void @@ -362,15 +353,12 @@ gtk_pizza_set_size (GtkPizza *pizza, if (child->widget == widget) { - if ((child->x == x) && - (child->y == y) && - (child->width == width) && - (child->height == height)) return; - - child->x = x; - child->y = y; - child->width = width; - child->height = height; + if (child->x != x || child->y != y) + { + child->x = x; + child->y = y; + gtk_widget_queue_resize(widget); + } gtk_widget_set_size_request (widget, width, height); @@ -417,6 +405,8 @@ gtk_pizza_realize (GtkWidget *widget) gint attributes_mask; GtkPizzaChild *child; GList *children; + int border; + int w, h; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_PIZZA (widget)); @@ -431,34 +421,24 @@ gtk_pizza_realize (GtkWidget *widget) attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; -#ifndef __WXUNIVERSAL__ - if (pizza->shadow_type == GTK_MYSHADOW_NONE) - { - /* no border, no changes to sizes */ - } - else if (pizza->shadow_type == GTK_MYSHADOW_THIN) - { - /* GTK_MYSHADOW_THIN == wxSIMPLE_BORDER */ - attributes.x += 1; - attributes.y += 1; - attributes.width -= 2; - attributes.height -= 2; - } - else - { - /* GTK_MYSHADOW_IN == wxSUNKEN_BORDER */ - /* GTK_MYSHADOW_OUT == wxRAISED_BORDER */ - attributes.x += 2; - attributes.y += 2; - attributes.width -= 4; - attributes.height -= 4; - } -#endif /* __WXUNIVERSAL__ */ - /* minimal size */ if (attributes.width < 2) attributes.width = 2; if (attributes.height < 2) attributes.height = 2; + border = pizza->container.border_width; + w = attributes.width - 2 * border; + h = attributes.height - 2 * border; + if (w < 2) w = 2; + if (h < 2) h = 2; + + if (!pizza->m_noscroll) + { + attributes.x += border; + attributes.y += border; + attributes.width = w; + attributes.height = h; + } + attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); @@ -471,6 +451,13 @@ gtk_pizza_realize (GtkWidget *widget) attributes.x = 0; attributes.y = 0; + if (pizza->m_noscroll) + { + attributes.x = border; + attributes.y = border; + attributes.width = w; + attributes.height = h; + } attributes.event_mask = gtk_widget_get_events (widget); attributes.event_mask |= GDK_EXPOSURE_MASK | @@ -527,8 +514,8 @@ gtk_pizza_unrealize (GtkWidget *widget) gdk_window_destroy (pizza->bin_window); pizza->bin_window = NULL; - if (GTK_WIDGET_CLASS (pizza_parent_class)->unrealize) - (* GTK_WIDGET_CLASS (pizza_parent_class)->unrealize) (widget); + if (pizza_parent_class->unrealize) + pizza_parent_class->unrealize(widget); } static void @@ -573,6 +560,7 @@ gtk_pizza_size_allocate (GtkWidget *widget, gint x,y,w,h; GtkPizzaChild *child; GList *children; + gboolean only_resize; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_PIZZA(widget)); @@ -580,29 +568,42 @@ gtk_pizza_size_allocate (GtkWidget *widget, pizza = GTK_PIZZA (widget); + only_resize = ((widget->allocation.x == allocation->x) && + (widget->allocation.y == allocation->y)); widget->allocation = *allocation; - if (pizza->shadow_type == GTK_MYSHADOW_NONE) - border = 0; - else - if (pizza->shadow_type == GTK_MYSHADOW_THIN) - border = 1; - else - border = 2; - - x = allocation->x + border; - y = allocation->y + border; - w = allocation->width - border*2; - h = allocation->height - border*2; - if (w < 0) - w = 0; - if (h < 0) - h = 0; - - if (GTK_WIDGET_REALIZED (widget)) + if (GTK_WIDGET_REALIZED(widget)) { - gdk_window_move_resize( widget->window, x, y, w, h ); - gdk_window_move_resize( pizza->bin_window, 0, 0, w, h ); + border = pizza->container.border_width; + + x = allocation->x + border; + y = allocation->y + border; + w = allocation->width - border*2; + h = allocation->height - border*2; + if (w < 0) + w = 0; + if (h < 0) + h = 0; + + if (pizza->m_noscroll) + { + if (only_resize) + gdk_window_resize( widget->window, allocation->width, allocation->height ); + else + gdk_window_move_resize( widget->window, allocation->x, allocation->y, + allocation->width, allocation->height ); + + gdk_window_move_resize( pizza->bin_window, border, border, w, h ); + } + else + { + if (only_resize) + gdk_window_resize( widget->window, w, h ); + else + gdk_window_move_resize( widget->window, x, y, w, h ); + + gdk_window_resize( pizza->bin_window, w, h ); + } } children = pizza->children; @@ -615,30 +616,6 @@ gtk_pizza_size_allocate (GtkWidget *widget, } } -static gint -gtk_pizza_expose (GtkWidget *widget, - GdkEventExpose *event) -{ - GtkPizza *pizza; - - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (GTK_IS_PIZZA (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - pizza = GTK_PIZZA (widget); - - if (event->window != pizza->bin_window) - return FALSE; - - /* We handle all expose events in window.cpp now. */ - if (pizza->external_expose) - return FALSE; - - (* GTK_WIDGET_CLASS (pizza_parent_class)->expose_event) (widget, event); - - return FALSE; -} - static void gtk_pizza_style_set(GtkWidget *widget, GtkStyle *previous_style) { @@ -648,7 +625,7 @@ gtk_pizza_style_set(GtkWidget *widget, GtkStyle *previous_style) 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); + pizza_parent_class->style_set(widget, previous_style); } static void @@ -741,68 +718,45 @@ gtk_pizza_allocate_child (GtkPizza *pizza, allocation.width = requisition.width; allocation.height = requisition.height; - gtk_widget_size_allocate (child->widget, &allocation); -} - -static void -gtk_pizza_adjust_allocations_recurse (GtkWidget *widget, - gpointer cb_data) -{ - GtkPizzaAdjData *data = cb_data; + if (gtk_widget_get_direction( GTK_WIDGET(pizza) ) == GTK_TEXT_DIR_RTL) + { + /* reverse horizontal placement */ + gint offset,border; - widget->allocation.x += data->dx; - widget->allocation.y += data->dy; + offset = GTK_WIDGET(pizza)->allocation.width; + border = pizza->container.border_width; + offset -= border*2; - if (GTK_WIDGET_NO_WINDOW (widget) && GTK_IS_CONTAINER (widget)) - { - gtk_container_forall (GTK_CONTAINER (widget), - gtk_pizza_adjust_allocations_recurse, - cb_data); + allocation.x = offset - child->x - allocation.width + pizza->m_xoffset; } + + gtk_widget_size_allocate (child->widget, &allocation); } -static void -gtk_pizza_adjust_allocations (GtkPizza *pizza, - gint dx, - gint dy) +void +gtk_pizza_scroll (GtkPizza *pizza, gint dx, gint dy) { GList *tmp_list; - GtkPizzaAdjData data; - - data.dx = dx; - data.dy = dy; + + pizza->m_xoffset += dx; + pizza->m_yoffset += dy; + if (pizza->bin_window) + gdk_window_scroll( pizza->bin_window, -dx, -dy ); + tmp_list = pizza->children; while (tmp_list) { GtkPizzaChild *child = tmp_list->data; tmp_list = tmp_list->next; - child->widget->allocation.x += dx; - child->widget->allocation.y += dy; - - if (GTK_WIDGET_NO_WINDOW (child->widget) && - GTK_IS_CONTAINER (child->widget)) - { - gtk_container_forall (GTK_CONTAINER (child->widget), - gtk_pizza_adjust_allocations_recurse, - &data); - } + GtkAllocation alloc = child->widget->allocation; + alloc.x -= dx; + alloc.y -= dy; + gtk_widget_size_allocate( child->widget, &alloc ); } } -void -gtk_pizza_scroll (GtkPizza *pizza, gint dx, gint dy) -{ - pizza->m_xoffset += dx; - pizza->m_yoffset += dy; - - gtk_pizza_adjust_allocations (pizza, -dx, -dy); - - if (pizza->bin_window) - gdk_window_scroll( pizza->bin_window, -dx, -dy ); -} - #ifdef __cplusplus } #endif /* __cplusplus */