X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c764029c20f8edf64dcbe9fc3649773c3063227a..38f833b10c071603eb8d7739ab31b1c07c4576f1:/src/gtk/win_gtk.c diff --git a/src/gtk/win_gtk.c b/src/gtk/win_gtk.c index 6115bc3a33..f793c468c5 100644 --- a/src/gtk/win_gtk.c +++ b/src/gtk/win_gtk.c @@ -40,8 +40,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, @@ -84,6 +82,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); } @@ -147,7 +146,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; @@ -184,16 +182,12 @@ gtk_pizza_init (GtkPizza *pizza) { GTK_WIDGET_UNSET_FLAGS (pizza, GTK_NO_WINDOW); - pizza->shadow_type = GTK_MYSHADOW_NONE; - pizza->children = NULL; pizza->bin_window = NULL; pizza->m_xoffset = 0; pizza->m_yoffset = 0; - - pizza->m_width = -1; } GtkWidget* @@ -242,16 +236,16 @@ void gtk_pizza_set_yoffset (GtkPizza *pizza, gint yoffset) gint gtk_pizza_get_rtl_offset (GtkPizza *pizza) { - gint width; + gint border; g_return_val_if_fail ( (pizza != NULL), 0 ); g_return_val_if_fail ( (GTK_IS_PIZZA (pizza)), 0 ); if (!pizza->bin_window) return 0; - gdk_window_get_geometry( pizza->bin_window, NULL, NULL, &width, NULL, NULL ); - - return width; + border = pizza->container.border_width; + + return GTK_WIDGET(pizza)->allocation.width - border*2; } @@ -263,25 +257,6 @@ gtk_pizza_scroll_set_adjustments (GtkPizza *pizza, /* We handle scrolling in the wxScrolledWindow, not here. */ } -void -gtk_pizza_set_shadow_type (GtkPizza *pizza, - GtkMyShadowType type) -{ - g_return_if_fail (pizza != NULL); - g_return_if_fail (GTK_IS_PIZZA (pizza)); - - if (pizza->shadow_type != type) - { - pizza->shadow_type = type; - - if (GTK_WIDGET_VISIBLE (pizza)) - { - gtk_widget_size_allocate (GTK_WIDGET (pizza), &(GTK_WIDGET (pizza)->allocation)); - gtk_widget_queue_draw (GTK_WIDGET (pizza)); - } - } -} - void gtk_pizza_put (GtkPizza *pizza, GtkWidget *widget, @@ -296,12 +271,6 @@ gtk_pizza_put (GtkPizza *pizza, g_return_if_fail (GTK_IS_PIZZA (pizza)); g_return_if_fail (widget != NULL); - if (gtk_widget_get_direction( GTK_WIDGET(pizza) ) == GTK_TEXT_DIR_RTL) - { - // reverse horizontal placement - x = pizza->m_width - x - width; - } - child_info = g_new (GtkPizzaChild, 1); child_info->widget = widget; @@ -310,17 +279,16 @@ gtk_pizza_put (GtkPizza *pizza, child_info->width = width; child_info->height = height; - if (GTK_IS_PIZZA(widget)) - GTK_PIZZA(widget)->m_width = width; - 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 @@ -356,26 +324,16 @@ gtk_pizza_set_size (GtkPizza *pizza, if (child->widget == widget) { - gint new_x = x; - if (gtk_widget_get_direction( GTK_WIDGET(pizza) ) == GTK_TEXT_DIR_RTL) - { - // reverse horizontal placement - new_x = pizza->m_width - new_x - width; - } - - if ((child->x == new_x) && + if ((child->x == x) && (child->y == y) && (child->width == width) && (child->height == height)) return; - child->x = new_x; + child->x = x; child->y = y; child->width = width; child->height = height; - if (GTK_IS_PIZZA(widget)) - GTK_PIZZA(widget)->m_width = width; - gtk_widget_set_size_request (widget, width, height); return; @@ -421,6 +379,7 @@ gtk_pizza_realize (GtkWidget *widget) gint attributes_mask; GtkPizzaChild *child; GList *children; + int border; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_PIZZA (widget)); @@ -435,29 +394,11 @@ 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__ */ + border = pizza->container.border_width; + attributes.x += border; + attributes.y += border; + attributes.width -= 2 * border; + attributes.height -= 2 * border; /* minimal size */ if (attributes.width < 2) attributes.width = 2; @@ -577,6 +518,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)); @@ -584,16 +526,12 @@ 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; - + border = pizza->container.border_width; + x = allocation->x + border; y = allocation->y + border; w = allocation->width - border*2; @@ -605,8 +543,12 @@ gtk_pizza_size_allocate (GtkWidget *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 ); + 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; @@ -619,26 +561,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 = (GtkPizza*)widget; - - if (event->window != pizza->bin_window) - return FALSE; - - pizza_parent_class->expose_event(widget, event); - - return FALSE; -} - static void gtk_pizza_style_set(GtkWidget *widget, GtkStyle *previous_style) { @@ -741,6 +663,18 @@ gtk_pizza_allocate_child (GtkPizza *pizza, allocation.width = requisition.width; allocation.height = requisition.height; + if (gtk_widget_get_direction( GTK_WIDGET(pizza) ) == GTK_TEXT_DIR_RTL) + { + /* reverse horizontal placement */ + gint offset,border; + + offset = GTK_WIDGET(pizza)->allocation.width; + border = pizza->container.border_width; + offset -= border*2; + + allocation.x = offset - child->x - allocation.width + pizza->m_xoffset; + } + gtk_widget_size_allocate (child->widget, &allocation); }