blob: 04e25aa598981572912b689ab41d479e6c93a613 [file] [log] [blame]
Bram Moolenaaredf3f972016-08-29 22:49:24 +02001/* vi:set ts=8 sts=4 sw=4 noet:
Bram Moolenaar071d4272004-06-13 20:20:40 +00002 *
3 * VIM - Vi IMproved by Bram Moolenaar
4 *
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.
8 */
9
10/*
Bram Moolenaara0a83be2005-01-04 21:26:43 +000011 * (C) 1998,1999 by Marcin Dalecki <martin@dalecki.de>
Bram Moolenaar071d4272004-06-13 20:20:40 +000012 *
13 * Support for GTK+ 2 was added by:
14 *
15 * (C) 2002,2003 Jason Hildebrand <jason@peaceworks.ca>
16 * Daniel Elstner <daniel.elstner@gmx.net>
17 *
Bram Moolenaar933eb392007-05-10 17:52:45 +000018 * This is a special purpose container widget, which manages arbitrary
19 * children at arbitrary positions width arbitrary sizes. This finally puts
20 * an end on our resize problems with which we where struggling for such a
21 * long time.
Bram Moolenaar98921892016-02-23 17:14:37 +010022 *
23 * Support for GTK+ 3 was added by:
24 *
25 * 2016 Kazunobu Kuriyama <kazunobu.kuriyama@gmail.com>
Bram Moolenaar071d4272004-06-13 20:20:40 +000026 */
27
28#include "vim.h"
29#include <gtk/gtk.h> /* without this it compiles, but gives errors at
30 runtime! */
31#include "gui_gtk_f.h"
Bram Moolenaar98921892016-02-23 17:14:37 +010032#if !GTK_CHECK_VERSION(3,0,0)
33# include <gtk/gtksignal.h>
34#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000035#ifdef WIN3264
36# include <gdk/gdkwin32.h>
37#else
38# include <gdk/gdkx.h>
39#endif
40
41typedef struct _GtkFormChild GtkFormChild;
42
43struct _GtkFormChild
44{
45 GtkWidget *widget;
46 GdkWindow *window;
47 gint x; /* relative subwidget x position */
48 gint y; /* relative subwidget y position */
49 gint mapped;
50};
51
52
53static void gtk_form_class_init(GtkFormClass *klass);
54static void gtk_form_init(GtkForm *form);
55
56static void gtk_form_realize(GtkWidget *widget);
57static void gtk_form_unrealize(GtkWidget *widget);
58static void gtk_form_map(GtkWidget *widget);
59static void gtk_form_size_request(GtkWidget *widget,
60 GtkRequisition *requisition);
Bram Moolenaar98921892016-02-23 17:14:37 +010061#if GTK_CHECK_VERSION(3,0,0)
62static void gtk_form_get_preferred_width(GtkWidget *widget,
63 gint *minimal_width,
64 gint *natural_width);
65static void gtk_form_get_preferred_height(GtkWidget *widget,
66 gint *minimal_height,
67 gint *natural_height);
68#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000069static void gtk_form_size_allocate(GtkWidget *widget,
70 GtkAllocation *allocation);
Bram Moolenaar98921892016-02-23 17:14:37 +010071#if GTK_CHECK_VERSION(3,0,0)
72static gboolean gtk_form_draw(GtkWidget *widget,
73 cairo_t *cr);
74#else
Bram Moolenaar071d4272004-06-13 20:20:40 +000075static gint gtk_form_expose(GtkWidget *widget,
76 GdkEventExpose *event);
Bram Moolenaar98921892016-02-23 17:14:37 +010077#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000078
79static void gtk_form_remove(GtkContainer *container,
80 GtkWidget *widget);
81static void gtk_form_forall(GtkContainer *container,
82 gboolean include_internals,
83 GtkCallback callback,
84 gpointer callback_data);
85
86static void gtk_form_attach_child_window(GtkForm *form,
87 GtkFormChild *child);
88static void gtk_form_realize_child(GtkForm *form,
89 GtkFormChild *child);
90static void gtk_form_position_child(GtkForm *form,
91 GtkFormChild *child,
92 gboolean force_allocate);
93static void gtk_form_position_children(GtkForm *form);
94
Bram Moolenaar071d4272004-06-13 20:20:40 +000095static void gtk_form_send_configure(GtkForm *form);
96
97static void gtk_form_child_map(GtkWidget *widget, gpointer user_data);
98static void gtk_form_child_unmap(GtkWidget *widget, gpointer user_data);
99
Bram Moolenaar98921892016-02-23 17:14:37 +0100100#if !GTK_CHECK_VERSION(3,0,0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000101static GtkWidgetClass *parent_class = NULL;
Bram Moolenaar98921892016-02-23 17:14:37 +0100102#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000103
104/* Public interface
105 */
106
107 GtkWidget *
108gtk_form_new(void)
109{
110 GtkForm *form;
111
Bram Moolenaar98921892016-02-23 17:14:37 +0100112#if GTK_CHECK_VERSION(3,0,0)
113 form = g_object_new(GTK_TYPE_FORM, NULL);
114#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000115 form = gtk_type_new(gtk_form_get_type());
Bram Moolenaar98921892016-02-23 17:14:37 +0100116#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000117
118 return GTK_WIDGET(form);
119}
120
121 void
122gtk_form_put(GtkForm *form,
123 GtkWidget *child_widget,
124 gint x,
125 gint y)
126{
127 GtkFormChild *child;
128
129 g_return_if_fail(GTK_IS_FORM(form));
130
Bram Moolenaar9d75c832005-01-25 21:57:23 +0000131 /* LINTED: avoid warning: conversion to 'unsigned long' */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000132 child = g_new(GtkFormChild, 1);
133
134 child->widget = child_widget;
135 child->window = NULL;
136 child->x = x;
137 child->y = y;
Bram Moolenaar98921892016-02-23 17:14:37 +0100138#if GTK_CHECK_VERSION(3,0,0)
139 gtk_widget_set_size_request(child->widget, -1, -1);
140#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000141 child->widget->requisition.width = 0;
142 child->widget->requisition.height = 0;
Bram Moolenaar98921892016-02-23 17:14:37 +0100143#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000144 child->mapped = FALSE;
145
146 form->children = g_list_append(form->children, child);
147
148 /* child->window must be created and attached to the widget _before_
149 * it has been realized, or else things will break with GTK2. Note
150 * that gtk_widget_set_parent() realizes the widget if it's visible
151 * and its parent is mapped.
152 */
Bram Moolenaar98921892016-02-23 17:14:37 +0100153#if GTK_CHECK_VERSION(3,0,0)
154 if (gtk_widget_get_realized(GTK_WIDGET(form)))
155#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000156 if (GTK_WIDGET_REALIZED(form))
Bram Moolenaar98921892016-02-23 17:14:37 +0100157#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000158 gtk_form_attach_child_window(form, child);
159
160 gtk_widget_set_parent(child_widget, GTK_WIDGET(form));
Bram Moolenaar071d4272004-06-13 20:20:40 +0000161
Bram Moolenaar98921892016-02-23 17:14:37 +0100162#if GTK_CHECK_VERSION(3,0,0)
163 if (gtk_widget_get_realized(GTK_WIDGET(form))
164 && !gtk_widget_get_realized(child_widget))
165#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000166 if (GTK_WIDGET_REALIZED(form) && !GTK_WIDGET_REALIZED(child_widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100167#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000168 gtk_form_realize_child(form, child);
169
170 gtk_form_position_child(form, child, TRUE);
171}
172
173 void
174gtk_form_move(GtkForm *form,
175 GtkWidget *child_widget,
176 gint x,
177 gint y)
178{
179 GList *tmp_list;
180 GtkFormChild *child;
181
182 g_return_if_fail(GTK_IS_FORM(form));
183
184 for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next)
185 {
186 child = tmp_list->data;
187 if (child->widget == child_widget)
188 {
189 child->x = x;
190 child->y = y;
191
192 gtk_form_position_child(form, child, TRUE);
193 return;
194 }
195 }
196}
197
Bram Moolenaar071d4272004-06-13 20:20:40 +0000198 void
199gtk_form_freeze(GtkForm *form)
200{
201 g_return_if_fail(GTK_IS_FORM(form));
202
203 ++form->freeze_count;
204}
205
206 void
207gtk_form_thaw(GtkForm *form)
208{
209 g_return_if_fail(GTK_IS_FORM(form));
210
211 if (form->freeze_count)
212 {
213 if (!(--form->freeze_count))
214 {
215 gtk_form_position_children(form);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216 gtk_widget_queue_draw(GTK_WIDGET(form));
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217 }
218 }
219}
220
221/* Basic Object handling procedures
222 */
Bram Moolenaar98921892016-02-23 17:14:37 +0100223#if GTK_CHECK_VERSION(3,0,0)
224G_DEFINE_TYPE(GtkForm, gtk_form, GTK_TYPE_CONTAINER)
225#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000226 GtkType
227gtk_form_get_type(void)
228{
229 static GtkType form_type = 0;
230
231 if (!form_type)
232 {
Bram Moolenaarb85cb212009-05-17 14:24:23 +0000233 GtkTypeInfo form_info;
234
Bram Moolenaara9d45512009-05-17 21:25:42 +0000235 vim_memset(&form_info, 0, sizeof(form_info));
Bram Moolenaarb85cb212009-05-17 14:24:23 +0000236 form_info.type_name = "GtkForm";
237 form_info.object_size = sizeof(GtkForm);
238 form_info.class_size = sizeof(GtkFormClass);
239 form_info.class_init_func = (GtkClassInitFunc)gtk_form_class_init;
240 form_info.object_init_func = (GtkObjectInitFunc)gtk_form_init;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000241
242 form_type = gtk_type_unique(GTK_TYPE_CONTAINER, &form_info);
243 }
244 return form_type;
245}
Bram Moolenaar98921892016-02-23 17:14:37 +0100246#endif /* !GTK_CHECK_VERSION(3,0,0) */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000247
248 static void
249gtk_form_class_init(GtkFormClass *klass)
250{
251 GtkWidgetClass *widget_class;
252 GtkContainerClass *container_class;
253
254 widget_class = (GtkWidgetClass *) klass;
255 container_class = (GtkContainerClass *) klass;
256
Bram Moolenaar98921892016-02-23 17:14:37 +0100257#if !GTK_CHECK_VERSION(3,0,0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000258 parent_class = gtk_type_class(gtk_container_get_type());
Bram Moolenaar98921892016-02-23 17:14:37 +0100259#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000260
261 widget_class->realize = gtk_form_realize;
262 widget_class->unrealize = gtk_form_unrealize;
263 widget_class->map = gtk_form_map;
Bram Moolenaar98921892016-02-23 17:14:37 +0100264#if GTK_CHECK_VERSION(3,0,0)
265 widget_class->get_preferred_width = gtk_form_get_preferred_width;
266 widget_class->get_preferred_height = gtk_form_get_preferred_height;
267#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268 widget_class->size_request = gtk_form_size_request;
Bram Moolenaar98921892016-02-23 17:14:37 +0100269#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000270 widget_class->size_allocate = gtk_form_size_allocate;
Bram Moolenaar98921892016-02-23 17:14:37 +0100271#if GTK_CHECK_VERSION(3,0,0)
272 widget_class->draw = gtk_form_draw;
273#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000274 widget_class->expose_event = gtk_form_expose;
Bram Moolenaar98921892016-02-23 17:14:37 +0100275#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000276
277 container_class->remove = gtk_form_remove;
278 container_class->forall = gtk_form_forall;
279}
280
281 static void
282gtk_form_init(GtkForm *form)
283{
Bram Moolenaar98921892016-02-23 17:14:37 +0100284#if GTK_CHECK_VERSION(3,0,0)
285 gtk_widget_set_has_window(GTK_WIDGET(form), TRUE);
286#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000287 form->children = NULL;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000288 form->bin_window = NULL;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000289 form->freeze_count = 0;
290}
291
292/*
293 * Widget methods
294 */
295
296 static void
297gtk_form_realize(GtkWidget *widget)
298{
299 GList *tmp_list;
300 GtkForm *form;
301 GdkWindowAttr attributes;
302 gint attributes_mask;
303
304 g_return_if_fail(GTK_IS_FORM(widget));
305
306 form = GTK_FORM(widget);
Bram Moolenaar98921892016-02-23 17:14:37 +0100307#if GTK_CHECK_VERSION(3,0,0)
308 gtk_widget_set_realized(widget, TRUE);
309#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000310 GTK_WIDGET_SET_FLAGS(form, GTK_REALIZED);
Bram Moolenaar98921892016-02-23 17:14:37 +0100311#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000312
313 attributes.window_type = GDK_WINDOW_CHILD;
Bram Moolenaar98921892016-02-23 17:14:37 +0100314#if GTK_CHECK_VERSION(3,0,0)
315 {
316 GtkAllocation allocation;
317 gtk_widget_get_allocation(widget, &allocation);
318 attributes.x = allocation.x;
319 attributes.y = allocation.y;
320 attributes.width = allocation.width;
321 attributes.height = allocation.height;
322 }
323#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000324 attributes.x = widget->allocation.x;
325 attributes.y = widget->allocation.y;
326 attributes.width = widget->allocation.width;
327 attributes.height = widget->allocation.height;
Bram Moolenaar98921892016-02-23 17:14:37 +0100328#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000329 attributes.wclass = GDK_INPUT_OUTPUT;
330 attributes.visual = gtk_widget_get_visual(widget);
Bram Moolenaar98921892016-02-23 17:14:37 +0100331#if GTK_CHECK_VERSION(3,0,0)
332 attributes.event_mask = GDK_EXPOSURE_MASK;
333#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000334 attributes.colormap = gtk_widget_get_colormap(widget);
335 attributes.event_mask = GDK_VISIBILITY_NOTIFY_MASK;
Bram Moolenaar98921892016-02-23 17:14:37 +0100336#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000337
Bram Moolenaar98921892016-02-23 17:14:37 +0100338#if GTK_CHECK_VERSION(3,0,0)
339 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
340#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000341 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
Bram Moolenaar98921892016-02-23 17:14:37 +0100342#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000343
Bram Moolenaar98921892016-02-23 17:14:37 +0100344#if GTK_CHECK_VERSION(3,0,0)
345 gtk_widget_set_window(widget,
346 gdk_window_new(gtk_widget_get_parent_window(widget),
347 &attributes, attributes_mask));
Bram Moolenaar98921892016-02-23 17:14:37 +0100348#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000349 widget->window = gdk_window_new(gtk_widget_get_parent_window(widget),
350 &attributes, attributes_mask);
Bram Moolenaar98921892016-02-23 17:14:37 +0100351#endif
Bram Moolenaar25328e32018-09-11 21:30:09 +0200352 gdk_window_set_user_data(gtk_widget_get_window(widget), widget);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000353
354 attributes.x = 0;
355 attributes.y = 0;
356 attributes.event_mask = gtk_widget_get_events(widget);
357
Bram Moolenaar98921892016-02-23 17:14:37 +0100358 form->bin_window = gdk_window_new(gtk_widget_get_window(widget),
359 &attributes, attributes_mask);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000360 gdk_window_set_user_data(form->bin_window, widget);
361
Bram Moolenaar98921892016-02-23 17:14:37 +0100362#if GTK_CHECK_VERSION(3,0,0)
363 {
364 GtkStyleContext * const sctx = gtk_widget_get_style_context(widget);
365
366 gtk_style_context_add_class(sctx, "gtk-form");
367 gtk_style_context_set_state(sctx, GTK_STATE_FLAG_NORMAL);
368# if !GTK_CHECK_VERSION(3,18,0)
369 gtk_style_context_set_background(sctx, gtk_widget_get_window(widget));
370 gtk_style_context_set_background(sctx, form->bin_window);
371# endif
372 }
373#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000374 widget->style = gtk_style_attach(widget->style, widget->window);
375 gtk_style_set_background(widget->style, widget->window, GTK_STATE_NORMAL);
376 gtk_style_set_background(widget->style, form->bin_window, GTK_STATE_NORMAL);
Bram Moolenaar98921892016-02-23 17:14:37 +0100377#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000378
Bram Moolenaar071d4272004-06-13 20:20:40 +0000379 for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next)
380 {
381 GtkFormChild *child = tmp_list->data;
382
383 gtk_form_attach_child_window(form, child);
384
Bram Moolenaar98921892016-02-23 17:14:37 +0100385#if GTK_CHECK_VERSION(3,0,0)
386 if (gtk_widget_get_visible(child->widget))
387#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000388 if (GTK_WIDGET_VISIBLE(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100389#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000390 gtk_form_realize_child(form, child);
391 }
392}
393
394
395/* After reading the documentation at
396 * http://developer.gnome.org/doc/API/2.0/gtk/gtk-changes-2-0.html
397 * I think it should be possible to remove this function when compiling
398 * against gtk-2.0. It doesn't seem to cause problems, though.
399 *
400 * Well, I reckon at least the gdk_window_show(form->bin_window)
401 * is necessary. GtkForm is anything but a usual container widget.
402 */
403 static void
404gtk_form_map(GtkWidget *widget)
405{
406 GList *tmp_list;
407 GtkForm *form;
408
409 g_return_if_fail(GTK_IS_FORM(widget));
410
411 form = GTK_FORM(widget);
412
Bram Moolenaar98921892016-02-23 17:14:37 +0100413#if GTK_CHECK_VERSION(3,0,0)
414 gtk_widget_set_mapped(widget, TRUE);
415#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000416 GTK_WIDGET_SET_FLAGS(widget, GTK_MAPPED);
Bram Moolenaar98921892016-02-23 17:14:37 +0100417#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000418
Bram Moolenaar98921892016-02-23 17:14:37 +0100419 gdk_window_show(gtk_widget_get_window(widget));
Bram Moolenaar071d4272004-06-13 20:20:40 +0000420 gdk_window_show(form->bin_window);
421
422 for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next)
423 {
424 GtkFormChild *child = tmp_list->data;
425
Bram Moolenaar98921892016-02-23 17:14:37 +0100426#if GTK_CHECK_VERSION(3,0,0)
427 if (gtk_widget_get_visible(child->widget)
428 && !gtk_widget_get_mapped(child->widget))
429#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000430 if (GTK_WIDGET_VISIBLE(child->widget)
431 && !GTK_WIDGET_MAPPED(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100432#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000433 gtk_widget_map(child->widget);
434 }
435}
436
437 static void
438gtk_form_unrealize(GtkWidget *widget)
439{
440 GList *tmp_list;
441 GtkForm *form;
442
443 g_return_if_fail(GTK_IS_FORM(widget));
444
445 form = GTK_FORM(widget);
446
447 tmp_list = form->children;
448
449 gdk_window_set_user_data(form->bin_window, NULL);
450 gdk_window_destroy(form->bin_window);
451 form->bin_window = NULL;
452
453 while (tmp_list)
454 {
455 GtkFormChild *child = tmp_list->data;
456
457 if (child->window != NULL)
458 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100459#if GTK_CHECK_VERSION(3,0,0)
460 g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200461 FUNC2GENERIC(gtk_form_child_map),
Bram Moolenaar98921892016-02-23 17:14:37 +0100462 child);
463 g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200464 FUNC2GENERIC(gtk_form_child_unmap),
Bram Moolenaar98921892016-02-23 17:14:37 +0100465 child);
466#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000467 gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200468 GTK_SIGNAL_FUNC(gtk_form_child_map),
469 child);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000470 gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200471 GTK_SIGNAL_FUNC(gtk_form_child_unmap),
472 child);
Bram Moolenaar98921892016-02-23 17:14:37 +0100473#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000474
475 gdk_window_set_user_data(child->window, NULL);
476 gdk_window_destroy(child->window);
477
478 child->window = NULL;
479 }
480
481 tmp_list = tmp_list->next;
482 }
483
Bram Moolenaar98921892016-02-23 17:14:37 +0100484#if GTK_CHECK_VERSION(3,0,0)
485 if (GTK_WIDGET_CLASS (gtk_form_parent_class)->unrealize)
486 (* GTK_WIDGET_CLASS (gtk_form_parent_class)->unrealize) (widget);
487#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000488 if (GTK_WIDGET_CLASS (parent_class)->unrealize)
489 (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
Bram Moolenaar98921892016-02-23 17:14:37 +0100490#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000491}
492
Bram Moolenaar071d4272004-06-13 20:20:40 +0000493 static void
494gtk_form_size_request(GtkWidget *widget, GtkRequisition *requisition)
495{
Bram Moolenaar071d4272004-06-13 20:20:40 +0000496 g_return_if_fail(GTK_IS_FORM(widget));
Bram Moolenaar99a6e8d2017-03-29 18:07:40 +0200497 g_return_if_fail(requisition != NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000498
Bram Moolenaar98921892016-02-23 17:14:37 +0100499 requisition->width = 1;
500 requisition->height = 1;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000501}
502
Bram Moolenaar98921892016-02-23 17:14:37 +0100503#if GTK_CHECK_VERSION(3,0,0)
504 static void
505gtk_form_get_preferred_width(GtkWidget *widget,
506 gint *minimal_width,
507 gint *natural_width)
508{
509 GtkRequisition requisition;
510
511 gtk_form_size_request(widget, &requisition);
512
513 *minimal_width = requisition.width;
514 *natural_width = requisition.width;
515}
516
517 static void
518gtk_form_get_preferred_height(GtkWidget *widget,
519 gint *minimal_height,
520 gint *natural_height)
521{
522 GtkRequisition requisition;
523
524 gtk_form_size_request(widget, &requisition);
525
526 *minimal_height = requisition.height;
527 *natural_height = requisition.height;
528}
529#endif /* GTK_CHECK_VERSION(3,0,0) */
530
Bram Moolenaar071d4272004-06-13 20:20:40 +0000531 static void
532gtk_form_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
533{
534 GList *tmp_list;
535 GtkForm *form;
536 gboolean need_reposition;
Bram Moolenaar98921892016-02-23 17:14:37 +0100537#if GTK_CHECK_VERSION(3,0,0)
538 GtkAllocation cur_alloc;
539#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000540
541 g_return_if_fail(GTK_IS_FORM(widget));
542
Bram Moolenaar98921892016-02-23 17:14:37 +0100543#if GTK_CHECK_VERSION(3,0,0)
544 gtk_widget_get_allocation(widget, &cur_alloc);
545
546 if (cur_alloc.x == allocation->x
547 && cur_alloc.y == allocation->y
548 && cur_alloc.width == allocation->width
549 && cur_alloc.height == allocation->height)
550#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000551 if (widget->allocation.x == allocation->x
552 && widget->allocation.y == allocation->y
553 && widget->allocation.width == allocation->width
554 && widget->allocation.height == allocation->height)
Bram Moolenaar98921892016-02-23 17:14:37 +0100555#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000556 return;
557
Bram Moolenaar98921892016-02-23 17:14:37 +0100558#if GTK_CHECK_VERSION(3,0,0)
559 need_reposition = cur_alloc.width != allocation->width
560 || cur_alloc.height != allocation->height;
561#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000562 need_reposition = widget->allocation.width != allocation->width
563 || widget->allocation.height != allocation->height;
Bram Moolenaar98921892016-02-23 17:14:37 +0100564#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000565 form = GTK_FORM(widget);
566
567 if (need_reposition)
568 {
569 tmp_list = form->children;
570
571 while (tmp_list)
572 {
573 GtkFormChild *child = tmp_list->data;
574 gtk_form_position_child(form, child, TRUE);
575
576 tmp_list = tmp_list->next;
577 }
578 }
579
Bram Moolenaar98921892016-02-23 17:14:37 +0100580#if GTK_CHECK_VERSION(3,0,0)
581 if (gtk_widget_get_realized(widget))
582#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000583 if (GTK_WIDGET_REALIZED(widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100584#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000585 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100586 gdk_window_move_resize(gtk_widget_get_window(widget),
587 allocation->x, allocation->y,
588 allocation->width, allocation->height);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000589 gdk_window_move_resize(GTK_FORM(widget)->bin_window,
590 0, 0,
591 allocation->width, allocation->height);
592 }
Bram Moolenaar98921892016-02-23 17:14:37 +0100593#if GTK_CHECK_VERSION(3,0,0)
594 gtk_widget_set_allocation(widget, allocation);
595#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000596 widget->allocation = *allocation;
Bram Moolenaar98921892016-02-23 17:14:37 +0100597#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000598 if (need_reposition)
599 gtk_form_send_configure(form);
600}
601
Bram Moolenaar98921892016-02-23 17:14:37 +0100602#if GTK_CHECK_VERSION(3,0,0)
603 static void
604gtk_form_render_background(GtkWidget *widget, cairo_t *cr)
605{
606 gtk_render_background(gtk_widget_get_style_context(widget), cr,
607 0, 0,
608 gtk_widget_get_allocated_width(widget),
609 gtk_widget_get_allocated_height(widget));
610}
611
612 static gboolean
613gtk_form_draw(GtkWidget *widget, cairo_t *cr)
614{
615 GList *tmp_list = NULL;
616 GtkForm *form = NULL;
617
618 g_return_val_if_fail(GTK_IS_FORM(widget), FALSE);
619
620 gtk_form_render_background(widget, cr);
621
622 form = GTK_FORM(widget);
623 for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next)
624 {
625 GtkFormChild * const formchild = tmp_list->data;
626
627 if (!gtk_widget_get_has_window(formchild->widget) &&
628 gtk_cairo_should_draw_window(cr, formchild->window))
629 {
630 /* To get gtk_widget_draw() to work, it is required to call
631 * gtk_widget_size_allocate() in advance with a well-posed
632 * allocation for a given child widget in order to set a
633 * certain private GtkWidget variable, called
634 * widget->priv->alloc_need, to the proper value; othewise,
635 * gtk_widget_draw() fails and the relevant scrollbar won't
636 * appear on the screen.
637 *
638 * Calling gtk_form_position_child() like this is one of ways
639 * to make sure of that. */
640 gtk_form_position_child(form, formchild, TRUE);
641
642 gtk_form_render_background(formchild->widget, cr);
643 }
644 }
645
646 return GTK_WIDGET_CLASS(gtk_form_parent_class)->draw(widget, cr);
647}
648#else /* !GTK_CHECK_VERSION(3,0,0) */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000649 static gint
650gtk_form_expose(GtkWidget *widget, GdkEventExpose *event)
651{
652 GList *tmp_list;
653 GtkForm *form;
654
655 g_return_val_if_fail(GTK_IS_FORM(widget), FALSE);
656
657 form = GTK_FORM(widget);
658
659 if (event->window == form->bin_window)
660 return FALSE;
661
662 for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next)
Bram Moolenaar99a6e8d2017-03-29 18:07:40 +0200663 gtk_container_propagate_expose(GTK_CONTAINER(widget),
664 GTK_WIDGET(((GtkFormChild *)tmp_list->data)->widget),
665 event);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000666
667 return FALSE;
668}
Bram Moolenaar98921892016-02-23 17:14:37 +0100669#endif /* !GTK_CHECK_VERSION(3,0,0) */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000670
671/* Container method
672 */
673 static void
674gtk_form_remove(GtkContainer *container, GtkWidget *widget)
675{
676 GList *tmp_list;
677 GtkForm *form;
678 GtkFormChild *child = NULL; /* init for gcc */
679
680 g_return_if_fail(GTK_IS_FORM(container));
681
682 form = GTK_FORM(container);
683
684 tmp_list = form->children;
685 while (tmp_list)
686 {
687 child = tmp_list->data;
688 if (child->widget == widget)
689 break;
690 tmp_list = tmp_list->next;
691 }
692
693 if (tmp_list)
694 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100695#if GTK_CHECK_VERSION(3,0,0)
696 const gboolean was_visible = gtk_widget_get_visible(widget);
697#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000698 if (child->window)
699 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100700#if GTK_CHECK_VERSION(3,0,0)
701 g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200702 FUNC2GENERIC(&gtk_form_child_map), child);
Bram Moolenaar98921892016-02-23 17:14:37 +0100703 g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200704 FUNC2GENERIC(&gtk_form_child_unmap), child);
Bram Moolenaar98921892016-02-23 17:14:37 +0100705#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000706 gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200707 GTK_SIGNAL_FUNC(&gtk_form_child_map), child);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000708 gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200709 GTK_SIGNAL_FUNC(&gtk_form_child_unmap), child);
Bram Moolenaar98921892016-02-23 17:14:37 +0100710#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000711
712 /* FIXME: This will cause problems for reparenting NO_WINDOW
713 * widgets out of a GtkForm
714 */
715 gdk_window_set_user_data(child->window, NULL);
716 gdk_window_destroy(child->window);
717 }
718 gtk_widget_unparent(widget);
Bram Moolenaar98921892016-02-23 17:14:37 +0100719#if GTK_CHECK_VERSION(3,0,0)
720 if (was_visible)
721 gtk_widget_queue_resize(GTK_WIDGET(container));
722#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000723 form->children = g_list_remove_link(form->children, tmp_list);
724 g_list_free_1(tmp_list);
725 g_free(child);
726 }
727}
728
Bram Moolenaar071d4272004-06-13 20:20:40 +0000729 static void
730gtk_form_forall(GtkContainer *container,
Bram Moolenaarb85cb212009-05-17 14:24:23 +0000731 gboolean include_internals UNUSED,
Bram Moolenaar071d4272004-06-13 20:20:40 +0000732 GtkCallback callback,
733 gpointer callback_data)
734{
735 GtkForm *form;
736 GtkFormChild *child;
737 GList *tmp_list;
738
739 g_return_if_fail(GTK_IS_FORM(container));
740 g_return_if_fail(callback != NULL);
741
742 form = GTK_FORM(container);
743
744 tmp_list = form->children;
745 while (tmp_list)
746 {
747 child = tmp_list->data;
748 tmp_list = tmp_list->next;
749
750 (*callback) (child->widget, callback_data);
751 }
752}
753
754/* Operations on children
755 */
756
757 static void
758gtk_form_attach_child_window(GtkForm *form, GtkFormChild *child)
759{
760 if (child->window != NULL)
761 return; /* been there, done that */
762
Bram Moolenaar98921892016-02-23 17:14:37 +0100763#if GTK_CHECK_VERSION(3,0,0)
764 if (!gtk_widget_get_has_window(child->widget))
765#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000766 if (GTK_WIDGET_NO_WINDOW(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100767#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000768 {
769 GtkWidget *widget;
770 GdkWindowAttr attributes;
771 gint attributes_mask;
772
773 widget = GTK_WIDGET(form);
774
775 attributes.window_type = GDK_WINDOW_CHILD;
776 attributes.x = child->x;
777 attributes.y = child->y;
Bram Moolenaar98921892016-02-23 17:14:37 +0100778#if GTK_CHECK_VERSION(3,0,0)
779 {
780 GtkRequisition requisition;
781
782 gtk_widget_get_preferred_size(child->widget, &requisition, NULL);
783
784 attributes.width = requisition.width;
785 attributes.height = requisition.height;
786 }
787#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000788 attributes.width = child->widget->requisition.width;
789 attributes.height = child->widget->requisition.height;
Bram Moolenaar98921892016-02-23 17:14:37 +0100790#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000791 attributes.wclass = GDK_INPUT_OUTPUT;
792 attributes.visual = gtk_widget_get_visual(widget);
Bram Moolenaar98921892016-02-23 17:14:37 +0100793#if !GTK_CHECK_VERSION(3,0,0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000794 attributes.colormap = gtk_widget_get_colormap(widget);
Bram Moolenaar98921892016-02-23 17:14:37 +0100795#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000796 attributes.event_mask = GDK_EXPOSURE_MASK;
797
Bram Moolenaar98921892016-02-23 17:14:37 +0100798#if GTK_CHECK_VERSION(3,0,0)
799 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
800#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000801 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
Bram Moolenaar98921892016-02-23 17:14:37 +0100802#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000803 child->window = gdk_window_new(form->bin_window,
804 &attributes, attributes_mask);
805 gdk_window_set_user_data(child->window, widget);
806
Bram Moolenaar98921892016-02-23 17:14:37 +0100807#if GTK_CHECK_VERSION(3,0,0)
808 {
809 GtkStyleContext * const sctx = gtk_widget_get_style_context(widget);
810
811 gtk_style_context_set_state(sctx, GTK_STATE_FLAG_NORMAL);
812# if !GTK_CHECK_VERSION(3,18,0)
813 gtk_style_context_set_background(sctx, child->window);
814# endif
815 }
816#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000817 gtk_style_set_background(widget->style,
818 child->window,
819 GTK_STATE_NORMAL);
Bram Moolenaar98921892016-02-23 17:14:37 +0100820#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000821
822 gtk_widget_set_parent_window(child->widget, child->window);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000823 /*
824 * Install signal handlers to map/unmap child->window
825 * alongside with the actual widget.
826 */
Bram Moolenaar98921892016-02-23 17:14:37 +0100827#if GTK_CHECK_VERSION(3,0,0)
828 g_signal_connect(G_OBJECT(child->widget), "map",
829 G_CALLBACK(&gtk_form_child_map), child);
830 g_signal_connect(G_OBJECT(child->widget), "unmap",
831 G_CALLBACK(&gtk_form_child_unmap), child);
832#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000833 gtk_signal_connect(GTK_OBJECT(child->widget), "map",
834 GTK_SIGNAL_FUNC(&gtk_form_child_map), child);
835 gtk_signal_connect(GTK_OBJECT(child->widget), "unmap",
836 GTK_SIGNAL_FUNC(&gtk_form_child_unmap), child);
Bram Moolenaar98921892016-02-23 17:14:37 +0100837#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000838 }
Bram Moolenaar98921892016-02-23 17:14:37 +0100839#if GTK_CHECK_VERSION(3,0,0)
840 else if (!gtk_widget_get_realized(child->widget))
841#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000842 else if (!GTK_WIDGET_REALIZED(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100843#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000844 {
845 gtk_widget_set_parent_window(child->widget, form->bin_window);
846 }
847}
848
849 static void
850gtk_form_realize_child(GtkForm *form, GtkFormChild *child)
851{
852 gtk_form_attach_child_window(form, child);
853 gtk_widget_realize(child->widget);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000854}
855
856 static void
857gtk_form_position_child(GtkForm *form, GtkFormChild *child,
858 gboolean force_allocate)
859{
860 gint x;
861 gint y;
862
863 x = child->x;
864 y = child->y;
865
866 if ((x >= G_MINSHORT) && (x <= G_MAXSHORT) &&
867 (y >= G_MINSHORT) && (y <= G_MAXSHORT))
868 {
869 if (!child->mapped)
870 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100871#if GTK_CHECK_VERSION(3,0,0)
872 if (gtk_widget_get_mapped(GTK_WIDGET(form))
873 && gtk_widget_get_visible(child->widget))
874#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000875 if (GTK_WIDGET_MAPPED(form) && GTK_WIDGET_VISIBLE(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100876#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000877 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100878#if GTK_CHECK_VERSION(3,0,0)
879 if (!gtk_widget_get_mapped(child->widget))
880#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000881 if (!GTK_WIDGET_MAPPED(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100882#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000883 gtk_widget_map(child->widget);
884
885 child->mapped = TRUE;
886 force_allocate = TRUE;
887 }
888 }
889
890 if (force_allocate)
891 {
892 GtkAllocation allocation;
Bram Moolenaar98921892016-02-23 17:14:37 +0100893#if GTK_CHECK_VERSION(3,0,0)
894 GtkRequisition requisition;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000895
Bram Moolenaar98921892016-02-23 17:14:37 +0100896 gtk_widget_get_preferred_size(child->widget, &requisition, NULL);
897#endif
898
899#if GTK_CHECK_VERSION(3,0,0)
900 if (!gtk_widget_get_has_window(child->widget))
901#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000902 if (GTK_WIDGET_NO_WINDOW(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100903#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000904 {
905 if (child->window)
906 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100907#if GTK_CHECK_VERSION(3,0,0)
908 gdk_window_move_resize(child->window,
909 x, y,
910 requisition.width,
911 requisition.height);
912#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000913 gdk_window_move_resize(child->window,
914 x, y,
915 child->widget->requisition.width,
916 child->widget->requisition.height);
Bram Moolenaar98921892016-02-23 17:14:37 +0100917#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000918 }
919
920 allocation.x = 0;
921 allocation.y = 0;
922 }
923 else
924 {
925 allocation.x = x;
926 allocation.y = y;
927 }
928
Bram Moolenaar98921892016-02-23 17:14:37 +0100929#if GTK_CHECK_VERSION(3,0,0)
930 allocation.width = requisition.width;
931 allocation.height = requisition.height;
932#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000933 allocation.width = child->widget->requisition.width;
934 allocation.height = child->widget->requisition.height;
Bram Moolenaar98921892016-02-23 17:14:37 +0100935#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000936
937 gtk_widget_size_allocate(child->widget, &allocation);
938 }
939 }
940 else
941 {
942 if (child->mapped)
943 {
944 child->mapped = FALSE;
945
Bram Moolenaar98921892016-02-23 17:14:37 +0100946#if GTK_CHECK_VERSION(3,0,0)
947 if (gtk_widget_get_mapped(child->widget))
948#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000949 if (GTK_WIDGET_MAPPED(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100950#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000951 gtk_widget_unmap(child->widget);
952 }
953 }
954}
955
956 static void
957gtk_form_position_children(GtkForm *form)
958{
959 GList *tmp_list;
960
961 for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next)
962 gtk_form_position_child(form, tmp_list->data, FALSE);
963}
964
Bram Moolenaar071d4272004-06-13 20:20:40 +0000965 void
966gtk_form_move_resize(GtkForm *form, GtkWidget *widget,
967 gint x, gint y, gint w, gint h)
968{
Bram Moolenaar98921892016-02-23 17:14:37 +0100969#if GTK_CHECK_VERSION(3,0,0)
970 gtk_widget_set_size_request(widget, w, h);
971#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000972 widget->requisition.width = w;
973 widget->requisition.height = h;
Bram Moolenaar98921892016-02-23 17:14:37 +0100974#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000975
976 gtk_form_move(form, widget, x, y);
977}
978
979 static void
980gtk_form_send_configure(GtkForm *form)
981{
982 GtkWidget *widget;
983 GdkEventConfigure event;
984
985 widget = GTK_WIDGET(form);
986
987 event.type = GDK_CONFIGURE;
Bram Moolenaar98921892016-02-23 17:14:37 +0100988#if GTK_CHECK_VERSION(3,0,0)
989 event.window = gtk_widget_get_window(widget);
990 {
991 GtkAllocation allocation;
992
993 gtk_widget_get_allocation(widget, &allocation);
994 event.x = allocation.x;
995 event.y = allocation.y;
996 event.width = allocation.width;
997 event.height = allocation.height;
998 }
999#else
Bram Moolenaar071d4272004-06-13 20:20:40 +00001000 event.window = widget->window;
1001 event.x = widget->allocation.x;
1002 event.y = widget->allocation.y;
1003 event.width = widget->allocation.width;
1004 event.height = widget->allocation.height;
Bram Moolenaar98921892016-02-23 17:14:37 +01001005#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001006
Bram Moolenaar071d4272004-06-13 20:20:40 +00001007 gtk_main_do_event((GdkEvent*)&event);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001008}
1009
Bram Moolenaar071d4272004-06-13 20:20:40 +00001010 static void
Bram Moolenaarb85cb212009-05-17 14:24:23 +00001011gtk_form_child_map(GtkWidget *widget UNUSED, gpointer user_data)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001012{
1013 GtkFormChild *child;
1014
1015 child = (GtkFormChild *)user_data;
1016
1017 child->mapped = TRUE;
1018 gdk_window_show(child->window);
1019}
1020
Bram Moolenaar071d4272004-06-13 20:20:40 +00001021 static void
Bram Moolenaarb85cb212009-05-17 14:24:23 +00001022gtk_form_child_unmap(GtkWidget *widget UNUSED, gpointer user_data)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001023{
1024 GtkFormChild *child;
1025
1026 child = (GtkFormChild *)user_data;
1027
1028 child->mapped = FALSE;
1029 gdk_window_hide(child->window);
1030}