blob: bb4c632b02d0041446e381434104e91b3d23705c [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));
348 gdk_window_set_user_data(gtk_widget_get_window(widget), widget);
349#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000350 widget->window = gdk_window_new(gtk_widget_get_parent_window(widget),
351 &attributes, attributes_mask);
352 gdk_window_set_user_data(widget->window, widget);
Bram Moolenaar98921892016-02-23 17:14:37 +0100353#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000354
355 attributes.x = 0;
356 attributes.y = 0;
357 attributes.event_mask = gtk_widget_get_events(widget);
358
Bram Moolenaar98921892016-02-23 17:14:37 +0100359#if GTK_CHECK_VERSION(3,0,0)
360 form->bin_window = gdk_window_new(gtk_widget_get_window(widget),
361 &attributes, attributes_mask);
362#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363 form->bin_window = gdk_window_new(widget->window,
364 &attributes, attributes_mask);
Bram Moolenaar98921892016-02-23 17:14:37 +0100365#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000366 gdk_window_set_user_data(form->bin_window, widget);
367
Bram Moolenaar98921892016-02-23 17:14:37 +0100368#if GTK_CHECK_VERSION(3,0,0)
369 {
370 GtkStyleContext * const sctx = gtk_widget_get_style_context(widget);
371
372 gtk_style_context_add_class(sctx, "gtk-form");
373 gtk_style_context_set_state(sctx, GTK_STATE_FLAG_NORMAL);
374# if !GTK_CHECK_VERSION(3,18,0)
375 gtk_style_context_set_background(sctx, gtk_widget_get_window(widget));
376 gtk_style_context_set_background(sctx, form->bin_window);
377# endif
378 }
379#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000380 widget->style = gtk_style_attach(widget->style, widget->window);
381 gtk_style_set_background(widget->style, widget->window, GTK_STATE_NORMAL);
382 gtk_style_set_background(widget->style, form->bin_window, GTK_STATE_NORMAL);
Bram Moolenaar98921892016-02-23 17:14:37 +0100383#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000384
Bram Moolenaar071d4272004-06-13 20:20:40 +0000385 for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next)
386 {
387 GtkFormChild *child = tmp_list->data;
388
389 gtk_form_attach_child_window(form, child);
390
Bram Moolenaar98921892016-02-23 17:14:37 +0100391#if GTK_CHECK_VERSION(3,0,0)
392 if (gtk_widget_get_visible(child->widget))
393#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000394 if (GTK_WIDGET_VISIBLE(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100395#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000396 gtk_form_realize_child(form, child);
397 }
398}
399
400
401/* After reading the documentation at
402 * http://developer.gnome.org/doc/API/2.0/gtk/gtk-changes-2-0.html
403 * I think it should be possible to remove this function when compiling
404 * against gtk-2.0. It doesn't seem to cause problems, though.
405 *
406 * Well, I reckon at least the gdk_window_show(form->bin_window)
407 * is necessary. GtkForm is anything but a usual container widget.
408 */
409 static void
410gtk_form_map(GtkWidget *widget)
411{
412 GList *tmp_list;
413 GtkForm *form;
414
415 g_return_if_fail(GTK_IS_FORM(widget));
416
417 form = GTK_FORM(widget);
418
Bram Moolenaar98921892016-02-23 17:14:37 +0100419#if GTK_CHECK_VERSION(3,0,0)
420 gtk_widget_set_mapped(widget, TRUE);
421#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000422 GTK_WIDGET_SET_FLAGS(widget, GTK_MAPPED);
Bram Moolenaar98921892016-02-23 17:14:37 +0100423#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000424
Bram Moolenaar98921892016-02-23 17:14:37 +0100425#if GTK_CHECK_VERSION(3,0,0)
426 gdk_window_show(gtk_widget_get_window(widget));
427#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000428 gdk_window_show(widget->window);
Bram Moolenaar98921892016-02-23 17:14:37 +0100429#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000430 gdk_window_show(form->bin_window);
431
432 for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next)
433 {
434 GtkFormChild *child = tmp_list->data;
435
Bram Moolenaar98921892016-02-23 17:14:37 +0100436#if GTK_CHECK_VERSION(3,0,0)
437 if (gtk_widget_get_visible(child->widget)
438 && !gtk_widget_get_mapped(child->widget))
439#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000440 if (GTK_WIDGET_VISIBLE(child->widget)
441 && !GTK_WIDGET_MAPPED(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100442#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000443 gtk_widget_map(child->widget);
444 }
445}
446
447 static void
448gtk_form_unrealize(GtkWidget *widget)
449{
450 GList *tmp_list;
451 GtkForm *form;
452
453 g_return_if_fail(GTK_IS_FORM(widget));
454
455 form = GTK_FORM(widget);
456
457 tmp_list = form->children;
458
459 gdk_window_set_user_data(form->bin_window, NULL);
460 gdk_window_destroy(form->bin_window);
461 form->bin_window = NULL;
462
463 while (tmp_list)
464 {
465 GtkFormChild *child = tmp_list->data;
466
467 if (child->window != NULL)
468 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100469#if GTK_CHECK_VERSION(3,0,0)
470 g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200471 FUNC2GENERIC(gtk_form_child_map),
Bram Moolenaar98921892016-02-23 17:14:37 +0100472 child);
473 g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200474 FUNC2GENERIC(gtk_form_child_unmap),
Bram Moolenaar98921892016-02-23 17:14:37 +0100475 child);
476#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000477 gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200478 GTK_SIGNAL_FUNC(gtk_form_child_map),
479 child);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000480 gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200481 GTK_SIGNAL_FUNC(gtk_form_child_unmap),
482 child);
Bram Moolenaar98921892016-02-23 17:14:37 +0100483#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000484
485 gdk_window_set_user_data(child->window, NULL);
486 gdk_window_destroy(child->window);
487
488 child->window = NULL;
489 }
490
491 tmp_list = tmp_list->next;
492 }
493
Bram Moolenaar98921892016-02-23 17:14:37 +0100494#if GTK_CHECK_VERSION(3,0,0)
495 if (GTK_WIDGET_CLASS (gtk_form_parent_class)->unrealize)
496 (* GTK_WIDGET_CLASS (gtk_form_parent_class)->unrealize) (widget);
497#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000498 if (GTK_WIDGET_CLASS (parent_class)->unrealize)
499 (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
Bram Moolenaar98921892016-02-23 17:14:37 +0100500#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000501}
502
Bram Moolenaar071d4272004-06-13 20:20:40 +0000503 static void
504gtk_form_size_request(GtkWidget *widget, GtkRequisition *requisition)
505{
Bram Moolenaar071d4272004-06-13 20:20:40 +0000506 g_return_if_fail(GTK_IS_FORM(widget));
Bram Moolenaar99a6e8d2017-03-29 18:07:40 +0200507 g_return_if_fail(requisition != NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000508
Bram Moolenaar98921892016-02-23 17:14:37 +0100509 requisition->width = 1;
510 requisition->height = 1;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000511}
512
Bram Moolenaar98921892016-02-23 17:14:37 +0100513#if GTK_CHECK_VERSION(3,0,0)
514 static void
515gtk_form_get_preferred_width(GtkWidget *widget,
516 gint *minimal_width,
517 gint *natural_width)
518{
519 GtkRequisition requisition;
520
521 gtk_form_size_request(widget, &requisition);
522
523 *minimal_width = requisition.width;
524 *natural_width = requisition.width;
525}
526
527 static void
528gtk_form_get_preferred_height(GtkWidget *widget,
529 gint *minimal_height,
530 gint *natural_height)
531{
532 GtkRequisition requisition;
533
534 gtk_form_size_request(widget, &requisition);
535
536 *minimal_height = requisition.height;
537 *natural_height = requisition.height;
538}
539#endif /* GTK_CHECK_VERSION(3,0,0) */
540
Bram Moolenaar071d4272004-06-13 20:20:40 +0000541 static void
542gtk_form_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
543{
544 GList *tmp_list;
545 GtkForm *form;
546 gboolean need_reposition;
Bram Moolenaar98921892016-02-23 17:14:37 +0100547#if GTK_CHECK_VERSION(3,0,0)
548 GtkAllocation cur_alloc;
549#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000550
551 g_return_if_fail(GTK_IS_FORM(widget));
552
Bram Moolenaar98921892016-02-23 17:14:37 +0100553#if GTK_CHECK_VERSION(3,0,0)
554 gtk_widget_get_allocation(widget, &cur_alloc);
555
556 if (cur_alloc.x == allocation->x
557 && cur_alloc.y == allocation->y
558 && cur_alloc.width == allocation->width
559 && cur_alloc.height == allocation->height)
560#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000561 if (widget->allocation.x == allocation->x
562 && widget->allocation.y == allocation->y
563 && widget->allocation.width == allocation->width
564 && widget->allocation.height == allocation->height)
Bram Moolenaar98921892016-02-23 17:14:37 +0100565#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000566 return;
567
Bram Moolenaar98921892016-02-23 17:14:37 +0100568#if GTK_CHECK_VERSION(3,0,0)
569 need_reposition = cur_alloc.width != allocation->width
570 || cur_alloc.height != allocation->height;
571#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000572 need_reposition = widget->allocation.width != allocation->width
573 || widget->allocation.height != allocation->height;
Bram Moolenaar98921892016-02-23 17:14:37 +0100574#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000575 form = GTK_FORM(widget);
576
577 if (need_reposition)
578 {
579 tmp_list = form->children;
580
581 while (tmp_list)
582 {
583 GtkFormChild *child = tmp_list->data;
584 gtk_form_position_child(form, child, TRUE);
585
586 tmp_list = tmp_list->next;
587 }
588 }
589
Bram Moolenaar98921892016-02-23 17:14:37 +0100590#if GTK_CHECK_VERSION(3,0,0)
591 if (gtk_widget_get_realized(widget))
592#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000593 if (GTK_WIDGET_REALIZED(widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100594#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000595 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100596#if GTK_CHECK_VERSION(3,0,0)
597 gdk_window_move_resize(gtk_widget_get_window(widget),
598 allocation->x, allocation->y,
599 allocation->width, allocation->height);
600#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000601 gdk_window_move_resize(widget->window,
602 allocation->x, allocation->y,
603 allocation->width, allocation->height);
Bram Moolenaar98921892016-02-23 17:14:37 +0100604#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000605 gdk_window_move_resize(GTK_FORM(widget)->bin_window,
606 0, 0,
607 allocation->width, allocation->height);
608 }
Bram Moolenaar98921892016-02-23 17:14:37 +0100609#if GTK_CHECK_VERSION(3,0,0)
610 gtk_widget_set_allocation(widget, allocation);
611#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000612 widget->allocation = *allocation;
Bram Moolenaar98921892016-02-23 17:14:37 +0100613#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000614 if (need_reposition)
615 gtk_form_send_configure(form);
616}
617
Bram Moolenaar98921892016-02-23 17:14:37 +0100618#if GTK_CHECK_VERSION(3,0,0)
619 static void
620gtk_form_render_background(GtkWidget *widget, cairo_t *cr)
621{
622 gtk_render_background(gtk_widget_get_style_context(widget), cr,
623 0, 0,
624 gtk_widget_get_allocated_width(widget),
625 gtk_widget_get_allocated_height(widget));
626}
627
628 static gboolean
629gtk_form_draw(GtkWidget *widget, cairo_t *cr)
630{
631 GList *tmp_list = NULL;
632 GtkForm *form = NULL;
633
634 g_return_val_if_fail(GTK_IS_FORM(widget), FALSE);
635
636 gtk_form_render_background(widget, cr);
637
638 form = GTK_FORM(widget);
639 for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next)
640 {
641 GtkFormChild * const formchild = tmp_list->data;
642
643 if (!gtk_widget_get_has_window(formchild->widget) &&
644 gtk_cairo_should_draw_window(cr, formchild->window))
645 {
646 /* To get gtk_widget_draw() to work, it is required to call
647 * gtk_widget_size_allocate() in advance with a well-posed
648 * allocation for a given child widget in order to set a
649 * certain private GtkWidget variable, called
650 * widget->priv->alloc_need, to the proper value; othewise,
651 * gtk_widget_draw() fails and the relevant scrollbar won't
652 * appear on the screen.
653 *
654 * Calling gtk_form_position_child() like this is one of ways
655 * to make sure of that. */
656 gtk_form_position_child(form, formchild, TRUE);
657
658 gtk_form_render_background(formchild->widget, cr);
659 }
660 }
661
662 return GTK_WIDGET_CLASS(gtk_form_parent_class)->draw(widget, cr);
663}
664#else /* !GTK_CHECK_VERSION(3,0,0) */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000665 static gint
666gtk_form_expose(GtkWidget *widget, GdkEventExpose *event)
667{
668 GList *tmp_list;
669 GtkForm *form;
670
671 g_return_val_if_fail(GTK_IS_FORM(widget), FALSE);
672
673 form = GTK_FORM(widget);
674
675 if (event->window == form->bin_window)
676 return FALSE;
677
678 for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next)
Bram Moolenaar99a6e8d2017-03-29 18:07:40 +0200679 gtk_container_propagate_expose(GTK_CONTAINER(widget),
680 GTK_WIDGET(((GtkFormChild *)tmp_list->data)->widget),
681 event);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000682
683 return FALSE;
684}
Bram Moolenaar98921892016-02-23 17:14:37 +0100685#endif /* !GTK_CHECK_VERSION(3,0,0) */
Bram Moolenaar071d4272004-06-13 20:20:40 +0000686
687/* Container method
688 */
689 static void
690gtk_form_remove(GtkContainer *container, GtkWidget *widget)
691{
692 GList *tmp_list;
693 GtkForm *form;
694 GtkFormChild *child = NULL; /* init for gcc */
695
696 g_return_if_fail(GTK_IS_FORM(container));
697
698 form = GTK_FORM(container);
699
700 tmp_list = form->children;
701 while (tmp_list)
702 {
703 child = tmp_list->data;
704 if (child->widget == widget)
705 break;
706 tmp_list = tmp_list->next;
707 }
708
709 if (tmp_list)
710 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100711#if GTK_CHECK_VERSION(3,0,0)
712 const gboolean was_visible = gtk_widget_get_visible(widget);
713#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000714 if (child->window)
715 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100716#if GTK_CHECK_VERSION(3,0,0)
717 g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200718 FUNC2GENERIC(&gtk_form_child_map), child);
Bram Moolenaar98921892016-02-23 17:14:37 +0100719 g_signal_handlers_disconnect_by_func(G_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200720 FUNC2GENERIC(&gtk_form_child_unmap), child);
Bram Moolenaar98921892016-02-23 17:14:37 +0100721#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000722 gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200723 GTK_SIGNAL_FUNC(&gtk_form_child_map), child);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000724 gtk_signal_disconnect_by_func(GTK_OBJECT(child->widget),
Bram Moolenaard47d8372016-09-09 22:13:24 +0200725 GTK_SIGNAL_FUNC(&gtk_form_child_unmap), child);
Bram Moolenaar98921892016-02-23 17:14:37 +0100726#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000727
728 /* FIXME: This will cause problems for reparenting NO_WINDOW
729 * widgets out of a GtkForm
730 */
731 gdk_window_set_user_data(child->window, NULL);
732 gdk_window_destroy(child->window);
733 }
734 gtk_widget_unparent(widget);
Bram Moolenaar98921892016-02-23 17:14:37 +0100735#if GTK_CHECK_VERSION(3,0,0)
736 if (was_visible)
737 gtk_widget_queue_resize(GTK_WIDGET(container));
738#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000739 form->children = g_list_remove_link(form->children, tmp_list);
740 g_list_free_1(tmp_list);
741 g_free(child);
742 }
743}
744
Bram Moolenaar071d4272004-06-13 20:20:40 +0000745 static void
746gtk_form_forall(GtkContainer *container,
Bram Moolenaarb85cb212009-05-17 14:24:23 +0000747 gboolean include_internals UNUSED,
Bram Moolenaar071d4272004-06-13 20:20:40 +0000748 GtkCallback callback,
749 gpointer callback_data)
750{
751 GtkForm *form;
752 GtkFormChild *child;
753 GList *tmp_list;
754
755 g_return_if_fail(GTK_IS_FORM(container));
756 g_return_if_fail(callback != NULL);
757
758 form = GTK_FORM(container);
759
760 tmp_list = form->children;
761 while (tmp_list)
762 {
763 child = tmp_list->data;
764 tmp_list = tmp_list->next;
765
766 (*callback) (child->widget, callback_data);
767 }
768}
769
770/* Operations on children
771 */
772
773 static void
774gtk_form_attach_child_window(GtkForm *form, GtkFormChild *child)
775{
776 if (child->window != NULL)
777 return; /* been there, done that */
778
Bram Moolenaar98921892016-02-23 17:14:37 +0100779#if GTK_CHECK_VERSION(3,0,0)
780 if (!gtk_widget_get_has_window(child->widget))
781#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000782 if (GTK_WIDGET_NO_WINDOW(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100783#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000784 {
785 GtkWidget *widget;
786 GdkWindowAttr attributes;
787 gint attributes_mask;
788
789 widget = GTK_WIDGET(form);
790
791 attributes.window_type = GDK_WINDOW_CHILD;
792 attributes.x = child->x;
793 attributes.y = child->y;
Bram Moolenaar98921892016-02-23 17:14:37 +0100794#if GTK_CHECK_VERSION(3,0,0)
795 {
796 GtkRequisition requisition;
797
798 gtk_widget_get_preferred_size(child->widget, &requisition, NULL);
799
800 attributes.width = requisition.width;
801 attributes.height = requisition.height;
802 }
803#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000804 attributes.width = child->widget->requisition.width;
805 attributes.height = child->widget->requisition.height;
Bram Moolenaar98921892016-02-23 17:14:37 +0100806#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000807 attributes.wclass = GDK_INPUT_OUTPUT;
808 attributes.visual = gtk_widget_get_visual(widget);
Bram Moolenaar98921892016-02-23 17:14:37 +0100809#if !GTK_CHECK_VERSION(3,0,0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000810 attributes.colormap = gtk_widget_get_colormap(widget);
Bram Moolenaar98921892016-02-23 17:14:37 +0100811#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000812 attributes.event_mask = GDK_EXPOSURE_MASK;
813
Bram Moolenaar98921892016-02-23 17:14:37 +0100814#if GTK_CHECK_VERSION(3,0,0)
815 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL;
816#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000817 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
Bram Moolenaar98921892016-02-23 17:14:37 +0100818#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000819 child->window = gdk_window_new(form->bin_window,
820 &attributes, attributes_mask);
821 gdk_window_set_user_data(child->window, widget);
822
Bram Moolenaar98921892016-02-23 17:14:37 +0100823#if GTK_CHECK_VERSION(3,0,0)
824 {
825 GtkStyleContext * const sctx = gtk_widget_get_style_context(widget);
826
827 gtk_style_context_set_state(sctx, GTK_STATE_FLAG_NORMAL);
828# if !GTK_CHECK_VERSION(3,18,0)
829 gtk_style_context_set_background(sctx, child->window);
830# endif
831 }
832#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000833 gtk_style_set_background(widget->style,
834 child->window,
835 GTK_STATE_NORMAL);
Bram Moolenaar98921892016-02-23 17:14:37 +0100836#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000837
838 gtk_widget_set_parent_window(child->widget, child->window);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000839 /*
840 * Install signal handlers to map/unmap child->window
841 * alongside with the actual widget.
842 */
Bram Moolenaar98921892016-02-23 17:14:37 +0100843#if GTK_CHECK_VERSION(3,0,0)
844 g_signal_connect(G_OBJECT(child->widget), "map",
845 G_CALLBACK(&gtk_form_child_map), child);
846 g_signal_connect(G_OBJECT(child->widget), "unmap",
847 G_CALLBACK(&gtk_form_child_unmap), child);
848#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000849 gtk_signal_connect(GTK_OBJECT(child->widget), "map",
850 GTK_SIGNAL_FUNC(&gtk_form_child_map), child);
851 gtk_signal_connect(GTK_OBJECT(child->widget), "unmap",
852 GTK_SIGNAL_FUNC(&gtk_form_child_unmap), child);
Bram Moolenaar98921892016-02-23 17:14:37 +0100853#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000854 }
Bram Moolenaar98921892016-02-23 17:14:37 +0100855#if GTK_CHECK_VERSION(3,0,0)
856 else if (!gtk_widget_get_realized(child->widget))
857#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000858 else if (!GTK_WIDGET_REALIZED(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100859#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000860 {
861 gtk_widget_set_parent_window(child->widget, form->bin_window);
862 }
863}
864
865 static void
866gtk_form_realize_child(GtkForm *form, GtkFormChild *child)
867{
868 gtk_form_attach_child_window(form, child);
869 gtk_widget_realize(child->widget);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000870}
871
872 static void
873gtk_form_position_child(GtkForm *form, GtkFormChild *child,
874 gboolean force_allocate)
875{
876 gint x;
877 gint y;
878
879 x = child->x;
880 y = child->y;
881
882 if ((x >= G_MINSHORT) && (x <= G_MAXSHORT) &&
883 (y >= G_MINSHORT) && (y <= G_MAXSHORT))
884 {
885 if (!child->mapped)
886 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100887#if GTK_CHECK_VERSION(3,0,0)
888 if (gtk_widget_get_mapped(GTK_WIDGET(form))
889 && gtk_widget_get_visible(child->widget))
890#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000891 if (GTK_WIDGET_MAPPED(form) && GTK_WIDGET_VISIBLE(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100892#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000893 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100894#if GTK_CHECK_VERSION(3,0,0)
895 if (!gtk_widget_get_mapped(child->widget))
896#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000897 if (!GTK_WIDGET_MAPPED(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100898#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000899 gtk_widget_map(child->widget);
900
901 child->mapped = TRUE;
902 force_allocate = TRUE;
903 }
904 }
905
906 if (force_allocate)
907 {
908 GtkAllocation allocation;
Bram Moolenaar98921892016-02-23 17:14:37 +0100909#if GTK_CHECK_VERSION(3,0,0)
910 GtkRequisition requisition;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000911
Bram Moolenaar98921892016-02-23 17:14:37 +0100912 gtk_widget_get_preferred_size(child->widget, &requisition, NULL);
913#endif
914
915#if GTK_CHECK_VERSION(3,0,0)
916 if (!gtk_widget_get_has_window(child->widget))
917#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000918 if (GTK_WIDGET_NO_WINDOW(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100919#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000920 {
921 if (child->window)
922 {
Bram Moolenaar98921892016-02-23 17:14:37 +0100923#if GTK_CHECK_VERSION(3,0,0)
924 gdk_window_move_resize(child->window,
925 x, y,
926 requisition.width,
927 requisition.height);
928#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000929 gdk_window_move_resize(child->window,
930 x, y,
931 child->widget->requisition.width,
932 child->widget->requisition.height);
Bram Moolenaar98921892016-02-23 17:14:37 +0100933#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000934 }
935
936 allocation.x = 0;
937 allocation.y = 0;
938 }
939 else
940 {
941 allocation.x = x;
942 allocation.y = y;
943 }
944
Bram Moolenaar98921892016-02-23 17:14:37 +0100945#if GTK_CHECK_VERSION(3,0,0)
946 allocation.width = requisition.width;
947 allocation.height = requisition.height;
948#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000949 allocation.width = child->widget->requisition.width;
950 allocation.height = child->widget->requisition.height;
Bram Moolenaar98921892016-02-23 17:14:37 +0100951#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000952
953 gtk_widget_size_allocate(child->widget, &allocation);
954 }
955 }
956 else
957 {
958 if (child->mapped)
959 {
960 child->mapped = FALSE;
961
Bram Moolenaar98921892016-02-23 17:14:37 +0100962#if GTK_CHECK_VERSION(3,0,0)
963 if (gtk_widget_get_mapped(child->widget))
964#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000965 if (GTK_WIDGET_MAPPED(child->widget))
Bram Moolenaar98921892016-02-23 17:14:37 +0100966#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000967 gtk_widget_unmap(child->widget);
968 }
969 }
970}
971
972 static void
973gtk_form_position_children(GtkForm *form)
974{
975 GList *tmp_list;
976
977 for (tmp_list = form->children; tmp_list; tmp_list = tmp_list->next)
978 gtk_form_position_child(form, tmp_list->data, FALSE);
979}
980
Bram Moolenaar071d4272004-06-13 20:20:40 +0000981 void
982gtk_form_move_resize(GtkForm *form, GtkWidget *widget,
983 gint x, gint y, gint w, gint h)
984{
Bram Moolenaar98921892016-02-23 17:14:37 +0100985#if GTK_CHECK_VERSION(3,0,0)
986 gtk_widget_set_size_request(widget, w, h);
987#else
Bram Moolenaar071d4272004-06-13 20:20:40 +0000988 widget->requisition.width = w;
989 widget->requisition.height = h;
Bram Moolenaar98921892016-02-23 17:14:37 +0100990#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000991
992 gtk_form_move(form, widget, x, y);
993}
994
995 static void
996gtk_form_send_configure(GtkForm *form)
997{
998 GtkWidget *widget;
999 GdkEventConfigure event;
1000
1001 widget = GTK_WIDGET(form);
1002
1003 event.type = GDK_CONFIGURE;
Bram Moolenaar98921892016-02-23 17:14:37 +01001004#if GTK_CHECK_VERSION(3,0,0)
1005 event.window = gtk_widget_get_window(widget);
1006 {
1007 GtkAllocation allocation;
1008
1009 gtk_widget_get_allocation(widget, &allocation);
1010 event.x = allocation.x;
1011 event.y = allocation.y;
1012 event.width = allocation.width;
1013 event.height = allocation.height;
1014 }
1015#else
Bram Moolenaar071d4272004-06-13 20:20:40 +00001016 event.window = widget->window;
1017 event.x = widget->allocation.x;
1018 event.y = widget->allocation.y;
1019 event.width = widget->allocation.width;
1020 event.height = widget->allocation.height;
Bram Moolenaar98921892016-02-23 17:14:37 +01001021#endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001022
Bram Moolenaar071d4272004-06-13 20:20:40 +00001023 gtk_main_do_event((GdkEvent*)&event);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001024}
1025
Bram Moolenaar071d4272004-06-13 20:20:40 +00001026 static void
Bram Moolenaarb85cb212009-05-17 14:24:23 +00001027gtk_form_child_map(GtkWidget *widget UNUSED, gpointer user_data)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001028{
1029 GtkFormChild *child;
1030
1031 child = (GtkFormChild *)user_data;
1032
1033 child->mapped = TRUE;
1034 gdk_window_show(child->window);
1035}
1036
Bram Moolenaar071d4272004-06-13 20:20:40 +00001037 static void
Bram Moolenaarb85cb212009-05-17 14:24:23 +00001038gtk_form_child_unmap(GtkWidget *widget UNUSED, gpointer user_data)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001039{
1040 GtkFormChild *child;
1041
1042 child = (GtkFormChild *)user_data;
1043
1044 child->mapped = FALSE;
1045 gdk_window_hide(child->window);
1046}