]> Pileus Git - ~andy/gtk/blob - gtk/gtkwidget.c
widget: silence g-i scanner warning
[~andy/gtk] / gtk / gtkwidget.c
1 /* GTK - The GIMP Toolkit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 /*
19  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
20  * file for a list of people on the GTK+ Team.  See the ChangeLog
21  * files for a list of changes.  These files are distributed with
22  * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
23  */
24
25 #include "config.h"
26
27 #include <stdarg.h>
28 #include <string.h>
29 #include <locale.h>
30
31 #include <gobject/gvaluecollector.h>
32 #include <gobject/gobjectnotifyqueue.c>
33 #include <cairo-gobject.h>
34
35 #include "gtkcontainer.h"
36 #include "gtkaccelmapprivate.h"
37 #include "gtkclipboard.h"
38 #include "gtkiconfactory.h"
39 #include "gtkintl.h"
40 #include "gtkmarshalers.h"
41 #include "gtkselectionprivate.h"
42 #include "gtksettingsprivate.h"
43 #include "gtksizegroup-private.h"
44 #include "gtkwidget.h"
45 #include "gtkwidgetprivate.h"
46 #include "gtkwindowprivate.h"
47 #include "gtkcontainerprivate.h"
48 #include "gtkbindings.h"
49 #include "gtkprivate.h"
50 #include "gtkaccessible.h"
51 #include "gtktooltip.h"
52 #include "gtkinvisible.h"
53 #include "gtkbuildable.h"
54 #include "gtkbuilderprivate.h"
55 #include "gtksizerequest.h"
56 #include "gtkstylecontextprivate.h"
57 #include "gtksymboliccolor.h"
58 #include "gtkcssprovider.h"
59 #include "gtkmodifierstyle.h"
60 #include "gtkversion.h"
61 #include "gtkdebug.h"
62 #include "gtkplug.h"
63 #include "gtktypebuiltins.h"
64 #include "a11y/gtkwidgetaccessible.h"
65
66 /**
67  * SECTION:gtkwidget
68  * @Short_description: Base class for all widgets
69  * @Title: GtkWidget
70  *
71  * GtkWidget is the base class all widgets in GTK+ derive from. It manages the
72  * widget lifecycle, states and style.
73  *
74  * <refsect2 id="geometry-management">
75  * <title>Height-for-width Geometry Management</title>
76  * <para>
77  * GTK+ uses a height-for-width (and width-for-height) geometry management
78  * system. Height-for-width means that a widget can change how much
79  * vertical space it needs, depending on the amount of horizontal space
80  * that it is given (and similar for width-for-height). The most common
81  * example is a label that reflows to fill up the available width, wraps
82  * to fewer lines, and therefore needs less height.
83  *
84  * Height-for-width geometry management is implemented in GTK+ by way
85  * of five virtual methods:
86  * <itemizedlist>
87  *   <listitem>#GtkWidgetClass.get_request_mode()</listitem>
88  *   <listitem>#GtkWidgetClass.get_preferred_width()</listitem>
89  *   <listitem>#GtkWidgetClass.get_preferred_height()</listitem>
90  *   <listitem>#GtkWidgetClass.get_preferred_height_for_width()</listitem>
91  *   <listitem>#GtkWidgetClass.get_preferred_width_for_height()</listitem>
92  * </itemizedlist>
93  *
94  * There are some important things to keep in mind when implementing
95  * height-for-width and when using it in container implementations.
96  *
97  * The geometry management system will query a widget hierarchy in
98  * only one orientation at a time. When widgets are initially queried
99  * for their minimum sizes it is generally done in two initial passes
100  * in the #GtkSizeRequestMode chosen by the toplevel.
101  *
102  * For example, when queried in the normal
103  * %GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH mode:
104  * First, the default minimum and natural width for each widget
105  * in the interface will be computed using gtk_widget_get_preferred_width().
106  * Because the preferred widths for each container depend on the preferred
107  * widths of their children, this information propagates up the hierarchy,
108  * and finally a minimum and natural width is determined for the entire
109  * toplevel. Next, the toplevel will use the minimum width to query for the
110  * minimum height contextual to that width using
111  * gtk_widget_get_preferred_height_for_width(), which will also be a highly
112  * recursive operation. The minimum height for the minimum width is normally
113  * used to set the minimum size constraint on the toplevel
114  * (unless gtk_window_set_geometry_hints() is explicitly used instead).
115  *
116  * After the toplevel window has initially requested its size in both
117  * dimensions it can go on to allocate itself a reasonable size (or a size
118  * previously specified with gtk_window_set_default_size()). During the
119  * recursive allocation process it's important to note that request cycles
120  * will be recursively executed while container widgets allocate their children.
121  * Each container widget, once allocated a size, will go on to first share the
122  * space in one orientation among its children and then request each child's
123  * height for its target allocated width or its width for allocated height,
124  * depending. In this way a #GtkWidget will typically be requested its size
125  * a number of times before actually being allocated a size. The size a
126  * widget is finally allocated can of course differ from the size it has
127  * requested. For this reason, #GtkWidget caches a  small number of results
128  * to avoid re-querying for the same sizes in one allocation cycle.
129  *
130  * See <link linkend="container-geometry-management">GtkContainer's
131  * geometry management section</link>
132  * to learn more about how height-for-width allocations are performed
133  * by container widgets.
134  *
135  * If a widget does move content around to intelligently use up the
136  * allocated size then it must support the request in both
137  * #GtkSizeRequestModes even if the widget in question only
138  * trades sizes in a single orientation.
139  *
140  * For instance, a #GtkLabel that does height-for-width word wrapping
141  * will not expect to have #GtkWidgetClass.get_preferred_height() called
142  * because that call is specific to a width-for-height request. In this
143  * case the label must return the height required for its own minimum
144  * possible width. By following this rule any widget that handles
145  * height-for-width or width-for-height requests will always be allocated
146  * at least enough space to fit its own content.
147  *
148  * Here are some examples of how a %GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH widget
149  * generally deals with width-for-height requests, for #GtkWidgetClass.get_preferred_height()
150  * it will do:
151  * <programlisting><![CDATA[
152  * static void
153  * foo_widget_get_preferred_height (GtkWidget *widget, gint *min_height, gint *nat_height)
154  * {
155  *    if (i_am_in_height_for_width_mode)
156  *      {
157  *        gint min_width;
158  *
159  *        GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget, &min_width, NULL);
160  *        GTK_WIDGET_GET_CLASS (widget)->get_preferred_height_for_width (widget, min_width,
161  *                                                                      min_height, nat_height);
162  *      }
163  *    else
164  *      {
165  *         ... some widgets do both. For instance, if a GtkLabel is rotated to 90 degrees
166  *         it will return the minimum and natural height for the rotated label here.
167  *      }
168  * }
169  * ]]></programlisting>
170  *
171  * And in #GtkWidgetClass.get_preferred_width_for_height() it will simply return
172  * the minimum and natural width:
173  *
174  * <programlisting><![CDATA[
175  * static void
176  * foo_widget_get_preferred_width_for_height (GtkWidget *widget, gint for_height,
177  *                                            gint *min_width, gint *nat_width)
178  * {
179  *    if (i_am_in_height_for_width_mode)
180  *      {
181  *        GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget, min_width, nat_width);
182  *      }
183  *    else
184  *      {
185  *         ... again if a widget is sometimes operating in width-for-height mode
186  *         (like a rotated GtkLabel) it can go ahead and do its real width for
187  *         height calculation here.
188  *      }
189  * }
190  * ]]></programlisting>
191  *
192  * Often a widget needs to get its own request during size request or
193  * allocation. For example, when computing height it may need to also
194  * compute width. Or when deciding how to use an allocation, the widget
195  * may need to know its natural size. In these cases, the widget should
196  * be careful to call its virtual methods directly, like this:
197  * <example>
198  *   <title>Widget calling its own size request method.</title>
199  *   <programlisting>
200  * GTK_WIDGET_GET_CLASS(widget)-&gt;get_preferred_width (widget),
201  *                                  &min, &natural);
202  *   </programlisting>
203  * </example>
204  *
205  * It will not work to use the wrapper functions, such as
206  * gtk_widget_get_preferred_width() inside your own size request
207  * implementation. These return a request adjusted by #GtkSizeGroup
208  * and by the #GtkWidgetClass.adjust_size_request() virtual method. If a
209  * widget used the wrappers inside its virtual method implementations,
210  * then the adjustments (such as widget margins) would be applied
211  * twice. GTK+ therefore does not allow this and will warn if you try
212  * to do it.
213  *
214  * Of course if you are getting the size request for
215  * <emphasis>another</emphasis> widget, such as a child of a
216  * container, you <emphasis>must</emphasis> use the wrapper APIs.
217  * Otherwise, you would not properly consider widget margins,
218  * #GtkSizeGroup, and so forth.
219  * </para>
220  * </refsect2>
221  * <refsect2 id="style-properties">
222  * <title>Style Properties</title>
223  * <para>
224  * <structname>GtkWidget</structname> introduces <firstterm>style
225  * properties</firstterm> - these are basically object properties that are stored
226  * not on the object, but in the style object associated to the widget. Style
227  * properties are set in <link linkend="gtk-Resource-Files">resource files</link>.
228  * This mechanism is used for configuring such things as the location of the
229  * scrollbar arrows through the theme, giving theme authors more control over the
230  * look of applications without the need to write a theme engine in C.
231  * </para>
232  * <para>
233  * Use gtk_widget_class_install_style_property() to install style properties for
234  * a widget class, gtk_widget_class_find_style_property() or
235  * gtk_widget_class_list_style_properties() to get information about existing
236  * style properties and gtk_widget_style_get_property(), gtk_widget_style_get() or
237  * gtk_widget_style_get_valist() to obtain the value of a style property.
238  * </para>
239  * </refsect2>
240  * <refsect2 id="GtkWidget-BUILDER-UI">
241  * <title>GtkWidget as GtkBuildable</title>
242  * <para>
243  * The GtkWidget implementation of the GtkBuildable interface supports a
244  * custom &lt;accelerator&gt; element, which has attributes named key,
245  * modifiers and signal and allows to specify accelerators.
246  * </para>
247  * <example>
248  * <title>A UI definition fragment specifying an accelerator</title>
249  * <programlisting><![CDATA[
250  * <object class="GtkButton">
251  *   <accelerator key="q" modifiers="GDK_CONTROL_MASK" signal="clicked"/>
252  * </object>
253  * ]]></programlisting>
254  * </example>
255  * <para>
256  * In addition to accelerators, <structname>GtkWidget</structname> also support a
257  * custom &lt;accessible&gt; element, which supports actions and relations.
258  * Properties on the accessible implementation of an object can be set by accessing the
259  * internal child "accessible" of a <structname>GtkWidget</structname>.
260  * </para>
261  * <example>
262  * <title>A UI definition fragment specifying an accessible</title>
263  * <programlisting><![CDATA[
264  * <object class="GtkButton" id="label1"/>
265  *   <property name="label">I am a Label for a Button</property>
266  * </object>
267  * <object class="GtkButton" id="button1">
268  *   <accessibility>
269  *     <action action_name="click" translatable="yes">Click the button.</action>
270  *     <relation target="label1" type="labelled-by"/>
271  *   </accessibility>
272  *   <child internal-child="accessible">
273  *     <object class="AtkObject" id="a11y-button1">
274  *       <property name="AtkObject::name">Clickable Button</property>
275  *     </object>
276  *   </child>
277  * </object>
278  * ]]></programlisting>
279  * </example>
280  * <para>
281  * Finally, GtkWidget allows style information such as style classes to
282  * be associated with widgets, using the custom &lt;style&gt; element:
283  * <example>
284  * <title>A UI definition fragment specifying an style class</title>
285  * <programlisting><![CDATA[
286  * <object class="GtkButton" id="button1">
287  *   <style>
288  *     <class name="my-special-button-class"/>
289  *     <class name="dark-button"/>
290  *   </style>
291  * </object>
292  * ]]></programlisting>
293  * </example>
294  * </para>
295  * </refsect2>
296  */
297
298 /* Add flags here that should not be propagated to children. By default,
299  * all flags will be set on children (think prelight or active), but we
300  * might want to not do this for some.
301  */
302 #define GTK_STATE_FLAGS_DONT_PROPAGATE (GTK_STATE_FLAG_FOCUSED)
303 #define GTK_STATE_FLAGS_DO_PROPAGATE (~GTK_STATE_FLAGS_DONT_PROPAGATE)
304
305 #define WIDGET_CLASS(w)  GTK_WIDGET_GET_CLASS (w)
306
307 #define GTK_STATE_FLAGS_BITS 7
308
309 struct _GtkWidgetPrivate
310 {
311   /* The state of the widget. Needs to be able to hold all GtkStateFlags bits
312    * (defined in "gtkenums.h").
313    */
314   guint state_flags : GTK_STATE_FLAGS_BITS;
315
316   guint direction             : 2;
317
318   guint in_destruction        : 1;
319   guint toplevel              : 1;
320   guint anchored              : 1;
321   guint composite_child       : 1;
322   guint no_window             : 1;
323   guint realized              : 1;
324   guint mapped                : 1;
325   guint visible               : 1;
326   guint sensitive             : 1;
327   guint can_focus             : 1;
328   guint has_focus             : 1;
329   guint can_default           : 1;
330   guint has_default           : 1;
331   guint receives_default      : 1;
332   guint has_grab              : 1;
333   guint shadowed              : 1;
334   guint style_update_pending  : 1;
335   guint app_paintable         : 1;
336   guint double_buffered       : 1;
337   guint redraw_on_alloc       : 1;
338   guint no_show_all           : 1;
339   guint child_visible         : 1;
340   guint multidevice           : 1;
341   guint has_shape_mask        : 1;
342   guint in_reparent           : 1;
343
344   /* Queue-resize related flags */
345   guint alloc_needed          : 1;
346   guint width_request_needed  : 1;
347   guint height_request_needed : 1;
348
349   /* Expand-related flags */
350   guint need_compute_expand   : 1; /* Need to recompute computed_[hv]_expand */
351   guint computed_hexpand      : 1; /* computed results (composite of child flags) */
352   guint computed_vexpand      : 1;
353   guint hexpand               : 1; /* application-forced expand */
354   guint vexpand               : 1;
355   guint hexpand_set           : 1; /* whether to use application-forced  */
356   guint vexpand_set           : 1; /* instead of computing from children */
357
358   /* SizeGroup related flags */
359   guint sizegroup_visited     : 1;
360   guint sizegroup_bumping     : 1;
361   guint have_size_groups      : 1;
362
363   /* The widget's name. If the widget does not have a name
364    * (the name is NULL), then its name (as returned by
365    * "gtk_widget_get_name") is its class's name.
366    * Among other things, the widget name is used to determine
367    * the style to use for a widget.
368    */
369   gchar *name;
370
371   /* The list of attached windows to this widget.
372    * We keep a list in order to call reset_style to all of them,
373    * recursively. */
374   GList *attached_windows; 
375
376   /* The style for the widget. The style contains the
377    * colors the widget should be drawn in for each state
378    * along with graphics contexts used to draw with and
379    * the font to use for text.
380    */
381   GtkStyle *style;
382   GtkStyleContext *context;
383
384   /* Widget's path for styling */
385   GtkWidgetPath *path;
386
387   /* The widget's allocated size */
388   GtkAllocation allocation;
389
390   /* The widget's requested sizes */
391   SizeRequestCache requests;
392
393   /* The widget's window or its parent window if it does
394    * not have a window. (Which will be indicated by the
395    * GTK_NO_WINDOW flag being set).
396    */
397   GdkWindow *window;
398
399   /* The widget's parent */
400   GtkWidget *parent;
401
402 #ifdef G_ENABLE_DEBUG
403   /* Number of gtk_widget_push_verify_invariants () */
404   guint verifying_invariants_count;
405 #endif /* G_ENABLE_DEBUG */
406 };
407
408 struct _GtkWidgetClassPrivate
409 {
410   GType accessible_type;
411   AtkRole accessible_role;
412 };
413
414 enum {
415   DESTROY,
416   SHOW,
417   HIDE,
418   MAP,
419   UNMAP,
420   REALIZE,
421   UNREALIZE,
422   SIZE_ALLOCATE,
423   STATE_FLAGS_CHANGED,
424   STATE_CHANGED,
425   PARENT_SET,
426   HIERARCHY_CHANGED,
427   STYLE_SET,
428   DIRECTION_CHANGED,
429   GRAB_NOTIFY,
430   CHILD_NOTIFY,
431   DRAW,
432   MNEMONIC_ACTIVATE,
433   GRAB_FOCUS,
434   FOCUS,
435   MOVE_FOCUS,
436   KEYNAV_FAILED,
437   EVENT,
438   EVENT_AFTER,
439   BUTTON_PRESS_EVENT,
440   BUTTON_RELEASE_EVENT,
441   SCROLL_EVENT,
442   MOTION_NOTIFY_EVENT,
443   DELETE_EVENT,
444   DESTROY_EVENT,
445   KEY_PRESS_EVENT,
446   KEY_RELEASE_EVENT,
447   ENTER_NOTIFY_EVENT,
448   LEAVE_NOTIFY_EVENT,
449   CONFIGURE_EVENT,
450   FOCUS_IN_EVENT,
451   FOCUS_OUT_EVENT,
452   MAP_EVENT,
453   UNMAP_EVENT,
454   PROPERTY_NOTIFY_EVENT,
455   SELECTION_CLEAR_EVENT,
456   SELECTION_REQUEST_EVENT,
457   SELECTION_NOTIFY_EVENT,
458   SELECTION_GET,
459   SELECTION_RECEIVED,
460   PROXIMITY_IN_EVENT,
461   PROXIMITY_OUT_EVENT,
462   VISIBILITY_NOTIFY_EVENT,
463   WINDOW_STATE_EVENT,
464   DAMAGE_EVENT,
465   GRAB_BROKEN_EVENT,
466   DRAG_BEGIN,
467   DRAG_END,
468   DRAG_DATA_DELETE,
469   DRAG_LEAVE,
470   DRAG_MOTION,
471   DRAG_DROP,
472   DRAG_DATA_GET,
473   DRAG_DATA_RECEIVED,
474   POPUP_MENU,
475   SHOW_HELP,
476   ACCEL_CLOSURES_CHANGED,
477   SCREEN_CHANGED,
478   CAN_ACTIVATE_ACCEL,
479   COMPOSITED_CHANGED,
480   QUERY_TOOLTIP,
481   DRAG_FAILED,
482   STYLE_UPDATED,
483   TOUCH_EVENT,
484   LAST_SIGNAL
485 };
486
487 enum {
488   PROP_0,
489   PROP_NAME,
490   PROP_PARENT,
491   PROP_WIDTH_REQUEST,
492   PROP_HEIGHT_REQUEST,
493   PROP_VISIBLE,
494   PROP_SENSITIVE,
495   PROP_APP_PAINTABLE,
496   PROP_CAN_FOCUS,
497   PROP_HAS_FOCUS,
498   PROP_IS_FOCUS,
499   PROP_CAN_DEFAULT,
500   PROP_HAS_DEFAULT,
501   PROP_RECEIVES_DEFAULT,
502   PROP_COMPOSITE_CHILD,
503   PROP_STYLE,
504   PROP_EVENTS,
505   PROP_NO_SHOW_ALL,
506   PROP_HAS_TOOLTIP,
507   PROP_TOOLTIP_MARKUP,
508   PROP_TOOLTIP_TEXT,
509   PROP_WINDOW,
510   PROP_DOUBLE_BUFFERED,
511   PROP_HALIGN,
512   PROP_VALIGN,
513   PROP_MARGIN_LEFT,
514   PROP_MARGIN_RIGHT,
515   PROP_MARGIN_TOP,
516   PROP_MARGIN_BOTTOM,
517   PROP_MARGIN,
518   PROP_HEXPAND,
519   PROP_VEXPAND,
520   PROP_HEXPAND_SET,
521   PROP_VEXPAND_SET,
522   PROP_EXPAND
523 };
524
525 typedef struct  _GtkStateData    GtkStateData;
526
527 enum {
528   STATE_CHANGE_REPLACE,
529   STATE_CHANGE_SET,
530   STATE_CHANGE_UNSET
531 };
532
533 struct _GtkStateData
534 {
535   guint         flags : GTK_STATE_FLAGS_BITS;
536   guint         operation : 2;
537 };
538
539 /* --- prototypes --- */
540 static void     gtk_widget_base_class_init      (gpointer            g_class);
541 static void     gtk_widget_class_init           (GtkWidgetClass     *klass);
542 static void     gtk_widget_base_class_finalize  (GtkWidgetClass     *klass);
543 static void     gtk_widget_init                 (GtkWidget          *widget);
544 static void     gtk_widget_set_property          (GObject           *object,
545                                                   guint              prop_id,
546                                                   const GValue      *value,
547                                                   GParamSpec        *pspec);
548 static void     gtk_widget_get_property          (GObject           *object,
549                                                   guint              prop_id,
550                                                   GValue            *value,
551                                                   GParamSpec        *pspec);
552 static void     gtk_widget_constructed           (GObject           *object);
553 static void     gtk_widget_dispose               (GObject           *object);
554 static void     gtk_widget_real_destroy          (GtkWidget         *object);
555 static void     gtk_widget_finalize              (GObject           *object);
556 static void     gtk_widget_real_show             (GtkWidget         *widget);
557 static void     gtk_widget_real_hide             (GtkWidget         *widget);
558 static void     gtk_widget_real_map              (GtkWidget         *widget);
559 static void     gtk_widget_real_unmap            (GtkWidget         *widget);
560 static void     gtk_widget_real_realize          (GtkWidget         *widget);
561 static void     gtk_widget_real_unrealize        (GtkWidget         *widget);
562 static void     gtk_widget_real_size_allocate    (GtkWidget         *widget,
563                                                   GtkAllocation     *allocation);
564 static void     gtk_widget_real_style_set        (GtkWidget         *widget,
565                                                   GtkStyle          *previous_style);
566 static void     gtk_widget_real_direction_changed(GtkWidget         *widget,
567                                                   GtkTextDirection   previous_direction);
568
569 static void     gtk_widget_real_grab_focus       (GtkWidget         *focus_widget);
570 static gboolean gtk_widget_real_query_tooltip    (GtkWidget         *widget,
571                                                   gint               x,
572                                                   gint               y,
573                                                   gboolean           keyboard_tip,
574                                                   GtkTooltip        *tooltip);
575 static void     gtk_widget_real_style_updated    (GtkWidget         *widget);
576 static gboolean gtk_widget_real_show_help        (GtkWidget         *widget,
577                                                   GtkWidgetHelpType  help_type);
578
579 static void     gtk_widget_dispatch_child_properties_changed    (GtkWidget        *object,
580                                                                  guint             n_pspecs,
581                                                                  GParamSpec      **pspecs);
582 static gboolean         gtk_widget_real_key_press_event         (GtkWidget        *widget,
583                                                                  GdkEventKey      *event);
584 static gboolean         gtk_widget_real_key_release_event       (GtkWidget        *widget,
585                                                                  GdkEventKey      *event);
586 static gboolean         gtk_widget_real_focus_in_event           (GtkWidget       *widget,
587                                                                   GdkEventFocus   *event);
588 static gboolean         gtk_widget_real_focus_out_event         (GtkWidget        *widget,
589                                                                  GdkEventFocus    *event);
590 static gboolean         gtk_widget_real_touch_event             (GtkWidget        *widget,
591                                                                  GdkEventTouch    *event);
592 static gboolean         gtk_widget_real_focus                   (GtkWidget        *widget,
593                                                                  GtkDirectionType  direction);
594 static void             gtk_widget_real_move_focus              (GtkWidget        *widget,
595                                                                  GtkDirectionType  direction);
596 static gboolean         gtk_widget_real_keynav_failed           (GtkWidget        *widget,
597                                                                  GtkDirectionType  direction);
598 #ifdef G_ENABLE_DEBUG
599 static void             gtk_widget_verify_invariants            (GtkWidget        *widget);
600 static void             gtk_widget_push_verify_invariants       (GtkWidget        *widget);
601 static void             gtk_widget_pop_verify_invariants        (GtkWidget        *widget);
602 #else
603 #define                 gtk_widget_verify_invariants(widget)
604 #define                 gtk_widget_push_verify_invariants(widget)
605 #define                 gtk_widget_pop_verify_invariants(widget)
606 #endif
607 static PangoContext*    gtk_widget_peek_pango_context           (GtkWidget        *widget);
608 static void             gtk_widget_update_pango_context         (GtkWidget        *widget);
609 static void             gtk_widget_propagate_state              (GtkWidget        *widget,
610                                                                  GtkStateData     *data);
611 ;
612 static gint             gtk_widget_event_internal               (GtkWidget        *widget,
613                                                                  GdkEvent         *event);
614 static gboolean         gtk_widget_real_mnemonic_activate       (GtkWidget        *widget,
615                                                                  gboolean          group_cycling);
616 static void             gtk_widget_real_get_width               (GtkWidget        *widget,
617                                                                  gint             *minimum_size,
618                                                                  gint             *natural_size);
619 static void             gtk_widget_real_get_height              (GtkWidget        *widget,
620                                                                  gint             *minimum_size,
621                                                                  gint             *natural_size);
622 static void             gtk_widget_real_get_height_for_width    (GtkWidget        *widget,
623                                                                  gint              width,
624                                                                  gint             *minimum_height,
625                                                                  gint             *natural_height);
626 static void             gtk_widget_real_get_width_for_height    (GtkWidget        *widget,
627                                                                  gint              height,
628                                                                  gint             *minimum_width,
629                                                                  gint             *natural_width);
630 static void             gtk_widget_real_state_flags_changed     (GtkWidget        *widget,
631                                                                  GtkStateFlags     old_state);
632 static const GtkWidgetAuxInfo* _gtk_widget_get_aux_info_or_defaults (GtkWidget *widget);
633 static GtkWidgetAuxInfo* gtk_widget_get_aux_info                (GtkWidget        *widget,
634                                                                  gboolean          create);
635 static void             gtk_widget_aux_info_destroy             (GtkWidgetAuxInfo *aux_info);
636 static AtkObject*       gtk_widget_real_get_accessible          (GtkWidget        *widget);
637 static void             gtk_widget_accessible_interface_init    (AtkImplementorIface *iface);
638 static AtkObject*       gtk_widget_ref_accessible               (AtkImplementor *implementor);
639 static void             gtk_widget_invalidate_widget_windows    (GtkWidget        *widget,
640                                                                  cairo_region_t        *region);
641 static GdkScreen *      gtk_widget_get_screen_unchecked         (GtkWidget        *widget);
642 static void             gtk_widget_queue_shallow_draw           (GtkWidget        *widget);
643 static gboolean         gtk_widget_real_can_activate_accel      (GtkWidget *widget,
644                                                                  guint      signal_id);
645
646 static void             gtk_widget_real_set_has_tooltip         (GtkWidget *widget,
647                                                                  gboolean   has_tooltip,
648                                                                  gboolean   force);
649 static void             gtk_widget_buildable_interface_init     (GtkBuildableIface *iface);
650 static void             gtk_widget_buildable_set_name           (GtkBuildable     *buildable,
651                                                                  const gchar      *name);
652 static const gchar *    gtk_widget_buildable_get_name           (GtkBuildable     *buildable);
653 static GObject *        gtk_widget_buildable_get_internal_child (GtkBuildable *buildable,
654                                                                  GtkBuilder   *builder,
655                                                                  const gchar  *childname);
656 static void             gtk_widget_buildable_set_buildable_property (GtkBuildable     *buildable,
657                                                                      GtkBuilder       *builder,
658                                                                      const gchar      *name,
659                                                                      const GValue     *value);
660 static gboolean         gtk_widget_buildable_custom_tag_start   (GtkBuildable     *buildable,
661                                                                  GtkBuilder       *builder,
662                                                                  GObject          *child,
663                                                                  const gchar      *tagname,
664                                                                  GMarkupParser    *parser,
665                                                                  gpointer         *data);
666 static void             gtk_widget_buildable_custom_finished    (GtkBuildable     *buildable,
667                                                                  GtkBuilder       *builder,
668                                                                  GObject          *child,
669                                                                  const gchar      *tagname,
670                                                                  gpointer          data);
671 static void             gtk_widget_buildable_parser_finished    (GtkBuildable     *buildable,
672                                                                  GtkBuilder       *builder);
673
674 static GtkSizeRequestMode gtk_widget_real_get_request_mode      (GtkWidget         *widget);
675 static void             gtk_widget_real_get_width               (GtkWidget         *widget,
676                                                                  gint              *minimum_size,
677                                                                  gint              *natural_size);
678 static void             gtk_widget_real_get_height              (GtkWidget         *widget,
679                                                                  gint              *minimum_size,
680                                                                  gint              *natural_size);
681
682 static void             gtk_widget_queue_tooltip_query          (GtkWidget *widget);
683
684
685 static void             gtk_widget_real_adjust_size_request     (GtkWidget         *widget,
686                                                                  GtkOrientation     orientation,
687                                                                  gint              *minimum_size,
688                                                                  gint              *natural_size);
689 static void             gtk_widget_real_adjust_size_allocation  (GtkWidget         *widget,
690                                                                  GtkOrientation     orientation,
691                                                                  gint              *minimum_size,
692                                                                  gint              *natural_size,
693                                                                  gint              *allocated_pos,
694                                                                  gint              *allocated_size);
695
696 static void gtk_widget_set_usize_internal (GtkWidget          *widget,
697                                            gint                width,
698                                            gint                height,
699                                            GtkQueueResizeFlags flags);
700
701 static void gtk_widget_add_events_internal (GtkWidget *widget,
702                                             GdkDevice *device,
703                                             gint       events);
704 static void gtk_widget_set_device_enabled_internal (GtkWidget *widget,
705                                                     GdkDevice *device,
706                                                     gboolean   recurse,
707                                                     gboolean   enabled);
708 static gboolean event_window_is_still_viewable (GdkEvent *event);
709
710 /* --- variables --- */
711 static gpointer         gtk_widget_parent_class = NULL;
712 static guint            widget_signals[LAST_SIGNAL] = { 0 };
713 static guint            composite_child_stack = 0;
714 static GtkTextDirection gtk_default_direction = GTK_TEXT_DIR_LTR;
715 static GParamSpecPool  *style_property_spec_pool = NULL;
716
717 static GQuark           quark_property_parser = 0;
718 static GQuark           quark_aux_info = 0;
719 static GQuark           quark_accel_path = 0;
720 static GQuark           quark_accel_closures = 0;
721 static GQuark           quark_event_mask = 0;
722 static GQuark           quark_device_event_mask = 0;
723 static GQuark           quark_parent_window = 0;
724 static GQuark           quark_pointer_window = 0;
725 static GQuark           quark_shape_info = 0;
726 static GQuark           quark_input_shape_info = 0;
727 static GQuark           quark_pango_context = 0;
728 static GQuark           quark_accessible_object = 0;
729 static GQuark           quark_mnemonic_labels = 0;
730 static GQuark           quark_tooltip_markup = 0;
731 static GQuark           quark_has_tooltip = 0;
732 static GQuark           quark_tooltip_window = 0;
733 static GQuark           quark_visual = 0;
734 static GQuark           quark_modifier_style = 0;
735 static GQuark           quark_enabled_devices = 0;
736 static GQuark           quark_size_groups = 0;
737 GParamSpecPool         *_gtk_widget_child_property_pool = NULL;
738 GObjectNotifyContext   *_gtk_widget_child_property_notify_context = NULL;
739
740 /* --- functions --- */
741 GType
742 gtk_widget_get_type (void)
743 {
744   static GType widget_type = 0;
745
746   if (G_UNLIKELY (widget_type == 0))
747     {
748       const GTypeInfo widget_info =
749       {
750         sizeof (GtkWidgetClass),
751         gtk_widget_base_class_init,
752         (GBaseFinalizeFunc) gtk_widget_base_class_finalize,
753         (GClassInitFunc) gtk_widget_class_init,
754         NULL,           /* class_finalize */
755         NULL,           /* class_init */
756         sizeof (GtkWidget),
757         0,              /* n_preallocs */
758         (GInstanceInitFunc) gtk_widget_init,
759         NULL,           /* value_table */
760       };
761
762       const GInterfaceInfo accessibility_info =
763       {
764         (GInterfaceInitFunc) gtk_widget_accessible_interface_init,
765         (GInterfaceFinalizeFunc) NULL,
766         NULL /* interface data */
767       };
768
769       const GInterfaceInfo buildable_info =
770       {
771         (GInterfaceInitFunc) gtk_widget_buildable_interface_init,
772         (GInterfaceFinalizeFunc) NULL,
773         NULL /* interface data */
774       };
775
776       widget_type = g_type_register_static (G_TYPE_INITIALLY_UNOWNED, "GtkWidget",
777                                             &widget_info, G_TYPE_FLAG_ABSTRACT);
778
779       g_type_add_class_private (widget_type, sizeof (GtkWidgetClassPrivate));
780
781       g_type_add_interface_static (widget_type, ATK_TYPE_IMPLEMENTOR,
782                                    &accessibility_info) ;
783       g_type_add_interface_static (widget_type, GTK_TYPE_BUILDABLE,
784                                    &buildable_info) ;
785     }
786
787   return widget_type;
788 }
789
790 static void
791 gtk_widget_base_class_init (gpointer g_class)
792 {
793   GtkWidgetClass *klass = g_class;
794
795   klass->priv = G_TYPE_CLASS_GET_PRIVATE (g_class, GTK_TYPE_WIDGET, GtkWidgetClassPrivate);
796 }
797
798 static void
799 child_property_notify_dispatcher (GObject     *object,
800                                   guint        n_pspecs,
801                                   GParamSpec **pspecs)
802 {
803   GTK_WIDGET_GET_CLASS (object)->dispatch_child_properties_changed (GTK_WIDGET (object), n_pspecs, pspecs);
804 }
805
806 /* We guard against the draw signal callbacks modifying the state of the
807  * cairo context by surounding it with save/restore.
808  * Maybe we should also cairo_new_path() just to be sure?
809  */
810 static void
811 gtk_widget_draw_marshaller (GClosure     *closure,
812                             GValue       *return_value,
813                             guint         n_param_values,
814                             const GValue *param_values,
815                             gpointer      invocation_hint,
816                             gpointer      marshal_data)
817 {
818   cairo_t *cr = g_value_get_boxed (&param_values[1]);
819
820   cairo_save (cr);
821
822   _gtk_marshal_BOOLEAN__BOXED (closure,
823                                return_value,
824                                n_param_values,
825                                param_values,
826                                invocation_hint,
827                                marshal_data);
828
829   cairo_restore (cr);
830 }
831
832 static void
833 gtk_widget_draw_marshallerv (GClosure     *closure,
834                              GValue       *return_value,
835                              gpointer      instance,
836                              va_list       args,
837                              gpointer      marshal_data,
838                              int           n_params,
839                              GType        *param_types)
840 {
841   cairo_t *cr;
842   va_list args_copy;
843
844   G_VA_COPY (args_copy, args);
845   cr = va_arg (args_copy, gpointer);
846
847   cairo_save (cr);
848
849   _gtk_marshal_BOOLEAN__BOXEDv (closure,
850                                 return_value,
851                                 instance,
852                                 args,
853                                 marshal_data,
854                                 n_params,
855                                 param_types);
856
857   cairo_restore (cr);
858 }
859
860 static void
861 gtk_widget_class_init (GtkWidgetClass *klass)
862 {
863   static GObjectNotifyContext cpn_context = { 0, NULL, NULL };
864   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
865   GtkBindingSet *binding_set;
866
867   gtk_widget_parent_class = g_type_class_peek_parent (klass);
868
869   quark_property_parser = g_quark_from_static_string ("gtk-rc-property-parser");
870   quark_aux_info = g_quark_from_static_string ("gtk-aux-info");
871   quark_accel_path = g_quark_from_static_string ("gtk-accel-path");
872   quark_accel_closures = g_quark_from_static_string ("gtk-accel-closures");
873   quark_event_mask = g_quark_from_static_string ("gtk-event-mask");
874   quark_device_event_mask = g_quark_from_static_string ("gtk-device-event-mask");
875   quark_parent_window = g_quark_from_static_string ("gtk-parent-window");
876   quark_pointer_window = g_quark_from_static_string ("gtk-pointer-window");
877   quark_shape_info = g_quark_from_static_string ("gtk-shape-info");
878   quark_input_shape_info = g_quark_from_static_string ("gtk-input-shape-info");
879   quark_pango_context = g_quark_from_static_string ("gtk-pango-context");
880   quark_accessible_object = g_quark_from_static_string ("gtk-accessible-object");
881   quark_mnemonic_labels = g_quark_from_static_string ("gtk-mnemonic-labels");
882   quark_tooltip_markup = g_quark_from_static_string ("gtk-tooltip-markup");
883   quark_has_tooltip = g_quark_from_static_string ("gtk-has-tooltip");
884   quark_tooltip_window = g_quark_from_static_string ("gtk-tooltip-window");
885   quark_visual = g_quark_from_static_string ("gtk-widget-visual");
886   quark_modifier_style = g_quark_from_static_string ("gtk-widget-modifier-style");
887   quark_enabled_devices = g_quark_from_static_string ("gtk-widget-enabled-devices");
888   quark_size_groups = g_quark_from_static_string ("gtk-widget-size-groups");
889
890   style_property_spec_pool = g_param_spec_pool_new (FALSE);
891   _gtk_widget_child_property_pool = g_param_spec_pool_new (TRUE);
892   cpn_context.quark_notify_queue = g_quark_from_static_string ("GtkWidget-child-property-notify-queue");
893   cpn_context.dispatcher = child_property_notify_dispatcher;
894   _gtk_widget_child_property_notify_context = &cpn_context;
895
896   gobject_class->constructed = gtk_widget_constructed;
897   gobject_class->dispose = gtk_widget_dispose;
898   gobject_class->finalize = gtk_widget_finalize;
899   gobject_class->set_property = gtk_widget_set_property;
900   gobject_class->get_property = gtk_widget_get_property;
901
902   klass->destroy = gtk_widget_real_destroy;
903
904   klass->activate_signal = 0;
905   klass->dispatch_child_properties_changed = gtk_widget_dispatch_child_properties_changed;
906   klass->show = gtk_widget_real_show;
907   klass->show_all = gtk_widget_show;
908   klass->hide = gtk_widget_real_hide;
909   klass->map = gtk_widget_real_map;
910   klass->unmap = gtk_widget_real_unmap;
911   klass->realize = gtk_widget_real_realize;
912   klass->unrealize = gtk_widget_real_unrealize;
913   klass->size_allocate = gtk_widget_real_size_allocate;
914   klass->get_request_mode = gtk_widget_real_get_request_mode;
915   klass->get_preferred_width = gtk_widget_real_get_width;
916   klass->get_preferred_height = gtk_widget_real_get_height;
917   klass->get_preferred_width_for_height = gtk_widget_real_get_width_for_height;
918   klass->get_preferred_height_for_width = gtk_widget_real_get_height_for_width;
919   klass->state_changed = NULL;
920   klass->state_flags_changed = gtk_widget_real_state_flags_changed;
921   klass->parent_set = NULL;
922   klass->hierarchy_changed = NULL;
923   klass->style_set = gtk_widget_real_style_set;
924   klass->direction_changed = gtk_widget_real_direction_changed;
925   klass->grab_notify = NULL;
926   klass->child_notify = NULL;
927   klass->draw = NULL;
928   klass->mnemonic_activate = gtk_widget_real_mnemonic_activate;
929   klass->grab_focus = gtk_widget_real_grab_focus;
930   klass->focus = gtk_widget_real_focus;
931   klass->move_focus = gtk_widget_real_move_focus;
932   klass->keynav_failed = gtk_widget_real_keynav_failed;
933   klass->event = NULL;
934   klass->button_press_event = NULL;
935   klass->button_release_event = NULL;
936   klass->motion_notify_event = NULL;
937   klass->touch_event = gtk_widget_real_touch_event;
938   klass->delete_event = NULL;
939   klass->destroy_event = NULL;
940   klass->key_press_event = gtk_widget_real_key_press_event;
941   klass->key_release_event = gtk_widget_real_key_release_event;
942   klass->enter_notify_event = NULL;
943   klass->leave_notify_event = NULL;
944   klass->configure_event = NULL;
945   klass->focus_in_event = gtk_widget_real_focus_in_event;
946   klass->focus_out_event = gtk_widget_real_focus_out_event;
947   klass->map_event = NULL;
948   klass->unmap_event = NULL;
949   klass->window_state_event = NULL;
950   klass->property_notify_event = _gtk_selection_property_notify;
951   klass->selection_clear_event = _gtk_selection_clear;
952   klass->selection_request_event = _gtk_selection_request;
953   klass->selection_notify_event = _gtk_selection_notify;
954   klass->selection_received = NULL;
955   klass->proximity_in_event = NULL;
956   klass->proximity_out_event = NULL;
957   klass->drag_begin = NULL;
958   klass->drag_end = NULL;
959   klass->drag_data_delete = NULL;
960   klass->drag_leave = NULL;
961   klass->drag_motion = NULL;
962   klass->drag_drop = NULL;
963   klass->drag_data_received = NULL;
964   klass->screen_changed = NULL;
965   klass->can_activate_accel = gtk_widget_real_can_activate_accel;
966   klass->grab_broken_event = NULL;
967   klass->query_tooltip = gtk_widget_real_query_tooltip;
968   klass->style_updated = gtk_widget_real_style_updated;
969
970   klass->show_help = gtk_widget_real_show_help;
971
972   /* Accessibility support */
973   klass->priv->accessible_type = GTK_TYPE_ACCESSIBLE;
974   klass->priv->accessible_role = ATK_ROLE_INVALID;
975   klass->get_accessible = gtk_widget_real_get_accessible;
976
977   klass->adjust_size_request = gtk_widget_real_adjust_size_request;
978   klass->adjust_size_allocation = gtk_widget_real_adjust_size_allocation;
979
980   g_object_class_install_property (gobject_class,
981                                    PROP_NAME,
982                                    g_param_spec_string ("name",
983                                                         P_("Widget name"),
984                                                         P_("The name of the widget"),
985                                                         NULL,
986                                                         GTK_PARAM_READWRITE));
987   g_object_class_install_property (gobject_class,
988                                    PROP_PARENT,
989                                    g_param_spec_object ("parent",
990                                                         P_("Parent widget"),
991                                                         P_("The parent widget of this widget. Must be a Container widget"),
992                                                         GTK_TYPE_CONTAINER,
993                                                         GTK_PARAM_READWRITE));
994
995   g_object_class_install_property (gobject_class,
996                                    PROP_WIDTH_REQUEST,
997                                    g_param_spec_int ("width-request",
998                                                      P_("Width request"),
999                                                      P_("Override for width request of the widget, or -1 if natural request should be used"),
1000                                                      -1,
1001                                                      G_MAXINT,
1002                                                      -1,
1003                                                      GTK_PARAM_READWRITE));
1004   g_object_class_install_property (gobject_class,
1005                                    PROP_HEIGHT_REQUEST,
1006                                    g_param_spec_int ("height-request",
1007                                                      P_("Height request"),
1008                                                      P_("Override for height request of the widget, or -1 if natural request should be used"),
1009                                                      -1,
1010                                                      G_MAXINT,
1011                                                      -1,
1012                                                      GTK_PARAM_READWRITE));
1013   g_object_class_install_property (gobject_class,
1014                                    PROP_VISIBLE,
1015                                    g_param_spec_boolean ("visible",
1016                                                          P_("Visible"),
1017                                                          P_("Whether the widget is visible"),
1018                                                          FALSE,
1019                                                          GTK_PARAM_READWRITE));
1020   g_object_class_install_property (gobject_class,
1021                                    PROP_SENSITIVE,
1022                                    g_param_spec_boolean ("sensitive",
1023                                                          P_("Sensitive"),
1024                                                          P_("Whether the widget responds to input"),
1025                                                          TRUE,
1026                                                          GTK_PARAM_READWRITE));
1027   g_object_class_install_property (gobject_class,
1028                                    PROP_APP_PAINTABLE,
1029                                    g_param_spec_boolean ("app-paintable",
1030                                                          P_("Application paintable"),
1031                                                          P_("Whether the application will paint directly on the widget"),
1032                                                          FALSE,
1033                                                          GTK_PARAM_READWRITE));
1034   g_object_class_install_property (gobject_class,
1035                                    PROP_CAN_FOCUS,
1036                                    g_param_spec_boolean ("can-focus",
1037                                                          P_("Can focus"),
1038                                                          P_("Whether the widget can accept the input focus"),
1039                                                          FALSE,
1040                                                          GTK_PARAM_READWRITE));
1041   g_object_class_install_property (gobject_class,
1042                                    PROP_HAS_FOCUS,
1043                                    g_param_spec_boolean ("has-focus",
1044                                                          P_("Has focus"),
1045                                                          P_("Whether the widget has the input focus"),
1046                                                          FALSE,
1047                                                          GTK_PARAM_READWRITE));
1048   g_object_class_install_property (gobject_class,
1049                                    PROP_IS_FOCUS,
1050                                    g_param_spec_boolean ("is-focus",
1051                                                          P_("Is focus"),
1052                                                          P_("Whether the widget is the focus widget within the toplevel"),
1053                                                          FALSE,
1054                                                          GTK_PARAM_READWRITE));
1055   g_object_class_install_property (gobject_class,
1056                                    PROP_CAN_DEFAULT,
1057                                    g_param_spec_boolean ("can-default",
1058                                                          P_("Can default"),
1059                                                          P_("Whether the widget can be the default widget"),
1060                                                          FALSE,
1061                                                          GTK_PARAM_READWRITE));
1062   g_object_class_install_property (gobject_class,
1063                                    PROP_HAS_DEFAULT,
1064                                    g_param_spec_boolean ("has-default",
1065                                                          P_("Has default"),
1066                                                          P_("Whether the widget is the default widget"),
1067                                                          FALSE,
1068                                                          GTK_PARAM_READWRITE));
1069   g_object_class_install_property (gobject_class,
1070                                    PROP_RECEIVES_DEFAULT,
1071                                    g_param_spec_boolean ("receives-default",
1072                                                          P_("Receives default"),
1073                                                          P_("If TRUE, the widget will receive the default action when it is focused"),
1074                                                          FALSE,
1075                                                          GTK_PARAM_READWRITE));
1076   g_object_class_install_property (gobject_class,
1077                                    PROP_COMPOSITE_CHILD,
1078                                    g_param_spec_boolean ("composite-child",
1079                                                          P_("Composite child"),
1080                                                          P_("Whether the widget is part of a composite widget"),
1081                                                          FALSE,
1082                                                          GTK_PARAM_READABLE));
1083   g_object_class_install_property (gobject_class,
1084                                    PROP_STYLE,
1085                                    g_param_spec_object ("style",
1086                                                         P_("Style"),
1087                                                         P_("The style of the widget, which contains information about how it will look (colors etc)"),
1088                                                         GTK_TYPE_STYLE,
1089                                                         GTK_PARAM_READWRITE));
1090   g_object_class_install_property (gobject_class,
1091                                    PROP_EVENTS,
1092                                    g_param_spec_flags ("events",
1093                                                        P_("Events"),
1094                                                        P_("The event mask that decides what kind of GdkEvents this widget gets"),
1095                                                        GDK_TYPE_EVENT_MASK,
1096                                                        GDK_STRUCTURE_MASK,
1097                                                        GTK_PARAM_READWRITE));
1098   g_object_class_install_property (gobject_class,
1099                                    PROP_NO_SHOW_ALL,
1100                                    g_param_spec_boolean ("no-show-all",
1101                                                          P_("No show all"),
1102                                                          P_("Whether gtk_widget_show_all() should not affect this widget"),
1103                                                          FALSE,
1104                                                          GTK_PARAM_READWRITE));
1105
1106 /**
1107  * GtkWidget:has-tooltip:
1108  *
1109  * Enables or disables the emission of #GtkWidget::query-tooltip on @widget.
1110  * A value of %TRUE indicates that @widget can have a tooltip, in this case
1111  * the widget will be queried using #GtkWidget::query-tooltip to determine
1112  * whether it will provide a tooltip or not.
1113  *
1114  * Note that setting this property to %TRUE for the first time will change
1115  * the event masks of the GdkWindows of this widget to include leave-notify
1116  * and motion-notify events.  This cannot and will not be undone when the
1117  * property is set to %FALSE again.
1118  *
1119  * Since: 2.12
1120  */
1121   g_object_class_install_property (gobject_class,
1122                                    PROP_HAS_TOOLTIP,
1123                                    g_param_spec_boolean ("has-tooltip",
1124                                                          P_("Has tooltip"),
1125                                                          P_("Whether this widget has a tooltip"),
1126                                                          FALSE,
1127                                                          GTK_PARAM_READWRITE));
1128   /**
1129    * GtkWidget:tooltip-text:
1130    *
1131    * Sets the text of tooltip to be the given string.
1132    *
1133    * Also see gtk_tooltip_set_text().
1134    *
1135    * This is a convenience property which will take care of getting the
1136    * tooltip shown if the given string is not %NULL: #GtkWidget:has-tooltip
1137    * will automatically be set to %TRUE and there will be taken care of
1138    * #GtkWidget::query-tooltip in the default signal handler.
1139    *
1140    * Since: 2.12
1141    */
1142   g_object_class_install_property (gobject_class,
1143                                    PROP_TOOLTIP_TEXT,
1144                                    g_param_spec_string ("tooltip-text",
1145                                                         P_("Tooltip Text"),
1146                                                         P_("The contents of the tooltip for this widget"),
1147                                                         NULL,
1148                                                         GTK_PARAM_READWRITE));
1149   /**
1150    * GtkWidget:tooltip-markup:
1151    *
1152    * Sets the text of tooltip to be the given string, which is marked up
1153    * with the <link linkend="PangoMarkupFormat">Pango text markup language</link>.
1154    * Also see gtk_tooltip_set_markup().
1155    *
1156    * This is a convenience property which will take care of getting the
1157    * tooltip shown if the given string is not %NULL: #GtkWidget:has-tooltip
1158    * will automatically be set to %TRUE and there will be taken care of
1159    * #GtkWidget::query-tooltip in the default signal handler.
1160    *
1161    * Since: 2.12
1162    */
1163   g_object_class_install_property (gobject_class,
1164                                    PROP_TOOLTIP_MARKUP,
1165                                    g_param_spec_string ("tooltip-markup",
1166                                                         P_("Tooltip markup"),
1167                                                         P_("The contents of the tooltip for this widget"),
1168                                                         NULL,
1169                                                         GTK_PARAM_READWRITE));
1170
1171   /**
1172    * GtkWidget:window:
1173    *
1174    * The widget's window if it is realized, %NULL otherwise.
1175    *
1176    * Since: 2.14
1177    */
1178   g_object_class_install_property (gobject_class,
1179                                    PROP_WINDOW,
1180                                    g_param_spec_object ("window",
1181                                                         P_("Window"),
1182                                                         P_("The widget's window if it is realized"),
1183                                                         GDK_TYPE_WINDOW,
1184                                                         GTK_PARAM_READABLE));
1185
1186   /**
1187    * GtkWidget:double-buffered:
1188    *
1189    * Whether the widget is double buffered.
1190    *
1191    * Since: 2.18
1192    */
1193   g_object_class_install_property (gobject_class,
1194                                    PROP_DOUBLE_BUFFERED,
1195                                    g_param_spec_boolean ("double-buffered",
1196                                                          P_("Double Buffered"),
1197                                                          P_("Whether the widget is double buffered"),
1198                                                          TRUE,
1199                                                          GTK_PARAM_READWRITE));
1200
1201   /**
1202    * GtkWidget:halign:
1203    *
1204    * How to distribute horizontal space if widget gets extra space, see #GtkAlign
1205    *
1206    * Since: 3.0
1207    */
1208   g_object_class_install_property (gobject_class,
1209                                    PROP_HALIGN,
1210                                    g_param_spec_enum ("halign",
1211                                                       P_("Horizontal Alignment"),
1212                                                       P_("How to position in extra horizontal space"),
1213                                                       GTK_TYPE_ALIGN,
1214                                                       GTK_ALIGN_FILL,
1215                                                       GTK_PARAM_READWRITE));
1216
1217   /**
1218    * GtkWidget:valign:
1219    *
1220    * How to distribute vertical space if widget gets extra space, see #GtkAlign
1221    *
1222    * Since: 3.0
1223    */
1224   g_object_class_install_property (gobject_class,
1225                                    PROP_VALIGN,
1226                                    g_param_spec_enum ("valign",
1227                                                       P_("Vertical Alignment"),
1228                                                       P_("How to position in extra vertical space"),
1229                                                       GTK_TYPE_ALIGN,
1230                                                       GTK_ALIGN_FILL,
1231                                                       GTK_PARAM_READWRITE));
1232
1233   /**
1234    * GtkWidget:margin-left:
1235    *
1236    * Margin on left side of widget.
1237    *
1238    * This property adds margin outside of the widget's normal size
1239    * request, the margin will be added in addition to the size from
1240    * gtk_widget_set_size_request() for example.
1241    *
1242    * Since: 3.0
1243    */
1244   g_object_class_install_property (gobject_class,
1245                                    PROP_MARGIN_LEFT,
1246                                    g_param_spec_int ("margin-left",
1247                                                      P_("Margin on Left"),
1248                                                      P_("Pixels of extra space on the left side"),
1249                                                      0,
1250                                                      G_MAXINT16,
1251                                                      0,
1252                                                      GTK_PARAM_READWRITE));
1253
1254   /**
1255    * GtkWidget:margin-right:
1256    *
1257    * Margin on right side of widget.
1258    *
1259    * This property adds margin outside of the widget's normal size
1260    * request, the margin will be added in addition to the size from
1261    * gtk_widget_set_size_request() for example.
1262    *
1263    * Since: 3.0
1264    */
1265   g_object_class_install_property (gobject_class,
1266                                    PROP_MARGIN_RIGHT,
1267                                    g_param_spec_int ("margin-right",
1268                                                      P_("Margin on Right"),
1269                                                      P_("Pixels of extra space on the right side"),
1270                                                      0,
1271                                                      G_MAXINT16,
1272                                                      0,
1273                                                      GTK_PARAM_READWRITE));
1274
1275   /**
1276    * GtkWidget:margin-top:
1277    *
1278    * Margin on top side of widget.
1279    *
1280    * This property adds margin outside of the widget's normal size
1281    * request, the margin will be added in addition to the size from
1282    * gtk_widget_set_size_request() for example.
1283    *
1284    * Since: 3.0
1285    */
1286   g_object_class_install_property (gobject_class,
1287                                    PROP_MARGIN_TOP,
1288                                    g_param_spec_int ("margin-top",
1289                                                      P_("Margin on Top"),
1290                                                      P_("Pixels of extra space on the top side"),
1291                                                      0,
1292                                                      G_MAXINT16,
1293                                                      0,
1294                                                      GTK_PARAM_READWRITE));
1295
1296   /**
1297    * GtkWidget:margin-bottom:
1298    *
1299    * Margin on bottom side of widget.
1300    *
1301    * This property adds margin outside of the widget's normal size
1302    * request, the margin will be added in addition to the size from
1303    * gtk_widget_set_size_request() for example.
1304    *
1305    * Since: 3.0
1306    */
1307   g_object_class_install_property (gobject_class,
1308                                    PROP_MARGIN_BOTTOM,
1309                                    g_param_spec_int ("margin-bottom",
1310                                                      P_("Margin on Bottom"),
1311                                                      P_("Pixels of extra space on the bottom side"),
1312                                                      0,
1313                                                      G_MAXINT16,
1314                                                      0,
1315                                                      GTK_PARAM_READWRITE));
1316
1317   /**
1318    * GtkWidget:margin:
1319    *
1320    * Sets all four sides' margin at once. If read, returns max
1321    * margin on any side.
1322    *
1323    * Since: 3.0
1324    */
1325   g_object_class_install_property (gobject_class,
1326                                    PROP_MARGIN,
1327                                    g_param_spec_int ("margin",
1328                                                      P_("All Margins"),
1329                                                      P_("Pixels of extra space on all four sides"),
1330                                                      0,
1331                                                      G_MAXINT16,
1332                                                      0,
1333                                                      GTK_PARAM_READWRITE));
1334
1335   /**
1336    * GtkWidget::destroy:
1337    * @object: the object which received the signal
1338    *
1339    * Signals that all holders of a reference to the widget should release
1340    * the reference that they hold. May result in finalization of the widget
1341    * if all references are released.
1342    */
1343   widget_signals[DESTROY] =
1344     g_signal_new (I_("destroy"),
1345                   G_TYPE_FROM_CLASS (gobject_class),
1346                   G_SIGNAL_RUN_CLEANUP | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
1347                   G_STRUCT_OFFSET (GtkWidgetClass, destroy),
1348                   NULL, NULL,
1349                   _gtk_marshal_VOID__VOID,
1350                   G_TYPE_NONE, 0);
1351
1352   /**
1353    * GtkWidget:hexpand:
1354    *
1355    * Whether to expand horizontally. See gtk_widget_set_hexpand().
1356    *
1357    * Since: 3.0
1358    */
1359   g_object_class_install_property (gobject_class,
1360                                    PROP_HEXPAND,
1361                                    g_param_spec_boolean ("hexpand",
1362                                                          P_("Horizontal Expand"),
1363                                                          P_("Whether widget wants more horizontal space"),
1364                                                          FALSE,
1365                                                          GTK_PARAM_READWRITE));
1366
1367   /**
1368    * GtkWidget:hexpand-set:
1369    *
1370    * Whether to use the #GtkWidget:hexpand property. See gtk_widget_get_hexpand_set().
1371    *
1372    * Since: 3.0
1373    */
1374   g_object_class_install_property (gobject_class,
1375                                    PROP_HEXPAND_SET,
1376                                    g_param_spec_boolean ("hexpand-set",
1377                                                          P_("Horizontal Expand Set"),
1378                                                          P_("Whether to use the hexpand property"),
1379                                                          FALSE,
1380                                                          GTK_PARAM_READWRITE));
1381
1382   /**
1383    * GtkWidget:vexpand:
1384    *
1385    * Whether to expand vertically. See gtk_widget_set_vexpand().
1386    *
1387    * Since: 3.0
1388    */
1389   g_object_class_install_property (gobject_class,
1390                                    PROP_VEXPAND,
1391                                    g_param_spec_boolean ("vexpand",
1392                                                          P_("Vertical Expand"),
1393                                                          P_("Whether widget wants more vertical space"),
1394                                                          FALSE,
1395                                                          GTK_PARAM_READWRITE));
1396
1397   /**
1398    * GtkWidget:vexpand-set:
1399    *
1400    * Whether to use the #GtkWidget:vexpand property. See gtk_widget_get_vexpand_set().
1401    *
1402    * Since: 3.0
1403    */
1404   g_object_class_install_property (gobject_class,
1405                                    PROP_VEXPAND_SET,
1406                                    g_param_spec_boolean ("vexpand-set",
1407                                                          P_("Vertical Expand Set"),
1408                                                          P_("Whether to use the vexpand property"),
1409                                                          FALSE,
1410                                                          GTK_PARAM_READWRITE));
1411
1412   /**
1413    * GtkWidget:expand:
1414    *
1415    * Whether to expand in both directions. Setting this sets both #GtkWidget:hexpand and #GtkWidget:vexpand
1416    *
1417    * Since: 3.0
1418    */
1419   g_object_class_install_property (gobject_class,
1420                                    PROP_EXPAND,
1421                                    g_param_spec_boolean ("expand",
1422                                                          P_("Expand Both"),
1423                                                          P_("Whether widget wants to expand in both directions"),
1424                                                          FALSE,
1425                                                          GTK_PARAM_READWRITE));
1426
1427   /**
1428    * GtkWidget::show:
1429    * @widget: the object which received the signal.
1430    */
1431   widget_signals[SHOW] =
1432     g_signal_new (I_("show"),
1433                   G_TYPE_FROM_CLASS (gobject_class),
1434                   G_SIGNAL_RUN_FIRST,
1435                   G_STRUCT_OFFSET (GtkWidgetClass, show),
1436                   NULL, NULL,
1437                   _gtk_marshal_VOID__VOID,
1438                   G_TYPE_NONE, 0);
1439
1440   /**
1441    * GtkWidget::hide:
1442    * @widget: the object which received the signal.
1443    */
1444   widget_signals[HIDE] =
1445     g_signal_new (I_("hide"),
1446                   G_TYPE_FROM_CLASS (gobject_class),
1447                   G_SIGNAL_RUN_FIRST,
1448                   G_STRUCT_OFFSET (GtkWidgetClass, hide),
1449                   NULL, NULL,
1450                   _gtk_marshal_VOID__VOID,
1451                   G_TYPE_NONE, 0);
1452
1453   /**
1454    * GtkWidget::map:
1455    * @widget: the object which received the signal.
1456    */
1457   widget_signals[MAP] =
1458     g_signal_new (I_("map"),
1459                   G_TYPE_FROM_CLASS (gobject_class),
1460                   G_SIGNAL_RUN_FIRST,
1461                   G_STRUCT_OFFSET (GtkWidgetClass, map),
1462                   NULL, NULL,
1463                   _gtk_marshal_VOID__VOID,
1464                   G_TYPE_NONE, 0);
1465
1466   /**
1467    * GtkWidget::unmap:
1468    * @widget: the object which received the signal.
1469    */
1470   widget_signals[UNMAP] =
1471     g_signal_new (I_("unmap"),
1472                   G_TYPE_FROM_CLASS (gobject_class),
1473                   G_SIGNAL_RUN_FIRST,
1474                   G_STRUCT_OFFSET (GtkWidgetClass, unmap),
1475                   NULL, NULL,
1476                   _gtk_marshal_VOID__VOID,
1477                   G_TYPE_NONE, 0);
1478
1479   /**
1480    * GtkWidget::realize:
1481    * @widget: the object which received the signal.
1482    */
1483   widget_signals[REALIZE] =
1484     g_signal_new (I_("realize"),
1485                   G_TYPE_FROM_CLASS (gobject_class),
1486                   G_SIGNAL_RUN_FIRST,
1487                   G_STRUCT_OFFSET (GtkWidgetClass, realize),
1488                   NULL, NULL,
1489                   _gtk_marshal_VOID__VOID,
1490                   G_TYPE_NONE, 0);
1491
1492   /**
1493    * GtkWidget::unrealize:
1494    * @widget: the object which received the signal.
1495    */
1496   widget_signals[UNREALIZE] =
1497     g_signal_new (I_("unrealize"),
1498                   G_TYPE_FROM_CLASS (gobject_class),
1499                   G_SIGNAL_RUN_LAST,
1500                   G_STRUCT_OFFSET (GtkWidgetClass, unrealize),
1501                   NULL, NULL,
1502                   _gtk_marshal_VOID__VOID,
1503                   G_TYPE_NONE, 0);
1504
1505   /**
1506    * GtkWidget::size-allocate:
1507    * @widget: the object which received the signal.
1508    * @allocation:
1509    */
1510   widget_signals[SIZE_ALLOCATE] =
1511     g_signal_new (I_("size-allocate"),
1512                   G_TYPE_FROM_CLASS (gobject_class),
1513                   G_SIGNAL_RUN_FIRST,
1514                   G_STRUCT_OFFSET (GtkWidgetClass, size_allocate),
1515                   NULL, NULL,
1516                   _gtk_marshal_VOID__BOXED,
1517                   G_TYPE_NONE, 1,
1518                   GDK_TYPE_RECTANGLE | G_SIGNAL_TYPE_STATIC_SCOPE);
1519
1520   /**
1521    * GtkWidget::state-changed:
1522    * @widget: the object which received the signal.
1523    * @state: the previous state
1524    *
1525    * The ::state-changed signal is emitted when the widget state changes.
1526    * See gtk_widget_get_state().
1527    *
1528    * Deprecated: 3.0. Use #GtkWidget::state-flags-changed instead.
1529    */
1530   widget_signals[STATE_CHANGED] =
1531     g_signal_new (I_("state-changed"),
1532                   G_TYPE_FROM_CLASS (gobject_class),
1533                   G_SIGNAL_RUN_FIRST,
1534                   G_STRUCT_OFFSET (GtkWidgetClass, state_changed),
1535                   NULL, NULL,
1536                   _gtk_marshal_VOID__ENUM,
1537                   G_TYPE_NONE, 1,
1538                   GTK_TYPE_STATE_TYPE);
1539
1540   /**
1541    * GtkWidget::state-flags-changed:
1542    * @widget: the object which received the signal.
1543    * @flags: The previous state flags.
1544    *
1545    * The ::state-flags-changed signal is emitted when the widget state
1546    * changes, see gtk_widget_get_state_flags().
1547    *
1548    * Since: 3.0
1549    */
1550   widget_signals[STATE_FLAGS_CHANGED] =
1551     g_signal_new (I_("state-flags-changed"),
1552                   G_TYPE_FROM_CLASS (gobject_class),
1553                   G_SIGNAL_RUN_FIRST,
1554                   G_STRUCT_OFFSET (GtkWidgetClass, state_flags_changed),
1555                   NULL, NULL,
1556                   _gtk_marshal_VOID__FLAGS,
1557                   G_TYPE_NONE, 1,
1558                   GTK_TYPE_STATE_FLAGS);
1559
1560   /**
1561    * GtkWidget::parent-set:
1562    * @widget: the object on which the signal is emitted
1563    * @old_parent: (allow-none): the previous parent, or %NULL if the widget
1564    *   just got its initial parent.
1565    *
1566    * The ::parent-set signal is emitted when a new parent
1567    * has been set on a widget.
1568    */
1569   widget_signals[PARENT_SET] =
1570     g_signal_new (I_("parent-set"),
1571                   G_TYPE_FROM_CLASS (gobject_class),
1572                   G_SIGNAL_RUN_FIRST,
1573                   G_STRUCT_OFFSET (GtkWidgetClass, parent_set),
1574                   NULL, NULL,
1575                   _gtk_marshal_VOID__OBJECT,
1576                   G_TYPE_NONE, 1,
1577                   GTK_TYPE_WIDGET);
1578
1579   /**
1580    * GtkWidget::hierarchy-changed:
1581    * @widget: the object on which the signal is emitted
1582    * @previous_toplevel: (allow-none): the previous toplevel ancestor, or %NULL
1583    *   if the widget was previously unanchored
1584    *
1585    * The ::hierarchy-changed signal is emitted when the
1586    * anchored state of a widget changes. A widget is
1587    * <firstterm>anchored</firstterm> when its toplevel
1588    * ancestor is a #GtkWindow. This signal is emitted when
1589    * a widget changes from un-anchored to anchored or vice-versa.
1590    */
1591   widget_signals[HIERARCHY_CHANGED] =
1592     g_signal_new (I_("hierarchy-changed"),
1593                   G_TYPE_FROM_CLASS (gobject_class),
1594                   G_SIGNAL_RUN_LAST,
1595                   G_STRUCT_OFFSET (GtkWidgetClass, hierarchy_changed),
1596                   NULL, NULL,
1597                   _gtk_marshal_VOID__OBJECT,
1598                   G_TYPE_NONE, 1,
1599                   GTK_TYPE_WIDGET);
1600
1601   /**
1602    * GtkWidget::style-set:
1603    * @widget: the object on which the signal is emitted
1604    * @previous_style: (allow-none): the previous style, or %NULL if the widget
1605    *   just got its initial style
1606    *
1607    * The ::style-set signal is emitted when a new style has been set
1608    * on a widget. Note that style-modifying functions like
1609    * gtk_widget_modify_base() also cause this signal to be emitted.
1610    *
1611    * Note that this signal is emitted for changes to the deprecated
1612    * #GtkStyle. To track changes to the #GtkStyleContext associated
1613    * with a widget, use the #GtkWidget::style-updated signal.
1614    *
1615    * Deprecated:3.0: Use the #GtkWidget::style-updated signal
1616    */
1617   widget_signals[STYLE_SET] =
1618     g_signal_new (I_("style-set"),
1619                   G_TYPE_FROM_CLASS (gobject_class),
1620                   G_SIGNAL_RUN_FIRST,
1621                   G_STRUCT_OFFSET (GtkWidgetClass, style_set),
1622                   NULL, NULL,
1623                   _gtk_marshal_VOID__OBJECT,
1624                   G_TYPE_NONE, 1,
1625                   GTK_TYPE_STYLE);
1626
1627   /**
1628    * GtkWidget::style-updated:
1629    * @widget: the object on which the signal is emitted
1630    *
1631    * The ::style-updated signal is emitted when the #GtkStyleContext
1632    * of a widget is changed. Note that style-modifying functions like
1633    * gtk_widget_override_color() also cause this signal to be emitted.
1634    *
1635    * Since: 3.0
1636    */
1637   widget_signals[STYLE_UPDATED] =
1638     g_signal_new (I_("style-updated"),
1639                   G_TYPE_FROM_CLASS (gobject_class),
1640                   G_SIGNAL_RUN_FIRST,
1641                   G_STRUCT_OFFSET (GtkWidgetClass, style_updated),
1642                   NULL, NULL,
1643                   g_cclosure_marshal_VOID__VOID,
1644                   G_TYPE_NONE, 0);
1645
1646   /**
1647    * GtkWidget::direction-changed:
1648    * @widget: the object on which the signal is emitted
1649    * @previous_direction: the previous text direction of @widget
1650    *
1651    * The ::direction-changed signal is emitted when the text direction
1652    * of a widget changes.
1653    */
1654   widget_signals[DIRECTION_CHANGED] =
1655     g_signal_new (I_("direction-changed"),
1656                   G_TYPE_FROM_CLASS (gobject_class),
1657                   G_SIGNAL_RUN_FIRST,
1658                   G_STRUCT_OFFSET (GtkWidgetClass, direction_changed),
1659                   NULL, NULL,
1660                   _gtk_marshal_VOID__ENUM,
1661                   G_TYPE_NONE, 1,
1662                   GTK_TYPE_TEXT_DIRECTION);
1663
1664   /**
1665    * GtkWidget::grab-notify:
1666    * @widget: the object which received the signal
1667    * @was_grabbed: %FALSE if the widget becomes shadowed, %TRUE
1668    *               if it becomes unshadowed
1669    *
1670    * The ::grab-notify signal is emitted when a widget becomes
1671    * shadowed by a GTK+ grab (not a pointer or keyboard grab) on
1672    * another widget, or when it becomes unshadowed due to a grab
1673    * being removed.
1674    *
1675    * A widget is shadowed by a gtk_grab_add() when the topmost
1676    * grab widget in the grab stack of its window group is not
1677    * its ancestor.
1678    */
1679   widget_signals[GRAB_NOTIFY] =
1680     g_signal_new (I_("grab-notify"),
1681                   G_TYPE_FROM_CLASS (gobject_class),
1682                   G_SIGNAL_RUN_FIRST,
1683                   G_STRUCT_OFFSET (GtkWidgetClass, grab_notify),
1684                   NULL, NULL,
1685                   _gtk_marshal_VOID__BOOLEAN,
1686                   G_TYPE_NONE, 1,
1687                   G_TYPE_BOOLEAN);
1688
1689   /**
1690    * GtkWidget::child-notify:
1691    * @widget: the object which received the signal
1692    * @child_property: the #GParamSpec of the changed child property
1693    *
1694    * The ::child-notify signal is emitted for each
1695    * <link linkend="child-properties">child property</link>  that has
1696    * changed on an object. The signal's detail holds the property name.
1697    */
1698   widget_signals[CHILD_NOTIFY] =
1699     g_signal_new (I_("child-notify"),
1700                    G_TYPE_FROM_CLASS (gobject_class),
1701                    G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_NO_HOOKS,
1702                    G_STRUCT_OFFSET (GtkWidgetClass, child_notify),
1703                    NULL, NULL,
1704                    g_cclosure_marshal_VOID__PARAM,
1705                    G_TYPE_NONE, 1,
1706                    G_TYPE_PARAM);
1707
1708   /**
1709    * GtkWidget::draw:
1710    * @widget: the object which received the signal
1711    * @cr: the cairo context to draw to
1712    *
1713    * This signal is emitted when a widget is supposed to render itself.
1714    * The @widget's top left corner must be painted at the origin of
1715    * the passed in context and be sized to the values returned by
1716    * gtk_widget_get_allocated_width() and
1717    * gtk_widget_get_allocated_height().
1718    *
1719    * Signal handlers connected to this signal can modify the cairo
1720    * context passed as @cr in any way they like and don't need to
1721    * restore it. The signal emission takes care of calling cairo_save()
1722    * before and cairo_restore() after invoking the handler.
1723    *
1724    * Since: 3.0
1725    */
1726   widget_signals[DRAW] =
1727     g_signal_new (I_("draw"),
1728                    G_TYPE_FROM_CLASS (gobject_class),
1729                    G_SIGNAL_RUN_LAST,
1730                    G_STRUCT_OFFSET (GtkWidgetClass, draw),
1731                    _gtk_boolean_handled_accumulator, NULL,
1732                    gtk_widget_draw_marshaller,
1733                    G_TYPE_BOOLEAN, 1,
1734                    CAIRO_GOBJECT_TYPE_CONTEXT);
1735   g_signal_set_va_marshaller (widget_signals[DRAW], G_TYPE_FROM_CLASS (klass),
1736                               gtk_widget_draw_marshallerv);
1737
1738   /**
1739    * GtkWidget::mnemonic-activate:
1740    * @widget: the object which received the signal.
1741    * @arg1:
1742    */
1743   widget_signals[MNEMONIC_ACTIVATE] =
1744     g_signal_new (I_("mnemonic-activate"),
1745                   G_TYPE_FROM_CLASS (gobject_class),
1746                   G_SIGNAL_RUN_LAST,
1747                   G_STRUCT_OFFSET (GtkWidgetClass, mnemonic_activate),
1748                   _gtk_boolean_handled_accumulator, NULL,
1749                   _gtk_marshal_BOOLEAN__BOOLEAN,
1750                   G_TYPE_BOOLEAN, 1,
1751                   G_TYPE_BOOLEAN);
1752
1753   /**
1754    * GtkWidget::grab-focus:
1755    * @widget: the object which received the signal.
1756    */
1757   widget_signals[GRAB_FOCUS] =
1758     g_signal_new (I_("grab-focus"),
1759                   G_TYPE_FROM_CLASS (gobject_class),
1760                   G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
1761                   G_STRUCT_OFFSET (GtkWidgetClass, grab_focus),
1762                   NULL, NULL,
1763                   _gtk_marshal_VOID__VOID,
1764                   G_TYPE_NONE, 0);
1765
1766   /**
1767    * GtkWidget::focus:
1768    * @widget: the object which received the signal.
1769    * @direction:
1770    *
1771    * Returns: %TRUE to stop other handlers from being invoked for the event. %FALSE to propagate the event further.
1772    */
1773   widget_signals[FOCUS] =
1774     g_signal_new (I_("focus"),
1775                   G_TYPE_FROM_CLASS (klass),
1776                   G_SIGNAL_RUN_LAST,
1777                   G_STRUCT_OFFSET (GtkWidgetClass, focus),
1778                   _gtk_boolean_handled_accumulator, NULL,
1779                   _gtk_marshal_BOOLEAN__ENUM,
1780                   G_TYPE_BOOLEAN, 1,
1781                   GTK_TYPE_DIRECTION_TYPE);
1782
1783   /**
1784    * GtkWidget::move-focus:
1785    * @widget: the object which received the signal.
1786    * @direction:
1787    */
1788   widget_signals[MOVE_FOCUS] =
1789     g_signal_new (I_("move-focus"),
1790                   G_TYPE_FROM_CLASS (klass),
1791                   G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
1792                   G_STRUCT_OFFSET (GtkWidgetClass, move_focus),
1793                   NULL, NULL,
1794                   _gtk_marshal_VOID__ENUM,
1795                   G_TYPE_NONE,
1796                   1,
1797                   GTK_TYPE_DIRECTION_TYPE);
1798
1799   /**
1800    * GtkWidget::keynav-failed:
1801    * @widget: the object which received the signal
1802    * @direction: the direction of movement
1803    *
1804    * Gets emitted if keyboard navigation fails.
1805    * See gtk_widget_keynav_failed() for details.
1806    *
1807    * Returns: %TRUE if stopping keyboard navigation is fine, %FALSE
1808    *          if the emitting widget should try to handle the keyboard
1809    *          navigation attempt in its parent container(s).
1810    *
1811    * Since: 2.12
1812    **/
1813   widget_signals[KEYNAV_FAILED] =
1814     g_signal_new (I_("keynav-failed"),
1815                   G_TYPE_FROM_CLASS (klass),
1816                   G_SIGNAL_RUN_LAST,
1817                   G_STRUCT_OFFSET (GtkWidgetClass, keynav_failed),
1818                   _gtk_boolean_handled_accumulator, NULL,
1819                   _gtk_marshal_BOOLEAN__ENUM,
1820                   G_TYPE_BOOLEAN, 1,
1821                   GTK_TYPE_DIRECTION_TYPE);
1822
1823   /**
1824    * GtkWidget::event:
1825    * @widget: the object which received the signal.
1826    * @event: the #GdkEvent which triggered this signal
1827    *
1828    * The GTK+ main loop will emit three signals for each GDK event delivered
1829    * to a widget: one generic ::event signal, another, more specific,
1830    * signal that matches the type of event delivered (e.g.
1831    * #GtkWidget::key-press-event) and finally a generic
1832    * #GtkWidget::event-after signal.
1833    *
1834    * Returns: %TRUE to stop other handlers from being invoked for the event
1835    * and to cancel the emission of the second specific ::event signal.
1836    *   %FALSE to propagate the event further and to allow the emission of
1837    *   the second signal. The ::event-after signal is emitted regardless of
1838    *   the return value.
1839    */
1840   widget_signals[EVENT] =
1841     g_signal_new (I_("event"),
1842                   G_TYPE_FROM_CLASS (klass),
1843                   G_SIGNAL_RUN_LAST,
1844                   G_STRUCT_OFFSET (GtkWidgetClass, event),
1845                   _gtk_boolean_handled_accumulator, NULL,
1846                   _gtk_marshal_BOOLEAN__BOXED,
1847                   G_TYPE_BOOLEAN, 1,
1848                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
1849   g_signal_set_va_marshaller (widget_signals[EVENT], G_TYPE_FROM_CLASS (klass),
1850                               _gtk_marshal_BOOLEAN__BOXEDv);
1851
1852   /**
1853    * GtkWidget::event-after:
1854    * @widget: the object which received the signal.
1855    * @event: the #GdkEvent which triggered this signal
1856    *
1857    * After the emission of the #GtkWidget::event signal and (optionally)
1858    * the second more specific signal, ::event-after will be emitted
1859    * regardless of the previous two signals handlers return values.
1860    *
1861    */
1862   widget_signals[EVENT_AFTER] =
1863     g_signal_new (I_("event-after"),
1864                   G_TYPE_FROM_CLASS (klass),
1865                   0,
1866                   0,
1867                   NULL, NULL,
1868                   _gtk_marshal_VOID__BOXED,
1869                   G_TYPE_NONE, 1,
1870                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
1871   g_signal_set_va_marshaller (widget_signals[EVENT_AFTER], G_TYPE_FROM_CLASS (klass),
1872                               _gtk_marshal_BOOLEAN__BOXEDv);
1873
1874   /**
1875    * GtkWidget::button-press-event:
1876    * @widget: the object which received the signal.
1877    * @event: (type Gdk.EventButton): the #GdkEventButton which triggered
1878    *   this signal.
1879    *
1880    * The ::button-press-event signal will be emitted when a button
1881    * (typically from a mouse) is pressed.
1882    *
1883    * To receive this signal, the #GdkWindow associated to the
1884    * widget needs to enable the #GDK_BUTTON_PRESS_MASK mask.
1885    *
1886    * This signal will be sent to the grab widget if there is one.
1887    *
1888    * Returns: %TRUE to stop other handlers from being invoked for the event.
1889    *   %FALSE to propagate the event further.
1890    */
1891   widget_signals[BUTTON_PRESS_EVENT] =
1892     g_signal_new (I_("button-press-event"),
1893                   G_TYPE_FROM_CLASS (klass),
1894                   G_SIGNAL_RUN_LAST,
1895                   G_STRUCT_OFFSET (GtkWidgetClass, button_press_event),
1896                   _gtk_boolean_handled_accumulator, NULL,
1897                   _gtk_marshal_BOOLEAN__BOXED,
1898                   G_TYPE_BOOLEAN, 1,
1899                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
1900   g_signal_set_va_marshaller (widget_signals[BUTTON_PRESS_EVENT], G_TYPE_FROM_CLASS (klass),
1901                               _gtk_marshal_BOOLEAN__BOXEDv);
1902
1903   /**
1904    * GtkWidget::button-release-event:
1905    * @widget: the object which received the signal.
1906    * @event: (type Gdk.EventButton): the #GdkEventButton which triggered
1907    *   this signal.
1908    *
1909    * The ::button-release-event signal will be emitted when a button
1910    * (typically from a mouse) is released.
1911    *
1912    * To receive this signal, the #GdkWindow associated to the
1913    * widget needs to enable the #GDK_BUTTON_RELEASE_MASK mask.
1914    *
1915    * This signal will be sent to the grab widget if there is one.
1916    *
1917    * Returns: %TRUE to stop other handlers from being invoked for the event.
1918    *   %FALSE to propagate the event further.
1919    */
1920   widget_signals[BUTTON_RELEASE_EVENT] =
1921     g_signal_new (I_("button-release-event"),
1922                   G_TYPE_FROM_CLASS (klass),
1923                   G_SIGNAL_RUN_LAST,
1924                   G_STRUCT_OFFSET (GtkWidgetClass, button_release_event),
1925                   _gtk_boolean_handled_accumulator, NULL,
1926                   _gtk_marshal_BOOLEAN__BOXED,
1927                   G_TYPE_BOOLEAN, 1,
1928                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
1929   g_signal_set_va_marshaller (widget_signals[BUTTON_RELEASE_EVENT], G_TYPE_FROM_CLASS (klass),
1930                               _gtk_marshal_BOOLEAN__BOXEDv);
1931
1932   widget_signals[TOUCH_EVENT] =
1933     g_signal_new (I_("touch-event"),
1934                   G_TYPE_FROM_CLASS (klass),
1935                   G_SIGNAL_RUN_LAST,
1936                   G_STRUCT_OFFSET (GtkWidgetClass, touch_event),
1937                   _gtk_boolean_handled_accumulator, NULL,
1938                   _gtk_marshal_BOOLEAN__BOXED,
1939                   G_TYPE_BOOLEAN, 1,
1940                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
1941   g_signal_set_va_marshaller (widget_signals[TOUCH_EVENT], G_TYPE_FROM_CLASS (klass),
1942                               _gtk_marshal_BOOLEAN__BOXEDv);
1943
1944   /**
1945    * GtkWidget::scroll-event:
1946    * @widget: the object which received the signal.
1947    * @event: (type Gdk.EventScroll): the #GdkEventScroll which triggered
1948    *   this signal.
1949    *
1950    * The ::scroll-event signal is emitted when a button in the 4 to 7
1951    * range is pressed. Wheel mice are usually configured to generate
1952    * button press events for buttons 4 and 5 when the wheel is turned.
1953    *
1954    * To receive this signal, the #GdkWindow associated to the widget needs
1955    * to enable the #GDK_BUTTON_PRESS_MASK mask.
1956    *
1957    * This signal will be sent to the grab widget if there is one.
1958    *
1959    * Returns: %TRUE to stop other handlers from being invoked for the event.
1960    *   %FALSE to propagate the event further.
1961    */
1962   widget_signals[SCROLL_EVENT] =
1963     g_signal_new (I_("scroll-event"),
1964                   G_TYPE_FROM_CLASS (klass),
1965                   G_SIGNAL_RUN_LAST,
1966                   G_STRUCT_OFFSET (GtkWidgetClass, scroll_event),
1967                   _gtk_boolean_handled_accumulator, NULL,
1968                   _gtk_marshal_BOOLEAN__BOXED,
1969                   G_TYPE_BOOLEAN, 1,
1970                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
1971   g_signal_set_va_marshaller (widget_signals[SCROLL_EVENT], G_TYPE_FROM_CLASS (klass),
1972                               _gtk_marshal_BOOLEAN__BOXEDv);
1973
1974   /**
1975    * GtkWidget::motion-notify-event:
1976    * @widget: the object which received the signal.
1977    * @event: (type Gdk.EventMotion): the #GdkEventMotion which triggered
1978    *   this signal.
1979    *
1980    * The ::motion-notify-event signal is emitted when the pointer moves
1981    * over the widget's #GdkWindow.
1982    *
1983    * To receive this signal, the #GdkWindow associated to the widget
1984    * needs to enable the #GDK_POINTER_MOTION_MASK mask.
1985    *
1986    * This signal will be sent to the grab widget if there is one.
1987    *
1988    * Returns: %TRUE to stop other handlers from being invoked for the event.
1989    *   %FALSE to propagate the event further.
1990    */
1991   widget_signals[MOTION_NOTIFY_EVENT] =
1992     g_signal_new (I_("motion-notify-event"),
1993                   G_TYPE_FROM_CLASS (klass),
1994                   G_SIGNAL_RUN_LAST,
1995                   G_STRUCT_OFFSET (GtkWidgetClass, motion_notify_event),
1996                   _gtk_boolean_handled_accumulator, NULL,
1997                   _gtk_marshal_BOOLEAN__BOXED,
1998                   G_TYPE_BOOLEAN, 1,
1999                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2000   g_signal_set_va_marshaller (widget_signals[MOTION_NOTIFY_EVENT], G_TYPE_FROM_CLASS (klass),
2001                               _gtk_marshal_BOOLEAN__BOXEDv);
2002
2003   /**
2004    * GtkWidget::composited-changed:
2005    * @widget: the object on which the signal is emitted
2006    *
2007    * The ::composited-changed signal is emitted when the composited
2008    * status of @widget<!-- -->s screen changes.
2009    * See gdk_screen_is_composited().
2010    */
2011   widget_signals[COMPOSITED_CHANGED] =
2012     g_signal_new (I_("composited-changed"),
2013                   G_TYPE_FROM_CLASS (klass),
2014                   G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
2015                   G_STRUCT_OFFSET (GtkWidgetClass, composited_changed),
2016                   NULL, NULL,
2017                   _gtk_marshal_VOID__VOID,
2018                   G_TYPE_NONE, 0);
2019
2020   /**
2021    * GtkWidget::delete-event:
2022    * @widget: the object which received the signal
2023    * @event: the event which triggered this signal
2024    *
2025    * The ::delete-event signal is emitted if a user requests that
2026    * a toplevel window is closed. The default handler for this signal
2027    * destroys the window. Connecting gtk_widget_hide_on_delete() to
2028    * this signal will cause the window to be hidden instead, so that
2029    * it can later be shown again without reconstructing it.
2030    *
2031    * Returns: %TRUE to stop other handlers from being invoked for the event.
2032    *   %FALSE to propagate the event further.
2033    */
2034   widget_signals[DELETE_EVENT] =
2035     g_signal_new (I_("delete-event"),
2036                   G_TYPE_FROM_CLASS (klass),
2037                   G_SIGNAL_RUN_LAST,
2038                   G_STRUCT_OFFSET (GtkWidgetClass, delete_event),
2039                   _gtk_boolean_handled_accumulator, NULL,
2040                   _gtk_marshal_BOOLEAN__BOXED,
2041                   G_TYPE_BOOLEAN, 1,
2042                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2043   g_signal_set_va_marshaller (widget_signals[DELETE_EVENT], G_TYPE_FROM_CLASS (klass),
2044                               _gtk_marshal_BOOLEAN__BOXEDv);
2045
2046   /**
2047    * GtkWidget::destroy-event:
2048    * @widget: the object which received the signal.
2049    * @event: the event which triggered this signal
2050    *
2051    * The ::destroy-event signal is emitted when a #GdkWindow is destroyed.
2052    * You rarely get this signal, because most widgets disconnect themselves
2053    * from their window before they destroy it, so no widget owns the
2054    * window at destroy time.
2055    *
2056    * To receive this signal, the #GdkWindow associated to the widget needs
2057    * to enable the #GDK_STRUCTURE_MASK mask. GDK will enable this mask
2058    * automatically for all new windows.
2059    *
2060    * Returns: %TRUE to stop other handlers from being invoked for the event.
2061    *   %FALSE to propagate the event further.
2062    */
2063   widget_signals[DESTROY_EVENT] =
2064     g_signal_new (I_("destroy-event"),
2065                   G_TYPE_FROM_CLASS (klass),
2066                   G_SIGNAL_RUN_LAST,
2067                   G_STRUCT_OFFSET (GtkWidgetClass, destroy_event),
2068                   _gtk_boolean_handled_accumulator, NULL,
2069                   _gtk_marshal_BOOLEAN__BOXED,
2070                   G_TYPE_BOOLEAN, 1,
2071                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2072   g_signal_set_va_marshaller (widget_signals[DESTROY_EVENT], G_TYPE_FROM_CLASS (klass),
2073                               _gtk_marshal_BOOLEAN__BOXEDv);
2074
2075   /**
2076    * GtkWidget::key-press-event:
2077    * @widget: the object which received the signal
2078    * @event: (type Gdk.EventKey): the #GdkEventKey which triggered this signal.
2079    *
2080    * The ::key-press-event signal is emitted when a key is pressed. The signal
2081    * emission will reoccur at the key-repeat rate when the key is kept pressed.
2082    *
2083    * To receive this signal, the #GdkWindow associated to the widget needs
2084    * to enable the #GDK_KEY_PRESS_MASK mask.
2085    *
2086    * This signal will be sent to the grab widget if there is one.
2087    *
2088    * Returns: %TRUE to stop other handlers from being invoked for the event.
2089    *   %FALSE to propagate the event further.
2090    */
2091   widget_signals[KEY_PRESS_EVENT] =
2092     g_signal_new (I_("key-press-event"),
2093                   G_TYPE_FROM_CLASS (klass),
2094                   G_SIGNAL_RUN_LAST,
2095                   G_STRUCT_OFFSET (GtkWidgetClass, key_press_event),
2096                   _gtk_boolean_handled_accumulator, NULL,
2097                   _gtk_marshal_BOOLEAN__BOXED,
2098                   G_TYPE_BOOLEAN, 1,
2099                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2100   g_signal_set_va_marshaller (widget_signals[KEY_PRESS_EVENT], G_TYPE_FROM_CLASS (klass),
2101                               _gtk_marshal_BOOLEAN__BOXEDv);
2102
2103   /**
2104    * GtkWidget::key-release-event:
2105    * @widget: the object which received the signal
2106    * @event: (type Gdk.EventKey): the #GdkEventKey which triggered this signal.
2107    *
2108    * The ::key-release-event signal is emitted when a key is released.
2109    *
2110    * To receive this signal, the #GdkWindow associated to the widget needs
2111    * to enable the #GDK_KEY_RELEASE_MASK mask.
2112    *
2113    * This signal will be sent to the grab widget if there is one.
2114    *
2115    * Returns: %TRUE to stop other handlers from being invoked for the event.
2116    *   %FALSE to propagate the event further.
2117    */
2118   widget_signals[KEY_RELEASE_EVENT] =
2119     g_signal_new (I_("key-release-event"),
2120                   G_TYPE_FROM_CLASS (klass),
2121                   G_SIGNAL_RUN_LAST,
2122                   G_STRUCT_OFFSET (GtkWidgetClass, key_release_event),
2123                   _gtk_boolean_handled_accumulator, NULL,
2124                   _gtk_marshal_BOOLEAN__BOXED,
2125                   G_TYPE_BOOLEAN, 1,
2126                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2127   g_signal_set_va_marshaller (widget_signals[KEY_RELEASE_EVENT], G_TYPE_FROM_CLASS (klass),
2128                               _gtk_marshal_BOOLEAN__BOXEDv);
2129
2130   /**
2131    * GtkWidget::enter-notify-event:
2132    * @widget: the object which received the signal
2133    * @event: (type Gdk.EventCrossing): the #GdkEventCrossing which triggered
2134    *   this signal.
2135    *
2136    * The ::enter-notify-event will be emitted when the pointer enters
2137    * the @widget's window.
2138    *
2139    * To receive this signal, the #GdkWindow associated to the widget needs
2140    * to enable the #GDK_ENTER_NOTIFY_MASK mask.
2141    *
2142    * This signal will be sent to the grab widget if there is one.
2143    *
2144    * Returns: %TRUE to stop other handlers from being invoked for the event.
2145    *   %FALSE to propagate the event further.
2146    */
2147   widget_signals[ENTER_NOTIFY_EVENT] =
2148     g_signal_new (I_("enter-notify-event"),
2149                   G_TYPE_FROM_CLASS (klass),
2150                   G_SIGNAL_RUN_LAST,
2151                   G_STRUCT_OFFSET (GtkWidgetClass, enter_notify_event),
2152                   _gtk_boolean_handled_accumulator, NULL,
2153                   _gtk_marshal_BOOLEAN__BOXED,
2154                   G_TYPE_BOOLEAN, 1,
2155                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2156   g_signal_set_va_marshaller (widget_signals[ENTER_NOTIFY_EVENT], G_TYPE_FROM_CLASS (klass),
2157                               _gtk_marshal_BOOLEAN__BOXEDv);
2158
2159   /**
2160    * GtkWidget::leave-notify-event:
2161    * @widget: the object which received the signal
2162    * @event: (type Gdk.EventCrossing): the #GdkEventCrossing which triggered
2163    *   this signal.
2164    *
2165    * The ::leave-notify-event will be emitted when the pointer leaves
2166    * the @widget's window.
2167    *
2168    * To receive this signal, the #GdkWindow associated to the widget needs
2169    * to enable the #GDK_LEAVE_NOTIFY_MASK mask.
2170    *
2171    * This signal will be sent to the grab widget if there is one.
2172    *
2173    * Returns: %TRUE to stop other handlers from being invoked for the event.
2174    *   %FALSE to propagate the event further.
2175    */
2176   widget_signals[LEAVE_NOTIFY_EVENT] =
2177     g_signal_new (I_("leave-notify-event"),
2178                   G_TYPE_FROM_CLASS (klass),
2179                   G_SIGNAL_RUN_LAST,
2180                   G_STRUCT_OFFSET (GtkWidgetClass, leave_notify_event),
2181                   _gtk_boolean_handled_accumulator, NULL,
2182                   _gtk_marshal_BOOLEAN__BOXED,
2183                   G_TYPE_BOOLEAN, 1,
2184                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2185   g_signal_set_va_marshaller (widget_signals[LEAVE_NOTIFY_EVENT], G_TYPE_FROM_CLASS (klass),
2186                               _gtk_marshal_BOOLEAN__BOXEDv);
2187
2188   /**
2189    * GtkWidget::configure-event:
2190    * @widget: the object which received the signal
2191    * @event: (type Gdk.EventConfigure): the #GdkEventConfigure which triggered
2192    *   this signal.
2193    *
2194    * The ::configure-event signal will be emitted when the size, position or
2195    * stacking of the @widget's window has changed.
2196    *
2197    * To receive this signal, the #GdkWindow associated to the widget needs
2198    * to enable the #GDK_STRUCTURE_MASK mask. GDK will enable this mask
2199    * automatically for all new windows.
2200    *
2201    * Returns: %TRUE to stop other handlers from being invoked for the event.
2202    *   %FALSE to propagate the event further.
2203    */
2204   widget_signals[CONFIGURE_EVENT] =
2205     g_signal_new (I_("configure-event"),
2206                   G_TYPE_FROM_CLASS (klass),
2207                   G_SIGNAL_RUN_LAST,
2208                   G_STRUCT_OFFSET (GtkWidgetClass, configure_event),
2209                   _gtk_boolean_handled_accumulator, NULL,
2210                   _gtk_marshal_BOOLEAN__BOXED,
2211                   G_TYPE_BOOLEAN, 1,
2212                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2213   g_signal_set_va_marshaller (widget_signals[CONFIGURE_EVENT], G_TYPE_FROM_CLASS (klass),
2214                               _gtk_marshal_BOOLEAN__BOXEDv);
2215
2216   /**
2217    * GtkWidget::focus-in-event:
2218    * @widget: the object which received the signal
2219    * @event: (type Gdk.EventFocus): the #GdkEventFocus which triggered
2220    *   this signal.
2221    *
2222    * The ::focus-in-event signal will be emitted when the keyboard focus
2223    * enters the @widget's window.
2224    *
2225    * To receive this signal, the #GdkWindow associated to the widget needs
2226    * to enable the #GDK_FOCUS_CHANGE_MASK mask.
2227    *
2228    * Returns: %TRUE to stop other handlers from being invoked for the event.
2229    *   %FALSE to propagate the event further.
2230    */
2231   widget_signals[FOCUS_IN_EVENT] =
2232     g_signal_new (I_("focus-in-event"),
2233                   G_TYPE_FROM_CLASS (klass),
2234                   G_SIGNAL_RUN_LAST,
2235                   G_STRUCT_OFFSET (GtkWidgetClass, focus_in_event),
2236                   _gtk_boolean_handled_accumulator, NULL,
2237                   _gtk_marshal_BOOLEAN__BOXED,
2238                   G_TYPE_BOOLEAN, 1,
2239                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2240   g_signal_set_va_marshaller (widget_signals[FOCUS_IN_EVENT], G_TYPE_FROM_CLASS (klass),
2241                               _gtk_marshal_BOOLEAN__BOXEDv);
2242
2243   /**
2244    * GtkWidget::focus-out-event:
2245    * @widget: the object which received the signal
2246    * @event: (type Gdk.EventFocus): the #GdkEventFocus which triggered this
2247    *   signal.
2248    *
2249    * The ::focus-out-event signal will be emitted when the keyboard focus
2250    * leaves the @widget's window.
2251    *
2252    * To receive this signal, the #GdkWindow associated to the widget needs
2253    * to enable the #GDK_FOCUS_CHANGE_MASK mask.
2254    *
2255    * Returns: %TRUE to stop other handlers from being invoked for the event.
2256    *   %FALSE to propagate the event further.
2257    */
2258   widget_signals[FOCUS_OUT_EVENT] =
2259     g_signal_new (I_("focus-out-event"),
2260                   G_TYPE_FROM_CLASS (klass),
2261                   G_SIGNAL_RUN_LAST,
2262                   G_STRUCT_OFFSET (GtkWidgetClass, focus_out_event),
2263                   _gtk_boolean_handled_accumulator, NULL,
2264                   _gtk_marshal_BOOLEAN__BOXED,
2265                   G_TYPE_BOOLEAN, 1,
2266                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2267   g_signal_set_va_marshaller (widget_signals[FOCUS_OUT_EVENT], G_TYPE_FROM_CLASS (klass),
2268                               _gtk_marshal_BOOLEAN__BOXEDv);
2269
2270   /**
2271    * GtkWidget::map-event:
2272    * @widget: the object which received the signal
2273    * @event: (type Gdk.EventAny): the #GdkEventAny which triggered this signal.
2274    *
2275    * The ::map-event signal will be emitted when the @widget's window is
2276    * mapped. A window is mapped when it becomes visible on the screen.
2277    *
2278    * To receive this signal, the #GdkWindow associated to the widget needs
2279    * to enable the #GDK_STRUCTURE_MASK mask. GDK will enable this mask
2280    * automatically for all new windows.
2281    *
2282    * Returns: %TRUE to stop other handlers from being invoked for the event.
2283    *   %FALSE to propagate the event further.
2284    */
2285   widget_signals[MAP_EVENT] =
2286     g_signal_new (I_("map-event"),
2287                   G_TYPE_FROM_CLASS (klass),
2288                   G_SIGNAL_RUN_LAST,
2289                   G_STRUCT_OFFSET (GtkWidgetClass, map_event),
2290                   _gtk_boolean_handled_accumulator, NULL,
2291                   _gtk_marshal_BOOLEAN__BOXED,
2292                   G_TYPE_BOOLEAN, 1,
2293                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2294   g_signal_set_va_marshaller (widget_signals[MAP_EVENT], G_TYPE_FROM_CLASS (klass),
2295                               _gtk_marshal_BOOLEAN__BOXEDv);
2296
2297   /**
2298    * GtkWidget::unmap-event:
2299    * @widget: the object which received the signal
2300    * @event: (type Gdk.EventAny): the #GdkEventAny which triggered this signal
2301    *
2302    * The ::unmap-event signal will be emitted when the @widget's window is
2303    * unmapped. A window is unmapped when it becomes invisible on the screen.
2304    *
2305    * To receive this signal, the #GdkWindow associated to the widget needs
2306    * to enable the #GDK_STRUCTURE_MASK mask. GDK will enable this mask
2307    * automatically for all new windows.
2308    *
2309    * Returns: %TRUE to stop other handlers from being invoked for the event.
2310    *   %FALSE to propagate the event further.
2311    */
2312   widget_signals[UNMAP_EVENT] =
2313     g_signal_new (I_("unmap-event"),
2314                   G_TYPE_FROM_CLASS (klass),
2315                   G_SIGNAL_RUN_LAST,
2316                   G_STRUCT_OFFSET (GtkWidgetClass, unmap_event),
2317                   _gtk_boolean_handled_accumulator, NULL,
2318                   _gtk_marshal_BOOLEAN__BOXED,
2319                   G_TYPE_BOOLEAN, 1,
2320                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2321   g_signal_set_va_marshaller (widget_signals[UNMAP_EVENT], G_TYPE_FROM_CLASS (klass),
2322                               _gtk_marshal_BOOLEAN__BOXEDv);
2323
2324   /**
2325    * GtkWidget::property-notify-event:
2326    * @widget: the object which received the signal
2327    * @event: (type Gdk.EventProperty): the #GdkEventProperty which triggered
2328    *   this signal.
2329    *
2330    * The ::property-notify-event signal will be emitted when a property on
2331    * the @widget's window has been changed or deleted.
2332    *
2333    * To receive this signal, the #GdkWindow associated to the widget needs
2334    * to enable the #GDK_PROPERTY_CHANGE_MASK mask.
2335    *
2336    * Returns: %TRUE to stop other handlers from being invoked for the event.
2337    *   %FALSE to propagate the event further.
2338    */
2339   widget_signals[PROPERTY_NOTIFY_EVENT] =
2340     g_signal_new (I_("property-notify-event"),
2341                   G_TYPE_FROM_CLASS (klass),
2342                   G_SIGNAL_RUN_LAST,
2343                   G_STRUCT_OFFSET (GtkWidgetClass, property_notify_event),
2344                   _gtk_boolean_handled_accumulator, NULL,
2345                   _gtk_marshal_BOOLEAN__BOXED,
2346                   G_TYPE_BOOLEAN, 1,
2347                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2348   g_signal_set_va_marshaller (widget_signals[PROPERTY_NOTIFY_EVENT], G_TYPE_FROM_CLASS (klass),
2349                               _gtk_marshal_BOOLEAN__BOXEDv);
2350
2351   /**
2352    * GtkWidget::selection-clear-event:
2353    * @widget: the object which received the signal
2354    * @event: (type Gdk.EventSelection): the #GdkEventSelection which triggered
2355    *   this signal.
2356    *
2357    * The ::selection-clear-event signal will be emitted when the
2358    * the @widget's window has lost ownership of a selection.
2359    *
2360    * Returns: %TRUE to stop other handlers from being invoked for the event.
2361    *   %FALSE to propagate the event further.
2362    */
2363   widget_signals[SELECTION_CLEAR_EVENT] =
2364     g_signal_new (I_("selection-clear-event"),
2365                   G_TYPE_FROM_CLASS (klass),
2366                   G_SIGNAL_RUN_LAST,
2367                   G_STRUCT_OFFSET (GtkWidgetClass, selection_clear_event),
2368                   _gtk_boolean_handled_accumulator, NULL,
2369                   _gtk_marshal_BOOLEAN__BOXED,
2370                   G_TYPE_BOOLEAN, 1,
2371                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2372   g_signal_set_va_marshaller (widget_signals[SELECTION_CLEAR_EVENT], G_TYPE_FROM_CLASS (klass),
2373                               _gtk_marshal_BOOLEAN__BOXEDv);
2374
2375   /**
2376    * GtkWidget::selection-request-event:
2377    * @widget: the object which received the signal
2378    * @event: (type Gdk.EventSelection): the #GdkEventSelection which triggered
2379    *   this signal.
2380    *
2381    * The ::selection-request-event signal will be emitted when
2382    * another client requests ownership of the selection owned by
2383    * the @widget's window.
2384    *
2385    * Returns: %TRUE to stop other handlers from being invoked for the event.
2386    *   %FALSE to propagate the event further.
2387    */
2388   widget_signals[SELECTION_REQUEST_EVENT] =
2389     g_signal_new (I_("selection-request-event"),
2390                   G_TYPE_FROM_CLASS (klass),
2391                   G_SIGNAL_RUN_LAST,
2392                   G_STRUCT_OFFSET (GtkWidgetClass, selection_request_event),
2393                   _gtk_boolean_handled_accumulator, NULL,
2394                   _gtk_marshal_BOOLEAN__BOXED,
2395                   G_TYPE_BOOLEAN, 1,
2396                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2397   g_signal_set_va_marshaller (widget_signals[SELECTION_REQUEST_EVENT], G_TYPE_FROM_CLASS (klass),
2398                               _gtk_marshal_BOOLEAN__BOXEDv);
2399
2400   /**
2401    * GtkWidget::selection-notify-event:
2402    * @widget: the object which received the signal.
2403    * @event: (type Gdk.EventSelection):
2404    *
2405    * Returns: %TRUE to stop other handlers from being invoked for the event. %FALSE to propagate the event further.
2406    */
2407   widget_signals[SELECTION_NOTIFY_EVENT] =
2408     g_signal_new (I_("selection-notify-event"),
2409                   G_TYPE_FROM_CLASS (klass),
2410                   G_SIGNAL_RUN_LAST,
2411                   G_STRUCT_OFFSET (GtkWidgetClass, selection_notify_event),
2412                   _gtk_boolean_handled_accumulator, NULL,
2413                   _gtk_marshal_BOOLEAN__BOXED,
2414                   G_TYPE_BOOLEAN, 1,
2415                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2416   g_signal_set_va_marshaller (widget_signals[SELECTION_NOTIFY_EVENT], G_TYPE_FROM_CLASS (klass),
2417                               _gtk_marshal_BOOLEAN__BOXEDv);
2418
2419   /**
2420    * GtkWidget::selection-received:
2421    * @widget: the object which received the signal.
2422    * @data:
2423    * @time:
2424    */
2425   widget_signals[SELECTION_RECEIVED] =
2426     g_signal_new (I_("selection-received"),
2427                   G_TYPE_FROM_CLASS (klass),
2428                   G_SIGNAL_RUN_LAST,
2429                   G_STRUCT_OFFSET (GtkWidgetClass, selection_received),
2430                   NULL, NULL,
2431                   _gtk_marshal_VOID__BOXED_UINT,
2432                   G_TYPE_NONE, 2,
2433                   GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
2434                   G_TYPE_UINT);
2435
2436   /**
2437    * GtkWidget::selection-get:
2438    * @widget: the object which received the signal.
2439    * @data:
2440    * @info:
2441    * @time:
2442    */
2443   widget_signals[SELECTION_GET] =
2444     g_signal_new (I_("selection-get"),
2445                   G_TYPE_FROM_CLASS (klass),
2446                   G_SIGNAL_RUN_LAST,
2447                   G_STRUCT_OFFSET (GtkWidgetClass, selection_get),
2448                   NULL, NULL,
2449                   _gtk_marshal_VOID__BOXED_UINT_UINT,
2450                   G_TYPE_NONE, 3,
2451                   GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
2452                   G_TYPE_UINT,
2453                   G_TYPE_UINT);
2454
2455   /**
2456    * GtkWidget::proximity-in-event:
2457    * @widget: the object which received the signal
2458    * @event: (type Gdk.EventProximity): the #GdkEventProximity which triggered
2459    *   this signal.
2460    *
2461    * To receive this signal the #GdkWindow associated to the widget needs
2462    * to enable the #GDK_PROXIMITY_IN_MASK mask.
2463    *
2464    * This signal will be sent to the grab widget if there is one.
2465    *
2466    * Returns: %TRUE to stop other handlers from being invoked for the event.
2467    *   %FALSE to propagate the event further.
2468    */
2469   widget_signals[PROXIMITY_IN_EVENT] =
2470     g_signal_new (I_("proximity-in-event"),
2471                   G_TYPE_FROM_CLASS (klass),
2472                   G_SIGNAL_RUN_LAST,
2473                   G_STRUCT_OFFSET (GtkWidgetClass, proximity_in_event),
2474                   _gtk_boolean_handled_accumulator, NULL,
2475                   _gtk_marshal_BOOLEAN__BOXED,
2476                   G_TYPE_BOOLEAN, 1,
2477                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2478   g_signal_set_va_marshaller (widget_signals[PROXIMITY_IN_EVENT], G_TYPE_FROM_CLASS (klass),
2479                               _gtk_marshal_BOOLEAN__BOXEDv);
2480
2481   /**
2482    * GtkWidget::proximity-out-event:
2483    * @widget: the object which received the signal
2484    * @event: (type Gdk.EventProximity): the #GdkEventProximity which triggered
2485    *   this signal.
2486    *
2487    * To receive this signal the #GdkWindow associated to the widget needs
2488    * to enable the #GDK_PROXIMITY_OUT_MASK mask.
2489    *
2490    * This signal will be sent to the grab widget if there is one.
2491    *
2492    * Returns: %TRUE to stop other handlers from being invoked for the event.
2493    *   %FALSE to propagate the event further.
2494    */
2495   widget_signals[PROXIMITY_OUT_EVENT] =
2496     g_signal_new (I_("proximity-out-event"),
2497                   G_TYPE_FROM_CLASS (klass),
2498                   G_SIGNAL_RUN_LAST,
2499                   G_STRUCT_OFFSET (GtkWidgetClass, proximity_out_event),
2500                   _gtk_boolean_handled_accumulator, NULL,
2501                   _gtk_marshal_BOOLEAN__BOXED,
2502                   G_TYPE_BOOLEAN, 1,
2503                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2504   g_signal_set_va_marshaller (widget_signals[PROXIMITY_OUT_EVENT], G_TYPE_FROM_CLASS (klass),
2505                               _gtk_marshal_BOOLEAN__BOXEDv);
2506
2507   /**
2508    * GtkWidget::drag-leave:
2509    * @widget: the object which received the signal.
2510    * @drag_context: the drag context
2511    * @time: the timestamp of the motion event
2512    *
2513    * The ::drag-leave signal is emitted on the drop site when the cursor
2514    * leaves the widget. A typical reason to connect to this signal is to
2515    * undo things done in #GtkWidget::drag-motion, e.g. undo highlighting
2516    * with gtk_drag_unhighlight()
2517    */
2518   widget_signals[DRAG_LEAVE] =
2519     g_signal_new (I_("drag-leave"),
2520                   G_TYPE_FROM_CLASS (klass),
2521                   G_SIGNAL_RUN_LAST,
2522                   G_STRUCT_OFFSET (GtkWidgetClass, drag_leave),
2523                   NULL, NULL,
2524                   _gtk_marshal_VOID__OBJECT_UINT,
2525                   G_TYPE_NONE, 2,
2526                   GDK_TYPE_DRAG_CONTEXT,
2527                   G_TYPE_UINT);
2528
2529   /**
2530    * GtkWidget::drag-begin:
2531    * @widget: the object which received the signal
2532    * @drag_context: the drag context
2533    *
2534    * The ::drag-begin signal is emitted on the drag source when a drag is
2535    * started. A typical reason to connect to this signal is to set up a
2536    * custom drag icon with gtk_drag_source_set_icon().
2537    *
2538    * Note that some widgets set up a drag icon in the default handler of
2539    * this signal, so you may have to use g_signal_connect_after() to
2540    * override what the default handler did.
2541    */
2542   widget_signals[DRAG_BEGIN] =
2543     g_signal_new (I_("drag-begin"),
2544                   G_TYPE_FROM_CLASS (klass),
2545                   G_SIGNAL_RUN_LAST,
2546                   G_STRUCT_OFFSET (GtkWidgetClass, drag_begin),
2547                   NULL, NULL,
2548                   _gtk_marshal_VOID__OBJECT,
2549                   G_TYPE_NONE, 1,
2550                   GDK_TYPE_DRAG_CONTEXT);
2551
2552   /**
2553    * GtkWidget::drag-end:
2554    * @widget: the object which received the signal
2555    * @drag_context: the drag context
2556    *
2557    * The ::drag-end signal is emitted on the drag source when a drag is
2558    * finished.  A typical reason to connect to this signal is to undo
2559    * things done in #GtkWidget::drag-begin.
2560    */
2561   widget_signals[DRAG_END] =
2562     g_signal_new (I_("drag-end"),
2563                   G_TYPE_FROM_CLASS (klass),
2564                   G_SIGNAL_RUN_LAST,
2565                   G_STRUCT_OFFSET (GtkWidgetClass, drag_end),
2566                   NULL, NULL,
2567                   _gtk_marshal_VOID__OBJECT,
2568                   G_TYPE_NONE, 1,
2569                   GDK_TYPE_DRAG_CONTEXT);
2570
2571   /**
2572    * GtkWidget::drag-data-delete:
2573    * @widget: the object which received the signal
2574    * @drag_context: the drag context
2575    *
2576    * The ::drag-data-delete signal is emitted on the drag source when a drag
2577    * with the action %GDK_ACTION_MOVE is successfully completed. The signal
2578    * handler is responsible for deleting the data that has been dropped. What
2579    * "delete" means depends on the context of the drag operation.
2580    */
2581   widget_signals[DRAG_DATA_DELETE] =
2582     g_signal_new (I_("drag-data-delete"),
2583                   G_TYPE_FROM_CLASS (klass),
2584                   G_SIGNAL_RUN_LAST,
2585                   G_STRUCT_OFFSET (GtkWidgetClass, drag_data_delete),
2586                   NULL, NULL,
2587                   _gtk_marshal_VOID__OBJECT,
2588                   G_TYPE_NONE, 1,
2589                   GDK_TYPE_DRAG_CONTEXT);
2590
2591   /**
2592    * GtkWidget::drag-failed:
2593    * @widget: the object which received the signal
2594    * @drag_context: the drag context
2595    * @result: the result of the drag operation
2596    *
2597    * The ::drag-failed signal is emitted on the drag source when a drag has
2598    * failed. The signal handler may hook custom code to handle a failed DND
2599    * operation based on the type of error, it returns %TRUE is the failure has
2600    * been already handled (not showing the default "drag operation failed"
2601    * animation), otherwise it returns %FALSE.
2602    *
2603    * Return value: %TRUE if the failed drag operation has been already handled.
2604    *
2605    * Since: 2.12
2606    */
2607   widget_signals[DRAG_FAILED] =
2608     g_signal_new (I_("drag-failed"),
2609                   G_TYPE_FROM_CLASS (klass),
2610                   G_SIGNAL_RUN_LAST,
2611                   G_STRUCT_OFFSET (GtkWidgetClass, drag_failed),
2612                   _gtk_boolean_handled_accumulator, NULL,
2613                   _gtk_marshal_BOOLEAN__OBJECT_ENUM,
2614                   G_TYPE_BOOLEAN, 2,
2615                   GDK_TYPE_DRAG_CONTEXT,
2616                   GTK_TYPE_DRAG_RESULT);
2617
2618   /**
2619    * GtkWidget::drag-motion:
2620    * @widget: the object which received the signal
2621    * @drag_context: the drag context
2622    * @x: the x coordinate of the current cursor position
2623    * @y: the y coordinate of the current cursor position
2624    * @time: the timestamp of the motion event
2625    *
2626    * The drag-motion signal is emitted on the drop site when the user
2627    * moves the cursor over the widget during a drag. The signal handler
2628    * must determine whether the cursor position is in a drop zone or not.
2629    * If it is not in a drop zone, it returns %FALSE and no further processing
2630    * is necessary. Otherwise, the handler returns %TRUE. In this case, the
2631    * handler is responsible for providing the necessary information for
2632    * displaying feedback to the user, by calling gdk_drag_status().
2633    *
2634    * If the decision whether the drop will be accepted or rejected can't be
2635    * made based solely on the cursor position and the type of the data, the
2636    * handler may inspect the dragged data by calling gtk_drag_get_data() and
2637    * defer the gdk_drag_status() call to the #GtkWidget::drag-data-received
2638    * handler. Note that you cannot not pass #GTK_DEST_DEFAULT_DROP,
2639    * #GTK_DEST_DEFAULT_MOTION or #GTK_DEST_DEFAULT_ALL to gtk_drag_dest_set()
2640    * when using the drag-motion signal that way.
2641    *
2642    * Also note that there is no drag-enter signal. The drag receiver has to
2643    * keep track of whether he has received any drag-motion signals since the
2644    * last #GtkWidget::drag-leave and if not, treat the drag-motion signal as
2645    * an "enter" signal. Upon an "enter", the handler will typically highlight
2646    * the drop site with gtk_drag_highlight().
2647    * |[
2648    * static void
2649    * drag_motion (GtkWidget *widget,
2650    *              GdkDragContext *context,
2651    *              gint x,
2652    *              gint y,
2653    *              guint time)
2654    * {
2655    *   GdkAtom target;
2656    *
2657    *   PrivateData *private_data = GET_PRIVATE_DATA (widget);
2658    *
2659    *   if (!private_data->drag_highlight)
2660    *    {
2661    *      private_data->drag_highlight = 1;
2662    *      gtk_drag_highlight (widget);
2663    *    }
2664    *
2665    *   target = gtk_drag_dest_find_target (widget, context, NULL);
2666    *   if (target == GDK_NONE)
2667    *     gdk_drag_status (context, 0, time);
2668    *   else
2669    *    {
2670    *      private_data->pending_status = context->suggested_action;
2671    *      gtk_drag_get_data (widget, context, target, time);
2672    *    }
2673    *
2674    *   return TRUE;
2675    * }
2676    *
2677    * static void
2678    * drag_data_received (GtkWidget        *widget,
2679    *                     GdkDragContext   *context,
2680    *                     gint              x,
2681    *                     gint              y,
2682    *                     GtkSelectionData *selection_data,
2683    *                     guint             info,
2684    *                     guint             time)
2685    * {
2686    *   PrivateData *private_data = GET_PRIVATE_DATA (widget);
2687    *
2688    *   if (private_data->suggested_action)
2689    *    {
2690    *      private_data->suggested_action = 0;
2691    *
2692    *     /&ast; We are getting this data due to a request in drag_motion,
2693    *      * rather than due to a request in drag_drop, so we are just
2694    *      * supposed to call gdk_drag_status (), not actually paste in
2695    *      * the data.
2696    *      &ast;/
2697    *      str = gtk_selection_data_get_text (selection_data);
2698    *      if (!data_is_acceptable (str))
2699    *        gdk_drag_status (context, 0, time);
2700    *      else
2701    *        gdk_drag_status (context, private_data->suggested_action, time);
2702    *    }
2703    *   else
2704    *    {
2705    *      /&ast; accept the drop &ast;/
2706    *    }
2707    * }
2708    * ]|
2709    *
2710    * Returns: whether the cursor position is in a drop zone
2711    */
2712   widget_signals[DRAG_MOTION] =
2713     g_signal_new (I_("drag-motion"),
2714                   G_TYPE_FROM_CLASS (klass),
2715                   G_SIGNAL_RUN_LAST,
2716                   G_STRUCT_OFFSET (GtkWidgetClass, drag_motion),
2717                   _gtk_boolean_handled_accumulator, NULL,
2718                   _gtk_marshal_BOOLEAN__OBJECT_INT_INT_UINT,
2719                   G_TYPE_BOOLEAN, 4,
2720                   GDK_TYPE_DRAG_CONTEXT,
2721                   G_TYPE_INT,
2722                   G_TYPE_INT,
2723                   G_TYPE_UINT);
2724
2725   /**
2726    * GtkWidget::drag-drop:
2727    * @widget: the object which received the signal
2728    * @drag_context: the drag context
2729    * @x: the x coordinate of the current cursor position
2730    * @y: the y coordinate of the current cursor position
2731    * @time: the timestamp of the motion event
2732    *
2733    * The ::drag-drop signal is emitted on the drop site when the user drops
2734    * the data onto the widget. The signal handler must determine whether
2735    * the cursor position is in a drop zone or not. If it is not in a drop
2736    * zone, it returns %FALSE and no further processing is necessary.
2737    * Otherwise, the handler returns %TRUE. In this case, the handler must
2738    * ensure that gtk_drag_finish() is called to let the source know that
2739    * the drop is done. The call to gtk_drag_finish() can be done either
2740    * directly or in a #GtkWidget::drag-data-received handler which gets
2741    * triggered by calling gtk_drag_get_data() to receive the data for one
2742    * or more of the supported targets.
2743    *
2744    * Returns: whether the cursor position is in a drop zone
2745    */
2746   widget_signals[DRAG_DROP] =
2747     g_signal_new (I_("drag-drop"),
2748                   G_TYPE_FROM_CLASS (klass),
2749                   G_SIGNAL_RUN_LAST,
2750                   G_STRUCT_OFFSET (GtkWidgetClass, drag_drop),
2751                   _gtk_boolean_handled_accumulator, NULL,
2752                   _gtk_marshal_BOOLEAN__OBJECT_INT_INT_UINT,
2753                   G_TYPE_BOOLEAN, 4,
2754                   GDK_TYPE_DRAG_CONTEXT,
2755                   G_TYPE_INT,
2756                   G_TYPE_INT,
2757                   G_TYPE_UINT);
2758
2759   /**
2760    * GtkWidget::drag-data-get:
2761    * @widget: the object which received the signal
2762    * @drag_context: the drag context
2763    * @data: the #GtkSelectionData to be filled with the dragged data
2764    * @info: the info that has been registered with the target in the
2765    *        #GtkTargetList
2766    * @time: the timestamp at which the data was requested
2767    *
2768    * The ::drag-data-get signal is emitted on the drag source when the drop
2769    * site requests the data which is dragged. It is the responsibility of
2770    * the signal handler to fill @data with the data in the format which
2771    * is indicated by @info. See gtk_selection_data_set() and
2772    * gtk_selection_data_set_text().
2773    */
2774   widget_signals[DRAG_DATA_GET] =
2775     g_signal_new (I_("drag-data-get"),
2776                   G_TYPE_FROM_CLASS (klass),
2777                   G_SIGNAL_RUN_LAST,
2778                   G_STRUCT_OFFSET (GtkWidgetClass, drag_data_get),
2779                   NULL, NULL,
2780                   _gtk_marshal_VOID__OBJECT_BOXED_UINT_UINT,
2781                   G_TYPE_NONE, 4,
2782                   GDK_TYPE_DRAG_CONTEXT,
2783                   GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
2784                   G_TYPE_UINT,
2785                   G_TYPE_UINT);
2786
2787   /**
2788    * GtkWidget::drag-data-received:
2789    * @widget: the object which received the signal
2790    * @drag_context: the drag context
2791    * @x: where the drop happened
2792    * @y: where the drop happened
2793    * @data: the received data
2794    * @info: the info that has been registered with the target in the
2795    *        #GtkTargetList
2796    * @time: the timestamp at which the data was received
2797    *
2798    * The ::drag-data-received signal is emitted on the drop site when the
2799    * dragged data has been received. If the data was received in order to
2800    * determine whether the drop will be accepted, the handler is expected
2801    * to call gdk_drag_status() and <emphasis>not</emphasis> finish the drag.
2802    * If the data was received in response to a #GtkWidget::drag-drop signal
2803    * (and this is the last target to be received), the handler for this
2804    * signal is expected to process the received data and then call
2805    * gtk_drag_finish(), setting the @success parameter depending on whether
2806    * the data was processed successfully.
2807    *
2808    * The handler may inspect and modify @drag_context->action before calling
2809    * gtk_drag_finish(), e.g. to implement %GDK_ACTION_ASK as shown in the
2810    * following example:
2811    * |[
2812    * void
2813    * drag_data_received (GtkWidget          *widget,
2814    *                     GdkDragContext     *drag_context,
2815    *                     gint                x,
2816    *                     gint                y,
2817    *                     GtkSelectionData   *data,
2818    *                     guint               info,
2819    *                     guint               time)
2820    * {
2821    *   if ((data->length >= 0) && (data->format == 8))
2822    *     {
2823    *       if (drag_context->action == GDK_ACTION_ASK)
2824    *         {
2825    *           GtkWidget *dialog;
2826    *           gint response;
2827    *
2828    *           dialog = gtk_message_dialog_new (NULL,
2829    *                                            GTK_DIALOG_MODAL |
2830    *                                            GTK_DIALOG_DESTROY_WITH_PARENT,
2831    *                                            GTK_MESSAGE_INFO,
2832    *                                            GTK_BUTTONS_YES_NO,
2833    *                                            "Move the data ?\n");
2834    *           response = gtk_dialog_run (GTK_DIALOG (dialog));
2835    *           gtk_widget_destroy (dialog);
2836    *
2837    *           if (response == GTK_RESPONSE_YES)
2838    *             drag_context->action = GDK_ACTION_MOVE;
2839    *           else
2840    *             drag_context->action = GDK_ACTION_COPY;
2841    *          }
2842    *
2843    *       gtk_drag_finish (drag_context, TRUE, FALSE, time);
2844    *       return;
2845    *     }
2846    *
2847    *    gtk_drag_finish (drag_context, FALSE, FALSE, time);
2848    *  }
2849    * ]|
2850    */
2851   widget_signals[DRAG_DATA_RECEIVED] =
2852     g_signal_new (I_("drag-data-received"),
2853                   G_TYPE_FROM_CLASS (klass),
2854                   G_SIGNAL_RUN_LAST,
2855                   G_STRUCT_OFFSET (GtkWidgetClass, drag_data_received),
2856                   NULL, NULL,
2857                   _gtk_marshal_VOID__OBJECT_INT_INT_BOXED_UINT_UINT,
2858                   G_TYPE_NONE, 6,
2859                   GDK_TYPE_DRAG_CONTEXT,
2860                   G_TYPE_INT,
2861                   G_TYPE_INT,
2862                   GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
2863                   G_TYPE_UINT,
2864                   G_TYPE_UINT);
2865
2866   /**
2867    * GtkWidget::visibility-notify-event:
2868    * @widget: the object which received the signal
2869    * @event: (type Gdk.EventVisibility): the #GdkEventVisibility which
2870    *   triggered this signal.
2871    *
2872    * The ::visibility-notify-event will be emitted when the @widget's window
2873    * is obscured or unobscured.
2874    *
2875    * To receive this signal the #GdkWindow associated to the widget needs
2876    * to enable the #GDK_VISIBILITY_NOTIFY_MASK mask.
2877    *
2878    * Returns: %TRUE to stop other handlers from being invoked for the event.
2879    *   %FALSE to propagate the event further.
2880    */
2881   widget_signals[VISIBILITY_NOTIFY_EVENT] =
2882     g_signal_new (I_("visibility-notify-event"),
2883                   G_TYPE_FROM_CLASS (klass),
2884                   G_SIGNAL_RUN_LAST,
2885                   G_STRUCT_OFFSET (GtkWidgetClass, visibility_notify_event),
2886                   _gtk_boolean_handled_accumulator, NULL,
2887                   _gtk_marshal_BOOLEAN__BOXED,
2888                   G_TYPE_BOOLEAN, 1,
2889                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2890
2891   /**
2892    * GtkWidget::window-state-event:
2893    * @widget: the object which received the signal
2894    * @event: (type Gdk.EventWindowState): the #GdkEventWindowState which
2895    *   triggered this signal.
2896    *
2897    * The ::window-state-event will be emitted when the state of the
2898    * toplevel window associated to the @widget changes.
2899    *
2900    * To receive this signal the #GdkWindow associated to the widget
2901    * needs to enable the #GDK_STRUCTURE_MASK mask. GDK will enable
2902    * this mask automatically for all new windows.
2903    *
2904    * Returns: %TRUE to stop other handlers from being invoked for the
2905    *   event. %FALSE to propagate the event further.
2906    */
2907   widget_signals[WINDOW_STATE_EVENT] =
2908     g_signal_new (I_("window-state-event"),
2909                   G_TYPE_FROM_CLASS (klass),
2910                   G_SIGNAL_RUN_LAST,
2911                   G_STRUCT_OFFSET (GtkWidgetClass, window_state_event),
2912                   _gtk_boolean_handled_accumulator, NULL,
2913                   _gtk_marshal_BOOLEAN__BOXED,
2914                   G_TYPE_BOOLEAN, 1,
2915                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2916   g_signal_set_va_marshaller (widget_signals[WINDOW_STATE_EVENT], G_TYPE_FROM_CLASS (klass),
2917                               _gtk_marshal_BOOLEAN__BOXEDv);
2918
2919   /**
2920    * GtkWidget::damage-event:
2921    * @widget: the object which received the signal
2922    * @event: (type Gdk.EventExpose): the #GdkEventExpose event
2923    *
2924    * Emitted when a redirected window belonging to @widget gets drawn into.
2925    * The region/area members of the event shows what area of the redirected
2926    * drawable was drawn into.
2927    *
2928    * Returns: %TRUE to stop other handlers from being invoked for the event.
2929    *   %FALSE to propagate the event further.
2930    *
2931    * Since: 2.14
2932    */
2933   widget_signals[DAMAGE_EVENT] =
2934     g_signal_new (I_("damage-event"),
2935                   G_TYPE_FROM_CLASS (klass),
2936                   G_SIGNAL_RUN_LAST,
2937                   G_STRUCT_OFFSET (GtkWidgetClass, damage_event),
2938                   _gtk_boolean_handled_accumulator, NULL,
2939                   _gtk_marshal_BOOLEAN__BOXED,
2940                   G_TYPE_BOOLEAN, 1,
2941                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2942   g_signal_set_va_marshaller (widget_signals[DAMAGE_EVENT], G_TYPE_FROM_CLASS (klass),
2943                               _gtk_marshal_BOOLEAN__BOXEDv);
2944
2945 /**
2946    * GtkWidget::grab-broken-event:
2947    * @widget: the object which received the signal
2948    * @event: (type Gdk.EventGrabBroken): the #GdkEventGrabBroken event
2949    *
2950    * Emitted when a pointer or keyboard grab on a window belonging
2951    * to @widget gets broken.
2952    *
2953    * On X11, this happens when the grab window becomes unviewable
2954    * (i.e. it or one of its ancestors is unmapped), or if the same
2955    * application grabs the pointer or keyboard again.
2956    *
2957    * Returns: %TRUE to stop other handlers from being invoked for
2958    *   the event. %FALSE to propagate the event further.
2959    *
2960    * Since: 2.8
2961    */
2962   widget_signals[GRAB_BROKEN_EVENT] =
2963     g_signal_new (I_("grab-broken-event"),
2964                   G_TYPE_FROM_CLASS (klass),
2965                   G_SIGNAL_RUN_LAST,
2966                   G_STRUCT_OFFSET (GtkWidgetClass, grab_broken_event),
2967                   _gtk_boolean_handled_accumulator, NULL,
2968                   _gtk_marshal_BOOLEAN__BOXED,
2969                   G_TYPE_BOOLEAN, 1,
2970                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2971   g_signal_set_va_marshaller (widget_signals[GRAB_BROKEN_EVENT], G_TYPE_FROM_CLASS (klass),
2972                               _gtk_marshal_BOOLEAN__BOXEDv);
2973
2974   /**
2975    * GtkWidget::query-tooltip:
2976    * @widget: the object which received the signal
2977    * @x: the x coordinate of the cursor position where the request has
2978    *     been emitted, relative to @widget's left side
2979    * @y: the y coordinate of the cursor position where the request has
2980    *     been emitted, relative to @widget's top
2981    * @keyboard_mode: %TRUE if the tooltip was trigged using the keyboard
2982    * @tooltip: a #GtkTooltip
2983    *
2984    * Emitted when #GtkWidget:has-tooltip is %TRUE and the #GtkSettings:gtk-tooltip-timeout
2985    * has expired with the cursor hovering "above" @widget; or emitted when @widget got
2986    * focus in keyboard mode.
2987    *
2988    * Using the given coordinates, the signal handler should determine
2989    * whether a tooltip should be shown for @widget. If this is the case
2990    * %TRUE should be returned, %FALSE otherwise.  Note that if
2991    * @keyboard_mode is %TRUE, the values of @x and @y are undefined and
2992    * should not be used.
2993    *
2994    * The signal handler is free to manipulate @tooltip with the therefore
2995    * destined function calls.
2996    *
2997    * Returns: %TRUE if @tooltip should be shown right now, %FALSE otherwise.
2998    *
2999    * Since: 2.12
3000    */
3001   widget_signals[QUERY_TOOLTIP] =
3002     g_signal_new (I_("query-tooltip"),
3003                   G_TYPE_FROM_CLASS (klass),
3004                   G_SIGNAL_RUN_LAST,
3005                   G_STRUCT_OFFSET (GtkWidgetClass, query_tooltip),
3006                   _gtk_boolean_handled_accumulator, NULL,
3007                   _gtk_marshal_BOOLEAN__INT_INT_BOOLEAN_OBJECT,
3008                   G_TYPE_BOOLEAN, 4,
3009                   G_TYPE_INT,
3010                   G_TYPE_INT,
3011                   G_TYPE_BOOLEAN,
3012                   GTK_TYPE_TOOLTIP);
3013
3014   /**
3015    * GtkWidget::popup-menu:
3016    * @widget: the object which received the signal
3017    *
3018    * This signal gets emitted whenever a widget should pop up a context
3019    * menu. This usually happens through the standard key binding mechanism;
3020    * by pressing a certain key while a widget is focused, the user can cause
3021    * the widget to pop up a menu.  For example, the #GtkEntry widget creates
3022    * a menu with clipboard commands. See <xref linkend="checklist-popup-menu"/>
3023    * for an example of how to use this signal.
3024    *
3025    * Returns: %TRUE if a menu was activated
3026    */
3027   widget_signals[POPUP_MENU] =
3028     g_signal_new (I_("popup-menu"),
3029                   G_TYPE_FROM_CLASS (klass),
3030                   G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
3031                   G_STRUCT_OFFSET (GtkWidgetClass, popup_menu),
3032                   _gtk_boolean_handled_accumulator, NULL,
3033                   _gtk_marshal_BOOLEAN__VOID,
3034                   G_TYPE_BOOLEAN, 0);
3035
3036   /**
3037    * GtkWidget::show-help:
3038    * @widget: the object which received the signal.
3039    * @help_type:
3040    */
3041   widget_signals[SHOW_HELP] =
3042     g_signal_new (I_("show-help"),
3043                   G_TYPE_FROM_CLASS (klass),
3044                   G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
3045                   G_STRUCT_OFFSET (GtkWidgetClass, show_help),
3046                   _gtk_boolean_handled_accumulator, NULL,
3047                   _gtk_marshal_BOOLEAN__ENUM,
3048                   G_TYPE_BOOLEAN, 1,
3049                   GTK_TYPE_WIDGET_HELP_TYPE);
3050
3051   /**
3052    * GtkWidget::accel-closures-changed:
3053    * @widget: the object which received the signal.
3054    */
3055   widget_signals[ACCEL_CLOSURES_CHANGED] =
3056     g_signal_new (I_("accel-closures-changed"),
3057                   G_TYPE_FROM_CLASS (klass),
3058                   0,
3059                   0,
3060                   NULL, NULL,
3061                   _gtk_marshal_VOID__VOID,
3062                   G_TYPE_NONE, 0);
3063
3064   /**
3065    * GtkWidget::screen-changed:
3066    * @widget: the object on which the signal is emitted
3067    * @previous_screen: (allow-none): the previous screen, or %NULL if the
3068    *   widget was not associated with a screen before
3069    *
3070    * The ::screen-changed signal gets emitted when the
3071    * screen of a widget has changed.
3072    */
3073   widget_signals[SCREEN_CHANGED] =
3074     g_signal_new (I_("screen-changed"),
3075                   G_TYPE_FROM_CLASS (klass),
3076                   G_SIGNAL_RUN_LAST,
3077                   G_STRUCT_OFFSET (GtkWidgetClass, screen_changed),
3078                   NULL, NULL,
3079                   _gtk_marshal_VOID__OBJECT,
3080                   G_TYPE_NONE, 1,
3081                   GDK_TYPE_SCREEN);
3082
3083   /**
3084    * GtkWidget::can-activate-accel:
3085    * @widget: the object which received the signal
3086    * @signal_id: the ID of a signal installed on @widget
3087    *
3088    * Determines whether an accelerator that activates the signal
3089    * identified by @signal_id can currently be activated.
3090    * This signal is present to allow applications and derived
3091    * widgets to override the default #GtkWidget handling
3092    * for determining whether an accelerator can be activated.
3093    *
3094    * Returns: %TRUE if the signal can be activated.
3095    */
3096   widget_signals[CAN_ACTIVATE_ACCEL] =
3097      g_signal_new (I_("can-activate-accel"),
3098                   G_TYPE_FROM_CLASS (klass),
3099                   G_SIGNAL_RUN_LAST,
3100                   G_STRUCT_OFFSET (GtkWidgetClass, can_activate_accel),
3101                   _gtk_boolean_handled_accumulator, NULL,
3102                   _gtk_marshal_BOOLEAN__UINT,
3103                   G_TYPE_BOOLEAN, 1, G_TYPE_UINT);
3104
3105   binding_set = gtk_binding_set_by_class (klass);
3106   gtk_binding_entry_add_signal (binding_set, GDK_KEY_F10, GDK_SHIFT_MASK,
3107                                 "popup-menu", 0);
3108   gtk_binding_entry_add_signal (binding_set, GDK_KEY_Menu, 0,
3109                                 "popup-menu", 0);
3110
3111   gtk_binding_entry_add_signal (binding_set, GDK_KEY_F1, GDK_CONTROL_MASK,
3112                                 "show-help", 1,
3113                                 GTK_TYPE_WIDGET_HELP_TYPE,
3114                                 GTK_WIDGET_HELP_TOOLTIP);
3115   gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_F1, GDK_CONTROL_MASK,
3116                                 "show-help", 1,
3117                                 GTK_TYPE_WIDGET_HELP_TYPE,
3118                                 GTK_WIDGET_HELP_TOOLTIP);
3119   gtk_binding_entry_add_signal (binding_set, GDK_KEY_F1, GDK_SHIFT_MASK,
3120                                 "show-help", 1,
3121                                 GTK_TYPE_WIDGET_HELP_TYPE,
3122                                 GTK_WIDGET_HELP_WHATS_THIS);
3123   gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_F1, GDK_SHIFT_MASK,
3124                                 "show-help", 1,
3125                                 GTK_TYPE_WIDGET_HELP_TYPE,
3126                                 GTK_WIDGET_HELP_WHATS_THIS);
3127
3128   gtk_widget_class_install_style_property (klass,
3129                                            g_param_spec_boolean ("interior-focus",
3130                                                                  P_("Interior Focus"),
3131                                                                  P_("Whether to draw the focus indicator inside widgets"),
3132                                                                  TRUE,
3133                                                                  GTK_PARAM_READABLE));
3134
3135   gtk_widget_class_install_style_property (klass,
3136                                            g_param_spec_int ("focus-line-width",
3137                                                              P_("Focus linewidth"),
3138                                                              P_("Width, in pixels, of the focus indicator line"),
3139                                                              0, G_MAXINT, 1,
3140                                                              GTK_PARAM_READABLE));
3141
3142   gtk_widget_class_install_style_property (klass,
3143                                            g_param_spec_string ("focus-line-pattern",
3144                                                                 P_("Focus line dash pattern"),
3145                                                                 P_("Dash pattern used to draw the focus indicator"),
3146                                                                 "\1\1",
3147                                                                 GTK_PARAM_READABLE));
3148   gtk_widget_class_install_style_property (klass,
3149                                            g_param_spec_int ("focus-padding",
3150                                                              P_("Focus padding"),
3151                                                              P_("Width, in pixels, between focus indicator and the widget 'box'"),
3152                                                              0, G_MAXINT, 1,
3153                                                              GTK_PARAM_READABLE));
3154   gtk_widget_class_install_style_property (klass,
3155                                            g_param_spec_boxed ("cursor-color",
3156                                                                P_("Cursor color"),
3157                                                                P_("Color with which to draw insertion cursor"),
3158                                                                GDK_TYPE_COLOR,
3159                                                                GTK_PARAM_READABLE));
3160   gtk_widget_class_install_style_property (klass,
3161                                            g_param_spec_boxed ("secondary-cursor-color",
3162                                                                P_("Secondary cursor color"),
3163                                                                P_("Color with which to draw the secondary insertion cursor when editing mixed right-to-left and left-to-right text"),
3164                                                                GDK_TYPE_COLOR,
3165                                                                GTK_PARAM_READABLE));
3166   gtk_widget_class_install_style_property (klass,
3167                                            g_param_spec_float ("cursor-aspect-ratio",
3168                                                                P_("Cursor line aspect ratio"),
3169                                                                P_("Aspect ratio with which to draw insertion cursor"),
3170                                                                0.0, 1.0, 0.04,
3171                                                                GTK_PARAM_READABLE));
3172
3173   gtk_widget_class_install_style_property (klass,
3174                                            g_param_spec_boolean ("window-dragging",
3175                                                                  P_("Window dragging"),
3176                                                                  P_("Whether windows can be dragged by clicking on empty areas"),
3177                                                                  FALSE,
3178                                                                  GTK_PARAM_READABLE));
3179
3180   /**
3181    * GtkWidget:link-color:
3182    *
3183    * The "link-color" style property defines the color of unvisited links.
3184    *
3185    * Since: 2.10
3186    */
3187   gtk_widget_class_install_style_property (klass,
3188                                            g_param_spec_boxed ("link-color",
3189                                                                P_("Unvisited Link Color"),
3190                                                                P_("Color of unvisited links"),
3191                                                                GDK_TYPE_COLOR,
3192                                                                GTK_PARAM_READABLE));
3193
3194   /**
3195    * GtkWidget:visited-link-color:
3196    *
3197    * The "visited-link-color" style property defines the color of visited links.
3198    *
3199    * Since: 2.10
3200    */
3201   gtk_widget_class_install_style_property (klass,
3202                                            g_param_spec_boxed ("visited-link-color",
3203                                                                P_("Visited Link Color"),
3204                                                                P_("Color of visited links"),
3205                                                                GDK_TYPE_COLOR,
3206                                                                GTK_PARAM_READABLE));
3207
3208   /**
3209    * GtkWidget:wide-separators:
3210    *
3211    * The "wide-separators" style property defines whether separators have
3212    * configurable width and should be drawn using a box instead of a line.
3213    *
3214    * Since: 2.10
3215    */
3216   gtk_widget_class_install_style_property (klass,
3217                                            g_param_spec_boolean ("wide-separators",
3218                                                                  P_("Wide Separators"),
3219                                                                  P_("Whether separators have configurable width and should be drawn using a box instead of a line"),
3220                                                                  FALSE,
3221                                                                  GTK_PARAM_READABLE));
3222
3223   /**
3224    * GtkWidget:separator-width:
3225    *
3226    * The "separator-width" style property defines the width of separators.
3227    * This property only takes effect if #GtkWidget:wide-separators is %TRUE.
3228    *
3229    * Since: 2.10
3230    */
3231   gtk_widget_class_install_style_property (klass,
3232                                            g_param_spec_int ("separator-width",
3233                                                              P_("Separator Width"),
3234                                                              P_("The width of separators if wide-separators is TRUE"),
3235                                                              0, G_MAXINT, 0,
3236                                                              GTK_PARAM_READABLE));
3237
3238   /**
3239    * GtkWidget:separator-height:
3240    *
3241    * The "separator-height" style property defines the height of separators.
3242    * This property only takes effect if #GtkWidget:wide-separators is %TRUE.
3243    *
3244    * Since: 2.10
3245    */
3246   gtk_widget_class_install_style_property (klass,
3247                                            g_param_spec_int ("separator-height",
3248                                                              P_("Separator Height"),
3249                                                              P_("The height of separators if \"wide-separators\" is TRUE"),
3250                                                              0, G_MAXINT, 0,
3251                                                              GTK_PARAM_READABLE));
3252
3253   /**
3254    * GtkWidget:scroll-arrow-hlength:
3255    *
3256    * The "scroll-arrow-hlength" style property defines the length of
3257    * horizontal scroll arrows.
3258    *
3259    * Since: 2.10
3260    */
3261   gtk_widget_class_install_style_property (klass,
3262                                            g_param_spec_int ("scroll-arrow-hlength",
3263                                                              P_("Horizontal Scroll Arrow Length"),
3264                                                              P_("The length of horizontal scroll arrows"),
3265                                                              1, G_MAXINT, 16,
3266                                                              GTK_PARAM_READABLE));
3267
3268   /**
3269    * GtkWidget:scroll-arrow-vlength:
3270    *
3271    * The "scroll-arrow-vlength" style property defines the length of
3272    * vertical scroll arrows.
3273    *
3274    * Since: 2.10
3275    */
3276   gtk_widget_class_install_style_property (klass,
3277                                            g_param_spec_int ("scroll-arrow-vlength",
3278                                                              P_("Vertical Scroll Arrow Length"),
3279                                                              P_("The length of vertical scroll arrows"),
3280                                                              1, G_MAXINT, 16,
3281                                                              GTK_PARAM_READABLE));
3282
3283   g_type_class_add_private (klass, sizeof (GtkWidgetPrivate));
3284
3285   gtk_widget_class_set_accessible_type (klass, GTK_TYPE_WIDGET_ACCESSIBLE);
3286 }
3287
3288 static void
3289 gtk_widget_base_class_finalize (GtkWidgetClass *klass)
3290 {
3291   GList *list, *node;
3292
3293   list = g_param_spec_pool_list_owned (style_property_spec_pool, G_OBJECT_CLASS_TYPE (klass));
3294   for (node = list; node; node = node->next)
3295     {
3296       GParamSpec *pspec = node->data;
3297
3298       g_param_spec_pool_remove (style_property_spec_pool, pspec);
3299       g_param_spec_unref (pspec);
3300     }
3301   g_list_free (list);
3302 }
3303
3304 static void
3305 gtk_widget_set_property (GObject         *object,
3306                          guint            prop_id,
3307                          const GValue    *value,
3308                          GParamSpec      *pspec)
3309 {
3310   GtkWidget *widget = GTK_WIDGET (object);
3311
3312   switch (prop_id)
3313     {
3314       gboolean tmp;
3315       gchar *tooltip_markup;
3316       const gchar *tooltip_text;
3317       GtkWindow *tooltip_window;
3318
3319     case PROP_NAME:
3320       gtk_widget_set_name (widget, g_value_get_string (value));
3321       break;
3322     case PROP_PARENT:
3323       gtk_container_add (GTK_CONTAINER (g_value_get_object (value)), widget);
3324       break;
3325     case PROP_WIDTH_REQUEST:
3326       gtk_widget_set_usize_internal (widget, g_value_get_int (value), -2, 0);
3327       break;
3328     case PROP_HEIGHT_REQUEST:
3329       gtk_widget_set_usize_internal (widget, -2, g_value_get_int (value), 0);
3330       break;
3331     case PROP_VISIBLE:
3332       gtk_widget_set_visible (widget, g_value_get_boolean (value));
3333       break;
3334     case PROP_SENSITIVE:
3335       gtk_widget_set_sensitive (widget, g_value_get_boolean (value));
3336       break;
3337     case PROP_APP_PAINTABLE:
3338       gtk_widget_set_app_paintable (widget, g_value_get_boolean (value));
3339       break;
3340     case PROP_CAN_FOCUS:
3341       gtk_widget_set_can_focus (widget, g_value_get_boolean (value));
3342       break;
3343     case PROP_HAS_FOCUS:
3344       if (g_value_get_boolean (value))
3345         gtk_widget_grab_focus (widget);
3346       break;
3347     case PROP_IS_FOCUS:
3348       if (g_value_get_boolean (value))
3349         gtk_widget_grab_focus (widget);
3350       break;
3351     case PROP_CAN_DEFAULT:
3352       gtk_widget_set_can_default (widget, g_value_get_boolean (value));
3353       break;
3354     case PROP_HAS_DEFAULT:
3355       if (g_value_get_boolean (value))
3356         gtk_widget_grab_default (widget);
3357       break;
3358     case PROP_RECEIVES_DEFAULT:
3359       gtk_widget_set_receives_default (widget, g_value_get_boolean (value));
3360       break;
3361     case PROP_STYLE:
3362       gtk_widget_set_style (widget, g_value_get_object (value));
3363       break;
3364     case PROP_EVENTS:
3365       if (!gtk_widget_get_realized (widget) && gtk_widget_get_has_window (widget))
3366         gtk_widget_set_events (widget, g_value_get_flags (value));
3367       break;
3368     case PROP_NO_SHOW_ALL:
3369       gtk_widget_set_no_show_all (widget, g_value_get_boolean (value));
3370       break;
3371     case PROP_HAS_TOOLTIP:
3372       gtk_widget_real_set_has_tooltip (widget,
3373                                        g_value_get_boolean (value), FALSE);
3374       break;
3375     case PROP_TOOLTIP_MARKUP:
3376       tooltip_window = g_object_get_qdata (object, quark_tooltip_window);
3377       tooltip_markup = g_value_dup_string (value);
3378
3379       /* Treat an empty string as a NULL string,
3380        * because an empty string would be useless for a tooltip:
3381        */
3382       if (tooltip_markup && (strlen (tooltip_markup) == 0))
3383         {
3384           g_free (tooltip_markup);
3385           tooltip_markup = NULL;
3386         }
3387
3388       g_object_set_qdata_full (object, quark_tooltip_markup,
3389                                tooltip_markup, g_free);
3390
3391       tmp = (tooltip_window != NULL || tooltip_markup != NULL);
3392       gtk_widget_real_set_has_tooltip (widget, tmp, FALSE);
3393       if (gtk_widget_get_visible (widget))
3394         gtk_widget_queue_tooltip_query (widget);
3395       break;
3396     case PROP_TOOLTIP_TEXT:
3397       tooltip_window = g_object_get_qdata (object, quark_tooltip_window);
3398
3399       tooltip_text = g_value_get_string (value);
3400
3401       /* Treat an empty string as a NULL string,
3402        * because an empty string would be useless for a tooltip:
3403        */
3404       if (tooltip_text && (strlen (tooltip_text) == 0))
3405         tooltip_text = NULL;
3406
3407       tooltip_markup = tooltip_text ? g_markup_escape_text (tooltip_text, -1) : NULL;
3408
3409       g_object_set_qdata_full (object, quark_tooltip_markup,
3410                                tooltip_markup, g_free);
3411
3412       tmp = (tooltip_window != NULL || tooltip_markup != NULL);
3413       gtk_widget_real_set_has_tooltip (widget, tmp, FALSE);
3414       if (gtk_widget_get_visible (widget))
3415         gtk_widget_queue_tooltip_query (widget);
3416       break;
3417     case PROP_DOUBLE_BUFFERED:
3418       gtk_widget_set_double_buffered (widget, g_value_get_boolean (value));
3419       break;
3420     case PROP_HALIGN:
3421       gtk_widget_set_halign (widget, g_value_get_enum (value));
3422       break;
3423     case PROP_VALIGN:
3424       gtk_widget_set_valign (widget, g_value_get_enum (value));
3425       break;
3426     case PROP_MARGIN_LEFT:
3427       gtk_widget_set_margin_left (widget, g_value_get_int (value));
3428       break;
3429     case PROP_MARGIN_RIGHT:
3430       gtk_widget_set_margin_right (widget, g_value_get_int (value));
3431       break;
3432     case PROP_MARGIN_TOP:
3433       gtk_widget_set_margin_top (widget, g_value_get_int (value));
3434       break;
3435     case PROP_MARGIN_BOTTOM:
3436       gtk_widget_set_margin_bottom (widget, g_value_get_int (value));
3437       break;
3438     case PROP_MARGIN:
3439       g_object_freeze_notify (G_OBJECT (widget));
3440       gtk_widget_set_margin_left (widget, g_value_get_int (value));
3441       gtk_widget_set_margin_right (widget, g_value_get_int (value));
3442       gtk_widget_set_margin_top (widget, g_value_get_int (value));
3443       gtk_widget_set_margin_bottom (widget, g_value_get_int (value));
3444       g_object_thaw_notify (G_OBJECT (widget));
3445       break;
3446     case PROP_HEXPAND:
3447       gtk_widget_set_hexpand (widget, g_value_get_boolean (value));
3448       break;
3449     case PROP_HEXPAND_SET:
3450       gtk_widget_set_hexpand_set (widget, g_value_get_boolean (value));
3451       break;
3452     case PROP_VEXPAND:
3453       gtk_widget_set_vexpand (widget, g_value_get_boolean (value));
3454       break;
3455     case PROP_VEXPAND_SET:
3456       gtk_widget_set_vexpand_set (widget, g_value_get_boolean (value));
3457       break;
3458     case PROP_EXPAND:
3459       g_object_freeze_notify (G_OBJECT (widget));
3460       gtk_widget_set_hexpand (widget, g_value_get_boolean (value));
3461       gtk_widget_set_vexpand (widget, g_value_get_boolean (value));
3462       g_object_thaw_notify (G_OBJECT (widget));
3463       break;
3464     default:
3465       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
3466       break;
3467     }
3468 }
3469
3470 static void
3471 gtk_widget_get_property (GObject         *object,
3472                          guint            prop_id,
3473                          GValue          *value,
3474                          GParamSpec      *pspec)
3475 {
3476   GtkWidget *widget = GTK_WIDGET (object);
3477   GtkWidgetPrivate *priv = widget->priv;
3478
3479   switch (prop_id)
3480     {
3481       gpointer *eventp;
3482
3483     case PROP_NAME:
3484       if (priv->name)
3485         g_value_set_string (value, priv->name);
3486       else
3487         g_value_set_static_string (value, "");
3488       break;
3489     case PROP_PARENT:
3490       g_value_set_object (value, priv->parent);
3491       break;
3492     case PROP_WIDTH_REQUEST:
3493       {
3494         int w;
3495         gtk_widget_get_size_request (widget, &w, NULL);
3496         g_value_set_int (value, w);
3497       }
3498       break;
3499     case PROP_HEIGHT_REQUEST:
3500       {
3501         int h;
3502         gtk_widget_get_size_request (widget, NULL, &h);
3503         g_value_set_int (value, h);
3504       }
3505       break;
3506     case PROP_VISIBLE:
3507       g_value_set_boolean (value, (gtk_widget_get_visible (widget) != FALSE));
3508       break;
3509     case PROP_SENSITIVE:
3510       g_value_set_boolean (value, (gtk_widget_get_sensitive (widget) != FALSE));
3511       break;
3512     case PROP_APP_PAINTABLE:
3513       g_value_set_boolean (value, (gtk_widget_get_app_paintable (widget) != FALSE));
3514       break;
3515     case PROP_CAN_FOCUS:
3516       g_value_set_boolean (value, (gtk_widget_get_can_focus (widget) != FALSE));
3517       break;
3518     case PROP_HAS_FOCUS:
3519       g_value_set_boolean (value, (gtk_widget_has_focus (widget) != FALSE));
3520       break;
3521     case PROP_IS_FOCUS:
3522       g_value_set_boolean (value, (gtk_widget_is_focus (widget)));
3523       break;
3524     case PROP_CAN_DEFAULT:
3525       g_value_set_boolean (value, (gtk_widget_get_can_default (widget) != FALSE));
3526       break;
3527     case PROP_HAS_DEFAULT:
3528       g_value_set_boolean (value, (gtk_widget_has_default (widget) != FALSE));
3529       break;
3530     case PROP_RECEIVES_DEFAULT:
3531       g_value_set_boolean (value, (gtk_widget_get_receives_default (widget) != FALSE));
3532       break;
3533     case PROP_COMPOSITE_CHILD:
3534       g_value_set_boolean (value, widget->priv->composite_child);
3535       break;
3536     case PROP_STYLE:
3537       g_value_set_object (value, gtk_widget_get_style (widget));
3538       break;
3539     case PROP_EVENTS:
3540       eventp = g_object_get_qdata (G_OBJECT (widget), quark_event_mask);
3541       g_value_set_flags (value, GPOINTER_TO_INT (eventp));
3542       break;
3543     case PROP_NO_SHOW_ALL:
3544       g_value_set_boolean (value, gtk_widget_get_no_show_all (widget));
3545       break;
3546     case PROP_HAS_TOOLTIP:
3547       g_value_set_boolean (value, GPOINTER_TO_UINT (g_object_get_qdata (object, quark_has_tooltip)));
3548       break;
3549     case PROP_TOOLTIP_TEXT:
3550       {
3551         gchar *escaped = g_object_get_qdata (object, quark_tooltip_markup);
3552         gchar *text = NULL;
3553
3554         if (escaped && !pango_parse_markup (escaped, -1, 0, NULL, &text, NULL, NULL))
3555           g_assert (NULL == text); /* text should still be NULL in case of markup errors */
3556
3557         g_value_take_string (value, text);
3558       }
3559       break;
3560     case PROP_TOOLTIP_MARKUP:
3561       g_value_set_string (value, g_object_get_qdata (object, quark_tooltip_markup));
3562       break;
3563     case PROP_WINDOW:
3564       g_value_set_object (value, gtk_widget_get_window (widget));
3565       break;
3566     case PROP_DOUBLE_BUFFERED:
3567       g_value_set_boolean (value, gtk_widget_get_double_buffered (widget));
3568       break;
3569     case PROP_HALIGN:
3570       g_value_set_enum (value, gtk_widget_get_halign (widget));
3571       break;
3572     case PROP_VALIGN:
3573       g_value_set_enum (value, gtk_widget_get_valign (widget));
3574       break;
3575     case PROP_MARGIN_LEFT:
3576       g_value_set_int (value, gtk_widget_get_margin_left (widget));
3577       break;
3578     case PROP_MARGIN_RIGHT:
3579       g_value_set_int (value, gtk_widget_get_margin_right (widget));
3580       break;
3581     case PROP_MARGIN_TOP:
3582       g_value_set_int (value, gtk_widget_get_margin_top (widget));
3583       break;
3584     case PROP_MARGIN_BOTTOM:
3585       g_value_set_int (value, gtk_widget_get_margin_bottom (widget));
3586       break;
3587     case PROP_MARGIN:
3588       {
3589         GtkWidgetAuxInfo *aux_info = gtk_widget_get_aux_info (widget, FALSE);
3590         if (aux_info == NULL)
3591           {
3592             g_value_set_int (value, 0);
3593           }
3594         else
3595           {
3596             g_value_set_int (value, MAX (MAX (aux_info->margin.left,
3597                                               aux_info->margin.right),
3598                                          MAX (aux_info->margin.top,
3599                                               aux_info->margin.bottom)));
3600           }
3601       }
3602       break;
3603     case PROP_HEXPAND:
3604       g_value_set_boolean (value, gtk_widget_get_hexpand (widget));
3605       break;
3606     case PROP_HEXPAND_SET:
3607       g_value_set_boolean (value, gtk_widget_get_hexpand_set (widget));
3608       break;
3609     case PROP_VEXPAND:
3610       g_value_set_boolean (value, gtk_widget_get_vexpand (widget));
3611       break;
3612     case PROP_VEXPAND_SET:
3613       g_value_set_boolean (value, gtk_widget_get_vexpand_set (widget));
3614       break;
3615     case PROP_EXPAND:
3616       g_value_set_boolean (value,
3617                            gtk_widget_get_hexpand (widget) &&
3618                            gtk_widget_get_vexpand (widget));
3619       break;
3620     default:
3621       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
3622       break;
3623     }
3624 }
3625
3626 static void
3627 gtk_widget_init (GtkWidget *widget)
3628 {
3629   GtkWidgetPrivate *priv;
3630
3631   widget->priv = G_TYPE_INSTANCE_GET_PRIVATE (widget,
3632                                               GTK_TYPE_WIDGET,
3633                                               GtkWidgetPrivate);
3634   priv = widget->priv;
3635
3636   priv->child_visible = TRUE;
3637   priv->name = NULL;
3638   priv->allocation.x = -1;
3639   priv->allocation.y = -1;
3640   priv->allocation.width = 1;
3641   priv->allocation.height = 1;
3642   priv->window = NULL;
3643   priv->parent = NULL;
3644
3645   priv->sensitive = TRUE;
3646   priv->composite_child = composite_child_stack != 0;
3647   priv->double_buffered = TRUE;
3648   priv->redraw_on_alloc = TRUE;
3649   priv->width_request_needed = TRUE;
3650   priv->height_request_needed = TRUE;
3651   priv->alloc_needed = TRUE;
3652
3653   /* this will be set to TRUE if the widget gets a child or if the
3654    * expand flag is set on the widget, but until one of those happen
3655    * we know the expand is already properly FALSE.
3656    *
3657    * We really want to default FALSE here to avoid computing expand
3658    * all over the place while initially building a widget tree.
3659    */
3660   priv->need_compute_expand = FALSE;
3661
3662   priv->style = gtk_widget_get_default_style ();
3663   g_object_ref (priv->style);
3664 }
3665
3666
3667 static void
3668 gtk_widget_dispatch_child_properties_changed (GtkWidget   *widget,
3669                                               guint        n_pspecs,
3670                                               GParamSpec **pspecs)
3671 {
3672   GtkWidgetPrivate *priv = widget->priv;
3673   GtkWidget *container = priv->parent;
3674   guint i;
3675
3676   for (i = 0; widget->priv->parent == container && i < n_pspecs; i++)
3677     g_signal_emit (widget, widget_signals[CHILD_NOTIFY], g_quark_from_string (pspecs[i]->name), pspecs[i]);
3678 }
3679
3680 /**
3681  * gtk_widget_freeze_child_notify:
3682  * @widget: a #GtkWidget
3683  *
3684  * Stops emission of #GtkWidget::child-notify signals on @widget. The
3685  * signals are queued until gtk_widget_thaw_child_notify() is called
3686  * on @widget.
3687  *
3688  * This is the analogue of g_object_freeze_notify() for child properties.
3689  **/
3690 void
3691 gtk_widget_freeze_child_notify (GtkWidget *widget)
3692 {
3693   g_return_if_fail (GTK_IS_WIDGET (widget));
3694
3695   if (!G_OBJECT (widget)->ref_count)
3696     return;
3697
3698   g_object_ref (widget);
3699   g_object_notify_queue_freeze (G_OBJECT (widget), _gtk_widget_child_property_notify_context);
3700   g_object_unref (widget);
3701 }
3702
3703 /**
3704  * gtk_widget_child_notify:
3705  * @widget: a #GtkWidget
3706  * @child_property: the name of a child property installed on the
3707  *                  class of @widget<!-- -->'s parent
3708  *
3709  * Emits a #GtkWidget::child-notify signal for the
3710  * <link linkend="child-properties">child property</link> @child_property
3711  * on @widget.
3712  *
3713  * This is the analogue of g_object_notify() for child properties.
3714  *
3715  * Also see gtk_container_child_notify().
3716  */
3717 void
3718 gtk_widget_child_notify (GtkWidget    *widget,
3719                          const gchar  *child_property)
3720 {
3721   if (widget->priv->parent == NULL)
3722     return;
3723
3724   gtk_container_child_notify (GTK_CONTAINER (widget->priv->parent), widget, child_property);
3725 }
3726
3727 /**
3728  * gtk_widget_thaw_child_notify:
3729  * @widget: a #GtkWidget
3730  *
3731  * Reverts the effect of a previous call to gtk_widget_freeze_child_notify().
3732  * This causes all queued #GtkWidget::child-notify signals on @widget to be
3733  * emitted.
3734  */
3735 void
3736 gtk_widget_thaw_child_notify (GtkWidget *widget)
3737 {
3738   GObjectNotifyQueue *nqueue;
3739
3740   g_return_if_fail (GTK_IS_WIDGET (widget));
3741
3742   if (!G_OBJECT (widget)->ref_count)
3743     return;
3744
3745   g_object_ref (widget);
3746   nqueue = g_object_notify_queue_from_object (G_OBJECT (widget), _gtk_widget_child_property_notify_context);
3747   if (!nqueue || !nqueue->freeze_count)
3748     g_warning (G_STRLOC ": child-property-changed notification for %s(%p) is not frozen",
3749                G_OBJECT_TYPE_NAME (widget), widget);
3750   else
3751     g_object_notify_queue_thaw (G_OBJECT (widget), nqueue);
3752   g_object_unref (widget);
3753 }
3754
3755
3756 /**
3757  * gtk_widget_new:
3758  * @type: type ID of the widget to create
3759  * @first_property_name: name of first property to set
3760  * @...: value of first property, followed by more properties,
3761  *     %NULL-terminated
3762  *
3763  * This is a convenience function for creating a widget and setting
3764  * its properties in one go. For example you might write:
3765  * <literal>gtk_widget_new (GTK_TYPE_LABEL, "label", "Hello World", "xalign",
3766  * 0.0, NULL)</literal> to create a left-aligned label. Equivalent to
3767  * g_object_new(), but returns a widget so you don't have to
3768  * cast the object yourself.
3769  *
3770  * Return value: a new #GtkWidget of type @widget_type
3771  **/
3772 GtkWidget*
3773 gtk_widget_new (GType        type,
3774                 const gchar *first_property_name,
3775                 ...)
3776 {
3777   GtkWidget *widget;
3778   va_list var_args;
3779
3780   g_return_val_if_fail (g_type_is_a (type, GTK_TYPE_WIDGET), NULL);
3781
3782   va_start (var_args, first_property_name);
3783   widget = (GtkWidget *)g_object_new_valist (type, first_property_name, var_args);
3784   va_end (var_args);
3785
3786   return widget;
3787 }
3788
3789 static inline void
3790 gtk_widget_queue_draw_child (GtkWidget *widget)
3791 {
3792   GtkWidgetPrivate *priv = widget->priv;
3793   GtkWidget *parent;
3794
3795   parent = priv->parent;
3796   if (parent && gtk_widget_is_drawable (parent))
3797     gtk_widget_queue_draw_area (parent,
3798                                 priv->allocation.x,
3799                                 priv->allocation.y,
3800                                 priv->allocation.width,
3801                                 priv->allocation.height);
3802 }
3803
3804 /**
3805  * gtk_widget_unparent:
3806  * @widget: a #GtkWidget
3807  *
3808  * This function is only for use in widget implementations.
3809  * Should be called by implementations of the remove method
3810  * on #GtkContainer, to dissociate a child from the container.
3811  **/
3812 void
3813 gtk_widget_unparent (GtkWidget *widget)
3814 {
3815   GtkWidgetPrivate *priv;
3816   GObjectNotifyQueue *nqueue;
3817   GtkWidget *toplevel;
3818   GtkWidget *old_parent;
3819
3820   g_return_if_fail (GTK_IS_WIDGET (widget));
3821
3822   priv = widget->priv;
3823
3824   if (priv->parent == NULL)
3825     return;
3826
3827   /* keep this function in sync with gtk_menu_detach() */
3828
3829   gtk_widget_push_verify_invariants (widget);
3830
3831   g_object_freeze_notify (G_OBJECT (widget));
3832   nqueue = g_object_notify_queue_freeze (G_OBJECT (widget), _gtk_widget_child_property_notify_context);
3833
3834   toplevel = gtk_widget_get_toplevel (widget);
3835   if (gtk_widget_is_toplevel (toplevel))
3836     _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
3837
3838   if (gtk_container_get_focus_child (GTK_CONTAINER (priv->parent)) == widget)
3839     gtk_container_set_focus_child (GTK_CONTAINER (priv->parent), NULL);
3840
3841   gtk_widget_queue_draw_child (widget);
3842
3843   /* Reset the width and height here, to force reallocation if we
3844    * get added back to a new parent. This won't work if our new
3845    * allocation is smaller than 1x1 and we actually want a size of 1x1...
3846    * (would 0x0 be OK here?)
3847    */
3848   priv->allocation.width = 1;
3849   priv->allocation.height = 1;
3850
3851   if (gtk_widget_get_realized (widget))
3852     {
3853       if (priv->in_reparent)
3854         gtk_widget_unmap (widget);
3855       else
3856         gtk_widget_unrealize (widget);
3857     }
3858
3859   /* If we are unanchoring the child, we save around the toplevel
3860    * to emit hierarchy changed
3861    */
3862   if (priv->parent->priv->anchored)
3863     g_object_ref (toplevel);
3864   else
3865     toplevel = NULL;
3866
3867   /* Removing a widget from a container restores the child visible
3868    * flag to the default state, so it doesn't affect the child
3869    * in the next parent.
3870    */
3871   priv->child_visible = TRUE;
3872
3873   old_parent = priv->parent;
3874   priv->parent = NULL;
3875
3876   /* parent may no longer expand if the removed
3877    * child was expand=TRUE and could therefore
3878    * be forcing it to.
3879    */
3880   if (gtk_widget_get_visible (widget) &&
3881       (priv->need_compute_expand ||
3882        priv->computed_hexpand ||
3883        priv->computed_vexpand))
3884     {
3885       gtk_widget_queue_compute_expand (old_parent);
3886     }
3887
3888   /* Unset BACKDROP since we are no longer inside a toplevel window */
3889   gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_BACKDROP);
3890   if (priv->context)
3891     gtk_style_context_set_parent (priv->context, NULL);
3892
3893   g_signal_emit (widget, widget_signals[PARENT_SET], 0, old_parent);
3894   if (toplevel)
3895     {
3896       _gtk_widget_propagate_hierarchy_changed (widget, toplevel);
3897       g_object_unref (toplevel);
3898     }
3899
3900   /* Now that the parent pointer is nullified and the hierarchy-changed
3901    * already passed, go ahead and unset the parent window, if we are unparenting
3902    * an embeded GtkWindow the window will become toplevel again and hierarchy-changed
3903    * will fire again for the new subhierarchy.
3904    */
3905   gtk_widget_set_parent_window (widget, NULL);
3906
3907   g_object_notify (G_OBJECT (widget), "parent");
3908   g_object_thaw_notify (G_OBJECT (widget));
3909   if (!priv->parent)
3910     g_object_notify_queue_clear (G_OBJECT (widget), nqueue);
3911   g_object_notify_queue_thaw (G_OBJECT (widget), nqueue);
3912
3913   gtk_widget_pop_verify_invariants (widget);
3914   g_object_unref (widget);
3915 }
3916
3917 /**
3918  * gtk_widget_destroy:
3919  * @widget: a #GtkWidget
3920  *
3921  * Destroys a widget.
3922  *
3923  * When a widget is
3924  * destroyed, it will break any references it holds to other objects.
3925  * If the widget is inside a container, the widget will be removed
3926  * from the container. If the widget is a toplevel (derived from
3927  * #GtkWindow), it will be removed from the list of toplevels, and the
3928  * reference GTK+ holds to it will be removed. Removing a
3929  * widget from its container or the list of toplevels results in the
3930  * widget being finalized, unless you've added additional references
3931  * to the widget with g_object_ref().
3932  *
3933  * In most cases, only toplevel widgets (windows) require explicit
3934  * destruction, because when you destroy a toplevel its children will
3935  * be destroyed as well.
3936  **/
3937 void
3938 gtk_widget_destroy (GtkWidget *widget)
3939 {
3940   g_return_if_fail (GTK_IS_WIDGET (widget));
3941
3942   if (!widget->priv->in_destruction)
3943     g_object_run_dispose (G_OBJECT (widget));
3944 }
3945
3946 /**
3947  * gtk_widget_destroyed:
3948  * @widget: a #GtkWidget
3949  * @widget_pointer: (inout) (transfer none): address of a variable that contains @widget
3950  *
3951  * This function sets *@widget_pointer to %NULL if @widget_pointer !=
3952  * %NULL.  It's intended to be used as a callback connected to the
3953  * "destroy" signal of a widget. You connect gtk_widget_destroyed()
3954  * as a signal handler, and pass the address of your widget variable
3955  * as user data. Then when the widget is destroyed, the variable will
3956  * be set to %NULL. Useful for example to avoid multiple copies
3957  * of the same dialog.
3958  **/
3959 void
3960 gtk_widget_destroyed (GtkWidget      *widget,
3961                       GtkWidget      **widget_pointer)
3962 {
3963   /* Don't make any assumptions about the
3964    *  value of widget!
3965    *  Even check widget_pointer.
3966    */
3967   if (widget_pointer)
3968     *widget_pointer = NULL;
3969 }
3970
3971 /**
3972  * gtk_widget_show:
3973  * @widget: a #GtkWidget
3974  *
3975  * Flags a widget to be displayed. Any widget that isn't shown will
3976  * not appear on the screen. If you want to show all the widgets in a
3977  * container, it's easier to call gtk_widget_show_all() on the
3978  * container, instead of individually showing the widgets.
3979  *
3980  * Remember that you have to show the containers containing a widget,
3981  * in addition to the widget itself, before it will appear onscreen.
3982  *
3983  * When a toplevel container is shown, it is immediately realized and
3984  * mapped; other shown widgets are realized and mapped when their
3985  * toplevel container is realized and mapped.
3986  **/
3987 void
3988 gtk_widget_show (GtkWidget *widget)
3989 {
3990   g_return_if_fail (GTK_IS_WIDGET (widget));
3991
3992   if (!gtk_widget_get_visible (widget))
3993     {
3994       g_object_ref (widget);
3995       gtk_widget_push_verify_invariants (widget);
3996
3997       if (!gtk_widget_is_toplevel (widget))
3998         gtk_widget_queue_resize (widget);
3999
4000       /* see comment in set_parent() for why this should and can be
4001        * conditional
4002        */
4003       if (widget->priv->need_compute_expand ||
4004           widget->priv->computed_hexpand ||
4005           widget->priv->computed_vexpand)
4006         {
4007           if (widget->priv->parent != NULL)
4008             gtk_widget_queue_compute_expand (widget->priv->parent);
4009         }
4010
4011       g_signal_emit (widget, widget_signals[SHOW], 0);
4012       g_object_notify (G_OBJECT (widget), "visible");
4013
4014       gtk_widget_pop_verify_invariants (widget);
4015       g_object_unref (widget);
4016     }
4017 }
4018
4019 static void
4020 gtk_widget_real_show (GtkWidget *widget)
4021 {
4022   GtkWidgetPrivate *priv = widget->priv;
4023
4024   if (!gtk_widget_get_visible (widget))
4025     {
4026       priv->visible = TRUE;
4027
4028       if (priv->parent &&
4029           gtk_widget_get_mapped (priv->parent) &&
4030           gtk_widget_get_child_visible (widget) &&
4031           !gtk_widget_get_mapped (widget))
4032         gtk_widget_map (widget);
4033     }
4034 }
4035
4036 static void
4037 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
4038 {
4039   *flag = TRUE;
4040   g_signal_handlers_disconnect_by_func (widget,
4041                                         gtk_widget_show_map_callback,
4042                                         flag);
4043 }
4044
4045 /**
4046  * gtk_widget_show_now:
4047  * @widget: a #GtkWidget
4048  *
4049  * Shows a widget. If the widget is an unmapped toplevel widget
4050  * (i.e. a #GtkWindow that has not yet been shown), enter the main
4051  * loop and wait for the window to actually be mapped. Be careful;
4052  * because the main loop is running, anything can happen during
4053  * this function.
4054  **/
4055 void
4056 gtk_widget_show_now (GtkWidget *widget)
4057 {
4058   gint flag = FALSE;
4059
4060   g_return_if_fail (GTK_IS_WIDGET (widget));
4061
4062   /* make sure we will get event */
4063   if (!gtk_widget_get_mapped (widget) &&
4064       gtk_widget_is_toplevel (widget))
4065     {
4066       gtk_widget_show (widget);
4067
4068       g_signal_connect (widget, "map-event",
4069                         G_CALLBACK (gtk_widget_show_map_callback),
4070                         &flag);
4071
4072       while (!flag)
4073         gtk_main_iteration ();
4074     }
4075   else
4076     gtk_widget_show (widget);
4077 }
4078
4079 /**
4080  * gtk_widget_hide:
4081  * @widget: a #GtkWidget
4082  *
4083  * Reverses the effects of gtk_widget_show(), causing the widget to be
4084  * hidden (invisible to the user).
4085  **/
4086 void
4087 gtk_widget_hide (GtkWidget *widget)
4088 {
4089   g_return_if_fail (GTK_IS_WIDGET (widget));
4090
4091   if (gtk_widget_get_visible (widget))
4092     {
4093       GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
4094
4095       g_object_ref (widget);
4096       gtk_widget_push_verify_invariants (widget);
4097
4098       if (toplevel != widget && gtk_widget_is_toplevel (toplevel))
4099         _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
4100
4101       /* a parent may now be expand=FALSE since we're hidden. */
4102       if (widget->priv->need_compute_expand ||
4103           widget->priv->computed_hexpand ||
4104           widget->priv->computed_vexpand)
4105         {
4106           gtk_widget_queue_compute_expand (widget);
4107         }
4108
4109       g_signal_emit (widget, widget_signals[HIDE], 0);
4110       if (!gtk_widget_is_toplevel (widget))
4111         gtk_widget_queue_resize (widget);
4112       g_object_notify (G_OBJECT (widget), "visible");
4113
4114       gtk_widget_pop_verify_invariants (widget);
4115       g_object_unref (widget);
4116     }
4117 }
4118
4119 static void
4120 gtk_widget_real_hide (GtkWidget *widget)
4121 {
4122   if (gtk_widget_get_visible (widget))
4123     {
4124       widget->priv->visible = FALSE;
4125
4126       if (gtk_widget_get_mapped (widget))
4127         gtk_widget_unmap (widget);
4128
4129       if (widget->priv->context)
4130         _gtk_style_context_stop_animations (widget->priv->context);
4131     }
4132 }
4133
4134 /**
4135  * gtk_widget_hide_on_delete:
4136  * @widget: a #GtkWidget
4137  *
4138  * Utility function; intended to be connected to the #GtkWidget::delete-event
4139  * signal on a #GtkWindow. The function calls gtk_widget_hide() on its
4140  * argument, then returns %TRUE. If connected to ::delete-event, the
4141  * result is that clicking the close button for a window (on the
4142  * window frame, top right corner usually) will hide but not destroy
4143  * the window. By default, GTK+ destroys windows when ::delete-event
4144  * is received.
4145  *
4146  * Return value: %TRUE
4147  **/
4148 gboolean
4149 gtk_widget_hide_on_delete (GtkWidget *widget)
4150 {
4151   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
4152
4153   gtk_widget_hide (widget);
4154
4155   return TRUE;
4156 }
4157
4158 /**
4159  * gtk_widget_show_all:
4160  * @widget: a #GtkWidget
4161  *
4162  * Recursively shows a widget, and any child widgets (if the widget is
4163  * a container).
4164  **/
4165 void
4166 gtk_widget_show_all (GtkWidget *widget)
4167 {
4168   GtkWidgetClass *class;
4169
4170   g_return_if_fail (GTK_IS_WIDGET (widget));
4171
4172   if (gtk_widget_get_no_show_all (widget))
4173     return;
4174
4175   class = GTK_WIDGET_GET_CLASS (widget);
4176
4177   if (class->show_all)
4178     class->show_all (widget);
4179 }
4180
4181 /**
4182  * gtk_widget_map:
4183  * @widget: a #GtkWidget
4184  *
4185  * This function is only for use in widget implementations. Causes
4186  * a widget to be mapped if it isn't already.
4187  **/
4188 void
4189 gtk_widget_map (GtkWidget *widget)
4190 {
4191   GtkWidgetPrivate *priv;
4192
4193   g_return_if_fail (GTK_IS_WIDGET (widget));
4194   g_return_if_fail (gtk_widget_get_visible (widget));
4195   g_return_if_fail (gtk_widget_get_child_visible (widget));
4196
4197   priv = widget->priv;
4198
4199   if (!gtk_widget_get_mapped (widget))
4200     {
4201       gtk_widget_push_verify_invariants (widget);
4202
4203       if (!gtk_widget_get_realized (widget))
4204         gtk_widget_realize (widget);
4205
4206       g_signal_emit (widget, widget_signals[MAP], 0);
4207
4208       if (!gtk_widget_get_has_window (widget))
4209         gdk_window_invalidate_rect (priv->window, &priv->allocation, FALSE);
4210
4211       gtk_widget_pop_verify_invariants (widget);
4212     }
4213 }
4214
4215 /**
4216  * gtk_widget_unmap:
4217  * @widget: a #GtkWidget
4218  *
4219  * This function is only for use in widget implementations. Causes
4220  * a widget to be unmapped if it's currently mapped.
4221  **/
4222 void
4223 gtk_widget_unmap (GtkWidget *widget)
4224 {
4225   GtkWidgetPrivate *priv;
4226
4227   g_return_if_fail (GTK_IS_WIDGET (widget));
4228
4229   priv = widget->priv;
4230
4231   if (gtk_widget_get_mapped (widget))
4232     {
4233       gtk_widget_push_verify_invariants (widget);
4234
4235       if (!gtk_widget_get_has_window (widget))
4236         gdk_window_invalidate_rect (priv->window, &priv->allocation, FALSE);
4237       _gtk_tooltip_hide (widget);
4238       g_signal_emit (widget, widget_signals[UNMAP], 0);
4239
4240       gtk_widget_pop_verify_invariants (widget);
4241
4242       /* Unset pointer/window info */
4243       g_object_set_qdata (G_OBJECT (widget), quark_pointer_window, NULL);
4244     }
4245 }
4246
4247 static void
4248 _gtk_widget_enable_device_events (GtkWidget *widget)
4249 {
4250   GHashTable *device_events;
4251   GHashTableIter iter;
4252   gpointer key, value;
4253
4254   device_events = g_object_get_qdata (G_OBJECT (widget), quark_device_event_mask);
4255
4256   if (!device_events)
4257     return;
4258
4259   g_hash_table_iter_init (&iter, device_events);
4260
4261   while (g_hash_table_iter_next (&iter, &key, &value))
4262     {
4263       GdkDevice *device;
4264       GdkEventMask event_mask;
4265
4266       device = key;
4267       event_mask = GPOINTER_TO_UINT (value);
4268       gtk_widget_add_events_internal (widget, device, event_mask);
4269     }
4270 }
4271
4272 static GList *
4273 get_widget_windows (GtkWidget *widget)
4274 {
4275   GList *window_list, *last, *l, *children, *ret;
4276
4277   if (gtk_widget_get_has_window (widget))
4278     window_list = g_list_prepend (NULL, gtk_widget_get_window (widget));
4279   else
4280     window_list = gdk_window_peek_children (gtk_widget_get_window (widget));
4281
4282   last = g_list_last (window_list);
4283   ret = NULL;
4284
4285   for (l = window_list; l; l = l->next)
4286     {
4287       GtkWidget *window_widget = NULL;
4288
4289       gdk_window_get_user_data (l->data, (gpointer *) &window_widget);
4290
4291       if (widget != window_widget)
4292         continue;
4293
4294       ret = g_list_prepend (ret, l->data);
4295       children = gdk_window_peek_children (GDK_WINDOW (l->data));
4296
4297       if (children)
4298         {
4299           last = g_list_concat (last, children);
4300           last = g_list_last (last);
4301         }
4302     }
4303
4304   g_list_free (window_list);
4305
4306   return ret;
4307 }
4308
4309 static void
4310 device_enable_foreach (GtkWidget *widget,
4311                        gpointer   user_data)
4312 {
4313   GdkDevice *device = user_data;
4314   gtk_widget_set_device_enabled_internal (widget, device, TRUE, TRUE);
4315 }
4316
4317 static void
4318 device_disable_foreach (GtkWidget *widget,
4319                         gpointer   user_data)
4320 {
4321   GdkDevice *device = user_data;
4322   gtk_widget_set_device_enabled_internal (widget, device, TRUE, FALSE);
4323 }
4324
4325 static void
4326 gtk_widget_set_device_enabled_internal (GtkWidget *widget,
4327                                         GdkDevice *device,
4328                                         gboolean   recurse,
4329                                         gboolean   enabled)
4330 {
4331   GList *window_list, *l;
4332
4333   window_list = get_widget_windows (widget);
4334
4335   for (l = window_list; l; l = l->next)
4336     {
4337       GdkEventMask events = 0;
4338       GdkWindow *window;
4339
4340       window = l->data;
4341
4342       if (enabled)
4343         events = gdk_window_get_events (window);
4344
4345       gdk_window_set_device_events (window, device, events);
4346     }
4347
4348   if (recurse && GTK_IS_CONTAINER (widget))
4349     {
4350       if (enabled)
4351         gtk_container_forall (GTK_CONTAINER (widget), device_enable_foreach, device);
4352       else
4353         gtk_container_forall (GTK_CONTAINER (widget), device_disable_foreach, device);
4354     }
4355
4356   g_list_free (window_list);
4357 }
4358
4359 static void
4360 gtk_widget_update_devices_mask (GtkWidget *widget,
4361                                 gboolean   recurse)
4362 {
4363   GList *enabled_devices, *l;
4364
4365   enabled_devices = g_object_get_qdata (G_OBJECT (widget), quark_enabled_devices);
4366
4367   for (l = enabled_devices; l; l = l->next)
4368     gtk_widget_set_device_enabled_internal (widget, GDK_DEVICE (l->data), recurse, TRUE);
4369 }
4370
4371 /**
4372  * gtk_widget_realize:
4373  * @widget: a #GtkWidget
4374  *
4375  * Creates the GDK (windowing system) resources associated with a
4376  * widget.  For example, @widget->window will be created when a widget
4377  * is realized.  Normally realization happens implicitly; if you show
4378  * a widget and all its parent containers, then the widget will be
4379  * realized and mapped automatically.
4380  *
4381  * Realizing a widget requires all
4382  * the widget's parent widgets to be realized; calling
4383  * gtk_widget_realize() realizes the widget's parents in addition to
4384  * @widget itself. If a widget is not yet inside a toplevel window
4385  * when you realize it, bad things will happen.
4386  *
4387  * This function is primarily used in widget implementations, and
4388  * isn't very useful otherwise. Many times when you think you might
4389  * need it, a better approach is to connect to a signal that will be
4390  * called after the widget is realized automatically, such as
4391  * #GtkWidget::draw. Or simply g_signal_connect () to the
4392  * #GtkWidget::realize signal.
4393  **/
4394 void
4395 gtk_widget_realize (GtkWidget *widget)
4396 {
4397   GtkWidgetPrivate *priv;
4398   cairo_region_t *region;
4399
4400   g_return_if_fail (GTK_IS_WIDGET (widget));
4401   g_return_if_fail (widget->priv->anchored ||
4402                     GTK_IS_INVISIBLE (widget));
4403
4404   priv = widget->priv;
4405
4406   if (!gtk_widget_get_realized (widget))
4407     {
4408       gtk_widget_push_verify_invariants (widget);
4409
4410       /*
4411         if (GTK_IS_CONTAINER (widget) && gtk_widget_get_has_window (widget))
4412           g_message ("gtk_widget_realize(%s)", G_OBJECT_TYPE_NAME (widget));
4413       */
4414
4415       if (priv->parent == NULL &&
4416           !gtk_widget_is_toplevel (widget))
4417         g_warning ("Calling gtk_widget_realize() on a widget that isn't "
4418                    "inside a toplevel window is not going to work very well. "
4419                    "Widgets must be inside a toplevel container before realizing them.");
4420
4421       if (priv->parent && !gtk_widget_get_realized (priv->parent))
4422         gtk_widget_realize (priv->parent);
4423
4424       gtk_widget_ensure_style (widget);
4425
4426       if (priv->style_update_pending)
4427         g_signal_emit (widget, widget_signals[STYLE_UPDATED], 0);
4428
4429       g_signal_emit (widget, widget_signals[REALIZE], 0);
4430
4431       gtk_widget_real_set_has_tooltip (widget,
4432                                        GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (widget), quark_has_tooltip)),
4433                                        TRUE);
4434
4435       if (priv->has_shape_mask)
4436         {
4437           region = g_object_get_qdata (G_OBJECT (widget), quark_shape_info);
4438           gdk_window_shape_combine_region (priv->window, region, 0, 0);
4439         }
4440
4441       region = g_object_get_qdata (G_OBJECT (widget), quark_input_shape_info);
4442       if (region)
4443         gdk_window_input_shape_combine_region (priv->window, region, 0, 0);
4444
4445       if (priv->multidevice)
4446         gdk_window_set_support_multidevice (priv->window, TRUE);
4447
4448       _gtk_widget_enable_device_events (widget);
4449       gtk_widget_update_devices_mask (widget, TRUE);
4450
4451       gtk_widget_pop_verify_invariants (widget);
4452     }
4453 }
4454
4455 /**
4456  * gtk_widget_unrealize:
4457  * @widget: a #GtkWidget
4458  *
4459  * This function is only useful in widget implementations.
4460  * Causes a widget to be unrealized (frees all GDK resources
4461  * associated with the widget, such as @widget->window).
4462  **/
4463 void
4464 gtk_widget_unrealize (GtkWidget *widget)
4465 {
4466   g_return_if_fail (GTK_IS_WIDGET (widget));
4467
4468   gtk_widget_push_verify_invariants (widget);
4469
4470   if (widget->priv->has_shape_mask)
4471     gtk_widget_shape_combine_region (widget, NULL);
4472
4473   if (g_object_get_qdata (G_OBJECT (widget), quark_input_shape_info))
4474     gtk_widget_input_shape_combine_region (widget, NULL);
4475
4476   if (gtk_widget_get_realized (widget))
4477     {
4478       g_object_ref (widget);
4479
4480       if (widget->priv->mapped)
4481         gtk_widget_unmap (widget);
4482
4483       g_signal_emit (widget, widget_signals[UNREALIZE], 0);
4484       g_assert (!widget->priv->mapped);
4485       gtk_widget_set_realized (widget, FALSE);
4486
4487       g_object_unref (widget);
4488     }
4489
4490   gtk_widget_pop_verify_invariants (widget);
4491 }
4492
4493 /*****************************************
4494  * Draw queueing.
4495  *****************************************/
4496
4497 /**
4498  * gtk_widget_queue_draw_region:
4499  * @widget: a #GtkWidget
4500  * @region: region to draw
4501  *
4502  * Invalidates the rectangular area of @widget defined by @region by
4503  * calling gdk_window_invalidate_region() on the widget's window and
4504  * all its child windows. Once the main loop becomes idle (after the
4505  * current batch of events has been processed, roughly), the window
4506  * will receive expose events for the union of all regions that have
4507  * been invalidated.
4508  *
4509  * Normally you would only use this function in widget
4510  * implementations. You might also use it to schedule a redraw of a
4511  * #GtkDrawingArea or some portion thereof.
4512  *
4513  * Since: 3.0
4514  **/
4515 void
4516 gtk_widget_queue_draw_region (GtkWidget            *widget,
4517                               const cairo_region_t *region)
4518 {
4519   GtkWidgetPrivate *priv;
4520   GtkWidget *w;
4521
4522   g_return_if_fail (GTK_IS_WIDGET (widget));
4523
4524   priv = widget->priv;
4525
4526   if (!gtk_widget_get_realized (widget))
4527     return;
4528
4529   /* Just return if the widget or one of its ancestors isn't mapped */
4530   for (w = widget; w != NULL; w = w->priv->parent)
4531     if (!gtk_widget_get_mapped (w))
4532       return;
4533
4534   gdk_window_invalidate_region (priv->window, region, TRUE);
4535 }
4536
4537 /**
4538  * gtk_widget_queue_draw_area:
4539  * @widget: a #GtkWidget
4540  * @x: x coordinate of upper-left corner of rectangle to redraw
4541  * @y: y coordinate of upper-left corner of rectangle to redraw
4542  * @width: width of region to draw
4543  * @height: height of region to draw
4544  *
4545  * Convenience function that calls gtk_widget_queue_draw_region() on
4546  * the region created from the given coordinates.
4547  *
4548  * The region here is specified in widget coordinates.
4549  * Widget coordinates are a bit odd; for historical reasons, they are
4550  * defined as @widget->window coordinates for widgets that are not
4551  * #GTK_NO_WINDOW widgets, and are relative to @widget->allocation.x,
4552  * @widget->allocation.y for widgets that are #GTK_NO_WINDOW widgets.
4553  */
4554 void
4555 gtk_widget_queue_draw_area (GtkWidget *widget,
4556                             gint       x,
4557                             gint       y,
4558                             gint       width,
4559                             gint       height)
4560 {
4561   GdkRectangle rect;
4562   cairo_region_t *region;
4563
4564   g_return_if_fail (GTK_IS_WIDGET (widget));
4565
4566   rect.x = x;
4567   rect.y = y;
4568   rect.width = width;
4569   rect.height = height;
4570
4571   region = cairo_region_create_rectangle (&rect);
4572   gtk_widget_queue_draw_region (widget, region);
4573   cairo_region_destroy (region);
4574 }
4575
4576 /**
4577  * gtk_widget_queue_draw:
4578  * @widget: a #GtkWidget
4579  *
4580  * Equivalent to calling gtk_widget_queue_draw_area() for the
4581  * entire area of a widget.
4582  **/
4583 void
4584 gtk_widget_queue_draw (GtkWidget *widget)
4585 {
4586   GdkRectangle rect;
4587
4588   g_return_if_fail (GTK_IS_WIDGET (widget));
4589
4590   gtk_widget_get_allocation (widget, &rect);
4591
4592   if (!gtk_widget_get_has_window (widget))
4593     gtk_widget_queue_draw_area (widget,
4594                                 rect.x, rect.y, rect.width, rect.height);
4595   else
4596     gtk_widget_queue_draw_area (widget,
4597                                 0, 0, rect.width, rect.height);
4598 }
4599
4600 /**
4601  * gtk_widget_queue_resize:
4602  * @widget: a #GtkWidget
4603  *
4604  * This function is only for use in widget implementations.
4605  * Flags a widget to have its size renegotiated; should
4606  * be called when a widget for some reason has a new size request.
4607  * For example, when you change the text in a #GtkLabel, #GtkLabel
4608  * queues a resize to ensure there's enough space for the new text.
4609  *
4610  * <note><para>You cannot call gtk_widget_queue_resize() on a widget
4611  * from inside its implementation of the GtkWidgetClass::size_allocate 
4612  * virtual method. Calls to gtk_widget_queue_resize() from inside
4613  * GtkWidgetClass::size_allocate will be silently ignored.</para></note>
4614  **/
4615 void
4616 gtk_widget_queue_resize (GtkWidget *widget)
4617 {
4618   g_return_if_fail (GTK_IS_WIDGET (widget));
4619
4620   if (gtk_widget_get_realized (widget))
4621     gtk_widget_queue_shallow_draw (widget);
4622
4623   _gtk_size_group_queue_resize (widget, 0);
4624 }
4625
4626 /**
4627  * gtk_widget_queue_resize_no_redraw:
4628  * @widget: a #GtkWidget
4629  *
4630  * This function works like gtk_widget_queue_resize(),
4631  * except that the widget is not invalidated.
4632  *
4633  * Since: 2.4
4634  **/
4635 void
4636 gtk_widget_queue_resize_no_redraw (GtkWidget *widget)
4637 {
4638   g_return_if_fail (GTK_IS_WIDGET (widget));
4639
4640   _gtk_size_group_queue_resize (widget, 0);
4641 }
4642
4643 /**
4644  * gtk_widget_size_request:
4645  * @widget: a #GtkWidget
4646  * @requisition: (out): a #GtkRequisition to be filled in
4647  *
4648  * This function is typically used when implementing a #GtkContainer
4649  * subclass.  Obtains the preferred size of a widget. The container
4650  * uses this information to arrange its child widgets and decide what
4651  * size allocations to give them with gtk_widget_size_allocate().
4652  *
4653  * You can also call this function from an application, with some
4654  * caveats. Most notably, getting a size request requires the widget
4655  * to be associated with a screen, because font information may be
4656  * needed. Multihead-aware applications should keep this in mind.
4657  *
4658  * Also remember that the size request is not necessarily the size
4659  * a widget will actually be allocated.
4660  *
4661  * Deprecated: 3.0: Use gtk_widget_get_preferred_size() instead.
4662  **/
4663 void
4664 gtk_widget_size_request (GtkWidget      *widget,
4665                          GtkRequisition *requisition)
4666 {
4667   g_return_if_fail (GTK_IS_WIDGET (widget));
4668
4669   gtk_widget_get_preferred_size (widget, requisition, NULL);
4670 }
4671
4672 /**
4673  * gtk_widget_get_child_requisition:
4674  * @widget: a #GtkWidget
4675  * @requisition: (out): a #GtkRequisition to be filled in
4676  *
4677  * This function is only for use in widget implementations. Obtains
4678  * @widget->requisition, unless someone has forced a particular
4679  * geometry on the widget (e.g. with gtk_widget_set_size_request()),
4680  * in which case it returns that geometry instead of the widget's
4681  * requisition.
4682  *
4683  * This function differs from gtk_widget_size_request() in that
4684  * it retrieves the last size request value from @widget->requisition,
4685  * while gtk_widget_size_request() actually calls the "size_request" method
4686  * on @widget to compute the size request and fill in @widget->requisition,
4687  * and only then returns @widget->requisition.
4688  *
4689  * Because this function does not call the "size_request" method, it
4690  * can only be used when you know that @widget->requisition is
4691  * up-to-date, that is, gtk_widget_size_request() has been called
4692  * since the last time a resize was queued. In general, only container
4693  * implementations have this information; applications should use
4694  * gtk_widget_size_request().
4695  *
4696  *
4697  * Deprecated: 3.0: Use gtk_widget_get_preferred_size() instead.
4698  **/
4699 void
4700 gtk_widget_get_child_requisition (GtkWidget      *widget,
4701                                   GtkRequisition *requisition)
4702 {
4703   gtk_widget_get_preferred_size (widget, requisition, NULL);
4704 }
4705
4706 static gboolean
4707 invalidate_predicate (GdkWindow *window,
4708                       gpointer   data)
4709 {
4710   gpointer user_data;
4711
4712   gdk_window_get_user_data (window, &user_data);
4713
4714   return (user_data == data);
4715 }
4716
4717 /* Invalidate @region in widget->window and all children
4718  * of widget->window owned by widget. @region is in the
4719  * same coordinates as widget->allocation and will be
4720  * modified by this call.
4721  */
4722 static void
4723 gtk_widget_invalidate_widget_windows (GtkWidget *widget,
4724                                       cairo_region_t *region)
4725 {
4726   GtkWidgetPrivate *priv = widget->priv;
4727
4728   if (!gtk_widget_get_realized (widget))
4729     return;
4730
4731   if (gtk_widget_get_has_window (widget) && priv->parent)
4732     {
4733       int x, y;
4734
4735       gdk_window_get_position (priv->window, &x, &y);
4736       cairo_region_translate (region, -x, -y);
4737     }
4738
4739   gdk_window_invalidate_maybe_recurse (priv->window, region,
4740                                        invalidate_predicate, widget);
4741 }
4742
4743 /**
4744  * gtk_widget_queue_shallow_draw:
4745  * @widget: a #GtkWidget
4746  *
4747  * Like gtk_widget_queue_draw(), but only windows owned
4748  * by @widget are invalidated.
4749  **/
4750 static void
4751 gtk_widget_queue_shallow_draw (GtkWidget *widget)
4752 {
4753   GdkRectangle rect;
4754   cairo_region_t *region;
4755
4756   if (!gtk_widget_get_realized (widget))
4757     return;
4758
4759   gtk_widget_get_allocation (widget, &rect);
4760
4761   region = cairo_region_create_rectangle (&rect);
4762   gtk_widget_invalidate_widget_windows (widget, region);
4763   cairo_region_destroy (region);
4764 }
4765
4766 /**
4767  * gtk_widget_size_allocate:
4768  * @widget: a #GtkWidget
4769  * @allocation: position and size to be allocated to @widget
4770  *
4771  * This function is only used by #GtkContainer subclasses, to assign a size
4772  * and position to their child widgets.
4773  *
4774  * In this function, the allocation may be adjusted. It will be forced
4775  * to a 1x1 minimum size, and the adjust_size_allocation virtual
4776  * method on the child will be used to adjust the allocation. Standard
4777  * adjustments include removing the widget's margins, and applying the
4778  * widget's #GtkWidget:halign and #GtkWidget:valign properties.
4779  **/
4780 void
4781 gtk_widget_size_allocate (GtkWidget     *widget,
4782                           GtkAllocation *allocation)
4783 {
4784   GtkWidgetPrivate *priv;
4785   GdkRectangle real_allocation;
4786   GdkRectangle old_allocation;
4787   GdkRectangle adjusted_allocation;
4788   gboolean alloc_needed;
4789   gboolean size_changed;
4790   gboolean position_changed;
4791   gint natural_width, natural_height, dummy;
4792   gint min_width, min_height;
4793
4794   priv = widget->priv;
4795
4796   g_return_if_fail (GTK_IS_WIDGET (widget));
4797
4798   gtk_widget_push_verify_invariants (widget);
4799
4800 #ifdef G_ENABLE_DEBUG
4801   if (gtk_get_debug_flags () & GTK_DEBUG_GEOMETRY)
4802     {
4803       gint depth;
4804       GtkWidget *parent;
4805       const gchar *name;
4806
4807       depth = 0;
4808       parent = widget;
4809       while (parent)
4810         {
4811           depth++;
4812           parent = gtk_widget_get_parent (parent);
4813         }
4814
4815       name = g_type_name (G_OBJECT_TYPE (G_OBJECT (widget)));
4816       g_print ("gtk_widget_size_allocate: %*s%s %d %d\n",
4817                2 * depth, " ", name,
4818                allocation->width, allocation->height);
4819     }
4820 #endif /* G_ENABLE_DEBUG */
4821
4822   alloc_needed = priv->alloc_needed;
4823   if (!priv->width_request_needed && !priv->height_request_needed)
4824     /* Preserve request/allocate ordering */
4825     priv->alloc_needed = FALSE;
4826
4827   old_allocation = priv->allocation;
4828   real_allocation = *allocation;
4829
4830   adjusted_allocation = real_allocation;
4831   if (gtk_widget_get_request_mode (widget) == GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH)
4832     {
4833       /* Go ahead and request the height for allocated width, note that the internals
4834        * of get_height_for_width will internally limit the for_size to natural size
4835        * when aligning implicitly.
4836        */
4837       gtk_widget_get_preferred_width (widget, &min_width, &natural_width);
4838       gtk_widget_get_preferred_height_for_width (widget, real_allocation.width, &min_height, &natural_height);
4839     }
4840   else
4841     {
4842       /* Go ahead and request the width for allocated height, note that the internals
4843        * of get_width_for_height will internally limit the for_size to natural size
4844        * when aligning implicitly.
4845        */
4846       gtk_widget_get_preferred_height (widget, &min_height, &natural_height);
4847       gtk_widget_get_preferred_width_for_height (widget, real_allocation.height, &min_width, &natural_width);
4848     }
4849
4850 #ifdef G_ENABLE_DEBUG
4851   if (gtk_get_debug_flags () & GTK_DEBUG_GEOMETRY)
4852     {
4853       if ((min_width > real_allocation.width || min_height > real_allocation.height) &&
4854           !GTK_IS_SCROLLABLE (widget))
4855         g_warning ("gtk_widget_size_allocate(): attempt to underallocate %s%s %s %p. "
4856                    "Allocation is %dx%d, but minimum required size is %dx%d.",
4857                    priv->parent ? G_OBJECT_TYPE_NAME (priv->parent) : "", priv->parent ? "'s child" : "toplevel",
4858                    G_OBJECT_TYPE_NAME (widget), widget,
4859                    real_allocation.width, real_allocation.height,
4860                    min_width, min_height);
4861     }
4862 #endif
4863   /* Now that we have the right natural height and width, go ahead and remove any margins from the
4864    * allocated sizes and possibly limit them to the natural sizes */
4865   GTK_WIDGET_GET_CLASS (widget)->adjust_size_allocation (widget,
4866                                                          GTK_ORIENTATION_HORIZONTAL,
4867                                                          &dummy,
4868                                                          &natural_width,
4869                                                          &adjusted_allocation.x,
4870                                                          &adjusted_allocation.width);
4871   GTK_WIDGET_GET_CLASS (widget)->adjust_size_allocation (widget,
4872                                                          GTK_ORIENTATION_VERTICAL,
4873                                                          &dummy,
4874                                                          &natural_height,
4875                                                          &adjusted_allocation.y,
4876                                                          &adjusted_allocation.height);
4877
4878   if (adjusted_allocation.x < real_allocation.x ||
4879       adjusted_allocation.y < real_allocation.y ||
4880       (adjusted_allocation.x + adjusted_allocation.width) >
4881       (real_allocation.x + real_allocation.width) ||
4882       (adjusted_allocation.y + adjusted_allocation.height >
4883        real_allocation.y + real_allocation.height))
4884     {
4885       g_warning ("%s %p attempted to adjust its size allocation from %d,%d %dx%d to %d,%d %dx%d. adjust_size_allocation must keep allocation inside original bounds",
4886                  G_OBJECT_TYPE_NAME (widget), widget,
4887                  real_allocation.x, real_allocation.y, real_allocation.width, real_allocation.height,
4888                  adjusted_allocation.x, adjusted_allocation.y, adjusted_allocation.width, adjusted_allocation.height);
4889       adjusted_allocation = real_allocation; /* veto it */
4890     }
4891   else
4892     {
4893       real_allocation = adjusted_allocation;
4894     }
4895
4896   if (real_allocation.width < 0 || real_allocation.height < 0)
4897     {
4898       g_warning ("gtk_widget_size_allocate(): attempt to allocate widget with width %d and height %d",
4899                  real_allocation.width,
4900                  real_allocation.height);
4901     }
4902
4903   real_allocation.width = MAX (real_allocation.width, 1);
4904   real_allocation.height = MAX (real_allocation.height, 1);
4905
4906   size_changed = (old_allocation.width != real_allocation.width ||
4907                   old_allocation.height != real_allocation.height);
4908   position_changed = (old_allocation.x != real_allocation.x ||
4909                       old_allocation.y != real_allocation.y);
4910
4911   if (!alloc_needed && !size_changed && !position_changed)
4912     goto out;
4913
4914   g_signal_emit (widget, widget_signals[SIZE_ALLOCATE], 0, &real_allocation);
4915
4916   /* Size allocation is god... after consulting god, no further requests or allocations are needed */
4917   priv->width_request_needed  = FALSE;
4918   priv->height_request_needed = FALSE;
4919   priv->alloc_needed          = FALSE;
4920
4921   if (gtk_widget_get_mapped (widget))
4922     {
4923       if (!gtk_widget_get_has_window (widget) && priv->redraw_on_alloc && position_changed)
4924         {
4925           /* Invalidate union(old_allaction,priv->allocation) in priv->window
4926            */
4927           cairo_region_t *invalidate = cairo_region_create_rectangle (&priv->allocation);
4928           cairo_region_union_rectangle (invalidate, &old_allocation);
4929
4930           gdk_window_invalidate_region (priv->window, invalidate, FALSE);
4931           cairo_region_destroy (invalidate);
4932         }
4933
4934       if (size_changed)
4935         {
4936           if (priv->redraw_on_alloc)
4937             {
4938               /* Invalidate union(old_allaction,priv->allocation) in priv->window and descendents owned by widget
4939                */
4940               cairo_region_t *invalidate = cairo_region_create_rectangle (&priv->allocation);
4941               cairo_region_union_rectangle (invalidate, &old_allocation);
4942
4943               gtk_widget_invalidate_widget_windows (widget, invalidate);
4944               cairo_region_destroy (invalidate);
4945             }
4946         }
4947     }
4948
4949   if ((size_changed || position_changed) && priv->parent &&
4950       gtk_widget_get_realized (priv->parent) && _gtk_container_get_reallocate_redraws (GTK_CONTAINER (priv->parent)))
4951     {
4952       cairo_region_t *invalidate = cairo_region_create_rectangle (&priv->parent->priv->allocation);
4953       gtk_widget_invalidate_widget_windows (priv->parent, invalidate);
4954       cairo_region_destroy (invalidate);
4955     }
4956
4957 out:
4958   gtk_widget_pop_verify_invariants (widget);
4959 }
4960
4961 /**
4962  * gtk_widget_common_ancestor:
4963  * @widget_a: a #GtkWidget
4964  * @widget_b: a #GtkWidget
4965  *
4966  * Find the common ancestor of @widget_a and @widget_b that
4967  * is closest to the two widgets.
4968  *
4969  * Return value: the closest common ancestor of @widget_a and
4970  *   @widget_b or %NULL if @widget_a and @widget_b do not
4971  *   share a common ancestor.
4972  **/
4973 static GtkWidget *
4974 gtk_widget_common_ancestor (GtkWidget *widget_a,
4975                             GtkWidget *widget_b)
4976 {
4977   GtkWidget *parent_a;
4978   GtkWidget *parent_b;
4979   gint depth_a = 0;
4980   gint depth_b = 0;
4981
4982   parent_a = widget_a;
4983   while (parent_a->priv->parent)
4984     {
4985       parent_a = parent_a->priv->parent;
4986       depth_a++;
4987     }
4988
4989   parent_b = widget_b;
4990   while (parent_b->priv->parent)
4991     {
4992       parent_b = parent_b->priv->parent;
4993       depth_b++;
4994     }
4995
4996   if (parent_a != parent_b)
4997     return NULL;
4998
4999   while (depth_a > depth_b)
5000     {
5001       widget_a = widget_a->priv->parent;
5002       depth_a--;
5003     }
5004
5005   while (depth_b > depth_a)
5006     {
5007       widget_b = widget_b->priv->parent;
5008       depth_b--;
5009     }
5010
5011   while (widget_a != widget_b)
5012     {
5013       widget_a = widget_a->priv->parent;
5014       widget_b = widget_b->priv->parent;
5015     }
5016
5017   return widget_a;
5018 }
5019
5020 /**
5021  * gtk_widget_translate_coordinates:
5022  * @src_widget:  a #GtkWidget
5023  * @dest_widget: a #GtkWidget
5024  * @src_x: X position relative to @src_widget
5025  * @src_y: Y position relative to @src_widget
5026  * @dest_x: (out): location to store X position relative to @dest_widget
5027  * @dest_y: (out): location to store Y position relative to @dest_widget
5028  *
5029  * Translate coordinates relative to @src_widget's allocation to coordinates
5030  * relative to @dest_widget's allocations. In order to perform this
5031  * operation, both widgets must be realized, and must share a common
5032  * toplevel.
5033  *
5034  * Return value: %FALSE if either widget was not realized, or there
5035  *   was no common ancestor. In this case, nothing is stored in
5036  *   *@dest_x and *@dest_y. Otherwise %TRUE.
5037  **/
5038 gboolean
5039 gtk_widget_translate_coordinates (GtkWidget  *src_widget,
5040                                   GtkWidget  *dest_widget,
5041                                   gint        src_x,
5042                                   gint        src_y,
5043                                   gint       *dest_x,
5044                                   gint       *dest_y)
5045 {
5046   GtkWidgetPrivate *src_priv = src_widget->priv;
5047   GtkWidgetPrivate *dest_priv = dest_widget->priv;
5048   GtkWidget *ancestor;
5049   GdkWindow *window;
5050   GList *dest_list = NULL;
5051
5052   g_return_val_if_fail (GTK_IS_WIDGET (src_widget), FALSE);
5053   g_return_val_if_fail (GTK_IS_WIDGET (dest_widget), FALSE);
5054
5055   ancestor = gtk_widget_common_ancestor (src_widget, dest_widget);
5056   if (!ancestor || !gtk_widget_get_realized (src_widget) || !gtk_widget_get_realized (dest_widget))
5057     return FALSE;
5058
5059   /* Translate from allocation relative to window relative */
5060   if (gtk_widget_get_has_window (src_widget) && src_priv->parent)
5061     {
5062       gint wx, wy;
5063       gdk_window_get_position (src_priv->window, &wx, &wy);
5064
5065       src_x -= wx - src_priv->allocation.x;
5066       src_y -= wy - src_priv->allocation.y;
5067     }
5068   else
5069     {
5070       src_x += src_priv->allocation.x;
5071       src_y += src_priv->allocation.y;
5072     }
5073
5074   /* Translate to the common ancestor */
5075   window = src_priv->window;
5076   while (window != ancestor->priv->window)
5077     {
5078       gdouble dx, dy;
5079
5080       gdk_window_coords_to_parent (window, src_x, src_y, &dx, &dy);
5081
5082       src_x = dx;
5083       src_y = dy;
5084
5085       window = gdk_window_get_effective_parent (window);
5086
5087       if (!window)              /* Handle GtkHandleBox */
5088         return FALSE;
5089     }
5090
5091   /* And back */
5092   window = dest_priv->window;
5093   while (window != ancestor->priv->window)
5094     {
5095       dest_list = g_list_prepend (dest_list, window);
5096
5097       window = gdk_window_get_effective_parent (window);
5098
5099       if (!window)              /* Handle GtkHandleBox */
5100         {
5101           g_list_free (dest_list);
5102           return FALSE;
5103         }
5104     }
5105
5106   while (dest_list)
5107     {
5108       gdouble dx, dy;
5109
5110       gdk_window_coords_from_parent (dest_list->data, src_x, src_y, &dx, &dy);
5111
5112       src_x = dx;
5113       src_y = dy;
5114
5115       dest_list = g_list_remove (dest_list, dest_list->data);
5116     }
5117
5118   /* Translate from window relative to allocation relative */
5119   if (gtk_widget_get_has_window (dest_widget) && dest_priv->parent)
5120     {
5121       gint wx, wy;
5122       gdk_window_get_position (dest_priv->window, &wx, &wy);
5123
5124       src_x += wx - dest_priv->allocation.x;
5125       src_y += wy - dest_priv->allocation.y;
5126     }
5127   else
5128     {
5129       src_x -= dest_priv->allocation.x;
5130       src_y -= dest_priv->allocation.y;
5131     }
5132
5133   if (dest_x)
5134     *dest_x = src_x;
5135   if (dest_y)
5136     *dest_y = src_y;
5137
5138   return TRUE;
5139 }
5140
5141 static void
5142 gtk_widget_real_size_allocate (GtkWidget     *widget,
5143                                GtkAllocation *allocation)
5144 {
5145   GtkWidgetPrivate *priv = widget->priv;
5146
5147   priv->allocation = *allocation;
5148
5149   if (gtk_widget_get_realized (widget) &&
5150       gtk_widget_get_has_window (widget))
5151      {
5152         gdk_window_move_resize (priv->window,
5153                                 allocation->x, allocation->y,
5154                                 allocation->width, allocation->height);
5155      }
5156 }
5157
5158 /* translate initial/final into start/end */
5159 static GtkAlign
5160 effective_align (GtkAlign         align,
5161                  GtkTextDirection direction)
5162 {
5163   switch (align)
5164     {
5165     case GTK_ALIGN_START:
5166       return direction == GTK_TEXT_DIR_RTL ? GTK_ALIGN_END : GTK_ALIGN_START;
5167     case GTK_ALIGN_END:
5168       return direction == GTK_TEXT_DIR_RTL ? GTK_ALIGN_START : GTK_ALIGN_END;
5169     default:
5170       return align;
5171     }
5172 }
5173
5174 static void
5175 adjust_for_align (GtkAlign  align,
5176                   gint     *natural_size,
5177                   gint     *allocated_pos,
5178                   gint     *allocated_size)
5179 {
5180   switch (align)
5181     {
5182     case GTK_ALIGN_FILL:
5183       /* change nothing */
5184       break;
5185     case GTK_ALIGN_START:
5186       /* keep *allocated_pos where it is */
5187       *allocated_size = MIN (*allocated_size, *natural_size);
5188       break;
5189     case GTK_ALIGN_END:
5190       if (*allocated_size > *natural_size)
5191         {
5192           *allocated_pos += (*allocated_size - *natural_size);
5193           *allocated_size = *natural_size;
5194         }
5195       break;
5196     case GTK_ALIGN_CENTER:
5197       if (*allocated_size > *natural_size)
5198         {
5199           *allocated_pos += (*allocated_size - *natural_size) / 2;
5200           *allocated_size = MIN (*allocated_size, *natural_size);
5201         }
5202       break;
5203     }
5204 }
5205
5206 static void
5207 adjust_for_margin(gint               start_margin,
5208                   gint               end_margin,
5209                   gint              *minimum_size,
5210                   gint              *natural_size,
5211                   gint              *allocated_pos,
5212                   gint              *allocated_size)
5213 {
5214   *minimum_size -= (start_margin + end_margin);
5215   *natural_size -= (start_margin + end_margin);
5216   *allocated_pos += start_margin;
5217   *allocated_size -= (start_margin + end_margin);
5218 }
5219
5220 static void
5221 gtk_widget_real_adjust_size_allocation (GtkWidget         *widget,
5222                                         GtkOrientation     orientation,
5223                                         gint              *minimum_size,
5224                                         gint              *natural_size,
5225                                         gint              *allocated_pos,
5226                                         gint              *allocated_size)
5227 {
5228   const GtkWidgetAuxInfo *aux_info;
5229
5230   aux_info = _gtk_widget_get_aux_info_or_defaults (widget);
5231
5232   if (orientation == GTK_ORIENTATION_HORIZONTAL)
5233     {
5234       adjust_for_margin (aux_info->margin.left,
5235                          aux_info->margin.right,
5236                          minimum_size, natural_size,
5237                          allocated_pos, allocated_size);
5238       adjust_for_align (effective_align (aux_info->halign, gtk_widget_get_direction (widget)),
5239                         natural_size, allocated_pos, allocated_size);
5240     }
5241   else
5242     {
5243       adjust_for_margin (aux_info->margin.top,
5244                          aux_info->margin.bottom,
5245                          minimum_size, natural_size,
5246                          allocated_pos, allocated_size);
5247       adjust_for_align (effective_align (aux_info->valign, GTK_TEXT_DIR_NONE),
5248                         natural_size, allocated_pos, allocated_size);
5249     }
5250 }
5251
5252 static gboolean
5253 gtk_widget_real_can_activate_accel (GtkWidget *widget,
5254                                     guint      signal_id)
5255 {
5256   GtkWidgetPrivate *priv = widget->priv;
5257
5258   /* widgets must be onscreen for accels to take effect */
5259   return gtk_widget_is_sensitive (widget) &&
5260          gtk_widget_is_drawable (widget) &&
5261          gdk_window_is_viewable (priv->window);
5262 }
5263
5264 /**
5265  * gtk_widget_can_activate_accel:
5266  * @widget: a #GtkWidget
5267  * @signal_id: the ID of a signal installed on @widget
5268  *
5269  * Determines whether an accelerator that activates the signal
5270  * identified by @signal_id can currently be activated.
5271  * This is done by emitting the #GtkWidget::can-activate-accel
5272  * signal on @widget; if the signal isn't overridden by a
5273  * handler or in a derived widget, then the default check is
5274  * that the widget must be sensitive, and the widget and all
5275  * its ancestors mapped.
5276  *
5277  * Return value: %TRUE if the accelerator can be activated.
5278  *
5279  * Since: 2.4
5280  **/
5281 gboolean
5282 gtk_widget_can_activate_accel (GtkWidget *widget,
5283                                guint      signal_id)
5284 {
5285   gboolean can_activate = FALSE;
5286   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
5287   g_signal_emit (widget, widget_signals[CAN_ACTIVATE_ACCEL], 0, signal_id, &can_activate);
5288   return can_activate;
5289 }
5290
5291 typedef struct {
5292   GClosure   closure;
5293   guint      signal_id;
5294 } AccelClosure;
5295
5296 static void
5297 closure_accel_activate (GClosure     *closure,
5298                         GValue       *return_value,
5299                         guint         n_param_values,
5300                         const GValue *param_values,
5301                         gpointer      invocation_hint,
5302                         gpointer      marshal_data)
5303 {
5304   AccelClosure *aclosure = (AccelClosure*) closure;
5305   gboolean can_activate = gtk_widget_can_activate_accel (closure->data, aclosure->signal_id);
5306
5307   if (can_activate)
5308     g_signal_emit (closure->data, aclosure->signal_id, 0);
5309
5310   /* whether accelerator was handled */
5311   g_value_set_boolean (return_value, can_activate);
5312 }
5313
5314 static void
5315 closures_destroy (gpointer data)
5316 {
5317   GSList *slist, *closures = data;
5318
5319   for (slist = closures; slist; slist = slist->next)
5320     {
5321       g_closure_invalidate (slist->data);
5322       g_closure_unref (slist->data);
5323     }
5324   g_slist_free (closures);
5325 }
5326
5327 static GClosure*
5328 widget_new_accel_closure (GtkWidget *widget,
5329                           guint      signal_id)
5330 {
5331   AccelClosure *aclosure;
5332   GClosure *closure = NULL;
5333   GSList *slist, *closures;
5334
5335   closures = g_object_steal_qdata (G_OBJECT (widget), quark_accel_closures);
5336   for (slist = closures; slist; slist = slist->next)
5337     if (!gtk_accel_group_from_accel_closure (slist->data))
5338       {
5339         /* reuse this closure */
5340         closure = slist->data;
5341         break;
5342       }
5343   if (!closure)
5344     {
5345       closure = g_closure_new_object (sizeof (AccelClosure), G_OBJECT (widget));
5346       closures = g_slist_prepend (closures, g_closure_ref (closure));
5347       g_closure_sink (closure);
5348       g_closure_set_marshal (closure, closure_accel_activate);
5349     }
5350   g_object_set_qdata_full (G_OBJECT (widget), quark_accel_closures, closures, closures_destroy);
5351
5352   aclosure = (AccelClosure*) closure;
5353   g_assert (closure->data == widget);
5354   g_assert (closure->marshal == closure_accel_activate);
5355   aclosure->signal_id = signal_id;
5356
5357   return closure;
5358 }
5359
5360 /**
5361  * gtk_widget_add_accelerator:
5362  * @widget:       widget to install an accelerator on
5363  * @accel_signal: widget signal to emit on accelerator activation
5364  * @accel_group:  accel group for this widget, added to its toplevel
5365  * @accel_key:    GDK keyval of the accelerator
5366  * @accel_mods:   modifier key combination of the accelerator
5367  * @accel_flags:  flag accelerators, e.g. %GTK_ACCEL_VISIBLE
5368  *
5369  * Installs an accelerator for this @widget in @accel_group that causes
5370  * @accel_signal to be emitted if the accelerator is activated.
5371  * The @accel_group needs to be added to the widget's toplevel via
5372  * gtk_window_add_accel_group(), and the signal must be of type %G_RUN_ACTION.
5373  * Accelerators added through this function are not user changeable during
5374  * runtime. If you want to support accelerators that can be changed by the
5375  * user, use gtk_accel_map_add_entry() and gtk_widget_set_accel_path() or
5376  * gtk_menu_item_set_accel_path() instead.
5377  */
5378 void
5379 gtk_widget_add_accelerator (GtkWidget      *widget,
5380                             const gchar    *accel_signal,
5381                             GtkAccelGroup  *accel_group,
5382                             guint           accel_key,
5383                             GdkModifierType accel_mods,
5384                             GtkAccelFlags   accel_flags)
5385 {
5386   GClosure *closure;
5387   GSignalQuery query;
5388
5389   g_return_if_fail (GTK_IS_WIDGET (widget));
5390   g_return_if_fail (accel_signal != NULL);
5391   g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
5392
5393   g_signal_query (g_signal_lookup (accel_signal, G_OBJECT_TYPE (widget)), &query);
5394   if (!query.signal_id ||
5395       !(query.signal_flags & G_SIGNAL_ACTION) ||
5396       query.return_type != G_TYPE_NONE ||
5397       query.n_params)
5398     {
5399       /* hmm, should be elaborate enough */
5400       g_warning (G_STRLOC ": widget `%s' has no activatable signal \"%s\" without arguments",
5401                  G_OBJECT_TYPE_NAME (widget), accel_signal);
5402       return;
5403     }
5404
5405   closure = widget_new_accel_closure (widget, query.signal_id);
5406
5407   g_object_ref (widget);
5408
5409   /* install the accelerator. since we don't map this onto an accel_path,
5410    * the accelerator will automatically be locked.
5411    */
5412   gtk_accel_group_connect (accel_group,
5413                            accel_key,
5414                            accel_mods,
5415                            accel_flags | GTK_ACCEL_LOCKED,
5416                            closure);
5417
5418   g_signal_emit (widget, widget_signals[ACCEL_CLOSURES_CHANGED], 0);
5419
5420   g_object_unref (widget);
5421 }
5422
5423 /**
5424  * gtk_widget_remove_accelerator:
5425  * @widget:       widget to install an accelerator on
5426  * @accel_group:  accel group for this widget
5427  * @accel_key:    GDK keyval of the accelerator
5428  * @accel_mods:   modifier key combination of the accelerator
5429  *
5430  * Removes an accelerator from @widget, previously installed with
5431  * gtk_widget_add_accelerator().
5432  *
5433  * Returns: whether an accelerator was installed and could be removed
5434  */
5435 gboolean
5436 gtk_widget_remove_accelerator (GtkWidget      *widget,
5437                                GtkAccelGroup  *accel_group,
5438                                guint           accel_key,
5439                                GdkModifierType accel_mods)
5440 {
5441   GtkAccelGroupEntry *ag_entry;
5442   GList *slist, *clist;
5443   guint n;
5444
5445   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
5446   g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), FALSE);
5447
5448   ag_entry = gtk_accel_group_query (accel_group, accel_key, accel_mods, &n);
5449   clist = gtk_widget_list_accel_closures (widget);
5450   for (slist = clist; slist; slist = slist->next)
5451     {
5452       guint i;
5453
5454       for (i = 0; i < n; i++)
5455         if (slist->data == (gpointer) ag_entry[i].closure)
5456           {
5457             gboolean is_removed = gtk_accel_group_disconnect (accel_group, slist->data);
5458
5459             g_signal_emit (widget, widget_signals[ACCEL_CLOSURES_CHANGED], 0);
5460
5461             g_list_free (clist);
5462
5463             return is_removed;
5464           }
5465     }
5466   g_list_free (clist);
5467
5468   g_warning (G_STRLOC ": no accelerator (%u,%u) installed in accel group (%p) for %s (%p)",
5469              accel_key, accel_mods, accel_group,
5470              G_OBJECT_TYPE_NAME (widget), widget);
5471
5472   return FALSE;
5473 }
5474
5475 /**
5476  * gtk_widget_list_accel_closures:
5477  * @widget:  widget to list accelerator closures for
5478  *
5479  * Lists the closures used by @widget for accelerator group connections
5480  * with gtk_accel_group_connect_by_path() or gtk_accel_group_connect().
5481  * The closures can be used to monitor accelerator changes on @widget,
5482  * by connecting to the @GtkAccelGroup::accel-changed signal of the
5483  * #GtkAccelGroup of a closure which can be found out with
5484  * gtk_accel_group_from_accel_closure().
5485  *
5486  * Return value: (transfer container) (element-type GClosure):
5487  *     a newly allocated #GList of closures
5488  */
5489 GList*
5490 gtk_widget_list_accel_closures (GtkWidget *widget)
5491 {
5492   GSList *slist;
5493   GList *clist = NULL;
5494
5495   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
5496
5497   for (slist = g_object_get_qdata (G_OBJECT (widget), quark_accel_closures); slist; slist = slist->next)
5498     if (gtk_accel_group_from_accel_closure (slist->data))
5499       clist = g_list_prepend (clist, slist->data);
5500   return clist;
5501 }
5502
5503 typedef struct {
5504   GQuark         path_quark;
5505   GtkAccelGroup *accel_group;
5506   GClosure      *closure;
5507 } AccelPath;
5508
5509 static void
5510 destroy_accel_path (gpointer data)
5511 {
5512   AccelPath *apath = data;
5513
5514   gtk_accel_group_disconnect (apath->accel_group, apath->closure);
5515
5516   /* closures_destroy takes care of unrefing the closure */
5517   g_object_unref (apath->accel_group);
5518
5519   g_slice_free (AccelPath, apath);
5520 }
5521
5522
5523 /**
5524  * gtk_widget_set_accel_path:
5525  * @widget: a #GtkWidget
5526  * @accel_path: (allow-none): path used to look up the accelerator
5527  * @accel_group: (allow-none): a #GtkAccelGroup.
5528  *
5529  * Given an accelerator group, @accel_group, and an accelerator path,
5530  * @accel_path, sets up an accelerator in @accel_group so whenever the
5531  * key binding that is defined for @accel_path is pressed, @widget
5532  * will be activated.  This removes any accelerators (for any
5533  * accelerator group) installed by previous calls to
5534  * gtk_widget_set_accel_path(). Associating accelerators with
5535  * paths allows them to be modified by the user and the modifications
5536  * to be saved for future use. (See gtk_accel_map_save().)
5537  *
5538  * This function is a low level function that would most likely
5539  * be used by a menu creation system like #GtkUIManager. If you
5540  * use #GtkUIManager, setting up accelerator paths will be done
5541  * automatically.
5542  *
5543  * Even when you you aren't using #GtkUIManager, if you only want to
5544  * set up accelerators on menu items gtk_menu_item_set_accel_path()
5545  * provides a somewhat more convenient interface.
5546  *
5547  * Note that @accel_path string will be stored in a #GQuark. Therefore, if you
5548  * pass a static string, you can save some memory by interning it first with
5549  * g_intern_static_string().
5550  **/
5551 void
5552 gtk_widget_set_accel_path (GtkWidget     *widget,
5553                            const gchar   *accel_path,
5554                            GtkAccelGroup *accel_group)
5555 {
5556   AccelPath *apath;
5557
5558   g_return_if_fail (GTK_IS_WIDGET (widget));
5559   g_return_if_fail (GTK_WIDGET_GET_CLASS (widget)->activate_signal != 0);
5560
5561   if (accel_path)
5562     {
5563       g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
5564       g_return_if_fail (_gtk_accel_path_is_valid (accel_path));
5565
5566       gtk_accel_map_add_entry (accel_path, 0, 0);
5567       apath = g_slice_new (AccelPath);
5568       apath->accel_group = g_object_ref (accel_group);
5569       apath->path_quark = g_quark_from_string (accel_path);
5570       apath->closure = widget_new_accel_closure (widget, GTK_WIDGET_GET_CLASS (widget)->activate_signal);
5571     }
5572   else
5573     apath = NULL;
5574
5575   /* also removes possible old settings */
5576   g_object_set_qdata_full (G_OBJECT (widget), quark_accel_path, apath, destroy_accel_path);
5577
5578   if (apath)
5579     gtk_accel_group_connect_by_path (apath->accel_group, g_quark_to_string (apath->path_quark), apath->closure);
5580
5581   g_signal_emit (widget, widget_signals[ACCEL_CLOSURES_CHANGED], 0);
5582 }
5583
5584 const gchar*
5585 _gtk_widget_get_accel_path (GtkWidget *widget,
5586                             gboolean  *locked)
5587 {
5588   AccelPath *apath;
5589
5590   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
5591
5592   apath = g_object_get_qdata (G_OBJECT (widget), quark_accel_path);
5593   if (locked)
5594     *locked = apath ? gtk_accel_group_get_is_locked (apath->accel_group) : TRUE;
5595   return apath ? g_quark_to_string (apath->path_quark) : NULL;
5596 }
5597
5598 /**
5599  * gtk_widget_mnemonic_activate:
5600  * @widget: a #GtkWidget
5601  * @group_cycling:  %TRUE if there are other widgets with the same mnemonic
5602  *
5603  * Emits the #GtkWidget::mnemonic-activate signal.
5604  *
5605  * The default handler for this signal activates the @widget if
5606  * @group_cycling is %FALSE, and just grabs the focus if @group_cycling
5607  * is %TRUE.
5608  *
5609  * Returns: %TRUE if the signal has been handled
5610  */
5611 gboolean
5612 gtk_widget_mnemonic_activate (GtkWidget *widget,
5613                               gboolean   group_cycling)
5614 {
5615   gboolean handled;
5616
5617   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
5618
5619   group_cycling = group_cycling != FALSE;
5620   if (!gtk_widget_is_sensitive (widget))
5621     handled = TRUE;
5622   else
5623     g_signal_emit (widget,
5624                    widget_signals[MNEMONIC_ACTIVATE],
5625                    0,
5626                    group_cycling,
5627                    &handled);
5628   return handled;
5629 }
5630
5631 static gboolean
5632 gtk_widget_real_mnemonic_activate (GtkWidget *widget,
5633                                    gboolean   group_cycling)
5634 {
5635   if (!group_cycling && GTK_WIDGET_GET_CLASS (widget)->activate_signal)
5636     gtk_widget_activate (widget);
5637   else if (gtk_widget_get_can_focus (widget))
5638     gtk_widget_grab_focus (widget);
5639   else
5640     {
5641       g_warning ("widget `%s' isn't suitable for mnemonic activation",
5642                  G_OBJECT_TYPE_NAME (widget));
5643       gtk_widget_error_bell (widget);
5644     }
5645   return TRUE;
5646 }
5647
5648 static const cairo_user_data_key_t event_key;
5649
5650 GdkEventExpose *
5651 _gtk_cairo_get_event (cairo_t *cr)
5652 {
5653   g_return_val_if_fail (cr != NULL, NULL);
5654
5655   return cairo_get_user_data (cr, &event_key);
5656 }
5657
5658 static void
5659 gtk_cairo_set_event (cairo_t        *cr,
5660                      GdkEventExpose *event)
5661 {
5662   cairo_set_user_data (cr, &event_key, event, NULL);
5663 }
5664
5665 /**
5666  * gtk_cairo_should_draw_window:
5667  * @cr: a cairo context
5668  * @window: the window to check. @window may not be an input-only
5669  *          window.
5670  *
5671  * This function is supposed to be called in #GtkWidget::draw
5672  * implementations for widgets that support multiple windows.
5673  * @cr must be untransformed from invoking of the draw function.
5674  * This function will return %TRUE if the contents of the given
5675  * @window are supposed to be drawn and %FALSE otherwise. Note
5676  * that when the drawing was not initiated by the windowing
5677  * system this function will return %TRUE for all windows, so
5678  * you need to draw the bottommost window first. Also, do not
5679  * use "else if" statements to check which window should be drawn.
5680  *
5681  * Returns: %TRUE if @window should be drawn
5682  *
5683  * Since: 3.0
5684  **/
5685 gboolean
5686 gtk_cairo_should_draw_window (cairo_t *cr,
5687                               GdkWindow *window)
5688 {
5689   GdkEventExpose *event;
5690
5691   g_return_val_if_fail (cr != NULL, FALSE);
5692   g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
5693
5694   event = _gtk_cairo_get_event (cr);
5695
5696   return event == NULL ||
5697          event->window == window;
5698 }
5699
5700 static gboolean
5701 gtk_widget_get_clip_draw (GtkWidget *widget)
5702 {
5703   /* labels are not clipped, because clipping them would cause
5704    * mnemonics to not appear on characters that go beyond the
5705    * baseline.
5706    * https://bugzilla.gnome.org/show_bug.cgi?id=648570
5707    */
5708   if (GTK_IS_LABEL (widget))
5709     return FALSE;
5710
5711   return TRUE;
5712 }
5713
5714 /* code shared by gtk_container_propagate_draw() and
5715  * gtk_widget_draw()
5716  */
5717 void
5718 _gtk_widget_draw_internal (GtkWidget *widget,
5719                            cairo_t   *cr,
5720                            gboolean   clip_to_size)
5721 {
5722   if (!gtk_widget_is_drawable (widget))
5723     return;
5724
5725   clip_to_size &= gtk_widget_get_clip_draw (widget);
5726
5727   if (clip_to_size)
5728     {
5729       cairo_rectangle (cr,
5730                        0, 0,
5731                        widget->priv->allocation.width,
5732                        widget->priv->allocation.height);
5733       cairo_clip (cr);
5734     }
5735
5736   if (gdk_cairo_get_clip_rectangle (cr, NULL))
5737     {
5738       gboolean result;
5739
5740       g_signal_emit (widget, widget_signals[DRAW],
5741                      0, cr,
5742                      &result);
5743
5744       if (cairo_status (cr) &&
5745           _gtk_cairo_get_event (cr))
5746         {
5747           /* We check the event so we only warn about internal GTK calls.
5748            * Errors might come from PDF streams having write failures and
5749            * we don't want to spam stderr in that case.
5750            * We do want to catch errors from
5751            */
5752           g_warning ("drawing failure for widget `%s': %s",
5753                      G_OBJECT_TYPE_NAME (widget),
5754                      cairo_status_to_string (cairo_status (cr)));
5755         }
5756     }
5757 }
5758
5759 /**
5760  * gtk_widget_draw:
5761  * @widget: the widget to draw. It must be drawable (see
5762  *   gtk_widget_is_drawable()) and a size must have been allocated.
5763  * @cr: a cairo context to draw to
5764  *
5765  * Draws @widget to @cr. The top left corner of the widget will be
5766  * drawn to the currently set origin point of @cr.
5767  *
5768  * You should pass a cairo context as @cr argument that is in an
5769  * original state. Otherwise the resulting drawing is undefined. For
5770  * example changing the operator using cairo_set_operator() or the
5771  * line width using cairo_set_line_width() might have unwanted side
5772  * effects.
5773  * You may however change the context's transform matrix - like with
5774  * cairo_scale(), cairo_translate() or cairo_set_matrix() and clip
5775  * region with cairo_clip() prior to calling this function. Also, it
5776  * is fine to modify the context with cairo_save() and
5777  * cairo_push_group() prior to calling this function.
5778  *
5779  * <note><para>Special purpose widgets may contain special code for
5780  * rendering to the screen and might appear differently on screen
5781  * and when rendered using gtk_widget_draw().</para></note>
5782  *
5783  * Since: 3.0
5784  **/
5785 void
5786 gtk_widget_draw (GtkWidget *widget,
5787                  cairo_t   *cr)
5788 {
5789   GdkEventExpose *tmp_event;
5790
5791   g_return_if_fail (GTK_IS_WIDGET (widget));
5792   g_return_if_fail (!widget->priv->alloc_needed);
5793   g_return_if_fail (cr != NULL);
5794
5795   cairo_save (cr);
5796   /* We have to reset the event here so that draw functions can call
5797    * gtk_widget_draw() on random other widgets and get the desired
5798    * effect: Drawing all contents, not just the current window.
5799    */
5800   tmp_event = _gtk_cairo_get_event (cr);
5801   gtk_cairo_set_event (cr, NULL);
5802
5803   _gtk_widget_draw_internal (widget, cr, TRUE);
5804
5805   gtk_cairo_set_event (cr, tmp_event);
5806   cairo_restore (cr);
5807 }
5808
5809 static gboolean
5810 gtk_widget_real_key_press_event (GtkWidget         *widget,
5811                                  GdkEventKey       *event)
5812 {
5813   return gtk_bindings_activate_event (G_OBJECT (widget), event);
5814 }
5815
5816 static gboolean
5817 gtk_widget_real_key_release_event (GtkWidget         *widget,
5818                                    GdkEventKey       *event)
5819 {
5820   return gtk_bindings_activate_event (G_OBJECT (widget), event);
5821 }
5822
5823 static gboolean
5824 gtk_widget_real_focus_in_event (GtkWidget     *widget,
5825                                 GdkEventFocus *event)
5826 {
5827   gtk_widget_queue_shallow_draw (widget);
5828
5829   return FALSE;
5830 }
5831
5832 static gboolean
5833 gtk_widget_real_focus_out_event (GtkWidget     *widget,
5834                                  GdkEventFocus *event)
5835 {
5836   gtk_widget_queue_shallow_draw (widget);
5837
5838   return FALSE;
5839 }
5840
5841 static gboolean
5842 gtk_widget_real_touch_event (GtkWidget     *widget,
5843                              GdkEventTouch *event)
5844 {
5845   GdkEvent *bevent;
5846   gboolean return_val;
5847   gint signum;
5848
5849   if (!event->emulating_pointer)
5850     return FALSE;
5851
5852   if (event->type == GDK_TOUCH_BEGIN ||
5853       event->type == GDK_TOUCH_END)
5854     {
5855       GdkEventType type;
5856
5857       if (event->type == GDK_TOUCH_BEGIN)
5858         {
5859           type = GDK_BUTTON_PRESS;
5860           signum = BUTTON_PRESS_EVENT;
5861         }
5862       else
5863         {
5864           type = GDK_BUTTON_RELEASE;
5865           signum = BUTTON_RELEASE_EVENT;
5866         }
5867       bevent = gdk_event_new (type);
5868       bevent->any.window = g_object_ref (event->window);
5869       bevent->any.send_event = FALSE;
5870       bevent->button.time = event->time;
5871       bevent->button.state = event->state;
5872       bevent->button.button = 1;
5873       bevent->button.x_root = event->x_root;
5874       bevent->button.y_root = event->y_root;
5875       bevent->button.x = event->x;
5876       bevent->button.y = event->y;
5877       bevent->button.device = event->device;
5878       bevent->button.axes = g_memdup (event->axes,
5879                                       sizeof (gdouble) * gdk_device_get_n_axes (event->device));
5880       gdk_event_set_source_device (bevent, gdk_event_get_source_device ((GdkEvent*)event));
5881     }
5882   else if (event->type == GDK_TOUCH_UPDATE)
5883     {
5884       signum = MOTION_NOTIFY_EVENT;
5885       bevent = gdk_event_new (GDK_MOTION_NOTIFY);
5886       bevent->any.window = g_object_ref (event->window);
5887       bevent->any.send_event = FALSE;
5888       bevent->motion.time = event->time;
5889       bevent->motion.state = event->state;
5890       bevent->motion.x_root = event->x_root;
5891       bevent->motion.y_root = event->y_root;
5892       bevent->motion.x = event->x;
5893       bevent->motion.y = event->y;
5894       bevent->motion.device = event->device;
5895       bevent->motion.is_hint = FALSE;
5896       bevent->motion.axes = g_memdup (event->axes,
5897                                       sizeof (gdouble) * gdk_device_get_n_axes (event->device));
5898       gdk_event_set_source_device (bevent, gdk_event_get_source_device ((GdkEvent*)event));
5899     }
5900   else
5901     return FALSE;
5902
5903   g_signal_emit (widget, widget_signals[signum], 0, bevent, &return_val);
5904
5905   gdk_event_free (bevent);
5906
5907   return return_val;
5908 }
5909
5910
5911 #define WIDGET_REALIZED_FOR_EVENT(widget, event) \
5912      (event->type == GDK_FOCUS_CHANGE || gtk_widget_get_realized(widget))
5913
5914 /**
5915  * gtk_widget_event:
5916  * @widget: a #GtkWidget
5917  * @event: a #GdkEvent
5918  *
5919  * Rarely-used function. This function is used to emit
5920  * the event signals on a widget (those signals should never
5921  * be emitted without using this function to do so).
5922  * If you want to synthesize an event though, don't use this function;
5923  * instead, use gtk_main_do_event() so the event will behave as if
5924  * it were in the event queue. Don't synthesize expose events; instead,
5925  * use gdk_window_invalidate_rect() to invalidate a region of the
5926  * window.
5927  *
5928  * Return value: return from the event signal emission (%TRUE if
5929  *               the event was handled)
5930  **/
5931 gboolean
5932 gtk_widget_event (GtkWidget *widget,
5933                   GdkEvent  *event)
5934 {
5935   g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
5936   g_return_val_if_fail (WIDGET_REALIZED_FOR_EVENT (widget, event), TRUE);
5937
5938   if (event->type == GDK_EXPOSE)
5939     {
5940       g_warning ("Events of type GDK_EXPOSE cannot be synthesized. To get "
5941                  "the same effect, call gdk_window_invalidate_rect/region(), "
5942                  "followed by gdk_window_process_updates().");
5943       return TRUE;
5944     }
5945
5946   return gtk_widget_event_internal (widget, event);
5947 }
5948
5949 void
5950 _gtk_widget_set_captured_event_handler (GtkWidget               *widget,
5951                                         GtkCapturedEventHandler  callback)
5952 {
5953   g_object_set_data (G_OBJECT (widget), "captured-event-handler", callback);
5954 }
5955
5956 gboolean
5957 _gtk_widget_captured_event (GtkWidget *widget,
5958                             GdkEvent  *event)
5959 {
5960   gboolean return_val = FALSE;
5961   GtkCapturedEventHandler handler;
5962
5963   g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
5964   g_return_val_if_fail (WIDGET_REALIZED_FOR_EVENT (widget, event), TRUE);
5965
5966   if (event->type == GDK_EXPOSE)
5967     {
5968       g_warning ("Events of type GDK_EXPOSE cannot be synthesized. To get "
5969                  "the same effect, call gdk_window_invalidate_rect/region(), "
5970                  "followed by gdk_window_process_updates().");
5971       return TRUE;
5972     }
5973
5974   if (!event_window_is_still_viewable (event))
5975     return TRUE;
5976
5977   handler = g_object_get_data (G_OBJECT (widget), "captured-event-handler");
5978   if (!handler)
5979     return FALSE;
5980
5981   g_object_ref (widget);
5982
5983   return_val = handler (widget, event);
5984   return_val |= !WIDGET_REALIZED_FOR_EVENT (widget, event);
5985
5986   /* The widget that was originally to receive the event
5987    * handles motion hints, but the capturing widget might
5988    * not, so ensure we get further motion events.
5989    */
5990   if (return_val &&
5991       event->type == GDK_MOTION_NOTIFY &&
5992       event->motion.is_hint &&
5993       (gdk_window_get_events (event->any.window) &
5994        GDK_POINTER_MOTION_HINT_MASK) != 0)
5995     gdk_event_request_motions (&event->motion);
5996
5997   g_object_unref (widget);
5998
5999   return return_val;
6000 }
6001
6002 /* Returns TRUE if a translation should be done */
6003 gboolean
6004 _gtk_widget_get_translation_to_window (GtkWidget      *widget,
6005                                        GdkWindow      *window,
6006                                        int            *x,
6007                                        int            *y)
6008 {
6009   GdkWindow *w, *widget_window;
6010
6011   if (!gtk_widget_get_has_window (widget))
6012     {
6013       *x = -widget->priv->allocation.x;
6014       *y = -widget->priv->allocation.y;
6015     }
6016   else
6017     {
6018       *x = 0;
6019       *y = 0;
6020     }
6021
6022   widget_window = gtk_widget_get_window (widget);
6023
6024   for (w = window; w && w != widget_window; w = gdk_window_get_parent (w))
6025     {
6026       int wx, wy;
6027       gdk_window_get_position (w, &wx, &wy);
6028       *x += wx;
6029       *y += wy;
6030     }
6031
6032   if (w == NULL)
6033     {
6034       *x = 0;
6035       *y = 0;
6036       return FALSE;
6037     }
6038
6039   return TRUE;
6040 }
6041
6042
6043 /**
6044  * gtk_cairo_transform_to_window:
6045  * @cr: the cairo context to transform
6046  * @widget: the widget the context is currently centered for
6047  * @window: the window to transform the context to
6048  *
6049  * Transforms the given cairo context @cr that from @widget-relative
6050  * coordinates to @window-relative coordinates.
6051  * If the @widget's window is not an ancestor of @window, no
6052  * modification will be applied.
6053  *
6054  * This is the inverse to the transformation GTK applies when
6055  * preparing an expose event to be emitted with the #GtkWidget::draw
6056  * signal. It is intended to help porting multiwindow widgets from
6057  * GTK+ 2 to the rendering architecture of GTK+ 3.
6058  *
6059  * Since: 3.0
6060  **/
6061 void
6062 gtk_cairo_transform_to_window (cairo_t   *cr,
6063                                GtkWidget *widget,
6064                                GdkWindow *window)
6065 {
6066   int x, y;
6067
6068   g_return_if_fail (cr != NULL);
6069   g_return_if_fail (GTK_IS_WIDGET (widget));
6070   g_return_if_fail (GDK_IS_WINDOW (window));
6071
6072   if (_gtk_widget_get_translation_to_window (widget, window, &x, &y))
6073     cairo_translate (cr, x, y);
6074 }
6075
6076 /**
6077  * gtk_widget_send_expose:
6078  * @widget: a #GtkWidget
6079  * @event: a expose #GdkEvent
6080  *
6081  * Very rarely-used function. This function is used to emit
6082  * an expose event on a widget. This function is not normally used
6083  * directly. The only time it is used is when propagating an expose
6084  * event to a child %NO_WINDOW widget, and that is normally done
6085  * using gtk_container_propagate_draw().
6086  *
6087  * If you want to force an area of a window to be redrawn,
6088  * use gdk_window_invalidate_rect() or gdk_window_invalidate_region().
6089  * To cause the redraw to be done immediately, follow that call
6090  * with a call to gdk_window_process_updates().
6091  *
6092  * Return value: return from the event signal emission (%TRUE if
6093  *               the event was handled)
6094  **/
6095 gint
6096 gtk_widget_send_expose (GtkWidget *widget,
6097                         GdkEvent  *event)
6098 {
6099   gboolean result = FALSE;
6100   cairo_t *cr;
6101   int x, y;
6102   gboolean do_clip;
6103
6104   g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
6105   g_return_val_if_fail (gtk_widget_get_realized (widget), TRUE);
6106   g_return_val_if_fail (event != NULL, TRUE);
6107   g_return_val_if_fail (event->type == GDK_EXPOSE, TRUE);
6108
6109   cr = gdk_cairo_create (event->expose.window);
6110   gtk_cairo_set_event (cr, &event->expose);
6111
6112   gdk_cairo_region (cr, event->expose.region);
6113   cairo_clip (cr);
6114
6115   do_clip = _gtk_widget_get_translation_to_window (widget,
6116                                                    event->expose.window,
6117                                                    &x, &y);
6118   cairo_translate (cr, -x, -y);
6119
6120   _gtk_widget_draw_internal (widget, cr, do_clip);
6121
6122   /* unset here, so if someone keeps a reference to cr we
6123    * don't leak the window. */
6124   gtk_cairo_set_event (cr, NULL);
6125   cairo_destroy (cr);
6126
6127   return result;
6128 }
6129
6130 static gboolean
6131 event_window_is_still_viewable (GdkEvent *event)
6132 {
6133   /* Check that we think the event's window is viewable before
6134    * delivering the event, to prevent suprises. We do this here
6135    * at the last moment, since the event may have been queued
6136    * up behind other events, held over a recursive main loop, etc.
6137    */
6138   switch (event->type)
6139     {
6140     case GDK_EXPOSE:
6141     case GDK_MOTION_NOTIFY:
6142     case GDK_BUTTON_PRESS:
6143     case GDK_2BUTTON_PRESS:
6144     case GDK_3BUTTON_PRESS:
6145     case GDK_KEY_PRESS:
6146     case GDK_ENTER_NOTIFY:
6147     case GDK_PROXIMITY_IN:
6148     case GDK_SCROLL:
6149       return event->any.window && gdk_window_is_viewable (event->any.window);
6150
6151 #if 0
6152     /* The following events are the second half of paired events;
6153      * we always deliver them to deal with widgets that clean up
6154      * on the second half.
6155      */
6156     case GDK_BUTTON_RELEASE:
6157     case GDK_KEY_RELEASE:
6158     case GDK_LEAVE_NOTIFY:
6159     case GDK_PROXIMITY_OUT:
6160 #endif
6161
6162     default:
6163       /* Remaining events would make sense on an not-viewable window,
6164        * or don't have an associated window.
6165        */
6166       return TRUE;
6167     }
6168 }
6169
6170 static gint
6171 gtk_widget_event_internal (GtkWidget *widget,
6172                            GdkEvent  *event)
6173 {
6174   gboolean return_val = FALSE;
6175
6176   /* We check only once for is-still-visible; if someone
6177    * hides the window in on of the signals on the widget,
6178    * they are responsible for returning TRUE to terminate
6179    * handling.
6180    */
6181   if (!event_window_is_still_viewable (event))
6182     return TRUE;
6183
6184   g_object_ref (widget);
6185
6186   g_signal_emit (widget, widget_signals[EVENT], 0, event, &return_val);
6187   return_val |= !WIDGET_REALIZED_FOR_EVENT (widget, event);
6188   if (!return_val)
6189     {
6190       gint signal_num;
6191
6192       switch (event->type)
6193         {
6194         case GDK_EXPOSE:
6195         case GDK_NOTHING:
6196           signal_num = -1;
6197           break;
6198         case GDK_BUTTON_PRESS:
6199         case GDK_2BUTTON_PRESS:
6200         case GDK_3BUTTON_PRESS:
6201           signal_num = BUTTON_PRESS_EVENT;
6202           break;
6203         case GDK_TOUCH_BEGIN:
6204         case GDK_TOUCH_UPDATE:
6205         case GDK_TOUCH_END:
6206         case GDK_TOUCH_CANCEL:
6207           signal_num = TOUCH_EVENT;
6208           break;
6209         case GDK_SCROLL:
6210           signal_num = SCROLL_EVENT;
6211           break;
6212         case GDK_BUTTON_RELEASE:
6213           signal_num = BUTTON_RELEASE_EVENT;
6214           break;
6215         case GDK_MOTION_NOTIFY:
6216           signal_num = MOTION_NOTIFY_EVENT;
6217           break;
6218         case GDK_DELETE:
6219           signal_num = DELETE_EVENT;
6220           break;
6221         case GDK_DESTROY:
6222           signal_num = DESTROY_EVENT;
6223           _gtk_tooltip_hide (widget);
6224           break;
6225         case GDK_KEY_PRESS:
6226           signal_num = KEY_PRESS_EVENT;
6227           break;
6228         case GDK_KEY_RELEASE:
6229           signal_num = KEY_RELEASE_EVENT;
6230           break;
6231         case GDK_ENTER_NOTIFY:
6232           signal_num = ENTER_NOTIFY_EVENT;
6233           break;
6234         case GDK_LEAVE_NOTIFY:
6235           signal_num = LEAVE_NOTIFY_EVENT;
6236           break;
6237         case GDK_FOCUS_CHANGE:
6238           signal_num = event->focus_change.in ? FOCUS_IN_EVENT : FOCUS_OUT_EVENT;
6239           if (event->focus_change.in)
6240             _gtk_tooltip_focus_in (widget);
6241           else
6242             _gtk_tooltip_focus_out (widget);
6243           break;
6244         case GDK_CONFIGURE:
6245           signal_num = CONFIGURE_EVENT;
6246           break;
6247         case GDK_MAP:
6248           signal_num = MAP_EVENT;
6249           break;
6250         case GDK_UNMAP:
6251           signal_num = UNMAP_EVENT;
6252           break;
6253         case GDK_WINDOW_STATE:
6254           signal_num = WINDOW_STATE_EVENT;
6255           break;
6256         case GDK_PROPERTY_NOTIFY:
6257           signal_num = PROPERTY_NOTIFY_EVENT;
6258           break;
6259         case GDK_SELECTION_CLEAR:
6260           signal_num = SELECTION_CLEAR_EVENT;
6261           break;
6262         case GDK_SELECTION_REQUEST:
6263           signal_num = SELECTION_REQUEST_EVENT;
6264           break;
6265         case GDK_SELECTION_NOTIFY:
6266           signal_num = SELECTION_NOTIFY_EVENT;
6267           break;
6268         case GDK_PROXIMITY_IN:
6269           signal_num = PROXIMITY_IN_EVENT;
6270           break;
6271         case GDK_PROXIMITY_OUT:
6272           signal_num = PROXIMITY_OUT_EVENT;
6273           break;
6274         case GDK_VISIBILITY_NOTIFY:
6275           signal_num = VISIBILITY_NOTIFY_EVENT;
6276           break;
6277         case GDK_GRAB_BROKEN:
6278           signal_num = GRAB_BROKEN_EVENT;
6279           break;
6280         case GDK_DAMAGE:
6281           signal_num = DAMAGE_EVENT;
6282           break;
6283         default:
6284           g_warning ("gtk_widget_event(): unhandled event type: %d", event->type);
6285           signal_num = -1;
6286           break;
6287         }
6288       if (signal_num != -1)
6289         g_signal_emit (widget, widget_signals[signal_num], 0, event, &return_val);
6290     }
6291   if (WIDGET_REALIZED_FOR_EVENT (widget, event))
6292     g_signal_emit (widget, widget_signals[EVENT_AFTER], 0, event);
6293   else
6294     return_val = TRUE;
6295
6296   g_object_unref (widget);
6297
6298   return return_val;
6299 }
6300
6301 /**
6302  * gtk_widget_activate:
6303  * @widget: a #GtkWidget that's activatable
6304  *
6305  * For widgets that can be "activated" (buttons, menu items, etc.)
6306  * this function activates them. Activation is what happens when you
6307  * press Enter on a widget during key navigation. If @widget isn't
6308  * activatable, the function returns %FALSE.
6309  *
6310  * Return value: %TRUE if the widget was activatable
6311  **/
6312 gboolean
6313 gtk_widget_activate (GtkWidget *widget)
6314 {
6315   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
6316
6317   if (WIDGET_CLASS (widget)->activate_signal)
6318     {
6319       /* FIXME: we should eventually check the signals signature here */
6320       g_signal_emit (widget, WIDGET_CLASS (widget)->activate_signal, 0);
6321
6322       return TRUE;
6323     }
6324   else
6325     return FALSE;
6326 }
6327
6328 static void
6329 gtk_widget_reparent_subwindows (GtkWidget *widget,
6330                                 GdkWindow *new_window)
6331 {
6332   GtkWidgetPrivate *priv = widget->priv;
6333
6334   if (!gtk_widget_get_has_window (widget))
6335     {
6336       GList *children = gdk_window_get_children (priv->window);
6337       GList *tmp_list;
6338
6339       for (tmp_list = children; tmp_list; tmp_list = tmp_list->next)
6340         {
6341           GdkWindow *window = tmp_list->data;
6342           gpointer child;
6343
6344           gdk_window_get_user_data (window, &child);
6345           while (child && child != widget)
6346             child = ((GtkWidget*) child)->priv->parent;
6347
6348           if (child)
6349             gdk_window_reparent (window, new_window, 0, 0);
6350         }
6351
6352       g_list_free (children);
6353     }
6354   else
6355    {
6356      GdkWindow *parent;
6357      GList *tmp_list, *children;
6358
6359      parent = gdk_window_get_parent (priv->window);
6360
6361      if (parent == NULL)
6362        gdk_window_reparent (priv->window, new_window, 0, 0);
6363      else
6364        {
6365          children = gdk_window_get_children (parent);
6366
6367          for (tmp_list = children; tmp_list; tmp_list = tmp_list->next)
6368            {
6369              GdkWindow *window = tmp_list->data;
6370              gpointer child;
6371
6372              gdk_window_get_user_data (window, &child);
6373
6374              if (child == widget)
6375                gdk_window_reparent (window, new_window, 0, 0);
6376            }
6377
6378          g_list_free (children);
6379        }
6380    }
6381 }
6382
6383 static void
6384 gtk_widget_reparent_fixup_child (GtkWidget *widget,
6385                                  gpointer   client_data)
6386 {
6387   GtkWidgetPrivate *priv = widget->priv;
6388
6389   g_assert (client_data != NULL);
6390
6391   if (!gtk_widget_get_has_window (widget))
6392     {
6393       if (priv->window)
6394         g_object_unref (priv->window);
6395       priv->window = (GdkWindow*) client_data;
6396       if (priv->window)
6397         g_object_ref (priv->window);
6398
6399       if (GTK_IS_CONTAINER (widget))
6400         gtk_container_forall (GTK_CONTAINER (widget),
6401                               gtk_widget_reparent_fixup_child,
6402                               client_data);
6403     }
6404 }
6405
6406 /**
6407  * gtk_widget_reparent:
6408  * @widget: a #GtkWidget
6409  * @new_parent: a #GtkContainer to move the widget into
6410  *
6411  * Moves a widget from one #GtkContainer to another, handling reference
6412  * count issues to avoid destroying the widget.
6413  **/
6414 void
6415 gtk_widget_reparent (GtkWidget *widget,
6416                      GtkWidget *new_parent)
6417 {
6418   GtkWidgetPrivate *priv;
6419
6420   g_return_if_fail (GTK_IS_WIDGET (widget));
6421   g_return_if_fail (GTK_IS_CONTAINER (new_parent));
6422   priv = widget->priv;
6423   g_return_if_fail (priv->parent != NULL);
6424
6425   if (priv->parent != new_parent)
6426     {
6427       /* First try to see if we can get away without unrealizing
6428        * the widget as we reparent it. if so we set a flag so
6429        * that gtk_widget_unparent doesn't unrealize widget
6430        */
6431       if (gtk_widget_get_realized (widget) && gtk_widget_get_realized (new_parent))
6432         priv->in_reparent = TRUE;
6433
6434       g_object_ref (widget);
6435       gtk_container_remove (GTK_CONTAINER (priv->parent), widget);
6436       gtk_container_add (GTK_CONTAINER (new_parent), widget);
6437       g_object_unref (widget);
6438
6439       if (priv->in_reparent)
6440         {
6441           priv->in_reparent = FALSE;
6442
6443           gtk_widget_reparent_subwindows (widget, gtk_widget_get_parent_window (widget));
6444           gtk_widget_reparent_fixup_child (widget,
6445                                            gtk_widget_get_parent_window (widget));
6446         }
6447
6448       g_object_notify (G_OBJECT (widget), "parent");
6449     }
6450 }
6451
6452 /**
6453  * gtk_widget_intersect:
6454  * @widget: a #GtkWidget
6455  * @area: a rectangle
6456  * @intersection: rectangle to store intersection of @widget and @area
6457  *
6458  * Computes the intersection of a @widget's area and @area, storing
6459  * the intersection in @intersection, and returns %TRUE if there was
6460  * an intersection.  @intersection may be %NULL if you're only
6461  * interested in whether there was an intersection.
6462  *
6463  * Return value: %TRUE if there was an intersection
6464  **/
6465 gboolean
6466 gtk_widget_intersect (GtkWidget          *widget,
6467                       const GdkRectangle *area,
6468                       GdkRectangle       *intersection)
6469 {
6470   GtkWidgetPrivate *priv;
6471   GdkRectangle *dest;
6472   GdkRectangle tmp;
6473   gint return_val;
6474
6475   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
6476   g_return_val_if_fail (area != NULL, FALSE);
6477
6478   priv = widget->priv;
6479
6480   if (intersection)
6481     dest = intersection;
6482   else
6483     dest = &tmp;
6484
6485   return_val = gdk_rectangle_intersect (&priv->allocation, area, dest);
6486
6487   if (return_val && intersection && gtk_widget_get_has_window (widget))
6488     {
6489       intersection->x -= priv->allocation.x;
6490       intersection->y -= priv->allocation.y;
6491     }
6492
6493   return return_val;
6494 }
6495
6496 /**
6497  * gtk_widget_region_intersect:
6498  * @widget: a #GtkWidget
6499  * @region: a #cairo_region_t, in the same coordinate system as
6500  *          @widget->allocation. That is, relative to @widget->window
6501  *          for %NO_WINDOW widgets; relative to the parent window
6502  *          of @widget->window for widgets with their own window.
6503  *
6504  * Computes the intersection of a @widget's area and @region, returning
6505  * the intersection. The result may be empty, use cairo_region_is_empty() to
6506  * check.
6507  *
6508  * Returns: A newly allocated region holding the intersection of @widget
6509  *     and @region. The coordinates of the return value are relative to
6510  *     @widget->window for %NO_WINDOW widgets, and relative to the parent
6511  *     window of @widget->window for widgets with their own window.
6512  */
6513 cairo_region_t *
6514 gtk_widget_region_intersect (GtkWidget       *widget,
6515                              const cairo_region_t *region)
6516 {
6517   GdkRectangle rect;
6518   cairo_region_t *dest;
6519
6520   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
6521   g_return_val_if_fail (region != NULL, NULL);
6522
6523   gtk_widget_get_allocation (widget, &rect);
6524
6525   dest = cairo_region_create_rectangle (&rect);
6526
6527   cairo_region_intersect (dest, region);
6528
6529   return dest;
6530 }
6531
6532 /**
6533  * _gtk_widget_grab_notify:
6534  * @widget: a #GtkWidget
6535  * @was_grabbed: whether a grab is now in effect
6536  *
6537  * Emits the #GtkWidget::grab-notify signal on @widget.
6538  *
6539  * Since: 2.6
6540  **/
6541 void
6542 _gtk_widget_grab_notify (GtkWidget *widget,
6543                          gboolean   was_grabbed)
6544 {
6545   g_signal_emit (widget, widget_signals[GRAB_NOTIFY], 0, was_grabbed);
6546 }
6547
6548 /**
6549  * gtk_widget_grab_focus:
6550  * @widget: a #GtkWidget
6551  *
6552  * Causes @widget to have the keyboard focus for the #GtkWindow it's
6553  * inside. @widget must be a focusable widget, such as a #GtkEntry;
6554  * something like #GtkFrame won't work.
6555  *
6556  * More precisely, it must have the %GTK_CAN_FOCUS flag set. Use
6557  * gtk_widget_set_can_focus() to modify that flag.
6558  *
6559  * The widget also needs to be realized and mapped. This is indicated by the
6560  * related signals. Grabbing the focus immediately after creating the widget
6561  * will likely fail and cause critical warnings.
6562  **/
6563 void
6564 gtk_widget_grab_focus (GtkWidget *widget)
6565 {
6566   g_return_if_fail (GTK_IS_WIDGET (widget));
6567
6568   if (!gtk_widget_is_sensitive (widget))
6569     return;
6570
6571   g_object_ref (widget);
6572   g_signal_emit (widget, widget_signals[GRAB_FOCUS], 0);
6573   g_object_notify (G_OBJECT (widget), "has-focus");
6574   g_object_unref (widget);
6575 }
6576
6577 static void
6578 reset_focus_recurse (GtkWidget *widget,
6579                      gpointer   data)
6580 {
6581   if (GTK_IS_CONTAINER (widget))
6582     {
6583       GtkContainer *container;
6584
6585       container = GTK_CONTAINER (widget);
6586       gtk_container_set_focus_child (container, NULL);
6587
6588       gtk_container_foreach (container,
6589                              reset_focus_recurse,
6590                              NULL);
6591     }
6592 }
6593
6594 static void
6595 gtk_widget_real_grab_focus (GtkWidget *focus_widget)
6596 {
6597   if (gtk_widget_get_can_focus (focus_widget))
6598     {
6599       GtkWidget *toplevel;
6600       GtkWidget *widget;
6601
6602       /* clear the current focus setting, break if the current widget
6603        * is the focus widget's parent, since containers above that will
6604        * be set by the next loop.
6605        */
6606       toplevel = gtk_widget_get_toplevel (focus_widget);
6607       if (gtk_widget_is_toplevel (toplevel) && GTK_IS_WINDOW (toplevel))
6608         {
6609           widget = gtk_window_get_focus (GTK_WINDOW (toplevel));
6610
6611           if (widget == focus_widget)
6612             {
6613               /* We call _gtk_window_internal_set_focus() here so that the
6614                * toplevel window can request the focus if necessary.
6615                * This is needed when the toplevel is a GtkPlug
6616                */
6617               if (!gtk_widget_has_focus (widget))
6618                 _gtk_window_internal_set_focus (GTK_WINDOW (toplevel), focus_widget);
6619
6620               return;
6621             }
6622
6623           if (widget)
6624             {
6625               GtkWidget *common_ancestor = gtk_widget_common_ancestor (widget, focus_widget);
6626
6627               if (widget != common_ancestor)
6628                 {
6629                   while (widget->priv->parent && widget->priv->parent != common_ancestor)
6630                     {
6631                       widget = widget->priv->parent;
6632                       gtk_container_set_focus_child (GTK_CONTAINER (widget), NULL);
6633                     }
6634                 }
6635             }
6636         }
6637       else if (toplevel != focus_widget)
6638         {
6639           /* gtk_widget_grab_focus() operates on a tree without window...
6640            * actually, this is very questionable behaviour.
6641            */
6642
6643           gtk_container_foreach (GTK_CONTAINER (toplevel),
6644                                  reset_focus_recurse,
6645                                  NULL);
6646         }
6647
6648       /* now propagate the new focus up the widget tree and finally
6649        * set it on the window
6650        */
6651       widget = focus_widget;
6652       while (widget->priv->parent)
6653         {
6654           gtk_container_set_focus_child (GTK_CONTAINER (widget->priv->parent), widget);
6655           widget = widget->priv->parent;
6656         }
6657       if (GTK_IS_WINDOW (widget))
6658         _gtk_window_internal_set_focus (GTK_WINDOW (widget), focus_widget);
6659     }
6660 }
6661
6662 static gboolean
6663 gtk_widget_real_query_tooltip (GtkWidget  *widget,
6664                                gint        x,
6665                                gint        y,
6666                                gboolean    keyboard_tip,
6667                                GtkTooltip *tooltip)
6668 {
6669   gchar *tooltip_markup;
6670   gboolean has_tooltip;
6671
6672   tooltip_markup = g_object_get_qdata (G_OBJECT (widget), quark_tooltip_markup);
6673   has_tooltip = GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (widget), quark_has_tooltip));
6674
6675   if (has_tooltip && tooltip_markup)
6676     {
6677       gtk_tooltip_set_markup (tooltip, tooltip_markup);
6678       return TRUE;
6679     }
6680
6681   return FALSE;
6682 }
6683
6684 static void
6685 gtk_widget_real_state_flags_changed (GtkWidget     *widget,
6686                                      GtkStateFlags  old_state)
6687 {
6688   gtk_widget_update_pango_context (widget);
6689 }
6690
6691 static void
6692 gtk_widget_real_style_updated (GtkWidget *widget)
6693 {
6694   GtkWidgetPrivate *priv = widget->priv;
6695
6696   gtk_widget_update_pango_context (widget);
6697
6698   if (priv->style != NULL &&
6699       priv->style != gtk_widget_get_default_style ())
6700     {
6701       /* Trigger ::style-set for old
6702        * widgets not listening to this
6703        */
6704       g_signal_emit (widget,
6705                      widget_signals[STYLE_SET],
6706                      0,
6707                      widget->priv->style);
6708     }
6709
6710   if (widget->priv->context)
6711     {
6712       if (gtk_widget_get_realized (widget) &&
6713           gtk_widget_get_has_window (widget) &&
6714           !gtk_widget_get_app_paintable (widget))
6715         gtk_style_context_set_background (widget->priv->context,
6716                                           widget->priv->window);
6717     }
6718
6719   if (widget->priv->anchored)
6720     gtk_widget_queue_resize (widget);
6721 }
6722
6723 static gboolean
6724 gtk_widget_real_show_help (GtkWidget        *widget,
6725                            GtkWidgetHelpType help_type)
6726 {
6727   if (help_type == GTK_WIDGET_HELP_TOOLTIP)
6728     {
6729       _gtk_tooltip_toggle_keyboard_mode (widget);
6730
6731       return TRUE;
6732     }
6733   else
6734     return FALSE;
6735 }
6736
6737 static gboolean
6738 gtk_widget_real_focus (GtkWidget         *widget,
6739                        GtkDirectionType   direction)
6740 {
6741   if (!gtk_widget_get_can_focus (widget))
6742     return FALSE;
6743
6744   if (!gtk_widget_is_focus (widget))
6745     {
6746       gtk_widget_grab_focus (widget);
6747       return TRUE;
6748     }
6749   else
6750     return FALSE;
6751 }
6752
6753 static void
6754 gtk_widget_real_move_focus (GtkWidget         *widget,
6755                             GtkDirectionType   direction)
6756 {
6757   GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
6758
6759   if (widget != toplevel && GTK_IS_WINDOW (toplevel))
6760     {
6761       g_signal_emit (toplevel, widget_signals[MOVE_FOCUS], 0,
6762                      direction);
6763     }
6764 }
6765
6766 static gboolean
6767 gtk_widget_real_keynav_failed (GtkWidget        *widget,
6768                                GtkDirectionType  direction)
6769 {
6770   gboolean cursor_only;
6771
6772   switch (direction)
6773     {
6774     case GTK_DIR_TAB_FORWARD:
6775     case GTK_DIR_TAB_BACKWARD:
6776       return FALSE;
6777
6778     case GTK_DIR_UP:
6779     case GTK_DIR_DOWN:
6780     case GTK_DIR_LEFT:
6781     case GTK_DIR_RIGHT:
6782       g_object_get (gtk_widget_get_settings (widget),
6783                     "gtk-keynav-cursor-only", &cursor_only,
6784                     NULL);
6785       if (cursor_only)
6786         return FALSE;
6787       break;
6788     }
6789
6790   gtk_widget_error_bell (widget);
6791
6792   return TRUE;
6793 }
6794
6795 /**
6796  * gtk_widget_set_can_focus:
6797  * @widget: a #GtkWidget
6798  * @can_focus: whether or not @widget can own the input focus.
6799  *
6800  * Specifies whether @widget can own the input focus. See
6801  * gtk_widget_grab_focus() for actually setting the input focus on a
6802  * widget.
6803  *
6804  * Since: 2.18
6805  **/
6806 void
6807 gtk_widget_set_can_focus (GtkWidget *widget,
6808                           gboolean   can_focus)
6809 {
6810   g_return_if_fail (GTK_IS_WIDGET (widget));
6811
6812   if (widget->priv->can_focus != can_focus)
6813     {
6814       widget->priv->can_focus = can_focus;
6815
6816       gtk_widget_queue_resize (widget);
6817       g_object_notify (G_OBJECT (widget), "can-focus");
6818     }
6819 }
6820
6821 /**
6822  * gtk_widget_get_can_focus:
6823  * @widget: a #GtkWidget
6824  *
6825  * Determines whether @widget can own the input focus. See
6826  * gtk_widget_set_can_focus().
6827  *
6828  * Return value: %TRUE if @widget can own the input focus, %FALSE otherwise
6829  *
6830  * Since: 2.18
6831  **/
6832 gboolean
6833 gtk_widget_get_can_focus (GtkWidget *widget)
6834 {
6835   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
6836
6837   return widget->priv->can_focus;
6838 }
6839
6840 /**
6841  * gtk_widget_has_focus:
6842  * @widget: a #GtkWidget
6843  *
6844  * Determines if the widget has the global input focus. See
6845  * gtk_widget_is_focus() for the difference between having the global
6846  * input focus, and only having the focus within a toplevel.
6847  *
6848  * Return value: %TRUE if the widget has the global input focus.
6849  *
6850  * Since: 2.18
6851  **/
6852 gboolean
6853 gtk_widget_has_focus (GtkWidget *widget)
6854 {
6855   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
6856
6857   return widget->priv->has_focus;
6858 }
6859
6860 /**
6861  * gtk_widget_has_visible_focus:
6862  * @widget: a #GtkWidget
6863  *
6864  * Determines if the widget should show a visible indication that
6865  * it has the global input focus. This is a convenience function for
6866  * use in ::draw handlers that takes into account whether focus
6867  * indication should currently be shown in the toplevel window of
6868  * @widget. See gtk_window_get_focus_visible() for more information
6869  * about focus indication.
6870  *
6871  * To find out if the widget has the global input focus, use
6872  * gtk_widget_has_focus().
6873  *
6874  * Return value: %TRUE if the widget should display a 'focus rectangle'
6875  *
6876  * Since: 3.2
6877  */
6878 gboolean
6879 gtk_widget_has_visible_focus (GtkWidget *widget)
6880 {
6881   gboolean draw_focus;
6882
6883   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
6884
6885   if (widget->priv->has_focus)
6886     {
6887       GtkWidget *toplevel;
6888
6889       toplevel = gtk_widget_get_toplevel (widget);
6890
6891       if (GTK_IS_WINDOW (toplevel))
6892         draw_focus = gtk_window_get_focus_visible (GTK_WINDOW (toplevel));
6893       else
6894         draw_focus = TRUE;
6895     }
6896   else
6897     draw_focus = FALSE;
6898
6899   return draw_focus;
6900 }
6901
6902 /**
6903  * gtk_widget_is_focus:
6904  * @widget: a #GtkWidget
6905  *
6906  * Determines if the widget is the focus widget within its
6907  * toplevel. (This does not mean that the %HAS_FOCUS flag is
6908  * necessarily set; %HAS_FOCUS will only be set if the
6909  * toplevel widget additionally has the global input focus.)
6910  *
6911  * Return value: %TRUE if the widget is the focus widget.
6912  **/
6913 gboolean
6914 gtk_widget_is_focus (GtkWidget *widget)
6915 {
6916   GtkWidget *toplevel;
6917
6918   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
6919
6920   toplevel = gtk_widget_get_toplevel (widget);
6921
6922   if (GTK_IS_WINDOW (toplevel))
6923     return widget == gtk_window_get_focus (GTK_WINDOW (toplevel));
6924   else
6925     return FALSE;
6926 }
6927
6928 /**
6929  * gtk_widget_set_can_default:
6930  * @widget: a #GtkWidget
6931  * @can_default: whether or not @widget can be a default widget.
6932  *
6933  * Specifies whether @widget can be a default widget. See
6934  * gtk_widget_grab_default() for details about the meaning of
6935  * "default".
6936  *
6937  * Since: 2.18
6938  **/
6939 void
6940 gtk_widget_set_can_default (GtkWidget *widget,
6941                             gboolean   can_default)
6942 {
6943   g_return_if_fail (GTK_IS_WIDGET (widget));
6944
6945   if (widget->priv->can_default != can_default)
6946     {
6947       widget->priv->can_default = can_default;
6948
6949       gtk_widget_queue_resize (widget);
6950       g_object_notify (G_OBJECT (widget), "can-default");
6951     }
6952 }
6953
6954 /**
6955  * gtk_widget_get_can_default:
6956  * @widget: a #GtkWidget
6957  *
6958  * Determines whether @widget can be a default widget. See
6959  * gtk_widget_set_can_default().
6960  *
6961  * Return value: %TRUE if @widget can be a default widget, %FALSE otherwise
6962  *
6963  * Since: 2.18
6964  **/
6965 gboolean
6966 gtk_widget_get_can_default (GtkWidget *widget)
6967 {
6968   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
6969
6970   return widget->priv->can_default;
6971 }
6972
6973 /**
6974  * gtk_widget_has_default:
6975  * @widget: a #GtkWidget
6976  *
6977  * Determines whether @widget is the current default widget within its
6978  * toplevel. See gtk_widget_set_can_default().
6979  *
6980  * Return value: %TRUE if @widget is the current default widget within
6981  *     its toplevel, %FALSE otherwise
6982  *
6983  * Since: 2.18
6984  */
6985 gboolean
6986 gtk_widget_has_default (GtkWidget *widget)
6987 {
6988   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
6989
6990   return widget->priv->has_default;
6991 }
6992
6993 void
6994 _gtk_widget_set_has_default (GtkWidget *widget,
6995                              gboolean   has_default)
6996 {
6997   GtkStyleContext *context;
6998
6999   widget->priv->has_default = has_default;
7000
7001   context = gtk_widget_get_style_context (widget);
7002
7003   if (has_default)
7004     gtk_style_context_add_class (context, GTK_STYLE_CLASS_DEFAULT);
7005   else
7006     gtk_style_context_remove_class (context, GTK_STYLE_CLASS_DEFAULT);
7007 }
7008
7009 /**
7010  * gtk_widget_grab_default:
7011  * @widget: a #GtkWidget
7012  *
7013  * Causes @widget to become the default widget. @widget must have the
7014  * %GTK_CAN_DEFAULT flag set; typically you have to set this flag
7015  * yourself by calling <literal>gtk_widget_set_can_default (@widget,
7016  * %TRUE)</literal>. The default widget is activated when
7017  * the user presses Enter in a window. Default widgets must be
7018  * activatable, that is, gtk_widget_activate() should affect them. Note
7019  * that #GtkEntry widgets require the "activates-default" property
7020  * set to %TRUE before they activate the default widget when Enter
7021  * is pressed and the #GtkEntry is focused.
7022  **/
7023 void
7024 gtk_widget_grab_default (GtkWidget *widget)
7025 {
7026   GtkWidget *window;
7027
7028   g_return_if_fail (GTK_IS_WIDGET (widget));
7029   g_return_if_fail (gtk_widget_get_can_default (widget));
7030
7031   window = gtk_widget_get_toplevel (widget);
7032
7033   if (window && gtk_widget_is_toplevel (window))
7034     gtk_window_set_default (GTK_WINDOW (window), widget);
7035   else
7036     g_warning (G_STRLOC ": widget not within a GtkWindow");
7037 }
7038
7039 /**
7040  * gtk_widget_set_receives_default:
7041  * @widget: a #GtkWidget
7042  * @receives_default: whether or not @widget can be a default widget.
7043  *
7044  * Specifies whether @widget will be treated as the default widget
7045  * within its toplevel when it has the focus, even if another widget
7046  * is the default.
7047  *
7048  * See gtk_widget_grab_default() for details about the meaning of
7049  * "default".
7050  *
7051  * Since: 2.18
7052  **/
7053 void
7054 gtk_widget_set_receives_default (GtkWidget *widget,
7055                                  gboolean   receives_default)
7056 {
7057   g_return_if_fail (GTK_IS_WIDGET (widget));
7058
7059   if (widget->priv->receives_default != receives_default)
7060     {
7061       widget->priv->receives_default = receives_default;
7062
7063       g_object_notify (G_OBJECT (widget), "receives-default");
7064     }
7065 }
7066
7067 /**
7068  * gtk_widget_get_receives_default:
7069  * @widget: a #GtkWidget
7070  *
7071  * Determines whether @widget is alyways treated as default widget
7072  * withing its toplevel when it has the focus, even if another widget
7073  * is the default.
7074  *
7075  * See gtk_widget_set_receives_default().
7076  *
7077  * Return value: %TRUE if @widget acts as default widget when focussed,
7078  *               %FALSE otherwise
7079  *
7080  * Since: 2.18
7081  **/
7082 gboolean
7083 gtk_widget_get_receives_default (GtkWidget *widget)
7084 {
7085   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7086
7087   return widget->priv->receives_default;
7088 }
7089
7090 /**
7091  * gtk_widget_has_grab:
7092  * @widget: a #GtkWidget
7093  *
7094  * Determines whether the widget is currently grabbing events, so it
7095  * is the only widget receiving input events (keyboard and mouse).
7096  *
7097  * See also gtk_grab_add().
7098  *
7099  * Return value: %TRUE if the widget is in the grab_widgets stack
7100  *
7101  * Since: 2.18
7102  **/
7103 gboolean
7104 gtk_widget_has_grab (GtkWidget *widget)
7105 {
7106   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7107
7108   return widget->priv->has_grab;
7109 }
7110
7111 void
7112 _gtk_widget_set_has_grab (GtkWidget *widget,
7113                           gboolean   has_grab)
7114 {
7115   widget->priv->has_grab = has_grab;
7116 }
7117
7118 /**
7119  * gtk_widget_device_is_shadowed:
7120  * @widget: a #GtkWidget
7121  * @device: a #GdkDevice
7122  *
7123  * Returns %TRUE if @device has been shadowed by a GTK+
7124  * device grab on another widget, so it would stop sending
7125  * events to @widget. This may be used in the
7126  * #GtkWidget::grab-notify signal to check for specific
7127  * devices. See gtk_device_grab_add().
7128  *
7129  * Returns: %TRUE if there is an ongoing grab on @device
7130  *          by another #GtkWidget than @widget.
7131  *
7132  * Since: 3.0
7133  **/
7134 gboolean
7135 gtk_widget_device_is_shadowed (GtkWidget *widget,
7136                                GdkDevice *device)
7137 {
7138   GtkWindowGroup *group;
7139   GtkWidget *grab_widget, *toplevel;
7140
7141   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7142   g_return_val_if_fail (GDK_IS_DEVICE (device), FALSE);
7143
7144   if (!gtk_widget_get_realized (widget))
7145     return TRUE;
7146
7147   toplevel = gtk_widget_get_toplevel (widget);
7148
7149   if (GTK_IS_WINDOW (toplevel))
7150     group = gtk_window_get_group (GTK_WINDOW (toplevel));
7151   else
7152     group = gtk_window_get_group (NULL);
7153
7154   grab_widget = gtk_window_group_get_current_device_grab (group, device);
7155
7156   /* Widget not inside the hierarchy of grab_widget */
7157   if (grab_widget &&
7158       widget != grab_widget &&
7159       !gtk_widget_is_ancestor (widget, grab_widget))
7160     return TRUE;
7161
7162   grab_widget = gtk_window_group_get_current_grab (group);
7163   if (grab_widget && widget != grab_widget &&
7164       !gtk_widget_is_ancestor (widget, grab_widget))
7165     return TRUE;
7166
7167   return FALSE;
7168 }
7169
7170 /**
7171  * gtk_widget_set_name:
7172  * @widget: a #GtkWidget
7173  * @name: name for the widget
7174  *
7175  * Widgets can be named, which allows you to refer to them from a
7176  * CSS file. You can apply a style to widgets with a particular name
7177  * in the CSS file. See the documentation for the CSS syntax (on the
7178  * same page as the docs for #GtkStyleContext).
7179  *
7180  * Note that the CSS syntax has certain special characters to delimit
7181  * and represent elements in a selector (period, &num;, &gt;, &ast;...),
7182  * so using these will make your widget impossible to match by name.
7183  * Any combination of alphanumeric symbols, dashes and underscores will
7184  * suffice.
7185  **/
7186 void
7187 gtk_widget_set_name (GtkWidget   *widget,
7188                      const gchar *name)
7189 {
7190   GtkWidgetPrivate *priv;
7191   gchar *new_name;
7192
7193   g_return_if_fail (GTK_IS_WIDGET (widget));
7194
7195   priv = widget->priv;
7196
7197   new_name = g_strdup (name);
7198   g_free (priv->name);
7199   priv->name = new_name;
7200
7201   _gtk_widget_invalidate_style_context (widget, GTK_CSS_CHANGE_NAME);
7202
7203   g_object_notify (G_OBJECT (widget), "name");
7204 }
7205
7206 /**
7207  * gtk_widget_get_name:
7208  * @widget: a #GtkWidget
7209  *
7210  * Retrieves the name of a widget. See gtk_widget_set_name() for the
7211  * significance of widget names.
7212  *
7213  * Return value: name of the widget. This string is owned by GTK+ and
7214  * should not be modified or freed
7215  **/
7216 const gchar*
7217 gtk_widget_get_name (GtkWidget *widget)
7218 {
7219   GtkWidgetPrivate *priv;
7220
7221   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
7222
7223   priv = widget->priv;
7224
7225   if (priv->name)
7226     return priv->name;
7227   return G_OBJECT_TYPE_NAME (widget);
7228 }
7229
7230 static void
7231 _gtk_widget_update_state_flags (GtkWidget     *widget,
7232                                 GtkStateFlags  flags,
7233                                 guint          operation)
7234 {
7235   GtkWidgetPrivate *priv;
7236
7237   priv = widget->priv;
7238
7239   /* Handle insensitive first, since it is propagated
7240    * differently throughout the widget hierarchy.
7241    */
7242   if ((priv->state_flags & GTK_STATE_FLAG_INSENSITIVE) && (flags & GTK_STATE_FLAG_INSENSITIVE) && (operation == STATE_CHANGE_UNSET))
7243     gtk_widget_set_sensitive (widget, TRUE);
7244   else if (!(priv->state_flags & GTK_STATE_FLAG_INSENSITIVE) && (flags & GTK_STATE_FLAG_INSENSITIVE) && (operation != STATE_CHANGE_UNSET))
7245     gtk_widget_set_sensitive (widget, FALSE);
7246   else if ((priv->state_flags & GTK_STATE_FLAG_INSENSITIVE) && !(flags & GTK_STATE_FLAG_INSENSITIVE) && (operation == STATE_CHANGE_REPLACE))
7247     gtk_widget_set_sensitive (widget, TRUE);
7248
7249   if (operation != STATE_CHANGE_REPLACE)
7250     flags &= ~(GTK_STATE_FLAG_INSENSITIVE);
7251
7252   if (flags != 0 ||
7253       operation == STATE_CHANGE_REPLACE)
7254     {
7255       GtkStateData data;
7256
7257       data.flags = flags;
7258       data.operation = operation;
7259
7260       gtk_widget_propagate_state (widget, &data);
7261
7262       gtk_widget_queue_resize (widget);
7263     }
7264 }
7265
7266 /**
7267  * gtk_widget_set_state_flags:
7268  * @widget: a #GtkWidget
7269  * @flags: State flags to turn on
7270  * @clear: Whether to clear state before turning on @flags
7271  *
7272  * This function is for use in widget implementations. Turns on flag
7273  * values in the current widget state (insensitive, prelighted, etc.).
7274  *
7275  * It is worth mentioning that any other state than %GTK_STATE_FLAG_INSENSITIVE,
7276  * will be propagated down to all non-internal children if @widget is a
7277  * #GtkContainer, while %GTK_STATE_FLAG_INSENSITIVE itself will be propagated
7278  * down to all #GtkContainer children by different means than turning on the
7279  * state flag down the hierarchy, both gtk_widget_get_state_flags() and
7280  * gtk_widget_is_sensitive() will make use of these.
7281  *
7282  * Since: 3.0
7283  **/
7284 void
7285 gtk_widget_set_state_flags (GtkWidget     *widget,
7286                             GtkStateFlags  flags,
7287                             gboolean       clear)
7288 {
7289   g_return_if_fail (GTK_IS_WIDGET (widget));
7290
7291   if ((!clear && (widget->priv->state_flags & flags) == flags) ||
7292       (clear && widget->priv->state_flags == flags))
7293     return;
7294
7295   if (clear)
7296     _gtk_widget_update_state_flags (widget, flags, STATE_CHANGE_REPLACE);
7297   else
7298     _gtk_widget_update_state_flags (widget, flags, STATE_CHANGE_SET);
7299 }
7300
7301 /**
7302  * gtk_widget_unset_state_flags:
7303  * @widget: a #GtkWidget
7304  * @flags: State flags to turn off
7305  *
7306  * This function is for use in widget implementations. Turns off flag
7307  * values for the current widget state (insensitive, prelighted, etc.).
7308  * See gtk_widget_set_state_flags().
7309  *
7310  * Since: 3.0
7311  **/
7312 void
7313 gtk_widget_unset_state_flags (GtkWidget     *widget,
7314                               GtkStateFlags  flags)
7315 {
7316   g_return_if_fail (GTK_IS_WIDGET (widget));
7317
7318   if ((widget->priv->state_flags & flags) == 0)
7319     return;
7320
7321   _gtk_widget_update_state_flags (widget, flags, STATE_CHANGE_UNSET);
7322 }
7323
7324 /**
7325  * gtk_widget_get_state_flags:
7326  * @widget: a #GtkWidget
7327  *
7328  * Returns the widget state as a flag set. It is worth mentioning
7329  * that the effective %GTK_STATE_FLAG_INSENSITIVE state will be
7330  * returned, that is, also based on parent insensitivity, even if
7331  * @widget itself is sensitive.
7332  *
7333  * Returns: The state flags for widget
7334  *
7335  * Since: 3.0
7336  **/
7337 GtkStateFlags
7338 gtk_widget_get_state_flags (GtkWidget *widget)
7339 {
7340   GtkStateFlags flags;
7341
7342   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
7343
7344   flags = widget->priv->state_flags;
7345
7346   if (gtk_widget_has_focus (widget))
7347     flags |= GTK_STATE_FLAG_FOCUSED;
7348
7349   return flags;
7350 }
7351
7352 /**
7353  * gtk_widget_set_state:
7354  * @widget: a #GtkWidget
7355  * @state: new state for @widget
7356  *
7357  * This function is for use in widget implementations. Sets the state
7358  * of a widget (insensitive, prelighted, etc.) Usually you should set
7359  * the state using wrapper functions such as gtk_widget_set_sensitive().
7360  *
7361  * Deprecated: 3.0. Use gtk_widget_set_state_flags() instead.
7362  **/
7363 void
7364 gtk_widget_set_state (GtkWidget           *widget,
7365                       GtkStateType         state)
7366 {
7367   GtkStateFlags flags;
7368
7369   if (state == gtk_widget_get_state (widget))
7370     return;
7371
7372   switch (state)
7373     {
7374     case GTK_STATE_ACTIVE:
7375       flags = GTK_STATE_FLAG_ACTIVE;
7376       break;
7377     case GTK_STATE_PRELIGHT:
7378       flags = GTK_STATE_FLAG_PRELIGHT;
7379       break;
7380     case GTK_STATE_SELECTED:
7381       flags = GTK_STATE_FLAG_SELECTED;
7382       break;
7383     case GTK_STATE_INSENSITIVE:
7384       flags = GTK_STATE_FLAG_INSENSITIVE;
7385       break;
7386     case GTK_STATE_INCONSISTENT:
7387       flags = GTK_STATE_FLAG_INCONSISTENT;
7388       break;
7389     case GTK_STATE_FOCUSED:
7390       flags = GTK_STATE_FLAG_FOCUSED;
7391       break;
7392     case GTK_STATE_NORMAL:
7393     default:
7394       flags = 0;
7395       break;
7396     }
7397
7398   _gtk_widget_update_state_flags (widget, flags, STATE_CHANGE_REPLACE);
7399 }
7400
7401 /**
7402  * gtk_widget_get_state:
7403  * @widget: a #GtkWidget
7404  *
7405  * Returns the widget's state. See gtk_widget_set_state().
7406  *
7407  * Returns: the state of @widget.
7408  *
7409  * Since: 2.18
7410  *
7411  * Deprecated: 3.0. Use gtk_widget_get_state_flags() instead.
7412  */
7413 GtkStateType
7414 gtk_widget_get_state (GtkWidget *widget)
7415 {
7416   GtkStateFlags flags;
7417
7418   g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_STATE_NORMAL);
7419
7420   flags = gtk_widget_get_state_flags (widget);
7421
7422   if (flags & GTK_STATE_FLAG_INSENSITIVE)
7423     return GTK_STATE_INSENSITIVE;
7424   else if (flags & GTK_STATE_FLAG_ACTIVE)
7425     return GTK_STATE_ACTIVE;
7426   else if (flags & GTK_STATE_FLAG_SELECTED)
7427     return GTK_STATE_SELECTED;
7428   else if (flags & GTK_STATE_FLAG_PRELIGHT)
7429     return GTK_STATE_PRELIGHT;
7430   else
7431     return GTK_STATE_NORMAL;
7432 }
7433
7434 /**
7435  * gtk_widget_set_visible:
7436  * @widget: a #GtkWidget
7437  * @visible: whether the widget should be shown or not
7438  *
7439  * Sets the visibility state of @widget. Note that setting this to
7440  * %TRUE doesn't mean the widget is actually viewable, see
7441  * gtk_widget_get_visible().
7442  *
7443  * This function simply calls gtk_widget_show() or gtk_widget_hide()
7444  * but is nicer to use when the visibility of the widget depends on
7445  * some condition.
7446  *
7447  * Since: 2.18
7448  **/
7449 void
7450 gtk_widget_set_visible (GtkWidget *widget,
7451                         gboolean   visible)
7452 {
7453   g_return_if_fail (GTK_IS_WIDGET (widget));
7454
7455   if (visible != gtk_widget_get_visible (widget))
7456     {
7457       if (visible)
7458         gtk_widget_show (widget);
7459       else
7460         gtk_widget_hide (widget);
7461     }
7462 }
7463
7464 void
7465 _gtk_widget_set_visible_flag (GtkWidget *widget,
7466                               gboolean   visible)
7467 {
7468   widget->priv->visible = visible;
7469 }
7470
7471 /**
7472  * gtk_widget_get_visible:
7473  * @widget: a #GtkWidget
7474  *
7475  * Determines whether the widget is visible. Note that this doesn't
7476  * take into account whether the widget's parent is also visible
7477  * or the widget is obscured in any way.
7478  *
7479  * See gtk_widget_set_visible().
7480  *
7481  * Return value: %TRUE if the widget is visible
7482  *
7483  * Since: 2.18
7484  **/
7485 gboolean
7486 gtk_widget_get_visible (GtkWidget *widget)
7487 {
7488   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7489
7490   return widget->priv->visible;
7491 }
7492
7493 /**
7494  * gtk_widget_set_has_window:
7495  * @widget: a #GtkWidget
7496  * @has_window: whether or not @widget has a window.
7497  *
7498  * Specifies whether @widget has a #GdkWindow of its own. Note that
7499  * all realized widgets have a non-%NULL "window" pointer
7500  * (gtk_widget_get_window() never returns a %NULL window when a widget
7501  * is realized), but for many of them it's actually the #GdkWindow of
7502  * one of its parent widgets. Widgets that do not create a %window for
7503  * themselves in #GtkWidget::realize must announce this by
7504  * calling this function with @has_window = %FALSE.
7505  *
7506  * This function should only be called by widget implementations,
7507  * and they should call it in their init() function.
7508  *
7509  * Since: 2.18
7510  **/
7511 void
7512 gtk_widget_set_has_window (GtkWidget *widget,
7513                            gboolean   has_window)
7514 {
7515   g_return_if_fail (GTK_IS_WIDGET (widget));
7516
7517   widget->priv->no_window = !has_window;
7518 }
7519
7520 /**
7521  * gtk_widget_get_has_window:
7522  * @widget: a #GtkWidget
7523  *
7524  * Determines whether @widget has a #GdkWindow of its own. See
7525  * gtk_widget_set_has_window().
7526  *
7527  * Return value: %TRUE if @widget has a window, %FALSE otherwise
7528  *
7529  * Since: 2.18
7530  **/
7531 gboolean
7532 gtk_widget_get_has_window (GtkWidget *widget)
7533 {
7534   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7535
7536   return ! widget->priv->no_window;
7537 }
7538
7539 /**
7540  * gtk_widget_is_toplevel:
7541  * @widget: a #GtkWidget
7542  *
7543  * Determines whether @widget is a toplevel widget.
7544  *
7545  * Currently only #GtkWindow and #GtkInvisible (and out-of-process
7546  * #GtkPlugs) are toplevel widgets. Toplevel widgets have no parent
7547  * widget.
7548  *
7549  * Return value: %TRUE if @widget is a toplevel, %FALSE otherwise
7550  *
7551  * Since: 2.18
7552  **/
7553 gboolean
7554 gtk_widget_is_toplevel (GtkWidget *widget)
7555 {
7556   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7557
7558   return widget->priv->toplevel;
7559 }
7560
7561 void
7562 _gtk_widget_set_is_toplevel (GtkWidget *widget,
7563                              gboolean   is_toplevel)
7564 {
7565   widget->priv->toplevel = is_toplevel;
7566 }
7567
7568 /**
7569  * gtk_widget_is_drawable:
7570  * @widget: a #GtkWidget
7571  *
7572  * Determines whether @widget can be drawn to. A widget can be drawn
7573  * to if it is mapped and visible.
7574  *
7575  * Return value: %TRUE if @widget is drawable, %FALSE otherwise
7576  *
7577  * Since: 2.18
7578  **/
7579 gboolean
7580 gtk_widget_is_drawable (GtkWidget *widget)
7581 {
7582   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7583
7584   return (gtk_widget_get_visible (widget) &&
7585           gtk_widget_get_mapped (widget));
7586 }
7587
7588 /**
7589  * gtk_widget_get_realized:
7590  * @widget: a #GtkWidget
7591  *
7592  * Determines whether @widget is realized.
7593  *
7594  * Return value: %TRUE if @widget is realized, %FALSE otherwise
7595  *
7596  * Since: 2.20
7597  **/
7598 gboolean
7599 gtk_widget_get_realized (GtkWidget *widget)
7600 {
7601   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7602
7603   return widget->priv->realized;
7604 }
7605
7606 /**
7607  * gtk_widget_set_realized:
7608  * @widget: a #GtkWidget
7609  * @realized: %TRUE to mark the widget as realized
7610  *
7611  * Marks the widget as being realized.
7612  *
7613  * This function should only ever be called in a derived widget's
7614  * "realize" or "unrealize" implementation.
7615  *
7616  * Since: 2.20
7617  */
7618 void
7619 gtk_widget_set_realized (GtkWidget *widget,
7620                          gboolean   realized)
7621 {
7622   g_return_if_fail (GTK_IS_WIDGET (widget));
7623
7624   widget->priv->realized = realized;
7625 }
7626
7627 /**
7628  * gtk_widget_get_mapped:
7629  * @widget: a #GtkWidget
7630  *
7631  * Whether the widget is mapped.
7632  *
7633  * Return value: %TRUE if the widget is mapped, %FALSE otherwise.
7634  *
7635  * Since: 2.20
7636  */
7637 gboolean
7638 gtk_widget_get_mapped (GtkWidget *widget)
7639 {
7640   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7641
7642   return widget->priv->mapped;
7643 }
7644
7645 /**
7646  * gtk_widget_set_mapped:
7647  * @widget: a #GtkWidget
7648  * @mapped: %TRUE to mark the widget as mapped
7649  *
7650  * Marks the widget as being realized.
7651  *
7652  * This function should only ever be called in a derived widget's
7653  * "map" or "unmap" implementation.
7654  *
7655  * Since: 2.20
7656  */
7657 void
7658 gtk_widget_set_mapped (GtkWidget *widget,
7659                        gboolean   mapped)
7660 {
7661   g_return_if_fail (GTK_IS_WIDGET (widget));
7662
7663   widget->priv->mapped = mapped;
7664 }
7665
7666 /**
7667  * gtk_widget_set_app_paintable:
7668  * @widget: a #GtkWidget
7669  * @app_paintable: %TRUE if the application will paint on the widget
7670  *
7671  * Sets whether the application intends to draw on the widget in
7672  * an #GtkWidget::draw handler.
7673  *
7674  * This is a hint to the widget and does not affect the behavior of
7675  * the GTK+ core; many widgets ignore this flag entirely. For widgets
7676  * that do pay attention to the flag, such as #GtkEventBox and #GtkWindow,
7677  * the effect is to suppress default themed drawing of the widget's
7678  * background. (Children of the widget will still be drawn.) The application
7679  * is then entirely responsible for drawing the widget background.
7680  *
7681  * Note that the background is still drawn when the widget is mapped.
7682  **/
7683 void
7684 gtk_widget_set_app_paintable (GtkWidget *widget,
7685                               gboolean   app_paintable)
7686 {
7687   g_return_if_fail (GTK_IS_WIDGET (widget));
7688
7689   app_paintable = (app_paintable != FALSE);
7690
7691   if (widget->priv->app_paintable != app_paintable)
7692     {
7693       widget->priv->app_paintable = app_paintable;
7694
7695       if (gtk_widget_is_drawable (widget))
7696         gtk_widget_queue_draw (widget);
7697
7698       g_object_notify (G_OBJECT (widget), "app-paintable");
7699     }
7700 }
7701
7702 /**
7703  * gtk_widget_get_app_paintable:
7704  * @widget: a #GtkWidget
7705  *
7706  * Determines whether the application intends to draw on the widget in
7707  * an #GtkWidget::draw handler.
7708  *
7709  * See gtk_widget_set_app_paintable()
7710  *
7711  * Return value: %TRUE if the widget is app paintable
7712  *
7713  * Since: 2.18
7714  **/
7715 gboolean
7716 gtk_widget_get_app_paintable (GtkWidget *widget)
7717 {
7718   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7719
7720   return widget->priv->app_paintable;
7721 }
7722
7723 /**
7724  * gtk_widget_set_double_buffered:
7725  * @widget: a #GtkWidget
7726  * @double_buffered: %TRUE to double-buffer a widget
7727  *
7728  * Widgets are double buffered by default; you can use this function
7729  * to turn off the buffering. "Double buffered" simply means that
7730  * gdk_window_begin_paint_region() and gdk_window_end_paint() are called
7731  * automatically around expose events sent to the
7732  * widget. gdk_window_begin_paint() diverts all drawing to a widget's
7733  * window to an offscreen buffer, and gdk_window_end_paint() draws the
7734  * buffer to the screen. The result is that users see the window
7735  * update in one smooth step, and don't see individual graphics
7736  * primitives being rendered.
7737  *
7738  * In very simple terms, double buffered widgets don't flicker,
7739  * so you would only use this function to turn off double buffering
7740  * if you had special needs and really knew what you were doing.
7741  *
7742  * Note: if you turn off double-buffering, you have to handle
7743  * expose events, since even the clearing to the background color or
7744  * pixmap will not happen automatically (as it is done in
7745  * gdk_window_begin_paint()).
7746  **/
7747 void
7748 gtk_widget_set_double_buffered (GtkWidget *widget,
7749                                 gboolean   double_buffered)
7750 {
7751   g_return_if_fail (GTK_IS_WIDGET (widget));
7752
7753   double_buffered = (double_buffered != FALSE);
7754
7755   if (widget->priv->double_buffered != double_buffered)
7756     {
7757       widget->priv->double_buffered = double_buffered;
7758
7759       g_object_notify (G_OBJECT (widget), "double-buffered");
7760     }
7761 }
7762
7763 /**
7764  * gtk_widget_get_double_buffered:
7765  * @widget: a #GtkWidget
7766  *
7767  * Determines whether the widget is double buffered.
7768  *
7769  * See gtk_widget_set_double_buffered()
7770  *
7771  * Return value: %TRUE if the widget is double buffered
7772  *
7773  * Since: 2.18
7774  **/
7775 gboolean
7776 gtk_widget_get_double_buffered (GtkWidget *widget)
7777 {
7778   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7779
7780   return widget->priv->double_buffered;
7781 }
7782
7783 /**
7784  * gtk_widget_set_redraw_on_allocate:
7785  * @widget: a #GtkWidget
7786  * @redraw_on_allocate: if %TRUE, the entire widget will be redrawn
7787  *   when it is allocated to a new size. Otherwise, only the
7788  *   new portion of the widget will be redrawn.
7789  *
7790  * Sets whether the entire widget is queued for drawing when its size
7791  * allocation changes. By default, this setting is %TRUE and
7792  * the entire widget is redrawn on every size change. If your widget
7793  * leaves the upper left unchanged when made bigger, turning this
7794  * setting off will improve performance.
7795
7796  * Note that for %NO_WINDOW widgets setting this flag to %FALSE turns
7797  * off all allocation on resizing: the widget will not even redraw if
7798  * its position changes; this is to allow containers that don't draw
7799  * anything to avoid excess invalidations. If you set this flag on a
7800  * %NO_WINDOW widget that <emphasis>does</emphasis> draw on @widget->window,
7801  * you are responsible for invalidating both the old and new allocation
7802  * of the widget when the widget is moved and responsible for invalidating
7803  * regions newly when the widget increases size.
7804  **/
7805 void
7806 gtk_widget_set_redraw_on_allocate (GtkWidget *widget,
7807                                    gboolean   redraw_on_allocate)
7808 {
7809   g_return_if_fail (GTK_IS_WIDGET (widget));
7810
7811   widget->priv->redraw_on_alloc = redraw_on_allocate;
7812 }
7813
7814 /**
7815  * gtk_widget_set_sensitive:
7816  * @widget: a #GtkWidget
7817  * @sensitive: %TRUE to make the widget sensitive
7818  *
7819  * Sets the sensitivity of a widget. A widget is sensitive if the user
7820  * can interact with it. Insensitive widgets are "grayed out" and the
7821  * user can't interact with them. Insensitive widgets are known as
7822  * "inactive", "disabled", or "ghosted" in some other toolkits.
7823  **/
7824 void
7825 gtk_widget_set_sensitive (GtkWidget *widget,
7826                           gboolean   sensitive)
7827 {
7828   GtkWidgetPrivate *priv;
7829
7830   g_return_if_fail (GTK_IS_WIDGET (widget));
7831
7832   priv = widget->priv;
7833
7834   sensitive = (sensitive != FALSE);
7835
7836   if (priv->sensitive == sensitive)
7837     return;
7838
7839   priv->sensitive = sensitive;
7840
7841   if (priv->parent == NULL
7842       || gtk_widget_is_sensitive (priv->parent))
7843     {
7844       GtkStateData data;
7845
7846       data.flags = GTK_STATE_FLAG_INSENSITIVE;
7847
7848       if (sensitive)
7849         data.operation = STATE_CHANGE_UNSET;
7850       else
7851         data.operation = STATE_CHANGE_SET;
7852
7853       gtk_widget_propagate_state (widget, &data);
7854
7855       gtk_widget_queue_resize (widget);
7856     }
7857
7858   g_object_notify (G_OBJECT (widget), "sensitive");
7859 }
7860
7861 /**
7862  * gtk_widget_get_sensitive:
7863  * @widget: a #GtkWidget
7864  *
7865  * Returns the widget's sensitivity (in the sense of returning
7866  * the value that has been set using gtk_widget_set_sensitive()).
7867  *
7868  * The effective sensitivity of a widget is however determined by both its
7869  * own and its parent widget's sensitivity. See gtk_widget_is_sensitive().
7870  *
7871  * Returns: %TRUE if the widget is sensitive
7872  *
7873  * Since: 2.18
7874  */
7875 gboolean
7876 gtk_widget_get_sensitive (GtkWidget *widget)
7877 {
7878   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7879
7880   return widget->priv->sensitive;
7881 }
7882
7883 /**
7884  * gtk_widget_is_sensitive:
7885  * @widget: a #GtkWidget
7886  *
7887  * Returns the widget's effective sensitivity, which means
7888  * it is sensitive itself and also its parent widget is sensitive
7889  *
7890  * Returns: %TRUE if the widget is effectively sensitive
7891  *
7892  * Since: 2.18
7893  */
7894 gboolean
7895 gtk_widget_is_sensitive (GtkWidget *widget)
7896 {
7897   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7898
7899   return !(widget->priv->state_flags & GTK_STATE_FLAG_INSENSITIVE);
7900 }
7901
7902 /**
7903  * gtk_widget_set_parent:
7904  * @widget: a #GtkWidget
7905  * @parent: parent container
7906  *
7907  * This function is useful only when implementing subclasses of
7908  * #GtkContainer.
7909  * Sets the container as the parent of @widget, and takes care of
7910  * some details such as updating the state and style of the child
7911  * to reflect its new location. The opposite function is
7912  * gtk_widget_unparent().
7913  **/
7914 void
7915 gtk_widget_set_parent (GtkWidget *widget,
7916                        GtkWidget *parent)
7917 {
7918   GtkStateFlags parent_flags;
7919   GtkWidgetPrivate *priv;
7920   GtkStateData data;
7921
7922   g_return_if_fail (GTK_IS_WIDGET (widget));
7923   g_return_if_fail (GTK_IS_WIDGET (parent));
7924   g_return_if_fail (widget != parent);
7925
7926   priv = widget->priv;
7927
7928   if (priv->parent != NULL)
7929     {
7930       g_warning ("Can't set a parent on widget which has a parent\n");
7931       return;
7932     }
7933   if (gtk_widget_is_toplevel (widget))
7934     {
7935       g_warning ("Can't set a parent on a toplevel widget\n");
7936       return;
7937     }
7938
7939   /* keep this function in sync with gtk_menu_attach_to_widget()
7940    */
7941
7942   g_object_ref_sink (widget);
7943
7944   gtk_widget_push_verify_invariants (widget);
7945
7946   priv->parent = parent;
7947
7948   parent_flags = gtk_widget_get_state_flags (parent);
7949
7950   /* Merge both old state and current parent state,
7951    * making sure to only propagate the right states */
7952   data.flags = parent_flags & GTK_STATE_FLAGS_DO_PROPAGATE;
7953   data.flags |= priv->state_flags;
7954
7955   data.operation = STATE_CHANGE_REPLACE;
7956   gtk_widget_propagate_state (widget, &data);
7957
7958   if (priv->context)
7959     gtk_style_context_set_parent (priv->context,
7960                                   gtk_widget_get_style_context (parent));
7961
7962   g_signal_emit (widget, widget_signals[PARENT_SET], 0, NULL);
7963   if (priv->parent->priv->anchored)
7964     _gtk_widget_propagate_hierarchy_changed (widget, NULL);
7965   g_object_notify (G_OBJECT (widget), "parent");
7966
7967   /* Enforce realized/mapped invariants
7968    */
7969   if (gtk_widget_get_realized (priv->parent))
7970     gtk_widget_realize (widget);
7971
7972   if (gtk_widget_get_visible (priv->parent) &&
7973       gtk_widget_get_visible (widget))
7974     {
7975       if (gtk_widget_get_child_visible (widget) &&
7976           gtk_widget_get_mapped (priv->parent))
7977         gtk_widget_map (widget);
7978
7979       gtk_widget_queue_resize (widget);
7980     }
7981
7982   /* child may cause parent's expand to change, if the child is
7983    * expanded. If child is not expanded, then it can't modify the
7984    * parent's expand. If the child becomes expanded later then it will
7985    * queue compute_expand then. This optimization plus defaulting
7986    * newly-constructed widgets to need_compute_expand=FALSE should
7987    * mean that initially building a widget tree doesn't have to keep
7988    * walking up setting need_compute_expand on parents over and over.
7989    *
7990    * We can't change a parent to need to expand unless we're visible.
7991    */
7992   if (gtk_widget_get_visible (widget) &&
7993       (priv->need_compute_expand ||
7994        priv->computed_hexpand ||
7995        priv->computed_vexpand))
7996     {
7997       gtk_widget_queue_compute_expand (parent);
7998     }
7999
8000   gtk_widget_pop_verify_invariants (widget);
8001 }
8002
8003 /**
8004  * gtk_widget_get_parent:
8005  * @widget: a #GtkWidget
8006  *
8007  * Returns the parent container of @widget.
8008  *
8009  * Return value: (transfer none): the parent container of @widget, or %NULL
8010  **/
8011 GtkWidget *
8012 gtk_widget_get_parent (GtkWidget *widget)
8013 {
8014   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
8015
8016   return widget->priv->parent;
8017 }
8018
8019 static void
8020 modifier_style_changed (GtkModifierStyle *style,
8021                         GtkWidget        *widget)
8022 {
8023   _gtk_widget_invalidate_style_context (widget, GTK_CSS_CHANGE_ANY);
8024 }
8025
8026 static GtkModifierStyle *
8027 _gtk_widget_get_modifier_properties (GtkWidget *widget)
8028 {
8029   GtkModifierStyle *style;
8030
8031   style = g_object_get_qdata (G_OBJECT (widget), quark_modifier_style);
8032
8033   if (G_UNLIKELY (!style))
8034     {
8035       GtkStyleContext *context;
8036
8037       style = _gtk_modifier_style_new ();
8038       g_object_set_qdata_full (G_OBJECT (widget),
8039                                quark_modifier_style,
8040                                style,
8041                                (GDestroyNotify) g_object_unref);
8042
8043       g_signal_connect (style, "changed",
8044                         G_CALLBACK (modifier_style_changed), widget);
8045
8046       context = gtk_widget_get_style_context (widget);
8047
8048       gtk_style_context_add_provider (context,
8049                                       GTK_STYLE_PROVIDER (style),
8050                                       GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
8051     }
8052
8053   return style;
8054 }
8055
8056 /**
8057  * gtk_widget_override_color:
8058  * @widget: a #GtkWidget
8059  * @state: the state for which to set the color
8060  * @color: (allow-none): the color to assign, or %NULL to undo the effect
8061  *     of previous calls to gtk_widget_override_color()
8062  *
8063  * Sets the color to use for a widget.
8064  *
8065  * All other style values are left untouched.
8066  *
8067  * <note><para>
8068  * This API is mostly meant as a quick way for applications to
8069  * change a widget appearance. If you are developing a widgets
8070  * library and intend this change to be themeable, it is better
8071  * done by setting meaningful CSS classes and regions in your
8072  * widget/container implementation through gtk_style_context_add_class()
8073  * and gtk_style_context_add_region().
8074  * </para><para>
8075  * This way, your widget library can install a #GtkCssProvider
8076  * with the %GTK_STYLE_PROVIDER_PRIORITY_FALLBACK priority in order
8077  * to provide a default styling for those widgets that need so, and
8078  * this theming may fully overridden by the user's theme.
8079  * </para></note>
8080  * <note><para>
8081  * Note that for complex widgets this may bring in undesired
8082  * results (such as uniform background color everywhere), in
8083  * these cases it is better to fully style such widgets through a
8084  * #GtkCssProvider with the %GTK_STYLE_PROVIDER_PRIORITY_APPLICATION
8085  * priority.
8086  * </para></note>
8087  *
8088  * Since: 3.0
8089  */
8090 void
8091 gtk_widget_override_color (GtkWidget     *widget,
8092                            GtkStateFlags  state,
8093                            const GdkRGBA *color)
8094 {
8095   GtkModifierStyle *style;
8096
8097   g_return_if_fail (GTK_IS_WIDGET (widget));
8098
8099   style = _gtk_widget_get_modifier_properties (widget);
8100   _gtk_modifier_style_set_color (style, state, color);
8101 }
8102
8103 /**
8104  * gtk_widget_override_background_color:
8105  * @widget: a #GtkWidget
8106  * @state: the state for which to set the background color
8107  * @color: (allow-none): the color to assign, or %NULL to undo the effect
8108  *     of previous calls to gtk_widget_override_background_color()
8109  *
8110  * Sets the background color to use for a widget.
8111  *
8112  * All other style values are left untouched.
8113  * See gtk_widget_override_color().
8114  *
8115  * Since: 3.0
8116  */
8117 void
8118 gtk_widget_override_background_color (GtkWidget     *widget,
8119                                       GtkStateFlags  state,
8120                                       const GdkRGBA *color)
8121 {
8122   GtkModifierStyle *style;
8123
8124   g_return_if_fail (GTK_IS_WIDGET (widget));
8125
8126   style = _gtk_widget_get_modifier_properties (widget);
8127   _gtk_modifier_style_set_background_color (style, state, color);
8128 }
8129
8130 /**
8131  * gtk_widget_override_font:
8132  * @widget: a #GtkWidget
8133  * @font_desc: (allow-none): the font descriptiong to use, or %NULL to undo
8134  *     the effect of previous calls to gtk_widget_override_font()
8135  *
8136  * Sets the font to use for a widget. All other style values are
8137  * left untouched. See gtk_widget_override_color().
8138  *
8139  * Since: 3.0
8140  */
8141 void
8142 gtk_widget_override_font (GtkWidget                  *widget,
8143                           const PangoFontDescription *font_desc)
8144 {
8145   GtkModifierStyle *style;
8146
8147   g_return_if_fail (GTK_IS_WIDGET (widget));
8148
8149   style = _gtk_widget_get_modifier_properties (widget);
8150   _gtk_modifier_style_set_font (style, font_desc);
8151 }
8152
8153 /**
8154  * gtk_widget_override_symbolic_color:
8155  * @widget: a #GtkWidget
8156  * @name: the name of the symbolic color to modify
8157  * @color: (allow-none): the color to assign (does not need
8158  *     to be allocated), or %NULL to undo the effect of previous
8159  *     calls to gtk_widget_override_symbolic_color()
8160  *
8161  * Sets a symbolic color for a widget.
8162  *
8163  * All other style values are left untouched.
8164  * See gtk_widget_override_color() for overriding the foreground
8165  * or background color.
8166  *
8167  * Since: 3.0
8168  */
8169 void
8170 gtk_widget_override_symbolic_color (GtkWidget     *widget,
8171                                     const gchar   *name,
8172                                     const GdkRGBA *color)
8173 {
8174   GtkModifierStyle *style;
8175
8176   g_return_if_fail (GTK_IS_WIDGET (widget));
8177
8178   style = _gtk_widget_get_modifier_properties (widget);
8179   _gtk_modifier_style_map_color (style, name, color);
8180 }
8181
8182 /**
8183  * gtk_widget_override_cursor:
8184  * @widget: a #GtkWidget
8185  * @cursor: (allow-none): the color to use for primary cursor (does not need to be
8186  *     allocated), or %NULL to undo the effect of previous calls to
8187  *     of gtk_widget_override_cursor().
8188  * @secondary_cursor: (allow-none): the color to use for secondary cursor (does not
8189  *     need to be allocated), or %NULL to undo the effect of previous
8190  *     calls to of gtk_widget_override_cursor().
8191  *
8192  * Sets the cursor color to use in a widget, overriding the
8193  * #GtkWidget:cursor-color and #GtkWidget:secondary-cursor-color
8194  * style properties. All other style values are left untouched.
8195  * See also gtk_widget_modify_style().
8196  *
8197  * Note that the underlying properties have the #GdkColor type,
8198  * so the alpha value in @primary and @secondary will be ignored.
8199  *
8200  * Since: 3.0
8201  */
8202 void
8203 gtk_widget_override_cursor (GtkWidget     *widget,
8204                             const GdkRGBA *cursor,
8205                             const GdkRGBA *secondary_cursor)
8206 {
8207   GtkModifierStyle *style;
8208
8209   g_return_if_fail (GTK_IS_WIDGET (widget));
8210
8211   style = _gtk_widget_get_modifier_properties (widget);
8212   _gtk_modifier_style_set_color_property (style,
8213                                           GTK_TYPE_WIDGET,
8214                                           "cursor-color", cursor);
8215   _gtk_modifier_style_set_color_property (style,
8216                                           GTK_TYPE_WIDGET,
8217                                           "secondary-cursor-color",
8218                                           secondary_cursor);
8219 }
8220
8221 static void
8222 gtk_widget_real_direction_changed (GtkWidget        *widget,
8223                                    GtkTextDirection  previous_direction)
8224 {
8225   gtk_widget_queue_resize (widget);
8226 }
8227
8228 static void
8229 gtk_widget_real_style_set (GtkWidget *widget,
8230                            GtkStyle  *previous_style)
8231 {
8232 }
8233
8234 typedef struct {
8235   GtkWidget *previous_toplevel;
8236   GdkScreen *previous_screen;
8237   GdkScreen *new_screen;
8238 } HierarchyChangedInfo;
8239
8240 static void
8241 do_screen_change (GtkWidget *widget,
8242                   GdkScreen *old_screen,
8243                   GdkScreen *new_screen)
8244 {
8245   if (old_screen != new_screen)
8246     {
8247       GtkWidgetPrivate *priv = widget->priv;
8248
8249       if (old_screen)
8250         {
8251           PangoContext *context = g_object_get_qdata (G_OBJECT (widget), quark_pango_context);
8252           if (context)
8253             g_object_set_qdata (G_OBJECT (widget), quark_pango_context, NULL);
8254         }
8255
8256       _gtk_tooltip_hide (widget);
8257
8258       if (new_screen && priv->context)
8259         gtk_style_context_set_screen (priv->context, new_screen);
8260
8261       g_signal_emit (widget, widget_signals[SCREEN_CHANGED], 0, old_screen);
8262     }
8263 }
8264
8265 static void
8266 gtk_widget_propagate_hierarchy_changed_recurse (GtkWidget *widget,
8267                                                 gpointer   client_data)
8268 {
8269   GtkWidgetPrivate *priv = widget->priv;
8270   HierarchyChangedInfo *info = client_data;
8271   gboolean new_anchored = gtk_widget_is_toplevel (widget) ||
8272                  (priv->parent && priv->parent->priv->anchored);
8273
8274   if (priv->anchored != new_anchored)
8275     {
8276       g_object_ref (widget);
8277
8278       priv->anchored = new_anchored;
8279
8280       g_signal_emit (widget, widget_signals[HIERARCHY_CHANGED], 0, info->previous_toplevel);
8281       do_screen_change (widget, info->previous_screen, info->new_screen);
8282
8283       if (GTK_IS_CONTAINER (widget))
8284         gtk_container_forall (GTK_CONTAINER (widget),
8285                               gtk_widget_propagate_hierarchy_changed_recurse,
8286                               client_data);
8287
8288       g_object_unref (widget);
8289     }
8290 }
8291
8292 /**
8293  * _gtk_widget_propagate_hierarchy_changed:
8294  * @widget: a #GtkWidget
8295  * @previous_toplevel: Previous toplevel
8296  *
8297  * Propagates changes in the anchored state to a widget and all
8298  * children, unsetting or setting the %ANCHORED flag, and
8299  * emitting #GtkWidget::hierarchy-changed.
8300  **/
8301 void
8302 _gtk_widget_propagate_hierarchy_changed (GtkWidget *widget,
8303                                          GtkWidget *previous_toplevel)
8304 {
8305   GtkWidgetPrivate *priv = widget->priv;
8306   HierarchyChangedInfo info;
8307
8308   info.previous_toplevel = previous_toplevel;
8309   info.previous_screen = previous_toplevel ? gtk_widget_get_screen (previous_toplevel) : NULL;
8310
8311   if (gtk_widget_is_toplevel (widget) ||
8312       (priv->parent && priv->parent->priv->anchored))
8313     info.new_screen = gtk_widget_get_screen (widget);
8314   else
8315     info.new_screen = NULL;
8316
8317   if (info.previous_screen)
8318     g_object_ref (info.previous_screen);
8319   if (previous_toplevel)
8320     g_object_ref (previous_toplevel);
8321
8322   gtk_widget_propagate_hierarchy_changed_recurse (widget, &info);
8323
8324   if (previous_toplevel)
8325     g_object_unref (previous_toplevel);
8326   if (info.previous_screen)
8327     g_object_unref (info.previous_screen);
8328 }
8329
8330 static void
8331 gtk_widget_propagate_screen_changed_recurse (GtkWidget *widget,
8332                                              gpointer   client_data)
8333 {
8334   HierarchyChangedInfo *info = client_data;
8335
8336   g_object_ref (widget);
8337
8338   do_screen_change (widget, info->previous_screen, info->new_screen);
8339
8340   if (GTK_IS_CONTAINER (widget))
8341     gtk_container_forall (GTK_CONTAINER (widget),
8342                           gtk_widget_propagate_screen_changed_recurse,
8343                           client_data);
8344
8345   g_object_unref (widget);
8346 }
8347
8348 /**
8349  * gtk_widget_is_composited:
8350  * @widget: a #GtkWidget
8351  *
8352  * Whether @widget can rely on having its alpha channel
8353  * drawn correctly. On X11 this function returns whether a
8354  * compositing manager is running for @widget's screen.
8355  *
8356  * Please note that the semantics of this call will change
8357  * in the future if used on a widget that has a composited
8358  * window in its hierarchy (as set by gdk_window_set_composited()).
8359  *
8360  * Return value: %TRUE if the widget can rely on its alpha
8361  * channel being drawn correctly.
8362  *
8363  * Since: 2.10
8364  */
8365 gboolean
8366 gtk_widget_is_composited (GtkWidget *widget)
8367 {
8368   GdkScreen *screen;
8369
8370   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
8371
8372   screen = gtk_widget_get_screen (widget);
8373
8374   return gdk_screen_is_composited (screen);
8375 }
8376
8377 static void
8378 propagate_composited_changed (GtkWidget *widget,
8379                               gpointer dummy)
8380 {
8381   if (GTK_IS_CONTAINER (widget))
8382     {
8383       gtk_container_forall (GTK_CONTAINER (widget),
8384                             propagate_composited_changed,
8385                             NULL);
8386     }
8387
8388   g_signal_emit (widget, widget_signals[COMPOSITED_CHANGED], 0);
8389 }
8390
8391 void
8392 _gtk_widget_propagate_composited_changed (GtkWidget *widget)
8393 {
8394   propagate_composited_changed (widget, NULL);
8395 }
8396
8397 /**
8398  * _gtk_widget_propagate_screen_changed:
8399  * @widget: a #GtkWidget
8400  * @previous_screen: Previous screen
8401  *
8402  * Propagates changes in the screen for a widget to all
8403  * children, emitting #GtkWidget::screen-changed.
8404  **/
8405 void
8406 _gtk_widget_propagate_screen_changed (GtkWidget    *widget,
8407                                       GdkScreen    *previous_screen)
8408 {
8409   HierarchyChangedInfo info;
8410
8411   info.previous_screen = previous_screen;
8412   info.new_screen = gtk_widget_get_screen (widget);
8413
8414   if (previous_screen)
8415     g_object_ref (previous_screen);
8416
8417   gtk_widget_propagate_screen_changed_recurse (widget, &info);
8418
8419   if (previous_screen)
8420     g_object_unref (previous_screen);
8421 }
8422
8423 static void
8424 reset_style_recurse (GtkWidget *widget, gpointer data)
8425 {
8426   _gtk_widget_invalidate_style_context (widget, GTK_CSS_CHANGE_ANY);
8427
8428   if (GTK_IS_CONTAINER (widget))
8429     gtk_container_forall (GTK_CONTAINER (widget),
8430                           reset_style_recurse,
8431                           NULL);
8432 }
8433
8434 /**
8435  * gtk_widget_reset_style:
8436  * @widget: a #GtkWidget
8437  *
8438  * Updates the style context of @widget and all descendents
8439  * by updating its widget path. #GtkContainer<!-- -->s may want
8440  * to use this on a child when reordering it in a way that a different
8441  * style might apply to it. See also gtk_container_get_path_for_child().
8442  *
8443  * Since: 3.0
8444  */
8445 void
8446 gtk_widget_reset_style (GtkWidget *widget)
8447 {
8448   g_return_if_fail (GTK_IS_WIDGET (widget));
8449
8450   reset_style_recurse (widget, NULL);
8451
8452   g_list_foreach (widget->priv->attached_windows,
8453                   (GFunc) reset_style_recurse, NULL);
8454 }
8455
8456 #ifdef G_ENABLE_DEBUG
8457
8458 /* Verify invariants, see docs/widget_system.txt for notes on much of
8459  * this.  Invariants may be temporarily broken while we're in the
8460  * process of updating state, of course, so you can only
8461  * verify_invariants() after a given operation is complete.
8462  * Use push/pop_verify_invariants to help with that.
8463  */
8464 static void
8465 gtk_widget_verify_invariants (GtkWidget *widget)
8466 {
8467   GtkWidget *parent;
8468
8469   if (widget->priv->verifying_invariants_count > 0)
8470     return;
8471
8472   parent = widget->priv->parent;
8473
8474   if (widget->priv->mapped)
8475     {
8476       /* Mapped implies ... */
8477
8478       if (!widget->priv->realized)
8479         g_warning ("%s %p is mapped but not realized",
8480                    G_OBJECT_TYPE_NAME (widget), widget);
8481
8482       if (!widget->priv->visible)
8483         g_warning ("%s %p is mapped but not visible",
8484                    G_OBJECT_TYPE_NAME (widget), widget);
8485
8486       if (!widget->priv->toplevel)
8487         {
8488           if (!widget->priv->child_visible)
8489             g_warning ("%s %p is mapped but not child_visible",
8490                        G_OBJECT_TYPE_NAME (widget), widget);
8491         }
8492     }
8493   else
8494     {
8495       /* Not mapped implies... */
8496
8497 #if 0
8498   /* This check makes sense for normal toplevels, but for
8499    * something like a toplevel that is embedded within a clutter
8500    * state, mapping may depend on external factors.
8501    */
8502       if (widget->priv->toplevel)
8503         {
8504           if (widget->priv->visible)
8505             g_warning ("%s %p toplevel is visible but not mapped",
8506                        G_OBJECT_TYPE_NAME (widget), widget);
8507         }
8508 #endif
8509     }
8510
8511   /* Parent related checks aren't possible if parent has
8512    * verifying_invariants_count > 0 because parent needs to recurse
8513    * children first before the invariants will hold.
8514    */
8515   if (parent == NULL || parent->priv->verifying_invariants_count == 0)
8516     {
8517       if (parent &&
8518           parent->priv->realized)
8519         {
8520           /* Parent realized implies... */
8521
8522 #if 0
8523           /* This is in widget_system.txt but appears to fail
8524            * because there's no gtk_container_realize() that
8525            * realizes all children... instead we just lazily
8526            * wait for map to fix things up.
8527            */
8528           if (!widget->priv->realized)
8529             g_warning ("%s %p is realized but child %s %p is not realized",
8530                        G_OBJECT_TYPE_NAME (parent), parent,
8531                        G_OBJECT_TYPE_NAME (widget), widget);
8532 #endif
8533         }
8534       else if (!widget->priv->toplevel)
8535         {
8536           /* No parent or parent not realized on non-toplevel implies... */
8537
8538           if (widget->priv->realized && !widget->priv->in_reparent)
8539             g_warning ("%s %p is not realized but child %s %p is realized",
8540                        parent ? G_OBJECT_TYPE_NAME (parent) : "no parent", parent,
8541                        G_OBJECT_TYPE_NAME (widget), widget);
8542         }
8543
8544       if (parent &&
8545           parent->priv->mapped &&
8546           widget->priv->visible &&
8547           widget->priv->child_visible)
8548         {
8549           /* Parent mapped and we are visible implies... */
8550
8551           if (!widget->priv->mapped)
8552             g_warning ("%s %p is mapped but visible child %s %p is not mapped",
8553                        G_OBJECT_TYPE_NAME (parent), parent,
8554                        G_OBJECT_TYPE_NAME (widget), widget);
8555         }
8556       else if (!widget->priv->toplevel)
8557         {
8558           /* No parent or parent not mapped on non-toplevel implies... */
8559
8560           if (widget->priv->mapped && !widget->priv->in_reparent)
8561             g_warning ("%s %p is mapped but visible=%d child_visible=%d parent %s %p mapped=%d",
8562                        G_OBJECT_TYPE_NAME (widget), widget,
8563                        widget->priv->visible,
8564                        widget->priv->child_visible,
8565                        parent ? G_OBJECT_TYPE_NAME (parent) : "no parent", parent,
8566                        parent ? parent->priv->mapped : FALSE);
8567         }
8568     }
8569
8570   if (!widget->priv->realized)
8571     {
8572       /* Not realized implies... */
8573
8574 #if 0
8575       /* widget_system.txt says these hold, but they don't. */
8576       if (widget->priv->alloc_needed)
8577         g_warning ("%s %p alloc needed but not realized",
8578                    G_OBJECT_TYPE_NAME (widget), widget);
8579
8580       if (widget->priv->width_request_needed)
8581         g_warning ("%s %p width request needed but not realized",
8582                    G_OBJECT_TYPE_NAME (widget), widget);
8583
8584       if (widget->priv->height_request_needed)
8585         g_warning ("%s %p height request needed but not realized",
8586                    G_OBJECT_TYPE_NAME (widget), widget);
8587 #endif
8588     }
8589 }
8590
8591 /* The point of this push/pop is that invariants may not hold while
8592  * we're busy making changes. So we only check at the outermost call
8593  * on the call stack, after we finish updating everything.
8594  */
8595 static void
8596 gtk_widget_push_verify_invariants (GtkWidget *widget)
8597 {
8598   widget->priv->verifying_invariants_count += 1;
8599 }
8600
8601 static void
8602 gtk_widget_verify_child_invariants (GtkWidget *widget,
8603                                     gpointer   client_data)
8604 {
8605   /* We don't recurse further; this is a one-level check. */
8606   gtk_widget_verify_invariants (widget);
8607 }
8608
8609 static void
8610 gtk_widget_pop_verify_invariants (GtkWidget *widget)
8611 {
8612   g_assert (widget->priv->verifying_invariants_count > 0);
8613
8614   widget->priv->verifying_invariants_count -= 1;
8615
8616   if (widget->priv->verifying_invariants_count == 0)
8617     {
8618       gtk_widget_verify_invariants (widget);
8619
8620       if (GTK_IS_CONTAINER (widget))
8621         {
8622           /* Check one level of children, because our
8623            * push_verify_invariants() will have prevented some of the
8624            * checks. This does not recurse because if recursion is
8625            * needed, it will happen naturally as each child has a
8626            * push/pop on that child. For example if we're recursively
8627            * mapping children, we'll push/pop on each child as we map
8628            * it.
8629            */
8630           gtk_container_forall (GTK_CONTAINER (widget),
8631                                 gtk_widget_verify_child_invariants,
8632                                 NULL);
8633         }
8634     }
8635 }
8636 #endif /* G_ENABLE_DEBUG */
8637
8638 static PangoContext *
8639 gtk_widget_peek_pango_context (GtkWidget *widget)
8640 {
8641   return g_object_get_qdata (G_OBJECT (widget), quark_pango_context);
8642 }
8643
8644 /**
8645  * gtk_widget_get_pango_context:
8646  * @widget: a #GtkWidget
8647  *
8648  * Gets a #PangoContext with the appropriate font map, font description,
8649  * and base direction for this widget. Unlike the context returned
8650  * by gtk_widget_create_pango_context(), this context is owned by
8651  * the widget (it can be used until the screen for the widget changes
8652  * or the widget is removed from its toplevel), and will be updated to
8653  * match any changes to the widget's attributes.
8654  *
8655  * If you create and keep a #PangoLayout using this context, you must
8656  * deal with changes to the context by calling pango_layout_context_changed()
8657  * on the layout in response to the #GtkWidget::style-updated and
8658  * #GtkWidget::direction-changed signals for the widget.
8659  *
8660  * Return value: (transfer none): the #PangoContext for the widget.
8661  **/
8662 PangoContext *
8663 gtk_widget_get_pango_context (GtkWidget *widget)
8664 {
8665   PangoContext *context;
8666
8667   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
8668
8669   context = g_object_get_qdata (G_OBJECT (widget), quark_pango_context);
8670   if (!context)
8671     {
8672       context = gtk_widget_create_pango_context (GTK_WIDGET (widget));
8673       g_object_set_qdata_full (G_OBJECT (widget),
8674                                quark_pango_context,
8675                                context,
8676                                g_object_unref);
8677     }
8678
8679   return context;
8680 }
8681
8682 static void
8683 update_pango_context (GtkWidget    *widget,
8684                       PangoContext *context)
8685 {
8686   const PangoFontDescription *font_desc;
8687   GtkStyleContext *style_context;
8688
8689   style_context = gtk_widget_get_style_context (widget);
8690
8691   font_desc = gtk_style_context_get_font (style_context,
8692                                           gtk_widget_get_state_flags (widget));
8693
8694   pango_context_set_font_description (context, font_desc);
8695   pango_context_set_base_dir (context,
8696                               gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ?
8697                               PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL);
8698 }
8699
8700 static void
8701 gtk_widget_update_pango_context (GtkWidget *widget)
8702 {
8703   PangoContext *context = gtk_widget_peek_pango_context (widget);
8704
8705   if (context)
8706     {
8707       GdkScreen *screen;
8708
8709       update_pango_context (widget, context);
8710
8711       screen = gtk_widget_get_screen_unchecked (widget);
8712       if (screen)
8713         {
8714           pango_cairo_context_set_resolution (context,
8715                                               gdk_screen_get_resolution (screen));
8716           pango_cairo_context_set_font_options (context,
8717                                                 gdk_screen_get_font_options (screen));
8718         }
8719     }
8720 }
8721
8722 /**
8723  * gtk_widget_create_pango_context:
8724  * @widget: a #GtkWidget
8725  *
8726  * Creates a new #PangoContext with the appropriate font map,
8727  * font description, and base direction for drawing text for
8728  * this widget. See also gtk_widget_get_pango_context().
8729  *
8730  * Return value: (transfer full): the new #PangoContext
8731  **/
8732 PangoContext *
8733 gtk_widget_create_pango_context (GtkWidget *widget)
8734 {
8735   GdkScreen *screen;
8736   PangoContext *context;
8737
8738   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
8739
8740   screen = gtk_widget_get_screen_unchecked (widget);
8741   if (!screen)
8742     {
8743       GTK_NOTE (MULTIHEAD,
8744                 g_warning ("gtk_widget_create_pango_context ()) called without screen"));
8745
8746       screen = gdk_screen_get_default ();
8747     }
8748
8749   context = gdk_pango_context_get_for_screen (screen);
8750
8751   update_pango_context (widget, context);
8752   pango_context_set_language (context, gtk_get_default_language ());
8753
8754   return context;
8755 }
8756
8757 /**
8758  * gtk_widget_create_pango_layout:
8759  * @widget: a #GtkWidget
8760  * @text: text to set on the layout (can be %NULL)
8761  *
8762  * Creates a new #PangoLayout with the appropriate font map,
8763  * font description, and base direction for drawing text for
8764  * this widget.
8765  *
8766  * If you keep a #PangoLayout created in this way around, in order to
8767  * notify the layout of changes to the base direction or font of this
8768  * widget, you must call pango_layout_context_changed() in response to
8769  * the #GtkWidget::style-updated and #GtkWidget::direction-changed signals
8770  * for the widget.
8771  *
8772  * Return value: (transfer full): the new #PangoLayout
8773  **/
8774 PangoLayout *
8775 gtk_widget_create_pango_layout (GtkWidget   *widget,
8776                                 const gchar *text)
8777 {
8778   PangoLayout *layout;
8779   PangoContext *context;
8780
8781   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
8782
8783   context = gtk_widget_get_pango_context (widget);
8784   layout = pango_layout_new (context);
8785
8786   if (text)
8787     pango_layout_set_text (layout, text, -1);
8788
8789   return layout;
8790 }
8791
8792 /**
8793  * gtk_widget_render_icon_pixbuf:
8794  * @widget: a #GtkWidget
8795  * @stock_id: a stock ID
8796  * @size: (type int): a stock size. A size of (GtkIconSize)-1 means
8797  *     render at the size of the source and don't scale (if there are
8798  *     multiple source sizes, GTK+ picks one of the available sizes).
8799  *
8800  * A convenience function that uses the theme engine and style
8801  * settings for @widget to look up @stock_id and render it to
8802  * a pixbuf. @stock_id should be a stock icon ID such as
8803  * #GTK_STOCK_OPEN or #GTK_STOCK_OK. @size should be a size
8804  * such as #GTK_ICON_SIZE_MENU.
8805  *
8806  * The pixels in the returned #GdkPixbuf are shared with the rest of
8807  * the application and should not be modified. The pixbuf should be freed
8808  * after use with g_object_unref().
8809  *
8810  * Return value: (transfer full): a new pixbuf, or %NULL if the
8811  *     stock ID wasn't known
8812  *
8813  * Since: 3.0
8814  **/
8815 GdkPixbuf*
8816 gtk_widget_render_icon_pixbuf (GtkWidget   *widget,
8817                                const gchar *stock_id,
8818                                GtkIconSize  size)
8819 {
8820   GtkStyleContext *context;
8821   GtkIconSet *icon_set;
8822
8823   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
8824   g_return_val_if_fail (stock_id != NULL, NULL);
8825   g_return_val_if_fail (size > GTK_ICON_SIZE_INVALID || size == -1, NULL);
8826
8827   context = gtk_widget_get_style_context (widget);
8828   icon_set = gtk_style_context_lookup_icon_set (context, stock_id);
8829
8830   if (icon_set == NULL)
8831     return NULL;
8832
8833   return gtk_icon_set_render_icon_pixbuf (icon_set, context, size);
8834 }
8835
8836 /**
8837  * gtk_widget_set_parent_window:
8838  * @widget: a #GtkWidget.
8839  * @parent_window: the new parent window.
8840  *
8841  * Sets a non default parent window for @widget.
8842  *
8843  * For GtkWindow classes, setting a @parent_window effects whether
8844  * the window is a toplevel window or can be embedded into other
8845  * widgets.
8846  *
8847  * <note><para>
8848  * For GtkWindow classes, this needs to be called before the
8849  * window is realized.
8850  * </para></note>
8851  * 
8852  **/
8853 void
8854 gtk_widget_set_parent_window   (GtkWidget           *widget,
8855                                 GdkWindow           *parent_window)
8856 {
8857   GdkWindow *old_parent_window;
8858
8859   g_return_if_fail (GTK_IS_WIDGET (widget));
8860
8861   old_parent_window = g_object_get_qdata (G_OBJECT (widget),
8862                                           quark_parent_window);
8863
8864   if (parent_window != old_parent_window)
8865     {
8866       gboolean is_plug;
8867
8868       g_object_set_qdata (G_OBJECT (widget), quark_parent_window,
8869                           parent_window);
8870       if (old_parent_window)
8871         g_object_unref (old_parent_window);
8872       if (parent_window)
8873         g_object_ref (parent_window);
8874
8875       /* Unset toplevel flag when adding a parent window to a widget,
8876        * this is the primary entry point to allow toplevels to be
8877        * embeddable.
8878        */
8879 #ifdef GDK_WINDOWING_X11
8880       is_plug = GTK_IS_PLUG (widget);
8881 #else
8882       is_plug = FALSE;
8883 #endif
8884       if (GTK_IS_WINDOW (widget) && !is_plug)
8885         _gtk_window_set_is_toplevel (GTK_WINDOW (widget), parent_window == NULL);
8886     }
8887 }
8888
8889 /**
8890  * gtk_widget_get_parent_window:
8891  * @widget: a #GtkWidget.
8892  *
8893  * Gets @widget's parent window.
8894  *
8895  * Returns: (transfer none): the parent window of @widget.
8896  **/
8897 GdkWindow *
8898 gtk_widget_get_parent_window (GtkWidget *widget)
8899 {
8900   GtkWidgetPrivate *priv;
8901   GdkWindow *parent_window;
8902
8903   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
8904
8905   priv = widget->priv;
8906
8907   parent_window = g_object_get_qdata (G_OBJECT (widget), quark_parent_window);
8908
8909   return (parent_window != NULL) ? parent_window :
8910          (priv->parent != NULL) ? priv->parent->priv->window : NULL;
8911 }
8912
8913
8914 /**
8915  * gtk_widget_set_child_visible:
8916  * @widget: a #GtkWidget
8917  * @is_visible: if %TRUE, @widget should be mapped along with its parent.
8918  *
8919  * Sets whether @widget should be mapped along with its when its parent
8920  * is mapped and @widget has been shown with gtk_widget_show().
8921  *
8922  * The child visibility can be set for widget before it is added to
8923  * a container with gtk_widget_set_parent(), to avoid mapping
8924  * children unnecessary before immediately unmapping them. However
8925  * it will be reset to its default state of %TRUE when the widget
8926  * is removed from a container.
8927  *
8928  * Note that changing the child visibility of a widget does not
8929  * queue a resize on the widget. Most of the time, the size of
8930  * a widget is computed from all visible children, whether or
8931  * not they are mapped. If this is not the case, the container
8932  * can queue a resize itself.
8933  *
8934  * This function is only useful for container implementations and
8935  * never should be called by an application.
8936  **/
8937 void
8938 gtk_widget_set_child_visible (GtkWidget *widget,
8939                               gboolean   is_visible)
8940 {
8941   GtkWidgetPrivate *priv;
8942
8943   g_return_if_fail (GTK_IS_WIDGET (widget));
8944   g_return_if_fail (!gtk_widget_is_toplevel (widget));
8945
8946   priv = widget->priv;
8947
8948   g_object_ref (widget);
8949   gtk_widget_verify_invariants (widget);
8950
8951   if (is_visible)
8952     priv->child_visible = TRUE;
8953   else
8954     {
8955       GtkWidget *toplevel;
8956
8957       priv->child_visible = FALSE;
8958
8959       toplevel = gtk_widget_get_toplevel (widget);
8960       if (toplevel != widget && gtk_widget_is_toplevel (toplevel))
8961         _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
8962     }
8963
8964   if (priv->parent && gtk_widget_get_realized (priv->parent))
8965     {
8966       if (gtk_widget_get_mapped (priv->parent) &&
8967           priv->child_visible &&
8968           gtk_widget_get_visible (widget))
8969         gtk_widget_map (widget);
8970       else
8971         gtk_widget_unmap (widget);
8972     }
8973
8974   gtk_widget_verify_invariants (widget);
8975   g_object_unref (widget);
8976 }
8977
8978 /**
8979  * gtk_widget_get_child_visible:
8980  * @widget: a #GtkWidget
8981  *
8982  * Gets the value set with gtk_widget_set_child_visible().
8983  * If you feel a need to use this function, your code probably
8984  * needs reorganization.
8985  *
8986  * This function is only useful for container implementations and
8987  * never should be called by an application.
8988  *
8989  * Return value: %TRUE if the widget is mapped with the parent.
8990  **/
8991 gboolean
8992 gtk_widget_get_child_visible (GtkWidget *widget)
8993 {
8994   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
8995
8996   return widget->priv->child_visible;
8997 }
8998
8999 static GdkScreen *
9000 gtk_widget_get_screen_unchecked (GtkWidget *widget)
9001 {
9002   GtkWidget *toplevel;
9003
9004   toplevel = gtk_widget_get_toplevel (widget);
9005
9006   if (gtk_widget_is_toplevel (toplevel))
9007     {
9008       if (GTK_IS_WINDOW (toplevel))
9009         return gtk_window_get_screen (GTK_WINDOW (toplevel));
9010       else if (GTK_IS_INVISIBLE (toplevel))
9011         return gtk_invisible_get_screen (GTK_INVISIBLE (widget));
9012     }
9013
9014   return NULL;
9015 }
9016
9017 /**
9018  * gtk_widget_get_screen:
9019  * @widget: a #GtkWidget
9020  *
9021  * Get the #GdkScreen from the toplevel window associated with
9022  * this widget. This function can only be called after the widget
9023  * has been added to a widget hierarchy with a #GtkWindow
9024  * at the top.
9025  *
9026  * In general, you should only create screen specific
9027  * resources when a widget has been realized, and you should
9028  * free those resources when the widget is unrealized.
9029  *
9030  * Return value: (transfer none): the #GdkScreen for the toplevel for this widget.
9031  *
9032  * Since: 2.2
9033  **/
9034 GdkScreen*
9035 gtk_widget_get_screen (GtkWidget *widget)
9036 {
9037   GdkScreen *screen;
9038
9039   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9040
9041   screen = gtk_widget_get_screen_unchecked (widget);
9042
9043   if (screen)
9044     return screen;
9045   else
9046     {
9047 #if 0
9048       g_warning (G_STRLOC ": Can't get associated screen"
9049                  " for a widget unless it is inside a toplevel GtkWindow\n"
9050                  " widget type is %s associated top level type is %s",
9051                  g_type_name (G_OBJECT_TYPE(G_OBJECT (widget))),
9052                  g_type_name (G_OBJECT_TYPE(G_OBJECT (toplevel))));
9053 #endif
9054       return gdk_screen_get_default ();
9055     }
9056 }
9057
9058 /**
9059  * gtk_widget_has_screen:
9060  * @widget: a #GtkWidget
9061  *
9062  * Checks whether there is a #GdkScreen is associated with
9063  * this widget. All toplevel widgets have an associated
9064  * screen, and all widgets added into a hierarchy with a toplevel
9065  * window at the top.
9066  *
9067  * Return value: %TRUE if there is a #GdkScreen associcated
9068  *   with the widget.
9069  *
9070  * Since: 2.2
9071  **/
9072 gboolean
9073 gtk_widget_has_screen (GtkWidget *widget)
9074 {
9075   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
9076
9077   return (gtk_widget_get_screen_unchecked (widget) != NULL);
9078 }
9079
9080 /**
9081  * gtk_widget_get_display:
9082  * @widget: a #GtkWidget
9083  *
9084  * Get the #GdkDisplay for the toplevel window associated with
9085  * this widget. This function can only be called after the widget
9086  * has been added to a widget hierarchy with a #GtkWindow at the top.
9087  *
9088  * In general, you should only create display specific
9089  * resources when a widget has been realized, and you should
9090  * free those resources when the widget is unrealized.
9091  *
9092  * Return value: (transfer none): the #GdkDisplay for the toplevel for this widget.
9093  *
9094  * Since: 2.2
9095  **/
9096 GdkDisplay*
9097 gtk_widget_get_display (GtkWidget *widget)
9098 {
9099   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9100
9101   return gdk_screen_get_display (gtk_widget_get_screen (widget));
9102 }
9103
9104 /**
9105  * gtk_widget_get_root_window:
9106  * @widget: a #GtkWidget
9107  *
9108  * Get the root window where this widget is located. This function can
9109  * only be called after the widget has been added to a widget
9110  * hierarchy with #GtkWindow at the top.
9111  *
9112  * The root window is useful for such purposes as creating a popup
9113  * #GdkWindow associated with the window. In general, you should only
9114  * create display specific resources when a widget has been realized,
9115  * and you should free those resources when the widget is unrealized.
9116  *
9117  * Return value: (transfer none): the #GdkWindow root window for the toplevel for this widget.
9118  *
9119  * Since: 2.2
9120  **/
9121 GdkWindow*
9122 gtk_widget_get_root_window (GtkWidget *widget)
9123 {
9124   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9125
9126   return gdk_screen_get_root_window (gtk_widget_get_screen (widget));
9127 }
9128
9129 /**
9130  * gtk_widget_child_focus:
9131  * @widget: a #GtkWidget
9132  * @direction: direction of focus movement
9133  *
9134  * This function is used by custom widget implementations; if you're
9135  * writing an app, you'd use gtk_widget_grab_focus() to move the focus
9136  * to a particular widget, and gtk_container_set_focus_chain() to
9137  * change the focus tab order. So you may want to investigate those
9138  * functions instead.
9139  *
9140  * gtk_widget_child_focus() is called by containers as the user moves
9141  * around the window using keyboard shortcuts. @direction indicates
9142  * what kind of motion is taking place (up, down, left, right, tab
9143  * forward, tab backward). gtk_widget_child_focus() emits the
9144  * #GtkWidget::focus signal; widgets override the default handler
9145  * for this signal in order to implement appropriate focus behavior.
9146  *
9147  * The default ::focus handler for a widget should return %TRUE if
9148  * moving in @direction left the focus on a focusable location inside
9149  * that widget, and %FALSE if moving in @direction moved the focus
9150  * outside the widget. If returning %TRUE, widgets normally
9151  * call gtk_widget_grab_focus() to place the focus accordingly;
9152  * if returning %FALSE, they don't modify the current focus location.
9153  *
9154  * Return value: %TRUE if focus ended up inside @widget
9155  **/
9156 gboolean
9157 gtk_widget_child_focus (GtkWidget       *widget,
9158                         GtkDirectionType direction)
9159 {
9160   gboolean return_val;
9161
9162   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
9163
9164   if (!gtk_widget_get_visible (widget) ||
9165       !gtk_widget_is_sensitive (widget))
9166     return FALSE;
9167
9168   /* child widgets must set CAN_FOCUS, containers
9169    * don't have to though.
9170    */
9171   if (!GTK_IS_CONTAINER (widget) &&
9172       !gtk_widget_get_can_focus (widget))
9173     return FALSE;
9174
9175   g_signal_emit (widget,
9176                  widget_signals[FOCUS],
9177                  0,
9178                  direction, &return_val);
9179
9180   return return_val;
9181 }
9182
9183 /**
9184  * gtk_widget_keynav_failed:
9185  * @widget: a #GtkWidget
9186  * @direction: direction of focus movement
9187  *
9188  * This function should be called whenever keyboard navigation within
9189  * a single widget hits a boundary. The function emits the
9190  * #GtkWidget::keynav-failed signal on the widget and its return
9191  * value should be interpreted in a way similar to the return value of
9192  * gtk_widget_child_focus():
9193  *
9194  * When %TRUE is returned, stay in the widget, the failed keyboard
9195  * navigation is Ok and/or there is nowhere we can/should move the
9196  * focus to.
9197  *
9198  * When %FALSE is returned, the caller should continue with keyboard
9199  * navigation outside the widget, e.g. by calling
9200  * gtk_widget_child_focus() on the widget's toplevel.
9201  *
9202  * The default ::keynav-failed handler returns %TRUE for
9203  * %GTK_DIR_TAB_FORWARD and %GTK_DIR_TAB_BACKWARD. For the other
9204  * values of #GtkDirectionType, it looks at the
9205  * #GtkSettings:gtk-keynav-cursor-only setting and returns %FALSE
9206  * if the setting is %TRUE. This way the entire user interface
9207  * becomes cursor-navigatable on input devices such as mobile phones
9208  * which only have cursor keys but no tab key.
9209  *
9210  * Whenever the default handler returns %TRUE, it also calls
9211  * gtk_widget_error_bell() to notify the user of the failed keyboard
9212  * navigation.
9213  *
9214  * A use case for providing an own implementation of ::keynav-failed
9215  * (either by connecting to it or by overriding it) would be a row of
9216  * #GtkEntry widgets where the user should be able to navigate the
9217  * entire row with the cursor keys, as e.g. known from user interfaces
9218  * that require entering license keys.
9219  *
9220  * Return value: %TRUE if stopping keyboard navigation is fine, %FALSE
9221  *               if the emitting widget should try to handle the keyboard
9222  *               navigation attempt in its parent container(s).
9223  *
9224  * Since: 2.12
9225  **/
9226 gboolean
9227 gtk_widget_keynav_failed (GtkWidget        *widget,
9228                           GtkDirectionType  direction)
9229 {
9230   gboolean return_val;
9231
9232   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
9233
9234   g_signal_emit (widget, widget_signals[KEYNAV_FAILED], 0,
9235                  direction, &return_val);
9236
9237   return return_val;
9238 }
9239
9240 /**
9241  * gtk_widget_error_bell:
9242  * @widget: a #GtkWidget
9243  *
9244  * Notifies the user about an input-related error on this widget.
9245  * If the #GtkSettings:gtk-error-bell setting is %TRUE, it calls
9246  * gdk_window_beep(), otherwise it does nothing.
9247  *
9248  * Note that the effect of gdk_window_beep() can be configured in many
9249  * ways, depending on the windowing backend and the desktop environment
9250  * or window manager that is used.
9251  *
9252  * Since: 2.12
9253  **/
9254 void
9255 gtk_widget_error_bell (GtkWidget *widget)
9256 {
9257   GtkWidgetPrivate *priv;
9258   GtkSettings* settings;
9259   gboolean beep;
9260
9261   g_return_if_fail (GTK_IS_WIDGET (widget));
9262
9263   priv = widget->priv;
9264
9265   settings = gtk_widget_get_settings (widget);
9266   if (!settings)
9267     return;
9268
9269   g_object_get (settings,
9270                 "gtk-error-bell", &beep,
9271                 NULL);
9272
9273   if (beep && priv->window)
9274     gdk_window_beep (priv->window);
9275 }
9276
9277 static void
9278 gtk_widget_set_usize_internal (GtkWidget          *widget,
9279                                gint                width,
9280                                gint                height,
9281                                GtkQueueResizeFlags flags)
9282 {
9283   GtkWidgetAuxInfo *aux_info;
9284   gboolean changed = FALSE;
9285
9286   g_object_freeze_notify (G_OBJECT (widget));
9287
9288   aux_info = gtk_widget_get_aux_info (widget, TRUE);
9289
9290   if (width > -2 && aux_info->width != width)
9291     {
9292       if ((flags & GTK_QUEUE_RESIZE_INVALIDATE_ONLY) == 0)
9293         g_object_notify (G_OBJECT (widget), "width-request");
9294       aux_info->width = width;
9295       changed = TRUE;
9296     }
9297   if (height > -2 && aux_info->height != height)
9298     {
9299       if ((flags & GTK_QUEUE_RESIZE_INVALIDATE_ONLY) == 0)
9300         g_object_notify (G_OBJECT (widget), "height-request");
9301       aux_info->height = height;
9302       changed = TRUE;
9303     }
9304
9305   if (gtk_widget_get_visible (widget) && changed)
9306     {
9307       if ((flags & GTK_QUEUE_RESIZE_INVALIDATE_ONLY) == 0)
9308         gtk_widget_queue_resize (widget);
9309       else
9310         _gtk_size_group_queue_resize (widget, GTK_QUEUE_RESIZE_INVALIDATE_ONLY);
9311     }
9312
9313   g_object_thaw_notify (G_OBJECT (widget));
9314 }
9315
9316 /**
9317  * gtk_widget_set_size_request:
9318  * @widget: a #GtkWidget
9319  * @width: width @widget should request, or -1 to unset
9320  * @height: height @widget should request, or -1 to unset
9321  *
9322  * Sets the minimum size of a widget; that is, the widget's size
9323  * request will be @width by @height. You can use this function to
9324  * force a widget to be either larger or smaller than it normally
9325  * would be.
9326  *
9327  * In most cases, gtk_window_set_default_size() is a better choice for
9328  * toplevel windows than this function; setting the default size will
9329  * still allow users to shrink the window. Setting the size request
9330  * will force them to leave the window at least as large as the size
9331  * request. When dealing with window sizes,
9332  * gtk_window_set_geometry_hints() can be a useful function as well.
9333  *
9334  * Note the inherent danger of setting any fixed size - themes,
9335  * translations into other languages, different fonts, and user action
9336  * can all change the appropriate size for a given widget. So, it's
9337  * basically impossible to hardcode a size that will always be
9338  * correct.
9339  *
9340  * The size request of a widget is the smallest size a widget can
9341  * accept while still functioning well and drawing itself correctly.
9342  * However in some strange cases a widget may be allocated less than
9343  * its requested size, and in many cases a widget may be allocated more
9344  * space than it requested.
9345  *
9346  * If the size request in a given direction is -1 (unset), then
9347  * the "natural" size request of the widget will be used instead.
9348  *
9349  * Widgets can't actually be allocated a size less than 1 by 1, but
9350  * you can pass 0,0 to this function to mean "as small as possible."
9351  *
9352  * The size request set here does not include any margin from the
9353  * #GtkWidget properties margin-left, margin-right, margin-top, and
9354  * margin-bottom, but it does include pretty much all other padding
9355  * or border properties set by any subclass of #GtkWidget.
9356  **/
9357 void
9358 gtk_widget_set_size_request (GtkWidget *widget,
9359                              gint       width,
9360                              gint       height)
9361 {
9362   g_return_if_fail (GTK_IS_WIDGET (widget));
9363   g_return_if_fail (width >= -1);
9364   g_return_if_fail (height >= -1);
9365
9366   if (width == 0)
9367     width = 1;
9368   if (height == 0)
9369     height = 1;
9370
9371   gtk_widget_set_usize_internal (widget, width, height, 0);
9372 }
9373
9374
9375 /**
9376  * gtk_widget_get_size_request:
9377  * @widget: a #GtkWidget
9378  * @width: (out) (allow-none): return location for width, or %NULL
9379  * @height: (out) (allow-none): return location for height, or %NULL
9380  *
9381  * Gets the size request that was explicitly set for the widget using
9382  * gtk_widget_set_size_request(). A value of -1 stored in @width or
9383  * @height indicates that that dimension has not been set explicitly
9384  * and the natural requisition of the widget will be used intead. See
9385  * gtk_widget_set_size_request(). To get the size a widget will
9386  * actually request, call gtk_widget_get_preferred_size() instead of
9387  * this function.
9388  **/
9389 void
9390 gtk_widget_get_size_request (GtkWidget *widget,
9391                              gint      *width,
9392                              gint      *height)
9393 {
9394   const GtkWidgetAuxInfo *aux_info;
9395
9396   g_return_if_fail (GTK_IS_WIDGET (widget));
9397
9398   aux_info = _gtk_widget_get_aux_info_or_defaults (widget);
9399
9400   if (width)
9401     *width = aux_info->width;
9402
9403   if (height)
9404     *height = aux_info->height;
9405 }
9406
9407 /**
9408  * _gtk_widget_override_size_request:
9409  * @widget: a #GtkWidget
9410  * @width: new forced minimum width
9411  * @height: new forced minimum height
9412  * @old_width: location to store previous forced minimum width
9413  * @old_height: location to store previous forced minumum height
9414  *
9415  * Temporarily establishes a forced minimum size for a widget; this
9416  * is used by GtkWindow when calculating the size to add to the
9417  * window's geometry widget. Cached sizes for the widget and its
9418  * parents are invalidated, so that subsequent calls to the size
9419  * negotiation machinery produce the overriden result, but the
9420  * widget is not queued for relayout or redraw. The old size must
9421  * be restored with _gtk_widget_restore_size_request() or things
9422  * will go screwy.
9423  */
9424 void
9425 _gtk_widget_override_size_request (GtkWidget *widget,
9426                                    int        width,
9427                                    int        height,
9428                                    int       *old_width,
9429                                    int       *old_height)
9430 {
9431   gtk_widget_get_size_request (widget, old_width, old_height);
9432   gtk_widget_set_usize_internal (widget, width, height,
9433                                  GTK_QUEUE_RESIZE_INVALIDATE_ONLY);
9434 }
9435
9436 /**
9437  * _gtk_widget_restore_size_request:
9438  * @widget: a #GtkWidget
9439  * @old_width: saved forced minimum size
9440  * @old_height: saved forced minimum size
9441  *
9442  * Undoes the operation of_gtk_widget_override_size_request().
9443  */
9444 void
9445 _gtk_widget_restore_size_request (GtkWidget *widget,
9446                                   int        old_width,
9447                                   int        old_height)
9448 {
9449   gtk_widget_set_usize_internal (widget, old_width, old_height,
9450                                  GTK_QUEUE_RESIZE_INVALIDATE_ONLY);
9451 }
9452
9453 /**
9454  * gtk_widget_set_events:
9455  * @widget: a #GtkWidget
9456  * @events: event mask
9457  *
9458  * Sets the event mask (see #GdkEventMask) for a widget. The event
9459  * mask determines which events a widget will receive. Keep in mind
9460  * that different widgets have different default event masks, and by
9461  * changing the event mask you may disrupt a widget's functionality,
9462  * so be careful. This function must be called while a widget is
9463  * unrealized. Consider gtk_widget_add_events() for widgets that are
9464  * already realized, or if you want to preserve the existing event
9465  * mask. This function can't be used with #GTK_NO_WINDOW widgets;
9466  * to get events on those widgets, place them inside a #GtkEventBox
9467  * and receive events on the event box.
9468  **/
9469 void
9470 gtk_widget_set_events (GtkWidget *widget,
9471                        gint       events)
9472 {
9473   g_return_if_fail (GTK_IS_WIDGET (widget));
9474   g_return_if_fail (!gtk_widget_get_realized (widget));
9475
9476   g_object_set_qdata (G_OBJECT (widget), quark_event_mask,
9477                       GINT_TO_POINTER (events));
9478   g_object_notify (G_OBJECT (widget), "events");
9479 }
9480
9481 /**
9482  * gtk_widget_set_device_events:
9483  * @widget: a #GtkWidget
9484  * @device: a #GdkDevice
9485  * @events: event mask
9486  *
9487  * Sets the device event mask (see #GdkEventMask) for a widget. The event
9488  * mask determines which events a widget will receive from @device. Keep
9489  * in mind that different widgets have different default event masks, and by
9490  * changing the event mask you may disrupt a widget's functionality,
9491  * so be careful. This function must be called while a widget is
9492  * unrealized. Consider gtk_widget_add_device_events() for widgets that are
9493  * already realized, or if you want to preserve the existing event
9494  * mask. This function can't be used with #GTK_NO_WINDOW widgets;
9495  * to get events on those widgets, place them inside a #GtkEventBox
9496  * and receive events on the event box.
9497  *
9498  * Since: 3.0
9499  **/
9500 void
9501 gtk_widget_set_device_events (GtkWidget    *widget,
9502                               GdkDevice    *device,
9503                               GdkEventMask  events)
9504 {
9505   GHashTable *device_events;
9506
9507   g_return_if_fail (GTK_IS_WIDGET (widget));
9508   g_return_if_fail (GDK_IS_DEVICE (device));
9509   g_return_if_fail (!gtk_widget_get_realized (widget));
9510
9511   device_events = g_object_get_qdata (G_OBJECT (widget), quark_device_event_mask);
9512
9513   if (G_UNLIKELY (!device_events))
9514     {
9515       device_events = g_hash_table_new (NULL, NULL);
9516       g_object_set_qdata_full (G_OBJECT (widget), quark_device_event_mask, device_events,
9517                                (GDestroyNotify) g_hash_table_unref);
9518     }
9519
9520   g_hash_table_insert (device_events, device, GUINT_TO_POINTER (events));
9521 }
9522
9523 /**
9524  * gtk_widget_set_device_enabled:
9525  * @widget: a #GtkWidget
9526  * @device: a #GdkDevice
9527  * @enabled: whether to enable the device
9528  *
9529  * Enables or disables a #GdkDevice to interact with @widget
9530  * and all its children.
9531  *
9532  * It does so by descending through the #GdkWindow hierarchy
9533  * and enabling the same mask that is has for core events
9534  * (i.e. the one that gdk_window_get_events() returns).
9535  *
9536  * Since: 3.0
9537  */
9538 void
9539 gtk_widget_set_device_enabled (GtkWidget *widget,
9540                                GdkDevice *device,
9541                                gboolean   enabled)
9542 {
9543   GList *enabled_devices;
9544
9545   g_return_if_fail (GTK_IS_WIDGET (widget));
9546   g_return_if_fail (GDK_IS_DEVICE (device));
9547
9548   enabled_devices = g_object_get_qdata (G_OBJECT (widget), quark_enabled_devices);
9549   enabled_devices = g_list_append (enabled_devices, device);
9550
9551   g_object_set_qdata_full (G_OBJECT (widget), quark_enabled_devices,
9552                            enabled_devices, (GDestroyNotify) g_list_free);;
9553
9554   if (gtk_widget_get_realized (widget))
9555     gtk_widget_set_device_enabled_internal (widget, device, TRUE, enabled);
9556 }
9557
9558 /**
9559  * gtk_widget_get_device_enabled:
9560  * @widget: a #GtkWidget
9561  * @device: a #GdkDevice
9562  *
9563  * Returns whether @device can interact with @widget and its
9564  * children. See gtk_widget_set_device_enabled().
9565  *
9566  * Return value: %TRUE is @device is enabled for @widget
9567  *
9568  * Since: 3.0
9569  */
9570 gboolean
9571 gtk_widget_get_device_enabled (GtkWidget *widget,
9572                                GdkDevice *device)
9573 {
9574   GList *enabled_devices;
9575
9576   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
9577   g_return_val_if_fail (GDK_IS_DEVICE (device), FALSE);
9578
9579   enabled_devices = g_object_get_qdata (G_OBJECT (widget), quark_enabled_devices);
9580
9581   return g_list_find (enabled_devices, device) != NULL;
9582 }
9583
9584 static void
9585 gtk_widget_add_events_internal_list (GtkWidget *widget,
9586                                      GdkDevice *device,
9587                                      gint       events,
9588                                      GList     *window_list)
9589 {
9590   GList *l;
9591
9592   for (l = window_list; l != NULL; l = l->next)
9593     {
9594       GdkWindow *window = l->data;
9595       gpointer user_data;
9596
9597       gdk_window_get_user_data (window, &user_data);
9598       if (user_data == widget)
9599         {
9600           GList *children;
9601
9602           if (device)
9603             gdk_window_set_device_events (window, device, gdk_window_get_events (window) | events);
9604           else
9605             gdk_window_set_events (window, gdk_window_get_events (window) | events);
9606
9607           children = gdk_window_get_children (window);
9608           gtk_widget_add_events_internal_list (widget, device, events, children);
9609           g_list_free (children);
9610         }
9611     }
9612 }
9613
9614 static void
9615 gtk_widget_add_events_internal (GtkWidget *widget,
9616                                 GdkDevice *device,
9617                                 gint       events)
9618 {
9619   GtkWidgetPrivate *priv = widget->priv;
9620   GList *window_list;
9621
9622   if (!gtk_widget_get_has_window (widget))
9623     window_list = gdk_window_get_children (priv->window);
9624   else
9625     window_list = g_list_prepend (NULL, priv->window);
9626
9627   gtk_widget_add_events_internal_list (widget, device, events, window_list);
9628
9629   g_list_free (window_list);
9630 }
9631
9632 /**
9633  * gtk_widget_add_events:
9634  * @widget: a #GtkWidget
9635  * @events: an event mask, see #GdkEventMask
9636  *
9637  * Adds the events in the bitfield @events to the event mask for
9638  * @widget. See gtk_widget_set_events() for details.
9639  **/
9640 void
9641 gtk_widget_add_events (GtkWidget *widget,
9642                        gint       events)
9643 {
9644   gint old_events;
9645
9646   g_return_if_fail (GTK_IS_WIDGET (widget));
9647
9648   old_events = GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (widget), quark_event_mask));
9649   g_object_set_qdata (G_OBJECT (widget), quark_event_mask,
9650                       GINT_TO_POINTER (old_events | events));
9651
9652   if (gtk_widget_get_realized (widget))
9653     {
9654       gtk_widget_add_events_internal (widget, NULL, events);
9655       gtk_widget_update_devices_mask (widget, FALSE);
9656     }
9657
9658   g_object_notify (G_OBJECT (widget), "events");
9659 }
9660
9661 /**
9662  * gtk_widget_add_device_events:
9663  * @widget: a #GtkWidget
9664  * @device: a #GdkDevice
9665  * @events: an event mask, see #GdkEventMask
9666  *
9667  * Adds the device events in the bitfield @events to the event mask for
9668  * @widget. See gtk_widget_set_device_events() for details.
9669  *
9670  * Since: 3.0
9671  **/
9672 void
9673 gtk_widget_add_device_events (GtkWidget    *widget,
9674                               GdkDevice    *device,
9675                               GdkEventMask  events)
9676 {
9677   GdkEventMask old_events;
9678   GHashTable *device_events;
9679
9680   g_return_if_fail (GTK_IS_WIDGET (widget));
9681   g_return_if_fail (GDK_IS_DEVICE (device));
9682
9683   old_events = gtk_widget_get_device_events (widget, device);
9684
9685   device_events = g_object_get_qdata (G_OBJECT (widget), quark_device_event_mask);
9686
9687   if (G_UNLIKELY (!device_events))
9688     {
9689       device_events = g_hash_table_new (NULL, NULL);
9690       g_object_set_qdata_full (G_OBJECT (widget), quark_device_event_mask, device_events,
9691                                (GDestroyNotify) g_hash_table_unref);
9692     }
9693
9694   g_hash_table_insert (device_events, device,
9695                        GUINT_TO_POINTER (old_events | events));
9696
9697   if (gtk_widget_get_realized (widget))
9698     gtk_widget_add_events_internal (widget, device, events);
9699
9700   g_object_notify (G_OBJECT (widget), "events");
9701 }
9702
9703 /**
9704  * gtk_widget_get_toplevel:
9705  * @widget: a #GtkWidget
9706  *
9707  * This function returns the topmost widget in the container hierarchy
9708  * @widget is a part of. If @widget has no parent widgets, it will be
9709  * returned as the topmost widget. No reference will be added to the
9710  * returned widget; it should not be unreferenced.
9711  *
9712  * Note the difference in behavior vs. gtk_widget_get_ancestor();
9713  * <literal>gtk_widget_get_ancestor (widget, GTK_TYPE_WINDOW)</literal>
9714  * would return
9715  * %NULL if @widget wasn't inside a toplevel window, and if the
9716  * window was inside a #GtkWindow-derived widget which was in turn
9717  * inside the toplevel #GtkWindow. While the second case may
9718  * seem unlikely, it actually happens when a #GtkPlug is embedded
9719  * inside a #GtkSocket within the same application.
9720  *
9721  * To reliably find the toplevel #GtkWindow, use
9722  * gtk_widget_get_toplevel() and check if the %TOPLEVEL flags
9723  * is set on the result.
9724  * |[
9725  *  GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
9726  *  if (gtk_widget_is_toplevel (toplevel))
9727  *    {
9728  *      /&ast; Perform action on toplevel. &ast;/
9729  *    }
9730  * ]|
9731  *
9732  * Return value: (transfer none): the topmost ancestor of @widget, or @widget itself
9733  *    if there's no ancestor.
9734  **/
9735 GtkWidget*
9736 gtk_widget_get_toplevel (GtkWidget *widget)
9737 {
9738   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9739
9740   while (widget->priv->parent)
9741     widget = widget->priv->parent;
9742
9743   return widget;
9744 }
9745
9746 /**
9747  * gtk_widget_get_ancestor:
9748  * @widget: a #GtkWidget
9749  * @widget_type: ancestor type
9750  *
9751  * Gets the first ancestor of @widget with type @widget_type. For example,
9752  * <literal>gtk_widget_get_ancestor (widget, GTK_TYPE_BOX)</literal> gets
9753  * the first #GtkBox that's an ancestor of @widget. No reference will be
9754  * added to the returned widget; it should not be unreferenced. See note
9755  * about checking for a toplevel #GtkWindow in the docs for
9756  * gtk_widget_get_toplevel().
9757  *
9758  * Note that unlike gtk_widget_is_ancestor(), gtk_widget_get_ancestor()
9759  * considers @widget to be an ancestor of itself.
9760  *
9761  * Return value: (transfer none): the ancestor widget, or %NULL if not found
9762  **/
9763 GtkWidget*
9764 gtk_widget_get_ancestor (GtkWidget *widget,
9765                          GType      widget_type)
9766 {
9767   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9768
9769   while (widget && !g_type_is_a (G_OBJECT_TYPE (widget), widget_type))
9770     widget = widget->priv->parent;
9771
9772   if (!(widget && g_type_is_a (G_OBJECT_TYPE (widget), widget_type)))
9773     return NULL;
9774
9775   return widget;
9776 }
9777
9778 /**
9779  * gtk_widget_set_visual:
9780  * @widget: a #GtkWidget
9781  * @visual: visual to be used or %NULL to unset a previous one
9782  *
9783  * Sets the visual that should be used for by widget and its children for
9784  * creating #GdkWindows. The visual must be on the same #GdkScreen as
9785  * returned by gdk_widget_get_screen(), so handling the
9786  * #GtkWidget::screen-changed signal is necessary.
9787  *
9788  * Setting a new @visual will not cause @widget to recreate its windows,
9789  * so you should call this function before @widget is realized.
9790  **/
9791 void
9792 gtk_widget_set_visual (GtkWidget *widget,
9793                        GdkVisual *visual)
9794 {
9795   g_return_if_fail (GTK_IS_WIDGET (widget));
9796   g_return_if_fail (visual == NULL || GDK_IS_VISUAL (visual));
9797   if (visual)
9798     {
9799       g_return_if_fail (gtk_widget_get_screen (widget) == gdk_visual_get_screen (visual));
9800     }
9801
9802   g_object_set_qdata_full (G_OBJECT (widget),
9803                            quark_visual,
9804                            g_object_ref (visual),
9805                            g_object_unref);
9806 }
9807
9808 /**
9809  * gtk_widget_get_visual:
9810  * @widget: a #GtkWidget
9811  *
9812  * Gets the visual that will be used to render @widget.
9813  *
9814  * Return value: (transfer none): the visual for @widget
9815  **/
9816 GdkVisual*
9817 gtk_widget_get_visual (GtkWidget *widget)
9818 {
9819   GtkWidget *w;
9820   GdkVisual *visual;
9821   GdkScreen *screen;
9822
9823   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9824
9825   if (gtk_widget_get_has_window (widget) &&
9826       widget->priv->window)
9827     return gdk_window_get_visual (widget->priv->window);
9828
9829   screen = gtk_widget_get_screen (widget);
9830
9831   for (w = widget; w != NULL; w = w->priv->parent)
9832     {
9833       visual = g_object_get_qdata (G_OBJECT (w), quark_visual);
9834       if (visual)
9835         {
9836           if (gdk_visual_get_screen (visual) == screen)
9837             return visual;
9838
9839           g_warning ("Ignoring visual set on widget `%s' that is not on the correct screen.",
9840                      gtk_widget_get_name (widget));
9841         }
9842     }
9843
9844   return gdk_screen_get_system_visual (screen);
9845 }
9846
9847 /**
9848  * gtk_widget_get_settings:
9849  * @widget: a #GtkWidget
9850  *
9851  * Gets the settings object holding the settings used for this widget.
9852  *
9853  * Note that this function can only be called when the #GtkWidget
9854  * is attached to a toplevel, since the settings object is specific
9855  * to a particular #GdkScreen.
9856  *
9857  * Return value: (transfer none): the relevant #GtkSettings object
9858  */
9859 GtkSettings*
9860 gtk_widget_get_settings (GtkWidget *widget)
9861 {
9862   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9863
9864   return gtk_settings_get_for_screen (gtk_widget_get_screen (widget));
9865 }
9866
9867 /**
9868  * gtk_widget_get_events:
9869  * @widget: a #GtkWidget
9870  *
9871  * Returns the event mask for the widget (a bitfield containing flags
9872  * from the #GdkEventMask enumeration). These are the events that the widget
9873  * will receive.
9874  *
9875  * Return value: event mask for @widget
9876  **/
9877 gint
9878 gtk_widget_get_events (GtkWidget *widget)
9879 {
9880   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
9881
9882   return GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (widget), quark_event_mask));
9883 }
9884
9885 /**
9886  * gtk_widget_get_device_events:
9887  * @widget: a #GtkWidget
9888  * @device: a #GdkDevice
9889  *
9890  * Returns the events mask for the widget corresponding to an specific device. These
9891  * are the events that the widget will receive when @device operates on it.
9892  *
9893  * Returns: device event mask for @widget
9894  *
9895  * Since: 3.0
9896  **/
9897 GdkEventMask
9898 gtk_widget_get_device_events (GtkWidget *widget,
9899                               GdkDevice *device)
9900 {
9901   GHashTable *device_events;
9902
9903   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
9904   g_return_val_if_fail (GDK_IS_DEVICE (device), 0);
9905
9906   device_events = g_object_get_qdata (G_OBJECT (widget), quark_device_event_mask);
9907
9908   if (!device_events)
9909     return 0;
9910
9911   return GPOINTER_TO_UINT (g_hash_table_lookup (device_events, device));
9912 }
9913
9914 /**
9915  * gtk_widget_get_pointer:
9916  * @widget: a #GtkWidget
9917  * @x: (out) (allow-none): return location for the X coordinate, or %NULL
9918  * @y: (out) (allow-none): return location for the Y coordinate, or %NULL
9919  *
9920  * Obtains the location of the mouse pointer in widget coordinates.
9921  * Widget coordinates are a bit odd; for historical reasons, they are
9922  * defined as @widget->window coordinates for widgets that are not
9923  * #GTK_NO_WINDOW widgets, and are relative to @widget->allocation.x,
9924  * @widget->allocation.y for widgets that are #GTK_NO_WINDOW widgets.
9925  *
9926  * Deprecated: 3.4: Use gdk_window_get_device_position() instead.
9927  **/
9928 void
9929 gtk_widget_get_pointer (GtkWidget *widget,
9930                         gint      *x,
9931                         gint      *y)
9932 {
9933   GtkWidgetPrivate *priv;
9934
9935   g_return_if_fail (GTK_IS_WIDGET (widget));
9936
9937   priv = widget->priv;
9938
9939   if (x)
9940     *x = -1;
9941   if (y)
9942     *y = -1;
9943
9944   if (gtk_widget_get_realized (widget))
9945     {
9946       gdk_window_get_device_position (priv->window,
9947                                       gdk_device_manager_get_client_pointer (
9948                                         gdk_display_get_device_manager (
9949                                           gtk_widget_get_display (widget))),
9950                                       x, y, NULL);
9951
9952       if (!gtk_widget_get_has_window (widget))
9953         {
9954           if (x)
9955             *x -= priv->allocation.x;
9956           if (y)
9957             *y -= priv->allocation.y;
9958         }
9959     }
9960 }
9961
9962 /**
9963  * gtk_widget_is_ancestor:
9964  * @widget: a #GtkWidget
9965  * @ancestor: another #GtkWidget
9966  *
9967  * Determines whether @widget is somewhere inside @ancestor, possibly with
9968  * intermediate containers.
9969  *
9970  * Return value: %TRUE if @ancestor contains @widget as a child,
9971  *    grandchild, great grandchild, etc.
9972  **/
9973 gboolean
9974 gtk_widget_is_ancestor (GtkWidget *widget,
9975                         GtkWidget *ancestor)
9976 {
9977   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
9978   g_return_val_if_fail (ancestor != NULL, FALSE);
9979
9980   while (widget)
9981     {
9982       if (widget->priv->parent == ancestor)
9983         return TRUE;
9984       widget = widget->priv->parent;
9985     }
9986
9987   return FALSE;
9988 }
9989
9990 static GQuark quark_composite_name = 0;
9991
9992 /**
9993  * gtk_widget_set_composite_name:
9994  * @widget: a #GtkWidget.
9995  * @name: the name to set
9996  *
9997  * Sets a widgets composite name. The widget must be
9998  * a composite child of its parent; see gtk_widget_push_composite_child().
9999  **/
10000 void
10001 gtk_widget_set_composite_name (GtkWidget   *widget,
10002                                const gchar *name)
10003 {
10004   g_return_if_fail (GTK_IS_WIDGET (widget));
10005   g_return_if_fail (widget->priv->composite_child);
10006   g_return_if_fail (name != NULL);
10007
10008   if (!quark_composite_name)
10009     quark_composite_name = g_quark_from_static_string ("gtk-composite-name");
10010
10011   g_object_set_qdata_full (G_OBJECT (widget),
10012                            quark_composite_name,
10013                            g_strdup (name),
10014                            g_free);
10015 }
10016
10017 /**
10018  * gtk_widget_get_composite_name:
10019  * @widget: a #GtkWidget
10020  *
10021  * Obtains the composite name of a widget.
10022  *
10023  * Returns: the composite name of @widget, or %NULL if @widget is not
10024  *   a composite child. The string should be freed when it is no
10025  *   longer needed.
10026  **/
10027 gchar*
10028 gtk_widget_get_composite_name (GtkWidget *widget)
10029 {
10030   GtkWidgetPrivate *priv;
10031
10032   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
10033
10034   priv = widget->priv;
10035
10036   if (widget->priv->composite_child && priv->parent)
10037     return _gtk_container_child_composite_name (GTK_CONTAINER (priv->parent),
10038                                                widget);
10039   else
10040     return NULL;
10041 }
10042
10043 /**
10044  * gtk_widget_push_composite_child:
10045  *
10046  * Makes all newly-created widgets as composite children until
10047  * the corresponding gtk_widget_pop_composite_child() call.
10048  *
10049  * A composite child is a child that's an implementation detail of the
10050  * container it's inside and should not be visible to people using the
10051  * container. Composite children aren't treated differently by GTK (but
10052  * see gtk_container_foreach() vs. gtk_container_forall()), but e.g. GUI
10053  * builders might want to treat them in a different way.
10054  *
10055  * Here is a simple example:
10056  * |[
10057  *   gtk_widget_push_composite_child ();
10058  *   scrolled_window->hscrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadjustment);
10059  *   gtk_widget_set_composite_name (scrolled_window->hscrollbar, "hscrollbar");
10060  *   gtk_widget_pop_composite_child ();
10061  *   gtk_widget_set_parent (scrolled_window->hscrollbar,
10062  *                          GTK_WIDGET (scrolled_window));
10063  *   g_object_ref (scrolled_window->hscrollbar);
10064  * ]|
10065  **/
10066 void
10067 gtk_widget_push_composite_child (void)
10068 {
10069   composite_child_stack++;
10070 }
10071
10072 /**
10073  * gtk_widget_pop_composite_child:
10074  *
10075  * Cancels the effect of a previous call to gtk_widget_push_composite_child().
10076  **/
10077 void
10078 gtk_widget_pop_composite_child (void)
10079 {
10080   if (composite_child_stack)
10081     composite_child_stack--;
10082 }
10083
10084 static void
10085 gtk_widget_emit_direction_changed (GtkWidget        *widget,
10086                                    GtkTextDirection  old_dir)
10087 {
10088   gtk_widget_update_pango_context (widget);
10089
10090   if (widget->priv->context)
10091     gtk_style_context_set_direction (widget->priv->context,
10092                                      gtk_widget_get_direction (widget));
10093
10094   g_signal_emit (widget, widget_signals[DIRECTION_CHANGED], 0, old_dir);
10095 }
10096
10097 /**
10098  * gtk_widget_set_direction:
10099  * @widget: a #GtkWidget
10100  * @dir:    the new direction
10101  *
10102  * Sets the reading direction on a particular widget. This direction
10103  * controls the primary direction for widgets containing text,
10104  * and also the direction in which the children of a container are
10105  * packed. The ability to set the direction is present in order
10106  * so that correct localization into languages with right-to-left
10107  * reading directions can be done. Generally, applications will
10108  * let the default reading direction present, except for containers
10109  * where the containers are arranged in an order that is explicitely
10110  * visual rather than logical (such as buttons for text justification).
10111  *
10112  * If the direction is set to %GTK_TEXT_DIR_NONE, then the value
10113  * set by gtk_widget_set_default_direction() will be used.
10114  **/
10115 void
10116 gtk_widget_set_direction (GtkWidget        *widget,
10117                           GtkTextDirection  dir)
10118 {
10119   GtkTextDirection old_dir;
10120
10121   g_return_if_fail (GTK_IS_WIDGET (widget));
10122   g_return_if_fail (dir >= GTK_TEXT_DIR_NONE && dir <= GTK_TEXT_DIR_RTL);
10123
10124   old_dir = gtk_widget_get_direction (widget);
10125
10126   widget->priv->direction = dir;
10127
10128   if (old_dir != gtk_widget_get_direction (widget))
10129     gtk_widget_emit_direction_changed (widget, old_dir);
10130 }
10131
10132 /**
10133  * gtk_widget_get_direction:
10134  * @widget: a #GtkWidget
10135  *
10136  * Gets the reading direction for a particular widget. See
10137  * gtk_widget_set_direction().
10138  *
10139  * Return value: the reading direction for the widget.
10140  **/
10141 GtkTextDirection
10142 gtk_widget_get_direction (GtkWidget *widget)
10143 {
10144   g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_TEXT_DIR_LTR);
10145
10146   if (widget->priv->direction == GTK_TEXT_DIR_NONE)
10147     return gtk_default_direction;
10148   else
10149     return widget->priv->direction;
10150 }
10151
10152 static void
10153 gtk_widget_set_default_direction_recurse (GtkWidget *widget, gpointer data)
10154 {
10155   GtkTextDirection old_dir = GPOINTER_TO_UINT (data);
10156
10157   g_object_ref (widget);
10158
10159   if (widget->priv->direction == GTK_TEXT_DIR_NONE)
10160     gtk_widget_emit_direction_changed (widget, old_dir);
10161
10162   if (GTK_IS_CONTAINER (widget))
10163     gtk_container_forall (GTK_CONTAINER (widget),
10164                           gtk_widget_set_default_direction_recurse,
10165                           data);
10166
10167   g_object_unref (widget);
10168 }
10169
10170 /**
10171  * gtk_widget_set_default_direction:
10172  * @dir: the new default direction. This cannot be
10173  *        %GTK_TEXT_DIR_NONE.
10174  *
10175  * Sets the default reading direction for widgets where the
10176  * direction has not been explicitly set by gtk_widget_set_direction().
10177  **/
10178 void
10179 gtk_widget_set_default_direction (GtkTextDirection dir)
10180 {
10181   g_return_if_fail (dir == GTK_TEXT_DIR_RTL || dir == GTK_TEXT_DIR_LTR);
10182
10183   if (dir != gtk_default_direction)
10184     {
10185       GList *toplevels, *tmp_list;
10186       GtkTextDirection old_dir = gtk_default_direction;
10187
10188       gtk_default_direction = dir;
10189
10190       tmp_list = toplevels = gtk_window_list_toplevels ();
10191       g_list_foreach (toplevels, (GFunc)g_object_ref, NULL);
10192
10193       while (tmp_list)
10194         {
10195           gtk_widget_set_default_direction_recurse (tmp_list->data,
10196                                                     GUINT_TO_POINTER (old_dir));
10197           g_object_unref (tmp_list->data);
10198           tmp_list = tmp_list->next;
10199         }
10200
10201       g_list_free (toplevels);
10202     }
10203 }
10204
10205 /**
10206  * gtk_widget_get_default_direction:
10207  *
10208  * Obtains the current default reading direction. See
10209  * gtk_widget_set_default_direction().
10210  *
10211  * Return value: the current default direction.
10212  **/
10213 GtkTextDirection
10214 gtk_widget_get_default_direction (void)
10215 {
10216   return gtk_default_direction;
10217 }
10218
10219 static void
10220 gtk_widget_constructed (GObject *object)
10221 {
10222   GtkWidget *widget = GTK_WIDGET (object);
10223   GtkWidgetPrivate *priv = widget->priv;
10224
10225   /* As strange as it may seem, this may happen on object construction.
10226    * init() implementations of parent types may eventually call this function,
10227    * each with its corresponding GType, which could leave a child
10228    * implementation with a wrong widget type in the widget path
10229    */
10230   if (priv->path &&
10231       G_OBJECT_TYPE (widget) != gtk_widget_path_get_object_type (priv->path))
10232     {
10233       gtk_widget_path_free (priv->path);
10234       priv->path = NULL;
10235     }
10236
10237   G_OBJECT_CLASS (gtk_widget_parent_class)->constructed (object);
10238 }
10239
10240 static void
10241 gtk_widget_dispose (GObject *object)
10242 {
10243   GtkWidget *widget = GTK_WIDGET (object);
10244   GtkWidgetPrivate *priv = widget->priv;
10245
10246   if (priv->parent)
10247     gtk_container_remove (GTK_CONTAINER (priv->parent), widget);
10248   else if (gtk_widget_get_visible (widget))
10249     gtk_widget_hide (widget);
10250
10251   priv->visible = FALSE;
10252   if (gtk_widget_get_realized (widget))
10253     gtk_widget_unrealize (widget);
10254
10255   if (!priv->in_destruction)
10256     {
10257       priv->in_destruction = TRUE;
10258       g_signal_emit (object, widget_signals[DESTROY], 0);
10259       priv->in_destruction = FALSE;
10260     }
10261
10262   G_OBJECT_CLASS (gtk_widget_parent_class)->dispose (object);
10263 }
10264
10265 static void
10266 gtk_widget_real_destroy (GtkWidget *object)
10267 {
10268   /* gtk_object_destroy() will already hold a refcount on object */
10269   GtkWidget *widget = GTK_WIDGET (object);
10270   GtkWidgetPrivate *priv = widget->priv;
10271
10272   if (GTK_WIDGET_GET_CLASS (widget)->priv->accessible_type != GTK_TYPE_ACCESSIBLE)
10273     {
10274       GtkAccessible *accessible = g_object_steal_qdata (G_OBJECT (widget), quark_accessible_object);
10275       
10276       if (accessible)
10277         {
10278           gtk_accessible_set_widget (accessible, NULL);
10279           g_object_unref (accessible);
10280         }
10281     }
10282
10283   /* wipe accelerator closures (keep order) */
10284   g_object_set_qdata (G_OBJECT (widget), quark_accel_path, NULL);
10285   g_object_set_qdata (G_OBJECT (widget), quark_accel_closures, NULL);
10286
10287   /* Callers of add_mnemonic_label() should disconnect on ::destroy */
10288   g_object_set_qdata (G_OBJECT (widget), quark_mnemonic_labels, NULL);
10289
10290   gtk_grab_remove (widget);
10291
10292   if (priv->style)
10293     g_object_unref (priv->style);
10294   priv->style = gtk_widget_get_default_style ();
10295   g_object_ref (priv->style);
10296 }
10297
10298 static void
10299 gtk_widget_finalize (GObject *object)
10300 {
10301   GtkWidget *widget = GTK_WIDGET (object);
10302   GtkWidgetPrivate *priv = widget->priv;
10303   GtkWidgetAuxInfo *aux_info;
10304   GtkAccessible *accessible;
10305
10306   gtk_grab_remove (widget);
10307
10308   g_object_unref (priv->style);
10309   priv->style = NULL;
10310
10311   g_free (priv->name);
10312
10313   aux_info = gtk_widget_get_aux_info (widget, FALSE);
10314   if (aux_info)
10315     gtk_widget_aux_info_destroy (aux_info);
10316
10317   accessible = g_object_get_qdata (G_OBJECT (widget), quark_accessible_object);
10318   if (accessible)
10319     g_object_unref (accessible);
10320
10321   if (priv->path)
10322     gtk_widget_path_free (priv->path);
10323
10324   if (priv->context)
10325     {
10326       _gtk_style_context_set_widget (priv->context, NULL);
10327       g_object_unref (priv->context);
10328     }
10329
10330   _gtk_widget_free_cached_sizes (widget);
10331
10332   if (g_object_is_floating (object))
10333     g_warning ("A floating object was finalized. This means that someone\n"
10334                "called g_object_unref() on an object that had only a floating\n"
10335                "reference; the initial floating reference is not owned by anyone\n"
10336                "and must be removed with g_object_ref_sink().");
10337
10338   G_OBJECT_CLASS (gtk_widget_parent_class)->finalize (object);
10339 }
10340
10341 /*****************************************
10342  * gtk_widget_real_map:
10343  *
10344  *   arguments:
10345  *
10346  *   results:
10347  *****************************************/
10348
10349 static void
10350 gtk_widget_real_map (GtkWidget *widget)
10351 {
10352   GtkWidgetPrivate *priv = widget->priv;
10353
10354   g_assert (gtk_widget_get_realized (widget));
10355
10356   if (!gtk_widget_get_mapped (widget))
10357     {
10358       gtk_widget_set_mapped (widget, TRUE);
10359
10360       if (gtk_widget_get_has_window (widget))
10361         gdk_window_show (priv->window);
10362     }
10363 }
10364
10365 /*****************************************
10366  * gtk_widget_real_unmap:
10367  *
10368  *   arguments:
10369  *
10370  *   results:
10371  *****************************************/
10372
10373 static void
10374 gtk_widget_real_unmap (GtkWidget *widget)
10375 {
10376   GtkWidgetPrivate *priv = widget->priv;
10377
10378   if (gtk_widget_get_mapped (widget))
10379     {
10380       gtk_widget_set_mapped (widget, FALSE);
10381
10382       if (gtk_widget_get_has_window (widget))
10383         gdk_window_hide (priv->window);
10384     }
10385 }
10386
10387 /*****************************************
10388  * gtk_widget_real_realize:
10389  *
10390  *   arguments:
10391  *
10392  *   results:
10393  *****************************************/
10394
10395 static void
10396 gtk_widget_real_realize (GtkWidget *widget)
10397 {
10398   GtkWidgetPrivate *priv = widget->priv;
10399
10400   g_assert (!gtk_widget_get_has_window (widget));
10401
10402   gtk_widget_set_realized (widget, TRUE);
10403   if (priv->parent)
10404     {
10405       priv->window = gtk_widget_get_parent_window (widget);
10406       g_object_ref (priv->window);
10407     }
10408 }
10409
10410 /*****************************************
10411  * gtk_widget_real_unrealize:
10412  *
10413  *   arguments:
10414  *
10415  *   results:
10416  *****************************************/
10417
10418 static void
10419 gtk_widget_real_unrealize (GtkWidget *widget)
10420 {
10421   GtkWidgetPrivate *priv = widget->priv;
10422
10423   g_assert (!widget->priv->mapped);
10424
10425   /* printf ("unrealizing %s\n", g_type_name (G_TYPE_FROM_INSTANCE (widget)));
10426    */
10427
10428    /* We must do unrealize child widget BEFORE container widget.
10429     * gdk_window_destroy() destroys specified xwindow and its sub-xwindows.
10430     * So, unrealizing container widget bofore its children causes the problem
10431     * (for example, gdk_ic_destroy () with destroyed window causes crash. )
10432     */
10433
10434   if (GTK_IS_CONTAINER (widget))
10435     gtk_container_forall (GTK_CONTAINER (widget),
10436                           (GtkCallback) gtk_widget_unrealize,
10437                           NULL);
10438
10439   if (gtk_widget_get_has_window (widget))
10440     {
10441       gdk_window_set_user_data (priv->window, NULL);
10442       gdk_window_destroy (priv->window);
10443       priv->window = NULL;
10444     }
10445   else
10446     {
10447       g_object_unref (priv->window);
10448       priv->window = NULL;
10449     }
10450
10451   gtk_selection_remove_all (widget);
10452
10453   gtk_widget_set_realized (widget, FALSE);
10454 }
10455
10456 static void
10457 gtk_widget_real_adjust_size_request (GtkWidget         *widget,
10458                                      GtkOrientation     orientation,
10459                                      gint              *minimum_size,
10460                                      gint              *natural_size)
10461 {
10462   const GtkWidgetAuxInfo *aux_info;
10463
10464   aux_info =_gtk_widget_get_aux_info_or_defaults (widget);
10465
10466   if (orientation == GTK_ORIENTATION_HORIZONTAL &&
10467       aux_info->width > 0)
10468     {
10469       *minimum_size = MAX (*minimum_size, aux_info->width);
10470     }
10471   else if (orientation == GTK_ORIENTATION_VERTICAL &&
10472            aux_info->height > 0)
10473     {
10474       *minimum_size = MAX (*minimum_size, aux_info->height);
10475     }
10476
10477   /* Fix it if set_size_request made natural size smaller than min size.
10478    * This would also silently fix broken widgets, but we warn about them
10479    * in gtksizerequest.c when calling their size request vfuncs.
10480    */
10481   *natural_size = MAX (*natural_size, *minimum_size);
10482
10483   if (orientation == GTK_ORIENTATION_HORIZONTAL)
10484     {
10485       *minimum_size += (aux_info->margin.left + aux_info->margin.right);
10486       *natural_size += (aux_info->margin.left + aux_info->margin.right);
10487     }
10488   else
10489     {
10490       *minimum_size += (aux_info->margin.top + aux_info->margin.bottom);
10491       *natural_size += (aux_info->margin.top + aux_info->margin.bottom);
10492     }
10493 }
10494
10495 /**
10496  * _gtk_widget_peek_request_cache:
10497  *
10498  * Returns the address of the widget's request cache (strictly for
10499  * internal use in gtksizerequest.c)
10500  *
10501  * Return value: the address of @widget's size request cache.
10502  **/
10503 gpointer
10504 _gtk_widget_peek_request_cache (GtkWidget *widget)
10505 {
10506   /* Don't bother slowing things down with the return_if_fail guards here */
10507   return &widget->priv->requests;
10508 }
10509
10510 /*
10511  * _gtk_widget_set_device_window:
10512  * @widget: a #GtkWidget
10513  * @device: a #GdkDevice
10514  * @window: the new device window
10515  *
10516  * Sets pointer window for @widget and @device.
10517  * Does not ref @window.
10518  */
10519 void
10520 _gtk_widget_set_device_window (GtkWidget *widget,
10521                                GdkDevice *device,
10522                                GdkWindow *window)
10523 {
10524   GHashTable *device_window;
10525
10526   g_return_if_fail (GTK_IS_WIDGET (widget));
10527   g_return_if_fail (GDK_IS_DEVICE (device));
10528   g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
10529
10530   if (!gtk_widget_get_mapped (widget))
10531     return;
10532
10533   device_window = g_object_get_qdata (G_OBJECT (widget), quark_pointer_window);
10534
10535   if (!device_window && window)
10536     {
10537       device_window = g_hash_table_new (NULL, NULL);
10538       g_object_set_qdata_full (G_OBJECT (widget),
10539                                quark_pointer_window,
10540                                device_window,
10541                                (GDestroyNotify) g_hash_table_destroy);
10542     }
10543
10544   if (window)
10545     g_hash_table_insert (device_window, device, window);
10546   else if (device_window)
10547     {
10548       g_hash_table_remove (device_window, device);
10549
10550       if (g_hash_table_size (device_window) == 0)
10551         g_object_set_qdata (G_OBJECT (widget), quark_pointer_window, NULL);
10552     }
10553 }
10554
10555 /*
10556  * _gtk_widget_get_device_window:
10557  * @widget: a #GtkWidget
10558  * @device: a #GdkDevice
10559  *
10560  * Return value: the device window set on @widget, or %NULL
10561  */
10562 GdkWindow *
10563 _gtk_widget_get_device_window (GtkWidget *widget,
10564                                GdkDevice *device)
10565 {
10566   GHashTable *device_window;
10567
10568   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
10569   g_return_val_if_fail (GDK_IS_DEVICE (device), NULL);
10570
10571   if (!gtk_widget_get_mapped (widget))
10572     return NULL;
10573
10574   device_window = g_object_get_qdata (G_OBJECT (widget), quark_pointer_window);
10575
10576   if (!device_window)
10577     return NULL;
10578
10579   return g_hash_table_lookup (device_window, device);
10580 }
10581
10582 /*
10583  * _gtk_widget_list_devices:
10584  * @widget: a #GtkWidget
10585  *
10586  * Returns the list of #GdkDevices that is currently on top
10587  * of any window belonging to @widget.
10588  * Free the list with g_list_free(), the elements are owned
10589  * by GTK+ and must not be freed.
10590  */
10591 GList *
10592 _gtk_widget_list_devices (GtkWidget *widget)
10593 {
10594   GHashTableIter iter;
10595   GHashTable *device_window;
10596   GList *devices = NULL;
10597   gpointer key, value;
10598
10599   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
10600
10601   if (!gtk_widget_get_mapped (widget))
10602     return NULL;
10603
10604   device_window = g_object_get_qdata (G_OBJECT (widget), quark_pointer_window);
10605
10606   if (G_UNLIKELY (!device_window))
10607     return NULL;
10608
10609   g_hash_table_iter_init (&iter, device_window);
10610
10611   while (g_hash_table_iter_next (&iter, &key, &value))
10612     devices = g_list_prepend (devices, key);
10613
10614   return devices;
10615 }
10616
10617 static void
10618 synth_crossing (GtkWidget       *widget,
10619                 GdkEventType     type,
10620                 GdkWindow       *window,
10621                 GdkDevice       *device,
10622                 GdkCrossingMode  mode,
10623                 GdkNotifyType    detail)
10624 {
10625   GdkEvent *event;
10626
10627   event = gdk_event_new (type);
10628
10629   event->crossing.window = g_object_ref (window);
10630   event->crossing.send_event = TRUE;
10631   event->crossing.subwindow = g_object_ref (window);
10632   event->crossing.time = GDK_CURRENT_TIME;
10633   event->crossing.x = event->crossing.y = 0;
10634   event->crossing.x_root = event->crossing.y_root = 0;
10635   event->crossing.mode = mode;
10636   event->crossing.detail = detail;
10637   event->crossing.focus = FALSE;
10638   event->crossing.state = 0;
10639   gdk_event_set_device (event, device);
10640
10641   if (!widget)
10642     widget = gtk_get_event_widget (event);
10643
10644   if (widget)
10645     gtk_widget_event_internal (widget, event);
10646
10647   gdk_event_free (event);
10648 }
10649
10650 /*
10651  * _gtk_widget_synthesize_crossing:
10652  * @from: the #GtkWidget the virtual pointer is leaving.
10653  * @to: the #GtkWidget the virtual pointer is moving to.
10654  * @mode: the #GdkCrossingMode to place on the synthesized events.
10655  *
10656  * Generate crossing event(s) on widget state (sensitivity) or GTK+ grab change.
10657  *
10658  * The real pointer window is the window that most recently received an enter notify
10659  * event.  Windows that don't select for crossing events can't become the real
10660  * poiner window.  The real pointer widget that owns the real pointer window.  The
10661  * effective pointer window is the same as the real pointer window unless the real
10662  * pointer widget is either insensitive or there is a grab on a widget that is not
10663  * an ancestor of the real pointer widget (in which case the effective pointer
10664  * window should be the root window).
10665  *
10666  * When the effective pointer window is the same as the real poiner window, we
10667  * receive crossing events from the windowing system.  When the effective pointer
10668  * window changes to become different from the real pointer window we synthesize
10669  * crossing events, attempting to follow X protocol rules:
10670  *
10671  * When the root window becomes the effective pointer window:
10672  *   - leave notify on real pointer window, detail Ancestor
10673  *   - leave notify on all of its ancestors, detail Virtual
10674  *   - enter notify on root window, detail Inferior
10675  *
10676  * When the root window ceases to be the effective pointer window:
10677  *   - leave notify on root window, detail Inferior
10678  *   - enter notify on all ancestors of real pointer window, detail Virtual
10679  *   - enter notify on real pointer window, detail Ancestor
10680  */
10681 void
10682 _gtk_widget_synthesize_crossing (GtkWidget       *from,
10683                                  GtkWidget       *to,
10684                                  GdkDevice       *device,
10685                                  GdkCrossingMode  mode)
10686 {
10687   GdkWindow *from_window = NULL, *to_window = NULL;
10688
10689   g_return_if_fail (from != NULL || to != NULL);
10690
10691   if (from != NULL)
10692     {
10693       from_window = _gtk_widget_get_device_window (from, device);
10694
10695       if (!from_window)
10696         from_window = from->priv->window;
10697     }
10698
10699   if (to != NULL)
10700     {
10701       to_window = _gtk_widget_get_device_window (to, device);
10702
10703       if (!to_window)
10704         to_window = to->priv->window;
10705     }
10706
10707   if (from_window == NULL && to_window == NULL)
10708     ;
10709   else if (from_window != NULL && to_window == NULL)
10710     {
10711       GList *from_ancestors = NULL, *list;
10712       GdkWindow *from_ancestor = from_window;
10713
10714       while (from_ancestor != NULL)
10715         {
10716           from_ancestor = gdk_window_get_effective_parent (from_ancestor);
10717           if (from_ancestor == NULL)
10718             break;
10719           from_ancestors = g_list_prepend (from_ancestors, from_ancestor);
10720         }
10721
10722       synth_crossing (from, GDK_LEAVE_NOTIFY, from_window,
10723                       device, mode, GDK_NOTIFY_ANCESTOR);
10724       for (list = g_list_last (from_ancestors); list; list = list->prev)
10725         {
10726           synth_crossing (NULL, GDK_LEAVE_NOTIFY, (GdkWindow *) list->data,
10727                           device, mode, GDK_NOTIFY_VIRTUAL);
10728         }
10729
10730       /* XXX: enter/inferior on root window? */
10731
10732       g_list_free (from_ancestors);
10733     }
10734   else if (from_window == NULL && to_window != NULL)
10735     {
10736       GList *to_ancestors = NULL, *list;
10737       GdkWindow *to_ancestor = to_window;
10738
10739       while (to_ancestor != NULL)
10740         {
10741           to_ancestor = gdk_window_get_effective_parent (to_ancestor);
10742           if (to_ancestor == NULL)
10743             break;
10744           to_ancestors = g_list_prepend (to_ancestors, to_ancestor);
10745         }
10746
10747       /* XXX: leave/inferior on root window? */
10748
10749       for (list = to_ancestors; list; list = list->next)
10750         {
10751           synth_crossing (NULL, GDK_ENTER_NOTIFY, (GdkWindow *) list->data,
10752                           device, mode, GDK_NOTIFY_VIRTUAL);
10753         }
10754       synth_crossing (to, GDK_ENTER_NOTIFY, to_window,
10755                       device, mode, GDK_NOTIFY_ANCESTOR);
10756
10757       g_list_free (to_ancestors);
10758     }
10759   else if (from_window == to_window)
10760     ;
10761   else
10762     {
10763       GList *from_ancestors = NULL, *to_ancestors = NULL, *list;
10764       GdkWindow *from_ancestor = from_window, *to_ancestor = to_window;
10765
10766       while (from_ancestor != NULL || to_ancestor != NULL)
10767         {
10768           if (from_ancestor != NULL)
10769             {
10770               from_ancestor = gdk_window_get_effective_parent (from_ancestor);
10771               if (from_ancestor == to_window)
10772                 break;
10773               if (from_ancestor)
10774                 from_ancestors = g_list_prepend (from_ancestors, from_ancestor);
10775             }
10776           if (to_ancestor != NULL)
10777             {
10778               to_ancestor = gdk_window_get_effective_parent (to_ancestor);
10779               if (to_ancestor == from_window)
10780                 break;
10781               if (to_ancestor)
10782                 to_ancestors = g_list_prepend (to_ancestors, to_ancestor);
10783             }
10784         }
10785       if (to_ancestor == from_window)
10786         {
10787           if (mode != GDK_CROSSING_GTK_UNGRAB)
10788             synth_crossing (from, GDK_LEAVE_NOTIFY, from_window,
10789                             device, mode, GDK_NOTIFY_INFERIOR);
10790           for (list = to_ancestors; list; list = list->next)
10791             synth_crossing (NULL, GDK_ENTER_NOTIFY, (GdkWindow *) list->data,
10792                             device, mode, GDK_NOTIFY_VIRTUAL);
10793           synth_crossing (to, GDK_ENTER_NOTIFY, to_window,
10794                           device, mode, GDK_NOTIFY_ANCESTOR);
10795         }
10796       else if (from_ancestor == to_window)
10797         {
10798           synth_crossing (from, GDK_LEAVE_NOTIFY, from_window,
10799                           device, mode, GDK_NOTIFY_ANCESTOR);
10800           for (list = g_list_last (from_ancestors); list; list = list->prev)
10801             {
10802               synth_crossing (NULL, GDK_LEAVE_NOTIFY, (GdkWindow *) list->data,
10803                               device, mode, GDK_NOTIFY_VIRTUAL);
10804             }
10805           if (mode != GDK_CROSSING_GTK_GRAB)
10806             synth_crossing (to, GDK_ENTER_NOTIFY, to_window,
10807                             device, mode, GDK_NOTIFY_INFERIOR);
10808         }
10809       else
10810         {
10811           while (from_ancestors != NULL && to_ancestors != NULL
10812                  && from_ancestors->data == to_ancestors->data)
10813             {
10814               from_ancestors = g_list_delete_link (from_ancestors,
10815                                                    from_ancestors);
10816               to_ancestors = g_list_delete_link (to_ancestors, to_ancestors);
10817             }
10818
10819           synth_crossing (from, GDK_LEAVE_NOTIFY, from_window,
10820                           device, mode, GDK_NOTIFY_NONLINEAR);
10821
10822           for (list = g_list_last (from_ancestors); list; list = list->prev)
10823             {
10824               synth_crossing (NULL, GDK_LEAVE_NOTIFY, (GdkWindow *) list->data,
10825                               device, mode, GDK_NOTIFY_NONLINEAR_VIRTUAL);
10826             }
10827           for (list = to_ancestors; list; list = list->next)
10828             {
10829               synth_crossing (NULL, GDK_ENTER_NOTIFY, (GdkWindow *) list->data,
10830                               device, mode, GDK_NOTIFY_NONLINEAR_VIRTUAL);
10831             }
10832           synth_crossing (to, GDK_ENTER_NOTIFY, to_window,
10833                           device, mode, GDK_NOTIFY_NONLINEAR);
10834         }
10835       g_list_free (from_ancestors);
10836       g_list_free (to_ancestors);
10837     }
10838 }
10839
10840 static void
10841 gtk_widget_propagate_state (GtkWidget    *widget,
10842                             GtkStateData *data)
10843 {
10844   GtkWidgetPrivate *priv = widget->priv;
10845   GtkStateFlags new_flags, old_flags = priv->state_flags;
10846   GtkStateType old_state;
10847
10848   old_state = gtk_widget_get_state (widget);
10849
10850   switch (data->operation)
10851     {
10852     case STATE_CHANGE_REPLACE:
10853       priv->state_flags = data->flags;
10854       break;
10855     case STATE_CHANGE_SET:
10856       priv->state_flags |= data->flags;
10857       break;
10858     case STATE_CHANGE_UNSET:
10859       priv->state_flags &= ~(data->flags);
10860       break;
10861     }
10862
10863   /* make insensitivity unoverridable */
10864   if (!priv->sensitive)
10865     priv->state_flags |= GTK_STATE_FLAG_INSENSITIVE;
10866
10867   if (gtk_widget_is_focus (widget) && !gtk_widget_is_sensitive (widget))
10868     {
10869       GtkWidget *window;
10870
10871       window = gtk_widget_get_toplevel (widget);
10872
10873       if (window && gtk_widget_is_toplevel (window))
10874         gtk_window_set_focus (GTK_WINDOW (window), NULL);
10875     }
10876
10877   new_flags = priv->state_flags;
10878
10879   if (old_flags != new_flags)
10880     {
10881       g_object_ref (widget);
10882
10883       if (!gtk_widget_is_sensitive (widget) && gtk_widget_has_grab (widget))
10884         gtk_grab_remove (widget);
10885
10886       gtk_style_context_set_state (gtk_widget_get_style_context (widget), new_flags);
10887
10888       g_signal_emit (widget, widget_signals[STATE_CHANGED], 0, old_state);
10889       g_signal_emit (widget, widget_signals[STATE_FLAGS_CHANGED], 0, old_flags);
10890
10891       if (!priv->shadowed &&
10892           (new_flags & GTK_STATE_FLAG_INSENSITIVE) != (old_flags & GTK_STATE_FLAG_INSENSITIVE))
10893         {
10894           GList *event_windows = NULL;
10895           GList *devices, *d;
10896
10897           devices = _gtk_widget_list_devices (widget);
10898
10899           for (d = devices; d; d = d->next)
10900             {
10901               GdkWindow *window;
10902               GdkDevice *device;
10903
10904               device = d->data;
10905               window = _gtk_widget_get_device_window (widget, device);
10906
10907               /* Do not propagate more than once to the
10908                * same window if non-multidevice aware.
10909                */
10910               if (!gdk_window_get_support_multidevice (window) &&
10911                   g_list_find (event_windows, window))
10912                 continue;
10913
10914               if (!gtk_widget_is_sensitive (widget))
10915                 _gtk_widget_synthesize_crossing (widget, NULL, d->data,
10916                                                  GDK_CROSSING_STATE_CHANGED);
10917               else
10918                 _gtk_widget_synthesize_crossing (NULL, widget, d->data,
10919                                                  GDK_CROSSING_STATE_CHANGED);
10920
10921               event_windows = g_list_prepend (event_windows, window);
10922             }
10923
10924           g_list_free (event_windows);
10925           g_list_free (devices);
10926         }
10927
10928       if (GTK_IS_CONTAINER (widget))
10929         {
10930           GtkStateData child_data = *data;
10931
10932           /* Make sure to only propate the right states further */
10933           child_data.flags &= GTK_STATE_FLAGS_DO_PROPAGATE;
10934
10935           gtk_container_forall (GTK_CONTAINER (widget),
10936                                 (GtkCallback) gtk_widget_propagate_state,
10937                                 &child_data);
10938         }
10939
10940       g_object_unref (widget);
10941     }
10942 }
10943
10944 static const GtkWidgetAuxInfo default_aux_info = {
10945   -1, -1,
10946   GTK_ALIGN_FILL,
10947   GTK_ALIGN_FILL,
10948   { 0, 0, 0, 0 }
10949 };
10950
10951 /*
10952  * gtk_widget_get_aux_info:
10953  * @widget: a #GtkWidget
10954  * @create: if %TRUE, create the structure if it doesn't exist
10955  *
10956  * Get the #GtkWidgetAuxInfo structure for the widget.
10957  *
10958  * Return value: the #GtkAuxInfo structure for the widget, or
10959  *    %NULL if @create is %FALSE and one doesn't already exist.
10960  */
10961 static GtkWidgetAuxInfo *
10962 gtk_widget_get_aux_info (GtkWidget *widget,
10963                          gboolean   create)
10964 {
10965   GtkWidgetAuxInfo *aux_info;
10966
10967   aux_info = g_object_get_qdata (G_OBJECT (widget), quark_aux_info);
10968   if (!aux_info && create)
10969     {
10970       aux_info = g_slice_new0 (GtkWidgetAuxInfo);
10971
10972       *aux_info = default_aux_info;
10973
10974       g_object_set_qdata (G_OBJECT (widget), quark_aux_info, aux_info);
10975     }
10976
10977   return aux_info;
10978 }
10979
10980 static const GtkWidgetAuxInfo*
10981 _gtk_widget_get_aux_info_or_defaults (GtkWidget *widget)
10982 {
10983   GtkWidgetAuxInfo *aux_info;
10984
10985   aux_info = gtk_widget_get_aux_info (widget, FALSE);
10986   if (aux_info == NULL)
10987     {
10988       return &default_aux_info;
10989     }
10990   else
10991     {
10992       return aux_info;
10993     }
10994 }
10995
10996 /*****************************************
10997  * gtk_widget_aux_info_destroy:
10998  *
10999  *   arguments:
11000  *
11001  *   results:
11002  *****************************************/
11003
11004 static void
11005 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
11006 {
11007   g_slice_free (GtkWidgetAuxInfo, aux_info);
11008 }
11009
11010 /**
11011  * gtk_widget_shape_combine_region:
11012  * @widget: a #GtkWidget
11013  * @region: (allow-none): shape to be added, or %NULL to remove an existing shape
11014  *
11015  * Sets a shape for this widget's GDK window. This allows for
11016  * transparent windows etc., see gdk_window_shape_combine_region()
11017  * for more information.
11018  *
11019  * Since: 3.0
11020  **/
11021 void
11022 gtk_widget_shape_combine_region (GtkWidget *widget,
11023                                  cairo_region_t *region)
11024 {
11025   GtkWidgetPrivate *priv;
11026
11027   g_return_if_fail (GTK_IS_WIDGET (widget));
11028   /*  set_shape doesn't work on widgets without gdk window */
11029   g_return_if_fail (gtk_widget_get_has_window (widget));
11030
11031   priv = widget->priv;
11032
11033   if (region == NULL)
11034     {
11035       priv->has_shape_mask = FALSE;
11036
11037       if (priv->window)
11038         gdk_window_shape_combine_region (priv->window, NULL, 0, 0);
11039
11040       g_object_set_qdata (G_OBJECT (widget), quark_shape_info, NULL);
11041     }
11042   else
11043     {
11044       priv->has_shape_mask = TRUE;
11045
11046       g_object_set_qdata_full (G_OBJECT (widget), quark_shape_info,
11047                                cairo_region_copy (region),
11048                                (GDestroyNotify) cairo_region_destroy);
11049
11050       /* set shape if widget has a gdk window already.
11051        * otherwise the shape is scheduled to be set by gtk_widget_realize().
11052        */
11053       if (priv->window)
11054         gdk_window_shape_combine_region (priv->window, region, 0, 0);
11055     }
11056 }
11057
11058 /**
11059  * gtk_widget_input_shape_combine_region:
11060  * @widget: a #GtkWidget
11061  * @region: (allow-none): shape to be added, or %NULL to remove an existing shape
11062  *
11063  * Sets an input shape for this widget's GDK window. This allows for
11064  * windows which react to mouse click in a nonrectangular region, see
11065  * gdk_window_input_shape_combine_region() for more information.
11066  *
11067  * Since: 3.0
11068  **/
11069 void
11070 gtk_widget_input_shape_combine_region (GtkWidget *widget,
11071                                        cairo_region_t *region)
11072 {
11073   GtkWidgetPrivate *priv;
11074
11075   g_return_if_fail (GTK_IS_WIDGET (widget));
11076   /*  set_shape doesn't work on widgets without gdk window */
11077   g_return_if_fail (gtk_widget_get_has_window (widget));
11078
11079   priv = widget->priv;
11080
11081   if (region == NULL)
11082     {
11083       if (priv->window)
11084         gdk_window_input_shape_combine_region (priv->window, NULL, 0, 0);
11085
11086       g_object_set_qdata (G_OBJECT (widget), quark_input_shape_info, NULL);
11087     }
11088   else
11089     {
11090       g_object_set_qdata_full (G_OBJECT (widget), quark_input_shape_info,
11091                                cairo_region_copy (region),
11092                                (GDestroyNotify) cairo_region_destroy);
11093
11094       /* set shape if widget has a gdk window already.
11095        * otherwise the shape is scheduled to be set by gtk_widget_realize().
11096        */
11097       if (priv->window)
11098         gdk_window_input_shape_combine_region (priv->window, region, 0, 0);
11099     }
11100 }
11101
11102
11103 /* style properties
11104  */
11105
11106 /**
11107  * gtk_widget_class_install_style_property_parser: (skip)
11108  * @klass: a #GtkWidgetClass
11109  * @pspec: the #GParamSpec for the style property
11110  * @parser: the parser for the style property
11111  *
11112  * Installs a style property on a widget class.
11113  **/
11114 void
11115 gtk_widget_class_install_style_property_parser (GtkWidgetClass     *klass,
11116                                                 GParamSpec         *pspec,
11117                                                 GtkRcPropertyParser parser)
11118 {
11119   g_return_if_fail (GTK_IS_WIDGET_CLASS (klass));
11120   g_return_if_fail (G_IS_PARAM_SPEC (pspec));
11121   g_return_if_fail (pspec->flags & G_PARAM_READABLE);
11122   g_return_if_fail (!(pspec->flags & (G_PARAM_CONSTRUCT_ONLY | G_PARAM_CONSTRUCT)));
11123
11124   if (g_param_spec_pool_lookup (style_property_spec_pool, pspec->name, G_OBJECT_CLASS_TYPE (klass), FALSE))
11125     {
11126       g_warning (G_STRLOC ": class `%s' already contains a style property named `%s'",
11127                  G_OBJECT_CLASS_NAME (klass),
11128                  pspec->name);
11129       return;
11130     }
11131
11132   g_param_spec_ref_sink (pspec);
11133   g_param_spec_set_qdata (pspec, quark_property_parser, (gpointer) parser);
11134   g_param_spec_pool_insert (style_property_spec_pool, pspec, G_OBJECT_CLASS_TYPE (klass));
11135 }
11136
11137 /**
11138  * gtk_widget_class_install_style_property:
11139  * @klass: a #GtkWidgetClass
11140  * @pspec: the #GParamSpec for the property
11141  *
11142  * Installs a style property on a widget class. The parser for the
11143  * style property is determined by the value type of @pspec.
11144  **/
11145 void
11146 gtk_widget_class_install_style_property (GtkWidgetClass *klass,
11147                                          GParamSpec     *pspec)
11148 {
11149   GtkRcPropertyParser parser;
11150
11151   g_return_if_fail (GTK_IS_WIDGET_CLASS (klass));
11152   g_return_if_fail (G_IS_PARAM_SPEC (pspec));
11153
11154   parser = _gtk_rc_property_parser_from_type (G_PARAM_SPEC_VALUE_TYPE (pspec));
11155
11156   gtk_widget_class_install_style_property_parser (klass, pspec, parser);
11157 }
11158
11159 /**
11160  * gtk_widget_class_find_style_property:
11161  * @klass: a #GtkWidgetClass
11162  * @property_name: the name of the style property to find
11163  *
11164  * Finds a style property of a widget class by name.
11165  *
11166  * Returns: (transfer none): the #GParamSpec of the style property or
11167  *   %NULL if @class has no style property with that name.
11168  *
11169  * Since: 2.2
11170  */
11171 GParamSpec*
11172 gtk_widget_class_find_style_property (GtkWidgetClass *klass,
11173                                       const gchar    *property_name)
11174 {
11175   g_return_val_if_fail (property_name != NULL, NULL);
11176
11177   return g_param_spec_pool_lookup (style_property_spec_pool,
11178                                    property_name,
11179                                    G_OBJECT_CLASS_TYPE (klass),
11180                                    TRUE);
11181 }
11182
11183 /**
11184  * gtk_widget_class_list_style_properties:
11185  * @klass: a #GtkWidgetClass
11186  * @n_properties: location to return the number of style properties found
11187  *
11188  * Returns all style properties of a widget class.
11189  *
11190  * Returns: (array length=n_properties) (transfer container): a
11191  *     newly allocated array of #GParamSpec*. The array must be
11192  *     freed with g_free().
11193  *
11194  * Since: 2.2
11195  */
11196 GParamSpec**
11197 gtk_widget_class_list_style_properties (GtkWidgetClass *klass,
11198                                         guint          *n_properties)
11199 {
11200   GParamSpec **pspecs;
11201   guint n;
11202
11203   pspecs = g_param_spec_pool_list (style_property_spec_pool,
11204                                    G_OBJECT_CLASS_TYPE (klass),
11205                                    &n);
11206   if (n_properties)
11207     *n_properties = n;
11208
11209   return pspecs;
11210 }
11211
11212 /**
11213  * gtk_widget_style_get_property:
11214  * @widget: a #GtkWidget
11215  * @property_name: the name of a style property
11216  * @value: location to return the property value
11217  *
11218  * Gets the value of a style property of @widget.
11219  */
11220 void
11221 gtk_widget_style_get_property (GtkWidget   *widget,
11222                                const gchar *property_name,
11223                                GValue      *value)
11224 {
11225   GParamSpec *pspec;
11226
11227   g_return_if_fail (GTK_IS_WIDGET (widget));
11228   g_return_if_fail (property_name != NULL);
11229   g_return_if_fail (G_IS_VALUE (value));
11230
11231   g_object_ref (widget);
11232   pspec = g_param_spec_pool_lookup (style_property_spec_pool,
11233                                     property_name,
11234                                     G_OBJECT_TYPE (widget),
11235                                     TRUE);
11236   if (!pspec)
11237     g_warning ("%s: widget class `%s' has no property named `%s'",
11238                G_STRLOC,
11239                G_OBJECT_TYPE_NAME (widget),
11240                property_name);
11241   else
11242     {
11243       GtkStyleContext *context;
11244       const GValue *peek_value;
11245       GtkStateFlags state;
11246
11247       context = gtk_widget_get_style_context (widget);
11248       state = gtk_widget_get_state_flags (widget);
11249
11250       peek_value = _gtk_style_context_peek_style_property (context,
11251                                                            G_OBJECT_TYPE (widget),
11252                                                            state, pspec);
11253
11254       /* auto-conversion of the caller's value type
11255        */
11256       if (G_VALUE_TYPE (value) == G_PARAM_SPEC_VALUE_TYPE (pspec))
11257         g_value_copy (peek_value, value);
11258       else if (g_value_type_transformable (G_PARAM_SPEC_VALUE_TYPE (pspec), G_VALUE_TYPE (value)))
11259         g_value_transform (peek_value, value);
11260       else
11261         g_warning ("can't retrieve style property `%s' of type `%s' as value of type `%s'",
11262                    pspec->name,
11263                    g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),
11264                    G_VALUE_TYPE_NAME (value));
11265     }
11266   g_object_unref (widget);
11267 }
11268
11269 /**
11270  * gtk_widget_style_get_valist:
11271  * @widget: a #GtkWidget
11272  * @first_property_name: the name of the first property to get
11273  * @var_args: a <type>va_list</type> of pairs of property names and
11274  *     locations to return the property values, starting with the location
11275  *     for @first_property_name.
11276  *
11277  * Non-vararg variant of gtk_widget_style_get(). Used primarily by language
11278  * bindings.
11279  */
11280 void
11281 gtk_widget_style_get_valist (GtkWidget   *widget,
11282                              const gchar *first_property_name,
11283                              va_list      var_args)
11284 {
11285   GtkStyleContext *context;
11286   GtkStateFlags state;
11287   const gchar *name;
11288
11289   g_return_if_fail (GTK_IS_WIDGET (widget));
11290
11291   g_object_ref (widget);
11292   context = gtk_widget_get_style_context (widget);
11293   state = gtk_widget_get_state_flags (widget);
11294
11295   name = first_property_name;
11296   while (name)
11297     {
11298       const GValue *peek_value;
11299       GParamSpec *pspec;
11300       gchar *error;
11301
11302       pspec = g_param_spec_pool_lookup (style_property_spec_pool,
11303                                         name,
11304                                         G_OBJECT_TYPE (widget),
11305                                         TRUE);
11306       if (!pspec)
11307         {
11308           g_warning ("%s: widget class `%s' has no property named `%s'",
11309                      G_STRLOC,
11310                      G_OBJECT_TYPE_NAME (widget),
11311                      name);
11312           break;
11313         }
11314       /* style pspecs are always readable so we can spare that check here */
11315
11316       peek_value = _gtk_style_context_peek_style_property (context,
11317                                                            G_OBJECT_TYPE (widget),
11318                                                            state, pspec);
11319
11320       G_VALUE_LCOPY (peek_value, var_args, 0, &error);
11321       if (error)
11322         {
11323           g_warning ("%s: %s", G_STRLOC, error);
11324           g_free (error);
11325           break;
11326         }
11327
11328       name = va_arg (var_args, gchar*);
11329     }
11330
11331   g_object_unref (widget);
11332 }
11333
11334 /**
11335  * gtk_widget_style_get:
11336  * @widget: a #GtkWidget
11337  * @first_property_name: the name of the first property to get
11338  * @...: pairs of property names and locations to return the
11339  *     property values, starting with the location for
11340  *     @first_property_name, terminated by %NULL.
11341  *
11342  * Gets the values of a multiple style properties of @widget.
11343  */
11344 void
11345 gtk_widget_style_get (GtkWidget   *widget,
11346                       const gchar *first_property_name,
11347                       ...)
11348 {
11349   va_list var_args;
11350
11351   g_return_if_fail (GTK_IS_WIDGET (widget));
11352
11353   va_start (var_args, first_property_name);
11354   gtk_widget_style_get_valist (widget, first_property_name, var_args);
11355   va_end (var_args);
11356 }
11357
11358 /**
11359  * gtk_requisition_new:
11360  *
11361  * Allocates a new #GtkRequisition structure and initializes its elements to zero.
11362  *
11363  * Returns: a new empty #GtkRequisition. The newly allocated #GtkRequisition should
11364  *   be freed with gtk_requisition_free().
11365  *
11366  * Since: 3.0
11367  */
11368 GtkRequisition *
11369 gtk_requisition_new (void)
11370 {
11371   return g_slice_new0 (GtkRequisition);
11372 }
11373
11374 /**
11375  * gtk_requisition_copy:
11376  * @requisition: a #GtkRequisition
11377  *
11378  * Copies a #GtkRequisition.
11379  *
11380  * Returns: a copy of @requisition
11381  **/
11382 GtkRequisition *
11383 gtk_requisition_copy (const GtkRequisition *requisition)
11384 {
11385   return g_slice_dup (GtkRequisition, requisition);
11386 }
11387
11388 /**
11389  * gtk_requisition_free:
11390  * @requisition: a #GtkRequisition
11391  *
11392  * Frees a #GtkRequisition.
11393  **/
11394 void
11395 gtk_requisition_free (GtkRequisition *requisition)
11396 {
11397   g_slice_free (GtkRequisition, requisition);
11398 }
11399
11400 G_DEFINE_BOXED_TYPE (GtkRequisition, gtk_requisition,
11401                      gtk_requisition_copy,
11402                      gtk_requisition_free)
11403
11404 /**
11405  * gtk_widget_class_set_accessible_type:
11406  * @widget_class: class to set the accessible type for
11407  * @type: The object type that implements the accessible for @widget_class
11408  *
11409  * Sets the type to be used for creating accessibles for widgets of
11410  * @widget_class. The given @type must be a subtype of the type used for
11411  * accessibles of the parent class.
11412  *
11413  * This function should only be called from class init functions of widgets.
11414  *
11415  * Since: 3.2
11416  **/
11417 void
11418 gtk_widget_class_set_accessible_type (GtkWidgetClass *widget_class,
11419                                       GType           type)
11420 {
11421   GtkWidgetClassPrivate *priv;
11422
11423   g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
11424   g_return_if_fail (g_type_is_a (type, widget_class->priv->accessible_type));
11425
11426   priv = widget_class->priv;
11427
11428   priv->accessible_type = type;
11429   /* reset this - honoring the type's role is better. */
11430   priv->accessible_role = ATK_ROLE_INVALID;
11431 }
11432
11433 /**
11434  * gtk_widget_class_set_accessible_role:
11435  * @widget_class: class to set the accessible role for
11436  * @role: The role to use for accessibles created for @widget_class
11437  *
11438  * Sets the default #AtkRole to be set on accessibles created for
11439  * widgets of @widget_class. Accessibles may decide to not honor this
11440  * setting if their role reporting is more refined. Calls to 
11441  * gtk_widget_class_set_accessible_type() will reset this value.
11442  *
11443  * In cases where you want more fine-grained control over the role of
11444  * accessibles created for @widget_class, you should provide your own
11445  * accessible type and use gtk_widget_class_set_accessible_type()
11446  * instead.
11447  *
11448  * If @role is #ATK_ROLE_INVALID, the default role will not be changed
11449  * and the accessible's default role will be used instead.
11450  *
11451  * This function should only be called from class init functions of widgets.
11452  *
11453  * Since: 3.2
11454  **/
11455 void
11456 gtk_widget_class_set_accessible_role (GtkWidgetClass *widget_class,
11457                                       AtkRole         role)
11458 {
11459   GtkWidgetClassPrivate *priv;
11460
11461   g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
11462
11463   priv = widget_class->priv;
11464
11465   priv->accessible_role = role;
11466 }
11467
11468 /**
11469  * _gtk_widget_peek_accessible:
11470  * @widget: a #GtkWidget
11471  *
11472  * Gets the accessible for @widget, if it has been created yet.
11473  * Otherwise, this function returns %NULL. If the @widget's implementation
11474  * does not use the default way to create accessibles, %NULL will always be
11475  * returned.
11476  *
11477  * Returns: the accessible for @widget or %NULL if none has been
11478  *     created yet.
11479  **/
11480 AtkObject *
11481 _gtk_widget_peek_accessible (GtkWidget *widget)
11482 {
11483   return g_object_get_qdata (G_OBJECT (widget),
11484                              quark_accessible_object);
11485 }
11486
11487 /**
11488  * gtk_widget_get_accessible:
11489  * @widget: a #GtkWidget
11490  *
11491  * Returns the accessible object that describes the widget to an
11492  * assistive technology.
11493  *
11494  * If accessibility support is not available, this #AtkObject
11495  * instance may be a no-op. Likewise, if no class-specific #AtkObject
11496  * implementation is available for the widget instance in question,
11497  * it will inherit an #AtkObject implementation from the first ancestor
11498  * class for which such an implementation is defined.
11499  *
11500  * The documentation of the
11501  * <ulink url="http://library.gnome.org/devel/atk/stable/">ATK</ulink>
11502  * library contains more information about accessible objects and their uses.
11503  *
11504  * Returns: (transfer none): the #AtkObject associated with @widget
11505  */
11506 AtkObject*
11507 gtk_widget_get_accessible (GtkWidget *widget)
11508 {
11509   GtkWidgetClass *klass;
11510
11511   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
11512
11513   klass = GTK_WIDGET_GET_CLASS (widget);
11514
11515   g_return_val_if_fail (klass->get_accessible != NULL, NULL);
11516
11517   return klass->get_accessible (widget);
11518 }
11519
11520 static AtkObject*
11521 gtk_widget_real_get_accessible (GtkWidget *widget)
11522 {
11523   AtkObject* accessible;
11524
11525   accessible = g_object_get_qdata (G_OBJECT (widget),
11526                                    quark_accessible_object);
11527   if (!accessible)
11528   {
11529     GtkWidgetClass *widget_class;
11530     GtkWidgetClassPrivate *priv;
11531     AtkObjectFactory *factory;
11532     AtkRegistry *default_registry;
11533
11534     widget_class = GTK_WIDGET_GET_CLASS (widget);
11535     priv = widget_class->priv;
11536
11537     if (priv->accessible_type == GTK_TYPE_ACCESSIBLE)
11538       {
11539         default_registry = atk_get_default_registry ();
11540         factory = atk_registry_get_factory (default_registry,
11541                                             G_TYPE_FROM_INSTANCE (widget));
11542         accessible =
11543           atk_object_factory_create_accessible (factory,
11544                                                 G_OBJECT (widget));
11545
11546         if (priv->accessible_role != ATK_ROLE_INVALID)
11547           atk_object_set_role (accessible, priv->accessible_role);
11548
11549         g_object_set_qdata (G_OBJECT (widget),
11550                             quark_accessible_object,
11551                             accessible);
11552       }
11553     else
11554       {
11555         accessible = g_object_new (priv->accessible_type,
11556                                    "widget", widget,
11557                                    NULL);
11558         if (priv->accessible_role != ATK_ROLE_INVALID)
11559           atk_object_set_role (accessible, priv->accessible_role);
11560
11561         g_object_set_qdata (G_OBJECT (widget),
11562                             quark_accessible_object,
11563                             accessible);
11564
11565         atk_object_initialize (accessible, widget);
11566
11567         /* Set the role again, since we don't want a role set
11568          * in some parent initialize() function to override
11569          * our own.
11570          */
11571         if (priv->accessible_role != ATK_ROLE_INVALID)
11572           atk_object_set_role (accessible, priv->accessible_role);
11573       }
11574   }
11575   return accessible;
11576 }
11577
11578 /*
11579  * Initialize a AtkImplementorIface instance's virtual pointers as
11580  * appropriate to this implementor's class (GtkWidget).
11581  */
11582 static void
11583 gtk_widget_accessible_interface_init (AtkImplementorIface *iface)
11584 {
11585   iface->ref_accessible = gtk_widget_ref_accessible;
11586 }
11587
11588 static AtkObject*
11589 gtk_widget_ref_accessible (AtkImplementor *implementor)
11590 {
11591   AtkObject *accessible;
11592
11593   accessible = gtk_widget_get_accessible (GTK_WIDGET (implementor));
11594   if (accessible)
11595     g_object_ref (accessible);
11596   return accessible;
11597 }
11598
11599 /*
11600  * Expand flag management
11601  */
11602
11603 static void
11604 gtk_widget_update_computed_expand (GtkWidget *widget)
11605 {
11606   GtkWidgetPrivate *priv;
11607
11608   priv = widget->priv;
11609
11610   if (priv->need_compute_expand)
11611     {
11612       gboolean h, v;
11613
11614       if (priv->hexpand_set)
11615         h = priv->hexpand;
11616       else
11617         h = FALSE;
11618
11619       if (priv->vexpand_set)
11620         v = priv->vexpand;
11621       else
11622         v = FALSE;
11623
11624       /* we don't need to use compute_expand if both expands are
11625        * forced by the app
11626        */
11627       if (!(priv->hexpand_set && priv->vexpand_set))
11628         {
11629           if (GTK_WIDGET_GET_CLASS (widget)->compute_expand != NULL)
11630             {
11631               gboolean ignored;
11632
11633               GTK_WIDGET_GET_CLASS (widget)->compute_expand (widget,
11634                                                              priv->hexpand_set ? &ignored : &h,
11635                                                              priv->vexpand_set ? &ignored : &v);
11636             }
11637         }
11638
11639       priv->need_compute_expand = FALSE;
11640       priv->computed_hexpand = h != FALSE;
11641       priv->computed_vexpand = v != FALSE;
11642     }
11643 }
11644
11645 /**
11646  * gtk_widget_queue_compute_expand:
11647  * @widget: a #GtkWidget
11648  *
11649  * Mark @widget as needing to recompute its expand flags. Call
11650  * this function when setting legacy expand child properties
11651  * on the child of a container.
11652  *
11653  * See gtk_widget_compute_expand().
11654  */
11655 void
11656 gtk_widget_queue_compute_expand (GtkWidget *widget)
11657 {
11658   GtkWidget *parent;
11659   gboolean changed_anything;
11660
11661   if (widget->priv->need_compute_expand)
11662     return;
11663
11664   changed_anything = FALSE;
11665   parent = widget;
11666   while (parent != NULL)
11667     {
11668       if (!parent->priv->need_compute_expand)
11669         {
11670           parent->priv->need_compute_expand = TRUE;
11671           changed_anything = TRUE;
11672         }
11673
11674       /* Note: if we had an invariant that "if a child needs to
11675        * compute expand, its parents also do" then we could stop going
11676        * up when we got to a parent that already needed to
11677        * compute. However, in general we compute expand lazily (as
11678        * soon as we see something in a subtree that is expand, we know
11679        * we're expanding) and so this invariant does not hold and we
11680        * have to always walk all the way up in case some ancestor
11681        * is not currently need_compute_expand.
11682        */
11683
11684       parent = parent->priv->parent;
11685     }
11686
11687   /* recomputing expand always requires
11688    * a relayout as well
11689    */
11690   if (changed_anything)
11691     gtk_widget_queue_resize (widget);
11692 }
11693
11694 /**
11695  * gtk_widget_compute_expand:
11696  * @widget: the widget
11697  * @orientation: expand direction
11698  *
11699  * Computes whether a container should give this widget extra space
11700  * when possible. Containers should check this, rather than
11701  * looking at gtk_widget_get_hexpand() or gtk_widget_get_vexpand().
11702  *
11703  * This function already checks whether the widget is visible, so
11704  * visibility does not need to be checked separately. Non-visible
11705  * widgets are not expanded.
11706  *
11707  * The computed expand value uses either the expand setting explicitly
11708  * set on the widget itself, or, if none has been explicitly set,
11709  * the widget may expand if some of its children do.
11710  *
11711  * Return value: whether widget tree rooted here should be expanded
11712  */
11713 gboolean
11714 gtk_widget_compute_expand (GtkWidget     *widget,
11715                            GtkOrientation orientation)
11716 {
11717   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
11718
11719   /* We never make a widget expand if not even showing. */
11720   if (!gtk_widget_get_visible (widget))
11721     return FALSE;
11722
11723   gtk_widget_update_computed_expand (widget);
11724
11725   if (orientation == GTK_ORIENTATION_HORIZONTAL)
11726     {
11727       return widget->priv->computed_hexpand;
11728     }
11729   else
11730     {
11731       return widget->priv->computed_vexpand;
11732     }
11733 }
11734
11735 static void
11736 gtk_widget_set_expand (GtkWidget     *widget,
11737                        GtkOrientation orientation,
11738                        gboolean       expand)
11739 {
11740   const char *expand_prop;
11741   const char *expand_set_prop;
11742   gboolean was_both;
11743   GtkWidgetPrivate *priv;
11744
11745   g_return_if_fail (GTK_IS_WIDGET (widget));
11746
11747   priv = widget->priv;
11748
11749   expand = expand != FALSE;
11750
11751   was_both = priv->hexpand && priv->vexpand;
11752
11753   if (orientation == GTK_ORIENTATION_HORIZONTAL)
11754     {
11755       if (priv->hexpand_set &&
11756           priv->hexpand == expand)
11757         return;
11758
11759       priv->hexpand_set = TRUE;
11760       priv->hexpand = expand;
11761
11762       expand_prop = "hexpand";
11763       expand_set_prop = "hexpand-set";
11764     }
11765   else
11766     {
11767       if (priv->vexpand_set &&
11768           priv->vexpand == expand)
11769         return;
11770
11771       priv->vexpand_set = TRUE;
11772       priv->vexpand = expand;
11773
11774       expand_prop = "vexpand";
11775       expand_set_prop = "vexpand-set";
11776     }
11777
11778   gtk_widget_queue_compute_expand (widget);
11779
11780   g_object_freeze_notify (G_OBJECT (widget));
11781   g_object_notify (G_OBJECT (widget), expand_prop);
11782   g_object_notify (G_OBJECT (widget), expand_set_prop);
11783   if (was_both != (priv->hexpand && priv->vexpand))
11784     g_object_notify (G_OBJECT (widget), "expand");
11785   g_object_thaw_notify (G_OBJECT (widget));
11786 }
11787
11788 static void
11789 gtk_widget_set_expand_set (GtkWidget      *widget,
11790                            GtkOrientation  orientation,
11791                            gboolean        set)
11792 {
11793   GtkWidgetPrivate *priv;
11794   const char *prop;
11795
11796   priv = widget->priv;
11797
11798   set = set != FALSE;
11799
11800   if (orientation == GTK_ORIENTATION_HORIZONTAL)
11801     {
11802       if (set == priv->hexpand_set)
11803         return;
11804
11805       priv->hexpand_set = set;
11806       prop = "hexpand-set";
11807     }
11808   else
11809     {
11810       if (set == priv->vexpand_set)
11811         return;
11812
11813       priv->vexpand_set = set;
11814       prop = "vexpand-set";
11815     }
11816
11817   gtk_widget_queue_compute_expand (widget);
11818
11819   g_object_notify (G_OBJECT (widget), prop);
11820 }
11821
11822 /**
11823  * gtk_widget_get_hexpand:
11824  * @widget: the widget
11825  *
11826  * Gets whether the widget would like any available extra horizontal
11827  * space. When a user resizes a #GtkWindow, widgets with expand=TRUE
11828  * generally receive the extra space. For example, a list or
11829  * scrollable area or document in your window would often be set to
11830  * expand.
11831  *
11832  * Containers should use gtk_widget_compute_expand() rather than
11833  * this function, to see whether a widget, or any of its children,
11834  * has the expand flag set. If any child of a widget wants to
11835  * expand, the parent may ask to expand also.
11836  *
11837  * This function only looks at the widget's own hexpand flag, rather
11838  * than computing whether the entire widget tree rooted at this widget
11839  * wants to expand.
11840  *
11841  * Return value: whether hexpand flag is set
11842  */
11843 gboolean
11844 gtk_widget_get_hexpand (GtkWidget *widget)
11845 {
11846   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
11847
11848   return widget->priv->hexpand;
11849 }
11850
11851 /**
11852  * gtk_widget_set_hexpand:
11853  * @widget: the widget
11854  * @expand: whether to expand
11855  *
11856  * Sets whether the widget would like any available extra horizontal
11857  * space. When a user resizes a #GtkWindow, widgets with expand=TRUE
11858  * generally receive the extra space. For example, a list or
11859  * scrollable area or document in your window would often be set to
11860  * expand.
11861  *
11862  * Call this function to set the expand flag if you would like your
11863  * widget to become larger horizontally when the window has extra
11864  * room.
11865  *
11866  * By default, widgets automatically expand if any of their children
11867  * want to expand. (To see if a widget will automatically expand given
11868  * its current children and state, call gtk_widget_compute_expand(). A
11869  * container can decide how the expandability of children affects the
11870  * expansion of the container by overriding the compute_expand virtual
11871  * method on #GtkWidget.).
11872  *
11873  * Setting hexpand explicitly with this function will override the
11874  * automatic expand behavior.
11875  *
11876  * This function forces the widget to expand or not to expand,
11877  * regardless of children.  The override occurs because
11878  * gtk_widget_set_hexpand() sets the hexpand-set property (see
11879  * gtk_widget_set_hexpand_set()) which causes the widget's hexpand
11880  * value to be used, rather than looking at children and widget state.
11881  */
11882 void
11883 gtk_widget_set_hexpand (GtkWidget      *widget,
11884                         gboolean        expand)
11885 {
11886   g_return_if_fail (GTK_IS_WIDGET (widget));
11887
11888   gtk_widget_set_expand (widget, GTK_ORIENTATION_HORIZONTAL, expand);
11889 }
11890
11891 /**
11892  * gtk_widget_get_hexpand_set:
11893  * @widget: the widget
11894  *
11895  * Gets whether gtk_widget_set_hexpand() has been used to
11896  * explicitly set the expand flag on this widget.
11897  *
11898  * If hexpand is set, then it overrides any computed
11899  * expand value based on child widgets. If hexpand is not
11900  * set, then the expand value depends on whether any
11901  * children of the widget would like to expand.
11902  *
11903  * There are few reasons to use this function, but it's here
11904  * for completeness and consistency.
11905  *
11906  * Return value: whether hexpand has been explicitly set
11907  */
11908 gboolean
11909 gtk_widget_get_hexpand_set (GtkWidget      *widget)
11910 {
11911   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
11912
11913   return widget->priv->hexpand_set;
11914 }
11915
11916 /**
11917  * gtk_widget_set_hexpand_set:
11918  * @widget: the widget
11919  * @set: value for hexpand-set property
11920  *
11921  * Sets whether the hexpand flag (see gtk_widget_get_hexpand()) will
11922  * be used.
11923  *
11924  * The hexpand-set property will be set automatically when you call
11925  * gtk_widget_set_hexpand() to set hexpand, so the most likely
11926  * reason to use this function would be to unset an explicit expand
11927  * flag.
11928  *
11929  * If hexpand is set, then it overrides any computed
11930  * expand value based on child widgets. If hexpand is not
11931  * set, then the expand value depends on whether any
11932  * children of the widget would like to expand.
11933  *
11934  * There are few reasons to use this function, but it's here
11935  * for completeness and consistency.
11936  */
11937 void
11938 gtk_widget_set_hexpand_set (GtkWidget      *widget,
11939                             gboolean        set)
11940 {
11941   g_return_if_fail (GTK_IS_WIDGET (widget));
11942
11943   gtk_widget_set_expand_set (widget, GTK_ORIENTATION_HORIZONTAL, set);
11944 }
11945
11946
11947 /**
11948  * gtk_widget_get_vexpand:
11949  * @widget: the widget
11950  *
11951  * Gets whether the widget would like any available extra vertical
11952  * space.
11953  *
11954  * See gtk_widget_get_hexpand() for more detail.
11955  *
11956  * Return value: whether vexpand flag is set
11957  */
11958 gboolean
11959 gtk_widget_get_vexpand (GtkWidget *widget)
11960 {
11961   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
11962
11963   return widget->priv->vexpand;
11964 }
11965
11966 /**
11967  * gtk_widget_set_vexpand:
11968  * @widget: the widget
11969  * @expand: whether to expand
11970  *
11971  * Sets whether the widget would like any available extra vertical
11972  * space.
11973  *
11974  * See gtk_widget_set_hexpand() for more detail.
11975  */
11976 void
11977 gtk_widget_set_vexpand (GtkWidget      *widget,
11978                         gboolean        expand)
11979 {
11980   g_return_if_fail (GTK_IS_WIDGET (widget));
11981
11982   gtk_widget_set_expand (widget, GTK_ORIENTATION_VERTICAL, expand);
11983 }
11984
11985 /**
11986  * gtk_widget_get_vexpand_set:
11987  * @widget: the widget
11988  *
11989  * Gets whether gtk_widget_set_vexpand() has been used to
11990  * explicitly set the expand flag on this widget.
11991  *
11992  * See gtk_widget_get_hexpand_set() for more detail.
11993  *
11994  * Return value: whether vexpand has been explicitly set
11995  */
11996 gboolean
11997 gtk_widget_get_vexpand_set (GtkWidget      *widget)
11998 {
11999   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
12000
12001   return widget->priv->vexpand_set;
12002 }
12003
12004 /**
12005  * gtk_widget_set_vexpand_set:
12006  * @widget: the widget
12007  * @set: value for vexpand-set property
12008  *
12009  * Sets whether the vexpand flag (see gtk_widget_get_vexpand()) will
12010  * be used.
12011  *
12012  * See gtk_widget_set_hexpand_set() for more detail.
12013  */
12014 void
12015 gtk_widget_set_vexpand_set (GtkWidget      *widget,
12016                             gboolean        set)
12017 {
12018   g_return_if_fail (GTK_IS_WIDGET (widget));
12019
12020   gtk_widget_set_expand_set (widget, GTK_ORIENTATION_VERTICAL, set);
12021 }
12022
12023 /*
12024  * GtkBuildable implementation
12025  */
12026 static GQuark            quark_builder_has_default = 0;
12027 static GQuark            quark_builder_has_focus = 0;
12028 static GQuark            quark_builder_atk_relations = 0;
12029 static GQuark            quark_builder_set_name = 0;
12030
12031 static void
12032 gtk_widget_buildable_interface_init (GtkBuildableIface *iface)
12033 {
12034   quark_builder_has_default = g_quark_from_static_string ("gtk-builder-has-default");
12035   quark_builder_has_focus = g_quark_from_static_string ("gtk-builder-has-focus");
12036   quark_builder_atk_relations = g_quark_from_static_string ("gtk-builder-atk-relations");
12037   quark_builder_set_name = g_quark_from_static_string ("gtk-builder-set-name");
12038
12039   iface->set_name = gtk_widget_buildable_set_name;
12040   iface->get_name = gtk_widget_buildable_get_name;
12041   iface->get_internal_child = gtk_widget_buildable_get_internal_child;
12042   iface->set_buildable_property = gtk_widget_buildable_set_buildable_property;
12043   iface->parser_finished = gtk_widget_buildable_parser_finished;
12044   iface->custom_tag_start = gtk_widget_buildable_custom_tag_start;
12045   iface->custom_finished = gtk_widget_buildable_custom_finished;
12046 }
12047
12048 static void
12049 gtk_widget_buildable_set_name (GtkBuildable *buildable,
12050                                const gchar  *name)
12051 {
12052   g_object_set_qdata_full (G_OBJECT (buildable), quark_builder_set_name,
12053                            g_strdup (name), g_free);
12054 }
12055
12056 static const gchar *
12057 gtk_widget_buildable_get_name (GtkBuildable *buildable)
12058 {
12059   return g_object_get_qdata (G_OBJECT (buildable), quark_builder_set_name);
12060 }
12061
12062 static GObject *
12063 gtk_widget_buildable_get_internal_child (GtkBuildable *buildable,
12064                                          GtkBuilder   *builder,
12065                                          const gchar  *childname)
12066 {
12067   if (strcmp (childname, "accessible") == 0)
12068     return G_OBJECT (gtk_widget_get_accessible (GTK_WIDGET (buildable)));
12069
12070   return NULL;
12071 }
12072
12073 static void
12074 gtk_widget_buildable_set_buildable_property (GtkBuildable *buildable,
12075                                              GtkBuilder   *builder,
12076                                              const gchar  *name,
12077                                              const GValue *value)
12078 {
12079   if (strcmp (name, "has-default") == 0 && g_value_get_boolean (value))
12080       g_object_set_qdata (G_OBJECT (buildable), quark_builder_has_default,
12081                           GINT_TO_POINTER (TRUE));
12082   else if (strcmp (name, "has-focus") == 0 && g_value_get_boolean (value))
12083       g_object_set_qdata (G_OBJECT (buildable), quark_builder_has_focus,
12084                           GINT_TO_POINTER (TRUE));
12085   else
12086     g_object_set_property (G_OBJECT (buildable), name, value);
12087 }
12088
12089 typedef struct
12090 {
12091   gchar *action_name;
12092   GString *description;
12093   gchar *context;
12094   gboolean translatable;
12095 } AtkActionData;
12096
12097 typedef struct
12098 {
12099   gchar *target;
12100   gchar *type;
12101 } AtkRelationData;
12102
12103 static void
12104 free_action (AtkActionData *data, gpointer user_data)
12105 {
12106   g_free (data->action_name);
12107   g_string_free (data->description, TRUE);
12108   g_free (data->context);
12109   g_slice_free (AtkActionData, data);
12110 }
12111
12112 static void
12113 free_relation (AtkRelationData *data, gpointer user_data)
12114 {
12115   g_free (data->target);
12116   g_free (data->type);
12117   g_slice_free (AtkRelationData, data);
12118 }
12119
12120 static void
12121 gtk_widget_buildable_parser_finished (GtkBuildable *buildable,
12122                                       GtkBuilder   *builder)
12123 {
12124   GSList *atk_relations;
12125
12126   if (g_object_get_qdata (G_OBJECT (buildable), quark_builder_has_default))
12127     gtk_widget_grab_default (GTK_WIDGET (buildable));
12128   if (g_object_get_qdata (G_OBJECT (buildable), quark_builder_has_focus))
12129     gtk_widget_grab_focus (GTK_WIDGET (buildable));
12130
12131   atk_relations = g_object_get_qdata (G_OBJECT (buildable),
12132                                       quark_builder_atk_relations);
12133   if (atk_relations)
12134     {
12135       AtkObject *accessible;
12136       AtkRelationSet *relation_set;
12137       GSList *l;
12138       GObject *target;
12139       AtkRelationType relation_type;
12140       AtkObject *target_accessible;
12141
12142       accessible = gtk_widget_get_accessible (GTK_WIDGET (buildable));
12143       relation_set = atk_object_ref_relation_set (accessible);
12144
12145       for (l = atk_relations; l; l = l->next)
12146         {
12147           AtkRelationData *relation = (AtkRelationData*)l->data;
12148
12149           target = gtk_builder_get_object (builder, relation->target);
12150           if (!target)
12151             {
12152               g_warning ("Target object %s in <relation> does not exist",
12153                          relation->target);
12154               continue;
12155             }
12156           target_accessible = gtk_widget_get_accessible (GTK_WIDGET (target));
12157           g_assert (target_accessible != NULL);
12158
12159           relation_type = atk_relation_type_for_name (relation->type);
12160           if (relation_type == ATK_RELATION_NULL)
12161             {
12162               g_warning ("<relation> type %s not found",
12163                          relation->type);
12164               continue;
12165             }
12166           atk_relation_set_add_relation_by_type (relation_set, relation_type,
12167                                                  target_accessible);
12168         }
12169       g_object_unref (relation_set);
12170
12171       g_slist_free_full (atk_relations, (GDestroyNotify) free_relation);
12172       g_object_set_qdata (G_OBJECT (buildable), quark_builder_atk_relations,
12173                           NULL);
12174     }
12175 }
12176
12177 typedef struct
12178 {
12179   GSList *actions;
12180   GSList *relations;
12181 } AccessibilitySubParserData;
12182
12183 static void
12184 accessibility_start_element (GMarkupParseContext  *context,
12185                              const gchar          *element_name,
12186                              const gchar         **names,
12187                              const gchar         **values,
12188                              gpointer              user_data,
12189                              GError              **error)
12190 {
12191   AccessibilitySubParserData *data = (AccessibilitySubParserData*)user_data;
12192   guint i;
12193   gint line_number, char_number;
12194
12195   if (strcmp (element_name, "relation") == 0)
12196     {
12197       gchar *target = NULL;
12198       gchar *type = NULL;
12199       AtkRelationData *relation;
12200
12201       for (i = 0; names[i]; i++)
12202         {
12203           if (strcmp (names[i], "target") == 0)
12204             target = g_strdup (values[i]);
12205           else if (strcmp (names[i], "type") == 0)
12206             type = g_strdup (values[i]);
12207           else
12208             {
12209               g_markup_parse_context_get_position (context,
12210                                                    &line_number,
12211                                                    &char_number);
12212               g_set_error (error,
12213                            GTK_BUILDER_ERROR,
12214                            GTK_BUILDER_ERROR_INVALID_ATTRIBUTE,
12215                            "%s:%d:%d '%s' is not a valid attribute of <%s>",
12216                            "<input>",
12217                            line_number, char_number, names[i], "relation");
12218               g_free (target);
12219               g_free (type);
12220               return;
12221             }
12222         }
12223
12224       if (!target || !type)
12225         {
12226           g_markup_parse_context_get_position (context,
12227                                                &line_number,
12228                                                &char_number);
12229           g_set_error (error,
12230                        GTK_BUILDER_ERROR,
12231                        GTK_BUILDER_ERROR_MISSING_ATTRIBUTE,
12232                        "%s:%d:%d <%s> requires attribute \"%s\"",
12233                        "<input>",
12234                        line_number, char_number, "relation",
12235                        type ? "target" : "type");
12236           g_free (target);
12237           g_free (type);
12238           return;
12239         }
12240
12241       relation = g_slice_new (AtkRelationData);
12242       relation->target = target;
12243       relation->type = type;
12244
12245       data->relations = g_slist_prepend (data->relations, relation);
12246     }
12247   else if (strcmp (element_name, "action") == 0)
12248     {
12249       const gchar *action_name = NULL;
12250       const gchar *description = NULL;
12251       const gchar *msg_context = NULL;
12252       gboolean translatable = FALSE;
12253       AtkActionData *action;
12254
12255       for (i = 0; names[i]; i++)
12256         {
12257           if (strcmp (names[i], "action_name") == 0)
12258             action_name = values[i];
12259           else if (strcmp (names[i], "description") == 0)
12260             description = values[i];
12261           else if (strcmp (names[i], "translatable") == 0)
12262             {
12263               if (!_gtk_builder_boolean_from_string (values[i], &translatable, error))
12264                 return;
12265             }
12266           else if (strcmp (names[i], "comments") == 0)
12267             {
12268               /* do nothing, comments are for translators */
12269             }
12270           else if (strcmp (names[i], "context") == 0)
12271             msg_context = values[i];
12272           else
12273             {
12274               g_markup_parse_context_get_position (context,
12275                                                    &line_number,
12276                                                    &char_number);
12277               g_set_error (error,
12278                            GTK_BUILDER_ERROR,
12279                            GTK_BUILDER_ERROR_INVALID_ATTRIBUTE,
12280                            "%s:%d:%d '%s' is not a valid attribute of <%s>",
12281                            "<input>",
12282                            line_number, char_number, names[i], "action");
12283               return;
12284             }
12285         }
12286
12287       if (!action_name)
12288         {
12289           g_markup_parse_context_get_position (context,
12290                                                &line_number,
12291                                                &char_number);
12292           g_set_error (error,
12293                        GTK_BUILDER_ERROR,
12294                        GTK_BUILDER_ERROR_MISSING_ATTRIBUTE,
12295                        "%s:%d:%d <%s> requires attribute \"%s\"",
12296                        "<input>",
12297                        line_number, char_number, "action",
12298                        "action_name");
12299           return;
12300         }
12301
12302       action = g_slice_new (AtkActionData);
12303       action->action_name = g_strdup (action_name);
12304       action->description = g_string_new (description);
12305       action->context = g_strdup (msg_context);
12306       action->translatable = translatable;
12307
12308       data->actions = g_slist_prepend (data->actions, action);
12309     }
12310   else if (strcmp (element_name, "accessibility") == 0)
12311     ;
12312   else
12313     g_warning ("Unsupported tag for GtkWidget: %s\n", element_name);
12314 }
12315
12316 static void
12317 accessibility_text (GMarkupParseContext  *context,
12318                     const gchar          *text,
12319                     gsize                 text_len,
12320                     gpointer              user_data,
12321                     GError              **error)
12322 {
12323   AccessibilitySubParserData *data = (AccessibilitySubParserData*)user_data;
12324
12325   if (strcmp (g_markup_parse_context_get_element (context), "action") == 0)
12326     {
12327       AtkActionData *action = data->actions->data;
12328
12329       g_string_append_len (action->description, text, text_len);
12330     }
12331 }
12332
12333 static const GMarkupParser accessibility_parser =
12334   {
12335     accessibility_start_element,
12336     NULL,
12337     accessibility_text,
12338   };
12339
12340 typedef struct
12341 {
12342   GObject *object;
12343   guint    key;
12344   guint    modifiers;
12345   gchar   *signal;
12346 } AccelGroupParserData;
12347
12348 static void
12349 accel_group_start_element (GMarkupParseContext  *context,
12350                            const gchar          *element_name,
12351                            const gchar         **names,
12352                            const gchar         **values,
12353                            gpointer              user_data,
12354                            GError              **error)
12355 {
12356   gint i;
12357   guint key = 0;
12358   guint modifiers = 0;
12359   gchar *signal = NULL;
12360   AccelGroupParserData *parser_data = (AccelGroupParserData*)user_data;
12361
12362   for (i = 0; names[i]; i++)
12363     {
12364       if (strcmp (names[i], "key") == 0)
12365         key = gdk_keyval_from_name (values[i]);
12366       else if (strcmp (names[i], "modifiers") == 0)
12367         {
12368           if (!_gtk_builder_flags_from_string (GDK_TYPE_MODIFIER_TYPE,
12369                                                values[i],
12370                                                &modifiers,
12371                                                error))
12372               return;
12373         }
12374       else if (strcmp (names[i], "signal") == 0)
12375         signal = g_strdup (values[i]);
12376     }
12377
12378   if (key == 0 || signal == NULL)
12379     {
12380       g_warning ("<accelerator> requires key and signal attributes");
12381       return;
12382     }
12383   parser_data->key = key;
12384   parser_data->modifiers = modifiers;
12385   parser_data->signal = signal;
12386 }
12387
12388 static const GMarkupParser accel_group_parser =
12389   {
12390     accel_group_start_element,
12391   };
12392
12393 typedef struct
12394 {
12395   GSList *classes;
12396 } StyleParserData;
12397
12398 static void
12399 style_start_element (GMarkupParseContext  *context,
12400                      const gchar          *element_name,
12401                      const gchar         **names,
12402                      const gchar         **values,
12403                      gpointer              user_data,
12404                      GError              **error)
12405 {
12406   StyleParserData *style_data = (StyleParserData *)user_data;
12407   gchar *class_name;
12408
12409   if (strcmp (element_name, "class") == 0)
12410     {
12411       if (g_markup_collect_attributes (element_name,
12412                                        names,
12413                                        values,
12414                                        error,
12415                                        G_MARKUP_COLLECT_STRDUP, "name", &class_name,
12416                                        G_MARKUP_COLLECT_INVALID))
12417         {
12418           style_data->classes = g_slist_append (style_data->classes, class_name);
12419         }
12420     }
12421   else if (strcmp (element_name, "style") == 0)
12422     ;
12423   else
12424     g_warning ("Unsupported tag for GtkWidget: %s\n", element_name);
12425 }
12426
12427 static const GMarkupParser style_parser =
12428   {
12429     style_start_element,
12430   };
12431
12432 static gboolean
12433 gtk_widget_buildable_custom_tag_start (GtkBuildable     *buildable,
12434                                        GtkBuilder       *builder,
12435                                        GObject          *child,
12436                                        const gchar      *tagname,
12437                                        GMarkupParser    *parser,
12438                                        gpointer         *data)
12439 {
12440   g_assert (buildable);
12441
12442   if (strcmp (tagname, "accelerator") == 0)
12443     {
12444       AccelGroupParserData *parser_data;
12445
12446       parser_data = g_slice_new0 (AccelGroupParserData);
12447       parser_data->object = g_object_ref (buildable);
12448       *parser = accel_group_parser;
12449       *data = parser_data;
12450       return TRUE;
12451     }
12452   if (strcmp (tagname, "accessibility") == 0)
12453     {
12454       AccessibilitySubParserData *parser_data;
12455
12456       parser_data = g_slice_new0 (AccessibilitySubParserData);
12457       *parser = accessibility_parser;
12458       *data = parser_data;
12459       return TRUE;
12460     }
12461   if (strcmp (tagname, "style") == 0)
12462     {
12463       StyleParserData *parser_data;
12464
12465       parser_data = g_slice_new0 (StyleParserData);
12466       *parser = style_parser;
12467       *data = parser_data;
12468       return TRUE;
12469     }
12470
12471   return FALSE;
12472 }
12473
12474 void
12475 _gtk_widget_buildable_finish_accelerator (GtkWidget *widget,
12476                                           GtkWidget *toplevel,
12477                                           gpointer   user_data)
12478 {
12479   AccelGroupParserData *accel_data;
12480   GSList *accel_groups;
12481   GtkAccelGroup *accel_group;
12482
12483   g_return_if_fail (GTK_IS_WIDGET (widget));
12484   g_return_if_fail (GTK_IS_WIDGET (toplevel));
12485   g_return_if_fail (user_data != NULL);
12486
12487   accel_data = (AccelGroupParserData*)user_data;
12488   accel_groups = gtk_accel_groups_from_object (G_OBJECT (toplevel));
12489   if (g_slist_length (accel_groups) == 0)
12490     {
12491       accel_group = gtk_accel_group_new ();
12492       gtk_window_add_accel_group (GTK_WINDOW (toplevel), accel_group);
12493     }
12494   else
12495     {
12496       g_assert (g_slist_length (accel_groups) == 1);
12497       accel_group = g_slist_nth_data (accel_groups, 0);
12498     }
12499
12500   gtk_widget_add_accelerator (GTK_WIDGET (accel_data->object),
12501                               accel_data->signal,
12502                               accel_group,
12503                               accel_data->key,
12504                               accel_data->modifiers,
12505                               GTK_ACCEL_VISIBLE);
12506
12507   g_object_unref (accel_data->object);
12508   g_free (accel_data->signal);
12509   g_slice_free (AccelGroupParserData, accel_data);
12510 }
12511
12512 static void
12513 gtk_widget_buildable_custom_finished (GtkBuildable *buildable,
12514                                       GtkBuilder   *builder,
12515                                       GObject      *child,
12516                                       const gchar  *tagname,
12517                                       gpointer      user_data)
12518 {
12519   if (strcmp (tagname, "accelerator") == 0)
12520     {
12521       AccelGroupParserData *accel_data;
12522       GtkWidget *toplevel;
12523
12524       accel_data = (AccelGroupParserData*)user_data;
12525       g_assert (accel_data->object);
12526
12527       toplevel = gtk_widget_get_toplevel (GTK_WIDGET (accel_data->object));
12528
12529       _gtk_widget_buildable_finish_accelerator (GTK_WIDGET (buildable), toplevel, user_data);
12530     }
12531   else if (strcmp (tagname, "accessibility") == 0)
12532     {
12533       AccessibilitySubParserData *a11y_data;
12534
12535       a11y_data = (AccessibilitySubParserData*)user_data;
12536
12537       if (a11y_data->actions)
12538         {
12539           AtkObject *accessible;
12540           AtkAction *action;
12541           gint i, n_actions;
12542           GSList *l;
12543
12544           accessible = gtk_widget_get_accessible (GTK_WIDGET (buildable));
12545
12546           if (ATK_IS_ACTION (accessible))
12547             {
12548               action = ATK_ACTION (accessible);
12549               n_actions = atk_action_get_n_actions (action);
12550
12551               for (l = a11y_data->actions; l; l = l->next)
12552                 {
12553                   AtkActionData *action_data = (AtkActionData*)l->data;
12554
12555                   for (i = 0; i < n_actions; i++)
12556                     if (strcmp (atk_action_get_name (action, i),
12557                                 action_data->action_name) == 0)
12558                       break;
12559
12560                   if (i < n_actions)
12561                     {
12562                       gchar *description;
12563
12564                       if (action_data->translatable && action_data->description->len)
12565                         description = _gtk_builder_parser_translate (gtk_builder_get_translation_domain (builder),
12566                                                                      action_data->context,
12567                                                                      action_data->description->str);
12568                       else
12569                         description = action_data->description->str;
12570
12571                       atk_action_set_description (action, i, description);
12572                     }
12573                 }
12574             }
12575           else
12576             g_warning ("accessibility action on a widget that does not implement AtkAction");
12577
12578           g_slist_free_full (a11y_data->actions, (GDestroyNotify) free_action);
12579         }
12580
12581       if (a11y_data->relations)
12582         g_object_set_qdata (G_OBJECT (buildable), quark_builder_atk_relations,
12583                             a11y_data->relations);
12584
12585       g_slice_free (AccessibilitySubParserData, a11y_data);
12586     }
12587   else if (strcmp (tagname, "style") == 0)
12588     {
12589       StyleParserData *style_data = (StyleParserData *)user_data;
12590       GtkStyleContext *context;
12591       GSList *l;
12592
12593       context = gtk_widget_get_style_context (GTK_WIDGET (buildable));
12594
12595       for (l = style_data->classes; l; l = l->next)
12596         gtk_style_context_add_class (context, (const gchar *)l->data);
12597
12598       gtk_widget_reset_style (GTK_WIDGET (buildable));
12599
12600       g_slist_free_full (style_data->classes, g_free);
12601       g_slice_free (StyleParserData, style_data);
12602     }
12603 }
12604
12605 static GtkSizeRequestMode 
12606 gtk_widget_real_get_request_mode (GtkWidget *widget)
12607
12608   /* By default widgets dont trade size at all. */
12609   return GTK_SIZE_REQUEST_CONSTANT_SIZE;
12610 }
12611
12612 static void
12613 gtk_widget_real_get_width (GtkWidget *widget,
12614                            gint      *minimum_size,
12615                            gint      *natural_size)
12616 {
12617   if (minimum_size)
12618     *minimum_size = 0;
12619
12620   if (natural_size)
12621     *natural_size = 0;
12622 }
12623
12624 static void
12625 gtk_widget_real_get_height (GtkWidget *widget,
12626                             gint      *minimum_size,
12627                             gint      *natural_size)
12628 {
12629   if (minimum_size)
12630     *minimum_size = 0;
12631
12632   if (natural_size)
12633     *natural_size = 0;
12634 }
12635
12636 static void
12637 gtk_widget_real_get_height_for_width (GtkWidget *widget,
12638                                       gint       width,
12639                                       gint      *minimum_height,
12640                                       gint      *natural_height)
12641 {
12642   GTK_WIDGET_GET_CLASS (widget)->get_preferred_height (widget, minimum_height, natural_height);
12643 }
12644
12645 static void
12646 gtk_widget_real_get_width_for_height (GtkWidget *widget,
12647                                       gint       height,
12648                                       gint      *minimum_width,
12649                                       gint      *natural_width)
12650 {
12651   GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget, minimum_width, natural_width);
12652 }
12653
12654 /**
12655  * gtk_widget_get_halign:
12656  * @widget: a #GtkWidget
12657  *
12658  * Gets the value of the #GtkWidget:halign property.
12659  *
12660  * Returns: the horizontal alignment of @widget
12661  */
12662 GtkAlign
12663 gtk_widget_get_halign (GtkWidget *widget)
12664 {
12665   g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_ALIGN_FILL);
12666   return _gtk_widget_get_aux_info_or_defaults (widget)->halign;
12667 }
12668
12669 /**
12670  * gtk_widget_set_halign:
12671  * @widget: a #GtkWidget
12672  * @align: the horizontal alignment
12673  *
12674  * Sets the horizontal alignment of @widget.
12675  * See the #GtkWidget:halign property.
12676  */
12677 void
12678 gtk_widget_set_halign (GtkWidget *widget,
12679                        GtkAlign   align)
12680 {
12681   GtkWidgetAuxInfo *aux_info;
12682
12683   g_return_if_fail (GTK_IS_WIDGET (widget));
12684
12685   aux_info = gtk_widget_get_aux_info (widget, TRUE);
12686
12687   if (aux_info->halign == align)
12688     return;
12689
12690   aux_info->halign = align;
12691   gtk_widget_queue_resize (widget);
12692   g_object_notify (G_OBJECT (widget), "halign");
12693 }
12694
12695 /**
12696  * gtk_widget_get_valign:
12697  * @widget: a #GtkWidget
12698  *
12699  * Gets the value of the #GtkWidget:valign property.
12700  *
12701  * Returns: the vertical alignment of @widget
12702  */
12703 GtkAlign
12704 gtk_widget_get_valign (GtkWidget *widget)
12705 {
12706   g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_ALIGN_FILL);
12707   return _gtk_widget_get_aux_info_or_defaults (widget)->valign;
12708 }
12709
12710 /**
12711  * gtk_widget_set_valign:
12712  * @widget: a #GtkWidget
12713  * @align: the vertical alignment
12714  *
12715  * Sets the vertical alignment of @widget.
12716  * See the #GtkWidget:valign property.
12717  */
12718 void
12719 gtk_widget_set_valign (GtkWidget *widget,
12720                        GtkAlign   align)
12721 {
12722   GtkWidgetAuxInfo *aux_info;
12723
12724   g_return_if_fail (GTK_IS_WIDGET (widget));
12725
12726   aux_info = gtk_widget_get_aux_info (widget, TRUE);
12727
12728   if (aux_info->valign == align)
12729     return;
12730
12731   aux_info->valign = align;
12732   gtk_widget_queue_resize (widget);
12733   g_object_notify (G_OBJECT (widget), "valign");
12734 }
12735
12736 /**
12737  * gtk_widget_get_margin_left:
12738  * @widget: a #GtkWidget
12739  *
12740  * Gets the value of the #GtkWidget:margin-left property.
12741  *
12742  * Returns: The left margin of @widget
12743  *
12744  * Since: 3.0
12745  */
12746 gint
12747 gtk_widget_get_margin_left (GtkWidget *widget)
12748 {
12749   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
12750
12751   return _gtk_widget_get_aux_info_or_defaults (widget)->margin.left;
12752 }
12753
12754 /**
12755  * gtk_widget_set_margin_left:
12756  * @widget: a #GtkWidget
12757  * @margin: the left margin
12758  *
12759  * Sets the left margin of @widget.
12760  * See the #GtkWidget:margin-left property.
12761  *
12762  * Since: 3.0
12763  */
12764 void
12765 gtk_widget_set_margin_left (GtkWidget *widget,
12766                             gint       margin)
12767 {
12768   GtkWidgetAuxInfo *aux_info;
12769
12770   g_return_if_fail (GTK_IS_WIDGET (widget));
12771   g_return_if_fail (margin <= G_MAXINT16);
12772
12773   aux_info = gtk_widget_get_aux_info (widget, TRUE);
12774
12775   if (aux_info->margin.left == margin)
12776     return;
12777
12778   aux_info->margin.left = margin;
12779   gtk_widget_queue_resize (widget);
12780   g_object_notify (G_OBJECT (widget), "margin-left");
12781 }
12782
12783 /**
12784  * gtk_widget_get_margin_right:
12785  * @widget: a #GtkWidget
12786  *
12787  * Gets the value of the #GtkWidget:margin-right property.
12788  *
12789  * Returns: The right margin of @widget
12790  *
12791  * Since: 3.0
12792  */
12793 gint
12794 gtk_widget_get_margin_right (GtkWidget *widget)
12795 {
12796   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
12797
12798   return _gtk_widget_get_aux_info_or_defaults (widget)->margin.right;
12799 }
12800
12801 /**
12802  * gtk_widget_set_margin_right:
12803  * @widget: a #GtkWidget
12804  * @margin: the right margin
12805  *
12806  * Sets the right margin of @widget.
12807  * See the #GtkWidget:margin-right property.
12808  *
12809  * Since: 3.0
12810  */
12811 void
12812 gtk_widget_set_margin_right (GtkWidget *widget,
12813                              gint       margin)
12814 {
12815   GtkWidgetAuxInfo *aux_info;
12816
12817   g_return_if_fail (GTK_IS_WIDGET (widget));
12818   g_return_if_fail (margin <= G_MAXINT16);
12819
12820   aux_info = gtk_widget_get_aux_info (widget, TRUE);
12821
12822   if (aux_info->margin.right == margin)
12823     return;
12824
12825   aux_info->margin.right = margin;
12826   gtk_widget_queue_resize (widget);
12827   g_object_notify (G_OBJECT (widget), "margin-right");
12828 }
12829
12830 /**
12831  * gtk_widget_get_margin_top:
12832  * @widget: a #GtkWidget
12833  *
12834  * Gets the value of the #GtkWidget:margin-top property.
12835  *
12836  * Returns: The top margin of @widget
12837  *
12838  * Since: 3.0
12839  */
12840 gint
12841 gtk_widget_get_margin_top (GtkWidget *widget)
12842 {
12843   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
12844
12845   return _gtk_widget_get_aux_info_or_defaults (widget)->margin.top;
12846 }
12847
12848 /**
12849  * gtk_widget_set_margin_top:
12850  * @widget: a #GtkWidget
12851  * @margin: the top margin
12852  *
12853  * Sets the top margin of @widget.
12854  * See the #GtkWidget:margin-top property.
12855  *
12856  * Since: 3.0
12857  */
12858 void
12859 gtk_widget_set_margin_top (GtkWidget *widget,
12860                            gint       margin)
12861 {
12862   GtkWidgetAuxInfo *aux_info;
12863
12864   g_return_if_fail (GTK_IS_WIDGET (widget));
12865   g_return_if_fail (margin <= G_MAXINT16);
12866
12867   aux_info = gtk_widget_get_aux_info (widget, TRUE);
12868
12869   if (aux_info->margin.top == margin)
12870     return;
12871
12872   aux_info->margin.top = margin;
12873   gtk_widget_queue_resize (widget);
12874   g_object_notify (G_OBJECT (widget), "margin-top");
12875 }
12876
12877 /**
12878  * gtk_widget_get_margin_bottom:
12879  * @widget: a #GtkWidget
12880  *
12881  * Gets the value of the #GtkWidget:margin-bottom property.
12882  *
12883  * Returns: The bottom margin of @widget
12884  *
12885  * Since: 3.0
12886  */
12887 gint
12888 gtk_widget_get_margin_bottom (GtkWidget *widget)
12889 {
12890   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
12891
12892   return _gtk_widget_get_aux_info_or_defaults (widget)->margin.bottom;
12893 }
12894
12895 /**
12896  * gtk_widget_set_margin_bottom:
12897  * @widget: a #GtkWidget
12898  * @margin: the bottom margin
12899  *
12900  * Sets the bottom margin of @widget.
12901  * See the #GtkWidget:margin-bottom property.
12902  *
12903  * Since: 3.0
12904  */
12905 void
12906 gtk_widget_set_margin_bottom (GtkWidget *widget,
12907                               gint       margin)
12908 {
12909   GtkWidgetAuxInfo *aux_info;
12910
12911   g_return_if_fail (GTK_IS_WIDGET (widget));
12912   g_return_if_fail (margin <= G_MAXINT16);
12913
12914   aux_info = gtk_widget_get_aux_info (widget, TRUE);
12915
12916   if (aux_info->margin.bottom == margin)
12917     return;
12918
12919   aux_info->margin.bottom = margin;
12920   gtk_widget_queue_resize (widget);
12921   g_object_notify (G_OBJECT (widget), "margin-bottom");
12922 }
12923
12924 /**
12925  * gtk_widget_get_clipboard:
12926  * @widget: a #GtkWidget
12927  * @selection: a #GdkAtom which identifies the clipboard
12928  *             to use. %GDK_SELECTION_CLIPBOARD gives the
12929  *             default clipboard. Another common value
12930  *             is %GDK_SELECTION_PRIMARY, which gives
12931  *             the primary X selection.
12932  *
12933  * Returns the clipboard object for the given selection to
12934  * be used with @widget. @widget must have a #GdkDisplay
12935  * associated with it, so must be attached to a toplevel
12936  * window.
12937  *
12938  * Return value: (transfer none): the appropriate clipboard object. If no
12939  *             clipboard already exists, a new one will
12940  *             be created. Once a clipboard object has
12941  *             been created, it is persistent for all time.
12942  *
12943  * Since: 2.2
12944  **/
12945 GtkClipboard *
12946 gtk_widget_get_clipboard (GtkWidget *widget, GdkAtom selection)
12947 {
12948   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
12949   g_return_val_if_fail (gtk_widget_has_screen (widget), NULL);
12950
12951   return gtk_clipboard_get_for_display (gtk_widget_get_display (widget),
12952                                         selection);
12953 }
12954
12955 /**
12956  * gtk_widget_list_mnemonic_labels:
12957  * @widget: a #GtkWidget
12958  *
12959  * Returns a newly allocated list of the widgets, normally labels, for
12960  * which this widget is the target of a mnemonic (see for example,
12961  * gtk_label_set_mnemonic_widget()).
12962
12963  * The widgets in the list are not individually referenced. If you
12964  * want to iterate through the list and perform actions involving
12965  * callbacks that might destroy the widgets, you
12966  * <emphasis>must</emphasis> call <literal>g_list_foreach (result,
12967  * (GFunc)g_object_ref, NULL)</literal> first, and then unref all the
12968  * widgets afterwards.
12969
12970  * Return value: (element-type GtkWidget) (transfer container): the list of
12971  *  mnemonic labels; free this list
12972  *  with g_list_free() when you are done with it.
12973  *
12974  * Since: 2.4
12975  **/
12976 GList *
12977 gtk_widget_list_mnemonic_labels (GtkWidget *widget)
12978 {
12979   GList *list = NULL;
12980   GSList *l;
12981
12982   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
12983
12984   for (l = g_object_get_qdata (G_OBJECT (widget), quark_mnemonic_labels); l; l = l->next)
12985     list = g_list_prepend (list, l->data);
12986
12987   return list;
12988 }
12989
12990 /**
12991  * gtk_widget_add_mnemonic_label:
12992  * @widget: a #GtkWidget
12993  * @label: a #GtkWidget that acts as a mnemonic label for @widget
12994  *
12995  * Adds a widget to the list of mnemonic labels for
12996  * this widget. (See gtk_widget_list_mnemonic_labels()). Note the
12997  * list of mnemonic labels for the widget is cleared when the
12998  * widget is destroyed, so the caller must make sure to update
12999  * its internal state at this point as well, by using a connection
13000  * to the #GtkWidget::destroy signal or a weak notifier.
13001  *
13002  * Since: 2.4
13003  **/
13004 void
13005 gtk_widget_add_mnemonic_label (GtkWidget *widget,
13006                                GtkWidget *label)
13007 {
13008   GSList *old_list, *new_list;
13009
13010   g_return_if_fail (GTK_IS_WIDGET (widget));
13011   g_return_if_fail (GTK_IS_WIDGET (label));
13012
13013   old_list = g_object_steal_qdata (G_OBJECT (widget), quark_mnemonic_labels);
13014   new_list = g_slist_prepend (old_list, label);
13015
13016   g_object_set_qdata_full (G_OBJECT (widget), quark_mnemonic_labels,
13017                            new_list, (GDestroyNotify) g_slist_free);
13018 }
13019
13020 /**
13021  * gtk_widget_remove_mnemonic_label:
13022  * @widget: a #GtkWidget
13023  * @label: a #GtkWidget that was previously set as a mnemnic label for
13024  *         @widget with gtk_widget_add_mnemonic_label().
13025  *
13026  * Removes a widget from the list of mnemonic labels for
13027  * this widget. (See gtk_widget_list_mnemonic_labels()). The widget
13028  * must have previously been added to the list with
13029  * gtk_widget_add_mnemonic_label().
13030  *
13031  * Since: 2.4
13032  **/
13033 void
13034 gtk_widget_remove_mnemonic_label (GtkWidget *widget,
13035                                   GtkWidget *label)
13036 {
13037   GSList *old_list, *new_list;
13038
13039   g_return_if_fail (GTK_IS_WIDGET (widget));
13040   g_return_if_fail (GTK_IS_WIDGET (label));
13041
13042   old_list = g_object_steal_qdata (G_OBJECT (widget), quark_mnemonic_labels);
13043   new_list = g_slist_remove (old_list, label);
13044
13045   if (new_list)
13046     g_object_set_qdata_full (G_OBJECT (widget), quark_mnemonic_labels,
13047                              new_list, (GDestroyNotify) g_slist_free);
13048 }
13049
13050 /**
13051  * gtk_widget_get_no_show_all:
13052  * @widget: a #GtkWidget
13053  *
13054  * Returns the current value of the #GtkWidget:no-show-all property,
13055  * which determines whether calls to gtk_widget_show_all()
13056  * will affect this widget.
13057  *
13058  * Return value: the current value of the "no-show-all" property.
13059  *
13060  * Since: 2.4
13061  **/
13062 gboolean
13063 gtk_widget_get_no_show_all (GtkWidget *widget)
13064 {
13065   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
13066
13067   return widget->priv->no_show_all;
13068 }
13069
13070 /**
13071  * gtk_widget_set_no_show_all:
13072  * @widget: a #GtkWidget
13073  * @no_show_all: the new value for the "no-show-all" property
13074  *
13075  * Sets the #GtkWidget:no-show-all property, which determines whether
13076  * calls to gtk_widget_show_all() will affect this widget.
13077  *
13078  * This is mostly for use in constructing widget hierarchies with externally
13079  * controlled visibility, see #GtkUIManager.
13080  *
13081  * Since: 2.4
13082  **/
13083 void
13084 gtk_widget_set_no_show_all (GtkWidget *widget,
13085                             gboolean   no_show_all)
13086 {
13087   g_return_if_fail (GTK_IS_WIDGET (widget));
13088
13089   no_show_all = (no_show_all != FALSE);
13090
13091   if (widget->priv->no_show_all != no_show_all)
13092     {
13093       widget->priv->no_show_all = no_show_all;
13094
13095       g_object_notify (G_OBJECT (widget), "no-show-all");
13096     }
13097 }
13098
13099
13100 static void
13101 gtk_widget_real_set_has_tooltip (GtkWidget *widget,
13102                                  gboolean   has_tooltip,
13103                                  gboolean   force)
13104 {
13105   GtkWidgetPrivate *priv = widget->priv;
13106   gboolean priv_has_tooltip;
13107
13108   priv_has_tooltip = GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (widget),
13109                                        quark_has_tooltip));
13110
13111   if (priv_has_tooltip != has_tooltip || force)
13112     {
13113       priv_has_tooltip = has_tooltip;
13114
13115       if (priv_has_tooltip)
13116         {
13117           if (gtk_widget_get_realized (widget) && !gtk_widget_get_has_window (widget))
13118             gdk_window_set_events (priv->window,
13119                                    gdk_window_get_events (priv->window) |
13120                                    GDK_LEAVE_NOTIFY_MASK |
13121                                    GDK_POINTER_MOTION_MASK |
13122                                    GDK_POINTER_MOTION_HINT_MASK);
13123
13124           if (gtk_widget_get_has_window (widget))
13125               gtk_widget_add_events (widget,
13126                                      GDK_LEAVE_NOTIFY_MASK |
13127                                      GDK_POINTER_MOTION_MASK |
13128                                      GDK_POINTER_MOTION_HINT_MASK);
13129         }
13130
13131       g_object_set_qdata (G_OBJECT (widget), quark_has_tooltip,
13132                           GUINT_TO_POINTER (priv_has_tooltip));
13133     }
13134 }
13135
13136 /**
13137  * gtk_widget_set_tooltip_window:
13138  * @widget: a #GtkWidget
13139  * @custom_window: (allow-none): a #GtkWindow, or %NULL
13140  *
13141  * Replaces the default, usually yellow, window used for displaying
13142  * tooltips with @custom_window. GTK+ will take care of showing and
13143  * hiding @custom_window at the right moment, to behave likewise as
13144  * the default tooltip window. If @custom_window is %NULL, the default
13145  * tooltip window will be used.
13146  *
13147  * If the custom window should have the default theming it needs to
13148  * have the name "gtk-tooltip", see gtk_widget_set_name().
13149  *
13150  * Since: 2.12
13151  */
13152 void
13153 gtk_widget_set_tooltip_window (GtkWidget *widget,
13154                                GtkWindow *custom_window)
13155 {
13156   gboolean has_tooltip;
13157   gchar *tooltip_markup;
13158
13159   g_return_if_fail (GTK_IS_WIDGET (widget));
13160   g_return_if_fail (custom_window == NULL || GTK_IS_WINDOW (custom_window));
13161
13162   tooltip_markup = g_object_get_qdata (G_OBJECT (widget), quark_tooltip_markup);
13163
13164   if (custom_window)
13165     g_object_ref (custom_window);
13166
13167   g_object_set_qdata_full (G_OBJECT (widget), quark_tooltip_window,
13168                            custom_window, g_object_unref);
13169
13170   has_tooltip = (custom_window != NULL || tooltip_markup != NULL);
13171   gtk_widget_real_set_has_tooltip (widget, has_tooltip, FALSE);
13172
13173   if (has_tooltip && gtk_widget_get_visible (widget))
13174     gtk_widget_queue_tooltip_query (widget);
13175 }
13176
13177 /**
13178  * gtk_widget_get_tooltip_window:
13179  * @widget: a #GtkWidget
13180  *
13181  * Returns the #GtkWindow of the current tooltip. This can be the
13182  * GtkWindow created by default, or the custom tooltip window set
13183  * using gtk_widget_set_tooltip_window().
13184  *
13185  * Return value: (transfer none): The #GtkWindow of the current tooltip.
13186  *
13187  * Since: 2.12
13188  */
13189 GtkWindow *
13190 gtk_widget_get_tooltip_window (GtkWidget *widget)
13191 {
13192   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
13193
13194   return g_object_get_qdata (G_OBJECT (widget), quark_tooltip_window);
13195 }
13196
13197 /**
13198  * gtk_widget_trigger_tooltip_query:
13199  * @widget: a #GtkWidget
13200  *
13201  * Triggers a tooltip query on the display where the toplevel of @widget
13202  * is located. See gtk_tooltip_trigger_tooltip_query() for more
13203  * information.
13204  *
13205  * Since: 2.12
13206  */
13207 void
13208 gtk_widget_trigger_tooltip_query (GtkWidget *widget)
13209 {
13210   gtk_tooltip_trigger_tooltip_query (gtk_widget_get_display (widget));
13211 }
13212
13213 static guint tooltip_query_id;
13214 static GSList *tooltip_query_displays;
13215
13216 static gboolean
13217 tooltip_query_idle (gpointer data)
13218 {
13219   g_slist_foreach (tooltip_query_displays, (GFunc)gtk_tooltip_trigger_tooltip_query, NULL);
13220   g_slist_foreach (tooltip_query_displays, (GFunc)g_object_unref, NULL);
13221   g_slist_free (tooltip_query_displays);
13222
13223   tooltip_query_displays = NULL;
13224   tooltip_query_id = 0;
13225
13226   return FALSE;
13227 }
13228
13229 static void
13230 gtk_widget_queue_tooltip_query (GtkWidget *widget)
13231 {
13232   GdkDisplay *display;
13233
13234   display = gtk_widget_get_display (widget);
13235
13236   if (!g_slist_find (tooltip_query_displays, display))
13237     tooltip_query_displays = g_slist_prepend (tooltip_query_displays, g_object_ref (display));
13238
13239   if (tooltip_query_id == 0)
13240     tooltip_query_id = gdk_threads_add_idle (tooltip_query_idle, NULL);
13241 }
13242
13243 /**
13244  * gtk_widget_set_tooltip_text:
13245  * @widget: a #GtkWidget
13246  * @text: the contents of the tooltip for @widget
13247  *
13248  * Sets @text as the contents of the tooltip. This function will take
13249  * care of setting #GtkWidget:has-tooltip to %TRUE and of the default
13250  * handler for the #GtkWidget::query-tooltip signal.
13251  *
13252  * See also the #GtkWidget:tooltip-text property and gtk_tooltip_set_text().
13253  *
13254  * Since: 2.12
13255  */
13256 void
13257 gtk_widget_set_tooltip_text (GtkWidget   *widget,
13258                              const gchar *text)
13259 {
13260   g_return_if_fail (GTK_IS_WIDGET (widget));
13261
13262   g_object_set (G_OBJECT (widget), "tooltip-text", text, NULL);
13263 }
13264
13265 /**
13266  * gtk_widget_get_tooltip_text:
13267  * @widget: a #GtkWidget
13268  *
13269  * Gets the contents of the tooltip for @widget.
13270  *
13271  * Return value: the tooltip text, or %NULL. You should free the
13272  *   returned string with g_free() when done.
13273  *
13274  * Since: 2.12
13275  */
13276 gchar *
13277 gtk_widget_get_tooltip_text (GtkWidget *widget)
13278 {
13279   gchar *text = NULL;
13280
13281   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
13282
13283   g_object_get (G_OBJECT (widget), "tooltip-text", &text, NULL);
13284
13285   return text;
13286 }
13287
13288 /**
13289  * gtk_widget_set_tooltip_markup:
13290  * @widget: a #GtkWidget
13291  * @markup: (allow-none): the contents of the tooltip for @widget, or %NULL
13292  *
13293  * Sets @markup as the contents of the tooltip, which is marked up with
13294  *  the <link linkend="PangoMarkupFormat">Pango text markup language</link>.
13295  *
13296  * This function will take care of setting #GtkWidget:has-tooltip to %TRUE
13297  * and of the default handler for the #GtkWidget::query-tooltip signal.
13298  *
13299  * See also the #GtkWidget:tooltip-markup property and
13300  * gtk_tooltip_set_markup().
13301  *
13302  * Since: 2.12
13303  */
13304 void
13305 gtk_widget_set_tooltip_markup (GtkWidget   *widget,
13306                                const gchar *markup)
13307 {
13308   g_return_if_fail (GTK_IS_WIDGET (widget));
13309
13310   g_object_set (G_OBJECT (widget), "tooltip-markup", markup, NULL);
13311 }
13312
13313 /**
13314  * gtk_widget_get_tooltip_markup:
13315  * @widget: a #GtkWidget
13316  *
13317  * Gets the contents of the tooltip for @widget.
13318  *
13319  * Return value: the tooltip text, or %NULL. You should free the
13320  *   returned string with g_free() when done.
13321  *
13322  * Since: 2.12
13323  */
13324 gchar *
13325 gtk_widget_get_tooltip_markup (GtkWidget *widget)
13326 {
13327   gchar *text = NULL;
13328
13329   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
13330
13331   g_object_get (G_OBJECT (widget), "tooltip-markup", &text, NULL);
13332
13333   return text;
13334 }
13335
13336 /**
13337  * gtk_widget_set_has_tooltip:
13338  * @widget: a #GtkWidget
13339  * @has_tooltip: whether or not @widget has a tooltip.
13340  *
13341  * Sets the has-tooltip property on @widget to @has_tooltip.  See
13342  * #GtkWidget:has-tooltip for more information.
13343  *
13344  * Since: 2.12
13345  */
13346 void
13347 gtk_widget_set_has_tooltip (GtkWidget *widget,
13348                             gboolean   has_tooltip)
13349 {
13350   g_return_if_fail (GTK_IS_WIDGET (widget));
13351
13352   g_object_set (G_OBJECT (widget), "has-tooltip", has_tooltip, NULL);
13353 }
13354
13355 /**
13356  * gtk_widget_get_has_tooltip:
13357  * @widget: a #GtkWidget
13358  *
13359  * Returns the current value of the has-tooltip property.  See
13360  * #GtkWidget:has-tooltip for more information.
13361  *
13362  * Return value: current value of has-tooltip on @widget.
13363  *
13364  * Since: 2.12
13365  */
13366 gboolean
13367 gtk_widget_get_has_tooltip (GtkWidget *widget)
13368 {
13369   gboolean has_tooltip = FALSE;
13370
13371   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
13372
13373   g_object_get (G_OBJECT (widget), "has-tooltip", &has_tooltip, NULL);
13374
13375   return has_tooltip;
13376 }
13377
13378 /**
13379  * gtk_widget_get_allocation:
13380  * @widget: a #GtkWidget
13381  * @allocation: (out): a pointer to a #GtkAllocation to copy to
13382  *
13383  * Retrieves the widget's allocation.
13384  *
13385  * Note, when implementing a #GtkContainer: a widget's allocation will
13386  * be its "adjusted" allocation, that is, the widget's parent
13387  * container typically calls gtk_widget_size_allocate() with an
13388  * allocation, and that allocation is then adjusted (to handle margin
13389  * and alignment for example) before assignment to the widget.
13390  * gtk_widget_get_allocation() returns the adjusted allocation that
13391  * was actually assigned to the widget. The adjusted allocation is
13392  * guaranteed to be completely contained within the
13393  * gtk_widget_size_allocate() allocation, however. So a #GtkContainer
13394  * is guaranteed that its children stay inside the assigned bounds,
13395  * but not that they have exactly the bounds the container assigned.
13396  * There is no way to get the original allocation assigned by
13397  * gtk_widget_size_allocate(), since it isn't stored; if a container
13398  * implementation needs that information it will have to track it itself.
13399  *
13400  * Since: 2.18
13401  */
13402 void
13403 gtk_widget_get_allocation (GtkWidget     *widget,
13404                            GtkAllocation *allocation)
13405 {
13406   GtkWidgetPrivate *priv;
13407
13408   g_return_if_fail (GTK_IS_WIDGET (widget));
13409   g_return_if_fail (allocation != NULL);
13410
13411   priv = widget->priv;
13412
13413   *allocation = priv->allocation;
13414 }
13415
13416 /**
13417  * gtk_widget_set_allocation:
13418  * @widget: a #GtkWidget
13419  * @allocation: a pointer to a #GtkAllocation to copy from
13420  *
13421  * Sets the widget's allocation.  This should not be used
13422  * directly, but from within a widget's size_allocate method.
13423  *
13424  * The allocation set should be the "adjusted" or actual
13425  * allocation. If you're implementing a #GtkContainer, you want to use
13426  * gtk_widget_size_allocate() instead of gtk_widget_set_allocation().
13427  * The GtkWidgetClass::adjust_size_allocation virtual method adjusts the
13428  * allocation inside gtk_widget_size_allocate() to create an adjusted
13429  * allocation.
13430  *
13431  * Since: 2.18
13432  */
13433 void
13434 gtk_widget_set_allocation (GtkWidget           *widget,
13435                            const GtkAllocation *allocation)
13436 {
13437   GtkWidgetPrivate *priv;
13438
13439   g_return_if_fail (GTK_IS_WIDGET (widget));
13440   g_return_if_fail (allocation != NULL);
13441
13442   priv = widget->priv;
13443
13444   priv->allocation = *allocation;
13445 }
13446
13447 /**
13448  * gtk_widget_get_allocated_width:
13449  * @widget: the widget to query
13450  *
13451  * Returns the width that has currently been allocated to @widget.
13452  * This function is intended to be used when implementing handlers
13453  * for the #GtkWidget::draw function.
13454  *
13455  * Returns: the width of the @widget
13456  **/
13457 int
13458 gtk_widget_get_allocated_width (GtkWidget *widget)
13459 {
13460   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
13461
13462   return widget->priv->allocation.width;
13463 }
13464
13465 /**
13466  * gtk_widget_get_allocated_height:
13467  * @widget: the widget to query
13468  *
13469  * Returns the height that has currently been allocated to @widget.
13470  * This function is intended to be used when implementing handlers
13471  * for the #GtkWidget::draw function.
13472  *
13473  * Returns: the height of the @widget
13474  **/
13475 int
13476 gtk_widget_get_allocated_height (GtkWidget *widget)
13477 {
13478   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
13479
13480   return widget->priv->allocation.height;
13481 }
13482
13483 /**
13484  * gtk_widget_get_requisition:
13485  * @widget: a #GtkWidget
13486  * @requisition: (out): a pointer to a #GtkRequisition to copy to
13487  *
13488  * Retrieves the widget's requisition.
13489  *
13490  * This function should only be used by widget implementations in
13491  * order to figure whether the widget's requisition has actually
13492  * changed after some internal state change (so that they can call
13493  * gtk_widget_queue_resize() instead of gtk_widget_queue_draw()).
13494  *
13495  * Normally, gtk_widget_size_request() should be used.
13496  *
13497  * Since: 2.20
13498  *
13499  * Deprecated: 3.0: The #GtkRequisition cache on the widget was
13500  * removed, If you need to cache sizes across requests and allocations,
13501  * add an explicit cache to the widget in question instead.
13502  */
13503 void
13504 gtk_widget_get_requisition (GtkWidget      *widget,
13505                             GtkRequisition *requisition)
13506 {
13507   g_return_if_fail (GTK_IS_WIDGET (widget));
13508   g_return_if_fail (requisition != NULL);
13509
13510   gtk_widget_get_preferred_size (widget, requisition, NULL);
13511 }
13512
13513 /**
13514  * gtk_widget_set_window:
13515  * @widget: a #GtkWidget
13516  * @window: (transfer full): a #GdkWindow
13517  *
13518  * Sets a widget's window. This function should only be used in a
13519  * widget's #GtkWidget::realize implementation. The %window passed is
13520  * usually either new window created with gdk_window_new(), or the
13521  * window of its parent widget as returned by
13522  * gtk_widget_get_parent_window().
13523  *
13524  * Widgets must indicate whether they will create their own #GdkWindow
13525  * by calling gtk_widget_set_has_window(). This is usually done in the
13526  * widget's init() function.
13527  *
13528  * <note><para>This function does not add any reference to @window.</para></note>
13529  *
13530  * Since: 2.18
13531  */
13532 void
13533 gtk_widget_set_window (GtkWidget *widget,
13534                        GdkWindow *window)
13535 {
13536   GtkWidgetPrivate *priv;
13537
13538   g_return_if_fail (GTK_IS_WIDGET (widget));
13539   g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
13540
13541   priv = widget->priv;
13542
13543   if (priv->window != window)
13544     {
13545       priv->window = window;
13546       g_object_notify (G_OBJECT (widget), "window");
13547     }
13548 }
13549
13550 /**
13551  * gtk_widget_get_window:
13552  * @widget: a #GtkWidget
13553  *
13554  * Returns the widget's window if it is realized, %NULL otherwise
13555  *
13556  * Return value: (transfer none): @widget's window.
13557  *
13558  * Since: 2.14
13559  */
13560 GdkWindow*
13561 gtk_widget_get_window (GtkWidget *widget)
13562 {
13563   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
13564
13565   return widget->priv->window;
13566 }
13567
13568 /**
13569  * gtk_widget_get_support_multidevice:
13570  * @widget: a #GtkWidget
13571  *
13572  * Returns %TRUE if @widget is multiple pointer aware. See
13573  * gtk_widget_set_support_multidevice() for more information.
13574  *
13575  * Returns: %TRUE if @widget is multidevice aware.
13576  **/
13577 gboolean
13578 gtk_widget_get_support_multidevice (GtkWidget *widget)
13579 {
13580   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
13581
13582   return widget->priv->multidevice;
13583 }
13584
13585 /**
13586  * gtk_widget_set_support_multidevice:
13587  * @widget: a #GtkWidget
13588  * @support_multidevice: %TRUE to support input from multiple devices.
13589  *
13590  * Enables or disables multiple pointer awareness. If this setting is %TRUE,
13591  * @widget will start receiving multiple, per device enter/leave events. Note
13592  * that if custom #GdkWindow<!-- -->s are created in #GtkWidget::realize,
13593  * gdk_window_set_support_multidevice() will have to be called manually on them.
13594  *
13595  * Since: 3.0
13596  **/
13597 void
13598 gtk_widget_set_support_multidevice (GtkWidget *widget,
13599                                     gboolean   support_multidevice)
13600 {
13601   GtkWidgetPrivate *priv;
13602
13603   g_return_if_fail (GTK_IS_WIDGET (widget));
13604
13605   priv = widget->priv;
13606   priv->multidevice = (support_multidevice == TRUE);
13607
13608   if (gtk_widget_get_realized (widget))
13609     gdk_window_set_support_multidevice (priv->window, support_multidevice);
13610 }
13611
13612 static void
13613 _gtk_widget_set_has_focus (GtkWidget *widget,
13614                            gboolean   has_focus)
13615 {
13616   widget->priv->has_focus = has_focus;
13617
13618   if (has_focus)
13619     gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_FOCUSED, FALSE);
13620   else
13621     gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_FOCUSED);
13622 }
13623
13624 /**
13625  * gtk_widget_send_focus_change:
13626  * @widget: a #GtkWidget
13627  * @event: a #GdkEvent of type GDK_FOCUS_CHANGE
13628  *
13629  * Sends the focus change @event to @widget
13630  *
13631  * This function is not meant to be used by applications. The only time it
13632  * should be used is when it is necessary for a #GtkWidget to assign focus
13633  * to a widget that is semantically owned by the first widget even though
13634  * it's not a direct child - for instance, a search entry in a floating
13635  * window similar to the quick search in #GtkTreeView.
13636  *
13637  * An example of its usage is:
13638  *
13639  * |[
13640  *   GdkEvent *fevent = gdk_event_new (GDK_FOCUS_CHANGE);
13641  *
13642  *   fevent->focus_change.type = GDK_FOCUS_CHANGE;
13643  *   fevent->focus_change.in = TRUE;
13644  *   fevent->focus_change.window = gtk_widget_get_window (widget);
13645  *   if (fevent->focus_change.window != NULL)
13646  *     g_object_ref (fevent->focus_change.window);
13647  *
13648  *   gtk_widget_send_focus_change (widget, fevent);
13649  *
13650  *   gdk_event_free (event);
13651  * ]|
13652  *
13653  * Return value: the return value from the event signal emission: %TRUE
13654  *   if the event was handled, and %FALSE otherwise
13655  *
13656  * Since: 2.20
13657  */
13658 gboolean
13659 gtk_widget_send_focus_change (GtkWidget *widget,
13660                               GdkEvent  *event)
13661 {
13662   gboolean res;
13663
13664   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
13665   g_return_val_if_fail (event != NULL && event->type == GDK_FOCUS_CHANGE, FALSE);
13666
13667   g_object_ref (widget);
13668
13669   _gtk_widget_set_has_focus (widget, event->focus_change.in);
13670
13671   res = gtk_widget_event (widget, event);
13672
13673   g_object_notify (G_OBJECT (widget), "has-focus");
13674
13675   g_object_unref (widget);
13676
13677   return res;
13678 }
13679
13680 /**
13681  * gtk_widget_in_destruction:
13682  * @widget: a #GtkWidget
13683  *
13684  * Returns whether the widget is currently being destroyed.
13685  * This information can sometimes be used to avoid doing
13686  * unnecessary work.
13687  *
13688  * Returns: %TRUE if @widget is being destroyed
13689  */
13690 gboolean
13691 gtk_widget_in_destruction (GtkWidget *widget)
13692 {
13693   return widget->priv->in_destruction;
13694 }
13695
13696 gboolean
13697 _gtk_widget_get_in_reparent (GtkWidget *widget)
13698 {
13699   return widget->priv->in_reparent;
13700 }
13701
13702 void
13703 _gtk_widget_set_in_reparent (GtkWidget *widget,
13704                              gboolean   in_reparent)
13705 {
13706   widget->priv->in_reparent = in_reparent;
13707 }
13708
13709 gboolean
13710 _gtk_widget_get_anchored (GtkWidget *widget)
13711 {
13712   return widget->priv->anchored;
13713 }
13714
13715 void
13716 _gtk_widget_set_anchored (GtkWidget *widget,
13717                           gboolean   anchored)
13718 {
13719   widget->priv->anchored = anchored;
13720 }
13721
13722 gboolean
13723 _gtk_widget_get_shadowed (GtkWidget *widget)
13724 {
13725   return widget->priv->shadowed;
13726 }
13727
13728 void
13729 _gtk_widget_set_shadowed (GtkWidget *widget,
13730                           gboolean   shadowed)
13731 {
13732   widget->priv->shadowed = shadowed;
13733 }
13734
13735 gboolean
13736 _gtk_widget_get_alloc_needed (GtkWidget *widget)
13737 {
13738   return widget->priv->alloc_needed;
13739 }
13740
13741 void
13742 _gtk_widget_set_alloc_needed (GtkWidget *widget,
13743                               gboolean   alloc_needed)
13744 {
13745   widget->priv->alloc_needed = alloc_needed;
13746 }
13747
13748 gboolean
13749 _gtk_widget_get_width_request_needed (GtkWidget *widget)
13750 {
13751   return widget->priv->width_request_needed;
13752 }
13753
13754 void
13755 _gtk_widget_set_width_request_needed (GtkWidget *widget,
13756                                       gboolean   width_request_needed)
13757 {
13758   widget->priv->width_request_needed = width_request_needed;
13759 }
13760
13761 gboolean
13762 _gtk_widget_get_height_request_needed (GtkWidget *widget)
13763 {
13764   return widget->priv->height_request_needed;
13765 }
13766
13767 void
13768 _gtk_widget_set_height_request_needed (GtkWidget *widget,
13769                                        gboolean   height_request_needed)
13770 {
13771   widget->priv->height_request_needed = height_request_needed;
13772 }
13773
13774 gboolean
13775 _gtk_widget_get_sizegroup_visited (GtkWidget    *widget)
13776 {
13777   return widget->priv->sizegroup_visited;
13778 }
13779
13780 void
13781 _gtk_widget_set_sizegroup_visited (GtkWidget    *widget,
13782                                    gboolean      visited)
13783 {
13784   widget->priv->sizegroup_visited = visited;
13785 }
13786
13787 gboolean
13788 _gtk_widget_get_sizegroup_bumping (GtkWidget    *widget)
13789 {
13790   return widget->priv->sizegroup_bumping;
13791 }
13792
13793 void
13794 _gtk_widget_set_sizegroup_bumping (GtkWidget    *widget,
13795                                    gboolean      bumping)
13796 {
13797   widget->priv->sizegroup_bumping = bumping;
13798 }
13799
13800 void
13801 _gtk_widget_add_sizegroup (GtkWidget    *widget,
13802                            gpointer      group)
13803 {
13804   GSList *groups;
13805
13806   groups = g_object_get_qdata (G_OBJECT (widget), quark_size_groups);
13807   groups = g_slist_prepend (groups, group);
13808   g_object_set_qdata (G_OBJECT (widget), quark_size_groups, groups);
13809
13810   widget->priv->have_size_groups = TRUE;
13811 }
13812
13813 void
13814 _gtk_widget_remove_sizegroup (GtkWidget    *widget,
13815                               gpointer      group)
13816 {
13817   GSList *groups;
13818
13819   groups = g_object_get_qdata (G_OBJECT (widget), quark_size_groups);
13820   groups = g_slist_remove (groups, group);
13821   g_object_set_qdata (G_OBJECT (widget), quark_size_groups, groups);
13822
13823   widget->priv->have_size_groups = groups != NULL;
13824 }
13825
13826 GSList *
13827 _gtk_widget_get_sizegroups (GtkWidget    *widget)
13828 {
13829   if (widget->priv->have_size_groups)
13830     return g_object_get_qdata (G_OBJECT (widget), quark_size_groups);
13831
13832   return NULL;
13833 }
13834
13835 void
13836 _gtk_widget_add_attached_window (GtkWidget    *widget,
13837                                  GtkWindow    *window)
13838 {
13839   widget->priv->attached_windows = g_list_prepend (widget->priv->attached_windows, window);
13840 }
13841
13842 void
13843 _gtk_widget_remove_attached_window (GtkWidget    *widget,
13844                                     GtkWindow    *window)
13845 {
13846   widget->priv->attached_windows = g_list_remove (widget->priv->attached_windows, window);
13847 }
13848
13849 /**
13850  * gtk_widget_path_append_for_widget:
13851  * @path: a widget path
13852  * @widget: the widget to append to the widget path
13853  *
13854  * Appends the data from @widget to the widget hierarchy represented
13855  * by @path. This function is a shortcut for adding information from
13856  * @widget to the given @path. This includes setting the name or
13857  * adding the style classes from @widget.
13858  *
13859  * Returns: the position where the data was inserted
13860  *
13861  * Since: 3.2
13862  */
13863 gint
13864 gtk_widget_path_append_for_widget (GtkWidgetPath *path,
13865                                    GtkWidget     *widget)
13866 {
13867   gint pos;
13868
13869   g_return_val_if_fail (path != NULL, 0);
13870   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
13871
13872   pos = gtk_widget_path_append_type (path, G_OBJECT_TYPE (widget));
13873
13874   if (widget->priv->name)
13875     gtk_widget_path_iter_set_name (path, pos, widget->priv->name);
13876
13877   if (widget->priv->context)
13878     {
13879       GList *classes, *l;
13880
13881       /* Also add any persistent classes in
13882        * the style context the widget path
13883        */
13884       classes = gtk_style_context_list_classes (widget->priv->context);
13885
13886       for (l = classes; l; l = l->next)
13887         gtk_widget_path_iter_add_class (path, pos, l->data);
13888
13889       g_list_free (classes);
13890     }
13891
13892   return pos;
13893 }
13894
13895 GtkWidgetPath *
13896 _gtk_widget_create_path (GtkWidget *widget)
13897 {
13898   GtkWidget *parent;
13899
13900   parent = widget->priv->parent;
13901
13902   if (parent)
13903     return gtk_container_get_path_for_child (GTK_CONTAINER (parent), widget);
13904   else
13905     {
13906       /* Widget is either toplevel or unparented, treat both
13907        * as toplevels style wise, since there are situations
13908        * where style properties might be retrieved on that
13909        * situation.
13910        */
13911       GtkWidget *attach_widget = NULL;
13912       GtkWidgetPath *result;
13913
13914       if (GTK_IS_WINDOW (widget))
13915         attach_widget = gtk_window_get_attached_to (GTK_WINDOW (widget));
13916
13917       if (attach_widget != NULL)
13918         result = gtk_widget_path_copy (gtk_widget_get_path (attach_widget));
13919       else
13920         result = gtk_widget_path_new ();
13921
13922       gtk_widget_path_append_for_widget (result, widget);
13923
13924       return result;
13925     }
13926 }
13927
13928 /**
13929  * gtk_widget_get_path:
13930  * @widget: a #GtkWidget
13931  *
13932  * Returns the #GtkWidgetPath representing @widget, if the widget
13933  * is not connected to a toplevel widget, a partial path will be
13934  * created.
13935  *
13936  * Returns: (transfer none): The #GtkWidgetPath representing @widget
13937  **/
13938 GtkWidgetPath *
13939 gtk_widget_get_path (GtkWidget *widget)
13940 {
13941   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
13942
13943   if (!widget->priv->path)
13944     widget->priv->path = _gtk_widget_create_path (widget);
13945
13946   return widget->priv->path;
13947 }
13948
13949 void
13950 _gtk_widget_style_context_invalidated (GtkWidget *widget)
13951 {
13952   if (widget->priv->path)
13953     {
13954       gtk_widget_path_free (widget->priv->path);
13955       widget->priv->path = NULL;
13956     }
13957
13958   if (gtk_widget_get_realized (widget))
13959     g_signal_emit (widget, widget_signals[STYLE_UPDATED], 0);
13960   else
13961     {
13962       /* Compress all style updates so it
13963        * is only emitted once pre-realize.
13964        */
13965       widget->priv->style_update_pending = TRUE;
13966     }
13967
13968   if (widget->priv->anchored)
13969     gtk_widget_queue_resize (widget);
13970 }
13971
13972 /**
13973  * gtk_widget_get_style_context:
13974  * @widget: a #GtkWidget
13975  *
13976  * Returns the style context associated to @widget.
13977  *
13978  * Returns: (transfer none): a #GtkStyleContext. This memory is owned by @widget and
13979  *          must not be freed.
13980  **/
13981 GtkStyleContext *
13982 gtk_widget_get_style_context (GtkWidget *widget)
13983 {
13984   GtkWidgetPrivate *priv;
13985
13986   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
13987
13988   priv = widget->priv;
13989   
13990   if (G_UNLIKELY (priv->context == NULL))
13991     {
13992       GdkScreen *screen;
13993
13994       priv->context = gtk_style_context_new ();
13995
13996       gtk_style_context_set_direction (priv->context, gtk_widget_get_direction (widget));
13997
13998       screen = gtk_widget_get_screen (widget);
13999       if (screen)
14000         gtk_style_context_set_screen (priv->context, screen);
14001
14002       if (priv->parent)
14003         gtk_style_context_set_parent (priv->context,
14004                                       gtk_widget_get_style_context (priv->parent));
14005
14006       _gtk_style_context_set_widget (priv->context, widget);
14007     }
14008
14009   return widget->priv->context;
14010 }
14011
14012 void
14013 _gtk_widget_invalidate_style_context (GtkWidget    *widget,
14014                                       GtkCssChange  change)
14015 {
14016   GtkWidgetPrivate *priv;
14017
14018   priv = widget->priv;
14019
14020   if (priv->context == NULL)
14021     return;
14022
14023   _gtk_style_context_queue_invalidate (priv->context, change);
14024 }
14025
14026 /**
14027  * gtk_widget_get_modifier_mask:
14028  * @widget: a #GtkWidget
14029  * @intent: the use case for the modifier mask
14030  *
14031  * Returns the modifier mask the @widget's windowing system backend
14032  * uses for a particular purpose.
14033  *
14034  * See gdk_keymap_get_modifier_mask().
14035  *
14036  * Returns: the modifier mask used for @intent.
14037  *
14038  * Since: 3.4
14039  **/
14040 GdkModifierType
14041 gtk_widget_get_modifier_mask (GtkWidget         *widget,
14042                               GdkModifierIntent  intent)
14043 {
14044   GdkDisplay *display;
14045
14046   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
14047
14048   display = gtk_widget_get_display (widget);
14049
14050   return gdk_keymap_get_modifier_mask (gdk_keymap_get_for_display (display),
14051                                        intent);
14052 }
14053
14054 GtkStyle *
14055 _gtk_widget_get_style (GtkWidget *widget)
14056 {
14057   return widget->priv->style;
14058 }
14059
14060 void
14061 _gtk_widget_set_style (GtkWidget *widget,
14062                        GtkStyle  *style)
14063 {
14064   widget->priv->style = style;
14065 }