1 /* vi:set ts=8 sts=4 sw=4:
3 * VIM - Vi IMproved by Bram Moolenaar
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
11 * (C) 1998,1999 by Marcin Dalecki <martin@dalecki.de>
13 * Support for GTK+ 2 was added by:
15 * (C) 2002,2003 Jason Hildebrand <jason@peaceworks.ca>
16 * Daniel Elstner <daniel.elstner@gmx.net>
18 * This is a special purspose container widget, which manages arbitrary childs
19 * at arbitrary positions width arbitrary sizes. This finally puts an end on
20 * our resizement problems with which we where struggling for such a long time.
24 #include <gtk/gtk.h> /* without this it compiles, but gives errors at
26 #include "gui_gtk_f.h"
27 #include <gtk/gtksignal.h>
29 # include <gdk/gdkwin32.h>
31 # include <gdk/gdkx.h>
34 typedef struct _GtkFormChild GtkFormChild
;
40 gint x
; /* relative subwidget x position */
41 gint y
; /* relative subwidget y position */
46 static void gtk_form_class_init(GtkFormClass
*klass
);
47 static void gtk_form_init(GtkForm
*form
);
49 static void gtk_form_realize(GtkWidget
*widget
);
50 static void gtk_form_unrealize(GtkWidget
*widget
);
51 static void gtk_form_map(GtkWidget
*widget
);
52 static void gtk_form_size_request(GtkWidget
*widget
,
53 GtkRequisition
*requisition
);
54 static void gtk_form_size_allocate(GtkWidget
*widget
,
55 GtkAllocation
*allocation
);
56 #ifndef HAVE_GTK2 /* this isn't needed in gtk2 */
57 static void gtk_form_draw(GtkWidget
*widget
,
60 static gint
gtk_form_expose(GtkWidget
*widget
,
61 GdkEventExpose
*event
);
63 static void gtk_form_remove(GtkContainer
*container
,
65 static void gtk_form_forall(GtkContainer
*container
,
66 gboolean include_internals
,
68 gpointer callback_data
);
70 static void gtk_form_attach_child_window(GtkForm
*form
,
72 static void gtk_form_realize_child(GtkForm
*form
,
74 static void gtk_form_position_child(GtkForm
*form
,
76 gboolean force_allocate
);
77 static void gtk_form_position_children(GtkForm
*form
);
79 static GdkFilterReturn
gtk_form_filter(GdkXEvent
*gdk_xevent
,
82 static GdkFilterReturn
gtk_form_main_filter(GdkXEvent
*gdk_xevent
,
86 static void gtk_form_set_static_gravity(GdkWindow
*window
,
89 static void gtk_form_send_configure(GtkForm
*form
);
91 static void gtk_form_child_map(GtkWidget
*widget
, gpointer user_data
);
92 static void gtk_form_child_unmap(GtkWidget
*widget
, gpointer user_data
);
94 static GtkWidgetClass
*parent_class
= NULL
;
104 form
= gtk_type_new(gtk_form_get_type());
106 return GTK_WIDGET(form
);
110 gtk_form_put(GtkForm
*form
,
111 GtkWidget
*child_widget
,
117 g_return_if_fail(GTK_IS_FORM(form
));
119 /* LINTED: avoid warning: conversion to 'unsigned long' */
120 child
= g_new(GtkFormChild
, 1);
122 child
->widget
= child_widget
;
123 child
->window
= NULL
;
126 child
->widget
->requisition
.width
= 0;
127 child
->widget
->requisition
.height
= 0;
128 child
->mapped
= FALSE
;
130 form
->children
= g_list_append(form
->children
, child
);
132 /* child->window must be created and attached to the widget _before_
133 * it has been realized, or else things will break with GTK2. Note
134 * that gtk_widget_set_parent() realizes the widget if it's visible
135 * and its parent is mapped.
137 if (GTK_WIDGET_REALIZED(form
))
138 gtk_form_attach_child_window(form
, child
);
140 gtk_widget_set_parent(child_widget
, GTK_WIDGET(form
));
141 gtk_widget_size_request(child
->widget
, NULL
);
143 if (GTK_WIDGET_REALIZED(form
) && !GTK_WIDGET_REALIZED(child_widget
))
144 gtk_form_realize_child(form
, child
);
146 gtk_form_position_child(form
, child
, TRUE
);
150 gtk_form_move(GtkForm
*form
,
151 GtkWidget
*child_widget
,
158 g_return_if_fail(GTK_IS_FORM(form
));
160 for (tmp_list
= form
->children
; tmp_list
; tmp_list
= tmp_list
->next
)
162 child
= tmp_list
->data
;
163 if (child
->widget
== child_widget
)
168 gtk_form_position_child(form
, child
, TRUE
);
175 gtk_form_set_size(GtkForm
*form
, guint width
, guint height
)
177 g_return_if_fail(GTK_IS_FORM(form
));
179 /* prevent unneccessary calls */
180 if (form
->width
== width
&& form
->height
== height
)
183 form
->height
= height
;
185 /* signal the change */
187 gtk_widget_queue_resize(gtk_widget_get_parent(GTK_WIDGET(form
)));
189 gtk_container_queue_resize(GTK_CONTAINER(GTK_WIDGET(form
)->parent
));
194 gtk_form_freeze(GtkForm
*form
)
196 g_return_if_fail(GTK_IS_FORM(form
));
198 ++form
->freeze_count
;
202 gtk_form_thaw(GtkForm
*form
)
204 g_return_if_fail(GTK_IS_FORM(form
));
206 if (form
->freeze_count
)
208 if (!(--form
->freeze_count
))
210 gtk_form_position_children(form
);
212 gtk_widget_queue_draw(GTK_WIDGET(form
));
214 gtk_widget_draw(GTK_WIDGET(form
), NULL
);
220 /* Basic Object handling procedures
223 gtk_form_get_type(void)
225 static GtkType form_type
= 0;
229 GtkTypeInfo form_info
=
233 sizeof(GtkFormClass
),
234 (GtkClassInitFunc
) gtk_form_class_init
,
235 (GtkObjectInitFunc
) gtk_form_init
238 form_type
= gtk_type_unique(GTK_TYPE_CONTAINER
, &form_info
);
244 gtk_form_class_init(GtkFormClass
*klass
)
246 GtkWidgetClass
*widget_class
;
247 GtkContainerClass
*container_class
;
249 widget_class
= (GtkWidgetClass
*) klass
;
250 container_class
= (GtkContainerClass
*) klass
;
252 parent_class
= gtk_type_class(gtk_container_get_type());
254 widget_class
->realize
= gtk_form_realize
;
255 widget_class
->unrealize
= gtk_form_unrealize
;
256 widget_class
->map
= gtk_form_map
;
257 widget_class
->size_request
= gtk_form_size_request
;
258 widget_class
->size_allocate
= gtk_form_size_allocate
;
259 #ifndef HAVE_GTK2 /* not needed for GTK2 */
260 widget_class
->draw
= gtk_form_draw
;
262 widget_class
->expose_event
= gtk_form_expose
;
264 container_class
->remove
= gtk_form_remove
;
265 container_class
->forall
= gtk_form_forall
;
269 gtk_form_init(GtkForm
*form
)
271 form
->children
= NULL
;
276 form
->bin_window
= NULL
;
278 form
->configure_serial
= 0;
279 form
->visibility
= GDK_VISIBILITY_PARTIAL
;
281 form
->freeze_count
= 0;
289 gtk_form_realize(GtkWidget
*widget
)
293 GdkWindowAttr attributes
;
294 gint attributes_mask
;
296 g_return_if_fail(GTK_IS_FORM(widget
));
298 form
= GTK_FORM(widget
);
299 GTK_WIDGET_SET_FLAGS(form
, GTK_REALIZED
);
301 attributes
.window_type
= GDK_WINDOW_CHILD
;
302 attributes
.x
= widget
->allocation
.x
;
303 attributes
.y
= widget
->allocation
.y
;
304 attributes
.width
= widget
->allocation
.width
;
305 attributes
.height
= widget
->allocation
.height
;
306 attributes
.wclass
= GDK_INPUT_OUTPUT
;
307 attributes
.visual
= gtk_widget_get_visual(widget
);
308 attributes
.colormap
= gtk_widget_get_colormap(widget
);
309 attributes
.event_mask
= GDK_VISIBILITY_NOTIFY_MASK
;
311 attributes_mask
= GDK_WA_X
| GDK_WA_Y
| GDK_WA_VISUAL
| GDK_WA_COLORMAP
;
313 widget
->window
= gdk_window_new(gtk_widget_get_parent_window(widget
),
314 &attributes
, attributes_mask
);
315 gdk_window_set_user_data(widget
->window
, widget
);
319 attributes
.event_mask
= gtk_widget_get_events(widget
);
321 form
->bin_window
= gdk_window_new(widget
->window
,
322 &attributes
, attributes_mask
);
323 gdk_window_set_user_data(form
->bin_window
, widget
);
325 gtk_form_set_static_gravity(form
->bin_window
, TRUE
);
327 widget
->style
= gtk_style_attach(widget
->style
, widget
->window
);
328 gtk_style_set_background(widget
->style
, widget
->window
, GTK_STATE_NORMAL
);
329 gtk_style_set_background(widget
->style
, form
->bin_window
, GTK_STATE_NORMAL
);
331 gdk_window_add_filter(widget
->window
, gtk_form_main_filter
, form
);
332 gdk_window_add_filter(form
->bin_window
, gtk_form_filter
, form
);
334 for (tmp_list
= form
->children
; tmp_list
; tmp_list
= tmp_list
->next
)
336 GtkFormChild
*child
= tmp_list
->data
;
338 gtk_form_attach_child_window(form
, child
);
340 if (GTK_WIDGET_VISIBLE(child
->widget
))
341 gtk_form_realize_child(form
, child
);
346 /* After reading the documentation at
347 * http://developer.gnome.org/doc/API/2.0/gtk/gtk-changes-2-0.html
348 * I think it should be possible to remove this function when compiling
349 * against gtk-2.0. It doesn't seem to cause problems, though.
351 * Well, I reckon at least the gdk_window_show(form->bin_window)
352 * is necessary. GtkForm is anything but a usual container widget.
355 gtk_form_map(GtkWidget
*widget
)
360 g_return_if_fail(GTK_IS_FORM(widget
));
362 form
= GTK_FORM(widget
);
364 GTK_WIDGET_SET_FLAGS(widget
, GTK_MAPPED
);
366 gdk_window_show(widget
->window
);
367 gdk_window_show(form
->bin_window
);
369 for (tmp_list
= form
->children
; tmp_list
; tmp_list
= tmp_list
->next
)
371 GtkFormChild
*child
= tmp_list
->data
;
373 if (GTK_WIDGET_VISIBLE(child
->widget
)
374 && !GTK_WIDGET_MAPPED(child
->widget
))
375 gtk_widget_map(child
->widget
);
380 gtk_form_unrealize(GtkWidget
*widget
)
385 g_return_if_fail(GTK_IS_FORM(widget
));
387 form
= GTK_FORM(widget
);
389 tmp_list
= form
->children
;
391 gdk_window_set_user_data(form
->bin_window
, NULL
);
392 gdk_window_destroy(form
->bin_window
);
393 form
->bin_window
= NULL
;
397 GtkFormChild
*child
= tmp_list
->data
;
399 if (child
->window
!= NULL
)
401 gtk_signal_disconnect_by_func(GTK_OBJECT(child
->widget
),
402 GTK_SIGNAL_FUNC(gtk_form_child_map
),
404 gtk_signal_disconnect_by_func(GTK_OBJECT(child
->widget
),
405 GTK_SIGNAL_FUNC(gtk_form_child_unmap
),
408 gdk_window_set_user_data(child
->window
, NULL
);
409 gdk_window_destroy(child
->window
);
411 child
->window
= NULL
;
414 tmp_list
= tmp_list
->next
;
417 if (GTK_WIDGET_CLASS (parent_class
)->unrealize
)
418 (* GTK_WIDGET_CLASS (parent_class
)->unrealize
) (widget
);
423 gtk_form_draw(GtkWidget
*widget
, GdkRectangle
*area
)
428 GdkRectangle child_area
;
430 g_return_if_fail(GTK_IS_FORM(widget
));
432 if (GTK_WIDGET_DRAWABLE(widget
))
434 form
= GTK_FORM(widget
);
436 children
= form
->children
;
440 child
= children
->data
;
442 if (GTK_WIDGET_DRAWABLE(child
->widget
)
443 && gtk_widget_intersect(child
->widget
, area
, &child_area
))
444 gtk_widget_draw(child
->widget
, &child_area
);
446 children
= children
->next
;
450 #endif /* !HAVE_GTK2 */
453 gtk_form_size_request(GtkWidget
*widget
, GtkRequisition
*requisition
)
458 g_return_if_fail(GTK_IS_FORM(widget
));
460 form
= GTK_FORM(widget
);
462 requisition
->width
= form
->width
;
463 requisition
->height
= form
->height
;
465 tmp_list
= form
->children
;
469 GtkFormChild
*child
= tmp_list
->data
;
470 gtk_widget_size_request(child
->widget
, NULL
);
471 tmp_list
= tmp_list
->next
;
476 gtk_form_size_allocate(GtkWidget
*widget
, GtkAllocation
*allocation
)
480 gboolean need_reposition
;
482 g_return_if_fail(GTK_IS_FORM(widget
));
484 if (widget
->allocation
.x
== allocation
->x
485 && widget
->allocation
.y
== allocation
->y
486 && widget
->allocation
.width
== allocation
->width
487 && widget
->allocation
.height
== allocation
->height
)
490 need_reposition
= widget
->allocation
.width
!= allocation
->width
491 || widget
->allocation
.height
!= allocation
->height
;
492 form
= GTK_FORM(widget
);
496 tmp_list
= form
->children
;
500 GtkFormChild
*child
= tmp_list
->data
;
501 gtk_form_position_child(form
, child
, TRUE
);
503 tmp_list
= tmp_list
->next
;
507 if (GTK_WIDGET_REALIZED(widget
))
509 gdk_window_move_resize(widget
->window
,
510 allocation
->x
, allocation
->y
,
511 allocation
->width
, allocation
->height
);
512 gdk_window_move_resize(GTK_FORM(widget
)->bin_window
,
514 allocation
->width
, allocation
->height
);
516 widget
->allocation
= *allocation
;
518 gtk_form_send_configure(form
);
522 gtk_form_expose(GtkWidget
*widget
, GdkEventExpose
*event
)
527 g_return_val_if_fail(GTK_IS_FORM(widget
), FALSE
);
529 form
= GTK_FORM(widget
);
531 if (event
->window
== form
->bin_window
)
534 for (tmp_list
= form
->children
; tmp_list
; tmp_list
= tmp_list
->next
)
537 GtkFormChild
*formchild
= tmp_list
->data
;
538 GtkWidget
*child
= formchild
->widget
;
540 * The following chunk of code is taken from gtkcontainer.c. The
541 * gtk1.x code synthesized expose events directly on the child widgets,
542 * which can't be done in gtk2
544 if (GTK_WIDGET_DRAWABLE(child
) && GTK_WIDGET_NO_WINDOW(child
)
545 && child
->window
== event
->window
)
547 GdkEventExpose child_event
;
548 child_event
= *event
;
550 child_event
.region
= gtk_widget_region_intersect(child
, event
->region
);
551 if (!gdk_region_empty(child_event
.region
))
553 gdk_region_get_clipbox(child_event
.region
, &child_event
.area
);
554 gtk_widget_send_expose(child
, (GdkEvent
*)&child_event
);
557 #else /* !HAVE_GTK2 */
558 GtkFormChild
*child
= tmp_list
->data
;
560 if (event
->window
== child
->window
)
561 return gtk_widget_event(child
->widget
, (GdkEvent
*) event
);
562 #endif /* !HAVE_GTK2 */
571 gtk_form_remove(GtkContainer
*container
, GtkWidget
*widget
)
575 GtkFormChild
*child
= NULL
; /* init for gcc */
577 g_return_if_fail(GTK_IS_FORM(container
));
579 form
= GTK_FORM(container
);
581 tmp_list
= form
->children
;
584 child
= tmp_list
->data
;
585 if (child
->widget
== widget
)
587 tmp_list
= tmp_list
->next
;
594 gtk_signal_disconnect_by_func(GTK_OBJECT(child
->widget
),
595 GTK_SIGNAL_FUNC(>k_form_child_map
), child
);
596 gtk_signal_disconnect_by_func(GTK_OBJECT(child
->widget
),
597 GTK_SIGNAL_FUNC(>k_form_child_unmap
), child
);
599 /* FIXME: This will cause problems for reparenting NO_WINDOW
600 * widgets out of a GtkForm
602 gdk_window_set_user_data(child
->window
, NULL
);
603 gdk_window_destroy(child
->window
);
605 gtk_widget_unparent(widget
);
607 form
->children
= g_list_remove_link(form
->children
, tmp_list
);
608 g_list_free_1(tmp_list
);
615 gtk_form_forall(GtkContainer
*container
,
616 gboolean include_internals
,
617 GtkCallback callback
,
618 gpointer callback_data
)
624 g_return_if_fail(GTK_IS_FORM(container
));
625 g_return_if_fail(callback
!= NULL
);
627 form
= GTK_FORM(container
);
629 tmp_list
= form
->children
;
632 child
= tmp_list
->data
;
633 tmp_list
= tmp_list
->next
;
635 (*callback
) (child
->widget
, callback_data
);
639 /* Operations on children
643 gtk_form_attach_child_window(GtkForm
*form
, GtkFormChild
*child
)
645 if (child
->window
!= NULL
)
646 return; /* been there, done that */
648 if (GTK_WIDGET_NO_WINDOW(child
->widget
))
651 GdkWindowAttr attributes
;
652 gint attributes_mask
;
654 widget
= GTK_WIDGET(form
);
656 attributes
.window_type
= GDK_WINDOW_CHILD
;
657 attributes
.x
= child
->x
;
658 attributes
.y
= child
->y
;
659 attributes
.width
= child
->widget
->requisition
.width
;
660 attributes
.height
= child
->widget
->requisition
.height
;
661 attributes
.wclass
= GDK_INPUT_OUTPUT
;
662 attributes
.visual
= gtk_widget_get_visual(widget
);
663 attributes
.colormap
= gtk_widget_get_colormap(widget
);
664 attributes
.event_mask
= GDK_EXPOSURE_MASK
;
666 attributes_mask
= GDK_WA_X
| GDK_WA_Y
| GDK_WA_VISUAL
| GDK_WA_COLORMAP
;
667 child
->window
= gdk_window_new(form
->bin_window
,
668 &attributes
, attributes_mask
);
669 gdk_window_set_user_data(child
->window
, widget
);
671 gtk_style_set_background(widget
->style
,
675 gtk_widget_set_parent_window(child
->widget
, child
->window
);
676 gtk_form_set_static_gravity(child
->window
, TRUE
);
678 * Install signal handlers to map/unmap child->window
679 * alongside with the actual widget.
681 gtk_signal_connect(GTK_OBJECT(child
->widget
), "map",
682 GTK_SIGNAL_FUNC(>k_form_child_map
), child
);
683 gtk_signal_connect(GTK_OBJECT(child
->widget
), "unmap",
684 GTK_SIGNAL_FUNC(>k_form_child_unmap
), child
);
686 else if (!GTK_WIDGET_REALIZED(child
->widget
))
688 gtk_widget_set_parent_window(child
->widget
, form
->bin_window
);
693 gtk_form_realize_child(GtkForm
*form
, GtkFormChild
*child
)
695 gtk_form_attach_child_window(form
, child
);
696 gtk_widget_realize(child
->widget
);
698 if (child
->window
== NULL
) /* might be already set, see above */
699 gtk_form_set_static_gravity(child
->widget
->window
, TRUE
);
703 gtk_form_position_child(GtkForm
*form
, GtkFormChild
*child
,
704 gboolean force_allocate
)
712 if ((x
>= G_MINSHORT
) && (x
<= G_MAXSHORT
) &&
713 (y
>= G_MINSHORT
) && (y
<= G_MAXSHORT
))
717 if (GTK_WIDGET_MAPPED(form
) && GTK_WIDGET_VISIBLE(child
->widget
))
719 if (!GTK_WIDGET_MAPPED(child
->widget
))
720 gtk_widget_map(child
->widget
);
722 child
->mapped
= TRUE
;
723 force_allocate
= TRUE
;
729 GtkAllocation allocation
;
731 if (GTK_WIDGET_NO_WINDOW(child
->widget
))
735 gdk_window_move_resize(child
->window
,
737 child
->widget
->requisition
.width
,
738 child
->widget
->requisition
.height
);
750 allocation
.width
= child
->widget
->requisition
.width
;
751 allocation
.height
= child
->widget
->requisition
.height
;
753 gtk_widget_size_allocate(child
->widget
, &allocation
);
760 child
->mapped
= FALSE
;
762 if (GTK_WIDGET_MAPPED(child
->widget
))
763 gtk_widget_unmap(child
->widget
);
769 gtk_form_position_children(GtkForm
*form
)
773 for (tmp_list
= form
->children
; tmp_list
; tmp_list
= tmp_list
->next
)
774 gtk_form_position_child(form
, tmp_list
->data
, FALSE
);
779 /* The main event filter. Actually, we probably don't really need
780 * to install this as a filter at all, since we are calling it
781 * directly above in the expose-handling hack.
783 * This routine identifies expose events that are generated when
784 * we've temporarily moved the bin_window_origin, and translates
785 * them or discards them, depending on whether we are obscured
789 static GdkFilterReturn
790 gtk_form_filter(GdkXEvent
*gdk_xevent
, GdkEvent
*event
, gpointer data
)
795 xevent
= (XEvent
*) gdk_xevent
;
796 form
= GTK_FORM(data
);
798 switch (xevent
->type
)
801 if (xevent
->xexpose
.serial
== form
->configure_serial
)
803 if (form
->visibility
== GDK_VISIBILITY_UNOBSCURED
)
804 return GDK_FILTER_REMOVE
;
810 case ConfigureNotify
:
811 if ((xevent
->xconfigure
.x
!= 0) || (xevent
->xconfigure
.y
!= 0))
812 form
->configure_serial
= xevent
->xconfigure
.serial
;
816 return GDK_FILTER_CONTINUE
;
819 /* Although GDK does have a GDK_VISIBILITY_NOTIFY event,
820 * there is no corresponding event in GTK, so we have
821 * to get the events from a filter
824 static GdkFilterReturn
825 gtk_form_main_filter(GdkXEvent
*gdk_xevent
, GdkEvent
*event
, gpointer data
)
830 xevent
= (XEvent
*) gdk_xevent
;
831 form
= GTK_FORM(data
);
833 if (xevent
->type
== VisibilityNotify
)
835 switch (xevent
->xvisibility
.state
)
837 case VisibilityFullyObscured
:
838 form
->visibility
= GDK_VISIBILITY_FULLY_OBSCURED
;
841 case VisibilityPartiallyObscured
:
842 form
->visibility
= GDK_VISIBILITY_PARTIAL
;
845 case VisibilityUnobscured
:
846 form
->visibility
= GDK_VISIBILITY_UNOBSCURED
;
850 return GDK_FILTER_REMOVE
;
852 return GDK_FILTER_CONTINUE
;
855 /* Routines to set the window gravity, and check whether it is
856 * functional. Extra capabilities need to be added to GDK, so
857 * we don't have to use Xlib here.
860 gtk_form_set_static_gravity(GdkWindow
*window
, gboolean use_static
)
863 gboolean static_gravity_supported
;
865 static_gravity_supported
= gdk_window_set_static_gravities(window
,
867 g_return_if_fail(static_gravity_supported
);
869 XSetWindowAttributes xattributes
;
871 xattributes
.win_gravity
= (use_static
) ? StaticGravity
: NorthWestGravity
;
872 xattributes
.bit_gravity
= (use_static
) ? StaticGravity
: NorthWestGravity
;
874 XChangeWindowAttributes(GDK_WINDOW_XDISPLAY(window
),
875 GDK_WINDOW_XWINDOW(window
),
876 CWBitGravity
| CWWinGravity
,
882 gtk_form_move_resize(GtkForm
*form
, GtkWidget
*widget
,
883 gint x
, gint y
, gint w
, gint h
)
885 widget
->requisition
.width
= w
;
886 widget
->requisition
.height
= h
;
888 gtk_form_move(form
, widget
, x
, y
);
892 gtk_form_send_configure(GtkForm
*form
)
895 GdkEventConfigure event
;
897 widget
= GTK_WIDGET(form
);
899 event
.type
= GDK_CONFIGURE
;
900 event
.window
= widget
->window
;
901 event
.x
= widget
->allocation
.x
;
902 event
.y
= widget
->allocation
.y
;
903 event
.width
= widget
->allocation
.width
;
904 event
.height
= widget
->allocation
.height
;
907 gtk_main_do_event((GdkEvent
*)&event
);
909 gtk_widget_event(widget
, (GdkEvent
*)&event
);
915 gtk_form_child_map(GtkWidget
*widget
, gpointer user_data
)
919 child
= (GtkFormChild
*)user_data
;
921 child
->mapped
= TRUE
;
922 gdk_window_show(child
->window
);
927 gtk_form_child_unmap(GtkWidget
*widget
, gpointer user_data
)
931 child
= (GtkFormChild
*)user_data
;
933 child
->mapped
= FALSE
;
934 gdk_window_hide(child
->window
);