X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e208b369f0b11a704248fbc1c8483cbc85f60fd1..0aca1ded9ce90a6d5f560c2617df1ef5089c789b:/src/gtk/win_gtk.c diff --git a/src/gtk/win_gtk.c b/src/gtk/win_gtk.c index 3aeb79f5b3..e4fe2c1812 100644 --- a/src/gtk/win_gtk.c +++ b/src/gtk/win_gtk.c @@ -9,6 +9,7 @@ #include "wx/gtk/win_gtk.h" #include "gtk/gtksignal.h" +#include "gtk/gtknotebook.h" #ifdef __cplusplus extern "C" { @@ -201,9 +202,11 @@ gtk_myfixed_set_shadow_type (GtkMyFixed *myfixed, void gtk_myfixed_put (GtkMyFixed *myfixed, - GtkWidget *widget, - gint16 x, - gint16 y) + GtkWidget *widget, + gint16 x, + gint16 y, + gint16 width, + gint16 height) { GtkMyFixedChild *child_info; @@ -215,29 +218,90 @@ gtk_myfixed_put (GtkMyFixed *myfixed, child_info->widget = widget; child_info->x = x; child_info->y = y; + child_info->width = width; + child_info->height = height; gtk_widget_set_parent (widget, GTK_WIDGET (myfixed)); myfixed->children = g_list_append (myfixed->children, child_info); - if (GTK_WIDGET_REALIZED (myfixed) && !GTK_WIDGET_REALIZED (widget)) + if (GTK_WIDGET_REALIZED (myfixed)) gtk_widget_realize (widget); - if (GTK_WIDGET_MAPPED (myfixed) && !GTK_WIDGET_MAPPED (widget)) - gtk_widget_map (widget); + if (GTK_WIDGET_VISIBLE (myfixed) && GTK_WIDGET_VISIBLE (widget)) + { + if (GTK_WIDGET_MAPPED (myfixed)) + gtk_widget_map (widget); + + gtk_widget_queue_resize (GTK_WIDGET (myfixed)); + } +} + +void +gtk_myfixed_move (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 x, + gint16 y) +{ + GtkMyFixedChild *child; + GList *children; + + g_return_if_fail (myfixed != NULL); + g_return_if_fail (GTK_IS_MYFIXED (myfixed)); + g_return_if_fail (widget != NULL); + + children = myfixed->children; + while (children) + { + child = children->data; + children = children->next; + + if (child->widget == widget) + { + gtk_myfixed_set_size( myfixed, widget, x, y, child->width, child->height ); + break; + } + } +} + +void +gtk_myfixed_resize (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 width, + gint16 height) +{ + GtkMyFixedChild *child; + GList *children; + + g_return_if_fail (myfixed != NULL); + g_return_if_fail (GTK_IS_MYFIXED (myfixed)); + g_return_if_fail (widget != NULL); - if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (myfixed)) - gtk_widget_queue_resize (GTK_WIDGET (myfixed)); + children = myfixed->children; + while (children) + { + child = children->data; + children = children->next; + + if (child->widget == widget) + { + gtk_myfixed_set_size( myfixed, widget, child->x, child->y, width, height ); + break; + } + } } void -gtk_myfixed_move (GtkMyFixed *myfixed, - GtkWidget *widget, - gint16 x, - gint16 y) +gtk_myfixed_set_size (GtkMyFixed *myfixed, + GtkWidget *widget, + gint16 x, + gint16 y, + gint16 width, + gint16 height) { GtkMyFixedChild *child; GList *children; + GtkAllocation child_allocation; g_return_if_fail (myfixed != NULL); g_return_if_fail (GTK_IS_MYFIXED (myfixed)); @@ -251,13 +315,31 @@ gtk_myfixed_move (GtkMyFixed *myfixed, if (child->widget == widget) { - if ((child->x == x) && (child->y == y)) return; + 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 (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (myfixed)) - gtk_widget_queue_resize (GTK_WIDGET (myfixed)); + { + if ((child->width > 1) && (child->height > 1) && (GTK_WIDGET_REALIZED(widget))) + { + child_allocation.x = child->x; + child_allocation.y = child->y; + child_allocation.width = child->width; + child_allocation.height = child->height; + gtk_widget_size_allocate (widget, &child_allocation); + } + else + { + gtk_widget_queue_resize (GTK_WIDGET (myfixed)); + } + } break; } @@ -384,12 +466,10 @@ gtk_myfixed_size_request (GtkWidget *widget, myfixed = GTK_MYFIXED (widget); -/* - requisition->width = 0; - requisition->height = 0; -*/ - requisition->width = widget->requisition.width; - requisition->height = widget->requisition.height; + /* request very little, I'm not sure if requesting nothing + will always have positive effects on stability... */ + requisition->width = 2; + requisition->height = 2; children = myfixed->children; while (children) @@ -406,7 +486,7 @@ gtk_myfixed_size_request (GtkWidget *widget, static void gtk_myfixed_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) + GtkAllocation *allocation) { GtkMyFixed *myfixed; gint border; @@ -447,13 +527,17 @@ gtk_myfixed_size_allocate (GtkWidget *widget, { child = children->data; children = children->next; - - if (GTK_WIDGET_VISIBLE (child->widget)) + + /* please look at the text in wxWindow::DoSetSize() on why the + test GTK_WIDGET_REALIZED() has to be here */ + if (GTK_WIDGET_VISIBLE (child->widget) && + !(!GTK_WIDGET_REALIZED(child->widget) && + GTK_IS_NOTEBOOK(child->widget) )) { child_allocation.x = child->x; child_allocation.y = child->y; - child_allocation.width = child->widget->requisition.width; - child_allocation.height = child->widget->requisition.height; + child_allocation.width = child->width; + child_allocation.height = child->height; gtk_widget_size_allocate (child->widget, &child_allocation); } } @@ -461,7 +545,7 @@ gtk_myfixed_size_allocate (GtkWidget *widget, static void gtk_myfixed_paint (GtkWidget *widget, - GdkRectangle *area) + GdkRectangle *area) { g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_MYFIXED (widget)); @@ -475,7 +559,7 @@ gtk_myfixed_paint (GtkWidget *widget, static void gtk_myfixed_draw (GtkWidget *widget, - GdkRectangle *area) + GdkRectangle *area) { GtkMyFixed *myfixed; GtkMyFixedChild *child; @@ -504,7 +588,7 @@ gtk_myfixed_draw (GtkWidget *widget, static gint gtk_myfixed_expose (GtkWidget *widget, - GdkEventExpose *event) + GdkEventExpose *event) { GtkMyFixed *myfixed; GtkMyFixedChild *child; @@ -545,7 +629,7 @@ gtk_myfixed_add (GtkContainer *container, g_return_if_fail (GTK_IS_MYFIXED (container)); g_return_if_fail (widget != NULL); - gtk_myfixed_put (GTK_MYFIXED (container), widget, 0, 0); + gtk_myfixed_put (GTK_MYFIXED (container), widget, 0, 0, 20, 20 ); } static void