1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
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.
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.
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/>.
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/.
32 #include <gobject/gvaluecollector.h>
33 #include <gobject/gobjectnotifyqueue.c>
34 #include <cairo-gobject.h>
36 #include "gtkcontainer.h"
37 #include "gtkaccelmapprivate.h"
38 #include "gtkclipboard.h"
39 #include "gtkcssstylepropertyprivate.h"
40 #include "gtkcssnumbervalueprivate.h"
41 #include "gtkiconfactory.h"
43 #include "gtkmarshalers.h"
44 #include "gtkselectionprivate.h"
45 #include "gtksettingsprivate.h"
46 #include "gtksizegroup-private.h"
47 #include "gtksizerequestcacheprivate.h"
48 #include "gtkwidget.h"
49 #include "gtkwidgetprivate.h"
50 #include "gtkwindowprivate.h"
51 #include "gtkcontainerprivate.h"
52 #include "gtkbindings.h"
53 #include "gtkprivate.h"
54 #include "gtkaccessible.h"
55 #include "gtktooltip.h"
56 #include "gtkinvisible.h"
57 #include "gtkbuildable.h"
58 #include "gtkbuilderprivate.h"
59 #include "gtksizerequest.h"
60 #include "gtkstylecontextprivate.h"
61 #include "gtkcssprovider.h"
62 #include "gtkmodifierstyle.h"
63 #include "gtkversion.h"
66 #include "gtktypebuiltins.h"
67 #include "a11y/gtkwidgetaccessible.h"
71 * @Short_description: Base class for all widgets
74 * GtkWidget is the base class all widgets in GTK+ derive from. It manages the
75 * widget lifecycle, states and style.
77 * <refsect2 id="geometry-management">
78 * <title>Height-for-width Geometry Management</title>
80 * GTK+ uses a height-for-width (and width-for-height) geometry management
81 * system. Height-for-width means that a widget can change how much
82 * vertical space it needs, depending on the amount of horizontal space
83 * that it is given (and similar for width-for-height). The most common
84 * example is a label that reflows to fill up the available width, wraps
85 * to fewer lines, and therefore needs less height.
87 * Height-for-width geometry management is implemented in GTK+ by way
88 * of five virtual methods:
90 * <listitem>#GtkWidgetClass.get_request_mode()</listitem>
91 * <listitem>#GtkWidgetClass.get_preferred_width()</listitem>
92 * <listitem>#GtkWidgetClass.get_preferred_height()</listitem>
93 * <listitem>#GtkWidgetClass.get_preferred_height_for_width()</listitem>
94 * <listitem>#GtkWidgetClass.get_preferred_width_for_height()</listitem>
97 * There are some important things to keep in mind when implementing
98 * height-for-width and when using it in container implementations.
100 * The geometry management system will query a widget hierarchy in
101 * only one orientation at a time. When widgets are initially queried
102 * for their minimum sizes it is generally done in two initial passes
103 * in the #GtkSizeRequestMode chosen by the toplevel.
105 * For example, when queried in the normal
106 * %GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH mode:
107 * First, the default minimum and natural width for each widget
108 * in the interface will be computed using gtk_widget_get_preferred_width().
109 * Because the preferred widths for each container depend on the preferred
110 * widths of their children, this information propagates up the hierarchy,
111 * and finally a minimum and natural width is determined for the entire
112 * toplevel. Next, the toplevel will use the minimum width to query for the
113 * minimum height contextual to that width using
114 * gtk_widget_get_preferred_height_for_width(), which will also be a highly
115 * recursive operation. The minimum height for the minimum width is normally
116 * used to set the minimum size constraint on the toplevel
117 * (unless gtk_window_set_geometry_hints() is explicitly used instead).
119 * After the toplevel window has initially requested its size in both
120 * dimensions it can go on to allocate itself a reasonable size (or a size
121 * previously specified with gtk_window_set_default_size()). During the
122 * recursive allocation process it's important to note that request cycles
123 * will be recursively executed while container widgets allocate their children.
124 * Each container widget, once allocated a size, will go on to first share the
125 * space in one orientation among its children and then request each child's
126 * height for its target allocated width or its width for allocated height,
127 * depending. In this way a #GtkWidget will typically be requested its size
128 * a number of times before actually being allocated a size. The size a
129 * widget is finally allocated can of course differ from the size it has
130 * requested. For this reason, #GtkWidget caches a small number of results
131 * to avoid re-querying for the same sizes in one allocation cycle.
133 * See <link linkend="container-geometry-management">GtkContainer's
134 * geometry management section</link>
135 * to learn more about how height-for-width allocations are performed
136 * by container widgets.
138 * If a widget does move content around to intelligently use up the
139 * allocated size then it must support the request in both
140 * #GtkSizeRequestModes even if the widget in question only
141 * trades sizes in a single orientation.
143 * For instance, a #GtkLabel that does height-for-width word wrapping
144 * will not expect to have #GtkWidgetClass.get_preferred_height() called
145 * because that call is specific to a width-for-height request. In this
146 * case the label must return the height required for its own minimum
147 * possible width. By following this rule any widget that handles
148 * height-for-width or width-for-height requests will always be allocated
149 * at least enough space to fit its own content.
151 * Here are some examples of how a %GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH widget
152 * generally deals with width-for-height requests, for #GtkWidgetClass.get_preferred_height()
154 * <programlisting><![CDATA[
156 * foo_widget_get_preferred_height (GtkWidget *widget, gint *min_height, gint *nat_height)
158 * if (i_am_in_height_for_width_mode)
162 * GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget, &min_width, NULL);
163 * GTK_WIDGET_GET_CLASS (widget)->get_preferred_height_for_width (widget, min_width,
164 * min_height, nat_height);
168 * ... some widgets do both. For instance, if a GtkLabel is rotated to 90 degrees
169 * it will return the minimum and natural height for the rotated label here.
172 * ]]></programlisting>
174 * And in #GtkWidgetClass.get_preferred_width_for_height() it will simply return
175 * the minimum and natural width:
177 * <programlisting><![CDATA[
179 * foo_widget_get_preferred_width_for_height (GtkWidget *widget, gint for_height,
180 * gint *min_width, gint *nat_width)
182 * if (i_am_in_height_for_width_mode)
184 * GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget, min_width, nat_width);
188 * ... again if a widget is sometimes operating in width-for-height mode
189 * (like a rotated GtkLabel) it can go ahead and do its real width for
190 * height calculation here.
193 * ]]></programlisting>
195 * Often a widget needs to get its own request during size request or
196 * allocation. For example, when computing height it may need to also
197 * compute width. Or when deciding how to use an allocation, the widget
198 * may need to know its natural size. In these cases, the widget should
199 * be careful to call its virtual methods directly, like this:
201 * <title>Widget calling its own size request method.</title>
203 * GTK_WIDGET_GET_CLASS(widget)->get_preferred_width (widget),
208 * It will not work to use the wrapper functions, such as
209 * gtk_widget_get_preferred_width() inside your own size request
210 * implementation. These return a request adjusted by #GtkSizeGroup
211 * and by the #GtkWidgetClass.adjust_size_request() virtual method. If a
212 * widget used the wrappers inside its virtual method implementations,
213 * then the adjustments (such as widget margins) would be applied
214 * twice. GTK+ therefore does not allow this and will warn if you try
217 * Of course if you are getting the size request for
218 * <emphasis>another</emphasis> widget, such as a child of a
219 * container, you <emphasis>must</emphasis> use the wrapper APIs.
220 * Otherwise, you would not properly consider widget margins,
221 * #GtkSizeGroup, and so forth.
224 * <refsect2 id="style-properties">
225 * <title>Style Properties</title>
227 * <structname>GtkWidget</structname> introduces <firstterm>style
228 * properties</firstterm> - these are basically object properties that are stored
229 * not on the object, but in the style object associated to the widget. Style
230 * properties are set in <link linkend="gtk-Resource-Files">resource files</link>.
231 * This mechanism is used for configuring such things as the location of the
232 * scrollbar arrows through the theme, giving theme authors more control over the
233 * look of applications without the need to write a theme engine in C.
236 * Use gtk_widget_class_install_style_property() to install style properties for
237 * a widget class, gtk_widget_class_find_style_property() or
238 * gtk_widget_class_list_style_properties() to get information about existing
239 * style properties and gtk_widget_style_get_property(), gtk_widget_style_get() or
240 * gtk_widget_style_get_valist() to obtain the value of a style property.
243 * <refsect2 id="GtkWidget-BUILDER-UI">
244 * <title>GtkWidget as GtkBuildable</title>
246 * The GtkWidget implementation of the GtkBuildable interface supports a
247 * custom <accelerator> element, which has attributes named key,
248 * modifiers and signal and allows to specify accelerators.
251 * <title>A UI definition fragment specifying an accelerator</title>
252 * <programlisting><![CDATA[
253 * <object class="GtkButton">
254 * <accelerator key="q" modifiers="GDK_CONTROL_MASK" signal="clicked"/>
256 * ]]></programlisting>
259 * In addition to accelerators, <structname>GtkWidget</structname> also support a
260 * custom <accessible> element, which supports actions and relations.
261 * Properties on the accessible implementation of an object can be set by accessing the
262 * internal child "accessible" of a <structname>GtkWidget</structname>.
265 * <title>A UI definition fragment specifying an accessible</title>
266 * <programlisting><![CDATA[
267 * <object class="GtkButton" id="label1"/>
268 * <property name="label">I am a Label for a Button</property>
270 * <object class="GtkButton" id="button1">
272 * <action action_name="click" translatable="yes">Click the button.</action>
273 * <relation target="label1" type="labelled-by"/>
275 * <child internal-child="accessible">
276 * <object class="AtkObject" id="a11y-button1">
277 * <property name="accessible-name">Clickable Button</property>
281 * ]]></programlisting>
284 * Finally, GtkWidget allows style information such as style classes to
285 * be associated with widgets, using the custom <style> element:
287 * <title>A UI definition fragment specifying an style class</title>
288 * <programlisting><![CDATA[
289 * <object class="GtkButton" id="button1">
291 * <class name="my-special-button-class"/>
292 * <class name="dark-button"/>
295 * ]]></programlisting>
301 /* Add flags here that should not be propagated to children. By default,
302 * all flags will be set on children (think prelight or active), but we
303 * might want to not do this for some.
305 #define GTK_STATE_FLAGS_DONT_PROPAGATE (GTK_STATE_FLAG_FOCUSED | GTK_STATE_FLAG_DIR_LTR | GTK_STATE_FLAG_DIR_RTL)
306 #define GTK_STATE_FLAGS_DO_PROPAGATE (~GTK_STATE_FLAGS_DONT_PROPAGATE)
308 #define WIDGET_CLASS(w) GTK_WIDGET_GET_CLASS (w)
310 #define GTK_STATE_FLAGS_BITS 9
312 struct _GtkWidgetPrivate
314 /* The state of the widget. Needs to be able to hold all GtkStateFlags bits
315 * (defined in "gtkenums.h").
317 guint state_flags : GTK_STATE_FLAGS_BITS;
321 guint in_destruction : 1;
324 guint composite_child : 1;
332 guint can_default : 1;
333 guint has_default : 1;
334 guint receives_default : 1;
337 guint style_update_pending : 1;
338 guint app_paintable : 1;
339 guint double_buffered : 1;
340 guint redraw_on_alloc : 1;
341 guint no_show_all : 1;
342 guint child_visible : 1;
343 guint multidevice : 1;
344 guint has_shape_mask : 1;
345 guint in_reparent : 1;
347 /* Queue-resize related flags */
348 guint alloc_needed : 1;
350 /* Expand-related flags */
351 guint need_compute_expand : 1; /* Need to recompute computed_[hv]_expand */
352 guint computed_hexpand : 1; /* computed results (composite of child flags) */
353 guint computed_vexpand : 1;
354 guint hexpand : 1; /* application-forced expand */
356 guint hexpand_set : 1; /* whether to use application-forced */
357 guint vexpand_set : 1; /* instead of computing from children */
359 /* SizeGroup related flags */
360 guint have_size_groups : 1;
362 guint opacity_group : 1;
363 guint norender_children : 1;
364 guint norender : 1; /* Don't expose windows, instead recurse via draw */
369 /* The widget's name. If the widget does not have a name
370 * (the name is NULL), then its name (as returned by
371 * "gtk_widget_get_name") is its class's name.
372 * Among other things, the widget name is used to determine
373 * the style to use for a widget.
377 /* The list of attached windows to this widget.
378 * We keep a list in order to call reset_style to all of them,
380 GList *attached_windows;
382 /* The style for the widget. The style contains the
383 * colors the widget should be drawn in for each state
384 * along with graphics contexts used to draw with and
385 * the font to use for text.
388 GtkStyleContext *context;
390 /* Widget's path for styling */
393 /* The widget's allocated size */
394 GtkAllocation allocation;
396 /* The widget's requested sizes */
397 SizeRequestCache requests;
399 /* actions attached to this or any parent widget */
402 /* The widget's window or its parent window if it does
403 * not have a window. (Which will be indicated by the
404 * GTK_NO_WINDOW flag being set).
407 GList *registered_windows;
409 /* The widget's parent */
412 /* Animations and other things to update on clock ticks */
413 GList *tick_callbacks;
415 #ifdef G_ENABLE_DEBUG
416 /* Number of gtk_widget_push_verify_invariants () */
417 guint verifying_invariants_count;
418 #endif /* G_ENABLE_DEBUG */
421 struct _GtkWidgetClassPrivate
423 GType accessible_type;
424 AtkRole accessible_role;
453 BUTTON_RELEASE_EVENT,
467 PROPERTY_NOTIFY_EVENT,
468 SELECTION_CLEAR_EVENT,
469 SELECTION_REQUEST_EVENT,
470 SELECTION_NOTIFY_EVENT,
475 VISIBILITY_NOTIFY_EVENT,
489 ACCEL_CLOSURES_CHANGED,
514 PROP_RECEIVES_DEFAULT,
515 PROP_COMPOSITE_CHILD,
524 PROP_DOUBLE_BUFFERED,
539 typedef struct _GtkStateData GtkStateData;
544 guint flags_to_unset;
547 /* --- prototypes --- */
548 static void gtk_widget_base_class_init (gpointer g_class);
549 static void gtk_widget_class_init (GtkWidgetClass *klass);
550 static void gtk_widget_base_class_finalize (GtkWidgetClass *klass);
551 static void gtk_widget_init (GtkWidget *widget);
552 static void gtk_widget_set_property (GObject *object,
556 static void gtk_widget_get_property (GObject *object,
560 static void gtk_widget_constructed (GObject *object);
561 static void gtk_widget_dispose (GObject *object);
562 static void gtk_widget_real_destroy (GtkWidget *object);
563 static void gtk_widget_finalize (GObject *object);
564 static void gtk_widget_real_show (GtkWidget *widget);
565 static void gtk_widget_real_hide (GtkWidget *widget);
566 static void gtk_widget_real_map (GtkWidget *widget);
567 static void gtk_widget_real_unmap (GtkWidget *widget);
568 static void gtk_widget_real_realize (GtkWidget *widget);
569 static void gtk_widget_real_unrealize (GtkWidget *widget);
570 static void gtk_widget_real_size_allocate (GtkWidget *widget,
571 GtkAllocation *allocation);
572 static void gtk_widget_real_style_set (GtkWidget *widget,
573 GtkStyle *previous_style);
574 static void gtk_widget_real_direction_changed(GtkWidget *widget,
575 GtkTextDirection previous_direction);
577 static void gtk_widget_real_grab_focus (GtkWidget *focus_widget);
578 static gboolean gtk_widget_real_query_tooltip (GtkWidget *widget,
581 gboolean keyboard_tip,
582 GtkTooltip *tooltip);
583 static void gtk_widget_real_style_updated (GtkWidget *widget);
584 static gboolean gtk_widget_real_show_help (GtkWidget *widget,
585 GtkWidgetHelpType help_type);
587 static void gtk_widget_dispatch_child_properties_changed (GtkWidget *object,
589 GParamSpec **pspecs);
590 static gboolean gtk_widget_real_key_press_event (GtkWidget *widget,
592 static gboolean gtk_widget_real_key_release_event (GtkWidget *widget,
594 static gboolean gtk_widget_real_focus_in_event (GtkWidget *widget,
595 GdkEventFocus *event);
596 static gboolean gtk_widget_real_focus_out_event (GtkWidget *widget,
597 GdkEventFocus *event);
598 static gboolean gtk_widget_real_touch_event (GtkWidget *widget,
599 GdkEventTouch *event);
600 static gboolean gtk_widget_real_focus (GtkWidget *widget,
601 GtkDirectionType direction);
602 static void gtk_widget_real_move_focus (GtkWidget *widget,
603 GtkDirectionType direction);
604 static gboolean gtk_widget_real_keynav_failed (GtkWidget *widget,
605 GtkDirectionType direction);
606 #ifdef G_ENABLE_DEBUG
607 static void gtk_widget_verify_invariants (GtkWidget *widget);
608 static void gtk_widget_push_verify_invariants (GtkWidget *widget);
609 static void gtk_widget_pop_verify_invariants (GtkWidget *widget);
611 #define gtk_widget_verify_invariants(widget)
612 #define gtk_widget_push_verify_invariants(widget)
613 #define gtk_widget_pop_verify_invariants(widget)
615 static PangoContext* gtk_widget_peek_pango_context (GtkWidget *widget);
616 static void gtk_widget_update_pango_context (GtkWidget *widget);
617 static void gtk_widget_propagate_state (GtkWidget *widget,
619 static void gtk_widget_update_alpha (GtkWidget *widget);
621 static gint gtk_widget_event_internal (GtkWidget *widget,
623 static gboolean gtk_widget_real_mnemonic_activate (GtkWidget *widget,
624 gboolean group_cycling);
625 static void gtk_widget_real_get_width (GtkWidget *widget,
628 static void gtk_widget_real_get_height (GtkWidget *widget,
631 static void gtk_widget_real_get_height_for_width (GtkWidget *widget,
633 gint *minimum_height,
634 gint *natural_height);
635 static void gtk_widget_real_get_width_for_height (GtkWidget *widget,
638 gint *natural_width);
639 static void gtk_widget_real_state_flags_changed (GtkWidget *widget,
640 GtkStateFlags old_state);
641 static const GtkWidgetAuxInfo* _gtk_widget_get_aux_info_or_defaults (GtkWidget *widget);
642 static GtkWidgetAuxInfo* gtk_widget_get_aux_info (GtkWidget *widget,
644 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
645 static AtkObject* gtk_widget_real_get_accessible (GtkWidget *widget);
646 static void gtk_widget_accessible_interface_init (AtkImplementorIface *iface);
647 static AtkObject* gtk_widget_ref_accessible (AtkImplementor *implementor);
648 static void gtk_widget_invalidate_widget_windows (GtkWidget *widget,
649 cairo_region_t *region);
650 static GdkScreen * gtk_widget_get_screen_unchecked (GtkWidget *widget);
651 static gboolean gtk_widget_real_can_activate_accel (GtkWidget *widget,
654 static void gtk_widget_real_set_has_tooltip (GtkWidget *widget,
655 gboolean has_tooltip,
657 static void gtk_widget_buildable_interface_init (GtkBuildableIface *iface);
658 static void gtk_widget_buildable_set_name (GtkBuildable *buildable,
660 static const gchar * gtk_widget_buildable_get_name (GtkBuildable *buildable);
661 static GObject * gtk_widget_buildable_get_internal_child (GtkBuildable *buildable,
663 const gchar *childname);
664 static void gtk_widget_buildable_set_buildable_property (GtkBuildable *buildable,
667 const GValue *value);
668 static gboolean gtk_widget_buildable_custom_tag_start (GtkBuildable *buildable,
671 const gchar *tagname,
672 GMarkupParser *parser,
674 static void gtk_widget_buildable_custom_finished (GtkBuildable *buildable,
677 const gchar *tagname,
679 static void gtk_widget_buildable_parser_finished (GtkBuildable *buildable,
680 GtkBuilder *builder);
682 static GtkSizeRequestMode gtk_widget_real_get_request_mode (GtkWidget *widget);
683 static void gtk_widget_real_get_width (GtkWidget *widget,
686 static void gtk_widget_real_get_height (GtkWidget *widget,
690 static void gtk_widget_queue_tooltip_query (GtkWidget *widget);
693 static void gtk_widget_real_adjust_size_request (GtkWidget *widget,
694 GtkOrientation orientation,
697 static void gtk_widget_real_adjust_size_allocation (GtkWidget *widget,
698 GtkOrientation orientation,
702 gint *allocated_size);
704 static void gtk_widget_set_usize_internal (GtkWidget *widget,
707 GtkQueueResizeFlags flags);
709 static void gtk_widget_add_events_internal (GtkWidget *widget,
712 static void gtk_widget_set_device_enabled_internal (GtkWidget *widget,
717 static void gtk_widget_on_frame_clock_update (GdkFrameClock *frame_clock,
720 static gboolean event_window_is_still_viewable (GdkEvent *event);
721 static void gtk_cairo_set_event (cairo_t *cr,
722 GdkEventExpose *event);
723 static void gtk_widget_propagate_alpha (GtkWidget *widget);
725 /* --- variables --- */
726 static gpointer gtk_widget_parent_class = NULL;
727 static guint widget_signals[LAST_SIGNAL] = { 0 };
728 static guint composite_child_stack = 0;
729 static GtkTextDirection gtk_default_direction = GTK_TEXT_DIR_LTR;
730 static GParamSpecPool *style_property_spec_pool = NULL;
732 static GQuark quark_property_parser = 0;
733 static GQuark quark_aux_info = 0;
734 static GQuark quark_accel_path = 0;
735 static GQuark quark_accel_closures = 0;
736 static GQuark quark_event_mask = 0;
737 static GQuark quark_device_event_mask = 0;
738 static GQuark quark_parent_window = 0;
739 static GQuark quark_pointer_window = 0;
740 static GQuark quark_shape_info = 0;
741 static GQuark quark_input_shape_info = 0;
742 static GQuark quark_pango_context = 0;
743 static GQuark quark_accessible_object = 0;
744 static GQuark quark_mnemonic_labels = 0;
745 static GQuark quark_tooltip_markup = 0;
746 static GQuark quark_has_tooltip = 0;
747 static GQuark quark_tooltip_window = 0;
748 static GQuark quark_visual = 0;
749 static GQuark quark_modifier_style = 0;
750 static GQuark quark_enabled_devices = 0;
751 static GQuark quark_size_groups = 0;
752 GParamSpecPool *_gtk_widget_child_property_pool = NULL;
753 GObjectNotifyContext *_gtk_widget_child_property_notify_context = NULL;
755 /* --- functions --- */
757 gtk_widget_get_type (void)
759 static GType widget_type = 0;
761 if (G_UNLIKELY (widget_type == 0))
763 const GTypeInfo widget_info =
765 sizeof (GtkWidgetClass),
766 gtk_widget_base_class_init,
767 (GBaseFinalizeFunc) gtk_widget_base_class_finalize,
768 (GClassInitFunc) gtk_widget_class_init,
769 NULL, /* class_finalize */
770 NULL, /* class_init */
773 (GInstanceInitFunc) gtk_widget_init,
774 NULL, /* value_table */
777 const GInterfaceInfo accessibility_info =
779 (GInterfaceInitFunc) gtk_widget_accessible_interface_init,
780 (GInterfaceFinalizeFunc) NULL,
781 NULL /* interface data */
784 const GInterfaceInfo buildable_info =
786 (GInterfaceInitFunc) gtk_widget_buildable_interface_init,
787 (GInterfaceFinalizeFunc) NULL,
788 NULL /* interface data */
791 widget_type = g_type_register_static (G_TYPE_INITIALLY_UNOWNED, "GtkWidget",
792 &widget_info, G_TYPE_FLAG_ABSTRACT);
794 g_type_add_class_private (widget_type, sizeof (GtkWidgetClassPrivate));
796 g_type_add_interface_static (widget_type, ATK_TYPE_IMPLEMENTOR,
797 &accessibility_info) ;
798 g_type_add_interface_static (widget_type, GTK_TYPE_BUILDABLE,
806 gtk_widget_base_class_init (gpointer g_class)
808 GtkWidgetClass *klass = g_class;
810 klass->priv = G_TYPE_CLASS_GET_PRIVATE (g_class, GTK_TYPE_WIDGET, GtkWidgetClassPrivate);
814 child_property_notify_dispatcher (GObject *object,
818 GTK_WIDGET_GET_CLASS (object)->dispatch_child_properties_changed (GTK_WIDGET (object), n_pspecs, pspecs);
821 /* We guard against the draw signal callbacks modifying the state of the
822 * cairo context by surounding it with save/restore.
823 * Maybe we should also cairo_new_path() just to be sure?
826 gtk_widget_draw_marshaller (GClosure *closure,
827 GValue *return_value,
828 guint n_param_values,
829 const GValue *param_values,
830 gpointer invocation_hint,
831 gpointer marshal_data)
833 GtkWidget *widget = g_value_get_object (¶m_values[0]);
834 GdkEventExpose *tmp_event;
836 cairo_t *cr = g_value_get_boxed (¶m_values[1]);
839 tmp_event = _gtk_cairo_get_event (cr);
842 widget->priv->opacity_group ||
843 (widget->priv->alpha != 255 &&
844 (!gtk_widget_get_has_window (widget) || tmp_event == NULL));
848 cairo_push_group (cr);
849 gtk_cairo_set_event (cr, NULL);
852 _gtk_marshal_BOOLEAN__BOXED (closure,
862 cairo_pop_group_to_source (cr);
863 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
864 cairo_paint_with_alpha (cr, widget->priv->alpha / 255.0);
867 gtk_cairo_set_event (cr, tmp_event);
872 gtk_widget_draw_marshallerv (GClosure *closure,
873 GValue *return_value,
876 gpointer marshal_data,
880 GtkWidget *widget = GTK_WIDGET (instance);
881 GdkEventExpose *tmp_event;
886 G_VA_COPY (args_copy, args);
887 cr = va_arg (args_copy, gpointer);
890 tmp_event = _gtk_cairo_get_event (cr);
893 widget->priv->opacity_group ||
894 (widget->priv->alpha != 255 &&
895 (!gtk_widget_get_has_window (widget) || tmp_event == NULL));
899 cairo_push_group (cr);
900 gtk_cairo_set_event (cr, NULL);
903 _gtk_marshal_BOOLEAN__BOXEDv (closure,
914 cairo_pop_group_to_source (cr);
915 cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
916 cairo_paint_with_alpha (cr, widget->priv->alpha / 255.0);
919 gtk_cairo_set_event (cr, tmp_event);
926 gtk_widget_class_init (GtkWidgetClass *klass)
928 static GObjectNotifyContext cpn_context = { 0, NULL, NULL };
929 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
930 GtkBindingSet *binding_set;
932 gtk_widget_parent_class = g_type_class_peek_parent (klass);
934 quark_property_parser = g_quark_from_static_string ("gtk-rc-property-parser");
935 quark_aux_info = g_quark_from_static_string ("gtk-aux-info");
936 quark_accel_path = g_quark_from_static_string ("gtk-accel-path");
937 quark_accel_closures = g_quark_from_static_string ("gtk-accel-closures");
938 quark_event_mask = g_quark_from_static_string ("gtk-event-mask");
939 quark_device_event_mask = g_quark_from_static_string ("gtk-device-event-mask");
940 quark_parent_window = g_quark_from_static_string ("gtk-parent-window");
941 quark_pointer_window = g_quark_from_static_string ("gtk-pointer-window");
942 quark_shape_info = g_quark_from_static_string ("gtk-shape-info");
943 quark_input_shape_info = g_quark_from_static_string ("gtk-input-shape-info");
944 quark_pango_context = g_quark_from_static_string ("gtk-pango-context");
945 quark_accessible_object = g_quark_from_static_string ("gtk-accessible-object");
946 quark_mnemonic_labels = g_quark_from_static_string ("gtk-mnemonic-labels");
947 quark_tooltip_markup = g_quark_from_static_string ("gtk-tooltip-markup");
948 quark_has_tooltip = g_quark_from_static_string ("gtk-has-tooltip");
949 quark_tooltip_window = g_quark_from_static_string ("gtk-tooltip-window");
950 quark_visual = g_quark_from_static_string ("gtk-widget-visual");
951 quark_modifier_style = g_quark_from_static_string ("gtk-widget-modifier-style");
952 quark_enabled_devices = g_quark_from_static_string ("gtk-widget-enabled-devices");
953 quark_size_groups = g_quark_from_static_string ("gtk-widget-size-groups");
955 style_property_spec_pool = g_param_spec_pool_new (FALSE);
956 _gtk_widget_child_property_pool = g_param_spec_pool_new (TRUE);
957 cpn_context.quark_notify_queue = g_quark_from_static_string ("GtkWidget-child-property-notify-queue");
958 cpn_context.dispatcher = child_property_notify_dispatcher;
959 _gtk_widget_child_property_notify_context = &cpn_context;
961 gobject_class->constructed = gtk_widget_constructed;
962 gobject_class->dispose = gtk_widget_dispose;
963 gobject_class->finalize = gtk_widget_finalize;
964 gobject_class->set_property = gtk_widget_set_property;
965 gobject_class->get_property = gtk_widget_get_property;
967 klass->destroy = gtk_widget_real_destroy;
969 klass->activate_signal = 0;
970 klass->dispatch_child_properties_changed = gtk_widget_dispatch_child_properties_changed;
971 klass->show = gtk_widget_real_show;
972 klass->show_all = gtk_widget_show;
973 klass->hide = gtk_widget_real_hide;
974 klass->map = gtk_widget_real_map;
975 klass->unmap = gtk_widget_real_unmap;
976 klass->realize = gtk_widget_real_realize;
977 klass->unrealize = gtk_widget_real_unrealize;
978 klass->size_allocate = gtk_widget_real_size_allocate;
979 klass->get_request_mode = gtk_widget_real_get_request_mode;
980 klass->get_preferred_width = gtk_widget_real_get_width;
981 klass->get_preferred_height = gtk_widget_real_get_height;
982 klass->get_preferred_width_for_height = gtk_widget_real_get_width_for_height;
983 klass->get_preferred_height_for_width = gtk_widget_real_get_height_for_width;
984 klass->state_changed = NULL;
985 klass->state_flags_changed = gtk_widget_real_state_flags_changed;
986 klass->parent_set = NULL;
987 klass->hierarchy_changed = NULL;
988 klass->style_set = gtk_widget_real_style_set;
989 klass->direction_changed = gtk_widget_real_direction_changed;
990 klass->grab_notify = NULL;
991 klass->child_notify = NULL;
993 klass->mnemonic_activate = gtk_widget_real_mnemonic_activate;
994 klass->grab_focus = gtk_widget_real_grab_focus;
995 klass->focus = gtk_widget_real_focus;
996 klass->move_focus = gtk_widget_real_move_focus;
997 klass->keynav_failed = gtk_widget_real_keynav_failed;
999 klass->button_press_event = NULL;
1000 klass->button_release_event = NULL;
1001 klass->motion_notify_event = NULL;
1002 klass->touch_event = gtk_widget_real_touch_event;
1003 klass->delete_event = NULL;
1004 klass->destroy_event = NULL;
1005 klass->key_press_event = gtk_widget_real_key_press_event;
1006 klass->key_release_event = gtk_widget_real_key_release_event;
1007 klass->enter_notify_event = NULL;
1008 klass->leave_notify_event = NULL;
1009 klass->configure_event = NULL;
1010 klass->focus_in_event = gtk_widget_real_focus_in_event;
1011 klass->focus_out_event = gtk_widget_real_focus_out_event;
1012 klass->map_event = NULL;
1013 klass->unmap_event = NULL;
1014 klass->window_state_event = NULL;
1015 klass->property_notify_event = _gtk_selection_property_notify;
1016 klass->selection_clear_event = _gtk_selection_clear;
1017 klass->selection_request_event = _gtk_selection_request;
1018 klass->selection_notify_event = _gtk_selection_notify;
1019 klass->selection_received = NULL;
1020 klass->proximity_in_event = NULL;
1021 klass->proximity_out_event = NULL;
1022 klass->drag_begin = NULL;
1023 klass->drag_end = NULL;
1024 klass->drag_data_delete = NULL;
1025 klass->drag_leave = NULL;
1026 klass->drag_motion = NULL;
1027 klass->drag_drop = NULL;
1028 klass->drag_data_received = NULL;
1029 klass->screen_changed = NULL;
1030 klass->can_activate_accel = gtk_widget_real_can_activate_accel;
1031 klass->grab_broken_event = NULL;
1032 klass->query_tooltip = gtk_widget_real_query_tooltip;
1033 klass->style_updated = gtk_widget_real_style_updated;
1035 klass->show_help = gtk_widget_real_show_help;
1037 /* Accessibility support */
1038 klass->priv->accessible_type = GTK_TYPE_ACCESSIBLE;
1039 klass->priv->accessible_role = ATK_ROLE_INVALID;
1040 klass->get_accessible = gtk_widget_real_get_accessible;
1042 klass->adjust_size_request = gtk_widget_real_adjust_size_request;
1043 klass->adjust_size_allocation = gtk_widget_real_adjust_size_allocation;
1045 g_object_class_install_property (gobject_class,
1047 g_param_spec_string ("name",
1049 P_("The name of the widget"),
1051 GTK_PARAM_READWRITE));
1052 g_object_class_install_property (gobject_class,
1054 g_param_spec_object ("parent",
1055 P_("Parent widget"),
1056 P_("The parent widget of this widget. Must be a Container widget"),
1058 GTK_PARAM_READWRITE));
1060 g_object_class_install_property (gobject_class,
1062 g_param_spec_int ("width-request",
1063 P_("Width request"),
1064 P_("Override for width request of the widget, or -1 if natural request should be used"),
1068 GTK_PARAM_READWRITE));
1069 g_object_class_install_property (gobject_class,
1070 PROP_HEIGHT_REQUEST,
1071 g_param_spec_int ("height-request",
1072 P_("Height request"),
1073 P_("Override for height request of the widget, or -1 if natural request should be used"),
1077 GTK_PARAM_READWRITE));
1078 g_object_class_install_property (gobject_class,
1080 g_param_spec_boolean ("visible",
1082 P_("Whether the widget is visible"),
1084 GTK_PARAM_READWRITE));
1085 g_object_class_install_property (gobject_class,
1087 g_param_spec_boolean ("sensitive",
1089 P_("Whether the widget responds to input"),
1091 GTK_PARAM_READWRITE));
1092 g_object_class_install_property (gobject_class,
1094 g_param_spec_boolean ("app-paintable",
1095 P_("Application paintable"),
1096 P_("Whether the application will paint directly on the widget"),
1098 GTK_PARAM_READWRITE));
1099 g_object_class_install_property (gobject_class,
1101 g_param_spec_boolean ("can-focus",
1103 P_("Whether the widget can accept the input focus"),
1105 GTK_PARAM_READWRITE));
1106 g_object_class_install_property (gobject_class,
1108 g_param_spec_boolean ("has-focus",
1110 P_("Whether the widget has the input focus"),
1112 GTK_PARAM_READWRITE));
1113 g_object_class_install_property (gobject_class,
1115 g_param_spec_boolean ("is-focus",
1117 P_("Whether the widget is the focus widget within the toplevel"),
1119 GTK_PARAM_READWRITE));
1120 g_object_class_install_property (gobject_class,
1122 g_param_spec_boolean ("can-default",
1124 P_("Whether the widget can be the default widget"),
1126 GTK_PARAM_READWRITE));
1127 g_object_class_install_property (gobject_class,
1129 g_param_spec_boolean ("has-default",
1131 P_("Whether the widget is the default widget"),
1133 GTK_PARAM_READWRITE));
1134 g_object_class_install_property (gobject_class,
1135 PROP_RECEIVES_DEFAULT,
1136 g_param_spec_boolean ("receives-default",
1137 P_("Receives default"),
1138 P_("If TRUE, the widget will receive the default action when it is focused"),
1140 GTK_PARAM_READWRITE));
1141 g_object_class_install_property (gobject_class,
1142 PROP_COMPOSITE_CHILD,
1143 g_param_spec_boolean ("composite-child",
1144 P_("Composite child"),
1145 P_("Whether the widget is part of a composite widget"),
1147 GTK_PARAM_READABLE));
1148 g_object_class_install_property (gobject_class,
1150 g_param_spec_object ("style",
1152 P_("The style of the widget, which contains information about how it will look (colors etc)"),
1154 GTK_PARAM_READWRITE));
1155 g_object_class_install_property (gobject_class,
1157 g_param_spec_flags ("events",
1159 P_("The event mask that decides what kind of GdkEvents this widget gets"),
1160 GDK_TYPE_EVENT_MASK,
1162 GTK_PARAM_READWRITE));
1163 g_object_class_install_property (gobject_class,
1165 g_param_spec_boolean ("no-show-all",
1167 P_("Whether gtk_widget_show_all() should not affect this widget"),
1169 GTK_PARAM_READWRITE));
1172 * GtkWidget:has-tooltip:
1174 * Enables or disables the emission of #GtkWidget::query-tooltip on @widget.
1175 * A value of %TRUE indicates that @widget can have a tooltip, in this case
1176 * the widget will be queried using #GtkWidget::query-tooltip to determine
1177 * whether it will provide a tooltip or not.
1179 * Note that setting this property to %TRUE for the first time will change
1180 * the event masks of the GdkWindows of this widget to include leave-notify
1181 * and motion-notify events. This cannot and will not be undone when the
1182 * property is set to %FALSE again.
1186 g_object_class_install_property (gobject_class,
1188 g_param_spec_boolean ("has-tooltip",
1190 P_("Whether this widget has a tooltip"),
1192 GTK_PARAM_READWRITE));
1194 * GtkWidget:tooltip-text:
1196 * Sets the text of tooltip to be the given string.
1198 * Also see gtk_tooltip_set_text().
1200 * This is a convenience property which will take care of getting the
1201 * tooltip shown if the given string is not %NULL: #GtkWidget:has-tooltip
1202 * will automatically be set to %TRUE and there will be taken care of
1203 * #GtkWidget::query-tooltip in the default signal handler.
1207 g_object_class_install_property (gobject_class,
1209 g_param_spec_string ("tooltip-text",
1211 P_("The contents of the tooltip for this widget"),
1213 GTK_PARAM_READWRITE));
1215 * GtkWidget:tooltip-markup:
1217 * Sets the text of tooltip to be the given string, which is marked up
1218 * with the <link linkend="PangoMarkupFormat">Pango text markup language</link>.
1219 * Also see gtk_tooltip_set_markup().
1221 * This is a convenience property which will take care of getting the
1222 * tooltip shown if the given string is not %NULL: #GtkWidget:has-tooltip
1223 * will automatically be set to %TRUE and there will be taken care of
1224 * #GtkWidget::query-tooltip in the default signal handler.
1228 g_object_class_install_property (gobject_class,
1229 PROP_TOOLTIP_MARKUP,
1230 g_param_spec_string ("tooltip-markup",
1231 P_("Tooltip markup"),
1232 P_("The contents of the tooltip for this widget"),
1234 GTK_PARAM_READWRITE));
1239 * The widget's window if it is realized, %NULL otherwise.
1243 g_object_class_install_property (gobject_class,
1245 g_param_spec_object ("window",
1247 P_("The widget's window if it is realized"),
1249 GTK_PARAM_READABLE));
1252 * GtkWidget:double-buffered:
1254 * Whether the widget is double buffered.
1258 g_object_class_install_property (gobject_class,
1259 PROP_DOUBLE_BUFFERED,
1260 g_param_spec_boolean ("double-buffered",
1261 P_("Double Buffered"),
1262 P_("Whether the widget is double buffered"),
1264 GTK_PARAM_READWRITE));
1269 * How to distribute horizontal space if widget gets extra space, see #GtkAlign
1273 g_object_class_install_property (gobject_class,
1275 g_param_spec_enum ("halign",
1276 P_("Horizontal Alignment"),
1277 P_("How to position in extra horizontal space"),
1280 GTK_PARAM_READWRITE));
1285 * How to distribute vertical space if widget gets extra space, see #GtkAlign
1289 g_object_class_install_property (gobject_class,
1291 g_param_spec_enum ("valign",
1292 P_("Vertical Alignment"),
1293 P_("How to position in extra vertical space"),
1296 GTK_PARAM_READWRITE));
1299 * GtkWidget:margin-left:
1301 * Margin on left side of widget.
1303 * This property adds margin outside of the widget's normal size
1304 * request, the margin will be added in addition to the size from
1305 * gtk_widget_set_size_request() for example.
1309 g_object_class_install_property (gobject_class,
1311 g_param_spec_int ("margin-left",
1312 P_("Margin on Left"),
1313 P_("Pixels of extra space on the left side"),
1317 GTK_PARAM_READWRITE));
1320 * GtkWidget:margin-right:
1322 * Margin on right side of widget.
1324 * This property adds margin outside of the widget's normal size
1325 * request, the margin will be added in addition to the size from
1326 * gtk_widget_set_size_request() for example.
1330 g_object_class_install_property (gobject_class,
1332 g_param_spec_int ("margin-right",
1333 P_("Margin on Right"),
1334 P_("Pixels of extra space on the right side"),
1338 GTK_PARAM_READWRITE));
1341 * GtkWidget:margin-top:
1343 * Margin on top side of widget.
1345 * This property adds margin outside of the widget's normal size
1346 * request, the margin will be added in addition to the size from
1347 * gtk_widget_set_size_request() for example.
1351 g_object_class_install_property (gobject_class,
1353 g_param_spec_int ("margin-top",
1354 P_("Margin on Top"),
1355 P_("Pixels of extra space on the top side"),
1359 GTK_PARAM_READWRITE));
1362 * GtkWidget:margin-bottom:
1364 * Margin on bottom side of widget.
1366 * This property adds margin outside of the widget's normal size
1367 * request, the margin will be added in addition to the size from
1368 * gtk_widget_set_size_request() for example.
1372 g_object_class_install_property (gobject_class,
1374 g_param_spec_int ("margin-bottom",
1375 P_("Margin on Bottom"),
1376 P_("Pixels of extra space on the bottom side"),
1380 GTK_PARAM_READWRITE));
1385 * Sets all four sides' margin at once. If read, returns max
1386 * margin on any side.
1390 g_object_class_install_property (gobject_class,
1392 g_param_spec_int ("margin",
1394 P_("Pixels of extra space on all four sides"),
1398 GTK_PARAM_READWRITE));
1401 * GtkWidget::destroy:
1402 * @object: the object which received the signal
1404 * Signals that all holders of a reference to the widget should release
1405 * the reference that they hold. May result in finalization of the widget
1406 * if all references are released.
1408 widget_signals[DESTROY] =
1409 g_signal_new (I_("destroy"),
1410 G_TYPE_FROM_CLASS (gobject_class),
1411 G_SIGNAL_RUN_CLEANUP | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
1412 G_STRUCT_OFFSET (GtkWidgetClass, destroy),
1414 _gtk_marshal_VOID__VOID,
1418 * GtkWidget:hexpand:
1420 * Whether to expand horizontally. See gtk_widget_set_hexpand().
1424 g_object_class_install_property (gobject_class,
1426 g_param_spec_boolean ("hexpand",
1427 P_("Horizontal Expand"),
1428 P_("Whether widget wants more horizontal space"),
1430 GTK_PARAM_READWRITE));
1433 * GtkWidget:hexpand-set:
1435 * Whether to use the #GtkWidget:hexpand property. See gtk_widget_get_hexpand_set().
1439 g_object_class_install_property (gobject_class,
1441 g_param_spec_boolean ("hexpand-set",
1442 P_("Horizontal Expand Set"),
1443 P_("Whether to use the hexpand property"),
1445 GTK_PARAM_READWRITE));
1448 * GtkWidget:vexpand:
1450 * Whether to expand vertically. See gtk_widget_set_vexpand().
1454 g_object_class_install_property (gobject_class,
1456 g_param_spec_boolean ("vexpand",
1457 P_("Vertical Expand"),
1458 P_("Whether widget wants more vertical space"),
1460 GTK_PARAM_READWRITE));
1463 * GtkWidget:vexpand-set:
1465 * Whether to use the #GtkWidget:vexpand property. See gtk_widget_get_vexpand_set().
1469 g_object_class_install_property (gobject_class,
1471 g_param_spec_boolean ("vexpand-set",
1472 P_("Vertical Expand Set"),
1473 P_("Whether to use the vexpand property"),
1475 GTK_PARAM_READWRITE));
1480 * Whether to expand in both directions. Setting this sets both #GtkWidget:hexpand and #GtkWidget:vexpand
1484 g_object_class_install_property (gobject_class,
1486 g_param_spec_boolean ("expand",
1488 P_("Whether widget wants to expand in both directions"),
1490 GTK_PARAM_READWRITE));
1493 * GtkWidget:opacity:
1495 * The requested opacity of the widget. See gtk_widget_set_opacity() for
1496 * more details about window opacity.
1498 * Before 3.8 this was only availible in GtkWindow
1502 g_object_class_install_property (gobject_class,
1504 g_param_spec_double ("opacity",
1505 P_("Opacity for Widget"),
1506 P_("The opacity of the widget, from 0 to 1"),
1510 GTK_PARAM_READWRITE));
1513 * @widget: the object which received the signal.
1515 widget_signals[SHOW] =
1516 g_signal_new (I_("show"),
1517 G_TYPE_FROM_CLASS (gobject_class),
1519 G_STRUCT_OFFSET (GtkWidgetClass, show),
1521 _gtk_marshal_VOID__VOID,
1526 * @widget: the object which received the signal.
1528 widget_signals[HIDE] =
1529 g_signal_new (I_("hide"),
1530 G_TYPE_FROM_CLASS (gobject_class),
1532 G_STRUCT_OFFSET (GtkWidgetClass, hide),
1534 _gtk_marshal_VOID__VOID,
1539 * @widget: the object which received the signal.
1541 widget_signals[MAP] =
1542 g_signal_new (I_("map"),
1543 G_TYPE_FROM_CLASS (gobject_class),
1545 G_STRUCT_OFFSET (GtkWidgetClass, map),
1547 _gtk_marshal_VOID__VOID,
1552 * @widget: the object which received the signal.
1554 widget_signals[UNMAP] =
1555 g_signal_new (I_("unmap"),
1556 G_TYPE_FROM_CLASS (gobject_class),
1558 G_STRUCT_OFFSET (GtkWidgetClass, unmap),
1560 _gtk_marshal_VOID__VOID,
1564 * GtkWidget::realize:
1565 * @widget: the object which received the signal.
1567 widget_signals[REALIZE] =
1568 g_signal_new (I_("realize"),
1569 G_TYPE_FROM_CLASS (gobject_class),
1571 G_STRUCT_OFFSET (GtkWidgetClass, realize),
1573 _gtk_marshal_VOID__VOID,
1577 * GtkWidget::unrealize:
1578 * @widget: the object which received the signal.
1580 widget_signals[UNREALIZE] =
1581 g_signal_new (I_("unrealize"),
1582 G_TYPE_FROM_CLASS (gobject_class),
1584 G_STRUCT_OFFSET (GtkWidgetClass, unrealize),
1586 _gtk_marshal_VOID__VOID,
1590 * GtkWidget::size-allocate:
1591 * @widget: the object which received the signal.
1594 widget_signals[SIZE_ALLOCATE] =
1595 g_signal_new (I_("size-allocate"),
1596 G_TYPE_FROM_CLASS (gobject_class),
1598 G_STRUCT_OFFSET (GtkWidgetClass, size_allocate),
1600 _gtk_marshal_VOID__BOXED,
1602 GDK_TYPE_RECTANGLE | G_SIGNAL_TYPE_STATIC_SCOPE);
1605 * GtkWidget::state-changed:
1606 * @widget: the object which received the signal.
1607 * @state: the previous state
1609 * The ::state-changed signal is emitted when the widget state changes.
1610 * See gtk_widget_get_state().
1612 * Deprecated: 3.0. Use #GtkWidget::state-flags-changed instead.
1614 widget_signals[STATE_CHANGED] =
1615 g_signal_new (I_("state-changed"),
1616 G_TYPE_FROM_CLASS (gobject_class),
1618 G_STRUCT_OFFSET (GtkWidgetClass, state_changed),
1620 _gtk_marshal_VOID__ENUM,
1622 GTK_TYPE_STATE_TYPE);
1625 * GtkWidget::state-flags-changed:
1626 * @widget: the object which received the signal.
1627 * @flags: The previous state flags.
1629 * The ::state-flags-changed signal is emitted when the widget state
1630 * changes, see gtk_widget_get_state_flags().
1634 widget_signals[STATE_FLAGS_CHANGED] =
1635 g_signal_new (I_("state-flags-changed"),
1636 G_TYPE_FROM_CLASS (gobject_class),
1638 G_STRUCT_OFFSET (GtkWidgetClass, state_flags_changed),
1640 _gtk_marshal_VOID__FLAGS,
1642 GTK_TYPE_STATE_FLAGS);
1645 * GtkWidget::parent-set:
1646 * @widget: the object on which the signal is emitted
1647 * @old_parent: (allow-none): the previous parent, or %NULL if the widget
1648 * just got its initial parent.
1650 * The ::parent-set signal is emitted when a new parent
1651 * has been set on a widget.
1653 widget_signals[PARENT_SET] =
1654 g_signal_new (I_("parent-set"),
1655 G_TYPE_FROM_CLASS (gobject_class),
1657 G_STRUCT_OFFSET (GtkWidgetClass, parent_set),
1659 _gtk_marshal_VOID__OBJECT,
1664 * GtkWidget::hierarchy-changed:
1665 * @widget: the object on which the signal is emitted
1666 * @previous_toplevel: (allow-none): the previous toplevel ancestor, or %NULL
1667 * if the widget was previously unanchored
1669 * The ::hierarchy-changed signal is emitted when the
1670 * anchored state of a widget changes. A widget is
1671 * <firstterm>anchored</firstterm> when its toplevel
1672 * ancestor is a #GtkWindow. This signal is emitted when
1673 * a widget changes from un-anchored to anchored or vice-versa.
1675 widget_signals[HIERARCHY_CHANGED] =
1676 g_signal_new (I_("hierarchy-changed"),
1677 G_TYPE_FROM_CLASS (gobject_class),
1679 G_STRUCT_OFFSET (GtkWidgetClass, hierarchy_changed),
1681 _gtk_marshal_VOID__OBJECT,
1686 * GtkWidget::style-set:
1687 * @widget: the object on which the signal is emitted
1688 * @previous_style: (allow-none): the previous style, or %NULL if the widget
1689 * just got its initial style
1691 * The ::style-set signal is emitted when a new style has been set
1692 * on a widget. Note that style-modifying functions like
1693 * gtk_widget_modify_base() also cause this signal to be emitted.
1695 * Note that this signal is emitted for changes to the deprecated
1696 * #GtkStyle. To track changes to the #GtkStyleContext associated
1697 * with a widget, use the #GtkWidget::style-updated signal.
1699 * Deprecated:3.0: Use the #GtkWidget::style-updated signal
1701 widget_signals[STYLE_SET] =
1702 g_signal_new (I_("style-set"),
1703 G_TYPE_FROM_CLASS (gobject_class),
1705 G_STRUCT_OFFSET (GtkWidgetClass, style_set),
1707 _gtk_marshal_VOID__OBJECT,
1712 * GtkWidget::style-updated:
1713 * @widget: the object on which the signal is emitted
1715 * The ::style-updated signal is emitted when the #GtkStyleContext
1716 * of a widget is changed. Note that style-modifying functions like
1717 * gtk_widget_override_color() also cause this signal to be emitted.
1721 widget_signals[STYLE_UPDATED] =
1722 g_signal_new (I_("style-updated"),
1723 G_TYPE_FROM_CLASS (gobject_class),
1725 G_STRUCT_OFFSET (GtkWidgetClass, style_updated),
1727 g_cclosure_marshal_VOID__VOID,
1731 * GtkWidget::direction-changed:
1732 * @widget: the object on which the signal is emitted
1733 * @previous_direction: the previous text direction of @widget
1735 * The ::direction-changed signal is emitted when the text direction
1736 * of a widget changes.
1738 widget_signals[DIRECTION_CHANGED] =
1739 g_signal_new (I_("direction-changed"),
1740 G_TYPE_FROM_CLASS (gobject_class),
1742 G_STRUCT_OFFSET (GtkWidgetClass, direction_changed),
1744 _gtk_marshal_VOID__ENUM,
1746 GTK_TYPE_TEXT_DIRECTION);
1749 * GtkWidget::grab-notify:
1750 * @widget: the object which received the signal
1751 * @was_grabbed: %FALSE if the widget becomes shadowed, %TRUE
1752 * if it becomes unshadowed
1754 * The ::grab-notify signal is emitted when a widget becomes
1755 * shadowed by a GTK+ grab (not a pointer or keyboard grab) on
1756 * another widget, or when it becomes unshadowed due to a grab
1759 * A widget is shadowed by a gtk_grab_add() when the topmost
1760 * grab widget in the grab stack of its window group is not
1763 widget_signals[GRAB_NOTIFY] =
1764 g_signal_new (I_("grab-notify"),
1765 G_TYPE_FROM_CLASS (gobject_class),
1767 G_STRUCT_OFFSET (GtkWidgetClass, grab_notify),
1769 _gtk_marshal_VOID__BOOLEAN,
1774 * GtkWidget::child-notify:
1775 * @widget: the object which received the signal
1776 * @child_property: the #GParamSpec of the changed child property
1778 * The ::child-notify signal is emitted for each
1779 * <link linkend="child-properties">child property</link> that has
1780 * changed on an object. The signal's detail holds the property name.
1782 widget_signals[CHILD_NOTIFY] =
1783 g_signal_new (I_("child-notify"),
1784 G_TYPE_FROM_CLASS (gobject_class),
1785 G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_NO_HOOKS,
1786 G_STRUCT_OFFSET (GtkWidgetClass, child_notify),
1788 g_cclosure_marshal_VOID__PARAM,
1794 * @widget: the object which received the signal
1795 * @cr: the cairo context to draw to
1797 * This signal is emitted when a widget is supposed to render itself.
1798 * The @widget's top left corner must be painted at the origin of
1799 * the passed in context and be sized to the values returned by
1800 * gtk_widget_get_allocated_width() and
1801 * gtk_widget_get_allocated_height().
1803 * Signal handlers connected to this signal can modify the cairo
1804 * context passed as @cr in any way they like and don't need to
1805 * restore it. The signal emission takes care of calling cairo_save()
1806 * before and cairo_restore() after invoking the handler.
1808 * Returns: %TRUE to stop other handlers from being invoked for the event.
1809 % %FALSE to propagate the event further.
1813 widget_signals[DRAW] =
1814 g_signal_new (I_("draw"),
1815 G_TYPE_FROM_CLASS (gobject_class),
1817 G_STRUCT_OFFSET (GtkWidgetClass, draw),
1818 _gtk_boolean_handled_accumulator, NULL,
1819 gtk_widget_draw_marshaller,
1821 CAIRO_GOBJECT_TYPE_CONTEXT);
1822 g_signal_set_va_marshaller (widget_signals[DRAW], G_TYPE_FROM_CLASS (klass),
1823 gtk_widget_draw_marshallerv);
1826 * GtkWidget::mnemonic-activate:
1827 * @widget: the object which received the signal.
1830 * Returns: %TRUE to stop other handlers from being invoked for the event.
1831 * %FALSE to propagate the event further.
1833 widget_signals[MNEMONIC_ACTIVATE] =
1834 g_signal_new (I_("mnemonic-activate"),
1835 G_TYPE_FROM_CLASS (gobject_class),
1837 G_STRUCT_OFFSET (GtkWidgetClass, mnemonic_activate),
1838 _gtk_boolean_handled_accumulator, NULL,
1839 _gtk_marshal_BOOLEAN__BOOLEAN,
1844 * GtkWidget::grab-focus:
1845 * @widget: the object which received the signal.
1847 widget_signals[GRAB_FOCUS] =
1848 g_signal_new (I_("grab-focus"),
1849 G_TYPE_FROM_CLASS (gobject_class),
1850 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
1851 G_STRUCT_OFFSET (GtkWidgetClass, grab_focus),
1853 _gtk_marshal_VOID__VOID,
1858 * @widget: the object which received the signal.
1861 * Returns: %TRUE to stop other handlers from being invoked for the event. %FALSE to propagate the event further.
1863 widget_signals[FOCUS] =
1864 g_signal_new (I_("focus"),
1865 G_TYPE_FROM_CLASS (klass),
1867 G_STRUCT_OFFSET (GtkWidgetClass, focus),
1868 _gtk_boolean_handled_accumulator, NULL,
1869 _gtk_marshal_BOOLEAN__ENUM,
1871 GTK_TYPE_DIRECTION_TYPE);
1874 * GtkWidget::move-focus:
1875 * @widget: the object which received the signal.
1878 widget_signals[MOVE_FOCUS] =
1879 g_signal_new (I_("move-focus"),
1880 G_TYPE_FROM_CLASS (klass),
1881 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
1882 G_STRUCT_OFFSET (GtkWidgetClass, move_focus),
1884 _gtk_marshal_VOID__ENUM,
1887 GTK_TYPE_DIRECTION_TYPE);
1890 * GtkWidget::keynav-failed:
1891 * @widget: the object which received the signal
1892 * @direction: the direction of movement
1894 * Gets emitted if keyboard navigation fails.
1895 * See gtk_widget_keynav_failed() for details.
1897 * Returns: %TRUE if stopping keyboard navigation is fine, %FALSE
1898 * if the emitting widget should try to handle the keyboard
1899 * navigation attempt in its parent container(s).
1903 widget_signals[KEYNAV_FAILED] =
1904 g_signal_new (I_("keynav-failed"),
1905 G_TYPE_FROM_CLASS (klass),
1907 G_STRUCT_OFFSET (GtkWidgetClass, keynav_failed),
1908 _gtk_boolean_handled_accumulator, NULL,
1909 _gtk_marshal_BOOLEAN__ENUM,
1911 GTK_TYPE_DIRECTION_TYPE);
1915 * @widget: the object which received the signal.
1916 * @event: the #GdkEvent which triggered this signal
1918 * The GTK+ main loop will emit three signals for each GDK event delivered
1919 * to a widget: one generic ::event signal, another, more specific,
1920 * signal that matches the type of event delivered (e.g.
1921 * #GtkWidget::key-press-event) and finally a generic
1922 * #GtkWidget::event-after signal.
1924 * Returns: %TRUE to stop other handlers from being invoked for the event
1925 * and to cancel the emission of the second specific ::event signal.
1926 * %FALSE to propagate the event further and to allow the emission of
1927 * the second signal. The ::event-after signal is emitted regardless of
1930 widget_signals[EVENT] =
1931 g_signal_new (I_("event"),
1932 G_TYPE_FROM_CLASS (klass),
1934 G_STRUCT_OFFSET (GtkWidgetClass, event),
1935 _gtk_boolean_handled_accumulator, NULL,
1936 _gtk_marshal_BOOLEAN__BOXED,
1938 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
1939 g_signal_set_va_marshaller (widget_signals[EVENT], G_TYPE_FROM_CLASS (klass),
1940 _gtk_marshal_BOOLEAN__BOXEDv);
1943 * GtkWidget::event-after:
1944 * @widget: the object which received the signal.
1945 * @event: the #GdkEvent which triggered this signal
1947 * After the emission of the #GtkWidget::event signal and (optionally)
1948 * the second more specific signal, ::event-after will be emitted
1949 * regardless of the previous two signals handlers return values.
1952 widget_signals[EVENT_AFTER] =
1953 g_signal_new (I_("event-after"),
1954 G_TYPE_FROM_CLASS (klass),
1958 _gtk_marshal_VOID__BOXED,
1960 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
1961 g_signal_set_va_marshaller (widget_signals[EVENT_AFTER], G_TYPE_FROM_CLASS (klass),
1962 _gtk_marshal_BOOLEAN__BOXEDv);
1965 * GtkWidget::button-press-event:
1966 * @widget: the object which received the signal.
1967 * @event: (type Gdk.EventButton): the #GdkEventButton which triggered
1970 * The ::button-press-event signal will be emitted when a button
1971 * (typically from a mouse) is pressed.
1973 * To receive this signal, the #GdkWindow associated to the
1974 * widget needs to enable the #GDK_BUTTON_PRESS_MASK mask.
1976 * This signal will be sent to the grab widget if there is one.
1978 * Returns: %TRUE to stop other handlers from being invoked for the event.
1979 * %FALSE to propagate the event further.
1981 widget_signals[BUTTON_PRESS_EVENT] =
1982 g_signal_new (I_("button-press-event"),
1983 G_TYPE_FROM_CLASS (klass),
1985 G_STRUCT_OFFSET (GtkWidgetClass, button_press_event),
1986 _gtk_boolean_handled_accumulator, NULL,
1987 _gtk_marshal_BOOLEAN__BOXED,
1989 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
1990 g_signal_set_va_marshaller (widget_signals[BUTTON_PRESS_EVENT], G_TYPE_FROM_CLASS (klass),
1991 _gtk_marshal_BOOLEAN__BOXEDv);
1994 * GtkWidget::button-release-event:
1995 * @widget: the object which received the signal.
1996 * @event: (type Gdk.EventButton): the #GdkEventButton which triggered
1999 * The ::button-release-event signal will be emitted when a button
2000 * (typically from a mouse) is released.
2002 * To receive this signal, the #GdkWindow associated to the
2003 * widget needs to enable the #GDK_BUTTON_RELEASE_MASK mask.
2005 * This signal will be sent to the grab widget if there is one.
2007 * Returns: %TRUE to stop other handlers from being invoked for the event.
2008 * %FALSE to propagate the event further.
2010 widget_signals[BUTTON_RELEASE_EVENT] =
2011 g_signal_new (I_("button-release-event"),
2012 G_TYPE_FROM_CLASS (klass),
2014 G_STRUCT_OFFSET (GtkWidgetClass, button_release_event),
2015 _gtk_boolean_handled_accumulator, NULL,
2016 _gtk_marshal_BOOLEAN__BOXED,
2018 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2019 g_signal_set_va_marshaller (widget_signals[BUTTON_RELEASE_EVENT], G_TYPE_FROM_CLASS (klass),
2020 _gtk_marshal_BOOLEAN__BOXEDv);
2022 widget_signals[TOUCH_EVENT] =
2023 g_signal_new (I_("touch-event"),
2024 G_TYPE_FROM_CLASS (klass),
2026 G_STRUCT_OFFSET (GtkWidgetClass, touch_event),
2027 _gtk_boolean_handled_accumulator, NULL,
2028 _gtk_marshal_BOOLEAN__BOXED,
2030 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2031 g_signal_set_va_marshaller (widget_signals[TOUCH_EVENT], G_TYPE_FROM_CLASS (klass),
2032 _gtk_marshal_BOOLEAN__BOXEDv);
2035 * GtkWidget::scroll-event:
2036 * @widget: the object which received the signal.
2037 * @event: (type Gdk.EventScroll): the #GdkEventScroll which triggered
2040 * The ::scroll-event signal is emitted when a button in the 4 to 7
2041 * range is pressed. Wheel mice are usually configured to generate
2042 * button press events for buttons 4 and 5 when the wheel is turned.
2044 * To receive this signal, the #GdkWindow associated to the widget needs
2045 * to enable the #GDK_SCROLL_MASK mask.
2047 * This signal will be sent to the grab widget if there is one.
2049 * Returns: %TRUE to stop other handlers from being invoked for the event.
2050 * %FALSE to propagate the event further.
2052 widget_signals[SCROLL_EVENT] =
2053 g_signal_new (I_("scroll-event"),
2054 G_TYPE_FROM_CLASS (klass),
2056 G_STRUCT_OFFSET (GtkWidgetClass, scroll_event),
2057 _gtk_boolean_handled_accumulator, NULL,
2058 _gtk_marshal_BOOLEAN__BOXED,
2060 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2061 g_signal_set_va_marshaller (widget_signals[SCROLL_EVENT], G_TYPE_FROM_CLASS (klass),
2062 _gtk_marshal_BOOLEAN__BOXEDv);
2065 * GtkWidget::motion-notify-event:
2066 * @widget: the object which received the signal.
2067 * @event: (type Gdk.EventMotion): the #GdkEventMotion which triggered
2070 * The ::motion-notify-event signal is emitted when the pointer moves
2071 * over the widget's #GdkWindow.
2073 * To receive this signal, the #GdkWindow associated to the widget
2074 * needs to enable the #GDK_POINTER_MOTION_MASK mask.
2076 * This signal will be sent to the grab widget if there is one.
2078 * Returns: %TRUE to stop other handlers from being invoked for the event.
2079 * %FALSE to propagate the event further.
2081 widget_signals[MOTION_NOTIFY_EVENT] =
2082 g_signal_new (I_("motion-notify-event"),
2083 G_TYPE_FROM_CLASS (klass),
2085 G_STRUCT_OFFSET (GtkWidgetClass, motion_notify_event),
2086 _gtk_boolean_handled_accumulator, NULL,
2087 _gtk_marshal_BOOLEAN__BOXED,
2089 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2090 g_signal_set_va_marshaller (widget_signals[MOTION_NOTIFY_EVENT], G_TYPE_FROM_CLASS (klass),
2091 _gtk_marshal_BOOLEAN__BOXEDv);
2094 * GtkWidget::composited-changed:
2095 * @widget: the object on which the signal is emitted
2097 * The ::composited-changed signal is emitted when the composited
2098 * status of @widget<!-- -->s screen changes.
2099 * See gdk_screen_is_composited().
2101 widget_signals[COMPOSITED_CHANGED] =
2102 g_signal_new (I_("composited-changed"),
2103 G_TYPE_FROM_CLASS (klass),
2104 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
2105 G_STRUCT_OFFSET (GtkWidgetClass, composited_changed),
2107 _gtk_marshal_VOID__VOID,
2111 * GtkWidget::delete-event:
2112 * @widget: the object which received the signal
2113 * @event: the event which triggered this signal
2115 * The ::delete-event signal is emitted if a user requests that
2116 * a toplevel window is closed. The default handler for this signal
2117 * destroys the window. Connecting gtk_widget_hide_on_delete() to
2118 * this signal will cause the window to be hidden instead, so that
2119 * it can later be shown again without reconstructing it.
2121 * Returns: %TRUE to stop other handlers from being invoked for the event.
2122 * %FALSE to propagate the event further.
2124 widget_signals[DELETE_EVENT] =
2125 g_signal_new (I_("delete-event"),
2126 G_TYPE_FROM_CLASS (klass),
2128 G_STRUCT_OFFSET (GtkWidgetClass, delete_event),
2129 _gtk_boolean_handled_accumulator, NULL,
2130 _gtk_marshal_BOOLEAN__BOXED,
2132 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2133 g_signal_set_va_marshaller (widget_signals[DELETE_EVENT], G_TYPE_FROM_CLASS (klass),
2134 _gtk_marshal_BOOLEAN__BOXEDv);
2137 * GtkWidget::destroy-event:
2138 * @widget: the object which received the signal.
2139 * @event: the event which triggered this signal
2141 * The ::destroy-event signal is emitted when a #GdkWindow is destroyed.
2142 * You rarely get this signal, because most widgets disconnect themselves
2143 * from their window before they destroy it, so no widget owns the
2144 * window at destroy time.
2146 * To receive this signal, the #GdkWindow associated to the widget needs
2147 * to enable the #GDK_STRUCTURE_MASK mask. GDK will enable this mask
2148 * automatically for all new windows.
2150 * Returns: %TRUE to stop other handlers from being invoked for the event.
2151 * %FALSE to propagate the event further.
2153 widget_signals[DESTROY_EVENT] =
2154 g_signal_new (I_("destroy-event"),
2155 G_TYPE_FROM_CLASS (klass),
2157 G_STRUCT_OFFSET (GtkWidgetClass, destroy_event),
2158 _gtk_boolean_handled_accumulator, NULL,
2159 _gtk_marshal_BOOLEAN__BOXED,
2161 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2162 g_signal_set_va_marshaller (widget_signals[DESTROY_EVENT], G_TYPE_FROM_CLASS (klass),
2163 _gtk_marshal_BOOLEAN__BOXEDv);
2166 * GtkWidget::key-press-event:
2167 * @widget: the object which received the signal
2168 * @event: (type Gdk.EventKey): the #GdkEventKey which triggered this signal.
2170 * The ::key-press-event signal is emitted when a key is pressed. The signal
2171 * emission will reoccur at the key-repeat rate when the key is kept pressed.
2173 * To receive this signal, the #GdkWindow associated to the widget needs
2174 * to enable the #GDK_KEY_PRESS_MASK mask.
2176 * This signal will be sent to the grab widget if there is one.
2178 * Returns: %TRUE to stop other handlers from being invoked for the event.
2179 * %FALSE to propagate the event further.
2181 widget_signals[KEY_PRESS_EVENT] =
2182 g_signal_new (I_("key-press-event"),
2183 G_TYPE_FROM_CLASS (klass),
2185 G_STRUCT_OFFSET (GtkWidgetClass, key_press_event),
2186 _gtk_boolean_handled_accumulator, NULL,
2187 _gtk_marshal_BOOLEAN__BOXED,
2189 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2190 g_signal_set_va_marshaller (widget_signals[KEY_PRESS_EVENT], G_TYPE_FROM_CLASS (klass),
2191 _gtk_marshal_BOOLEAN__BOXEDv);
2194 * GtkWidget::key-release-event:
2195 * @widget: the object which received the signal
2196 * @event: (type Gdk.EventKey): the #GdkEventKey which triggered this signal.
2198 * The ::key-release-event signal is emitted when a key is released.
2200 * To receive this signal, the #GdkWindow associated to the widget needs
2201 * to enable the #GDK_KEY_RELEASE_MASK mask.
2203 * This signal will be sent to the grab widget if there is one.
2205 * Returns: %TRUE to stop other handlers from being invoked for the event.
2206 * %FALSE to propagate the event further.
2208 widget_signals[KEY_RELEASE_EVENT] =
2209 g_signal_new (I_("key-release-event"),
2210 G_TYPE_FROM_CLASS (klass),
2212 G_STRUCT_OFFSET (GtkWidgetClass, key_release_event),
2213 _gtk_boolean_handled_accumulator, NULL,
2214 _gtk_marshal_BOOLEAN__BOXED,
2216 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2217 g_signal_set_va_marshaller (widget_signals[KEY_RELEASE_EVENT], G_TYPE_FROM_CLASS (klass),
2218 _gtk_marshal_BOOLEAN__BOXEDv);
2221 * GtkWidget::enter-notify-event:
2222 * @widget: the object which received the signal
2223 * @event: (type Gdk.EventCrossing): the #GdkEventCrossing which triggered
2226 * The ::enter-notify-event will be emitted when the pointer enters
2227 * the @widget's window.
2229 * To receive this signal, the #GdkWindow associated to the widget needs
2230 * to enable the #GDK_ENTER_NOTIFY_MASK mask.
2232 * This signal will be sent to the grab widget if there is one.
2234 * Returns: %TRUE to stop other handlers from being invoked for the event.
2235 * %FALSE to propagate the event further.
2237 widget_signals[ENTER_NOTIFY_EVENT] =
2238 g_signal_new (I_("enter-notify-event"),
2239 G_TYPE_FROM_CLASS (klass),
2241 G_STRUCT_OFFSET (GtkWidgetClass, enter_notify_event),
2242 _gtk_boolean_handled_accumulator, NULL,
2243 _gtk_marshal_BOOLEAN__BOXED,
2245 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2246 g_signal_set_va_marshaller (widget_signals[ENTER_NOTIFY_EVENT], G_TYPE_FROM_CLASS (klass),
2247 _gtk_marshal_BOOLEAN__BOXEDv);
2250 * GtkWidget::leave-notify-event:
2251 * @widget: the object which received the signal
2252 * @event: (type Gdk.EventCrossing): the #GdkEventCrossing which triggered
2255 * The ::leave-notify-event will be emitted when the pointer leaves
2256 * the @widget's window.
2258 * To receive this signal, the #GdkWindow associated to the widget needs
2259 * to enable the #GDK_LEAVE_NOTIFY_MASK mask.
2261 * This signal will be sent to the grab widget if there is one.
2263 * Returns: %TRUE to stop other handlers from being invoked for the event.
2264 * %FALSE to propagate the event further.
2266 widget_signals[LEAVE_NOTIFY_EVENT] =
2267 g_signal_new (I_("leave-notify-event"),
2268 G_TYPE_FROM_CLASS (klass),
2270 G_STRUCT_OFFSET (GtkWidgetClass, leave_notify_event),
2271 _gtk_boolean_handled_accumulator, NULL,
2272 _gtk_marshal_BOOLEAN__BOXED,
2274 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2275 g_signal_set_va_marshaller (widget_signals[LEAVE_NOTIFY_EVENT], G_TYPE_FROM_CLASS (klass),
2276 _gtk_marshal_BOOLEAN__BOXEDv);
2279 * GtkWidget::configure-event:
2280 * @widget: the object which received the signal
2281 * @event: (type Gdk.EventConfigure): the #GdkEventConfigure which triggered
2284 * The ::configure-event signal will be emitted when the size, position or
2285 * stacking of the @widget's window has changed.
2287 * To receive this signal, the #GdkWindow associated to the widget needs
2288 * to enable the #GDK_STRUCTURE_MASK mask. GDK will enable this mask
2289 * automatically for all new windows.
2291 * Returns: %TRUE to stop other handlers from being invoked for the event.
2292 * %FALSE to propagate the event further.
2294 widget_signals[CONFIGURE_EVENT] =
2295 g_signal_new (I_("configure-event"),
2296 G_TYPE_FROM_CLASS (klass),
2298 G_STRUCT_OFFSET (GtkWidgetClass, configure_event),
2299 _gtk_boolean_handled_accumulator, NULL,
2300 _gtk_marshal_BOOLEAN__BOXED,
2302 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2303 g_signal_set_va_marshaller (widget_signals[CONFIGURE_EVENT], G_TYPE_FROM_CLASS (klass),
2304 _gtk_marshal_BOOLEAN__BOXEDv);
2307 * GtkWidget::focus-in-event:
2308 * @widget: the object which received the signal
2309 * @event: (type Gdk.EventFocus): the #GdkEventFocus which triggered
2312 * The ::focus-in-event signal will be emitted when the keyboard focus
2313 * enters the @widget's window.
2315 * To receive this signal, the #GdkWindow associated to the widget needs
2316 * to enable the #GDK_FOCUS_CHANGE_MASK mask.
2318 * Returns: %TRUE to stop other handlers from being invoked for the event.
2319 * %FALSE to propagate the event further.
2321 widget_signals[FOCUS_IN_EVENT] =
2322 g_signal_new (I_("focus-in-event"),
2323 G_TYPE_FROM_CLASS (klass),
2325 G_STRUCT_OFFSET (GtkWidgetClass, focus_in_event),
2326 _gtk_boolean_handled_accumulator, NULL,
2327 _gtk_marshal_BOOLEAN__BOXED,
2329 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2330 g_signal_set_va_marshaller (widget_signals[FOCUS_IN_EVENT], G_TYPE_FROM_CLASS (klass),
2331 _gtk_marshal_BOOLEAN__BOXEDv);
2334 * GtkWidget::focus-out-event:
2335 * @widget: the object which received the signal
2336 * @event: (type Gdk.EventFocus): the #GdkEventFocus which triggered this
2339 * The ::focus-out-event signal will be emitted when the keyboard focus
2340 * leaves the @widget's window.
2342 * To receive this signal, the #GdkWindow associated to the widget needs
2343 * to enable the #GDK_FOCUS_CHANGE_MASK mask.
2345 * Returns: %TRUE to stop other handlers from being invoked for the event.
2346 * %FALSE to propagate the event further.
2348 widget_signals[FOCUS_OUT_EVENT] =
2349 g_signal_new (I_("focus-out-event"),
2350 G_TYPE_FROM_CLASS (klass),
2352 G_STRUCT_OFFSET (GtkWidgetClass, focus_out_event),
2353 _gtk_boolean_handled_accumulator, NULL,
2354 _gtk_marshal_BOOLEAN__BOXED,
2356 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2357 g_signal_set_va_marshaller (widget_signals[FOCUS_OUT_EVENT], G_TYPE_FROM_CLASS (klass),
2358 _gtk_marshal_BOOLEAN__BOXEDv);
2361 * GtkWidget::map-event:
2362 * @widget: the object which received the signal
2363 * @event: (type Gdk.EventAny): the #GdkEventAny which triggered this signal.
2365 * The ::map-event signal will be emitted when the @widget's window is
2366 * mapped. A window is mapped when it becomes visible on the screen.
2368 * To receive this signal, the #GdkWindow associated to the widget needs
2369 * to enable the #GDK_STRUCTURE_MASK mask. GDK will enable this mask
2370 * automatically for all new windows.
2372 * Returns: %TRUE to stop other handlers from being invoked for the event.
2373 * %FALSE to propagate the event further.
2375 widget_signals[MAP_EVENT] =
2376 g_signal_new (I_("map-event"),
2377 G_TYPE_FROM_CLASS (klass),
2379 G_STRUCT_OFFSET (GtkWidgetClass, map_event),
2380 _gtk_boolean_handled_accumulator, NULL,
2381 _gtk_marshal_BOOLEAN__BOXED,
2383 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2384 g_signal_set_va_marshaller (widget_signals[MAP_EVENT], G_TYPE_FROM_CLASS (klass),
2385 _gtk_marshal_BOOLEAN__BOXEDv);
2388 * GtkWidget::unmap-event:
2389 * @widget: the object which received the signal
2390 * @event: (type Gdk.EventAny): the #GdkEventAny which triggered this signal
2392 * The ::unmap-event signal will be emitted when the @widget's window is
2393 * unmapped. A window is unmapped when it becomes invisible on the screen.
2395 * To receive this signal, the #GdkWindow associated to the widget needs
2396 * to enable the #GDK_STRUCTURE_MASK mask. GDK will enable this mask
2397 * automatically for all new windows.
2399 * Returns: %TRUE to stop other handlers from being invoked for the event.
2400 * %FALSE to propagate the event further.
2402 widget_signals[UNMAP_EVENT] =
2403 g_signal_new (I_("unmap-event"),
2404 G_TYPE_FROM_CLASS (klass),
2406 G_STRUCT_OFFSET (GtkWidgetClass, unmap_event),
2407 _gtk_boolean_handled_accumulator, NULL,
2408 _gtk_marshal_BOOLEAN__BOXED,
2410 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2411 g_signal_set_va_marshaller (widget_signals[UNMAP_EVENT], G_TYPE_FROM_CLASS (klass),
2412 _gtk_marshal_BOOLEAN__BOXEDv);
2415 * GtkWidget::property-notify-event:
2416 * @widget: the object which received the signal
2417 * @event: (type Gdk.EventProperty): the #GdkEventProperty which triggered
2420 * The ::property-notify-event signal will be emitted when a property on
2421 * the @widget's window has been changed or deleted.
2423 * To receive this signal, the #GdkWindow associated to the widget needs
2424 * to enable the #GDK_PROPERTY_CHANGE_MASK mask.
2426 * Returns: %TRUE to stop other handlers from being invoked for the event.
2427 * %FALSE to propagate the event further.
2429 widget_signals[PROPERTY_NOTIFY_EVENT] =
2430 g_signal_new (I_("property-notify-event"),
2431 G_TYPE_FROM_CLASS (klass),
2433 G_STRUCT_OFFSET (GtkWidgetClass, property_notify_event),
2434 _gtk_boolean_handled_accumulator, NULL,
2435 _gtk_marshal_BOOLEAN__BOXED,
2437 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2438 g_signal_set_va_marshaller (widget_signals[PROPERTY_NOTIFY_EVENT], G_TYPE_FROM_CLASS (klass),
2439 _gtk_marshal_BOOLEAN__BOXEDv);
2442 * GtkWidget::selection-clear-event:
2443 * @widget: the object which received the signal
2444 * @event: (type Gdk.EventSelection): the #GdkEventSelection which triggered
2447 * The ::selection-clear-event signal will be emitted when the
2448 * the @widget's window has lost ownership of a selection.
2450 * Returns: %TRUE to stop other handlers from being invoked for the event.
2451 * %FALSE to propagate the event further.
2453 widget_signals[SELECTION_CLEAR_EVENT] =
2454 g_signal_new (I_("selection-clear-event"),
2455 G_TYPE_FROM_CLASS (klass),
2457 G_STRUCT_OFFSET (GtkWidgetClass, selection_clear_event),
2458 _gtk_boolean_handled_accumulator, NULL,
2459 _gtk_marshal_BOOLEAN__BOXED,
2461 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2462 g_signal_set_va_marshaller (widget_signals[SELECTION_CLEAR_EVENT], G_TYPE_FROM_CLASS (klass),
2463 _gtk_marshal_BOOLEAN__BOXEDv);
2466 * GtkWidget::selection-request-event:
2467 * @widget: the object which received the signal
2468 * @event: (type Gdk.EventSelection): the #GdkEventSelection which triggered
2471 * The ::selection-request-event signal will be emitted when
2472 * another client requests ownership of the selection owned by
2473 * the @widget's window.
2475 * Returns: %TRUE to stop other handlers from being invoked for the event.
2476 * %FALSE to propagate the event further.
2478 widget_signals[SELECTION_REQUEST_EVENT] =
2479 g_signal_new (I_("selection-request-event"),
2480 G_TYPE_FROM_CLASS (klass),
2482 G_STRUCT_OFFSET (GtkWidgetClass, selection_request_event),
2483 _gtk_boolean_handled_accumulator, NULL,
2484 _gtk_marshal_BOOLEAN__BOXED,
2486 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2487 g_signal_set_va_marshaller (widget_signals[SELECTION_REQUEST_EVENT], G_TYPE_FROM_CLASS (klass),
2488 _gtk_marshal_BOOLEAN__BOXEDv);
2491 * GtkWidget::selection-notify-event:
2492 * @widget: the object which received the signal.
2493 * @event: (type Gdk.EventSelection):
2495 * Returns: %TRUE to stop other handlers from being invoked for the event. %FALSE to propagate the event further.
2497 widget_signals[SELECTION_NOTIFY_EVENT] =
2498 g_signal_new (I_("selection-notify-event"),
2499 G_TYPE_FROM_CLASS (klass),
2501 G_STRUCT_OFFSET (GtkWidgetClass, selection_notify_event),
2502 _gtk_boolean_handled_accumulator, NULL,
2503 _gtk_marshal_BOOLEAN__BOXED,
2505 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2506 g_signal_set_va_marshaller (widget_signals[SELECTION_NOTIFY_EVENT], G_TYPE_FROM_CLASS (klass),
2507 _gtk_marshal_BOOLEAN__BOXEDv);
2510 * GtkWidget::selection-received:
2511 * @widget: the object which received the signal.
2515 widget_signals[SELECTION_RECEIVED] =
2516 g_signal_new (I_("selection-received"),
2517 G_TYPE_FROM_CLASS (klass),
2519 G_STRUCT_OFFSET (GtkWidgetClass, selection_received),
2521 _gtk_marshal_VOID__BOXED_UINT,
2523 GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
2527 * GtkWidget::selection-get:
2528 * @widget: the object which received the signal.
2533 widget_signals[SELECTION_GET] =
2534 g_signal_new (I_("selection-get"),
2535 G_TYPE_FROM_CLASS (klass),
2537 G_STRUCT_OFFSET (GtkWidgetClass, selection_get),
2539 _gtk_marshal_VOID__BOXED_UINT_UINT,
2541 GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
2546 * GtkWidget::proximity-in-event:
2547 * @widget: the object which received the signal
2548 * @event: (type Gdk.EventProximity): the #GdkEventProximity which triggered
2551 * To receive this signal the #GdkWindow associated to the widget needs
2552 * to enable the #GDK_PROXIMITY_IN_MASK mask.
2554 * This signal will be sent to the grab widget if there is one.
2556 * Returns: %TRUE to stop other handlers from being invoked for the event.
2557 * %FALSE to propagate the event further.
2559 widget_signals[PROXIMITY_IN_EVENT] =
2560 g_signal_new (I_("proximity-in-event"),
2561 G_TYPE_FROM_CLASS (klass),
2563 G_STRUCT_OFFSET (GtkWidgetClass, proximity_in_event),
2564 _gtk_boolean_handled_accumulator, NULL,
2565 _gtk_marshal_BOOLEAN__BOXED,
2567 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2568 g_signal_set_va_marshaller (widget_signals[PROXIMITY_IN_EVENT], G_TYPE_FROM_CLASS (klass),
2569 _gtk_marshal_BOOLEAN__BOXEDv);
2572 * GtkWidget::proximity-out-event:
2573 * @widget: the object which received the signal
2574 * @event: (type Gdk.EventProximity): the #GdkEventProximity which triggered
2577 * To receive this signal the #GdkWindow associated to the widget needs
2578 * to enable the #GDK_PROXIMITY_OUT_MASK mask.
2580 * This signal will be sent to the grab widget if there is one.
2582 * Returns: %TRUE to stop other handlers from being invoked for the event.
2583 * %FALSE to propagate the event further.
2585 widget_signals[PROXIMITY_OUT_EVENT] =
2586 g_signal_new (I_("proximity-out-event"),
2587 G_TYPE_FROM_CLASS (klass),
2589 G_STRUCT_OFFSET (GtkWidgetClass, proximity_out_event),
2590 _gtk_boolean_handled_accumulator, NULL,
2591 _gtk_marshal_BOOLEAN__BOXED,
2593 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2594 g_signal_set_va_marshaller (widget_signals[PROXIMITY_OUT_EVENT], G_TYPE_FROM_CLASS (klass),
2595 _gtk_marshal_BOOLEAN__BOXEDv);
2598 * GtkWidget::drag-leave:
2599 * @widget: the object which received the signal.
2600 * @context: the drag context
2601 * @time: the timestamp of the motion event
2603 * The ::drag-leave signal is emitted on the drop site when the cursor
2604 * leaves the widget. A typical reason to connect to this signal is to
2605 * undo things done in #GtkWidget::drag-motion, e.g. undo highlighting
2606 * with gtk_drag_unhighlight()
2608 widget_signals[DRAG_LEAVE] =
2609 g_signal_new (I_("drag-leave"),
2610 G_TYPE_FROM_CLASS (klass),
2612 G_STRUCT_OFFSET (GtkWidgetClass, drag_leave),
2614 _gtk_marshal_VOID__OBJECT_UINT,
2616 GDK_TYPE_DRAG_CONTEXT,
2620 * GtkWidget::drag-begin:
2621 * @widget: the object which received the signal
2622 * @context: the drag context
2624 * The ::drag-begin signal is emitted on the drag source when a drag is
2625 * started. A typical reason to connect to this signal is to set up a
2626 * custom drag icon with e.g. gtk_drag_source_set_icon_pixbuf().
2628 * Note that some widgets set up a drag icon in the default handler of
2629 * this signal, so you may have to use g_signal_connect_after() to
2630 * override what the default handler did.
2632 widget_signals[DRAG_BEGIN] =
2633 g_signal_new (I_("drag-begin"),
2634 G_TYPE_FROM_CLASS (klass),
2636 G_STRUCT_OFFSET (GtkWidgetClass, drag_begin),
2638 _gtk_marshal_VOID__OBJECT,
2640 GDK_TYPE_DRAG_CONTEXT);
2643 * GtkWidget::drag-end:
2644 * @widget: the object which received the signal
2645 * @context: the drag context
2647 * The ::drag-end signal is emitted on the drag source when a drag is
2648 * finished. A typical reason to connect to this signal is to undo
2649 * things done in #GtkWidget::drag-begin.
2651 widget_signals[DRAG_END] =
2652 g_signal_new (I_("drag-end"),
2653 G_TYPE_FROM_CLASS (klass),
2655 G_STRUCT_OFFSET (GtkWidgetClass, drag_end),
2657 _gtk_marshal_VOID__OBJECT,
2659 GDK_TYPE_DRAG_CONTEXT);
2662 * GtkWidget::drag-data-delete:
2663 * @widget: the object which received the signal
2664 * @context: the drag context
2666 * The ::drag-data-delete signal is emitted on the drag source when a drag
2667 * with the action %GDK_ACTION_MOVE is successfully completed. The signal
2668 * handler is responsible for deleting the data that has been dropped. What
2669 * "delete" means depends on the context of the drag operation.
2671 widget_signals[DRAG_DATA_DELETE] =
2672 g_signal_new (I_("drag-data-delete"),
2673 G_TYPE_FROM_CLASS (klass),
2675 G_STRUCT_OFFSET (GtkWidgetClass, drag_data_delete),
2677 _gtk_marshal_VOID__OBJECT,
2679 GDK_TYPE_DRAG_CONTEXT);
2682 * GtkWidget::drag-failed:
2683 * @widget: the object which received the signal
2684 * @context: the drag context
2685 * @result: the result of the drag operation
2687 * The ::drag-failed signal is emitted on the drag source when a drag has
2688 * failed. The signal handler may hook custom code to handle a failed DND
2689 * operation based on the type of error, it returns %TRUE is the failure has
2690 * been already handled (not showing the default "drag operation failed"
2691 * animation), otherwise it returns %FALSE.
2693 * Return value: %TRUE if the failed drag operation has been already handled.
2697 widget_signals[DRAG_FAILED] =
2698 g_signal_new (I_("drag-failed"),
2699 G_TYPE_FROM_CLASS (klass),
2701 G_STRUCT_OFFSET (GtkWidgetClass, drag_failed),
2702 _gtk_boolean_handled_accumulator, NULL,
2703 _gtk_marshal_BOOLEAN__OBJECT_ENUM,
2705 GDK_TYPE_DRAG_CONTEXT,
2706 GTK_TYPE_DRAG_RESULT);
2709 * GtkWidget::drag-motion:
2710 * @widget: the object which received the signal
2711 * @context: the drag context
2712 * @x: the x coordinate of the current cursor position
2713 * @y: the y coordinate of the current cursor position
2714 * @time: the timestamp of the motion event
2716 * The ::drag-motion signal is emitted on the drop site when the user
2717 * moves the cursor over the widget during a drag. The signal handler
2718 * must determine whether the cursor position is in a drop zone or not.
2719 * If it is not in a drop zone, it returns %FALSE and no further processing
2720 * is necessary. Otherwise, the handler returns %TRUE. In this case, the
2721 * handler is responsible for providing the necessary information for
2722 * displaying feedback to the user, by calling gdk_drag_status().
2724 * If the decision whether the drop will be accepted or rejected can't be
2725 * made based solely on the cursor position and the type of the data, the
2726 * handler may inspect the dragged data by calling gtk_drag_get_data() and
2727 * defer the gdk_drag_status() call to the #GtkWidget::drag-data-received
2728 * handler. Note that you cannot not pass #GTK_DEST_DEFAULT_DROP,
2729 * #GTK_DEST_DEFAULT_MOTION or #GTK_DEST_DEFAULT_ALL to gtk_drag_dest_set()
2730 * when using the drag-motion signal that way.
2732 * Also note that there is no drag-enter signal. The drag receiver has to
2733 * keep track of whether he has received any drag-motion signals since the
2734 * last #GtkWidget::drag-leave and if not, treat the drag-motion signal as
2735 * an "enter" signal. Upon an "enter", the handler will typically highlight
2736 * the drop site with gtk_drag_highlight().
2739 * drag_motion (GtkWidget *widget,
2740 * GdkDragContext *context,
2747 * PrivateData *private_data = GET_PRIVATE_DATA (widget);
2749 * if (!private_data->drag_highlight)
2751 * private_data->drag_highlight = 1;
2752 * gtk_drag_highlight (widget);
2755 * target = gtk_drag_dest_find_target (widget, context, NULL);
2756 * if (target == GDK_NONE)
2757 * gdk_drag_status (context, 0, time);
2760 * private_data->pending_status = gdk_drag_context_get_suggested_action (context);
2761 * gtk_drag_get_data (widget, context, target, time);
2768 * drag_data_received (GtkWidget *widget,
2769 * GdkDragContext *context,
2772 * GtkSelectionData *selection_data,
2776 * PrivateData *private_data = GET_PRIVATE_DATA (widget);
2778 * if (private_data->suggested_action)
2780 * private_data->suggested_action = 0;
2782 * /* We are getting this data due to a request in drag_motion,
2783 * * rather than due to a request in drag_drop, so we are just
2784 * * supposed to call gdk_drag_status(), not actually paste in
2787 * str = gtk_selection_data_get_text (selection_data);
2788 * if (!data_is_acceptable (str))
2789 * gdk_drag_status (context, 0, time);
2791 * gdk_drag_status (context, private_data->suggested_action, time);
2795 * /* accept the drop */
2800 * Returns: whether the cursor position is in a drop zone
2802 widget_signals[DRAG_MOTION] =
2803 g_signal_new (I_("drag-motion"),
2804 G_TYPE_FROM_CLASS (klass),
2806 G_STRUCT_OFFSET (GtkWidgetClass, drag_motion),
2807 _gtk_boolean_handled_accumulator, NULL,
2808 _gtk_marshal_BOOLEAN__OBJECT_INT_INT_UINT,
2810 GDK_TYPE_DRAG_CONTEXT,
2816 * GtkWidget::drag-drop:
2817 * @widget: the object which received the signal
2818 * @context: the drag context
2819 * @x: the x coordinate of the current cursor position
2820 * @y: the y coordinate of the current cursor position
2821 * @time: the timestamp of the motion event
2823 * The ::drag-drop signal is emitted on the drop site when the user drops
2824 * the data onto the widget. The signal handler must determine whether
2825 * the cursor position is in a drop zone or not. If it is not in a drop
2826 * zone, it returns %FALSE and no further processing is necessary.
2827 * Otherwise, the handler returns %TRUE. In this case, the handler must
2828 * ensure that gtk_drag_finish() is called to let the source know that
2829 * the drop is done. The call to gtk_drag_finish() can be done either
2830 * directly or in a #GtkWidget::drag-data-received handler which gets
2831 * triggered by calling gtk_drag_get_data() to receive the data for one
2832 * or more of the supported targets.
2834 * Returns: whether the cursor position is in a drop zone
2836 widget_signals[DRAG_DROP] =
2837 g_signal_new (I_("drag-drop"),
2838 G_TYPE_FROM_CLASS (klass),
2840 G_STRUCT_OFFSET (GtkWidgetClass, drag_drop),
2841 _gtk_boolean_handled_accumulator, NULL,
2842 _gtk_marshal_BOOLEAN__OBJECT_INT_INT_UINT,
2844 GDK_TYPE_DRAG_CONTEXT,
2850 * GtkWidget::drag-data-get:
2851 * @widget: the object which received the signal
2852 * @context: the drag context
2853 * @data: the #GtkSelectionData to be filled with the dragged data
2854 * @info: the info that has been registered with the target in the
2856 * @time: the timestamp at which the data was requested
2858 * The ::drag-data-get signal is emitted on the drag source when the drop
2859 * site requests the data which is dragged. It is the responsibility of
2860 * the signal handler to fill @data with the data in the format which
2861 * is indicated by @info. See gtk_selection_data_set() and
2862 * gtk_selection_data_set_text().
2864 widget_signals[DRAG_DATA_GET] =
2865 g_signal_new (I_("drag-data-get"),
2866 G_TYPE_FROM_CLASS (klass),
2868 G_STRUCT_OFFSET (GtkWidgetClass, drag_data_get),
2870 _gtk_marshal_VOID__OBJECT_BOXED_UINT_UINT,
2872 GDK_TYPE_DRAG_CONTEXT,
2873 GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
2878 * GtkWidget::drag-data-received:
2879 * @widget: the object which received the signal
2880 * @context: the drag context
2881 * @x: where the drop happened
2882 * @y: where the drop happened
2883 * @data: the received data
2884 * @info: the info that has been registered with the target in the
2886 * @time: the timestamp at which the data was received
2888 * The ::drag-data-received signal is emitted on the drop site when the
2889 * dragged data has been received. If the data was received in order to
2890 * determine whether the drop will be accepted, the handler is expected
2891 * to call gdk_drag_status() and <emphasis>not</emphasis> finish the drag.
2892 * If the data was received in response to a #GtkWidget::drag-drop signal
2893 * (and this is the last target to be received), the handler for this
2894 * signal is expected to process the received data and then call
2895 * gtk_drag_finish(), setting the @success parameter depending on
2896 * whether the data was processed successfully.
2898 * The handler may inspect the selected action with
2899 * gdk_drag_context_get_selected_action() before calling
2900 * gtk_drag_finish(), e.g. to implement %GDK_ACTION_ASK as
2901 * shown in the following example:
2904 * drag_data_received (GtkWidget *widget,
2905 * GdkDragContext *context,
2908 * GtkSelectionData *data,
2912 * if ((data->length >= 0) && (data->format == 8))
2914 * GdkDragAction action;
2916 * /* handle data here */
2918 * action = gdk_drag_context_get_selected_action (context);
2919 * if (action == GDK_ACTION_ASK)
2921 * GtkWidget *dialog;
2924 * dialog = gtk_message_dialog_new (NULL,
2925 * GTK_DIALOG_MODAL |
2926 * GTK_DIALOG_DESTROY_WITH_PARENT,
2928 * GTK_BUTTONS_YES_NO,
2929 * "Move the data ?\n");
2930 * response = gtk_dialog_run (GTK_DIALOG (dialog));
2931 * gtk_widget_destroy (dialog);
2933 * if (response == GTK_RESPONSE_YES)
2934 * action = GDK_ACTION_MOVE;
2936 * action = GDK_ACTION_COPY;
2939 * gtk_drag_finish (context, TRUE, action == GDK_ACTION_MOVE, time);
2942 * gtk_drag_finish (context, FALSE, FALSE, time);
2946 widget_signals[DRAG_DATA_RECEIVED] =
2947 g_signal_new (I_("drag-data-received"),
2948 G_TYPE_FROM_CLASS (klass),
2950 G_STRUCT_OFFSET (GtkWidgetClass, drag_data_received),
2952 _gtk_marshal_VOID__OBJECT_INT_INT_BOXED_UINT_UINT,
2954 GDK_TYPE_DRAG_CONTEXT,
2957 GTK_TYPE_SELECTION_DATA | G_SIGNAL_TYPE_STATIC_SCOPE,
2962 * GtkWidget::visibility-notify-event:
2963 * @widget: the object which received the signal
2964 * @event: (type Gdk.EventVisibility): the #GdkEventVisibility which
2965 * triggered this signal.
2967 * The ::visibility-notify-event will be emitted when the @widget's window
2968 * is obscured or unobscured.
2970 * To receive this signal the #GdkWindow associated to the widget needs
2971 * to enable the #GDK_VISIBILITY_NOTIFY_MASK mask.
2973 * Returns: %TRUE to stop other handlers from being invoked for the event.
2974 * %FALSE to propagate the event further.
2976 widget_signals[VISIBILITY_NOTIFY_EVENT] =
2977 g_signal_new (I_("visibility-notify-event"),
2978 G_TYPE_FROM_CLASS (klass),
2980 G_STRUCT_OFFSET (GtkWidgetClass, visibility_notify_event),
2981 _gtk_boolean_handled_accumulator, NULL,
2982 _gtk_marshal_BOOLEAN__BOXED,
2984 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
2987 * GtkWidget::window-state-event:
2988 * @widget: the object which received the signal
2989 * @event: (type Gdk.EventWindowState): the #GdkEventWindowState which
2990 * triggered this signal.
2992 * The ::window-state-event will be emitted when the state of the
2993 * toplevel window associated to the @widget changes.
2995 * To receive this signal the #GdkWindow associated to the widget
2996 * needs to enable the #GDK_STRUCTURE_MASK mask. GDK will enable
2997 * this mask automatically for all new windows.
2999 * Returns: %TRUE to stop other handlers from being invoked for the
3000 * event. %FALSE to propagate the event further.
3002 widget_signals[WINDOW_STATE_EVENT] =
3003 g_signal_new (I_("window-state-event"),
3004 G_TYPE_FROM_CLASS (klass),
3006 G_STRUCT_OFFSET (GtkWidgetClass, window_state_event),
3007 _gtk_boolean_handled_accumulator, NULL,
3008 _gtk_marshal_BOOLEAN__BOXED,
3010 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
3011 g_signal_set_va_marshaller (widget_signals[WINDOW_STATE_EVENT], G_TYPE_FROM_CLASS (klass),
3012 _gtk_marshal_BOOLEAN__BOXEDv);
3015 * GtkWidget::damage-event:
3016 * @widget: the object which received the signal
3017 * @event: (type Gdk.EventExpose): the #GdkEventExpose event
3019 * Emitted when a redirected window belonging to @widget gets drawn into.
3020 * The region/area members of the event shows what area of the redirected
3021 * drawable was drawn into.
3023 * Returns: %TRUE to stop other handlers from being invoked for the event.
3024 * %FALSE to propagate the event further.
3028 widget_signals[DAMAGE_EVENT] =
3029 g_signal_new (I_("damage-event"),
3030 G_TYPE_FROM_CLASS (klass),
3032 G_STRUCT_OFFSET (GtkWidgetClass, damage_event),
3033 _gtk_boolean_handled_accumulator, NULL,
3034 _gtk_marshal_BOOLEAN__BOXED,
3036 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
3037 g_signal_set_va_marshaller (widget_signals[DAMAGE_EVENT], G_TYPE_FROM_CLASS (klass),
3038 _gtk_marshal_BOOLEAN__BOXEDv);
3041 * GtkWidget::grab-broken-event:
3042 * @widget: the object which received the signal
3043 * @event: (type Gdk.EventGrabBroken): the #GdkEventGrabBroken event
3045 * Emitted when a pointer or keyboard grab on a window belonging
3046 * to @widget gets broken.
3048 * On X11, this happens when the grab window becomes unviewable
3049 * (i.e. it or one of its ancestors is unmapped), or if the same
3050 * application grabs the pointer or keyboard again.
3052 * Returns: %TRUE to stop other handlers from being invoked for
3053 * the event. %FALSE to propagate the event further.
3057 widget_signals[GRAB_BROKEN_EVENT] =
3058 g_signal_new (I_("grab-broken-event"),
3059 G_TYPE_FROM_CLASS (klass),
3061 G_STRUCT_OFFSET (GtkWidgetClass, grab_broken_event),
3062 _gtk_boolean_handled_accumulator, NULL,
3063 _gtk_marshal_BOOLEAN__BOXED,
3065 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
3066 g_signal_set_va_marshaller (widget_signals[GRAB_BROKEN_EVENT], G_TYPE_FROM_CLASS (klass),
3067 _gtk_marshal_BOOLEAN__BOXEDv);
3070 * GtkWidget::query-tooltip:
3071 * @widget: the object which received the signal
3072 * @x: the x coordinate of the cursor position where the request has
3073 * been emitted, relative to @widget's left side
3074 * @y: the y coordinate of the cursor position where the request has
3075 * been emitted, relative to @widget's top
3076 * @keyboard_mode: %TRUE if the tooltip was trigged using the keyboard
3077 * @tooltip: a #GtkTooltip
3079 * Emitted when #GtkWidget:has-tooltip is %TRUE and the #GtkSettings:gtk-tooltip-timeout
3080 * has expired with the cursor hovering "above" @widget; or emitted when @widget got
3081 * focus in keyboard mode.
3083 * Using the given coordinates, the signal handler should determine
3084 * whether a tooltip should be shown for @widget. If this is the case
3085 * %TRUE should be returned, %FALSE otherwise. Note that if
3086 * @keyboard_mode is %TRUE, the values of @x and @y are undefined and
3087 * should not be used.
3089 * The signal handler is free to manipulate @tooltip with the therefore
3090 * destined function calls.
3092 * Returns: %TRUE if @tooltip should be shown right now, %FALSE otherwise.
3096 widget_signals[QUERY_TOOLTIP] =
3097 g_signal_new (I_("query-tooltip"),
3098 G_TYPE_FROM_CLASS (klass),
3100 G_STRUCT_OFFSET (GtkWidgetClass, query_tooltip),
3101 _gtk_boolean_handled_accumulator, NULL,
3102 _gtk_marshal_BOOLEAN__INT_INT_BOOLEAN_OBJECT,
3110 * GtkWidget::popup-menu:
3111 * @widget: the object which received the signal
3113 * This signal gets emitted whenever a widget should pop up a context
3114 * menu. This usually happens through the standard key binding mechanism;
3115 * by pressing a certain key while a widget is focused, the user can cause
3116 * the widget to pop up a menu. For example, the #GtkEntry widget creates
3117 * a menu with clipboard commands. See <xref linkend="checklist-popup-menu"/>
3118 * for an example of how to use this signal.
3120 * Returns: %TRUE if a menu was activated
3122 widget_signals[POPUP_MENU] =
3123 g_signal_new (I_("popup-menu"),
3124 G_TYPE_FROM_CLASS (klass),
3125 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
3126 G_STRUCT_OFFSET (GtkWidgetClass, popup_menu),
3127 _gtk_boolean_handled_accumulator, NULL,
3128 _gtk_marshal_BOOLEAN__VOID,
3132 * GtkWidget::show-help:
3133 * @widget: the object which received the signal.
3136 * Returns: %TRUE to stop other handlers from being invoked for the event.
3137 * %FALSE to propagate the event further.
3139 widget_signals[SHOW_HELP] =
3140 g_signal_new (I_("show-help"),
3141 G_TYPE_FROM_CLASS (klass),
3142 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
3143 G_STRUCT_OFFSET (GtkWidgetClass, show_help),
3144 _gtk_boolean_handled_accumulator, NULL,
3145 _gtk_marshal_BOOLEAN__ENUM,
3147 GTK_TYPE_WIDGET_HELP_TYPE);
3150 * GtkWidget::accel-closures-changed:
3151 * @widget: the object which received the signal.
3153 widget_signals[ACCEL_CLOSURES_CHANGED] =
3154 g_signal_new (I_("accel-closures-changed"),
3155 G_TYPE_FROM_CLASS (klass),
3159 _gtk_marshal_VOID__VOID,
3163 * GtkWidget::screen-changed:
3164 * @widget: the object on which the signal is emitted
3165 * @previous_screen: (allow-none): the previous screen, or %NULL if the
3166 * widget was not associated with a screen before
3168 * The ::screen-changed signal gets emitted when the
3169 * screen of a widget has changed.
3171 widget_signals[SCREEN_CHANGED] =
3172 g_signal_new (I_("screen-changed"),
3173 G_TYPE_FROM_CLASS (klass),
3175 G_STRUCT_OFFSET (GtkWidgetClass, screen_changed),
3177 _gtk_marshal_VOID__OBJECT,
3182 * GtkWidget::can-activate-accel:
3183 * @widget: the object which received the signal
3184 * @signal_id: the ID of a signal installed on @widget
3186 * Determines whether an accelerator that activates the signal
3187 * identified by @signal_id can currently be activated.
3188 * This signal is present to allow applications and derived
3189 * widgets to override the default #GtkWidget handling
3190 * for determining whether an accelerator can be activated.
3192 * Returns: %TRUE if the signal can be activated.
3194 widget_signals[CAN_ACTIVATE_ACCEL] =
3195 g_signal_new (I_("can-activate-accel"),
3196 G_TYPE_FROM_CLASS (klass),
3198 G_STRUCT_OFFSET (GtkWidgetClass, can_activate_accel),
3199 _gtk_boolean_handled_accumulator, NULL,
3200 _gtk_marshal_BOOLEAN__UINT,
3201 G_TYPE_BOOLEAN, 1, G_TYPE_UINT);
3203 binding_set = gtk_binding_set_by_class (klass);
3204 gtk_binding_entry_add_signal (binding_set, GDK_KEY_F10, GDK_SHIFT_MASK,
3206 gtk_binding_entry_add_signal (binding_set, GDK_KEY_Menu, 0,
3209 gtk_binding_entry_add_signal (binding_set, GDK_KEY_F1, GDK_CONTROL_MASK,
3211 GTK_TYPE_WIDGET_HELP_TYPE,
3212 GTK_WIDGET_HELP_TOOLTIP);
3213 gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_F1, GDK_CONTROL_MASK,
3215 GTK_TYPE_WIDGET_HELP_TYPE,
3216 GTK_WIDGET_HELP_TOOLTIP);
3217 gtk_binding_entry_add_signal (binding_set, GDK_KEY_F1, GDK_SHIFT_MASK,
3219 GTK_TYPE_WIDGET_HELP_TYPE,
3220 GTK_WIDGET_HELP_WHATS_THIS);
3221 gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_F1, GDK_SHIFT_MASK,
3223 GTK_TYPE_WIDGET_HELP_TYPE,
3224 GTK_WIDGET_HELP_WHATS_THIS);
3226 gtk_widget_class_install_style_property (klass,
3227 g_param_spec_boolean ("interior-focus",
3228 P_("Interior Focus"),
3229 P_("Whether to draw the focus indicator inside widgets"),
3231 GTK_PARAM_READABLE));
3233 gtk_widget_class_install_style_property (klass,
3234 g_param_spec_int ("focus-line-width",
3235 P_("Focus linewidth"),
3236 P_("Width, in pixels, of the focus indicator line"),
3238 GTK_PARAM_READABLE));
3240 gtk_widget_class_install_style_property (klass,
3241 g_param_spec_string ("focus-line-pattern",
3242 P_("Focus line dash pattern"),
3243 P_("Dash pattern used to draw the focus indicator"),
3245 GTK_PARAM_READABLE));
3246 gtk_widget_class_install_style_property (klass,
3247 g_param_spec_int ("focus-padding",
3248 P_("Focus padding"),
3249 P_("Width, in pixels, between focus indicator and the widget 'box'"),
3251 GTK_PARAM_READABLE));
3252 gtk_widget_class_install_style_property (klass,
3253 g_param_spec_boxed ("cursor-color",
3255 P_("Color with which to draw insertion cursor"),
3257 GTK_PARAM_READABLE));
3258 gtk_widget_class_install_style_property (klass,
3259 g_param_spec_boxed ("secondary-cursor-color",
3260 P_("Secondary cursor color"),
3261 P_("Color with which to draw the secondary insertion cursor when editing mixed right-to-left and left-to-right text"),
3263 GTK_PARAM_READABLE));
3264 gtk_widget_class_install_style_property (klass,
3265 g_param_spec_float ("cursor-aspect-ratio",
3266 P_("Cursor line aspect ratio"),
3267 P_("Aspect ratio with which to draw insertion cursor"),
3269 GTK_PARAM_READABLE));
3271 gtk_widget_class_install_style_property (klass,
3272 g_param_spec_boolean ("window-dragging",
3273 P_("Window dragging"),
3274 P_("Whether windows can be dragged by clicking on empty areas"),
3276 GTK_PARAM_READABLE));
3279 * GtkWidget:link-color:
3281 * The "link-color" style property defines the color of unvisited links.
3285 gtk_widget_class_install_style_property (klass,
3286 g_param_spec_boxed ("link-color",
3287 P_("Unvisited Link Color"),
3288 P_("Color of unvisited links"),
3290 GTK_PARAM_READABLE));
3293 * GtkWidget:visited-link-color:
3295 * The "visited-link-color" style property defines the color of visited links.
3299 gtk_widget_class_install_style_property (klass,
3300 g_param_spec_boxed ("visited-link-color",
3301 P_("Visited Link Color"),
3302 P_("Color of visited links"),
3304 GTK_PARAM_READABLE));
3307 * GtkWidget:wide-separators:
3309 * The "wide-separators" style property defines whether separators have
3310 * configurable width and should be drawn using a box instead of a line.
3314 gtk_widget_class_install_style_property (klass,
3315 g_param_spec_boolean ("wide-separators",
3316 P_("Wide Separators"),
3317 P_("Whether separators have configurable width and should be drawn using a box instead of a line"),
3319 GTK_PARAM_READABLE));
3322 * GtkWidget:separator-width:
3324 * The "separator-width" style property defines the width of separators.
3325 * This property only takes effect if #GtkWidget:wide-separators is %TRUE.
3329 gtk_widget_class_install_style_property (klass,
3330 g_param_spec_int ("separator-width",
3331 P_("Separator Width"),
3332 P_("The width of separators if wide-separators is TRUE"),
3334 GTK_PARAM_READABLE));
3337 * GtkWidget:separator-height:
3339 * The "separator-height" style property defines the height of separators.
3340 * This property only takes effect if #GtkWidget:wide-separators is %TRUE.
3344 gtk_widget_class_install_style_property (klass,
3345 g_param_spec_int ("separator-height",
3346 P_("Separator Height"),
3347 P_("The height of separators if \"wide-separators\" is TRUE"),
3349 GTK_PARAM_READABLE));
3352 * GtkWidget:scroll-arrow-hlength:
3354 * The "scroll-arrow-hlength" style property defines the length of
3355 * horizontal scroll arrows.
3359 gtk_widget_class_install_style_property (klass,
3360 g_param_spec_int ("scroll-arrow-hlength",
3361 P_("Horizontal Scroll Arrow Length"),
3362 P_("The length of horizontal scroll arrows"),
3364 GTK_PARAM_READABLE));
3367 * GtkWidget:scroll-arrow-vlength:
3369 * The "scroll-arrow-vlength" style property defines the length of
3370 * vertical scroll arrows.
3374 gtk_widget_class_install_style_property (klass,
3375 g_param_spec_int ("scroll-arrow-vlength",
3376 P_("Vertical Scroll Arrow Length"),
3377 P_("The length of vertical scroll arrows"),
3379 GTK_PARAM_READABLE));
3381 gtk_widget_class_install_style_property (klass,
3382 g_param_spec_int ("text-handle-width",
3383 P_("Width of text selection handles"),
3384 P_("Width of text selection handles"),
3386 GTK_PARAM_READABLE));
3387 gtk_widget_class_install_style_property (klass,
3388 g_param_spec_int ("text-handle-height",
3389 P_("Height of text selection handles"),
3390 P_("Height of text selection handles"),
3392 GTK_PARAM_READABLE));
3394 g_type_class_add_private (klass, sizeof (GtkWidgetPrivate));
3396 gtk_widget_class_set_accessible_type (klass, GTK_TYPE_WIDGET_ACCESSIBLE);
3400 gtk_widget_base_class_finalize (GtkWidgetClass *klass)
3404 list = g_param_spec_pool_list_owned (style_property_spec_pool, G_OBJECT_CLASS_TYPE (klass));
3405 for (node = list; node; node = node->next)
3407 GParamSpec *pspec = node->data;
3409 g_param_spec_pool_remove (style_property_spec_pool, pspec);
3410 g_param_spec_unref (pspec);
3416 gtk_widget_set_property (GObject *object,
3418 const GValue *value,
3421 GtkWidget *widget = GTK_WIDGET (object);
3426 gchar *tooltip_markup;
3427 const gchar *tooltip_text;
3428 GtkWindow *tooltip_window;
3431 gtk_widget_set_name (widget, g_value_get_string (value));
3434 gtk_container_add (GTK_CONTAINER (g_value_get_object (value)), widget);
3436 case PROP_WIDTH_REQUEST:
3437 gtk_widget_set_usize_internal (widget, g_value_get_int (value), -2, 0);
3439 case PROP_HEIGHT_REQUEST:
3440 gtk_widget_set_usize_internal (widget, -2, g_value_get_int (value), 0);
3443 gtk_widget_set_visible (widget, g_value_get_boolean (value));
3445 case PROP_SENSITIVE:
3446 gtk_widget_set_sensitive (widget, g_value_get_boolean (value));
3448 case PROP_APP_PAINTABLE:
3449 gtk_widget_set_app_paintable (widget, g_value_get_boolean (value));
3451 case PROP_CAN_FOCUS:
3452 gtk_widget_set_can_focus (widget, g_value_get_boolean (value));
3454 case PROP_HAS_FOCUS:
3455 if (g_value_get_boolean (value))
3456 gtk_widget_grab_focus (widget);
3459 if (g_value_get_boolean (value))
3460 gtk_widget_grab_focus (widget);
3462 case PROP_CAN_DEFAULT:
3463 gtk_widget_set_can_default (widget, g_value_get_boolean (value));
3465 case PROP_HAS_DEFAULT:
3466 if (g_value_get_boolean (value))
3467 gtk_widget_grab_default (widget);
3469 case PROP_RECEIVES_DEFAULT:
3470 gtk_widget_set_receives_default (widget, g_value_get_boolean (value));
3473 gtk_widget_set_style (widget, g_value_get_object (value));
3476 if (!gtk_widget_get_realized (widget) && gtk_widget_get_has_window (widget))
3477 gtk_widget_set_events (widget, g_value_get_flags (value));
3479 case PROP_NO_SHOW_ALL:
3480 gtk_widget_set_no_show_all (widget, g_value_get_boolean (value));
3482 case PROP_HAS_TOOLTIP:
3483 gtk_widget_real_set_has_tooltip (widget,
3484 g_value_get_boolean (value), FALSE);
3486 case PROP_TOOLTIP_MARKUP:
3487 tooltip_window = g_object_get_qdata (object, quark_tooltip_window);
3488 tooltip_markup = g_value_dup_string (value);
3490 /* Treat an empty string as a NULL string,
3491 * because an empty string would be useless for a tooltip:
3493 if (tooltip_markup && (strlen (tooltip_markup) == 0))
3495 g_free (tooltip_markup);
3496 tooltip_markup = NULL;
3499 g_object_set_qdata_full (object, quark_tooltip_markup,
3500 tooltip_markup, g_free);
3502 tmp = (tooltip_window != NULL || tooltip_markup != NULL);
3503 gtk_widget_real_set_has_tooltip (widget, tmp, FALSE);
3504 if (gtk_widget_get_visible (widget))
3505 gtk_widget_queue_tooltip_query (widget);
3507 case PROP_TOOLTIP_TEXT:
3508 tooltip_window = g_object_get_qdata (object, quark_tooltip_window);
3510 tooltip_text = g_value_get_string (value);
3512 /* Treat an empty string as a NULL string,
3513 * because an empty string would be useless for a tooltip:
3515 if (tooltip_text && (strlen (tooltip_text) == 0))
3516 tooltip_text = NULL;
3518 tooltip_markup = tooltip_text ? g_markup_escape_text (tooltip_text, -1) : NULL;
3520 g_object_set_qdata_full (object, quark_tooltip_markup,
3521 tooltip_markup, g_free);
3523 tmp = (tooltip_window != NULL || tooltip_markup != NULL);
3524 gtk_widget_real_set_has_tooltip (widget, tmp, FALSE);
3525 if (gtk_widget_get_visible (widget))
3526 gtk_widget_queue_tooltip_query (widget);
3528 case PROP_DOUBLE_BUFFERED:
3529 gtk_widget_set_double_buffered (widget, g_value_get_boolean (value));
3532 gtk_widget_set_halign (widget, g_value_get_enum (value));
3535 gtk_widget_set_valign (widget, g_value_get_enum (value));
3537 case PROP_MARGIN_LEFT:
3538 gtk_widget_set_margin_left (widget, g_value_get_int (value));
3540 case PROP_MARGIN_RIGHT:
3541 gtk_widget_set_margin_right (widget, g_value_get_int (value));
3543 case PROP_MARGIN_TOP:
3544 gtk_widget_set_margin_top (widget, g_value_get_int (value));
3546 case PROP_MARGIN_BOTTOM:
3547 gtk_widget_set_margin_bottom (widget, g_value_get_int (value));
3550 g_object_freeze_notify (G_OBJECT (widget));
3551 gtk_widget_set_margin_left (widget, g_value_get_int (value));
3552 gtk_widget_set_margin_right (widget, g_value_get_int (value));
3553 gtk_widget_set_margin_top (widget, g_value_get_int (value));
3554 gtk_widget_set_margin_bottom (widget, g_value_get_int (value));
3555 g_object_thaw_notify (G_OBJECT (widget));
3558 gtk_widget_set_hexpand (widget, g_value_get_boolean (value));
3560 case PROP_HEXPAND_SET:
3561 gtk_widget_set_hexpand_set (widget, g_value_get_boolean (value));
3564 gtk_widget_set_vexpand (widget, g_value_get_boolean (value));
3566 case PROP_VEXPAND_SET:
3567 gtk_widget_set_vexpand_set (widget, g_value_get_boolean (value));
3570 g_object_freeze_notify (G_OBJECT (widget));
3571 gtk_widget_set_hexpand (widget, g_value_get_boolean (value));
3572 gtk_widget_set_vexpand (widget, g_value_get_boolean (value));
3573 g_object_thaw_notify (G_OBJECT (widget));
3576 gtk_widget_set_opacity (widget, g_value_get_double (value));
3579 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
3585 gtk_widget_get_property (GObject *object,
3590 GtkWidget *widget = GTK_WIDGET (object);
3591 GtkWidgetPrivate *priv = widget->priv;
3599 g_value_set_string (value, priv->name);
3601 g_value_set_static_string (value, "");
3604 g_value_set_object (value, priv->parent);
3606 case PROP_WIDTH_REQUEST:
3609 gtk_widget_get_size_request (widget, &w, NULL);
3610 g_value_set_int (value, w);
3613 case PROP_HEIGHT_REQUEST:
3616 gtk_widget_get_size_request (widget, NULL, &h);
3617 g_value_set_int (value, h);
3621 g_value_set_boolean (value, (gtk_widget_get_visible (widget) != FALSE));
3623 case PROP_SENSITIVE:
3624 g_value_set_boolean (value, (gtk_widget_get_sensitive (widget) != FALSE));
3626 case PROP_APP_PAINTABLE:
3627 g_value_set_boolean (value, (gtk_widget_get_app_paintable (widget) != FALSE));
3629 case PROP_CAN_FOCUS:
3630 g_value_set_boolean (value, (gtk_widget_get_can_focus (widget) != FALSE));
3632 case PROP_HAS_FOCUS:
3633 g_value_set_boolean (value, (gtk_widget_has_focus (widget) != FALSE));
3636 g_value_set_boolean (value, (gtk_widget_is_focus (widget)));
3638 case PROP_CAN_DEFAULT:
3639 g_value_set_boolean (value, (gtk_widget_get_can_default (widget) != FALSE));
3641 case PROP_HAS_DEFAULT:
3642 g_value_set_boolean (value, (gtk_widget_has_default (widget) != FALSE));
3644 case PROP_RECEIVES_DEFAULT:
3645 g_value_set_boolean (value, (gtk_widget_get_receives_default (widget) != FALSE));
3647 case PROP_COMPOSITE_CHILD:
3648 g_value_set_boolean (value, widget->priv->composite_child);
3651 g_value_set_object (value, gtk_widget_get_style (widget));
3654 eventp = g_object_get_qdata (G_OBJECT (widget), quark_event_mask);
3655 g_value_set_flags (value, GPOINTER_TO_INT (eventp));
3657 case PROP_NO_SHOW_ALL:
3658 g_value_set_boolean (value, gtk_widget_get_no_show_all (widget));
3660 case PROP_HAS_TOOLTIP:
3661 g_value_set_boolean (value, GPOINTER_TO_UINT (g_object_get_qdata (object, quark_has_tooltip)));
3663 case PROP_TOOLTIP_TEXT:
3665 gchar *escaped = g_object_get_qdata (object, quark_tooltip_markup);
3668 if (escaped && !pango_parse_markup (escaped, -1, 0, NULL, &text, NULL, NULL))
3669 g_assert (NULL == text); /* text should still be NULL in case of markup errors */
3671 g_value_take_string (value, text);
3674 case PROP_TOOLTIP_MARKUP:
3675 g_value_set_string (value, g_object_get_qdata (object, quark_tooltip_markup));
3678 g_value_set_object (value, gtk_widget_get_window (widget));
3680 case PROP_DOUBLE_BUFFERED:
3681 g_value_set_boolean (value, gtk_widget_get_double_buffered (widget));
3684 g_value_set_enum (value, gtk_widget_get_halign (widget));
3687 g_value_set_enum (value, gtk_widget_get_valign (widget));
3689 case PROP_MARGIN_LEFT:
3690 g_value_set_int (value, gtk_widget_get_margin_left (widget));
3692 case PROP_MARGIN_RIGHT:
3693 g_value_set_int (value, gtk_widget_get_margin_right (widget));
3695 case PROP_MARGIN_TOP:
3696 g_value_set_int (value, gtk_widget_get_margin_top (widget));
3698 case PROP_MARGIN_BOTTOM:
3699 g_value_set_int (value, gtk_widget_get_margin_bottom (widget));
3703 GtkWidgetAuxInfo *aux_info = gtk_widget_get_aux_info (widget, FALSE);
3704 if (aux_info == NULL)
3706 g_value_set_int (value, 0);
3710 g_value_set_int (value, MAX (MAX (aux_info->margin.left,
3711 aux_info->margin.right),
3712 MAX (aux_info->margin.top,
3713 aux_info->margin.bottom)));
3718 g_value_set_boolean (value, gtk_widget_get_hexpand (widget));
3720 case PROP_HEXPAND_SET:
3721 g_value_set_boolean (value, gtk_widget_get_hexpand_set (widget));
3724 g_value_set_boolean (value, gtk_widget_get_vexpand (widget));
3726 case PROP_VEXPAND_SET:
3727 g_value_set_boolean (value, gtk_widget_get_vexpand_set (widget));
3730 g_value_set_boolean (value,
3731 gtk_widget_get_hexpand (widget) &&
3732 gtk_widget_get_vexpand (widget));
3735 g_value_set_double (value, gtk_widget_get_opacity (widget));
3738 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
3744 gtk_widget_init (GtkWidget *widget)
3746 GtkWidgetPrivate *priv;
3748 widget->priv = G_TYPE_INSTANCE_GET_PRIVATE (widget,
3751 priv = widget->priv;
3753 priv->child_visible = TRUE;
3755 priv->allocation.x = -1;
3756 priv->allocation.y = -1;
3757 priv->allocation.width = 1;
3758 priv->allocation.height = 1;
3759 priv->user_alpha = 255;
3761 priv->window = NULL;
3762 priv->parent = NULL;
3764 priv->sensitive = TRUE;
3765 priv->composite_child = composite_child_stack != 0;
3766 priv->double_buffered = TRUE;
3767 priv->redraw_on_alloc = TRUE;
3768 priv->alloc_needed = TRUE;
3770 switch (gtk_widget_get_direction (widget))
3772 case GTK_TEXT_DIR_LTR:
3773 priv->state_flags = GTK_STATE_FLAG_DIR_LTR;
3776 case GTK_TEXT_DIR_RTL:
3777 priv->state_flags = GTK_STATE_FLAG_DIR_RTL;
3780 case GTK_TEXT_DIR_NONE:
3782 g_assert_not_reached ();
3787 /* this will be set to TRUE if the widget gets a child or if the
3788 * expand flag is set on the widget, but until one of those happen
3789 * we know the expand is already properly FALSE.
3791 * We really want to default FALSE here to avoid computing expand
3792 * all over the place while initially building a widget tree.
3794 priv->need_compute_expand = FALSE;
3796 _gtk_size_request_cache_init (&priv->requests);
3798 priv->style = gtk_widget_get_default_style ();
3799 g_object_ref (priv->style);
3804 gtk_widget_dispatch_child_properties_changed (GtkWidget *widget,
3806 GParamSpec **pspecs)
3808 GtkWidgetPrivate *priv = widget->priv;
3809 GtkWidget *container = priv->parent;
3812 for (i = 0; widget->priv->parent == container && i < n_pspecs; i++)
3813 g_signal_emit (widget, widget_signals[CHILD_NOTIFY], g_quark_from_string (pspecs[i]->name), pspecs[i]);
3817 * gtk_widget_freeze_child_notify:
3818 * @widget: a #GtkWidget
3820 * Stops emission of #GtkWidget::child-notify signals on @widget. The
3821 * signals are queued until gtk_widget_thaw_child_notify() is called
3824 * This is the analogue of g_object_freeze_notify() for child properties.
3827 gtk_widget_freeze_child_notify (GtkWidget *widget)
3829 g_return_if_fail (GTK_IS_WIDGET (widget));
3831 if (!G_OBJECT (widget)->ref_count)
3834 g_object_ref (widget);
3835 g_object_notify_queue_freeze (G_OBJECT (widget), _gtk_widget_child_property_notify_context);
3836 g_object_unref (widget);
3840 * gtk_widget_child_notify:
3841 * @widget: a #GtkWidget
3842 * @child_property: the name of a child property installed on the
3843 * class of @widget<!-- -->'s parent
3845 * Emits a #GtkWidget::child-notify signal for the
3846 * <link linkend="child-properties">child property</link> @child_property
3849 * This is the analogue of g_object_notify() for child properties.
3851 * Also see gtk_container_child_notify().
3854 gtk_widget_child_notify (GtkWidget *widget,
3855 const gchar *child_property)
3857 if (widget->priv->parent == NULL)
3860 gtk_container_child_notify (GTK_CONTAINER (widget->priv->parent), widget, child_property);
3864 * gtk_widget_thaw_child_notify:
3865 * @widget: a #GtkWidget
3867 * Reverts the effect of a previous call to gtk_widget_freeze_child_notify().
3868 * This causes all queued #GtkWidget::child-notify signals on @widget to be
3872 gtk_widget_thaw_child_notify (GtkWidget *widget)
3874 GObjectNotifyQueue *nqueue;
3876 g_return_if_fail (GTK_IS_WIDGET (widget));
3878 if (!G_OBJECT (widget)->ref_count)
3881 g_object_ref (widget);
3882 nqueue = g_object_notify_queue_from_object (G_OBJECT (widget), _gtk_widget_child_property_notify_context);
3883 if (!nqueue || !nqueue->freeze_count)
3884 g_warning (G_STRLOC ": child-property-changed notification for %s(%p) is not frozen",
3885 G_OBJECT_TYPE_NAME (widget), widget);
3887 g_object_notify_queue_thaw (G_OBJECT (widget), nqueue);
3888 g_object_unref (widget);
3894 * @type: type ID of the widget to create
3895 * @first_property_name: name of first property to set
3896 * @...: value of first property, followed by more properties,
3899 * This is a convenience function for creating a widget and setting
3900 * its properties in one go. For example you might write:
3901 * <literal>gtk_widget_new (GTK_TYPE_LABEL, "label", "Hello World", "xalign",
3902 * 0.0, NULL)</literal> to create a left-aligned label. Equivalent to
3903 * g_object_new(), but returns a widget so you don't have to
3904 * cast the object yourself.
3906 * Return value: a new #GtkWidget of type @widget_type
3909 gtk_widget_new (GType type,
3910 const gchar *first_property_name,
3916 g_return_val_if_fail (g_type_is_a (type, GTK_TYPE_WIDGET), NULL);
3918 va_start (var_args, first_property_name);
3919 widget = (GtkWidget *)g_object_new_valist (type, first_property_name, var_args);
3926 gtk_widget_queue_draw_child (GtkWidget *widget)
3928 GtkWidgetPrivate *priv = widget->priv;
3931 parent = priv->parent;
3932 if (parent && gtk_widget_is_drawable (parent))
3933 gtk_widget_queue_draw_area (parent,
3936 priv->allocation.width,
3937 priv->allocation.height);
3941 * gtk_widget_unparent:
3942 * @widget: a #GtkWidget
3944 * This function is only for use in widget implementations.
3945 * Should be called by implementations of the remove method
3946 * on #GtkContainer, to dissociate a child from the container.
3949 gtk_widget_unparent (GtkWidget *widget)
3951 GtkWidgetPrivate *priv;
3952 GObjectNotifyQueue *nqueue;
3953 GtkWidget *toplevel;
3954 GtkWidget *old_parent;
3956 g_return_if_fail (GTK_IS_WIDGET (widget));
3958 priv = widget->priv;
3960 if (priv->parent == NULL)
3963 /* keep this function in sync with gtk_menu_detach() */
3965 gtk_widget_push_verify_invariants (widget);
3967 g_object_freeze_notify (G_OBJECT (widget));
3968 nqueue = g_object_notify_queue_freeze (G_OBJECT (widget), _gtk_widget_child_property_notify_context);
3970 toplevel = gtk_widget_get_toplevel (widget);
3971 if (gtk_widget_is_toplevel (toplevel))
3972 _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
3974 if (gtk_container_get_focus_child (GTK_CONTAINER (priv->parent)) == widget)
3975 gtk_container_set_focus_child (GTK_CONTAINER (priv->parent), NULL);
3977 gtk_widget_queue_draw_child (widget);
3979 /* Reset the width and height here, to force reallocation if we
3980 * get added back to a new parent. This won't work if our new
3981 * allocation is smaller than 1x1 and we actually want a size of 1x1...
3982 * (would 0x0 be OK here?)
3984 priv->allocation.width = 1;
3985 priv->allocation.height = 1;
3987 if (gtk_widget_get_realized (widget))
3989 if (priv->in_reparent)
3990 gtk_widget_unmap (widget);
3992 gtk_widget_unrealize (widget);
3995 /* If we are unanchoring the child, we save around the toplevel
3996 * to emit hierarchy changed
3998 if (priv->parent->priv->anchored)
3999 g_object_ref (toplevel);
4003 /* Removing a widget from a container restores the child visible
4004 * flag to the default state, so it doesn't affect the child
4005 * in the next parent.
4007 priv->child_visible = TRUE;
4009 old_parent = priv->parent;
4010 priv->parent = NULL;
4012 /* parent may no longer expand if the removed
4013 * child was expand=TRUE and could therefore
4016 if (gtk_widget_get_visible (widget) &&
4017 (priv->need_compute_expand ||
4018 priv->computed_hexpand ||
4019 priv->computed_vexpand))
4021 gtk_widget_queue_compute_expand (old_parent);
4024 /* Unset BACKDROP since we are no longer inside a toplevel window */
4025 gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_BACKDROP);
4027 gtk_style_context_set_parent (priv->context, NULL);
4029 _gtk_widget_update_parent_muxer (widget);
4031 g_signal_emit (widget, widget_signals[PARENT_SET], 0, old_parent);
4034 _gtk_widget_propagate_hierarchy_changed (widget, toplevel);
4035 g_object_unref (toplevel);
4038 /* Now that the parent pointer is nullified and the hierarchy-changed
4039 * already passed, go ahead and unset the parent window, if we are unparenting
4040 * an embeded GtkWindow the window will become toplevel again and hierarchy-changed
4041 * will fire again for the new subhierarchy.
4043 gtk_widget_set_parent_window (widget, NULL);
4045 g_object_notify (G_OBJECT (widget), "parent");
4046 g_object_thaw_notify (G_OBJECT (widget));
4048 g_object_notify_queue_clear (G_OBJECT (widget), nqueue);
4049 g_object_notify_queue_thaw (G_OBJECT (widget), nqueue);
4051 gtk_widget_propagate_alpha (widget);
4053 gtk_widget_pop_verify_invariants (widget);
4054 g_object_unref (widget);
4058 * gtk_widget_destroy:
4059 * @widget: a #GtkWidget
4061 * Destroys a widget.
4064 * destroyed, it will break any references it holds to other objects.
4065 * If the widget is inside a container, the widget will be removed
4066 * from the container. If the widget is a toplevel (derived from
4067 * #GtkWindow), it will be removed from the list of toplevels, and the
4068 * reference GTK+ holds to it will be removed. Removing a
4069 * widget from its container or the list of toplevels results in the
4070 * widget being finalized, unless you've added additional references
4071 * to the widget with g_object_ref().
4073 * In most cases, only toplevel widgets (windows) require explicit
4074 * destruction, because when you destroy a toplevel its children will
4075 * be destroyed as well.
4078 gtk_widget_destroy (GtkWidget *widget)
4080 g_return_if_fail (GTK_IS_WIDGET (widget));
4082 if (!widget->priv->in_destruction)
4083 g_object_run_dispose (G_OBJECT (widget));
4087 * gtk_widget_destroyed:
4088 * @widget: a #GtkWidget
4089 * @widget_pointer: (inout) (transfer none): address of a variable that contains @widget
4091 * This function sets *@widget_pointer to %NULL if @widget_pointer !=
4092 * %NULL. It's intended to be used as a callback connected to the
4093 * "destroy" signal of a widget. You connect gtk_widget_destroyed()
4094 * as a signal handler, and pass the address of your widget variable
4095 * as user data. Then when the widget is destroyed, the variable will
4096 * be set to %NULL. Useful for example to avoid multiple copies
4097 * of the same dialog.
4100 gtk_widget_destroyed (GtkWidget *widget,
4101 GtkWidget **widget_pointer)
4103 /* Don't make any assumptions about the
4105 * Even check widget_pointer.
4108 *widget_pointer = NULL;
4113 * @widget: a #GtkWidget
4115 * Flags a widget to be displayed. Any widget that isn't shown will
4116 * not appear on the screen. If you want to show all the widgets in a
4117 * container, it's easier to call gtk_widget_show_all() on the
4118 * container, instead of individually showing the widgets.
4120 * Remember that you have to show the containers containing a widget,
4121 * in addition to the widget itself, before it will appear onscreen.
4123 * When a toplevel container is shown, it is immediately realized and
4124 * mapped; other shown widgets are realized and mapped when their
4125 * toplevel container is realized and mapped.
4128 gtk_widget_show (GtkWidget *widget)
4130 g_return_if_fail (GTK_IS_WIDGET (widget));
4132 if (!gtk_widget_get_visible (widget))
4134 g_object_ref (widget);
4135 gtk_widget_push_verify_invariants (widget);
4137 if (!gtk_widget_is_toplevel (widget))
4138 gtk_widget_queue_resize (widget);
4140 /* see comment in set_parent() for why this should and can be
4143 if (widget->priv->need_compute_expand ||
4144 widget->priv->computed_hexpand ||
4145 widget->priv->computed_vexpand)
4147 if (widget->priv->parent != NULL)
4148 gtk_widget_queue_compute_expand (widget->priv->parent);
4151 g_signal_emit (widget, widget_signals[SHOW], 0);
4152 g_object_notify (G_OBJECT (widget), "visible");
4154 gtk_widget_pop_verify_invariants (widget);
4155 g_object_unref (widget);
4160 gtk_widget_real_show (GtkWidget *widget)
4162 GtkWidgetPrivate *priv = widget->priv;
4164 if (!gtk_widget_get_visible (widget))
4166 priv->visible = TRUE;
4169 gtk_widget_get_mapped (priv->parent) &&
4170 gtk_widget_get_child_visible (widget) &&
4171 !gtk_widget_get_mapped (widget))
4172 gtk_widget_map (widget);
4177 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
4180 g_signal_handlers_disconnect_by_func (widget,
4181 gtk_widget_show_map_callback,
4186 * gtk_widget_show_now:
4187 * @widget: a #GtkWidget
4189 * Shows a widget. If the widget is an unmapped toplevel widget
4190 * (i.e. a #GtkWindow that has not yet been shown), enter the main
4191 * loop and wait for the window to actually be mapped. Be careful;
4192 * because the main loop is running, anything can happen during
4196 gtk_widget_show_now (GtkWidget *widget)
4200 g_return_if_fail (GTK_IS_WIDGET (widget));
4202 /* make sure we will get event */
4203 if (!gtk_widget_get_mapped (widget) &&
4204 gtk_widget_is_toplevel (widget))
4206 gtk_widget_show (widget);
4208 g_signal_connect (widget, "map-event",
4209 G_CALLBACK (gtk_widget_show_map_callback),
4213 gtk_main_iteration ();
4216 gtk_widget_show (widget);
4221 * @widget: a #GtkWidget
4223 * Reverses the effects of gtk_widget_show(), causing the widget to be
4224 * hidden (invisible to the user).
4227 gtk_widget_hide (GtkWidget *widget)
4229 g_return_if_fail (GTK_IS_WIDGET (widget));
4231 if (gtk_widget_get_visible (widget))
4233 GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
4235 g_object_ref (widget);
4236 gtk_widget_push_verify_invariants (widget);
4238 if (toplevel != widget && gtk_widget_is_toplevel (toplevel))
4239 _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
4241 /* a parent may now be expand=FALSE since we're hidden. */
4242 if (widget->priv->need_compute_expand ||
4243 widget->priv->computed_hexpand ||
4244 widget->priv->computed_vexpand)
4246 gtk_widget_queue_compute_expand (widget);
4249 g_signal_emit (widget, widget_signals[HIDE], 0);
4250 if (!gtk_widget_is_toplevel (widget))
4251 gtk_widget_queue_resize (widget);
4252 g_object_notify (G_OBJECT (widget), "visible");
4254 gtk_widget_pop_verify_invariants (widget);
4255 g_object_unref (widget);
4260 gtk_widget_real_hide (GtkWidget *widget)
4262 if (gtk_widget_get_visible (widget))
4264 widget->priv->visible = FALSE;
4266 if (gtk_widget_get_mapped (widget))
4267 gtk_widget_unmap (widget);
4272 * gtk_widget_hide_on_delete:
4273 * @widget: a #GtkWidget
4275 * Utility function; intended to be connected to the #GtkWidget::delete-event
4276 * signal on a #GtkWindow. The function calls gtk_widget_hide() on its
4277 * argument, then returns %TRUE. If connected to ::delete-event, the
4278 * result is that clicking the close button for a window (on the
4279 * window frame, top right corner usually) will hide but not destroy
4280 * the window. By default, GTK+ destroys windows when ::delete-event
4283 * Return value: %TRUE
4286 gtk_widget_hide_on_delete (GtkWidget *widget)
4288 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
4290 gtk_widget_hide (widget);
4296 * gtk_widget_show_all:
4297 * @widget: a #GtkWidget
4299 * Recursively shows a widget, and any child widgets (if the widget is
4303 gtk_widget_show_all (GtkWidget *widget)
4305 GtkWidgetClass *class;
4307 g_return_if_fail (GTK_IS_WIDGET (widget));
4309 if (gtk_widget_get_no_show_all (widget))
4312 class = GTK_WIDGET_GET_CLASS (widget);
4314 if (class->show_all)
4315 class->show_all (widget);
4320 * @widget: a #GtkWidget
4322 * This function is only for use in widget implementations. Causes
4323 * a widget to be mapped if it isn't already.
4326 gtk_widget_map (GtkWidget *widget)
4328 GtkWidgetPrivate *priv;
4330 g_return_if_fail (GTK_IS_WIDGET (widget));
4331 g_return_if_fail (gtk_widget_get_visible (widget));
4332 g_return_if_fail (gtk_widget_get_child_visible (widget));
4334 priv = widget->priv;
4336 if (!gtk_widget_get_mapped (widget))
4338 gtk_widget_push_verify_invariants (widget);
4340 if (!gtk_widget_get_realized (widget))
4341 gtk_widget_realize (widget);
4343 g_signal_emit (widget, widget_signals[MAP], 0);
4345 if (!gtk_widget_get_has_window (widget))
4346 gdk_window_invalidate_rect (priv->window, &priv->allocation, FALSE);
4348 if (widget->priv->context)
4349 _gtk_style_context_update_animating (widget->priv->context);
4351 gtk_widget_pop_verify_invariants (widget);
4357 * @widget: a #GtkWidget
4359 * This function is only for use in widget implementations. Causes
4360 * a widget to be unmapped if it's currently mapped.
4363 gtk_widget_unmap (GtkWidget *widget)
4365 GtkWidgetPrivate *priv;
4367 g_return_if_fail (GTK_IS_WIDGET (widget));
4369 priv = widget->priv;
4371 if (gtk_widget_get_mapped (widget))
4373 gtk_widget_push_verify_invariants (widget);
4375 if (!gtk_widget_get_has_window (widget))
4376 gdk_window_invalidate_rect (priv->window, &priv->allocation, FALSE);
4377 _gtk_tooltip_hide (widget);
4379 if (widget->priv->context)
4380 _gtk_style_context_update_animating (widget->priv->context);
4382 g_signal_emit (widget, widget_signals[UNMAP], 0);
4384 gtk_widget_pop_verify_invariants (widget);
4386 /* Unset pointer/window info */
4387 g_object_set_qdata (G_OBJECT (widget), quark_pointer_window, NULL);
4392 _gtk_widget_enable_device_events (GtkWidget *widget)
4394 GHashTable *device_events;
4395 GHashTableIter iter;
4396 gpointer key, value;
4398 device_events = g_object_get_qdata (G_OBJECT (widget), quark_device_event_mask);
4403 g_hash_table_iter_init (&iter, device_events);
4405 while (g_hash_table_iter_next (&iter, &key, &value))
4408 GdkEventMask event_mask;
4411 event_mask = GPOINTER_TO_UINT (value);
4412 gtk_widget_add_events_internal (widget, device, event_mask);
4417 get_widget_windows (GtkWidget *widget)
4419 GList *window_list, *last, *l, *children, *ret;
4421 if (gtk_widget_get_has_window (widget))
4422 window_list = g_list_prepend (NULL, gtk_widget_get_window (widget));
4424 window_list = gdk_window_peek_children (gtk_widget_get_window (widget));
4426 last = g_list_last (window_list);
4429 for (l = window_list; l; l = l->next)
4431 GtkWidget *window_widget = NULL;
4433 gdk_window_get_user_data (l->data, (gpointer *) &window_widget);
4435 if (widget != window_widget)
4438 ret = g_list_prepend (ret, l->data);
4439 children = gdk_window_peek_children (GDK_WINDOW (l->data));
4443 last = g_list_concat (last, children);
4444 last = g_list_last (last);
4448 g_list_free (window_list);
4454 device_enable_foreach (GtkWidget *widget,
4457 GdkDevice *device = user_data;
4458 gtk_widget_set_device_enabled_internal (widget, device, TRUE, TRUE);
4462 device_disable_foreach (GtkWidget *widget,
4465 GdkDevice *device = user_data;
4466 gtk_widget_set_device_enabled_internal (widget, device, TRUE, FALSE);
4470 gtk_widget_set_device_enabled_internal (GtkWidget *widget,
4475 GList *window_list, *l;
4477 window_list = get_widget_windows (widget);
4479 for (l = window_list; l; l = l->next)
4481 GdkEventMask events = 0;
4487 events = gdk_window_get_events (window);
4489 gdk_window_set_device_events (window, device, events);
4492 if (recurse && GTK_IS_CONTAINER (widget))
4495 gtk_container_forall (GTK_CONTAINER (widget), device_enable_foreach, device);
4497 gtk_container_forall (GTK_CONTAINER (widget), device_disable_foreach, device);
4500 g_list_free (window_list);
4504 gtk_widget_update_devices_mask (GtkWidget *widget,
4507 GList *enabled_devices, *l;
4509 enabled_devices = g_object_get_qdata (G_OBJECT (widget), quark_enabled_devices);
4511 for (l = enabled_devices; l; l = l->next)
4512 gtk_widget_set_device_enabled_internal (widget, GDK_DEVICE (l->data), recurse, TRUE);
4515 typedef struct _GtkTickCallbackInfo GtkTickCallbackInfo;
4517 struct _GtkTickCallbackInfo
4522 GtkTickCallback callback;
4524 GDestroyNotify notify;
4526 guint destroyed : 1;
4530 ref_tick_callback_info (GtkTickCallbackInfo *info)
4536 unref_tick_callback_info (GtkWidget *widget,
4537 GtkTickCallbackInfo *info,
4540 GtkWidgetPrivate *priv = widget->priv;
4543 if (info->refcount == 0)
4545 priv->tick_callbacks = g_list_delete_link (priv->tick_callbacks, link);
4547 info->notify (info->user_data);
4548 g_slice_free (GtkTickCallbackInfo, info);
4551 if (priv->tick_callbacks == NULL && priv->realized)
4553 GdkFrameClock *frame_clock = gtk_widget_get_frame_clock (widget);
4554 g_signal_handlers_disconnect_by_func (frame_clock,
4555 (gpointer) gtk_widget_on_frame_clock_update,
4557 gdk_frame_clock_end_updating (frame_clock);
4562 destroy_tick_callback_info (GtkWidget *widget,
4563 GtkTickCallbackInfo *info,
4566 if (!info->destroyed)
4568 info->destroyed = TRUE;
4569 unref_tick_callback_info (widget, info, link);
4574 gtk_widget_on_frame_clock_update (GdkFrameClock *frame_clock,
4577 GtkWidgetPrivate *priv = widget->priv;
4580 for (l = priv->tick_callbacks; l;)
4582 GtkTickCallbackInfo *info = l->data;
4585 ref_tick_callback_info (info);
4586 if (!info->destroyed)
4588 if (info->callback (widget,
4590 info->user_data) == G_SOURCE_REMOVE)
4592 destroy_tick_callback_info (widget, info, l);
4597 unref_tick_callback_info (widget, info, l);
4602 static guint tick_callback_id;
4605 * gtk_widget_add_tick_callback:
4606 * @widget: a #GtkWidget
4607 * @callback: function to call for updating animations
4608 * @user_data: data to pass to @callback
4609 * @notify: function to call to free @user_data when the callback is removed.
4611 * Queues a animation frame update and adds a callback to be called
4612 * before each frame. Until the tick callback is removed, it will be
4613 * called frequently (usually at the frame rate of the output device
4614 * or as quickly as the application an be repainted, whichever is
4615 * slower). For this reason, is most suitable for handling graphics
4616 * that change every frame or every few frames. The tick callback does
4617 * not automatically imply a relayout or repaint. If you want a
4618 * repaint or relayout, and aren't changing widget properties that
4619 * would trigger that (for example, changing the text of a #GtkLabel),
4620 * then you will have to call gtk_widget_queue_resize() or
4621 * gtk_widget_queue_draw_area() yourself.
4623 * gdk_frame_clock_get_frame_time() should generally be used for timing
4624 * continuous animations and
4625 * gdk_frame_timings_get_predicted_presentation_time() if you are
4626 * trying to display isolated frames particular times.
4628 * This is a more convenient alternative to connecting directly to the
4629 * ::update signal of GdkFrameClock, since you don't have to worry about
4630 * when a #GdkFrameClock is assigned to a widget.
4633 gtk_widget_add_tick_callback (GtkWidget *widget,
4634 GtkTickCallback callback,
4636 GDestroyNotify notify)
4638 GtkWidgetPrivate *priv;
4639 GtkTickCallbackInfo *info;
4641 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
4643 priv = widget->priv;
4645 if (priv->tick_callbacks == NULL && priv->realized)
4647 GdkFrameClock *frame_clock = gtk_widget_get_frame_clock (widget);
4648 g_signal_connect (frame_clock, "update",
4649 G_CALLBACK (gtk_widget_on_frame_clock_update),
4651 gdk_frame_clock_begin_updating (frame_clock);
4654 info = g_slice_new0 (GtkTickCallbackInfo);
4657 info->id = ++tick_callback_id;
4658 info->callback = callback;
4659 info->user_data = user_data;
4660 info->notify = notify;
4662 priv->tick_callbacks = g_list_prepend (priv->tick_callbacks,
4669 gtk_widget_remove_tick_callback (GtkWidget *widget,
4672 GtkWidgetPrivate *priv;
4675 g_return_if_fail (GTK_IS_WIDGET (widget));
4677 priv = widget->priv;
4679 for (l = priv->tick_callbacks; l; l = l->next)
4681 GtkTickCallbackInfo *info = l->data;
4683 destroy_tick_callback_info (widget, info, l);
4688 gtk_widget_connect_frame_clock (GtkWidget *widget,
4689 GdkFrameClock *frame_clock)
4691 GtkWidgetPrivate *priv = widget->priv;
4693 if (GTK_IS_CONTAINER (widget))
4694 _gtk_container_maybe_start_idle_sizer (GTK_CONTAINER (widget));
4696 if (priv->tick_callbacks != NULL)
4698 g_signal_connect (frame_clock, "update",
4699 G_CALLBACK (gtk_widget_on_frame_clock_update),
4701 gdk_frame_clock_begin_updating (frame_clock);
4705 gtk_style_context_set_frame_clock (priv->context, frame_clock);
4709 gtk_widget_disconnect_frame_clock (GtkWidget *widget,
4710 GdkFrameClock *frame_clock)
4712 GtkWidgetPrivate *priv = widget->priv;
4714 if (GTK_IS_CONTAINER (widget))
4715 _gtk_container_stop_idle_sizer (GTK_CONTAINER (widget));
4717 if (priv->tick_callbacks)
4719 g_signal_handlers_disconnect_by_func (frame_clock,
4720 (gpointer) gtk_widget_on_frame_clock_update,
4722 gdk_frame_clock_end_updating (frame_clock);
4726 gtk_style_context_set_frame_clock (priv->context, NULL);
4730 * gtk_widget_realize:
4731 * @widget: a #GtkWidget
4733 * Creates the GDK (windowing system) resources associated with a
4734 * widget. For example, @widget->window will be created when a widget
4735 * is realized. Normally realization happens implicitly; if you show
4736 * a widget and all its parent containers, then the widget will be
4737 * realized and mapped automatically.
4739 * Realizing a widget requires all
4740 * the widget's parent widgets to be realized; calling
4741 * gtk_widget_realize() realizes the widget's parents in addition to
4742 * @widget itself. If a widget is not yet inside a toplevel window
4743 * when you realize it, bad things will happen.
4745 * This function is primarily used in widget implementations, and
4746 * isn't very useful otherwise. Many times when you think you might
4747 * need it, a better approach is to connect to a signal that will be
4748 * called after the widget is realized automatically, such as
4749 * #GtkWidget::draw. Or simply g_signal_connect () to the
4750 * #GtkWidget::realize signal.
4753 gtk_widget_realize (GtkWidget *widget)
4755 GtkWidgetPrivate *priv;
4756 cairo_region_t *region;
4758 g_return_if_fail (GTK_IS_WIDGET (widget));
4759 g_return_if_fail (widget->priv->anchored ||
4760 GTK_IS_INVISIBLE (widget));
4762 priv = widget->priv;
4764 if (!gtk_widget_get_realized (widget))
4766 gtk_widget_push_verify_invariants (widget);
4769 if (GTK_IS_CONTAINER (widget) && gtk_widget_get_has_window (widget))
4770 g_message ("gtk_widget_realize(%s)", G_OBJECT_TYPE_NAME (widget));
4773 if (priv->parent == NULL &&
4774 !gtk_widget_is_toplevel (widget))
4775 g_warning ("Calling gtk_widget_realize() on a widget that isn't "
4776 "inside a toplevel window is not going to work very well. "
4777 "Widgets must be inside a toplevel container before realizing them.");
4779 if (priv->parent && !gtk_widget_get_realized (priv->parent))
4780 gtk_widget_realize (priv->parent);
4782 gtk_widget_ensure_style (widget);
4784 if (priv->style_update_pending)
4785 g_signal_emit (widget, widget_signals[STYLE_UPDATED], 0);
4787 g_signal_emit (widget, widget_signals[REALIZE], 0);
4789 gtk_widget_real_set_has_tooltip (widget,
4790 GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (widget), quark_has_tooltip)),
4793 if (priv->has_shape_mask)
4795 region = g_object_get_qdata (G_OBJECT (widget), quark_shape_info);
4796 gdk_window_shape_combine_region (priv->window, region, 0, 0);
4799 region = g_object_get_qdata (G_OBJECT (widget), quark_input_shape_info);
4801 gdk_window_input_shape_combine_region (priv->window, region, 0, 0);
4803 if (priv->multidevice)
4804 gdk_window_set_support_multidevice (priv->window, TRUE);
4806 _gtk_widget_enable_device_events (widget);
4807 gtk_widget_update_devices_mask (widget, TRUE);
4809 gtk_widget_connect_frame_clock (widget,
4810 gtk_widget_get_frame_clock (widget));
4812 gtk_widget_pop_verify_invariants (widget);
4817 * gtk_widget_unrealize:
4818 * @widget: a #GtkWidget
4820 * This function is only useful in widget implementations.
4821 * Causes a widget to be unrealized (frees all GDK resources
4822 * associated with the widget, such as @widget->window).
4825 gtk_widget_unrealize (GtkWidget *widget)
4827 g_return_if_fail (GTK_IS_WIDGET (widget));
4829 gtk_widget_push_verify_invariants (widget);
4831 if (widget->priv->has_shape_mask)
4832 gtk_widget_shape_combine_region (widget, NULL);
4834 if (g_object_get_qdata (G_OBJECT (widget), quark_input_shape_info))
4835 gtk_widget_input_shape_combine_region (widget, NULL);
4837 if (gtk_widget_get_realized (widget))
4839 g_object_ref (widget);
4841 if (widget->priv->mapped)
4842 gtk_widget_unmap (widget);
4844 gtk_widget_disconnect_frame_clock (widget,
4845 gtk_widget_get_frame_clock (widget));
4847 g_signal_emit (widget, widget_signals[UNREALIZE], 0);
4848 g_assert (!widget->priv->mapped);
4849 gtk_widget_set_realized (widget, FALSE);
4851 g_object_unref (widget);
4854 gtk_widget_pop_verify_invariants (widget);
4857 /*****************************************
4859 *****************************************/
4862 * gtk_widget_queue_draw_region:
4863 * @widget: a #GtkWidget
4864 * @region: region to draw
4866 * Invalidates the rectangular area of @widget defined by @region by
4867 * calling gdk_window_invalidate_region() on the widget's window and
4868 * all its child windows. Once the main loop becomes idle (after the
4869 * current batch of events has been processed, roughly), the window
4870 * will receive expose events for the union of all regions that have
4873 * Normally you would only use this function in widget
4874 * implementations. You might also use it to schedule a redraw of a
4875 * #GtkDrawingArea or some portion thereof.
4880 gtk_widget_queue_draw_region (GtkWidget *widget,
4881 const cairo_region_t *region)
4883 GtkWidgetPrivate *priv;
4886 g_return_if_fail (GTK_IS_WIDGET (widget));
4888 priv = widget->priv;
4890 if (!gtk_widget_get_realized (widget))
4893 /* Just return if the widget or one of its ancestors isn't mapped */
4894 for (w = widget; w != NULL; w = w->priv->parent)
4895 if (!gtk_widget_get_mapped (w))
4898 gdk_window_invalidate_region (priv->window, region, TRUE);
4902 * gtk_widget_queue_draw_area:
4903 * @widget: a #GtkWidget
4904 * @x: x coordinate of upper-left corner of rectangle to redraw
4905 * @y: y coordinate of upper-left corner of rectangle to redraw
4906 * @width: width of region to draw
4907 * @height: height of region to draw
4909 * Convenience function that calls gtk_widget_queue_draw_region() on
4910 * the region created from the given coordinates.
4912 * The region here is specified in widget coordinates.
4913 * Widget coordinates are a bit odd; for historical reasons, they are
4914 * defined as @widget->window coordinates for widgets that are not
4915 * #GTK_NO_WINDOW widgets, and are relative to @widget->allocation.x,
4916 * @widget->allocation.y for widgets that are #GTK_NO_WINDOW widgets.
4919 gtk_widget_queue_draw_area (GtkWidget *widget,
4926 cairo_region_t *region;
4928 g_return_if_fail (GTK_IS_WIDGET (widget));
4933 rect.height = height;
4935 region = cairo_region_create_rectangle (&rect);
4936 gtk_widget_queue_draw_region (widget, region);
4937 cairo_region_destroy (region);
4941 * gtk_widget_queue_draw:
4942 * @widget: a #GtkWidget
4944 * Equivalent to calling gtk_widget_queue_draw_area() for the
4945 * entire area of a widget.
4948 gtk_widget_queue_draw (GtkWidget *widget)
4952 g_return_if_fail (GTK_IS_WIDGET (widget));
4954 gtk_widget_get_allocation (widget, &rect);
4956 if (!gtk_widget_get_has_window (widget))
4957 gtk_widget_queue_draw_area (widget,
4958 rect.x, rect.y, rect.width, rect.height);
4960 gtk_widget_queue_draw_area (widget,
4961 0, 0, rect.width, rect.height);
4965 * gtk_widget_queue_resize:
4966 * @widget: a #GtkWidget
4968 * This function is only for use in widget implementations.
4969 * Flags a widget to have its size renegotiated; should
4970 * be called when a widget for some reason has a new size request.
4971 * For example, when you change the text in a #GtkLabel, #GtkLabel
4972 * queues a resize to ensure there's enough space for the new text.
4974 * <note><para>You cannot call gtk_widget_queue_resize() on a widget
4975 * from inside its implementation of the GtkWidgetClass::size_allocate
4976 * virtual method. Calls to gtk_widget_queue_resize() from inside
4977 * GtkWidgetClass::size_allocate will be silently ignored.</para></note>
4980 gtk_widget_queue_resize (GtkWidget *widget)
4982 g_return_if_fail (GTK_IS_WIDGET (widget));
4984 if (gtk_widget_get_realized (widget))
4985 gtk_widget_queue_draw (widget);
4987 _gtk_size_group_queue_resize (widget, 0);
4991 * gtk_widget_queue_resize_no_redraw:
4992 * @widget: a #GtkWidget
4994 * This function works like gtk_widget_queue_resize(),
4995 * except that the widget is not invalidated.
5000 gtk_widget_queue_resize_no_redraw (GtkWidget *widget)
5002 g_return_if_fail (GTK_IS_WIDGET (widget));
5004 _gtk_size_group_queue_resize (widget, 0);
5008 * gtk_widget_get_frame_clock:
5009 * @widget: a #GtkWidget
5011 * Obtains the frame clock for a widget. The frame clock is a global
5012 * "ticker" that can be used to drive animations and repaints. The
5013 * most common reason to get the frame clock is to call
5014 * gdk_frame_clock_get_frame_time(), in order to get a time to use for
5015 * animating. For example you might record the start of the animation
5016 * with an initial value from gdk_frame_clock_get_frame_time(), and
5017 * then update the animation by calling
5018 * gdk_frame_clock_get_frame_time() again during each repaint.
5020 * gdk_frame_clock_request_phase() will result in a new frame on the
5021 * clock, but won't necessarily repaint any widgets. To repaint a
5022 * widget, you have to use gtk_widget_queue_draw() which invalidates
5023 * the widget (thus scheduling it to receive a draw on the next
5024 * frame). gtk_widget_queue_draw() will also end up requesting a frame
5025 * on the appropriate frame clock.
5027 * A widget's frame clock will not change while the widget is
5028 * mapped. Reparenting a widget (which implies a temporary unmap) can
5029 * change the widget's frame clock.
5031 * Unrealized widgets do not have a frame clock.
5034 * Return value: (transfer none): a #GdkFrameClock (or #NULL if widget is unrealized)
5037 gtk_widget_get_frame_clock (GtkWidget *widget)
5039 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
5041 if (widget->priv->realized)
5043 /* We use gtk_widget_get_toplevel() here to make it explicit that
5044 * the frame clock is a property of the toplevel that a widget
5045 * is anchored to; gdk_window_get_toplevel() will go up the
5046 * hierarchy anyways, but should squash any funny business with
5047 * reparenting windows and widgets.
5049 GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
5050 GdkWindow *window = gtk_widget_get_window (toplevel);
5051 g_assert (window != NULL);
5053 return gdk_window_get_frame_clock (window);
5062 * gtk_widget_size_request:
5063 * @widget: a #GtkWidget
5064 * @requisition: (out): a #GtkRequisition to be filled in
5066 * This function is typically used when implementing a #GtkContainer
5067 * subclass. Obtains the preferred size of a widget. The container
5068 * uses this information to arrange its child widgets and decide what
5069 * size allocations to give them with gtk_widget_size_allocate().
5071 * You can also call this function from an application, with some
5072 * caveats. Most notably, getting a size request requires the widget
5073 * to be associated with a screen, because font information may be
5074 * needed. Multihead-aware applications should keep this in mind.
5076 * Also remember that the size request is not necessarily the size
5077 * a widget will actually be allocated.
5079 * Deprecated: 3.0: Use gtk_widget_get_preferred_size() instead.
5082 gtk_widget_size_request (GtkWidget *widget,
5083 GtkRequisition *requisition)
5085 g_return_if_fail (GTK_IS_WIDGET (widget));
5087 gtk_widget_get_preferred_size (widget, requisition, NULL);
5091 * gtk_widget_get_child_requisition:
5092 * @widget: a #GtkWidget
5093 * @requisition: (out): a #GtkRequisition to be filled in
5095 * This function is only for use in widget implementations. Obtains
5096 * @widget->requisition, unless someone has forced a particular
5097 * geometry on the widget (e.g. with gtk_widget_set_size_request()),
5098 * in which case it returns that geometry instead of the widget's
5101 * This function differs from gtk_widget_size_request() in that
5102 * it retrieves the last size request value from @widget->requisition,
5103 * while gtk_widget_size_request() actually calls the "size_request" method
5104 * on @widget to compute the size request and fill in @widget->requisition,
5105 * and only then returns @widget->requisition.
5107 * Because this function does not call the "size_request" method, it
5108 * can only be used when you know that @widget->requisition is
5109 * up-to-date, that is, gtk_widget_size_request() has been called
5110 * since the last time a resize was queued. In general, only container
5111 * implementations have this information; applications should use
5112 * gtk_widget_size_request().
5115 * Deprecated: 3.0: Use gtk_widget_get_preferred_size() instead.
5118 gtk_widget_get_child_requisition (GtkWidget *widget,
5119 GtkRequisition *requisition)
5121 gtk_widget_get_preferred_size (widget, requisition, NULL);
5125 invalidate_predicate (GdkWindow *window,
5130 gdk_window_get_user_data (window, &user_data);
5132 return (user_data == data);
5135 /* Invalidate @region in widget->window and all children
5136 * of widget->window owned by widget. @region is in the
5137 * same coordinates as widget->allocation and will be
5138 * modified by this call.
5141 gtk_widget_invalidate_widget_windows (GtkWidget *widget,
5142 cairo_region_t *region)
5144 GtkWidgetPrivate *priv = widget->priv;
5146 if (!gtk_widget_get_realized (widget))
5149 if (gtk_widget_get_has_window (widget) && priv->parent)
5153 gdk_window_get_position (priv->window, &x, &y);
5154 cairo_region_translate (region, -x, -y);
5157 gdk_window_invalidate_maybe_recurse (priv->window, region,
5158 invalidate_predicate, widget);
5162 * gtk_widget_size_allocate:
5163 * @widget: a #GtkWidget
5164 * @allocation: position and size to be allocated to @widget
5166 * This function is only used by #GtkContainer subclasses, to assign a size
5167 * and position to their child widgets.
5169 * In this function, the allocation may be adjusted. It will be forced
5170 * to a 1x1 minimum size, and the adjust_size_allocation virtual
5171 * method on the child will be used to adjust the allocation. Standard
5172 * adjustments include removing the widget's margins, and applying the
5173 * widget's #GtkWidget:halign and #GtkWidget:valign properties.
5176 gtk_widget_size_allocate (GtkWidget *widget,
5177 GtkAllocation *allocation)
5179 GtkWidgetPrivate *priv;
5180 GdkRectangle real_allocation;
5181 GdkRectangle old_allocation;
5182 GdkRectangle adjusted_allocation;
5183 gboolean alloc_needed;
5184 gboolean size_changed;
5185 gboolean position_changed;
5186 gint natural_width, natural_height, dummy;
5187 gint min_width, min_height;
5189 priv = widget->priv;
5191 g_return_if_fail (GTK_IS_WIDGET (widget));
5193 if (!priv->visible && !gtk_widget_is_toplevel (widget))
5196 gtk_widget_push_verify_invariants (widget);
5198 #ifdef G_ENABLE_DEBUG
5199 if (gtk_get_debug_flags () & GTK_DEBUG_GEOMETRY)
5210 parent = gtk_widget_get_parent (parent);
5213 name = g_type_name (G_OBJECT_TYPE (G_OBJECT (widget)));
5214 g_print ("gtk_widget_size_allocate: %*s%s %d %d\n",
5215 2 * depth, " ", name,
5216 allocation->width, allocation->height);
5218 #endif /* G_ENABLE_DEBUG */
5220 alloc_needed = priv->alloc_needed;
5221 /* Preserve request/allocate ordering */
5222 priv->alloc_needed = FALSE;
5224 old_allocation = priv->allocation;
5225 real_allocation = *allocation;
5227 adjusted_allocation = real_allocation;
5228 if (gtk_widget_get_request_mode (widget) == GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH)
5230 /* Go ahead and request the height for allocated width, note that the internals
5231 * of get_height_for_width will internally limit the for_size to natural size
5232 * when aligning implicitly.
5234 gtk_widget_get_preferred_width (widget, &min_width, &natural_width);
5235 gtk_widget_get_preferred_height_for_width (widget, real_allocation.width, &min_height, &natural_height);
5239 /* Go ahead and request the width for allocated height, note that the internals
5240 * of get_width_for_height will internally limit the for_size to natural size
5241 * when aligning implicitly.
5243 gtk_widget_get_preferred_height (widget, &min_height, &natural_height);
5244 gtk_widget_get_preferred_width_for_height (widget, real_allocation.height, &min_width, &natural_width);
5247 #ifdef G_ENABLE_DEBUG
5248 if (gtk_get_debug_flags () & GTK_DEBUG_GEOMETRY)
5250 if ((min_width > real_allocation.width || min_height > real_allocation.height) &&
5251 !GTK_IS_SCROLLABLE (widget))
5252 g_warning ("gtk_widget_size_allocate(): attempt to underallocate %s%s %s %p. "
5253 "Allocation is %dx%d, but minimum required size is %dx%d.",
5254 priv->parent ? G_OBJECT_TYPE_NAME (priv->parent) : "", priv->parent ? "'s child" : "toplevel",
5255 G_OBJECT_TYPE_NAME (widget), widget,
5256 real_allocation.width, real_allocation.height,
5257 min_width, min_height);
5260 /* Now that we have the right natural height and width, go ahead and remove any margins from the
5261 * allocated sizes and possibly limit them to the natural sizes */
5262 GTK_WIDGET_GET_CLASS (widget)->adjust_size_allocation (widget,
5263 GTK_ORIENTATION_HORIZONTAL,
5266 &adjusted_allocation.x,
5267 &adjusted_allocation.width);
5268 GTK_WIDGET_GET_CLASS (widget)->adjust_size_allocation (widget,
5269 GTK_ORIENTATION_VERTICAL,
5272 &adjusted_allocation.y,
5273 &adjusted_allocation.height);
5275 if (adjusted_allocation.x < real_allocation.x ||
5276 adjusted_allocation.y < real_allocation.y ||
5277 (adjusted_allocation.x + adjusted_allocation.width) >
5278 (real_allocation.x + real_allocation.width) ||
5279 (adjusted_allocation.y + adjusted_allocation.height >
5280 real_allocation.y + real_allocation.height))
5282 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",
5283 G_OBJECT_TYPE_NAME (widget), widget,
5284 real_allocation.x, real_allocation.y, real_allocation.width, real_allocation.height,
5285 adjusted_allocation.x, adjusted_allocation.y, adjusted_allocation.width, adjusted_allocation.height);
5286 adjusted_allocation = real_allocation; /* veto it */
5290 real_allocation = adjusted_allocation;
5293 if (real_allocation.width < 0 || real_allocation.height < 0)
5295 g_warning ("gtk_widget_size_allocate(): attempt to allocate widget with width %d and height %d",
5296 real_allocation.width,
5297 real_allocation.height);
5300 real_allocation.width = MAX (real_allocation.width, 1);
5301 real_allocation.height = MAX (real_allocation.height, 1);
5303 size_changed = (old_allocation.width != real_allocation.width ||
5304 old_allocation.height != real_allocation.height);
5305 position_changed = (old_allocation.x != real_allocation.x ||
5306 old_allocation.y != real_allocation.y);
5308 if (!alloc_needed && !size_changed && !position_changed)
5311 g_signal_emit (widget, widget_signals[SIZE_ALLOCATE], 0, &real_allocation);
5313 /* Size allocation is god... after consulting god, no further requests or allocations are needed */
5314 priv->alloc_needed = FALSE;
5316 if (gtk_widget_get_mapped (widget))
5318 if (!gtk_widget_get_has_window (widget) && priv->redraw_on_alloc && position_changed)
5320 /* Invalidate union(old_allaction,priv->allocation) in priv->window
5322 cairo_region_t *invalidate = cairo_region_create_rectangle (&priv->allocation);
5323 cairo_region_union_rectangle (invalidate, &old_allocation);
5325 gdk_window_invalidate_region (priv->window, invalidate, FALSE);
5326 cairo_region_destroy (invalidate);
5331 if (priv->redraw_on_alloc)
5333 /* Invalidate union(old_allaction,priv->allocation) in priv->window and descendents owned by widget
5335 cairo_region_t *invalidate = cairo_region_create_rectangle (&priv->allocation);
5336 cairo_region_union_rectangle (invalidate, &old_allocation);
5338 gtk_widget_invalidate_widget_windows (widget, invalidate);
5339 cairo_region_destroy (invalidate);
5344 if ((size_changed || position_changed) && priv->parent &&
5345 gtk_widget_get_realized (priv->parent) && _gtk_container_get_reallocate_redraws (GTK_CONTAINER (priv->parent)))
5347 cairo_region_t *invalidate = cairo_region_create_rectangle (&priv->parent->priv->allocation);
5348 gtk_widget_invalidate_widget_windows (priv->parent, invalidate);
5349 cairo_region_destroy (invalidate);
5353 gtk_widget_pop_verify_invariants (widget);
5357 * gtk_widget_common_ancestor:
5358 * @widget_a: a #GtkWidget
5359 * @widget_b: a #GtkWidget
5361 * Find the common ancestor of @widget_a and @widget_b that
5362 * is closest to the two widgets.
5364 * Return value: the closest common ancestor of @widget_a and
5365 * @widget_b or %NULL if @widget_a and @widget_b do not
5366 * share a common ancestor.
5369 gtk_widget_common_ancestor (GtkWidget *widget_a,
5370 GtkWidget *widget_b)
5372 GtkWidget *parent_a;
5373 GtkWidget *parent_b;
5377 parent_a = widget_a;
5378 while (parent_a->priv->parent)
5380 parent_a = parent_a->priv->parent;
5384 parent_b = widget_b;
5385 while (parent_b->priv->parent)
5387 parent_b = parent_b->priv->parent;
5391 if (parent_a != parent_b)
5394 while (depth_a > depth_b)
5396 widget_a = widget_a->priv->parent;
5400 while (depth_b > depth_a)
5402 widget_b = widget_b->priv->parent;
5406 while (widget_a != widget_b)
5408 widget_a = widget_a->priv->parent;
5409 widget_b = widget_b->priv->parent;
5416 * gtk_widget_translate_coordinates:
5417 * @src_widget: a #GtkWidget
5418 * @dest_widget: a #GtkWidget
5419 * @src_x: X position relative to @src_widget
5420 * @src_y: Y position relative to @src_widget
5421 * @dest_x: (out): location to store X position relative to @dest_widget
5422 * @dest_y: (out): location to store Y position relative to @dest_widget
5424 * Translate coordinates relative to @src_widget's allocation to coordinates
5425 * relative to @dest_widget's allocations. In order to perform this
5426 * operation, both widgets must be realized, and must share a common
5429 * Return value: %FALSE if either widget was not realized, or there
5430 * was no common ancestor. In this case, nothing is stored in
5431 * *@dest_x and *@dest_y. Otherwise %TRUE.
5434 gtk_widget_translate_coordinates (GtkWidget *src_widget,
5435 GtkWidget *dest_widget,
5441 GtkWidgetPrivate *src_priv = src_widget->priv;
5442 GtkWidgetPrivate *dest_priv = dest_widget->priv;
5443 GtkWidget *ancestor;
5445 GList *dest_list = NULL;
5447 g_return_val_if_fail (GTK_IS_WIDGET (src_widget), FALSE);
5448 g_return_val_if_fail (GTK_IS_WIDGET (dest_widget), FALSE);
5450 ancestor = gtk_widget_common_ancestor (src_widget, dest_widget);
5451 if (!ancestor || !gtk_widget_get_realized (src_widget) || !gtk_widget_get_realized (dest_widget))
5454 /* Translate from allocation relative to window relative */
5455 if (gtk_widget_get_has_window (src_widget) && src_priv->parent)
5458 gdk_window_get_position (src_priv->window, &wx, &wy);
5460 src_x -= wx - src_priv->allocation.x;
5461 src_y -= wy - src_priv->allocation.y;
5465 src_x += src_priv->allocation.x;
5466 src_y += src_priv->allocation.y;
5469 /* Translate to the common ancestor */
5470 window = src_priv->window;
5471 while (window != ancestor->priv->window)
5475 gdk_window_coords_to_parent (window, src_x, src_y, &dx, &dy);
5480 window = gdk_window_get_effective_parent (window);
5482 if (!window) /* Handle GtkHandleBox */
5487 window = dest_priv->window;
5488 while (window != ancestor->priv->window)
5490 dest_list = g_list_prepend (dest_list, window);
5492 window = gdk_window_get_effective_parent (window);
5494 if (!window) /* Handle GtkHandleBox */
5496 g_list_free (dest_list);
5505 gdk_window_coords_from_parent (dest_list->data, src_x, src_y, &dx, &dy);
5510 dest_list = g_list_remove (dest_list, dest_list->data);
5513 /* Translate from window relative to allocation relative */
5514 if (gtk_widget_get_has_window (dest_widget) && dest_priv->parent)
5517 gdk_window_get_position (dest_priv->window, &wx, &wy);
5519 src_x += wx - dest_priv->allocation.x;
5520 src_y += wy - dest_priv->allocation.y;
5524 src_x -= dest_priv->allocation.x;
5525 src_y -= dest_priv->allocation.y;
5537 gtk_widget_real_size_allocate (GtkWidget *widget,
5538 GtkAllocation *allocation)
5540 GtkWidgetPrivate *priv = widget->priv;
5542 priv->allocation = *allocation;
5544 if (gtk_widget_get_realized (widget) &&
5545 gtk_widget_get_has_window (widget))
5547 gdk_window_move_resize (priv->window,
5548 allocation->x, allocation->y,
5549 allocation->width, allocation->height);
5553 /* translate initial/final into start/end */
5555 effective_align (GtkAlign align,
5556 GtkTextDirection direction)
5560 case GTK_ALIGN_START:
5561 return direction == GTK_TEXT_DIR_RTL ? GTK_ALIGN_END : GTK_ALIGN_START;
5563 return direction == GTK_TEXT_DIR_RTL ? GTK_ALIGN_START : GTK_ALIGN_END;
5570 adjust_for_align (GtkAlign align,
5572 gint *allocated_pos,
5573 gint *allocated_size)
5577 case GTK_ALIGN_FILL:
5578 /* change nothing */
5580 case GTK_ALIGN_START:
5581 /* keep *allocated_pos where it is */
5582 *allocated_size = MIN (*allocated_size, *natural_size);
5585 if (*allocated_size > *natural_size)
5587 *allocated_pos += (*allocated_size - *natural_size);
5588 *allocated_size = *natural_size;
5591 case GTK_ALIGN_CENTER:
5592 if (*allocated_size > *natural_size)
5594 *allocated_pos += (*allocated_size - *natural_size) / 2;
5595 *allocated_size = MIN (*allocated_size, *natural_size);
5602 adjust_for_margin(gint start_margin,
5606 gint *allocated_pos,
5607 gint *allocated_size)
5609 *minimum_size -= (start_margin + end_margin);
5610 *natural_size -= (start_margin + end_margin);
5611 *allocated_pos += start_margin;
5612 *allocated_size -= (start_margin + end_margin);
5616 gtk_widget_real_adjust_size_allocation (GtkWidget *widget,
5617 GtkOrientation orientation,
5620 gint *allocated_pos,
5621 gint *allocated_size)
5623 const GtkWidgetAuxInfo *aux_info;
5625 aux_info = _gtk_widget_get_aux_info_or_defaults (widget);
5627 if (orientation == GTK_ORIENTATION_HORIZONTAL)
5629 adjust_for_margin (aux_info->margin.left,
5630 aux_info->margin.right,
5631 minimum_size, natural_size,
5632 allocated_pos, allocated_size);
5633 adjust_for_align (effective_align (aux_info->halign, gtk_widget_get_direction (widget)),
5634 natural_size, allocated_pos, allocated_size);
5638 adjust_for_margin (aux_info->margin.top,
5639 aux_info->margin.bottom,
5640 minimum_size, natural_size,
5641 allocated_pos, allocated_size);
5642 adjust_for_align (effective_align (aux_info->valign, GTK_TEXT_DIR_NONE),
5643 natural_size, allocated_pos, allocated_size);
5648 gtk_widget_real_can_activate_accel (GtkWidget *widget,
5651 GtkWidgetPrivate *priv = widget->priv;
5653 /* widgets must be onscreen for accels to take effect */
5654 return gtk_widget_is_sensitive (widget) &&
5655 gtk_widget_is_drawable (widget) &&
5656 gdk_window_is_viewable (priv->window);
5660 * gtk_widget_can_activate_accel:
5661 * @widget: a #GtkWidget
5662 * @signal_id: the ID of a signal installed on @widget
5664 * Determines whether an accelerator that activates the signal
5665 * identified by @signal_id can currently be activated.
5666 * This is done by emitting the #GtkWidget::can-activate-accel
5667 * signal on @widget; if the signal isn't overridden by a
5668 * handler or in a derived widget, then the default check is
5669 * that the widget must be sensitive, and the widget and all
5670 * its ancestors mapped.
5672 * Return value: %TRUE if the accelerator can be activated.
5677 gtk_widget_can_activate_accel (GtkWidget *widget,
5680 gboolean can_activate = FALSE;
5681 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
5682 g_signal_emit (widget, widget_signals[CAN_ACTIVATE_ACCEL], 0, signal_id, &can_activate);
5683 return can_activate;
5692 closure_accel_activate (GClosure *closure,
5693 GValue *return_value,
5694 guint n_param_values,
5695 const GValue *param_values,
5696 gpointer invocation_hint,
5697 gpointer marshal_data)
5699 AccelClosure *aclosure = (AccelClosure*) closure;
5700 gboolean can_activate = gtk_widget_can_activate_accel (closure->data, aclosure->signal_id);
5703 g_signal_emit (closure->data, aclosure->signal_id, 0);
5705 /* whether accelerator was handled */
5706 g_value_set_boolean (return_value, can_activate);
5710 closures_destroy (gpointer data)
5712 GSList *slist, *closures = data;
5714 for (slist = closures; slist; slist = slist->next)
5716 g_closure_invalidate (slist->data);
5717 g_closure_unref (slist->data);
5719 g_slist_free (closures);
5723 widget_new_accel_closure (GtkWidget *widget,
5726 AccelClosure *aclosure;
5727 GClosure *closure = NULL;
5728 GSList *slist, *closures;
5730 closures = g_object_steal_qdata (G_OBJECT (widget), quark_accel_closures);
5731 for (slist = closures; slist; slist = slist->next)
5732 if (!gtk_accel_group_from_accel_closure (slist->data))
5734 /* reuse this closure */
5735 closure = slist->data;
5740 closure = g_closure_new_object (sizeof (AccelClosure), G_OBJECT (widget));
5741 closures = g_slist_prepend (closures, g_closure_ref (closure));
5742 g_closure_sink (closure);
5743 g_closure_set_marshal (closure, closure_accel_activate);
5745 g_object_set_qdata_full (G_OBJECT (widget), quark_accel_closures, closures, closures_destroy);
5747 aclosure = (AccelClosure*) closure;
5748 g_assert (closure->data == widget);
5749 g_assert (closure->marshal == closure_accel_activate);
5750 aclosure->signal_id = signal_id;
5756 * gtk_widget_add_accelerator:
5757 * @widget: widget to install an accelerator on
5758 * @accel_signal: widget signal to emit on accelerator activation
5759 * @accel_group: accel group for this widget, added to its toplevel
5760 * @accel_key: GDK keyval of the accelerator
5761 * @accel_mods: modifier key combination of the accelerator
5762 * @accel_flags: flag accelerators, e.g. %GTK_ACCEL_VISIBLE
5764 * Installs an accelerator for this @widget in @accel_group that causes
5765 * @accel_signal to be emitted if the accelerator is activated.
5766 * The @accel_group needs to be added to the widget's toplevel via
5767 * gtk_window_add_accel_group(), and the signal must be of type %G_SIGNAL_ACTION.
5768 * Accelerators added through this function are not user changeable during
5769 * runtime. If you want to support accelerators that can be changed by the
5770 * user, use gtk_accel_map_add_entry() and gtk_widget_set_accel_path() or
5771 * gtk_menu_item_set_accel_path() instead.
5774 gtk_widget_add_accelerator (GtkWidget *widget,
5775 const gchar *accel_signal,
5776 GtkAccelGroup *accel_group,
5778 GdkModifierType accel_mods,
5779 GtkAccelFlags accel_flags)
5784 g_return_if_fail (GTK_IS_WIDGET (widget));
5785 g_return_if_fail (accel_signal != NULL);
5786 g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
5788 g_signal_query (g_signal_lookup (accel_signal, G_OBJECT_TYPE (widget)), &query);
5789 if (!query.signal_id ||
5790 !(query.signal_flags & G_SIGNAL_ACTION) ||
5791 query.return_type != G_TYPE_NONE ||
5794 /* hmm, should be elaborate enough */
5795 g_warning (G_STRLOC ": widget `%s' has no activatable signal \"%s\" without arguments",
5796 G_OBJECT_TYPE_NAME (widget), accel_signal);
5800 closure = widget_new_accel_closure (widget, query.signal_id);
5802 g_object_ref (widget);
5804 /* install the accelerator. since we don't map this onto an accel_path,
5805 * the accelerator will automatically be locked.
5807 gtk_accel_group_connect (accel_group,
5810 accel_flags | GTK_ACCEL_LOCKED,
5813 g_signal_emit (widget, widget_signals[ACCEL_CLOSURES_CHANGED], 0);
5815 g_object_unref (widget);
5819 * gtk_widget_remove_accelerator:
5820 * @widget: widget to install an accelerator on
5821 * @accel_group: accel group for this widget
5822 * @accel_key: GDK keyval of the accelerator
5823 * @accel_mods: modifier key combination of the accelerator
5825 * Removes an accelerator from @widget, previously installed with
5826 * gtk_widget_add_accelerator().
5828 * Returns: whether an accelerator was installed and could be removed
5831 gtk_widget_remove_accelerator (GtkWidget *widget,
5832 GtkAccelGroup *accel_group,
5834 GdkModifierType accel_mods)
5836 GtkAccelGroupEntry *ag_entry;
5837 GList *slist, *clist;
5840 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
5841 g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), FALSE);
5843 ag_entry = gtk_accel_group_query (accel_group, accel_key, accel_mods, &n);
5844 clist = gtk_widget_list_accel_closures (widget);
5845 for (slist = clist; slist; slist = slist->next)
5849 for (i = 0; i < n; i++)
5850 if (slist->data == (gpointer) ag_entry[i].closure)
5852 gboolean is_removed = gtk_accel_group_disconnect (accel_group, slist->data);
5854 g_signal_emit (widget, widget_signals[ACCEL_CLOSURES_CHANGED], 0);
5856 g_list_free (clist);
5861 g_list_free (clist);
5863 g_warning (G_STRLOC ": no accelerator (%u,%u) installed in accel group (%p) for %s (%p)",
5864 accel_key, accel_mods, accel_group,
5865 G_OBJECT_TYPE_NAME (widget), widget);
5871 * gtk_widget_list_accel_closures:
5872 * @widget: widget to list accelerator closures for
5874 * Lists the closures used by @widget for accelerator group connections
5875 * with gtk_accel_group_connect_by_path() or gtk_accel_group_connect().
5876 * The closures can be used to monitor accelerator changes on @widget,
5877 * by connecting to the @GtkAccelGroup::accel-changed signal of the
5878 * #GtkAccelGroup of a closure which can be found out with
5879 * gtk_accel_group_from_accel_closure().
5881 * Return value: (transfer container) (element-type GClosure):
5882 * a newly allocated #GList of closures
5885 gtk_widget_list_accel_closures (GtkWidget *widget)
5888 GList *clist = NULL;
5890 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
5892 for (slist = g_object_get_qdata (G_OBJECT (widget), quark_accel_closures); slist; slist = slist->next)
5893 if (gtk_accel_group_from_accel_closure (slist->data))
5894 clist = g_list_prepend (clist, slist->data);
5900 GtkAccelGroup *accel_group;
5905 destroy_accel_path (gpointer data)
5907 AccelPath *apath = data;
5909 gtk_accel_group_disconnect (apath->accel_group, apath->closure);
5911 /* closures_destroy takes care of unrefing the closure */
5912 g_object_unref (apath->accel_group);
5914 g_slice_free (AccelPath, apath);
5919 * gtk_widget_set_accel_path:
5920 * @widget: a #GtkWidget
5921 * @accel_path: (allow-none): path used to look up the accelerator
5922 * @accel_group: (allow-none): a #GtkAccelGroup.
5924 * Given an accelerator group, @accel_group, and an accelerator path,
5925 * @accel_path, sets up an accelerator in @accel_group so whenever the
5926 * key binding that is defined for @accel_path is pressed, @widget
5927 * will be activated. This removes any accelerators (for any
5928 * accelerator group) installed by previous calls to
5929 * gtk_widget_set_accel_path(). Associating accelerators with
5930 * paths allows them to be modified by the user and the modifications
5931 * to be saved for future use. (See gtk_accel_map_save().)
5933 * This function is a low level function that would most likely
5934 * be used by a menu creation system like #GtkUIManager. If you
5935 * use #GtkUIManager, setting up accelerator paths will be done
5938 * Even when you you aren't using #GtkUIManager, if you only want to
5939 * set up accelerators on menu items gtk_menu_item_set_accel_path()
5940 * provides a somewhat more convenient interface.
5942 * Note that @accel_path string will be stored in a #GQuark. Therefore, if you
5943 * pass a static string, you can save some memory by interning it first with
5944 * g_intern_static_string().
5947 gtk_widget_set_accel_path (GtkWidget *widget,
5948 const gchar *accel_path,
5949 GtkAccelGroup *accel_group)
5953 g_return_if_fail (GTK_IS_WIDGET (widget));
5954 g_return_if_fail (GTK_WIDGET_GET_CLASS (widget)->activate_signal != 0);
5958 g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
5959 g_return_if_fail (_gtk_accel_path_is_valid (accel_path));
5961 gtk_accel_map_add_entry (accel_path, 0, 0);
5962 apath = g_slice_new (AccelPath);
5963 apath->accel_group = g_object_ref (accel_group);
5964 apath->path_quark = g_quark_from_string (accel_path);
5965 apath->closure = widget_new_accel_closure (widget, GTK_WIDGET_GET_CLASS (widget)->activate_signal);
5970 /* also removes possible old settings */
5971 g_object_set_qdata_full (G_OBJECT (widget), quark_accel_path, apath, destroy_accel_path);
5974 gtk_accel_group_connect_by_path (apath->accel_group, g_quark_to_string (apath->path_quark), apath->closure);
5976 g_signal_emit (widget, widget_signals[ACCEL_CLOSURES_CHANGED], 0);
5980 _gtk_widget_get_accel_path (GtkWidget *widget,
5985 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
5987 apath = g_object_get_qdata (G_OBJECT (widget), quark_accel_path);
5989 *locked = apath ? gtk_accel_group_get_is_locked (apath->accel_group) : TRUE;
5990 return apath ? g_quark_to_string (apath->path_quark) : NULL;
5994 * gtk_widget_mnemonic_activate:
5995 * @widget: a #GtkWidget
5996 * @group_cycling: %TRUE if there are other widgets with the same mnemonic
5998 * Emits the #GtkWidget::mnemonic-activate signal.
6000 * The default handler for this signal activates the @widget if
6001 * @group_cycling is %FALSE, and just grabs the focus if @group_cycling
6004 * Returns: %TRUE if the signal has been handled
6007 gtk_widget_mnemonic_activate (GtkWidget *widget,
6008 gboolean group_cycling)
6012 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
6014 group_cycling = group_cycling != FALSE;
6015 if (!gtk_widget_is_sensitive (widget))
6018 g_signal_emit (widget,
6019 widget_signals[MNEMONIC_ACTIVATE],
6027 gtk_widget_real_mnemonic_activate (GtkWidget *widget,
6028 gboolean group_cycling)
6030 if (!group_cycling && GTK_WIDGET_GET_CLASS (widget)->activate_signal)
6031 gtk_widget_activate (widget);
6032 else if (gtk_widget_get_can_focus (widget))
6033 gtk_widget_grab_focus (widget);
6036 g_warning ("widget `%s' isn't suitable for mnemonic activation",
6037 G_OBJECT_TYPE_NAME (widget));
6038 gtk_widget_error_bell (widget);
6043 static const cairo_user_data_key_t event_key;
6046 _gtk_cairo_get_event (cairo_t *cr)
6048 g_return_val_if_fail (cr != NULL, NULL);
6050 return cairo_get_user_data (cr, &event_key);
6054 gtk_cairo_set_event (cairo_t *cr,
6055 GdkEventExpose *event)
6057 cairo_set_user_data (cr, &event_key, event, NULL);
6061 * gtk_cairo_should_draw_window:
6062 * @cr: a cairo context
6063 * @window: the window to check. @window may not be an input-only
6066 * This function is supposed to be called in #GtkWidget::draw
6067 * implementations for widgets that support multiple windows.
6068 * @cr must be untransformed from invoking of the draw function.
6069 * This function will return %TRUE if the contents of the given
6070 * @window are supposed to be drawn and %FALSE otherwise. Note
6071 * that when the drawing was not initiated by the windowing
6072 * system this function will return %TRUE for all windows, so
6073 * you need to draw the bottommost window first. Also, do not
6074 * use "else if" statements to check which window should be drawn.
6076 * Returns: %TRUE if @window should be drawn
6081 gtk_cairo_should_draw_window (cairo_t *cr,
6084 GdkEventExpose *event;
6086 g_return_val_if_fail (cr != NULL, FALSE);
6087 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
6089 event = _gtk_cairo_get_event (cr);
6091 return event == NULL ||
6092 event->window == window;
6096 gtk_widget_get_clip_draw (GtkWidget *widget)
6098 /* labels are not clipped, because clipping them would cause
6099 * mnemonics to not appear on characters that go beyond the
6101 * https://bugzilla.gnome.org/show_bug.cgi?id=648570
6103 if (GTK_IS_LABEL (widget))
6109 /* code shared by gtk_container_propagate_draw() and
6113 _gtk_widget_draw_internal (GtkWidget *widget,
6115 gboolean clip_to_size)
6117 if (!gtk_widget_is_drawable (widget))
6120 clip_to_size &= gtk_widget_get_clip_draw (widget);
6124 cairo_rectangle (cr,
6126 widget->priv->allocation.width,
6127 widget->priv->allocation.height);
6131 if (gdk_cairo_get_clip_rectangle (cr, NULL))
6135 g_signal_emit (widget, widget_signals[DRAW],
6139 if (cairo_status (cr) &&
6140 _gtk_cairo_get_event (cr))
6142 /* We check the event so we only warn about internal GTK calls.
6143 * Errors might come from PDF streams having write failures and
6144 * we don't want to spam stderr in that case.
6145 * We do want to catch errors from
6147 g_warning ("drawing failure for widget `%s': %s",
6148 G_OBJECT_TYPE_NAME (widget),
6149 cairo_status_to_string (cairo_status (cr)));
6156 * @widget: the widget to draw. It must be drawable (see
6157 * gtk_widget_is_drawable()) and a size must have been allocated.
6158 * @cr: a cairo context to draw to
6160 * Draws @widget to @cr. The top left corner of the widget will be
6161 * drawn to the currently set origin point of @cr.
6163 * You should pass a cairo context as @cr argument that is in an
6164 * original state. Otherwise the resulting drawing is undefined. For
6165 * example changing the operator using cairo_set_operator() or the
6166 * line width using cairo_set_line_width() might have unwanted side
6168 * You may however change the context's transform matrix - like with
6169 * cairo_scale(), cairo_translate() or cairo_set_matrix() and clip
6170 * region with cairo_clip() prior to calling this function. Also, it
6171 * is fine to modify the context with cairo_save() and
6172 * cairo_push_group() prior to calling this function.
6174 * <note><para>Special purpose widgets may contain special code for
6175 * rendering to the screen and might appear differently on screen
6176 * and when rendered using gtk_widget_draw().</para></note>
6181 gtk_widget_draw (GtkWidget *widget,
6184 GdkEventExpose *tmp_event;
6186 g_return_if_fail (GTK_IS_WIDGET (widget));
6187 g_return_if_fail (!widget->priv->alloc_needed);
6188 g_return_if_fail (cr != NULL);
6191 /* We have to reset the event here so that draw functions can call
6192 * gtk_widget_draw() on random other widgets and get the desired
6193 * effect: Drawing all contents, not just the current window.
6195 tmp_event = _gtk_cairo_get_event (cr);
6196 gtk_cairo_set_event (cr, NULL);
6198 _gtk_widget_draw_internal (widget, cr, TRUE);
6200 gtk_cairo_set_event (cr, tmp_event);
6205 gtk_widget_real_key_press_event (GtkWidget *widget,
6208 return gtk_bindings_activate_event (G_OBJECT (widget), event);
6212 gtk_widget_real_key_release_event (GtkWidget *widget,
6215 return gtk_bindings_activate_event (G_OBJECT (widget), event);
6219 gtk_widget_real_focus_in_event (GtkWidget *widget,
6220 GdkEventFocus *event)
6222 gtk_widget_queue_draw (widget);
6228 gtk_widget_real_focus_out_event (GtkWidget *widget,
6229 GdkEventFocus *event)
6231 gtk_widget_queue_draw (widget);
6237 gtk_widget_real_touch_event (GtkWidget *widget,
6238 GdkEventTouch *event)
6241 gboolean return_val;
6244 if (!event->emulating_pointer)
6247 if (event->type == GDK_TOUCH_BEGIN ||
6248 event->type == GDK_TOUCH_END)
6252 if (event->type == GDK_TOUCH_BEGIN)
6254 type = GDK_BUTTON_PRESS;
6255 signum = BUTTON_PRESS_EVENT;
6259 type = GDK_BUTTON_RELEASE;
6260 signum = BUTTON_RELEASE_EVENT;
6262 bevent = gdk_event_new (type);
6263 bevent->any.window = g_object_ref (event->window);
6264 bevent->any.send_event = FALSE;
6265 bevent->button.time = event->time;
6266 bevent->button.state = event->state;
6267 bevent->button.button = 1;
6268 bevent->button.x_root = event->x_root;
6269 bevent->button.y_root = event->y_root;
6270 bevent->button.x = event->x;
6271 bevent->button.y = event->y;
6272 bevent->button.device = event->device;
6273 bevent->button.axes = g_memdup (event->axes,
6274 sizeof (gdouble) * gdk_device_get_n_axes (event->device));
6275 gdk_event_set_source_device (bevent, gdk_event_get_source_device ((GdkEvent*)event));
6277 else if (event->type == GDK_TOUCH_UPDATE)
6279 signum = MOTION_NOTIFY_EVENT;
6280 bevent = gdk_event_new (GDK_MOTION_NOTIFY);
6281 bevent->any.window = g_object_ref (event->window);
6282 bevent->any.send_event = FALSE;
6283 bevent->motion.time = event->time;
6284 bevent->motion.state = event->state;
6285 bevent->motion.x_root = event->x_root;
6286 bevent->motion.y_root = event->y_root;
6287 bevent->motion.x = event->x;
6288 bevent->motion.y = event->y;
6289 bevent->motion.device = event->device;
6290 bevent->motion.is_hint = FALSE;
6291 bevent->motion.axes = g_memdup (event->axes,
6292 sizeof (gdouble) * gdk_device_get_n_axes (event->device));
6293 gdk_event_set_source_device (bevent, gdk_event_get_source_device ((GdkEvent*)event));
6298 g_signal_emit (widget, widget_signals[signum], 0, bevent, &return_val);
6300 gdk_event_free (bevent);
6306 #define WIDGET_REALIZED_FOR_EVENT(widget, event) \
6307 (event->type == GDK_FOCUS_CHANGE || gtk_widget_get_realized(widget))
6311 * @widget: a #GtkWidget
6312 * @event: a #GdkEvent
6314 * Rarely-used function. This function is used to emit
6315 * the event signals on a widget (those signals should never
6316 * be emitted without using this function to do so).
6317 * If you want to synthesize an event though, don't use this function;
6318 * instead, use gtk_main_do_event() so the event will behave as if
6319 * it were in the event queue. Don't synthesize expose events; instead,
6320 * use gdk_window_invalidate_rect() to invalidate a region of the
6323 * Return value: return from the event signal emission (%TRUE if
6324 * the event was handled)
6327 gtk_widget_event (GtkWidget *widget,
6330 g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
6331 g_return_val_if_fail (WIDGET_REALIZED_FOR_EVENT (widget, event), TRUE);
6333 if (event->type == GDK_EXPOSE)
6335 g_warning ("Events of type GDK_EXPOSE cannot be synthesized. To get "
6336 "the same effect, call gdk_window_invalidate_rect/region(), "
6337 "followed by gdk_window_process_updates().");
6341 return gtk_widget_event_internal (widget, event);
6345 _gtk_widget_set_captured_event_handler (GtkWidget *widget,
6346 GtkCapturedEventHandler callback)
6348 g_object_set_data (G_OBJECT (widget), "captured-event-handler", callback);
6352 _gtk_widget_captured_event (GtkWidget *widget,
6355 gboolean return_val = FALSE;
6356 GtkCapturedEventHandler handler;
6358 g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
6359 g_return_val_if_fail (WIDGET_REALIZED_FOR_EVENT (widget, event), TRUE);
6361 if (event->type == GDK_EXPOSE)
6363 g_warning ("Events of type GDK_EXPOSE cannot be synthesized. To get "
6364 "the same effect, call gdk_window_invalidate_rect/region(), "
6365 "followed by gdk_window_process_updates().");
6369 if (!event_window_is_still_viewable (event))
6372 handler = g_object_get_data (G_OBJECT (widget), "captured-event-handler");
6376 g_object_ref (widget);
6378 return_val = handler (widget, event);
6379 return_val |= !WIDGET_REALIZED_FOR_EVENT (widget, event);
6381 /* The widget that was originally to receive the event
6382 * handles motion hints, but the capturing widget might
6383 * not, so ensure we get further motion events.
6386 event->type == GDK_MOTION_NOTIFY &&
6387 event->motion.is_hint &&
6388 (gdk_window_get_events (event->any.window) &
6389 GDK_POINTER_MOTION_HINT_MASK) != 0)
6390 gdk_event_request_motions (&event->motion);
6392 g_object_unref (widget);
6397 /* Returns TRUE if a translation should be done */
6399 _gtk_widget_get_translation_to_window (GtkWidget *widget,
6404 GdkWindow *w, *widget_window;
6406 if (!gtk_widget_get_has_window (widget))
6408 *x = -widget->priv->allocation.x;
6409 *y = -widget->priv->allocation.y;
6417 widget_window = gtk_widget_get_window (widget);
6419 for (w = window; w && w != widget_window; w = gdk_window_get_parent (w))
6422 gdk_window_get_position (w, &wx, &wy);
6439 * gtk_cairo_transform_to_window:
6440 * @cr: the cairo context to transform
6441 * @widget: the widget the context is currently centered for
6442 * @window: the window to transform the context to
6444 * Transforms the given cairo context @cr that from @widget-relative
6445 * coordinates to @window-relative coordinates.
6446 * If the @widget's window is not an ancestor of @window, no
6447 * modification will be applied.
6449 * This is the inverse to the transformation GTK applies when
6450 * preparing an expose event to be emitted with the #GtkWidget::draw
6451 * signal. It is intended to help porting multiwindow widgets from
6452 * GTK+ 2 to the rendering architecture of GTK+ 3.
6457 gtk_cairo_transform_to_window (cairo_t *cr,
6463 g_return_if_fail (cr != NULL);
6464 g_return_if_fail (GTK_IS_WIDGET (widget));
6465 g_return_if_fail (GDK_IS_WINDOW (window));
6467 if (_gtk_widget_get_translation_to_window (widget, window, &x, &y))
6468 cairo_translate (cr, x, y);
6472 * gtk_widget_send_expose:
6473 * @widget: a #GtkWidget
6474 * @event: a expose #GdkEvent
6476 * Very rarely-used function. This function is used to emit
6477 * an expose event on a widget. This function is not normally used
6478 * directly. The only time it is used is when propagating an expose
6479 * event to a child %NO_WINDOW widget, and that is normally done
6480 * using gtk_container_propagate_draw().
6482 * If you want to force an area of a window to be redrawn,
6483 * use gdk_window_invalidate_rect() or gdk_window_invalidate_region().
6484 * To cause the redraw to be done immediately, follow that call
6485 * with a call to gdk_window_process_updates().
6487 * Return value: return from the event signal emission (%TRUE if
6488 * the event was handled)
6491 gtk_widget_send_expose (GtkWidget *widget,
6494 gboolean result = FALSE;
6499 g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
6500 g_return_val_if_fail (gtk_widget_get_realized (widget), TRUE);
6501 g_return_val_if_fail (event != NULL, TRUE);
6502 g_return_val_if_fail (event->type == GDK_EXPOSE, TRUE);
6504 cr = gdk_cairo_create (event->expose.window);
6505 gtk_cairo_set_event (cr, &event->expose);
6507 gdk_cairo_region (cr, event->expose.region);
6510 do_clip = _gtk_widget_get_translation_to_window (widget,
6511 event->expose.window,
6513 cairo_translate (cr, -x, -y);
6515 _gtk_widget_draw_internal (widget, cr, do_clip);
6517 /* unset here, so if someone keeps a reference to cr we
6518 * don't leak the window. */
6519 gtk_cairo_set_event (cr, NULL);
6526 event_window_is_still_viewable (GdkEvent *event)
6528 /* Check that we think the event's window is viewable before
6529 * delivering the event, to prevent suprises. We do this here
6530 * at the last moment, since the event may have been queued
6531 * up behind other events, held over a recursive main loop, etc.
6533 switch (event->type)
6536 case GDK_MOTION_NOTIFY:
6537 case GDK_BUTTON_PRESS:
6538 case GDK_2BUTTON_PRESS:
6539 case GDK_3BUTTON_PRESS:
6541 case GDK_ENTER_NOTIFY:
6542 case GDK_PROXIMITY_IN:
6544 return event->any.window && gdk_window_is_viewable (event->any.window);
6547 /* The following events are the second half of paired events;
6548 * we always deliver them to deal with widgets that clean up
6549 * on the second half.
6551 case GDK_BUTTON_RELEASE:
6552 case GDK_KEY_RELEASE:
6553 case GDK_LEAVE_NOTIFY:
6554 case GDK_PROXIMITY_OUT:
6558 /* Remaining events would make sense on an not-viewable window,
6559 * or don't have an associated window.
6566 gtk_widget_event_internal (GtkWidget *widget,
6569 gboolean return_val = FALSE;
6571 /* We check only once for is-still-visible; if someone
6572 * hides the window in on of the signals on the widget,
6573 * they are responsible for returning TRUE to terminate
6576 if (!event_window_is_still_viewable (event))
6579 g_object_ref (widget);
6581 g_signal_emit (widget, widget_signals[EVENT], 0, event, &return_val);
6582 return_val |= !WIDGET_REALIZED_FOR_EVENT (widget, event);
6587 switch (event->type)
6593 case GDK_BUTTON_PRESS:
6594 case GDK_2BUTTON_PRESS:
6595 case GDK_3BUTTON_PRESS:
6596 signal_num = BUTTON_PRESS_EVENT;
6598 case GDK_TOUCH_BEGIN:
6599 case GDK_TOUCH_UPDATE:
6601 case GDK_TOUCH_CANCEL:
6602 signal_num = TOUCH_EVENT;
6605 signal_num = SCROLL_EVENT;
6607 case GDK_BUTTON_RELEASE:
6608 signal_num = BUTTON_RELEASE_EVENT;
6610 case GDK_MOTION_NOTIFY:
6611 signal_num = MOTION_NOTIFY_EVENT;
6614 signal_num = DELETE_EVENT;
6617 signal_num = DESTROY_EVENT;
6618 _gtk_tooltip_hide (widget);
6621 signal_num = KEY_PRESS_EVENT;
6623 case GDK_KEY_RELEASE:
6624 signal_num = KEY_RELEASE_EVENT;
6626 case GDK_ENTER_NOTIFY:
6627 signal_num = ENTER_NOTIFY_EVENT;
6629 case GDK_LEAVE_NOTIFY:
6630 signal_num = LEAVE_NOTIFY_EVENT;
6632 case GDK_FOCUS_CHANGE:
6633 signal_num = event->focus_change.in ? FOCUS_IN_EVENT : FOCUS_OUT_EVENT;
6634 if (event->focus_change.in)
6635 _gtk_tooltip_focus_in (widget);
6637 _gtk_tooltip_focus_out (widget);
6640 signal_num = CONFIGURE_EVENT;
6643 signal_num = MAP_EVENT;
6646 signal_num = UNMAP_EVENT;
6648 case GDK_WINDOW_STATE:
6649 signal_num = WINDOW_STATE_EVENT;
6651 case GDK_PROPERTY_NOTIFY:
6652 signal_num = PROPERTY_NOTIFY_EVENT;
6654 case GDK_SELECTION_CLEAR:
6655 signal_num = SELECTION_CLEAR_EVENT;
6657 case GDK_SELECTION_REQUEST:
6658 signal_num = SELECTION_REQUEST_EVENT;
6660 case GDK_SELECTION_NOTIFY:
6661 signal_num = SELECTION_NOTIFY_EVENT;
6663 case GDK_PROXIMITY_IN:
6664 signal_num = PROXIMITY_IN_EVENT;
6666 case GDK_PROXIMITY_OUT:
6667 signal_num = PROXIMITY_OUT_EVENT;
6669 case GDK_VISIBILITY_NOTIFY:
6670 signal_num = VISIBILITY_NOTIFY_EVENT;
6672 case GDK_GRAB_BROKEN:
6673 signal_num = GRAB_BROKEN_EVENT;
6676 signal_num = DAMAGE_EVENT;
6679 g_warning ("gtk_widget_event(): unhandled event type: %d", event->type);
6683 if (signal_num != -1)
6684 g_signal_emit (widget, widget_signals[signal_num], 0, event, &return_val);
6686 if (WIDGET_REALIZED_FOR_EVENT (widget, event))
6687 g_signal_emit (widget, widget_signals[EVENT_AFTER], 0, event);
6691 g_object_unref (widget);
6697 * gtk_widget_activate:
6698 * @widget: a #GtkWidget that's activatable
6700 * For widgets that can be "activated" (buttons, menu items, etc.)
6701 * this function activates them. Activation is what happens when you
6702 * press Enter on a widget during key navigation. If @widget isn't
6703 * activatable, the function returns %FALSE.
6705 * Return value: %TRUE if the widget was activatable
6708 gtk_widget_activate (GtkWidget *widget)
6710 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
6712 if (WIDGET_CLASS (widget)->activate_signal)
6714 /* FIXME: we should eventually check the signals signature here */
6715 g_signal_emit (widget, WIDGET_CLASS (widget)->activate_signal, 0);
6724 gtk_widget_reparent_subwindows (GtkWidget *widget,
6725 GdkWindow *new_window)
6727 GtkWidgetPrivate *priv = widget->priv;
6729 if (!gtk_widget_get_has_window (widget))
6731 GList *children = gdk_window_get_children (priv->window);
6734 for (tmp_list = children; tmp_list; tmp_list = tmp_list->next)
6736 GdkWindow *window = tmp_list->data;
6739 gdk_window_get_user_data (window, &child);
6740 while (child && child != widget)
6741 child = ((GtkWidget*) child)->priv->parent;
6744 gdk_window_reparent (window, new_window, 0, 0);
6747 g_list_free (children);
6752 GList *tmp_list, *children;
6754 parent = gdk_window_get_parent (priv->window);
6757 gdk_window_reparent (priv->window, new_window, 0, 0);
6760 children = gdk_window_get_children (parent);
6762 for (tmp_list = children; tmp_list; tmp_list = tmp_list->next)
6764 GdkWindow *window = tmp_list->data;
6767 gdk_window_get_user_data (window, &child);
6769 if (child == widget)
6770 gdk_window_reparent (window, new_window, 0, 0);
6773 g_list_free (children);
6779 gtk_widget_reparent_fixup_child (GtkWidget *widget,
6780 gpointer client_data)
6782 GtkWidgetPrivate *priv = widget->priv;
6784 g_assert (client_data != NULL);
6786 if (!gtk_widget_get_has_window (widget))
6789 g_object_unref (priv->window);
6790 priv->window = (GdkWindow*) client_data;
6792 g_object_ref (priv->window);
6794 if (GTK_IS_CONTAINER (widget))
6795 gtk_container_forall (GTK_CONTAINER (widget),
6796 gtk_widget_reparent_fixup_child,
6802 * gtk_widget_reparent:
6803 * @widget: a #GtkWidget
6804 * @new_parent: a #GtkContainer to move the widget into
6806 * Moves a widget from one #GtkContainer to another, handling reference
6807 * count issues to avoid destroying the widget.
6810 gtk_widget_reparent (GtkWidget *widget,
6811 GtkWidget *new_parent)
6813 GtkWidgetPrivate *priv;
6815 g_return_if_fail (GTK_IS_WIDGET (widget));
6816 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
6817 priv = widget->priv;
6818 g_return_if_fail (priv->parent != NULL);
6820 if (priv->parent != new_parent)
6822 /* First try to see if we can get away without unrealizing
6823 * the widget as we reparent it. if so we set a flag so
6824 * that gtk_widget_unparent doesn't unrealize widget
6826 if (gtk_widget_get_realized (widget) && gtk_widget_get_realized (new_parent))
6827 priv->in_reparent = TRUE;
6829 g_object_ref (widget);
6830 gtk_container_remove (GTK_CONTAINER (priv->parent), widget);
6831 gtk_container_add (GTK_CONTAINER (new_parent), widget);
6832 g_object_unref (widget);
6834 if (priv->in_reparent)
6836 priv->in_reparent = FALSE;
6838 gtk_widget_reparent_subwindows (widget, gtk_widget_get_parent_window (widget));
6839 gtk_widget_reparent_fixup_child (widget,
6840 gtk_widget_get_parent_window (widget));
6843 g_object_notify (G_OBJECT (widget), "parent");
6848 * gtk_widget_intersect:
6849 * @widget: a #GtkWidget
6850 * @area: a rectangle
6851 * @intersection: rectangle to store intersection of @widget and @area
6853 * Computes the intersection of a @widget's area and @area, storing
6854 * the intersection in @intersection, and returns %TRUE if there was
6855 * an intersection. @intersection may be %NULL if you're only
6856 * interested in whether there was an intersection.
6858 * Return value: %TRUE if there was an intersection
6861 gtk_widget_intersect (GtkWidget *widget,
6862 const GdkRectangle *area,
6863 GdkRectangle *intersection)
6865 GtkWidgetPrivate *priv;
6870 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
6871 g_return_val_if_fail (area != NULL, FALSE);
6873 priv = widget->priv;
6876 dest = intersection;
6880 return_val = gdk_rectangle_intersect (&priv->allocation, area, dest);
6882 if (return_val && intersection && gtk_widget_get_has_window (widget))
6884 intersection->x -= priv->allocation.x;
6885 intersection->y -= priv->allocation.y;
6892 * gtk_widget_region_intersect:
6893 * @widget: a #GtkWidget
6894 * @region: a #cairo_region_t, in the same coordinate system as
6895 * @widget->allocation. That is, relative to @widget->window
6896 * for %NO_WINDOW widgets; relative to the parent window
6897 * of @widget->window for widgets with their own window.
6899 * Computes the intersection of a @widget's area and @region, returning
6900 * the intersection. The result may be empty, use cairo_region_is_empty() to
6903 * Returns: A newly allocated region holding the intersection of @widget
6904 * and @region. The coordinates of the return value are relative to
6905 * @widget->window for %NO_WINDOW widgets, and relative to the parent
6906 * window of @widget->window for widgets with their own window.
6909 gtk_widget_region_intersect (GtkWidget *widget,
6910 const cairo_region_t *region)
6913 cairo_region_t *dest;
6915 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
6916 g_return_val_if_fail (region != NULL, NULL);
6918 gtk_widget_get_allocation (widget, &rect);
6920 dest = cairo_region_create_rectangle (&rect);
6922 cairo_region_intersect (dest, region);
6928 * _gtk_widget_grab_notify:
6929 * @widget: a #GtkWidget
6930 * @was_grabbed: whether a grab is now in effect
6932 * Emits the #GtkWidget::grab-notify signal on @widget.
6937 _gtk_widget_grab_notify (GtkWidget *widget,
6938 gboolean was_grabbed)
6940 g_signal_emit (widget, widget_signals[GRAB_NOTIFY], 0, was_grabbed);
6944 * gtk_widget_grab_focus:
6945 * @widget: a #GtkWidget
6947 * Causes @widget to have the keyboard focus for the #GtkWindow it's
6948 * inside. @widget must be a focusable widget, such as a #GtkEntry;
6949 * something like #GtkFrame won't work.
6951 * More precisely, it must have the %GTK_CAN_FOCUS flag set. Use
6952 * gtk_widget_set_can_focus() to modify that flag.
6954 * The widget also needs to be realized and mapped. This is indicated by the
6955 * related signals. Grabbing the focus immediately after creating the widget
6956 * will likely fail and cause critical warnings.
6959 gtk_widget_grab_focus (GtkWidget *widget)
6961 g_return_if_fail (GTK_IS_WIDGET (widget));
6963 if (!gtk_widget_is_sensitive (widget))
6966 g_object_ref (widget);
6967 g_signal_emit (widget, widget_signals[GRAB_FOCUS], 0);
6968 g_object_notify (G_OBJECT (widget), "has-focus");
6969 g_object_unref (widget);
6973 reset_focus_recurse (GtkWidget *widget,
6976 if (GTK_IS_CONTAINER (widget))
6978 GtkContainer *container;
6980 container = GTK_CONTAINER (widget);
6981 gtk_container_set_focus_child (container, NULL);
6983 gtk_container_foreach (container,
6984 reset_focus_recurse,
6990 gtk_widget_real_grab_focus (GtkWidget *focus_widget)
6992 if (gtk_widget_get_can_focus (focus_widget))
6994 GtkWidget *toplevel;
6997 /* clear the current focus setting, break if the current widget
6998 * is the focus widget's parent, since containers above that will
6999 * be set by the next loop.
7001 toplevel = gtk_widget_get_toplevel (focus_widget);
7002 if (gtk_widget_is_toplevel (toplevel) && GTK_IS_WINDOW (toplevel))
7004 widget = gtk_window_get_focus (GTK_WINDOW (toplevel));
7006 if (widget == focus_widget)
7008 /* We call _gtk_window_internal_set_focus() here so that the
7009 * toplevel window can request the focus if necessary.
7010 * This is needed when the toplevel is a GtkPlug
7012 if (!gtk_widget_has_focus (widget))
7013 _gtk_window_internal_set_focus (GTK_WINDOW (toplevel), focus_widget);
7020 GtkWidget *common_ancestor = gtk_widget_common_ancestor (widget, focus_widget);
7022 if (widget != common_ancestor)
7024 while (widget->priv->parent && widget->priv->parent != common_ancestor)
7026 widget = widget->priv->parent;
7027 gtk_container_set_focus_child (GTK_CONTAINER (widget), NULL);
7032 else if (toplevel != focus_widget)
7034 /* gtk_widget_grab_focus() operates on a tree without window...
7035 * actually, this is very questionable behaviour.
7038 gtk_container_foreach (GTK_CONTAINER (toplevel),
7039 reset_focus_recurse,
7043 /* now propagate the new focus up the widget tree and finally
7044 * set it on the window
7046 widget = focus_widget;
7047 while (widget->priv->parent)
7049 gtk_container_set_focus_child (GTK_CONTAINER (widget->priv->parent), widget);
7050 widget = widget->priv->parent;
7052 if (GTK_IS_WINDOW (widget))
7053 _gtk_window_internal_set_focus (GTK_WINDOW (widget), focus_widget);
7058 gtk_widget_real_query_tooltip (GtkWidget *widget,
7061 gboolean keyboard_tip,
7062 GtkTooltip *tooltip)
7064 gchar *tooltip_markup;
7065 gboolean has_tooltip;
7067 tooltip_markup = g_object_get_qdata (G_OBJECT (widget), quark_tooltip_markup);
7068 has_tooltip = GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (widget), quark_has_tooltip));
7070 if (has_tooltip && tooltip_markup)
7072 gtk_tooltip_set_markup (tooltip, tooltip_markup);
7080 gtk_widget_real_state_flags_changed (GtkWidget *widget,
7081 GtkStateFlags old_state)
7083 gtk_widget_update_pango_context (widget);
7087 gtk_widget_real_style_updated (GtkWidget *widget)
7089 GtkWidgetPrivate *priv = widget->priv;
7091 gtk_widget_update_pango_context (widget);
7092 gtk_widget_update_alpha (widget);
7094 if (priv->style != NULL &&
7095 priv->style != gtk_widget_get_default_style ())
7097 /* Trigger ::style-set for old
7098 * widgets not listening to this
7100 g_signal_emit (widget,
7101 widget_signals[STYLE_SET],
7103 widget->priv->style);
7106 if (widget->priv->context)
7108 const GtkBitmask *changes = _gtk_style_context_get_changes (widget->priv->context);
7110 if (gtk_widget_get_realized (widget) &&
7111 gtk_widget_get_has_window (widget) &&
7112 !gtk_widget_get_app_paintable (widget))
7113 gtk_style_context_set_background (widget->priv->context,
7114 widget->priv->window);
7116 if (widget->priv->anchored)
7118 if (changes && _gtk_css_style_property_changes_affect_size (changes))
7119 gtk_widget_queue_resize (widget);
7121 gtk_widget_queue_draw (widget);
7126 if (widget->priv->anchored)
7127 gtk_widget_queue_resize (widget);
7132 gtk_widget_real_show_help (GtkWidget *widget,
7133 GtkWidgetHelpType help_type)
7135 if (help_type == GTK_WIDGET_HELP_TOOLTIP)
7137 _gtk_tooltip_toggle_keyboard_mode (widget);
7146 gtk_widget_real_focus (GtkWidget *widget,
7147 GtkDirectionType direction)
7149 if (!gtk_widget_get_can_focus (widget))
7152 if (!gtk_widget_is_focus (widget))
7154 gtk_widget_grab_focus (widget);
7162 gtk_widget_real_move_focus (GtkWidget *widget,
7163 GtkDirectionType direction)
7165 GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
7167 if (widget != toplevel && GTK_IS_WINDOW (toplevel))
7169 g_signal_emit (toplevel, widget_signals[MOVE_FOCUS], 0,
7175 gtk_widget_real_keynav_failed (GtkWidget *widget,
7176 GtkDirectionType direction)
7178 gboolean cursor_only;
7182 case GTK_DIR_TAB_FORWARD:
7183 case GTK_DIR_TAB_BACKWARD:
7190 g_object_get (gtk_widget_get_settings (widget),
7191 "gtk-keynav-cursor-only", &cursor_only,
7198 gtk_widget_error_bell (widget);
7204 * gtk_widget_set_can_focus:
7205 * @widget: a #GtkWidget
7206 * @can_focus: whether or not @widget can own the input focus.
7208 * Specifies whether @widget can own the input focus. See
7209 * gtk_widget_grab_focus() for actually setting the input focus on a
7215 gtk_widget_set_can_focus (GtkWidget *widget,
7218 g_return_if_fail (GTK_IS_WIDGET (widget));
7220 if (widget->priv->can_focus != can_focus)
7222 widget->priv->can_focus = can_focus;
7224 gtk_widget_queue_resize (widget);
7225 g_object_notify (G_OBJECT (widget), "can-focus");
7230 * gtk_widget_get_can_focus:
7231 * @widget: a #GtkWidget
7233 * Determines whether @widget can own the input focus. See
7234 * gtk_widget_set_can_focus().
7236 * Return value: %TRUE if @widget can own the input focus, %FALSE otherwise
7241 gtk_widget_get_can_focus (GtkWidget *widget)
7243 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7245 return widget->priv->can_focus;
7249 * gtk_widget_has_focus:
7250 * @widget: a #GtkWidget
7252 * Determines if the widget has the global input focus. See
7253 * gtk_widget_is_focus() for the difference between having the global
7254 * input focus, and only having the focus within a toplevel.
7256 * Return value: %TRUE if the widget has the global input focus.
7261 gtk_widget_has_focus (GtkWidget *widget)
7263 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7265 return widget->priv->has_focus;
7269 * gtk_widget_has_visible_focus:
7270 * @widget: a #GtkWidget
7272 * Determines if the widget should show a visible indication that
7273 * it has the global input focus. This is a convenience function for
7274 * use in ::draw handlers that takes into account whether focus
7275 * indication should currently be shown in the toplevel window of
7276 * @widget. See gtk_window_get_focus_visible() for more information
7277 * about focus indication.
7279 * To find out if the widget has the global input focus, use
7280 * gtk_widget_has_focus().
7282 * Return value: %TRUE if the widget should display a 'focus rectangle'
7287 gtk_widget_has_visible_focus (GtkWidget *widget)
7289 gboolean draw_focus;
7291 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7293 if (widget->priv->has_focus)
7295 GtkWidget *toplevel;
7297 toplevel = gtk_widget_get_toplevel (widget);
7299 if (GTK_IS_WINDOW (toplevel))
7300 draw_focus = gtk_window_get_focus_visible (GTK_WINDOW (toplevel));
7311 * gtk_widget_is_focus:
7312 * @widget: a #GtkWidget
7314 * Determines if the widget is the focus widget within its
7315 * toplevel. (This does not mean that the %HAS_FOCUS flag is
7316 * necessarily set; %HAS_FOCUS will only be set if the
7317 * toplevel widget additionally has the global input focus.)
7319 * Return value: %TRUE if the widget is the focus widget.
7322 gtk_widget_is_focus (GtkWidget *widget)
7324 GtkWidget *toplevel;
7326 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7328 toplevel = gtk_widget_get_toplevel (widget);
7330 if (GTK_IS_WINDOW (toplevel))
7331 return widget == gtk_window_get_focus (GTK_WINDOW (toplevel));
7337 * gtk_widget_set_can_default:
7338 * @widget: a #GtkWidget
7339 * @can_default: whether or not @widget can be a default widget.
7341 * Specifies whether @widget can be a default widget. See
7342 * gtk_widget_grab_default() for details about the meaning of
7348 gtk_widget_set_can_default (GtkWidget *widget,
7349 gboolean can_default)
7351 g_return_if_fail (GTK_IS_WIDGET (widget));
7353 if (widget->priv->can_default != can_default)
7355 widget->priv->can_default = can_default;
7357 gtk_widget_queue_resize (widget);
7358 g_object_notify (G_OBJECT (widget), "can-default");
7363 * gtk_widget_get_can_default:
7364 * @widget: a #GtkWidget
7366 * Determines whether @widget can be a default widget. See
7367 * gtk_widget_set_can_default().
7369 * Return value: %TRUE if @widget can be a default widget, %FALSE otherwise
7374 gtk_widget_get_can_default (GtkWidget *widget)
7376 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7378 return widget->priv->can_default;
7382 * gtk_widget_has_default:
7383 * @widget: a #GtkWidget
7385 * Determines whether @widget is the current default widget within its
7386 * toplevel. See gtk_widget_set_can_default().
7388 * Return value: %TRUE if @widget is the current default widget within
7389 * its toplevel, %FALSE otherwise
7394 gtk_widget_has_default (GtkWidget *widget)
7396 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7398 return widget->priv->has_default;
7402 _gtk_widget_set_has_default (GtkWidget *widget,
7403 gboolean has_default)
7405 GtkStyleContext *context;
7407 widget->priv->has_default = has_default;
7409 context = gtk_widget_get_style_context (widget);
7412 gtk_style_context_add_class (context, GTK_STYLE_CLASS_DEFAULT);
7414 gtk_style_context_remove_class (context, GTK_STYLE_CLASS_DEFAULT);
7418 * gtk_widget_grab_default:
7419 * @widget: a #GtkWidget
7421 * Causes @widget to become the default widget. @widget must be able to be
7422 * a default widget; typically you would ensure this yourself
7423 * by calling gtk_widget_set_can_default() with a %TRUE value.
7424 * The default widget is activated when
7425 * the user presses Enter in a window. Default widgets must be
7426 * activatable, that is, gtk_widget_activate() should affect them. Note
7427 * that #GtkEntry widgets require the "activates-default" property
7428 * set to %TRUE before they activate the default widget when Enter
7429 * is pressed and the #GtkEntry is focused.
7432 gtk_widget_grab_default (GtkWidget *widget)
7436 g_return_if_fail (GTK_IS_WIDGET (widget));
7437 g_return_if_fail (gtk_widget_get_can_default (widget));
7439 window = gtk_widget_get_toplevel (widget);
7441 if (window && gtk_widget_is_toplevel (window))
7442 gtk_window_set_default (GTK_WINDOW (window), widget);
7444 g_warning (G_STRLOC ": widget not within a GtkWindow");
7448 * gtk_widget_set_receives_default:
7449 * @widget: a #GtkWidget
7450 * @receives_default: whether or not @widget can be a default widget.
7452 * Specifies whether @widget will be treated as the default widget
7453 * within its toplevel when it has the focus, even if another widget
7456 * See gtk_widget_grab_default() for details about the meaning of
7462 gtk_widget_set_receives_default (GtkWidget *widget,
7463 gboolean receives_default)
7465 g_return_if_fail (GTK_IS_WIDGET (widget));
7467 if (widget->priv->receives_default != receives_default)
7469 widget->priv->receives_default = receives_default;
7471 g_object_notify (G_OBJECT (widget), "receives-default");
7476 * gtk_widget_get_receives_default:
7477 * @widget: a #GtkWidget
7479 * Determines whether @widget is alyways treated as default widget
7480 * withing its toplevel when it has the focus, even if another widget
7483 * See gtk_widget_set_receives_default().
7485 * Return value: %TRUE if @widget acts as default widget when focussed,
7491 gtk_widget_get_receives_default (GtkWidget *widget)
7493 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7495 return widget->priv->receives_default;
7499 * gtk_widget_has_grab:
7500 * @widget: a #GtkWidget
7502 * Determines whether the widget is currently grabbing events, so it
7503 * is the only widget receiving input events (keyboard and mouse).
7505 * See also gtk_grab_add().
7507 * Return value: %TRUE if the widget is in the grab_widgets stack
7512 gtk_widget_has_grab (GtkWidget *widget)
7514 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7516 return widget->priv->has_grab;
7520 _gtk_widget_set_has_grab (GtkWidget *widget,
7523 widget->priv->has_grab = has_grab;
7527 * gtk_widget_device_is_shadowed:
7528 * @widget: a #GtkWidget
7529 * @device: a #GdkDevice
7531 * Returns %TRUE if @device has been shadowed by a GTK+
7532 * device grab on another widget, so it would stop sending
7533 * events to @widget. This may be used in the
7534 * #GtkWidget::grab-notify signal to check for specific
7535 * devices. See gtk_device_grab_add().
7537 * Returns: %TRUE if there is an ongoing grab on @device
7538 * by another #GtkWidget than @widget.
7543 gtk_widget_device_is_shadowed (GtkWidget *widget,
7546 GtkWindowGroup *group;
7547 GtkWidget *grab_widget, *toplevel;
7549 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7550 g_return_val_if_fail (GDK_IS_DEVICE (device), FALSE);
7552 if (!gtk_widget_get_realized (widget))
7555 toplevel = gtk_widget_get_toplevel (widget);
7557 if (GTK_IS_WINDOW (toplevel))
7558 group = gtk_window_get_group (GTK_WINDOW (toplevel));
7560 group = gtk_window_get_group (NULL);
7562 grab_widget = gtk_window_group_get_current_device_grab (group, device);
7564 /* Widget not inside the hierarchy of grab_widget */
7566 widget != grab_widget &&
7567 !gtk_widget_is_ancestor (widget, grab_widget))
7570 grab_widget = gtk_window_group_get_current_grab (group);
7571 if (grab_widget && widget != grab_widget &&
7572 !gtk_widget_is_ancestor (widget, grab_widget))
7579 * gtk_widget_set_name:
7580 * @widget: a #GtkWidget
7581 * @name: name for the widget
7583 * Widgets can be named, which allows you to refer to them from a
7584 * CSS file. You can apply a style to widgets with a particular name
7585 * in the CSS file. See the documentation for the CSS syntax (on the
7586 * same page as the docs for #GtkStyleContext).
7588 * Note that the CSS syntax has certain special characters to delimit
7589 * and represent elements in a selector (period, #, >, *...),
7590 * so using these will make your widget impossible to match by name.
7591 * Any combination of alphanumeric symbols, dashes and underscores will
7595 gtk_widget_set_name (GtkWidget *widget,
7598 GtkWidgetPrivate *priv;
7601 g_return_if_fail (GTK_IS_WIDGET (widget));
7603 priv = widget->priv;
7605 new_name = g_strdup (name);
7606 g_free (priv->name);
7607 priv->name = new_name;
7609 _gtk_widget_invalidate_style_context (widget, GTK_CSS_CHANGE_NAME);
7611 g_object_notify (G_OBJECT (widget), "name");
7615 * gtk_widget_get_name:
7616 * @widget: a #GtkWidget
7618 * Retrieves the name of a widget. See gtk_widget_set_name() for the
7619 * significance of widget names.
7621 * Return value: name of the widget. This string is owned by GTK+ and
7622 * should not be modified or freed
7625 gtk_widget_get_name (GtkWidget *widget)
7627 GtkWidgetPrivate *priv;
7629 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
7631 priv = widget->priv;
7635 return G_OBJECT_TYPE_NAME (widget);
7639 gtk_widget_update_state_flags (GtkWidget *widget,
7640 GtkStateFlags flags_to_set,
7641 GtkStateFlags flags_to_unset)
7643 GtkWidgetPrivate *priv;
7645 priv = widget->priv;
7647 /* Handle insensitive first, since it is propagated
7648 * differently throughout the widget hierarchy.
7650 if ((priv->state_flags & GTK_STATE_FLAG_INSENSITIVE) && (flags_to_unset & GTK_STATE_FLAG_INSENSITIVE))
7651 gtk_widget_set_sensitive (widget, TRUE);
7652 else if (!(priv->state_flags & GTK_STATE_FLAG_INSENSITIVE) && (flags_to_set & GTK_STATE_FLAG_INSENSITIVE))
7653 gtk_widget_set_sensitive (widget, FALSE);
7655 flags_to_set &= ~(GTK_STATE_FLAG_INSENSITIVE);
7656 flags_to_unset &= ~(GTK_STATE_FLAG_INSENSITIVE);
7658 if (flags_to_set != 0 || flags_to_unset != 0)
7662 data.flags_to_set = flags_to_set;
7663 data.flags_to_unset = flags_to_unset;
7665 gtk_widget_propagate_state (widget, &data);
7670 * gtk_widget_set_state_flags:
7671 * @widget: a #GtkWidget
7672 * @flags: State flags to turn on
7673 * @clear: Whether to clear state before turning on @flags
7675 * This function is for use in widget implementations. Turns on flag
7676 * values in the current widget state (insensitive, prelighted, etc.).
7678 * It is worth mentioning that any other state than %GTK_STATE_FLAG_INSENSITIVE,
7679 * will be propagated down to all non-internal children if @widget is a
7680 * #GtkContainer, while %GTK_STATE_FLAG_INSENSITIVE itself will be propagated
7681 * down to all #GtkContainer children by different means than turning on the
7682 * state flag down the hierarchy, both gtk_widget_get_state_flags() and
7683 * gtk_widget_is_sensitive() will make use of these.
7688 gtk_widget_set_state_flags (GtkWidget *widget,
7689 GtkStateFlags flags,
7692 g_return_if_fail (GTK_IS_WIDGET (widget));
7694 if ((!clear && (widget->priv->state_flags & flags) == flags) ||
7695 (clear && widget->priv->state_flags == flags))
7699 gtk_widget_update_state_flags (widget, flags, ~(flags ^ (GTK_STATE_FLAG_DIR_LTR | GTK_STATE_FLAG_DIR_RTL)));
7701 gtk_widget_update_state_flags (widget, flags, 0);
7705 * gtk_widget_unset_state_flags:
7706 * @widget: a #GtkWidget
7707 * @flags: State flags to turn off
7709 * This function is for use in widget implementations. Turns off flag
7710 * values for the current widget state (insensitive, prelighted, etc.).
7711 * See gtk_widget_set_state_flags().
7716 gtk_widget_unset_state_flags (GtkWidget *widget,
7717 GtkStateFlags flags)
7719 g_return_if_fail (GTK_IS_WIDGET (widget));
7721 if ((widget->priv->state_flags & flags) == 0)
7724 gtk_widget_update_state_flags (widget, 0, flags);
7728 * gtk_widget_get_state_flags:
7729 * @widget: a #GtkWidget
7731 * Returns the widget state as a flag set. It is worth mentioning
7732 * that the effective %GTK_STATE_FLAG_INSENSITIVE state will be
7733 * returned, that is, also based on parent insensitivity, even if
7734 * @widget itself is sensitive.
7736 * Returns: The state flags for widget
7741 gtk_widget_get_state_flags (GtkWidget *widget)
7743 GtkStateFlags flags;
7745 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
7747 flags = widget->priv->state_flags;
7749 if (gtk_widget_has_focus (widget))
7750 flags |= GTK_STATE_FLAG_FOCUSED;
7756 * gtk_widget_set_state:
7757 * @widget: a #GtkWidget
7758 * @state: new state for @widget
7760 * This function is for use in widget implementations. Sets the state
7761 * of a widget (insensitive, prelighted, etc.) Usually you should set
7762 * the state using wrapper functions such as gtk_widget_set_sensitive().
7764 * Deprecated: 3.0. Use gtk_widget_set_state_flags() instead.
7767 gtk_widget_set_state (GtkWidget *widget,
7770 GtkStateFlags flags;
7772 if (state == gtk_widget_get_state (widget))
7777 case GTK_STATE_ACTIVE:
7778 flags = GTK_STATE_FLAG_ACTIVE;
7780 case GTK_STATE_PRELIGHT:
7781 flags = GTK_STATE_FLAG_PRELIGHT;
7783 case GTK_STATE_SELECTED:
7784 flags = GTK_STATE_FLAG_SELECTED;
7786 case GTK_STATE_INSENSITIVE:
7787 flags = GTK_STATE_FLAG_INSENSITIVE;
7789 case GTK_STATE_INCONSISTENT:
7790 flags = GTK_STATE_FLAG_INCONSISTENT;
7792 case GTK_STATE_FOCUSED:
7793 flags = GTK_STATE_FLAG_FOCUSED;
7795 case GTK_STATE_NORMAL:
7801 gtk_widget_update_state_flags (widget,
7803 (GTK_STATE_FLAG_ACTIVE | GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_SELECTED
7804 | GTK_STATE_FLAG_INSENSITIVE | GTK_STATE_FLAG_INCONSISTENT | GTK_STATE_FLAG_FOCUSED) ^ flags);
7808 * gtk_widget_get_state:
7809 * @widget: a #GtkWidget
7811 * Returns the widget's state. See gtk_widget_set_state().
7813 * Returns: the state of @widget.
7817 * Deprecated: 3.0. Use gtk_widget_get_state_flags() instead.
7820 gtk_widget_get_state (GtkWidget *widget)
7822 GtkStateFlags flags;
7824 g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_STATE_NORMAL);
7826 flags = gtk_widget_get_state_flags (widget);
7828 if (flags & GTK_STATE_FLAG_INSENSITIVE)
7829 return GTK_STATE_INSENSITIVE;
7830 else if (flags & GTK_STATE_FLAG_ACTIVE)
7831 return GTK_STATE_ACTIVE;
7832 else if (flags & GTK_STATE_FLAG_SELECTED)
7833 return GTK_STATE_SELECTED;
7834 else if (flags & GTK_STATE_FLAG_PRELIGHT)
7835 return GTK_STATE_PRELIGHT;
7837 return GTK_STATE_NORMAL;
7841 * gtk_widget_set_visible:
7842 * @widget: a #GtkWidget
7843 * @visible: whether the widget should be shown or not
7845 * Sets the visibility state of @widget. Note that setting this to
7846 * %TRUE doesn't mean the widget is actually viewable, see
7847 * gtk_widget_get_visible().
7849 * This function simply calls gtk_widget_show() or gtk_widget_hide()
7850 * but is nicer to use when the visibility of the widget depends on
7856 gtk_widget_set_visible (GtkWidget *widget,
7859 g_return_if_fail (GTK_IS_WIDGET (widget));
7861 if (visible != gtk_widget_get_visible (widget))
7864 gtk_widget_show (widget);
7866 gtk_widget_hide (widget);
7871 _gtk_widget_set_visible_flag (GtkWidget *widget,
7874 GtkWidgetPrivate *priv = widget->priv;
7876 priv->visible = visible;
7880 priv->allocation.x = -1;
7881 priv->allocation.y = -1;
7882 priv->allocation.width = 1;
7883 priv->allocation.height = 1;
7888 * gtk_widget_get_visible:
7889 * @widget: a #GtkWidget
7891 * Determines whether the widget is visible. If you want to
7892 * take into account whether the widget's parent is also marked as
7893 * visible, use gtk_widget_is_visible() instead.
7895 * This function does not check if the widget is obscured in any way.
7897 * See gtk_widget_set_visible().
7899 * Return value: %TRUE if the widget is visible
7904 gtk_widget_get_visible (GtkWidget *widget)
7906 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7908 return widget->priv->visible;
7912 * gtk_widget_is_visible:
7913 * @widget: a #GtkWidget
7915 * Determines whether the widget and all its parents are marked as
7918 * This function does not check if the widget is obscured in any way.
7920 * See also gtk_widget_get_visible() and gtk_widget_set_visible()
7922 * Return value: %TRUE if the widget and all its parents are visible
7927 gtk_widget_is_visible (GtkWidget *widget)
7929 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7933 GtkWidgetPrivate *priv = widget->priv;
7938 widget = priv->parent;
7945 * gtk_widget_set_has_window:
7946 * @widget: a #GtkWidget
7947 * @has_window: whether or not @widget has a window.
7949 * Specifies whether @widget has a #GdkWindow of its own. Note that
7950 * all realized widgets have a non-%NULL "window" pointer
7951 * (gtk_widget_get_window() never returns a %NULL window when a widget
7952 * is realized), but for many of them it's actually the #GdkWindow of
7953 * one of its parent widgets. Widgets that do not create a %window for
7954 * themselves in #GtkWidget::realize must announce this by
7955 * calling this function with @has_window = %FALSE.
7957 * This function should only be called by widget implementations,
7958 * and they should call it in their init() function.
7963 gtk_widget_set_has_window (GtkWidget *widget,
7964 gboolean has_window)
7966 g_return_if_fail (GTK_IS_WIDGET (widget));
7968 widget->priv->no_window = !has_window;
7972 * gtk_widget_get_has_window:
7973 * @widget: a #GtkWidget
7975 * Determines whether @widget has a #GdkWindow of its own. See
7976 * gtk_widget_set_has_window().
7978 * Return value: %TRUE if @widget has a window, %FALSE otherwise
7983 gtk_widget_get_has_window (GtkWidget *widget)
7985 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
7987 return ! widget->priv->no_window;
7991 * gtk_widget_is_toplevel:
7992 * @widget: a #GtkWidget
7994 * Determines whether @widget is a toplevel widget.
7996 * Currently only #GtkWindow and #GtkInvisible (and out-of-process
7997 * #GtkPlugs) are toplevel widgets. Toplevel widgets have no parent
8000 * Return value: %TRUE if @widget is a toplevel, %FALSE otherwise
8005 gtk_widget_is_toplevel (GtkWidget *widget)
8007 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
8009 return widget->priv->toplevel;
8013 _gtk_widget_set_is_toplevel (GtkWidget *widget,
8014 gboolean is_toplevel)
8016 widget->priv->toplevel = is_toplevel;
8020 * gtk_widget_is_drawable:
8021 * @widget: a #GtkWidget
8023 * Determines whether @widget can be drawn to. A widget can be drawn
8024 * to if it is mapped and visible.
8026 * Return value: %TRUE if @widget is drawable, %FALSE otherwise
8031 gtk_widget_is_drawable (GtkWidget *widget)
8033 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
8035 return (gtk_widget_get_visible (widget) &&
8036 gtk_widget_get_mapped (widget));
8040 * gtk_widget_get_realized:
8041 * @widget: a #GtkWidget
8043 * Determines whether @widget is realized.
8045 * Return value: %TRUE if @widget is realized, %FALSE otherwise
8050 gtk_widget_get_realized (GtkWidget *widget)
8052 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
8054 return widget->priv->realized;
8058 * gtk_widget_set_realized:
8059 * @widget: a #GtkWidget
8060 * @realized: %TRUE to mark the widget as realized
8062 * Marks the widget as being realized.
8064 * This function should only ever be called in a derived widget's
8065 * "realize" or "unrealize" implementation.
8070 gtk_widget_set_realized (GtkWidget *widget,
8073 g_return_if_fail (GTK_IS_WIDGET (widget));
8075 widget->priv->realized = realized;
8079 * gtk_widget_get_mapped:
8080 * @widget: a #GtkWidget
8082 * Whether the widget is mapped.
8084 * Return value: %TRUE if the widget is mapped, %FALSE otherwise.
8089 gtk_widget_get_mapped (GtkWidget *widget)
8091 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
8093 return widget->priv->mapped;
8097 * gtk_widget_set_mapped:
8098 * @widget: a #GtkWidget
8099 * @mapped: %TRUE to mark the widget as mapped
8101 * Marks the widget as being realized.
8103 * This function should only ever be called in a derived widget's
8104 * "map" or "unmap" implementation.
8109 gtk_widget_set_mapped (GtkWidget *widget,
8112 g_return_if_fail (GTK_IS_WIDGET (widget));
8114 widget->priv->mapped = mapped;
8118 * gtk_widget_set_app_paintable:
8119 * @widget: a #GtkWidget
8120 * @app_paintable: %TRUE if the application will paint on the widget
8122 * Sets whether the application intends to draw on the widget in
8123 * an #GtkWidget::draw handler.
8125 * This is a hint to the widget and does not affect the behavior of
8126 * the GTK+ core; many widgets ignore this flag entirely. For widgets
8127 * that do pay attention to the flag, such as #GtkEventBox and #GtkWindow,
8128 * the effect is to suppress default themed drawing of the widget's
8129 * background. (Children of the widget will still be drawn.) The application
8130 * is then entirely responsible for drawing the widget background.
8132 * Note that the background is still drawn when the widget is mapped.
8135 gtk_widget_set_app_paintable (GtkWidget *widget,
8136 gboolean app_paintable)
8138 g_return_if_fail (GTK_IS_WIDGET (widget));
8140 app_paintable = (app_paintable != FALSE);
8142 if (widget->priv->app_paintable != app_paintable)
8144 widget->priv->app_paintable = app_paintable;
8146 if (gtk_widget_is_drawable (widget))
8147 gtk_widget_queue_draw (widget);
8149 g_object_notify (G_OBJECT (widget), "app-paintable");
8154 * gtk_widget_get_app_paintable:
8155 * @widget: a #GtkWidget
8157 * Determines whether the application intends to draw on the widget in
8158 * an #GtkWidget::draw handler.
8160 * See gtk_widget_set_app_paintable()
8162 * Return value: %TRUE if the widget is app paintable
8167 gtk_widget_get_app_paintable (GtkWidget *widget)
8169 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
8171 return widget->priv->app_paintable;
8175 * gtk_widget_set_double_buffered:
8176 * @widget: a #GtkWidget
8177 * @double_buffered: %TRUE to double-buffer a widget
8179 * Widgets are double buffered by default; you can use this function
8180 * to turn off the buffering. "Double buffered" simply means that
8181 * gdk_window_begin_paint_region() and gdk_window_end_paint() are called
8182 * automatically around expose events sent to the
8183 * widget. gdk_window_begin_paint_region() diverts all drawing to a widget's
8184 * window to an offscreen buffer, and gdk_window_end_paint() draws the
8185 * buffer to the screen. The result is that users see the window
8186 * update in one smooth step, and don't see individual graphics
8187 * primitives being rendered.
8189 * In very simple terms, double buffered widgets don't flicker,
8190 * so you would only use this function to turn off double buffering
8191 * if you had special needs and really knew what you were doing.
8193 * Note: if you turn off double-buffering, you have to handle
8194 * expose events, since even the clearing to the background color or
8195 * pixmap will not happen automatically (as it is done in
8196 * gdk_window_begin_paint_region()).
8199 gtk_widget_set_double_buffered (GtkWidget *widget,
8200 gboolean double_buffered)
8202 g_return_if_fail (GTK_IS_WIDGET (widget));
8204 double_buffered = (double_buffered != FALSE);
8206 if (widget->priv->double_buffered != double_buffered)
8208 widget->priv->double_buffered = double_buffered;
8210 g_object_notify (G_OBJECT (widget), "double-buffered");
8215 * gtk_widget_get_double_buffered:
8216 * @widget: a #GtkWidget
8218 * Determines whether the widget is double buffered.
8220 * See gtk_widget_set_double_buffered()
8222 * Return value: %TRUE if the widget is double buffered
8227 gtk_widget_get_double_buffered (GtkWidget *widget)
8229 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
8231 return widget->priv->double_buffered;
8235 * gtk_widget_set_redraw_on_allocate:
8236 * @widget: a #GtkWidget
8237 * @redraw_on_allocate: if %TRUE, the entire widget will be redrawn
8238 * when it is allocated to a new size. Otherwise, only the
8239 * new portion of the widget will be redrawn.
8241 * Sets whether the entire widget is queued for drawing when its size
8242 * allocation changes. By default, this setting is %TRUE and
8243 * the entire widget is redrawn on every size change. If your widget
8244 * leaves the upper left unchanged when made bigger, turning this
8245 * setting off will improve performance.
8247 * Note that for %NO_WINDOW widgets setting this flag to %FALSE turns
8248 * off all allocation on resizing: the widget will not even redraw if
8249 * its position changes; this is to allow containers that don't draw
8250 * anything to avoid excess invalidations. If you set this flag on a
8251 * %NO_WINDOW widget that <emphasis>does</emphasis> draw on @widget->window,
8252 * you are responsible for invalidating both the old and new allocation
8253 * of the widget when the widget is moved and responsible for invalidating
8254 * regions newly when the widget increases size.
8257 gtk_widget_set_redraw_on_allocate (GtkWidget *widget,
8258 gboolean redraw_on_allocate)
8260 g_return_if_fail (GTK_IS_WIDGET (widget));
8262 widget->priv->redraw_on_alloc = redraw_on_allocate;
8266 * gtk_widget_set_sensitive:
8267 * @widget: a #GtkWidget
8268 * @sensitive: %TRUE to make the widget sensitive
8270 * Sets the sensitivity of a widget. A widget is sensitive if the user
8271 * can interact with it. Insensitive widgets are "grayed out" and the
8272 * user can't interact with them. Insensitive widgets are known as
8273 * "inactive", "disabled", or "ghosted" in some other toolkits.
8276 gtk_widget_set_sensitive (GtkWidget *widget,
8279 GtkWidgetPrivate *priv;
8281 g_return_if_fail (GTK_IS_WIDGET (widget));
8283 priv = widget->priv;
8285 sensitive = (sensitive != FALSE);
8287 if (priv->sensitive == sensitive)
8290 priv->sensitive = sensitive;
8292 if (priv->parent == NULL
8293 || gtk_widget_is_sensitive (priv->parent))
8299 data.flags_to_set = 0;
8300 data.flags_to_unset = GTK_STATE_FLAG_INSENSITIVE;
8304 data.flags_to_set = GTK_STATE_FLAG_INSENSITIVE;
8305 data.flags_to_unset = 0;
8308 gtk_widget_propagate_state (widget, &data);
8310 gtk_widget_queue_resize (widget);
8313 g_object_notify (G_OBJECT (widget), "sensitive");
8317 * gtk_widget_get_sensitive:
8318 * @widget: a #GtkWidget
8320 * Returns the widget's sensitivity (in the sense of returning
8321 * the value that has been set using gtk_widget_set_sensitive()).
8323 * The effective sensitivity of a widget is however determined by both its
8324 * own and its parent widget's sensitivity. See gtk_widget_is_sensitive().
8326 * Returns: %TRUE if the widget is sensitive
8331 gtk_widget_get_sensitive (GtkWidget *widget)
8333 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
8335 return widget->priv->sensitive;
8339 * gtk_widget_is_sensitive:
8340 * @widget: a #GtkWidget
8342 * Returns the widget's effective sensitivity, which means
8343 * it is sensitive itself and also its parent widget is sensitive
8345 * Returns: %TRUE if the widget is effectively sensitive
8350 gtk_widget_is_sensitive (GtkWidget *widget)
8352 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
8354 return !(widget->priv->state_flags & GTK_STATE_FLAG_INSENSITIVE);
8358 * gtk_widget_set_parent:
8359 * @widget: a #GtkWidget
8360 * @parent: parent container
8362 * This function is useful only when implementing subclasses of
8364 * Sets the container as the parent of @widget, and takes care of
8365 * some details such as updating the state and style of the child
8366 * to reflect its new location. The opposite function is
8367 * gtk_widget_unparent().
8370 gtk_widget_set_parent (GtkWidget *widget,
8373 GtkStateFlags parent_flags;
8374 GtkWidgetPrivate *priv;
8377 g_return_if_fail (GTK_IS_WIDGET (widget));
8378 g_return_if_fail (GTK_IS_WIDGET (parent));
8379 g_return_if_fail (widget != parent);
8381 priv = widget->priv;
8383 if (priv->parent != NULL)
8385 g_warning ("Can't set a parent on widget which has a parent\n");
8388 if (gtk_widget_is_toplevel (widget))
8390 g_warning ("Can't set a parent on a toplevel widget\n");
8394 /* keep this function in sync with gtk_menu_attach_to_widget()
8397 g_object_ref_sink (widget);
8399 gtk_widget_push_verify_invariants (widget);
8401 priv->parent = parent;
8403 parent_flags = gtk_widget_get_state_flags (parent);
8405 /* Merge both old state and current parent state,
8406 * making sure to only propagate the right states */
8407 data.flags_to_set = parent_flags & GTK_STATE_FLAGS_DO_PROPAGATE;
8408 data.flags_to_unset = 0;
8409 gtk_widget_propagate_state (widget, &data);
8412 gtk_style_context_set_parent (priv->context,
8413 gtk_widget_get_style_context (parent));
8415 _gtk_widget_update_parent_muxer (widget);
8417 g_signal_emit (widget, widget_signals[PARENT_SET], 0, NULL);
8418 if (priv->parent->priv->anchored)
8419 _gtk_widget_propagate_hierarchy_changed (widget, NULL);
8420 g_object_notify (G_OBJECT (widget), "parent");
8422 /* Enforce realized/mapped invariants
8424 if (gtk_widget_get_realized (priv->parent))
8425 gtk_widget_realize (widget);
8427 if (gtk_widget_get_visible (priv->parent) &&
8428 gtk_widget_get_visible (widget))
8430 if (gtk_widget_get_child_visible (widget) &&
8431 gtk_widget_get_mapped (priv->parent))
8432 gtk_widget_map (widget);
8434 gtk_widget_queue_resize (widget);
8437 /* child may cause parent's expand to change, if the child is
8438 * expanded. If child is not expanded, then it can't modify the
8439 * parent's expand. If the child becomes expanded later then it will
8440 * queue compute_expand then. This optimization plus defaulting
8441 * newly-constructed widgets to need_compute_expand=FALSE should
8442 * mean that initially building a widget tree doesn't have to keep
8443 * walking up setting need_compute_expand on parents over and over.
8445 * We can't change a parent to need to expand unless we're visible.
8447 if (gtk_widget_get_visible (widget) &&
8448 (priv->need_compute_expand ||
8449 priv->computed_hexpand ||
8450 priv->computed_vexpand))
8452 gtk_widget_queue_compute_expand (parent);
8455 gtk_widget_propagate_alpha (widget);
8457 gtk_widget_pop_verify_invariants (widget);
8461 * gtk_widget_get_parent:
8462 * @widget: a #GtkWidget
8464 * Returns the parent container of @widget.
8466 * Return value: (transfer none): the parent container of @widget, or %NULL
8469 gtk_widget_get_parent (GtkWidget *widget)
8471 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
8473 return widget->priv->parent;
8477 modifier_style_changed (GtkModifierStyle *style,
8480 _gtk_widget_invalidate_style_context (widget, GTK_CSS_CHANGE_ANY);
8483 static GtkModifierStyle *
8484 _gtk_widget_get_modifier_properties (GtkWidget *widget)
8486 GtkModifierStyle *style;
8488 style = g_object_get_qdata (G_OBJECT (widget), quark_modifier_style);
8490 if (G_UNLIKELY (!style))
8492 GtkStyleContext *context;
8494 style = _gtk_modifier_style_new ();
8495 g_object_set_qdata_full (G_OBJECT (widget),
8496 quark_modifier_style,
8498 (GDestroyNotify) g_object_unref);
8500 g_signal_connect (style, "changed",
8501 G_CALLBACK (modifier_style_changed), widget);
8503 context = gtk_widget_get_style_context (widget);
8505 gtk_style_context_add_provider (context,
8506 GTK_STYLE_PROVIDER (style),
8507 GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
8514 * gtk_widget_override_color:
8515 * @widget: a #GtkWidget
8516 * @state: the state for which to set the color
8517 * @color: (allow-none): the color to assign, or %NULL to undo the effect
8518 * of previous calls to gtk_widget_override_color()
8520 * Sets the color to use for a widget.
8522 * All other style values are left untouched.
8525 * This API is mostly meant as a quick way for applications to
8526 * change a widget appearance. If you are developing a widgets
8527 * library and intend this change to be themeable, it is better
8528 * done by setting meaningful CSS classes and regions in your
8529 * widget/container implementation through gtk_style_context_add_class()
8530 * and gtk_style_context_add_region().
8532 * This way, your widget library can install a #GtkCssProvider
8533 * with the %GTK_STYLE_PROVIDER_PRIORITY_FALLBACK priority in order
8534 * to provide a default styling for those widgets that need so, and
8535 * this theming may fully overridden by the user's theme.
8538 * Note that for complex widgets this may bring in undesired
8539 * results (such as uniform background color everywhere), in
8540 * these cases it is better to fully style such widgets through a
8541 * #GtkCssProvider with the %GTK_STYLE_PROVIDER_PRIORITY_APPLICATION
8548 gtk_widget_override_color (GtkWidget *widget,
8549 GtkStateFlags state,
8550 const GdkRGBA *color)
8552 GtkModifierStyle *style;
8554 g_return_if_fail (GTK_IS_WIDGET (widget));
8556 style = _gtk_widget_get_modifier_properties (widget);
8557 _gtk_modifier_style_set_color (style, state, color);
8561 * gtk_widget_override_background_color:
8562 * @widget: a #GtkWidget
8563 * @state: the state for which to set the background color
8564 * @color: (allow-none): the color to assign, or %NULL to undo the effect
8565 * of previous calls to gtk_widget_override_background_color()
8567 * Sets the background color to use for a widget.
8569 * All other style values are left untouched.
8570 * See gtk_widget_override_color().
8575 gtk_widget_override_background_color (GtkWidget *widget,
8576 GtkStateFlags state,
8577 const GdkRGBA *color)
8579 GtkModifierStyle *style;
8581 g_return_if_fail (GTK_IS_WIDGET (widget));
8583 style = _gtk_widget_get_modifier_properties (widget);
8584 _gtk_modifier_style_set_background_color (style, state, color);
8588 * gtk_widget_override_font:
8589 * @widget: a #GtkWidget
8590 * @font_desc: (allow-none): the font descriptiong to use, or %NULL to undo
8591 * the effect of previous calls to gtk_widget_override_font()
8593 * Sets the font to use for a widget. All other style values are
8594 * left untouched. See gtk_widget_override_color().
8599 gtk_widget_override_font (GtkWidget *widget,
8600 const PangoFontDescription *font_desc)
8602 GtkModifierStyle *style;
8604 g_return_if_fail (GTK_IS_WIDGET (widget));
8606 style = _gtk_widget_get_modifier_properties (widget);
8607 _gtk_modifier_style_set_font (style, font_desc);
8611 * gtk_widget_override_symbolic_color:
8612 * @widget: a #GtkWidget
8613 * @name: the name of the symbolic color to modify
8614 * @color: (allow-none): the color to assign (does not need
8615 * to be allocated), or %NULL to undo the effect of previous
8616 * calls to gtk_widget_override_symbolic_color()
8618 * Sets a symbolic color for a widget.
8620 * All other style values are left untouched.
8621 * See gtk_widget_override_color() for overriding the foreground
8622 * or background color.
8627 gtk_widget_override_symbolic_color (GtkWidget *widget,
8629 const GdkRGBA *color)
8631 GtkModifierStyle *style;
8633 g_return_if_fail (GTK_IS_WIDGET (widget));
8635 style = _gtk_widget_get_modifier_properties (widget);
8636 _gtk_modifier_style_map_color (style, name, color);
8640 * gtk_widget_override_cursor:
8641 * @widget: a #GtkWidget
8642 * @cursor: (allow-none): the color to use for primary cursor (does not need to be
8643 * allocated), or %NULL to undo the effect of previous calls to
8644 * of gtk_widget_override_cursor().
8645 * @secondary_cursor: (allow-none): the color to use for secondary cursor (does not
8646 * need to be allocated), or %NULL to undo the effect of previous
8647 * calls to of gtk_widget_override_cursor().
8649 * Sets the cursor color to use in a widget, overriding the
8650 * #GtkWidget:cursor-color and #GtkWidget:secondary-cursor-color
8651 * style properties. All other style values are left untouched.
8652 * See also gtk_widget_modify_style().
8654 * Note that the underlying properties have the #GdkColor type,
8655 * so the alpha value in @primary and @secondary will be ignored.
8660 gtk_widget_override_cursor (GtkWidget *widget,
8661 const GdkRGBA *cursor,
8662 const GdkRGBA *secondary_cursor)
8664 GtkModifierStyle *style;
8666 g_return_if_fail (GTK_IS_WIDGET (widget));
8668 style = _gtk_widget_get_modifier_properties (widget);
8669 _gtk_modifier_style_set_color_property (style,
8671 "cursor-color", cursor);
8672 _gtk_modifier_style_set_color_property (style,
8674 "secondary-cursor-color",
8679 gtk_widget_real_direction_changed (GtkWidget *widget,
8680 GtkTextDirection previous_direction)
8682 gtk_widget_queue_resize (widget);
8686 gtk_widget_real_style_set (GtkWidget *widget,
8687 GtkStyle *previous_style)
8692 GtkWidget *previous_toplevel;
8693 GdkScreen *previous_screen;
8694 GdkScreen *new_screen;
8695 } HierarchyChangedInfo;
8698 do_screen_change (GtkWidget *widget,
8699 GdkScreen *old_screen,
8700 GdkScreen *new_screen)
8702 if (old_screen != new_screen)
8704 GtkWidgetPrivate *priv = widget->priv;
8708 PangoContext *context = g_object_get_qdata (G_OBJECT (widget), quark_pango_context);
8710 g_object_set_qdata (G_OBJECT (widget), quark_pango_context, NULL);
8713 _gtk_tooltip_hide (widget);
8715 if (new_screen && priv->context)
8716 gtk_style_context_set_screen (priv->context, new_screen);
8718 g_signal_emit (widget, widget_signals[SCREEN_CHANGED], 0, old_screen);
8723 gtk_widget_propagate_hierarchy_changed_recurse (GtkWidget *widget,
8724 gpointer client_data)
8726 GtkWidgetPrivate *priv = widget->priv;
8727 HierarchyChangedInfo *info = client_data;
8728 gboolean new_anchored = gtk_widget_is_toplevel (widget) ||
8729 (priv->parent && priv->parent->priv->anchored);
8731 if (priv->anchored != new_anchored)
8733 g_object_ref (widget);
8735 priv->anchored = new_anchored;
8737 /* This can only happen with gtk_widget_reparent() */
8741 gtk_widget_connect_frame_clock (widget,
8742 gtk_widget_get_frame_clock (widget));
8744 gtk_widget_disconnect_frame_clock (widget,
8745 gtk_widget_get_frame_clock (info->previous_toplevel));
8748 g_signal_emit (widget, widget_signals[HIERARCHY_CHANGED], 0, info->previous_toplevel);
8749 do_screen_change (widget, info->previous_screen, info->new_screen);
8751 if (GTK_IS_CONTAINER (widget))
8752 gtk_container_forall (GTK_CONTAINER (widget),
8753 gtk_widget_propagate_hierarchy_changed_recurse,
8756 g_object_unref (widget);
8761 * _gtk_widget_propagate_hierarchy_changed:
8762 * @widget: a #GtkWidget
8763 * @previous_toplevel: Previous toplevel
8765 * Propagates changes in the anchored state to a widget and all
8766 * children, unsetting or setting the %ANCHORED flag, and
8767 * emitting #GtkWidget::hierarchy-changed.
8770 _gtk_widget_propagate_hierarchy_changed (GtkWidget *widget,
8771 GtkWidget *previous_toplevel)
8773 GtkWidgetPrivate *priv = widget->priv;
8774 HierarchyChangedInfo info;
8776 info.previous_toplevel = previous_toplevel;
8777 info.previous_screen = previous_toplevel ? gtk_widget_get_screen (previous_toplevel) : NULL;
8779 if (gtk_widget_is_toplevel (widget) ||
8780 (priv->parent && priv->parent->priv->anchored))
8781 info.new_screen = gtk_widget_get_screen (widget);
8783 info.new_screen = NULL;
8785 if (info.previous_screen)
8786 g_object_ref (info.previous_screen);
8787 if (previous_toplevel)
8788 g_object_ref (previous_toplevel);
8790 gtk_widget_propagate_hierarchy_changed_recurse (widget, &info);
8792 if (previous_toplevel)
8793 g_object_unref (previous_toplevel);
8794 if (info.previous_screen)
8795 g_object_unref (info.previous_screen);
8799 gtk_widget_propagate_screen_changed_recurse (GtkWidget *widget,
8800 gpointer client_data)
8802 HierarchyChangedInfo *info = client_data;
8804 g_object_ref (widget);
8806 do_screen_change (widget, info->previous_screen, info->new_screen);
8808 if (GTK_IS_CONTAINER (widget))
8809 gtk_container_forall (GTK_CONTAINER (widget),
8810 gtk_widget_propagate_screen_changed_recurse,
8813 g_object_unref (widget);
8817 * gtk_widget_is_composited:
8818 * @widget: a #GtkWidget
8820 * Whether @widget can rely on having its alpha channel
8821 * drawn correctly. On X11 this function returns whether a
8822 * compositing manager is running for @widget's screen.
8824 * Please note that the semantics of this call will change
8825 * in the future if used on a widget that has a composited
8826 * window in its hierarchy (as set by gdk_window_set_composited()).
8828 * Return value: %TRUE if the widget can rely on its alpha
8829 * channel being drawn correctly.
8834 gtk_widget_is_composited (GtkWidget *widget)
8838 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
8840 screen = gtk_widget_get_screen (widget);
8842 return gdk_screen_is_composited (screen);
8846 propagate_composited_changed (GtkWidget *widget,
8849 if (GTK_IS_CONTAINER (widget))
8851 gtk_container_forall (GTK_CONTAINER (widget),
8852 propagate_composited_changed,
8856 g_signal_emit (widget, widget_signals[COMPOSITED_CHANGED], 0);
8860 _gtk_widget_propagate_composited_changed (GtkWidget *widget)
8862 propagate_composited_changed (widget, NULL);
8866 * _gtk_widget_propagate_screen_changed:
8867 * @widget: a #GtkWidget
8868 * @previous_screen: Previous screen
8870 * Propagates changes in the screen for a widget to all
8871 * children, emitting #GtkWidget::screen-changed.
8874 _gtk_widget_propagate_screen_changed (GtkWidget *widget,
8875 GdkScreen *previous_screen)
8877 HierarchyChangedInfo info;
8879 info.previous_screen = previous_screen;
8880 info.new_screen = gtk_widget_get_screen (widget);
8882 if (previous_screen)
8883 g_object_ref (previous_screen);
8885 gtk_widget_propagate_screen_changed_recurse (widget, &info);
8887 if (previous_screen)
8888 g_object_unref (previous_screen);
8892 reset_style_recurse (GtkWidget *widget, gpointer data)
8894 _gtk_widget_invalidate_style_context (widget, GTK_CSS_CHANGE_ANY);
8896 if (GTK_IS_CONTAINER (widget))
8897 gtk_container_forall (GTK_CONTAINER (widget),
8898 reset_style_recurse,
8903 * gtk_widget_reset_style:
8904 * @widget: a #GtkWidget
8906 * Updates the style context of @widget and all descendents
8907 * by updating its widget path. #GtkContainer<!-- -->s may want
8908 * to use this on a child when reordering it in a way that a different
8909 * style might apply to it. See also gtk_container_get_path_for_child().
8914 gtk_widget_reset_style (GtkWidget *widget)
8916 g_return_if_fail (GTK_IS_WIDGET (widget));
8918 reset_style_recurse (widget, NULL);
8920 g_list_foreach (widget->priv->attached_windows,
8921 (GFunc) reset_style_recurse, NULL);
8924 #ifdef G_ENABLE_DEBUG
8926 /* Verify invariants, see docs/widget_system.txt for notes on much of
8927 * this. Invariants may be temporarily broken while we're in the
8928 * process of updating state, of course, so you can only
8929 * verify_invariants() after a given operation is complete.
8930 * Use push/pop_verify_invariants to help with that.
8933 gtk_widget_verify_invariants (GtkWidget *widget)
8937 if (widget->priv->verifying_invariants_count > 0)
8940 parent = widget->priv->parent;
8942 if (widget->priv->mapped)
8944 /* Mapped implies ... */
8946 if (!widget->priv->realized)
8947 g_warning ("%s %p is mapped but not realized",
8948 G_OBJECT_TYPE_NAME (widget), widget);
8950 if (!widget->priv->visible)
8951 g_warning ("%s %p is mapped but not visible",
8952 G_OBJECT_TYPE_NAME (widget), widget);
8954 if (!widget->priv->toplevel)
8956 if (!widget->priv->child_visible)
8957 g_warning ("%s %p is mapped but not child_visible",
8958 G_OBJECT_TYPE_NAME (widget), widget);
8963 /* Not mapped implies... */
8966 /* This check makes sense for normal toplevels, but for
8967 * something like a toplevel that is embedded within a clutter
8968 * state, mapping may depend on external factors.
8970 if (widget->priv->toplevel)
8972 if (widget->priv->visible)
8973 g_warning ("%s %p toplevel is visible but not mapped",
8974 G_OBJECT_TYPE_NAME (widget), widget);
8979 /* Parent related checks aren't possible if parent has
8980 * verifying_invariants_count > 0 because parent needs to recurse
8981 * children first before the invariants will hold.
8983 if (parent == NULL || parent->priv->verifying_invariants_count == 0)
8986 parent->priv->realized)
8988 /* Parent realized implies... */
8991 /* This is in widget_system.txt but appears to fail
8992 * because there's no gtk_container_realize() that
8993 * realizes all children... instead we just lazily
8994 * wait for map to fix things up.
8996 if (!widget->priv->realized)
8997 g_warning ("%s %p is realized but child %s %p is not realized",
8998 G_OBJECT_TYPE_NAME (parent), parent,
8999 G_OBJECT_TYPE_NAME (widget), widget);
9002 else if (!widget->priv->toplevel)
9004 /* No parent or parent not realized on non-toplevel implies... */
9006 if (widget->priv->realized && !widget->priv->in_reparent)
9007 g_warning ("%s %p is not realized but child %s %p is realized",
9008 parent ? G_OBJECT_TYPE_NAME (parent) : "no parent", parent,
9009 G_OBJECT_TYPE_NAME (widget), widget);
9013 parent->priv->mapped &&
9014 widget->priv->visible &&
9015 widget->priv->child_visible)
9017 /* Parent mapped and we are visible implies... */
9019 if (!widget->priv->mapped)
9020 g_warning ("%s %p is mapped but visible child %s %p is not mapped",
9021 G_OBJECT_TYPE_NAME (parent), parent,
9022 G_OBJECT_TYPE_NAME (widget), widget);
9024 else if (!widget->priv->toplevel)
9026 /* No parent or parent not mapped on non-toplevel implies... */
9028 if (widget->priv->mapped && !widget->priv->in_reparent)
9029 g_warning ("%s %p is mapped but visible=%d child_visible=%d parent %s %p mapped=%d",
9030 G_OBJECT_TYPE_NAME (widget), widget,
9031 widget->priv->visible,
9032 widget->priv->child_visible,
9033 parent ? G_OBJECT_TYPE_NAME (parent) : "no parent", parent,
9034 parent ? parent->priv->mapped : FALSE);
9038 if (!widget->priv->realized)
9040 /* Not realized implies... */
9043 /* widget_system.txt says these hold, but they don't. */
9044 if (widget->priv->alloc_needed)
9045 g_warning ("%s %p alloc needed but not realized",
9046 G_OBJECT_TYPE_NAME (widget), widget);
9048 if (widget->priv->width_request_needed)
9049 g_warning ("%s %p width request needed but not realized",
9050 G_OBJECT_TYPE_NAME (widget), widget);
9052 if (widget->priv->height_request_needed)
9053 g_warning ("%s %p height request needed but not realized",
9054 G_OBJECT_TYPE_NAME (widget), widget);
9059 /* The point of this push/pop is that invariants may not hold while
9060 * we're busy making changes. So we only check at the outermost call
9061 * on the call stack, after we finish updating everything.
9064 gtk_widget_push_verify_invariants (GtkWidget *widget)
9066 widget->priv->verifying_invariants_count += 1;
9070 gtk_widget_verify_child_invariants (GtkWidget *widget,
9071 gpointer client_data)
9073 /* We don't recurse further; this is a one-level check. */
9074 gtk_widget_verify_invariants (widget);
9078 gtk_widget_pop_verify_invariants (GtkWidget *widget)
9080 g_assert (widget->priv->verifying_invariants_count > 0);
9082 widget->priv->verifying_invariants_count -= 1;
9084 if (widget->priv->verifying_invariants_count == 0)
9086 gtk_widget_verify_invariants (widget);
9088 if (GTK_IS_CONTAINER (widget))
9090 /* Check one level of children, because our
9091 * push_verify_invariants() will have prevented some of the
9092 * checks. This does not recurse because if recursion is
9093 * needed, it will happen naturally as each child has a
9094 * push/pop on that child. For example if we're recursively
9095 * mapping children, we'll push/pop on each child as we map
9098 gtk_container_forall (GTK_CONTAINER (widget),
9099 gtk_widget_verify_child_invariants,
9104 #endif /* G_ENABLE_DEBUG */
9106 static PangoContext *
9107 gtk_widget_peek_pango_context (GtkWidget *widget)
9109 return g_object_get_qdata (G_OBJECT (widget), quark_pango_context);
9113 * gtk_widget_get_pango_context:
9114 * @widget: a #GtkWidget
9116 * Gets a #PangoContext with the appropriate font map, font description,
9117 * and base direction for this widget. Unlike the context returned
9118 * by gtk_widget_create_pango_context(), this context is owned by
9119 * the widget (it can be used until the screen for the widget changes
9120 * or the widget is removed from its toplevel), and will be updated to
9121 * match any changes to the widget's attributes. This can be tracked
9122 * by using the #GtkWidget::screen-changed signal on the widget.
9124 * Return value: (transfer none): the #PangoContext for the widget.
9127 gtk_widget_get_pango_context (GtkWidget *widget)
9129 PangoContext *context;
9131 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9133 context = g_object_get_qdata (G_OBJECT (widget), quark_pango_context);
9136 context = gtk_widget_create_pango_context (GTK_WIDGET (widget));
9137 g_object_set_qdata_full (G_OBJECT (widget),
9138 quark_pango_context,
9147 update_pango_context (GtkWidget *widget,
9148 PangoContext *context)
9150 PangoFontDescription *font_desc;
9151 GtkStyleContext *style_context;
9153 style_context = gtk_widget_get_style_context (widget);
9154 gtk_style_context_get (style_context,
9155 gtk_widget_get_state_flags (widget),
9159 pango_context_set_font_description (context, font_desc);
9160 pango_context_set_base_dir (context,
9161 gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ?
9162 PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL);
9164 pango_font_description_free (font_desc);
9168 gtk_widget_update_pango_context (GtkWidget *widget)
9170 PangoContext *context = gtk_widget_peek_pango_context (widget);
9176 update_pango_context (widget, context);
9178 screen = gtk_widget_get_screen_unchecked (widget);
9181 pango_cairo_context_set_resolution (context,
9182 gdk_screen_get_resolution (screen));
9183 pango_cairo_context_set_font_options (context,
9184 gdk_screen_get_font_options (screen));
9190 * gtk_widget_create_pango_context:
9191 * @widget: a #GtkWidget
9193 * Creates a new #PangoContext with the appropriate font map,
9194 * font description, and base direction for drawing text for
9195 * this widget. See also gtk_widget_get_pango_context().
9197 * Return value: (transfer full): the new #PangoContext
9200 gtk_widget_create_pango_context (GtkWidget *widget)
9203 PangoContext *context;
9205 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9207 screen = gtk_widget_get_screen_unchecked (widget);
9210 GTK_NOTE (MULTIHEAD,
9211 g_warning ("gtk_widget_create_pango_context ()) called without screen"));
9213 screen = gdk_screen_get_default ();
9216 context = gdk_pango_context_get_for_screen (screen);
9218 update_pango_context (widget, context);
9219 pango_context_set_language (context, gtk_get_default_language ());
9225 * gtk_widget_create_pango_layout:
9226 * @widget: a #GtkWidget
9227 * @text: text to set on the layout (can be %NULL)
9229 * Creates a new #PangoLayout with the appropriate font map,
9230 * font description, and base direction for drawing text for
9233 * If you keep a #PangoLayout created in this way around, you need
9234 * to re-create it when the widget #PangoContext is replaced.
9235 * This can be tracked by using the #GtkWidget::screen-changed signal
9238 * Return value: (transfer full): the new #PangoLayout
9241 gtk_widget_create_pango_layout (GtkWidget *widget,
9244 PangoLayout *layout;
9245 PangoContext *context;
9247 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9249 context = gtk_widget_get_pango_context (widget);
9250 layout = pango_layout_new (context);
9253 pango_layout_set_text (layout, text, -1);
9259 * gtk_widget_render_icon_pixbuf:
9260 * @widget: a #GtkWidget
9261 * @stock_id: a stock ID
9262 * @size: (type int): a stock size. A size of (GtkIconSize)-1 means
9263 * render at the size of the source and don't scale (if there are
9264 * multiple source sizes, GTK+ picks one of the available sizes).
9266 * A convenience function that uses the theme engine and style
9267 * settings for @widget to look up @stock_id and render it to
9268 * a pixbuf. @stock_id should be a stock icon ID such as
9269 * #GTK_STOCK_OPEN or #GTK_STOCK_OK. @size should be a size
9270 * such as #GTK_ICON_SIZE_MENU.
9272 * The pixels in the returned #GdkPixbuf are shared with the rest of
9273 * the application and should not be modified. The pixbuf should be freed
9274 * after use with g_object_unref().
9276 * Return value: (transfer full): a new pixbuf, or %NULL if the
9277 * stock ID wasn't known
9282 gtk_widget_render_icon_pixbuf (GtkWidget *widget,
9283 const gchar *stock_id,
9286 GtkStyleContext *context;
9287 GtkIconSet *icon_set;
9289 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9290 g_return_val_if_fail (stock_id != NULL, NULL);
9291 g_return_val_if_fail (size > GTK_ICON_SIZE_INVALID || size == -1, NULL);
9293 context = gtk_widget_get_style_context (widget);
9294 icon_set = gtk_style_context_lookup_icon_set (context, stock_id);
9296 if (icon_set == NULL)
9299 return gtk_icon_set_render_icon_pixbuf (icon_set, context, size);
9303 * gtk_widget_set_parent_window:
9304 * @widget: a #GtkWidget.
9305 * @parent_window: the new parent window.
9307 * Sets a non default parent window for @widget.
9309 * For GtkWindow classes, setting a @parent_window effects whether
9310 * the window is a toplevel window or can be embedded into other
9314 * For GtkWindow classes, this needs to be called before the
9315 * window is realized.
9320 gtk_widget_set_parent_window (GtkWidget *widget,
9321 GdkWindow *parent_window)
9323 GdkWindow *old_parent_window;
9325 g_return_if_fail (GTK_IS_WIDGET (widget));
9327 old_parent_window = g_object_get_qdata (G_OBJECT (widget),
9328 quark_parent_window);
9330 if (parent_window != old_parent_window)
9334 g_object_set_qdata (G_OBJECT (widget), quark_parent_window,
9336 if (old_parent_window)
9337 g_object_unref (old_parent_window);
9339 g_object_ref (parent_window);
9341 /* Unset toplevel flag when adding a parent window to a widget,
9342 * this is the primary entry point to allow toplevels to be
9345 #ifdef GDK_WINDOWING_X11
9346 is_plug = GTK_IS_PLUG (widget);
9350 if (GTK_IS_WINDOW (widget) && !is_plug)
9351 _gtk_window_set_is_toplevel (GTK_WINDOW (widget), parent_window == NULL);
9356 * gtk_widget_get_parent_window:
9357 * @widget: a #GtkWidget.
9359 * Gets @widget's parent window.
9361 * Returns: (transfer none): the parent window of @widget.
9364 gtk_widget_get_parent_window (GtkWidget *widget)
9366 GtkWidgetPrivate *priv;
9367 GdkWindow *parent_window;
9369 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9371 priv = widget->priv;
9373 parent_window = g_object_get_qdata (G_OBJECT (widget), quark_parent_window);
9375 return (parent_window != NULL) ? parent_window :
9376 (priv->parent != NULL) ? priv->parent->priv->window : NULL;
9381 * gtk_widget_set_child_visible:
9382 * @widget: a #GtkWidget
9383 * @is_visible: if %TRUE, @widget should be mapped along with its parent.
9385 * Sets whether @widget should be mapped along with its when its parent
9386 * is mapped and @widget has been shown with gtk_widget_show().
9388 * The child visibility can be set for widget before it is added to
9389 * a container with gtk_widget_set_parent(), to avoid mapping
9390 * children unnecessary before immediately unmapping them. However
9391 * it will be reset to its default state of %TRUE when the widget
9392 * is removed from a container.
9394 * Note that changing the child visibility of a widget does not
9395 * queue a resize on the widget. Most of the time, the size of
9396 * a widget is computed from all visible children, whether or
9397 * not they are mapped. If this is not the case, the container
9398 * can queue a resize itself.
9400 * This function is only useful for container implementations and
9401 * never should be called by an application.
9404 gtk_widget_set_child_visible (GtkWidget *widget,
9405 gboolean is_visible)
9407 GtkWidgetPrivate *priv;
9409 g_return_if_fail (GTK_IS_WIDGET (widget));
9410 g_return_if_fail (!gtk_widget_is_toplevel (widget));
9412 priv = widget->priv;
9414 g_object_ref (widget);
9415 gtk_widget_verify_invariants (widget);
9418 priv->child_visible = TRUE;
9421 GtkWidget *toplevel;
9423 priv->child_visible = FALSE;
9425 toplevel = gtk_widget_get_toplevel (widget);
9426 if (toplevel != widget && gtk_widget_is_toplevel (toplevel))
9427 _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
9430 if (priv->parent && gtk_widget_get_realized (priv->parent))
9432 if (gtk_widget_get_mapped (priv->parent) &&
9433 priv->child_visible &&
9434 gtk_widget_get_visible (widget))
9435 gtk_widget_map (widget);
9437 gtk_widget_unmap (widget);
9440 gtk_widget_verify_invariants (widget);
9441 g_object_unref (widget);
9445 * gtk_widget_get_child_visible:
9446 * @widget: a #GtkWidget
9448 * Gets the value set with gtk_widget_set_child_visible().
9449 * If you feel a need to use this function, your code probably
9450 * needs reorganization.
9452 * This function is only useful for container implementations and
9453 * never should be called by an application.
9455 * Return value: %TRUE if the widget is mapped with the parent.
9458 gtk_widget_get_child_visible (GtkWidget *widget)
9460 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
9462 return widget->priv->child_visible;
9466 gtk_widget_get_screen_unchecked (GtkWidget *widget)
9468 GtkWidget *toplevel;
9470 toplevel = gtk_widget_get_toplevel (widget);
9472 if (gtk_widget_is_toplevel (toplevel))
9474 if (GTK_IS_WINDOW (toplevel))
9475 return gtk_window_get_screen (GTK_WINDOW (toplevel));
9476 else if (GTK_IS_INVISIBLE (toplevel))
9477 return gtk_invisible_get_screen (GTK_INVISIBLE (widget));
9484 * gtk_widget_get_screen:
9485 * @widget: a #GtkWidget
9487 * Get the #GdkScreen from the toplevel window associated with
9488 * this widget. This function can only be called after the widget
9489 * has been added to a widget hierarchy with a #GtkWindow
9492 * In general, you should only create screen specific
9493 * resources when a widget has been realized, and you should
9494 * free those resources when the widget is unrealized.
9496 * Return value: (transfer none): the #GdkScreen for the toplevel for this widget.
9501 gtk_widget_get_screen (GtkWidget *widget)
9505 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9507 screen = gtk_widget_get_screen_unchecked (widget);
9514 g_warning (G_STRLOC ": Can't get associated screen"
9515 " for a widget unless it is inside a toplevel GtkWindow\n"
9516 " widget type is %s associated top level type is %s",
9517 g_type_name (G_OBJECT_TYPE(G_OBJECT (widget))),
9518 g_type_name (G_OBJECT_TYPE(G_OBJECT (toplevel))));
9520 return gdk_screen_get_default ();
9525 * gtk_widget_has_screen:
9526 * @widget: a #GtkWidget
9528 * Checks whether there is a #GdkScreen is associated with
9529 * this widget. All toplevel widgets have an associated
9530 * screen, and all widgets added into a hierarchy with a toplevel
9531 * window at the top.
9533 * Return value: %TRUE if there is a #GdkScreen associcated
9539 gtk_widget_has_screen (GtkWidget *widget)
9541 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
9543 return (gtk_widget_get_screen_unchecked (widget) != NULL);
9547 * gtk_widget_get_display:
9548 * @widget: a #GtkWidget
9550 * Get the #GdkDisplay for the toplevel window associated with
9551 * this widget. This function can only be called after the widget
9552 * has been added to a widget hierarchy with a #GtkWindow at the top.
9554 * In general, you should only create display specific
9555 * resources when a widget has been realized, and you should
9556 * free those resources when the widget is unrealized.
9558 * Return value: (transfer none): the #GdkDisplay for the toplevel for this widget.
9563 gtk_widget_get_display (GtkWidget *widget)
9565 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9567 return gdk_screen_get_display (gtk_widget_get_screen (widget));
9571 * gtk_widget_get_root_window:
9572 * @widget: a #GtkWidget
9574 * Get the root window where this widget is located. This function can
9575 * only be called after the widget has been added to a widget
9576 * hierarchy with #GtkWindow at the top.
9578 * The root window is useful for such purposes as creating a popup
9579 * #GdkWindow associated with the window. In general, you should only
9580 * create display specific resources when a widget has been realized,
9581 * and you should free those resources when the widget is unrealized.
9583 * Return value: (transfer none): the #GdkWindow root window for the toplevel for this widget.
9588 gtk_widget_get_root_window (GtkWidget *widget)
9590 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
9592 return gdk_screen_get_root_window (gtk_widget_get_screen (widget));
9596 * gtk_widget_child_focus:
9597 * @widget: a #GtkWidget
9598 * @direction: direction of focus movement
9600 * This function is used by custom widget implementations; if you're
9601 * writing an app, you'd use gtk_widget_grab_focus() to move the focus
9602 * to a particular widget, and gtk_container_set_focus_chain() to
9603 * change the focus tab order. So you may want to investigate those
9604 * functions instead.
9606 * gtk_widget_child_focus() is called by containers as the user moves
9607 * around the window using keyboard shortcuts. @direction indicates
9608 * what kind of motion is taking place (up, down, left, right, tab
9609 * forward, tab backward). gtk_widget_child_focus() emits the
9610 * #GtkWidget::focus signal; widgets override the default handler
9611 * for this signal in order to implement appropriate focus behavior.
9613 * The default ::focus handler for a widget should return %TRUE if
9614 * moving in @direction left the focus on a focusable location inside
9615 * that widget, and %FALSE if moving in @direction moved the focus
9616 * outside the widget. If returning %TRUE, widgets normally
9617 * call gtk_widget_grab_focus() to place the focus accordingly;
9618 * if returning %FALSE, they don't modify the current focus location.
9620 * Return value: %TRUE if focus ended up inside @widget
9623 gtk_widget_child_focus (GtkWidget *widget,
9624 GtkDirectionType direction)
9626 gboolean return_val;
9628 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
9630 if (!gtk_widget_get_visible (widget) ||
9631 !gtk_widget_is_sensitive (widget))
9634 /* child widgets must set CAN_FOCUS, containers
9635 * don't have to though.
9637 if (!GTK_IS_CONTAINER (widget) &&
9638 !gtk_widget_get_can_focus (widget))
9641 g_signal_emit (widget,
9642 widget_signals[FOCUS],
9644 direction, &return_val);
9650 * gtk_widget_keynav_failed:
9651 * @widget: a #GtkWidget
9652 * @direction: direction of focus movement
9654 * This function should be called whenever keyboard navigation within
9655 * a single widget hits a boundary. The function emits the
9656 * #GtkWidget::keynav-failed signal on the widget and its return
9657 * value should be interpreted in a way similar to the return value of
9658 * gtk_widget_child_focus():
9660 * When %TRUE is returned, stay in the widget, the failed keyboard
9661 * navigation is Ok and/or there is nowhere we can/should move the
9664 * When %FALSE is returned, the caller should continue with keyboard
9665 * navigation outside the widget, e.g. by calling
9666 * gtk_widget_child_focus() on the widget's toplevel.
9668 * The default ::keynav-failed handler returns %TRUE for
9669 * %GTK_DIR_TAB_FORWARD and %GTK_DIR_TAB_BACKWARD. For the other
9670 * values of #GtkDirectionType, it looks at the
9671 * #GtkSettings:gtk-keynav-cursor-only setting and returns %FALSE
9672 * if the setting is %TRUE. This way the entire user interface
9673 * becomes cursor-navigatable on input devices such as mobile phones
9674 * which only have cursor keys but no tab key.
9676 * Whenever the default handler returns %TRUE, it also calls
9677 * gtk_widget_error_bell() to notify the user of the failed keyboard
9680 * A use case for providing an own implementation of ::keynav-failed
9681 * (either by connecting to it or by overriding it) would be a row of
9682 * #GtkEntry widgets where the user should be able to navigate the
9683 * entire row with the cursor keys, as e.g. known from user interfaces
9684 * that require entering license keys.
9686 * Return value: %TRUE if stopping keyboard navigation is fine, %FALSE
9687 * if the emitting widget should try to handle the keyboard
9688 * navigation attempt in its parent container(s).
9693 gtk_widget_keynav_failed (GtkWidget *widget,
9694 GtkDirectionType direction)
9696 gboolean return_val;
9698 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
9700 g_signal_emit (widget, widget_signals[KEYNAV_FAILED], 0,
9701 direction, &return_val);
9707 * gtk_widget_error_bell:
9708 * @widget: a #GtkWidget
9710 * Notifies the user about an input-related error on this widget.
9711 * If the #GtkSettings:gtk-error-bell setting is %TRUE, it calls
9712 * gdk_window_beep(), otherwise it does nothing.
9714 * Note that the effect of gdk_window_beep() can be configured in many
9715 * ways, depending on the windowing backend and the desktop environment
9716 * or window manager that is used.
9721 gtk_widget_error_bell (GtkWidget *widget)
9723 GtkWidgetPrivate *priv;
9724 GtkSettings* settings;
9727 g_return_if_fail (GTK_IS_WIDGET (widget));
9729 priv = widget->priv;
9731 settings = gtk_widget_get_settings (widget);
9735 g_object_get (settings,
9736 "gtk-error-bell", &beep,
9739 if (beep && priv->window)
9740 gdk_window_beep (priv->window);
9744 gtk_widget_set_usize_internal (GtkWidget *widget,
9747 GtkQueueResizeFlags flags)
9749 GtkWidgetAuxInfo *aux_info;
9750 gboolean changed = FALSE;
9752 g_object_freeze_notify (G_OBJECT (widget));
9754 aux_info = gtk_widget_get_aux_info (widget, TRUE);
9756 if (width > -2 && aux_info->width != width)
9758 if ((flags & GTK_QUEUE_RESIZE_INVALIDATE_ONLY) == 0)
9759 g_object_notify (G_OBJECT (widget), "width-request");
9760 aux_info->width = width;
9763 if (height > -2 && aux_info->height != height)
9765 if ((flags & GTK_QUEUE_RESIZE_INVALIDATE_ONLY) == 0)
9766 g_object_notify (G_OBJECT (widget), "height-request");
9767 aux_info->height = height;
9771 if (gtk_widget_get_visible (widget) && changed)
9773 if ((flags & GTK_QUEUE_RESIZE_INVALIDATE_ONLY) == 0)
9774 gtk_widget_queue_resize (widget);
9776 _gtk_size_group_queue_resize (widget, GTK_QUEUE_RESIZE_INVALIDATE_ONLY);
9779 g_object_thaw_notify (G_OBJECT (widget));
9783 * gtk_widget_set_size_request:
9784 * @widget: a #GtkWidget
9785 * @width: width @widget should request, or -1 to unset
9786 * @height: height @widget should request, or -1 to unset
9788 * Sets the minimum size of a widget; that is, the widget's size
9789 * request will be at least @width by @height. You can use this
9790 * function to force a widget to be larger than it normally would be.
9792 * In most cases, gtk_window_set_default_size() is a better choice for
9793 * toplevel windows than this function; setting the default size will
9794 * still allow users to shrink the window. Setting the size request
9795 * will force them to leave the window at least as large as the size
9796 * request. When dealing with window sizes,
9797 * gtk_window_set_geometry_hints() can be a useful function as well.
9799 * Note the inherent danger of setting any fixed size - themes,
9800 * translations into other languages, different fonts, and user action
9801 * can all change the appropriate size for a given widget. So, it's
9802 * basically impossible to hardcode a size that will always be
9805 * The size request of a widget is the smallest size a widget can
9806 * accept while still functioning well and drawing itself correctly.
9807 * However in some strange cases a widget may be allocated less than
9808 * its requested size, and in many cases a widget may be allocated more
9809 * space than it requested.
9811 * If the size request in a given direction is -1 (unset), then
9812 * the "natural" size request of the widget will be used instead.
9814 * The size request set here does not include any margin from the
9815 * #GtkWidget properties margin-left, margin-right, margin-top, and
9816 * margin-bottom, but it does include pretty much all other padding
9817 * or border properties set by any subclass of #GtkWidget.
9820 gtk_widget_set_size_request (GtkWidget *widget,
9824 g_return_if_fail (GTK_IS_WIDGET (widget));
9825 g_return_if_fail (width >= -1);
9826 g_return_if_fail (height >= -1);
9833 gtk_widget_set_usize_internal (widget, width, height, 0);
9838 * gtk_widget_get_size_request:
9839 * @widget: a #GtkWidget
9840 * @width: (out) (allow-none): return location for width, or %NULL
9841 * @height: (out) (allow-none): return location for height, or %NULL
9843 * Gets the size request that was explicitly set for the widget using
9844 * gtk_widget_set_size_request(). A value of -1 stored in @width or
9845 * @height indicates that that dimension has not been set explicitly
9846 * and the natural requisition of the widget will be used intead. See
9847 * gtk_widget_set_size_request(). To get the size a widget will
9848 * actually request, call gtk_widget_get_preferred_size() instead of
9852 gtk_widget_get_size_request (GtkWidget *widget,
9856 const GtkWidgetAuxInfo *aux_info;
9858 g_return_if_fail (GTK_IS_WIDGET (widget));
9860 aux_info = _gtk_widget_get_aux_info_or_defaults (widget);
9863 *width = aux_info->width;
9866 *height = aux_info->height;
9870 * _gtk_widget_override_size_request:
9871 * @widget: a #GtkWidget
9872 * @width: new forced minimum width
9873 * @height: new forced minimum height
9874 * @old_width: location to store previous forced minimum width
9875 * @old_height: location to store previous forced minumum height
9877 * Temporarily establishes a forced minimum size for a widget; this
9878 * is used by GtkWindow when calculating the size to add to the
9879 * window's geometry widget. Cached sizes for the widget and its
9880 * parents are invalidated, so that subsequent calls to the size
9881 * negotiation machinery produce the overriden result, but the
9882 * widget is not queued for relayout or redraw. The old size must
9883 * be restored with _gtk_widget_restore_size_request() or things
9887 _gtk_widget_override_size_request (GtkWidget *widget,
9893 gtk_widget_get_size_request (widget, old_width, old_height);
9894 gtk_widget_set_usize_internal (widget, width, height,
9895 GTK_QUEUE_RESIZE_INVALIDATE_ONLY);
9899 * _gtk_widget_restore_size_request:
9900 * @widget: a #GtkWidget
9901 * @old_width: saved forced minimum size
9902 * @old_height: saved forced minimum size
9904 * Undoes the operation of_gtk_widget_override_size_request().
9907 _gtk_widget_restore_size_request (GtkWidget *widget,
9911 gtk_widget_set_usize_internal (widget, old_width, old_height,
9912 GTK_QUEUE_RESIZE_INVALIDATE_ONLY);
9916 * gtk_widget_set_events:
9917 * @widget: a #GtkWidget
9918 * @events: event mask
9920 * Sets the event mask (see #GdkEventMask) for a widget. The event
9921 * mask determines which events a widget will receive. Keep in mind
9922 * that different widgets have different default event masks, and by
9923 * changing the event mask you may disrupt a widget's functionality,
9924 * so be careful. This function must be called while a widget is
9925 * unrealized. Consider gtk_widget_add_events() for widgets that are
9926 * already realized, or if you want to preserve the existing event
9927 * mask. This function can't be used with #GTK_NO_WINDOW widgets;
9928 * to get events on those widgets, place them inside a #GtkEventBox
9929 * and receive events on the event box.
9932 gtk_widget_set_events (GtkWidget *widget,
9935 g_return_if_fail (GTK_IS_WIDGET (widget));
9936 g_return_if_fail (!gtk_widget_get_realized (widget));
9938 g_object_set_qdata (G_OBJECT (widget), quark_event_mask,
9939 GINT_TO_POINTER (events));
9940 g_object_notify (G_OBJECT (widget), "events");
9944 * gtk_widget_set_device_events:
9945 * @widget: a #GtkWidget
9946 * @device: a #GdkDevice
9947 * @events: event mask
9949 * Sets the device event mask (see #GdkEventMask) for a widget. The event
9950 * mask determines which events a widget will receive from @device. Keep
9951 * in mind that different widgets have different default event masks, and by
9952 * changing the event mask you may disrupt a widget's functionality,
9953 * so be careful. This function must be called while a widget is
9954 * unrealized. Consider gtk_widget_add_device_events() for widgets that are
9955 * already realized, or if you want to preserve the existing event
9956 * mask. This function can't be used with #GTK_NO_WINDOW widgets;
9957 * to get events on those widgets, place them inside a #GtkEventBox
9958 * and receive events on the event box.
9963 gtk_widget_set_device_events (GtkWidget *widget,
9965 GdkEventMask events)
9967 GHashTable *device_events;
9969 g_return_if_fail (GTK_IS_WIDGET (widget));
9970 g_return_if_fail (GDK_IS_DEVICE (device));
9971 g_return_if_fail (!gtk_widget_get_realized (widget));
9973 device_events = g_object_get_qdata (G_OBJECT (widget), quark_device_event_mask);
9975 if (G_UNLIKELY (!device_events))
9977 device_events = g_hash_table_new (NULL, NULL);
9978 g_object_set_qdata_full (G_OBJECT (widget), quark_device_event_mask, device_events,
9979 (GDestroyNotify) g_hash_table_unref);
9982 g_hash_table_insert (device_events, device, GUINT_TO_POINTER (events));
9986 * gtk_widget_set_device_enabled:
9987 * @widget: a #GtkWidget
9988 * @device: a #GdkDevice
9989 * @enabled: whether to enable the device
9991 * Enables or disables a #GdkDevice to interact with @widget
9992 * and all its children.
9994 * It does so by descending through the #GdkWindow hierarchy
9995 * and enabling the same mask that is has for core events
9996 * (i.e. the one that gdk_window_get_events() returns).
10001 gtk_widget_set_device_enabled (GtkWidget *widget,
10005 GList *enabled_devices;
10007 g_return_if_fail (GTK_IS_WIDGET (widget));
10008 g_return_if_fail (GDK_IS_DEVICE (device));
10010 enabled_devices = g_object_get_qdata (G_OBJECT (widget), quark_enabled_devices);
10011 enabled_devices = g_list_append (enabled_devices, device);
10013 g_object_set_qdata_full (G_OBJECT (widget), quark_enabled_devices,
10014 enabled_devices, (GDestroyNotify) g_list_free);;
10016 if (gtk_widget_get_realized (widget))
10017 gtk_widget_set_device_enabled_internal (widget, device, TRUE, enabled);
10021 * gtk_widget_get_device_enabled:
10022 * @widget: a #GtkWidget
10023 * @device: a #GdkDevice
10025 * Returns whether @device can interact with @widget and its
10026 * children. See gtk_widget_set_device_enabled().
10028 * Return value: %TRUE is @device is enabled for @widget
10033 gtk_widget_get_device_enabled (GtkWidget *widget,
10036 GList *enabled_devices;
10038 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
10039 g_return_val_if_fail (GDK_IS_DEVICE (device), FALSE);
10041 enabled_devices = g_object_get_qdata (G_OBJECT (widget), quark_enabled_devices);
10043 return g_list_find (enabled_devices, device) != NULL;
10047 gtk_widget_add_events_internal_list (GtkWidget *widget,
10050 GList *window_list)
10054 for (l = window_list; l != NULL; l = l->next)
10056 GdkWindow *window = l->data;
10057 gpointer user_data;
10059 gdk_window_get_user_data (window, &user_data);
10060 if (user_data == widget)
10065 gdk_window_set_device_events (window, device, gdk_window_get_events (window) | events);
10067 gdk_window_set_events (window, gdk_window_get_events (window) | events);
10069 children = gdk_window_get_children (window);
10070 gtk_widget_add_events_internal_list (widget, device, events, children);
10071 g_list_free (children);
10077 gtk_widget_add_events_internal (GtkWidget *widget,
10081 GtkWidgetPrivate *priv = widget->priv;
10082 GList *window_list;
10084 if (!gtk_widget_get_has_window (widget))
10085 window_list = gdk_window_get_children (priv->window);
10087 window_list = g_list_prepend (NULL, priv->window);
10089 gtk_widget_add_events_internal_list (widget, device, events, window_list);
10091 g_list_free (window_list);
10095 * gtk_widget_add_events:
10096 * @widget: a #GtkWidget
10097 * @events: an event mask, see #GdkEventMask
10099 * Adds the events in the bitfield @events to the event mask for
10100 * @widget. See gtk_widget_set_events() for details.
10103 gtk_widget_add_events (GtkWidget *widget,
10108 g_return_if_fail (GTK_IS_WIDGET (widget));
10110 old_events = GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (widget), quark_event_mask));
10111 g_object_set_qdata (G_OBJECT (widget), quark_event_mask,
10112 GINT_TO_POINTER (old_events | events));
10114 if (gtk_widget_get_realized (widget))
10116 gtk_widget_add_events_internal (widget, NULL, events);
10117 gtk_widget_update_devices_mask (widget, FALSE);
10120 g_object_notify (G_OBJECT (widget), "events");
10124 * gtk_widget_add_device_events:
10125 * @widget: a #GtkWidget
10126 * @device: a #GdkDevice
10127 * @events: an event mask, see #GdkEventMask
10129 * Adds the device events in the bitfield @events to the event mask for
10130 * @widget. See gtk_widget_set_device_events() for details.
10135 gtk_widget_add_device_events (GtkWidget *widget,
10137 GdkEventMask events)
10139 GdkEventMask old_events;
10140 GHashTable *device_events;
10142 g_return_if_fail (GTK_IS_WIDGET (widget));
10143 g_return_if_fail (GDK_IS_DEVICE (device));
10145 old_events = gtk_widget_get_device_events (widget, device);
10147 device_events = g_object_get_qdata (G_OBJECT (widget), quark_device_event_mask);
10149 if (G_UNLIKELY (!device_events))
10151 device_events = g_hash_table_new (NULL, NULL);
10152 g_object_set_qdata_full (G_OBJECT (widget), quark_device_event_mask, device_events,
10153 (GDestroyNotify) g_hash_table_unref);
10156 g_hash_table_insert (device_events, device,
10157 GUINT_TO_POINTER (old_events | events));
10159 if (gtk_widget_get_realized (widget))
10160 gtk_widget_add_events_internal (widget, device, events);
10162 g_object_notify (G_OBJECT (widget), "events");
10166 * gtk_widget_get_toplevel:
10167 * @widget: a #GtkWidget
10169 * This function returns the topmost widget in the container hierarchy
10170 * @widget is a part of. If @widget has no parent widgets, it will be
10171 * returned as the topmost widget. No reference will be added to the
10172 * returned widget; it should not be unreferenced.
10174 * Note the difference in behavior vs. gtk_widget_get_ancestor();
10175 * <literal>gtk_widget_get_ancestor (widget, GTK_TYPE_WINDOW)</literal>
10177 * %NULL if @widget wasn't inside a toplevel window, and if the
10178 * window was inside a #GtkWindow<!-- -->-derived widget which was in turn
10179 * inside the toplevel #GtkWindow. While the second case may
10180 * seem unlikely, it actually happens when a #GtkPlug is embedded
10181 * inside a #GtkSocket within the same application.
10183 * To reliably find the toplevel #GtkWindow, use
10184 * gtk_widget_get_toplevel() and check if the %TOPLEVEL flags
10185 * is set on the result.
10187 * GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
10188 * if (gtk_widget_is_toplevel (toplevel))
10190 * /* Perform action on toplevel. */
10194 * Return value: (transfer none): the topmost ancestor of @widget, or @widget itself
10195 * if there's no ancestor.
10198 gtk_widget_get_toplevel (GtkWidget *widget)
10200 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
10202 while (widget->priv->parent)
10203 widget = widget->priv->parent;
10209 * gtk_widget_get_ancestor:
10210 * @widget: a #GtkWidget
10211 * @widget_type: ancestor type
10213 * Gets the first ancestor of @widget with type @widget_type. For example,
10214 * <literal>gtk_widget_get_ancestor (widget, GTK_TYPE_BOX)</literal> gets
10215 * the first #GtkBox that's an ancestor of @widget. No reference will be
10216 * added to the returned widget; it should not be unreferenced. See note
10217 * about checking for a toplevel #GtkWindow in the docs for
10218 * gtk_widget_get_toplevel().
10220 * Note that unlike gtk_widget_is_ancestor(), gtk_widget_get_ancestor()
10221 * considers @widget to be an ancestor of itself.
10223 * Return value: (transfer none): the ancestor widget, or %NULL if not found
10226 gtk_widget_get_ancestor (GtkWidget *widget,
10229 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
10231 while (widget && !g_type_is_a (G_OBJECT_TYPE (widget), widget_type))
10232 widget = widget->priv->parent;
10234 if (!(widget && g_type_is_a (G_OBJECT_TYPE (widget), widget_type)))
10241 * gtk_widget_set_visual:
10242 * @widget: a #GtkWidget
10243 * @visual: visual to be used or %NULL to unset a previous one
10245 * Sets the visual that should be used for by widget and its children for
10246 * creating #GdkWindows. The visual must be on the same #GdkScreen as
10247 * returned by gtk_widget_get_screen(), so handling the
10248 * #GtkWidget::screen-changed signal is necessary.
10250 * Setting a new @visual will not cause @widget to recreate its windows,
10251 * so you should call this function before @widget is realized.
10254 gtk_widget_set_visual (GtkWidget *widget,
10257 g_return_if_fail (GTK_IS_WIDGET (widget));
10258 g_return_if_fail (visual == NULL || GDK_IS_VISUAL (visual));
10261 g_return_if_fail (gtk_widget_get_screen (widget) == gdk_visual_get_screen (visual));
10264 g_object_set_qdata_full (G_OBJECT (widget),
10266 g_object_ref (visual),
10271 * gtk_widget_get_visual:
10272 * @widget: a #GtkWidget
10274 * Gets the visual that will be used to render @widget.
10276 * Return value: (transfer none): the visual for @widget
10279 gtk_widget_get_visual (GtkWidget *widget)
10285 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
10287 if (gtk_widget_get_has_window (widget) &&
10288 widget->priv->window)
10289 return gdk_window_get_visual (widget->priv->window);
10291 screen = gtk_widget_get_screen (widget);
10293 for (w = widget; w != NULL; w = w->priv->parent)
10295 visual = g_object_get_qdata (G_OBJECT (w), quark_visual);
10298 if (gdk_visual_get_screen (visual) == screen)
10301 g_warning ("Ignoring visual set on widget `%s' that is not on the correct screen.",
10302 gtk_widget_get_name (widget));
10306 return gdk_screen_get_system_visual (screen);
10310 * gtk_widget_get_settings:
10311 * @widget: a #GtkWidget
10313 * Gets the settings object holding the settings used for this widget.
10315 * Note that this function can only be called when the #GtkWidget
10316 * is attached to a toplevel, since the settings object is specific
10317 * to a particular #GdkScreen.
10319 * Return value: (transfer none): the relevant #GtkSettings object
10322 gtk_widget_get_settings (GtkWidget *widget)
10324 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
10326 return gtk_settings_get_for_screen (gtk_widget_get_screen (widget));
10330 * gtk_widget_get_events:
10331 * @widget: a #GtkWidget
10333 * Returns the event mask for the widget (a bitfield containing flags
10334 * from the #GdkEventMask enumeration). These are the events that the widget
10337 * Return value: event mask for @widget
10340 gtk_widget_get_events (GtkWidget *widget)
10342 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
10344 return GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (widget), quark_event_mask));
10348 * gtk_widget_get_device_events:
10349 * @widget: a #GtkWidget
10350 * @device: a #GdkDevice
10352 * Returns the events mask for the widget corresponding to an specific device. These
10353 * are the events that the widget will receive when @device operates on it.
10355 * Returns: device event mask for @widget
10360 gtk_widget_get_device_events (GtkWidget *widget,
10363 GHashTable *device_events;
10365 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
10366 g_return_val_if_fail (GDK_IS_DEVICE (device), 0);
10368 device_events = g_object_get_qdata (G_OBJECT (widget), quark_device_event_mask);
10370 if (!device_events)
10373 return GPOINTER_TO_UINT (g_hash_table_lookup (device_events, device));
10377 * gtk_widget_get_pointer:
10378 * @widget: a #GtkWidget
10379 * @x: (out) (allow-none): return location for the X coordinate, or %NULL
10380 * @y: (out) (allow-none): return location for the Y coordinate, or %NULL
10382 * Obtains the location of the mouse pointer in widget coordinates.
10383 * Widget coordinates are a bit odd; for historical reasons, they are
10384 * defined as @widget->window coordinates for widgets that are not
10385 * #GTK_NO_WINDOW widgets, and are relative to @widget->allocation.x,
10386 * @widget->allocation.y for widgets that are #GTK_NO_WINDOW widgets.
10388 * Deprecated: 3.4: Use gdk_window_get_device_position() instead.
10391 gtk_widget_get_pointer (GtkWidget *widget,
10395 GtkWidgetPrivate *priv;
10397 g_return_if_fail (GTK_IS_WIDGET (widget));
10399 priv = widget->priv;
10406 if (gtk_widget_get_realized (widget))
10408 gdk_window_get_device_position (priv->window,
10409 gdk_device_manager_get_client_pointer (
10410 gdk_display_get_device_manager (
10411 gtk_widget_get_display (widget))),
10414 if (!gtk_widget_get_has_window (widget))
10417 *x -= priv->allocation.x;
10419 *y -= priv->allocation.y;
10425 * gtk_widget_is_ancestor:
10426 * @widget: a #GtkWidget
10427 * @ancestor: another #GtkWidget
10429 * Determines whether @widget is somewhere inside @ancestor, possibly with
10430 * intermediate containers.
10432 * Return value: %TRUE if @ancestor contains @widget as a child,
10433 * grandchild, great grandchild, etc.
10436 gtk_widget_is_ancestor (GtkWidget *widget,
10437 GtkWidget *ancestor)
10439 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
10440 g_return_val_if_fail (ancestor != NULL, FALSE);
10444 if (widget->priv->parent == ancestor)
10446 widget = widget->priv->parent;
10452 static GQuark quark_composite_name = 0;
10455 * gtk_widget_set_composite_name:
10456 * @widget: a #GtkWidget.
10457 * @name: the name to set
10459 * Sets a widgets composite name. The widget must be
10460 * a composite child of its parent; see gtk_widget_push_composite_child().
10463 gtk_widget_set_composite_name (GtkWidget *widget,
10466 g_return_if_fail (GTK_IS_WIDGET (widget));
10467 g_return_if_fail (widget->priv->composite_child);
10468 g_return_if_fail (name != NULL);
10470 if (!quark_composite_name)
10471 quark_composite_name = g_quark_from_static_string ("gtk-composite-name");
10473 g_object_set_qdata_full (G_OBJECT (widget),
10474 quark_composite_name,
10480 * gtk_widget_get_composite_name:
10481 * @widget: a #GtkWidget
10483 * Obtains the composite name of a widget.
10485 * Returns: the composite name of @widget, or %NULL if @widget is not
10486 * a composite child. The string should be freed when it is no
10490 gtk_widget_get_composite_name (GtkWidget *widget)
10492 GtkWidgetPrivate *priv;
10494 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
10496 priv = widget->priv;
10498 if (widget->priv->composite_child && priv->parent)
10499 return _gtk_container_child_composite_name (GTK_CONTAINER (priv->parent),
10506 * gtk_widget_push_composite_child:
10508 * Makes all newly-created widgets as composite children until
10509 * the corresponding gtk_widget_pop_composite_child() call.
10511 * A composite child is a child that's an implementation detail of the
10512 * container it's inside and should not be visible to people using the
10513 * container. Composite children aren't treated differently by GTK (but
10514 * see gtk_container_foreach() vs. gtk_container_forall()), but e.g. GUI
10515 * builders might want to treat them in a different way.
10517 * Here is a simple example:
10519 * gtk_widget_push_composite_child ();
10520 * scrolled_window->hscrollbar = gtk_scrollbar_new (GTK_ORIENTATION_HORIZONTAL, hadjustment);
10521 * gtk_widget_set_composite_name (scrolled_window->hscrollbar, "hscrollbar");
10522 * gtk_widget_pop_composite_child ();
10523 * gtk_widget_set_parent (scrolled_window->hscrollbar,
10524 * GTK_WIDGET (scrolled_window));
10525 * g_object_ref (scrolled_window->hscrollbar);
10529 gtk_widget_push_composite_child (void)
10531 composite_child_stack++;
10535 * gtk_widget_pop_composite_child:
10537 * Cancels the effect of a previous call to gtk_widget_push_composite_child().
10540 gtk_widget_pop_composite_child (void)
10542 if (composite_child_stack)
10543 composite_child_stack--;
10547 gtk_widget_emit_direction_changed (GtkWidget *widget,
10548 GtkTextDirection old_dir)
10550 GtkTextDirection direction;
10551 GtkStateFlags state;
10553 gtk_widget_update_pango_context (widget);
10555 direction = gtk_widget_get_direction (widget);
10556 state = widget->priv->state_flags;
10557 state &= GTK_STATE_FLAG_DIR_LTR | GTK_STATE_FLAG_DIR_RTL;
10561 case GTK_TEXT_DIR_LTR:
10562 state |= GTK_STATE_FLAG_DIR_LTR;
10565 case GTK_TEXT_DIR_RTL:
10566 state |= GTK_STATE_FLAG_DIR_RTL;
10569 case GTK_TEXT_DIR_NONE:
10571 g_assert_not_reached ();
10575 gtk_widget_set_state_flags (widget, state, TRUE);
10577 g_signal_emit (widget, widget_signals[DIRECTION_CHANGED], 0, old_dir);
10581 * gtk_widget_set_direction:
10582 * @widget: a #GtkWidget
10583 * @dir: the new direction
10585 * Sets the reading direction on a particular widget. This direction
10586 * controls the primary direction for widgets containing text,
10587 * and also the direction in which the children of a container are
10588 * packed. The ability to set the direction is present in order
10589 * so that correct localization into languages with right-to-left
10590 * reading directions can be done. Generally, applications will
10591 * let the default reading direction present, except for containers
10592 * where the containers are arranged in an order that is explicitely
10593 * visual rather than logical (such as buttons for text justification).
10595 * If the direction is set to %GTK_TEXT_DIR_NONE, then the value
10596 * set by gtk_widget_set_default_direction() will be used.
10599 gtk_widget_set_direction (GtkWidget *widget,
10600 GtkTextDirection dir)
10602 GtkTextDirection old_dir;
10604 g_return_if_fail (GTK_IS_WIDGET (widget));
10605 g_return_if_fail (dir >= GTK_TEXT_DIR_NONE && dir <= GTK_TEXT_DIR_RTL);
10607 old_dir = gtk_widget_get_direction (widget);
10609 widget->priv->direction = dir;
10611 if (old_dir != gtk_widget_get_direction (widget))
10612 gtk_widget_emit_direction_changed (widget, old_dir);
10616 * gtk_widget_get_direction:
10617 * @widget: a #GtkWidget
10619 * Gets the reading direction for a particular widget. See
10620 * gtk_widget_set_direction().
10622 * Return value: the reading direction for the widget.
10625 gtk_widget_get_direction (GtkWidget *widget)
10627 g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_TEXT_DIR_LTR);
10629 if (widget->priv->direction == GTK_TEXT_DIR_NONE)
10630 return gtk_default_direction;
10632 return widget->priv->direction;
10636 gtk_widget_set_default_direction_recurse (GtkWidget *widget, gpointer data)
10638 GtkTextDirection old_dir = GPOINTER_TO_UINT (data);
10640 g_object_ref (widget);
10642 if (widget->priv->direction == GTK_TEXT_DIR_NONE)
10643 gtk_widget_emit_direction_changed (widget, old_dir);
10645 if (GTK_IS_CONTAINER (widget))
10646 gtk_container_forall (GTK_CONTAINER (widget),
10647 gtk_widget_set_default_direction_recurse,
10650 g_object_unref (widget);
10654 * gtk_widget_set_default_direction:
10655 * @dir: the new default direction. This cannot be
10656 * %GTK_TEXT_DIR_NONE.
10658 * Sets the default reading direction for widgets where the
10659 * direction has not been explicitly set by gtk_widget_set_direction().
10662 gtk_widget_set_default_direction (GtkTextDirection dir)
10664 g_return_if_fail (dir == GTK_TEXT_DIR_RTL || dir == GTK_TEXT_DIR_LTR);
10666 if (dir != gtk_default_direction)
10668 GList *toplevels, *tmp_list;
10669 GtkTextDirection old_dir = gtk_default_direction;
10671 gtk_default_direction = dir;
10673 tmp_list = toplevels = gtk_window_list_toplevels ();
10674 g_list_foreach (toplevels, (GFunc)g_object_ref, NULL);
10678 gtk_widget_set_default_direction_recurse (tmp_list->data,
10679 GUINT_TO_POINTER (old_dir));
10680 g_object_unref (tmp_list->data);
10681 tmp_list = tmp_list->next;
10684 g_list_free (toplevels);
10689 * gtk_widget_get_default_direction:
10691 * Obtains the current default reading direction. See
10692 * gtk_widget_set_default_direction().
10694 * Return value: the current default direction.
10697 gtk_widget_get_default_direction (void)
10699 return gtk_default_direction;
10703 gtk_widget_constructed (GObject *object)
10705 GtkWidget *widget = GTK_WIDGET (object);
10706 GtkWidgetPrivate *priv = widget->priv;
10708 /* As strange as it may seem, this may happen on object construction.
10709 * init() implementations of parent types may eventually call this function,
10710 * each with its corresponding GType, which could leave a child
10711 * implementation with a wrong widget type in the widget path
10714 G_OBJECT_TYPE (widget) != gtk_widget_path_get_object_type (priv->path))
10716 gtk_widget_path_free (priv->path);
10720 G_OBJECT_CLASS (gtk_widget_parent_class)->constructed (object);
10724 gtk_widget_dispose (GObject *object)
10726 GtkWidget *widget = GTK_WIDGET (object);
10727 GtkWidgetPrivate *priv = widget->priv;
10730 gtk_container_remove (GTK_CONTAINER (priv->parent), widget);
10731 else if (gtk_widget_get_visible (widget))
10732 gtk_widget_hide (widget);
10734 priv->visible = FALSE;
10735 if (gtk_widget_get_realized (widget))
10736 gtk_widget_unrealize (widget);
10738 if (!priv->in_destruction)
10740 priv->in_destruction = TRUE;
10741 g_signal_emit (object, widget_signals[DESTROY], 0);
10742 priv->in_destruction = FALSE;
10745 g_clear_object (&priv->muxer);
10747 G_OBJECT_CLASS (gtk_widget_parent_class)->dispose (object);
10751 gtk_widget_real_destroy (GtkWidget *object)
10753 /* gtk_object_destroy() will already hold a refcount on object */
10754 GtkWidget *widget = GTK_WIDGET (object);
10755 GtkWidgetPrivate *priv = widget->priv;
10758 if (GTK_WIDGET_GET_CLASS (widget)->priv->accessible_type != GTK_TYPE_ACCESSIBLE)
10760 GtkAccessible *accessible = g_object_steal_qdata (G_OBJECT (widget), quark_accessible_object);
10764 gtk_accessible_set_widget (accessible, NULL);
10765 g_object_unref (accessible);
10769 /* wipe accelerator closures (keep order) */
10770 g_object_set_qdata (G_OBJECT (widget), quark_accel_path, NULL);
10771 g_object_set_qdata (G_OBJECT (widget), quark_accel_closures, NULL);
10773 /* Callers of add_mnemonic_label() should disconnect on ::destroy */
10774 g_object_set_qdata (G_OBJECT (widget), quark_mnemonic_labels, NULL);
10776 gtk_grab_remove (widget);
10778 for (l = priv->tick_callbacks; l;)
10780 GList *next = l->next;
10781 destroy_tick_callback_info (widget, l->data, l);
10786 g_object_unref (priv->style);
10787 priv->style = gtk_widget_get_default_style ();
10788 g_object_ref (priv->style);
10792 gtk_widget_finalize (GObject *object)
10794 GtkWidget *widget = GTK_WIDGET (object);
10795 GtkWidgetPrivate *priv = widget->priv;
10796 GtkWidgetAuxInfo *aux_info;
10797 GtkAccessible *accessible;
10799 gtk_grab_remove (widget);
10801 g_object_unref (priv->style);
10802 priv->style = NULL;
10804 g_free (priv->name);
10806 aux_info = gtk_widget_get_aux_info (widget, FALSE);
10808 gtk_widget_aux_info_destroy (aux_info);
10810 accessible = g_object_get_qdata (G_OBJECT (widget), quark_accessible_object);
10812 g_object_unref (accessible);
10815 gtk_widget_path_free (priv->path);
10819 _gtk_style_context_set_widget (priv->context, NULL);
10820 g_object_unref (priv->context);
10823 _gtk_size_request_cache_free (&priv->requests);
10825 if (g_object_is_floating (object))
10826 g_warning ("A floating object was finalized. This means that someone\n"
10827 "called g_object_unref() on an object that had only a floating\n"
10828 "reference; the initial floating reference is not owned by anyone\n"
10829 "and must be removed with g_object_ref_sink().");
10831 G_OBJECT_CLASS (gtk_widget_parent_class)->finalize (object);
10834 /*****************************************
10835 * gtk_widget_real_map:
10840 *****************************************/
10843 gtk_widget_real_map (GtkWidget *widget)
10845 GtkWidgetPrivate *priv = widget->priv;
10847 g_assert (gtk_widget_get_realized (widget));
10849 if (!gtk_widget_get_mapped (widget))
10851 gtk_widget_set_mapped (widget, TRUE);
10853 if (gtk_widget_get_has_window (widget))
10854 gdk_window_show (priv->window);
10858 /*****************************************
10859 * gtk_widget_real_unmap:
10864 *****************************************/
10867 gtk_widget_real_unmap (GtkWidget *widget)
10869 GtkWidgetPrivate *priv = widget->priv;
10871 if (gtk_widget_get_mapped (widget))
10873 gtk_widget_set_mapped (widget, FALSE);
10875 if (gtk_widget_get_has_window (widget))
10876 gdk_window_hide (priv->window);
10880 /*****************************************
10881 * gtk_widget_real_realize:
10886 *****************************************/
10889 gtk_widget_real_realize (GtkWidget *widget)
10891 GtkWidgetPrivate *priv = widget->priv;
10893 g_assert (!gtk_widget_get_has_window (widget));
10895 gtk_widget_set_realized (widget, TRUE);
10898 priv->window = gtk_widget_get_parent_window (widget);
10899 g_object_ref (priv->window);
10903 /*****************************************
10904 * gtk_widget_real_unrealize:
10909 *****************************************/
10912 gtk_widget_real_unrealize (GtkWidget *widget)
10914 GtkWidgetPrivate *priv = widget->priv;
10916 g_assert (!widget->priv->mapped);
10918 /* printf ("unrealizing %s\n", g_type_name (G_TYPE_FROM_INSTANCE (widget)));
10921 /* We must do unrealize child widget BEFORE container widget.
10922 * gdk_window_destroy() destroys specified xwindow and its sub-xwindows.
10923 * So, unrealizing container widget bofore its children causes the problem
10924 * (for example, gdk_ic_destroy () with destroyed window causes crash. )
10927 if (GTK_IS_CONTAINER (widget))
10928 gtk_container_forall (GTK_CONTAINER (widget),
10929 (GtkCallback) gtk_widget_unrealize,
10932 if (gtk_widget_get_has_window (widget))
10934 gtk_widget_unregister_window (widget, priv->window);
10935 gdk_window_destroy (priv->window);
10936 priv->window = NULL;
10940 g_object_unref (priv->window);
10941 priv->window = NULL;
10944 gtk_selection_remove_all (widget);
10946 gtk_widget_set_realized (widget, FALSE);
10950 gtk_widget_real_adjust_size_request (GtkWidget *widget,
10951 GtkOrientation orientation,
10952 gint *minimum_size,
10953 gint *natural_size)
10955 const GtkWidgetAuxInfo *aux_info;
10957 aux_info =_gtk_widget_get_aux_info_or_defaults (widget);
10959 if (orientation == GTK_ORIENTATION_HORIZONTAL &&
10960 aux_info->width > 0)
10962 *minimum_size = MAX (*minimum_size, aux_info->width);
10964 else if (orientation == GTK_ORIENTATION_VERTICAL &&
10965 aux_info->height > 0)
10967 *minimum_size = MAX (*minimum_size, aux_info->height);
10970 /* Fix it if set_size_request made natural size smaller than min size.
10971 * This would also silently fix broken widgets, but we warn about them
10972 * in gtksizerequest.c when calling their size request vfuncs.
10974 *natural_size = MAX (*natural_size, *minimum_size);
10976 if (orientation == GTK_ORIENTATION_HORIZONTAL)
10978 *minimum_size += (aux_info->margin.left + aux_info->margin.right);
10979 *natural_size += (aux_info->margin.left + aux_info->margin.right);
10983 *minimum_size += (aux_info->margin.top + aux_info->margin.bottom);
10984 *natural_size += (aux_info->margin.top + aux_info->margin.bottom);
10989 * _gtk_widget_peek_request_cache:
10991 * Returns the address of the widget's request cache (strictly for
10992 * internal use in gtksizerequest.c)
10994 * Return value: the address of @widget's size request cache.
10997 _gtk_widget_peek_request_cache (GtkWidget *widget)
10999 /* Don't bother slowing things down with the return_if_fail guards here */
11000 return &widget->priv->requests;
11004 * _gtk_widget_set_device_window:
11005 * @widget: a #GtkWidget
11006 * @device: a #GdkDevice
11007 * @window: the new device window
11009 * Sets pointer window for @widget and @device.
11010 * Does not ref @window.
11013 _gtk_widget_set_device_window (GtkWidget *widget,
11017 GHashTable *device_window;
11019 g_return_if_fail (GTK_IS_WIDGET (widget));
11020 g_return_if_fail (GDK_IS_DEVICE (device));
11021 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
11023 if (!gtk_widget_get_mapped (widget))
11026 device_window = g_object_get_qdata (G_OBJECT (widget), quark_pointer_window);
11028 if (!device_window && window)
11030 device_window = g_hash_table_new (NULL, NULL);
11031 g_object_set_qdata_full (G_OBJECT (widget),
11032 quark_pointer_window,
11034 (GDestroyNotify) g_hash_table_destroy);
11038 g_hash_table_insert (device_window, device, window);
11039 else if (device_window)
11041 g_hash_table_remove (device_window, device);
11043 if (g_hash_table_size (device_window) == 0)
11044 g_object_set_qdata (G_OBJECT (widget), quark_pointer_window, NULL);
11049 * _gtk_widget_get_device_window:
11050 * @widget: a #GtkWidget
11051 * @device: a #GdkDevice
11053 * Return value: the device window set on @widget, or %NULL
11056 _gtk_widget_get_device_window (GtkWidget *widget,
11059 GHashTable *device_window;
11061 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
11062 g_return_val_if_fail (GDK_IS_DEVICE (device), NULL);
11064 if (!gtk_widget_get_mapped (widget))
11067 device_window = g_object_get_qdata (G_OBJECT (widget), quark_pointer_window);
11069 if (!device_window)
11072 return g_hash_table_lookup (device_window, device);
11076 * _gtk_widget_list_devices:
11077 * @widget: a #GtkWidget
11079 * Returns the list of #GdkDevices that is currently on top
11080 * of any window belonging to @widget.
11081 * Free the list with g_list_free(), the elements are owned
11082 * by GTK+ and must not be freed.
11085 _gtk_widget_list_devices (GtkWidget *widget)
11087 GHashTableIter iter;
11088 GHashTable *device_window;
11089 GList *devices = NULL;
11090 gpointer key, value;
11092 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
11094 if (!gtk_widget_get_mapped (widget))
11097 device_window = g_object_get_qdata (G_OBJECT (widget), quark_pointer_window);
11099 if (G_UNLIKELY (!device_window))
11102 g_hash_table_iter_init (&iter, device_window);
11104 while (g_hash_table_iter_next (&iter, &key, &value))
11105 devices = g_list_prepend (devices, key);
11111 synth_crossing (GtkWidget *widget,
11115 GdkCrossingMode mode,
11116 GdkNotifyType detail)
11120 event = gdk_event_new (type);
11122 event->crossing.window = g_object_ref (window);
11123 event->crossing.send_event = TRUE;
11124 event->crossing.subwindow = g_object_ref (window);
11125 event->crossing.time = GDK_CURRENT_TIME;
11126 event->crossing.x = event->crossing.y = 0;
11127 event->crossing.x_root = event->crossing.y_root = 0;
11128 event->crossing.mode = mode;
11129 event->crossing.detail = detail;
11130 event->crossing.focus = FALSE;
11131 event->crossing.state = 0;
11132 gdk_event_set_device (event, device);
11135 widget = gtk_get_event_widget (event);
11138 gtk_widget_event_internal (widget, event);
11140 gdk_event_free (event);
11144 * _gtk_widget_synthesize_crossing:
11145 * @from: the #GtkWidget the virtual pointer is leaving.
11146 * @to: the #GtkWidget the virtual pointer is moving to.
11147 * @mode: the #GdkCrossingMode to place on the synthesized events.
11149 * Generate crossing event(s) on widget state (sensitivity) or GTK+ grab change.
11151 * The real pointer window is the window that most recently received an enter notify
11152 * event. Windows that don't select for crossing events can't become the real
11153 * poiner window. The real pointer widget that owns the real pointer window. The
11154 * effective pointer window is the same as the real pointer window unless the real
11155 * pointer widget is either insensitive or there is a grab on a widget that is not
11156 * an ancestor of the real pointer widget (in which case the effective pointer
11157 * window should be the root window).
11159 * When the effective pointer window is the same as the real poiner window, we
11160 * receive crossing events from the windowing system. When the effective pointer
11161 * window changes to become different from the real pointer window we synthesize
11162 * crossing events, attempting to follow X protocol rules:
11164 * When the root window becomes the effective pointer window:
11165 * - leave notify on real pointer window, detail Ancestor
11166 * - leave notify on all of its ancestors, detail Virtual
11167 * - enter notify on root window, detail Inferior
11169 * When the root window ceases to be the effective pointer window:
11170 * - leave notify on root window, detail Inferior
11171 * - enter notify on all ancestors of real pointer window, detail Virtual
11172 * - enter notify on real pointer window, detail Ancestor
11175 _gtk_widget_synthesize_crossing (GtkWidget *from,
11178 GdkCrossingMode mode)
11180 GdkWindow *from_window = NULL, *to_window = NULL;
11182 g_return_if_fail (from != NULL || to != NULL);
11186 from_window = _gtk_widget_get_device_window (from, device);
11189 from_window = from->priv->window;
11194 to_window = _gtk_widget_get_device_window (to, device);
11197 to_window = to->priv->window;
11200 if (from_window == NULL && to_window == NULL)
11202 else if (from_window != NULL && to_window == NULL)
11204 GList *from_ancestors = NULL, *list;
11205 GdkWindow *from_ancestor = from_window;
11207 while (from_ancestor != NULL)
11209 from_ancestor = gdk_window_get_effective_parent (from_ancestor);
11210 if (from_ancestor == NULL)
11212 from_ancestors = g_list_prepend (from_ancestors, from_ancestor);
11215 synth_crossing (from, GDK_LEAVE_NOTIFY, from_window,
11216 device, mode, GDK_NOTIFY_ANCESTOR);
11217 for (list = g_list_last (from_ancestors); list; list = list->prev)
11219 synth_crossing (NULL, GDK_LEAVE_NOTIFY, (GdkWindow *) list->data,
11220 device, mode, GDK_NOTIFY_VIRTUAL);
11223 /* XXX: enter/inferior on root window? */
11225 g_list_free (from_ancestors);
11227 else if (from_window == NULL && to_window != NULL)
11229 GList *to_ancestors = NULL, *list;
11230 GdkWindow *to_ancestor = to_window;
11232 while (to_ancestor != NULL)
11234 to_ancestor = gdk_window_get_effective_parent (to_ancestor);
11235 if (to_ancestor == NULL)
11237 to_ancestors = g_list_prepend (to_ancestors, to_ancestor);
11240 /* XXX: leave/inferior on root window? */
11242 for (list = to_ancestors; list; list = list->next)
11244 synth_crossing (NULL, GDK_ENTER_NOTIFY, (GdkWindow *) list->data,
11245 device, mode, GDK_NOTIFY_VIRTUAL);
11247 synth_crossing (to, GDK_ENTER_NOTIFY, to_window,
11248 device, mode, GDK_NOTIFY_ANCESTOR);
11250 g_list_free (to_ancestors);
11252 else if (from_window == to_window)
11256 GList *from_ancestors = NULL, *to_ancestors = NULL, *list;
11257 GdkWindow *from_ancestor = from_window, *to_ancestor = to_window;
11259 while (from_ancestor != NULL || to_ancestor != NULL)
11261 if (from_ancestor != NULL)
11263 from_ancestor = gdk_window_get_effective_parent (from_ancestor);
11264 if (from_ancestor == to_window)
11267 from_ancestors = g_list_prepend (from_ancestors, from_ancestor);
11269 if (to_ancestor != NULL)
11271 to_ancestor = gdk_window_get_effective_parent (to_ancestor);
11272 if (to_ancestor == from_window)
11275 to_ancestors = g_list_prepend (to_ancestors, to_ancestor);
11278 if (to_ancestor == from_window)
11280 if (mode != GDK_CROSSING_GTK_UNGRAB)
11281 synth_crossing (from, GDK_LEAVE_NOTIFY, from_window,
11282 device, mode, GDK_NOTIFY_INFERIOR);
11283 for (list = to_ancestors; list; list = list->next)
11284 synth_crossing (NULL, GDK_ENTER_NOTIFY, (GdkWindow *) list->data,
11285 device, mode, GDK_NOTIFY_VIRTUAL);
11286 synth_crossing (to, GDK_ENTER_NOTIFY, to_window,
11287 device, mode, GDK_NOTIFY_ANCESTOR);
11289 else if (from_ancestor == to_window)
11291 synth_crossing (from, GDK_LEAVE_NOTIFY, from_window,
11292 device, mode, GDK_NOTIFY_ANCESTOR);
11293 for (list = g_list_last (from_ancestors); list; list = list->prev)
11295 synth_crossing (NULL, GDK_LEAVE_NOTIFY, (GdkWindow *) list->data,
11296 device, mode, GDK_NOTIFY_VIRTUAL);
11298 if (mode != GDK_CROSSING_GTK_GRAB)
11299 synth_crossing (to, GDK_ENTER_NOTIFY, to_window,
11300 device, mode, GDK_NOTIFY_INFERIOR);
11304 while (from_ancestors != NULL && to_ancestors != NULL
11305 && from_ancestors->data == to_ancestors->data)
11307 from_ancestors = g_list_delete_link (from_ancestors,
11309 to_ancestors = g_list_delete_link (to_ancestors, to_ancestors);
11312 synth_crossing (from, GDK_LEAVE_NOTIFY, from_window,
11313 device, mode, GDK_NOTIFY_NONLINEAR);
11315 for (list = g_list_last (from_ancestors); list; list = list->prev)
11317 synth_crossing (NULL, GDK_LEAVE_NOTIFY, (GdkWindow *) list->data,
11318 device, mode, GDK_NOTIFY_NONLINEAR_VIRTUAL);
11320 for (list = to_ancestors; list; list = list->next)
11322 synth_crossing (NULL, GDK_ENTER_NOTIFY, (GdkWindow *) list->data,
11323 device, mode, GDK_NOTIFY_NONLINEAR_VIRTUAL);
11325 synth_crossing (to, GDK_ENTER_NOTIFY, to_window,
11326 device, mode, GDK_NOTIFY_NONLINEAR);
11328 g_list_free (from_ancestors);
11329 g_list_free (to_ancestors);
11334 gtk_widget_propagate_state (GtkWidget *widget,
11335 GtkStateData *data)
11337 GtkWidgetPrivate *priv = widget->priv;
11338 GtkStateFlags new_flags, old_flags = priv->state_flags;
11339 GtkStateType old_state;
11341 old_state = gtk_widget_get_state (widget);
11343 priv->state_flags |= data->flags_to_set;
11344 priv->state_flags &= ~(data->flags_to_unset);
11346 /* make insensitivity unoverridable */
11347 if (!priv->sensitive)
11348 priv->state_flags |= GTK_STATE_FLAG_INSENSITIVE;
11350 if (gtk_widget_is_focus (widget) && !gtk_widget_is_sensitive (widget))
11354 window = gtk_widget_get_toplevel (widget);
11356 if (window && gtk_widget_is_toplevel (window))
11357 gtk_window_set_focus (GTK_WINDOW (window), NULL);
11360 new_flags = priv->state_flags;
11362 if (old_flags != new_flags)
11364 g_object_ref (widget);
11366 if (!gtk_widget_is_sensitive (widget) && gtk_widget_has_grab (widget))
11367 gtk_grab_remove (widget);
11369 gtk_style_context_set_state (gtk_widget_get_style_context (widget), new_flags);
11371 g_signal_emit (widget, widget_signals[STATE_CHANGED], 0, old_state);
11372 g_signal_emit (widget, widget_signals[STATE_FLAGS_CHANGED], 0, old_flags);
11374 if (!priv->shadowed &&
11375 (new_flags & GTK_STATE_FLAG_INSENSITIVE) != (old_flags & GTK_STATE_FLAG_INSENSITIVE))
11377 GList *event_windows = NULL;
11378 GList *devices, *d;
11380 devices = _gtk_widget_list_devices (widget);
11382 for (d = devices; d; d = d->next)
11388 window = _gtk_widget_get_device_window (widget, device);
11390 /* Do not propagate more than once to the
11391 * same window if non-multidevice aware.
11393 if (!gdk_window_get_support_multidevice (window) &&
11394 g_list_find (event_windows, window))
11397 if (!gtk_widget_is_sensitive (widget))
11398 _gtk_widget_synthesize_crossing (widget, NULL, d->data,
11399 GDK_CROSSING_STATE_CHANGED);
11401 _gtk_widget_synthesize_crossing (NULL, widget, d->data,
11402 GDK_CROSSING_STATE_CHANGED);
11404 event_windows = g_list_prepend (event_windows, window);
11407 g_list_free (event_windows);
11408 g_list_free (devices);
11411 if (GTK_IS_CONTAINER (widget))
11413 GtkStateData child_data;
11415 /* Make sure to only propate the right states further */
11416 child_data.flags_to_set = data->flags_to_set & GTK_STATE_FLAGS_DO_PROPAGATE;
11417 child_data.flags_to_unset = data->flags_to_unset & GTK_STATE_FLAGS_DO_PROPAGATE;
11419 gtk_container_forall (GTK_CONTAINER (widget),
11420 (GtkCallback) gtk_widget_propagate_state,
11424 g_object_unref (widget);
11428 static const GtkWidgetAuxInfo default_aux_info = {
11436 * gtk_widget_get_aux_info:
11437 * @widget: a #GtkWidget
11438 * @create: if %TRUE, create the structure if it doesn't exist
11440 * Get the #GtkWidgetAuxInfo structure for the widget.
11442 * Return value: the #GtkAuxInfo structure for the widget, or
11443 * %NULL if @create is %FALSE and one doesn't already exist.
11445 static GtkWidgetAuxInfo *
11446 gtk_widget_get_aux_info (GtkWidget *widget,
11449 GtkWidgetAuxInfo *aux_info;
11451 aux_info = g_object_get_qdata (G_OBJECT (widget), quark_aux_info);
11452 if (!aux_info && create)
11454 aux_info = g_slice_new0 (GtkWidgetAuxInfo);
11456 *aux_info = default_aux_info;
11458 g_object_set_qdata (G_OBJECT (widget), quark_aux_info, aux_info);
11464 static const GtkWidgetAuxInfo*
11465 _gtk_widget_get_aux_info_or_defaults (GtkWidget *widget)
11467 GtkWidgetAuxInfo *aux_info;
11469 aux_info = gtk_widget_get_aux_info (widget, FALSE);
11470 if (aux_info == NULL)
11472 return &default_aux_info;
11480 /*****************************************
11481 * gtk_widget_aux_info_destroy:
11486 *****************************************/
11489 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
11491 g_slice_free (GtkWidgetAuxInfo, aux_info);
11495 * gtk_widget_shape_combine_region:
11496 * @widget: a #GtkWidget
11497 * @region: (allow-none): shape to be added, or %NULL to remove an existing shape
11499 * Sets a shape for this widget's GDK window. This allows for
11500 * transparent windows etc., see gdk_window_shape_combine_region()
11501 * for more information.
11506 gtk_widget_shape_combine_region (GtkWidget *widget,
11507 cairo_region_t *region)
11509 GtkWidgetPrivate *priv;
11511 g_return_if_fail (GTK_IS_WIDGET (widget));
11512 /* set_shape doesn't work on widgets without gdk window */
11513 g_return_if_fail (gtk_widget_get_has_window (widget));
11515 priv = widget->priv;
11517 if (region == NULL)
11519 priv->has_shape_mask = FALSE;
11522 gdk_window_shape_combine_region (priv->window, NULL, 0, 0);
11524 g_object_set_qdata (G_OBJECT (widget), quark_shape_info, NULL);
11528 priv->has_shape_mask = TRUE;
11530 g_object_set_qdata_full (G_OBJECT (widget), quark_shape_info,
11531 cairo_region_copy (region),
11532 (GDestroyNotify) cairo_region_destroy);
11534 /* set shape if widget has a gdk window already.
11535 * otherwise the shape is scheduled to be set by gtk_widget_realize().
11538 gdk_window_shape_combine_region (priv->window, region, 0, 0);
11543 * gtk_widget_input_shape_combine_region:
11544 * @widget: a #GtkWidget
11545 * @region: (allow-none): shape to be added, or %NULL to remove an existing shape
11547 * Sets an input shape for this widget's GDK window. This allows for
11548 * windows which react to mouse click in a nonrectangular region, see
11549 * gdk_window_input_shape_combine_region() for more information.
11554 gtk_widget_input_shape_combine_region (GtkWidget *widget,
11555 cairo_region_t *region)
11557 GtkWidgetPrivate *priv;
11559 g_return_if_fail (GTK_IS_WIDGET (widget));
11560 /* set_shape doesn't work on widgets without gdk window */
11561 g_return_if_fail (gtk_widget_get_has_window (widget));
11563 priv = widget->priv;
11565 if (region == NULL)
11568 gdk_window_input_shape_combine_region (priv->window, NULL, 0, 0);
11570 g_object_set_qdata (G_OBJECT (widget), quark_input_shape_info, NULL);
11574 g_object_set_qdata_full (G_OBJECT (widget), quark_input_shape_info,
11575 cairo_region_copy (region),
11576 (GDestroyNotify) cairo_region_destroy);
11578 /* set shape if widget has a gdk window already.
11579 * otherwise the shape is scheduled to be set by gtk_widget_realize().
11582 gdk_window_input_shape_combine_region (priv->window, region, 0, 0);
11587 /* style properties
11591 * gtk_widget_class_install_style_property_parser: (skip)
11592 * @klass: a #GtkWidgetClass
11593 * @pspec: the #GParamSpec for the style property
11594 * @parser: the parser for the style property
11596 * Installs a style property on a widget class.
11599 gtk_widget_class_install_style_property_parser (GtkWidgetClass *klass,
11601 GtkRcPropertyParser parser)
11603 g_return_if_fail (GTK_IS_WIDGET_CLASS (klass));
11604 g_return_if_fail (G_IS_PARAM_SPEC (pspec));
11605 g_return_if_fail (pspec->flags & G_PARAM_READABLE);
11606 g_return_if_fail (!(pspec->flags & (G_PARAM_CONSTRUCT_ONLY | G_PARAM_CONSTRUCT)));
11608 if (g_param_spec_pool_lookup (style_property_spec_pool, pspec->name, G_OBJECT_CLASS_TYPE (klass), FALSE))
11610 g_warning (G_STRLOC ": class `%s' already contains a style property named `%s'",
11611 G_OBJECT_CLASS_NAME (klass),
11616 g_param_spec_ref_sink (pspec);
11617 g_param_spec_set_qdata (pspec, quark_property_parser, (gpointer) parser);
11618 g_param_spec_pool_insert (style_property_spec_pool, pspec, G_OBJECT_CLASS_TYPE (klass));
11622 * gtk_widget_class_install_style_property:
11623 * @klass: a #GtkWidgetClass
11624 * @pspec: the #GParamSpec for the property
11626 * Installs a style property on a widget class. The parser for the
11627 * style property is determined by the value type of @pspec.
11630 gtk_widget_class_install_style_property (GtkWidgetClass *klass,
11633 GtkRcPropertyParser parser;
11635 g_return_if_fail (GTK_IS_WIDGET_CLASS (klass));
11636 g_return_if_fail (G_IS_PARAM_SPEC (pspec));
11638 parser = _gtk_rc_property_parser_from_type (G_PARAM_SPEC_VALUE_TYPE (pspec));
11640 gtk_widget_class_install_style_property_parser (klass, pspec, parser);
11644 * gtk_widget_class_find_style_property:
11645 * @klass: a #GtkWidgetClass
11646 * @property_name: the name of the style property to find
11648 * Finds a style property of a widget class by name.
11650 * Returns: (transfer none): the #GParamSpec of the style property or
11651 * %NULL if @class has no style property with that name.
11656 gtk_widget_class_find_style_property (GtkWidgetClass *klass,
11657 const gchar *property_name)
11659 g_return_val_if_fail (property_name != NULL, NULL);
11661 return g_param_spec_pool_lookup (style_property_spec_pool,
11663 G_OBJECT_CLASS_TYPE (klass),
11668 * gtk_widget_class_list_style_properties:
11669 * @klass: a #GtkWidgetClass
11670 * @n_properties: location to return the number of style properties found
11672 * Returns all style properties of a widget class.
11674 * Returns: (array length=n_properties) (transfer container): a
11675 * newly allocated array of #GParamSpec*. The array must be
11676 * freed with g_free().
11681 gtk_widget_class_list_style_properties (GtkWidgetClass *klass,
11682 guint *n_properties)
11684 GParamSpec **pspecs;
11687 pspecs = g_param_spec_pool_list (style_property_spec_pool,
11688 G_OBJECT_CLASS_TYPE (klass),
11697 * gtk_widget_style_get_property:
11698 * @widget: a #GtkWidget
11699 * @property_name: the name of a style property
11700 * @value: location to return the property value
11702 * Gets the value of a style property of @widget.
11705 gtk_widget_style_get_property (GtkWidget *widget,
11706 const gchar *property_name,
11711 g_return_if_fail (GTK_IS_WIDGET (widget));
11712 g_return_if_fail (property_name != NULL);
11713 g_return_if_fail (G_IS_VALUE (value));
11715 g_object_ref (widget);
11716 pspec = g_param_spec_pool_lookup (style_property_spec_pool,
11718 G_OBJECT_TYPE (widget),
11721 g_warning ("%s: widget class `%s' has no property named `%s'",
11723 G_OBJECT_TYPE_NAME (widget),
11727 GtkStyleContext *context;
11728 const GValue *peek_value;
11729 GtkStateFlags state;
11731 context = gtk_widget_get_style_context (widget);
11732 state = gtk_widget_get_state_flags (widget);
11734 peek_value = _gtk_style_context_peek_style_property (context,
11735 G_OBJECT_TYPE (widget),
11738 /* auto-conversion of the caller's value type
11740 if (G_VALUE_TYPE (value) == G_PARAM_SPEC_VALUE_TYPE (pspec))
11741 g_value_copy (peek_value, value);
11742 else if (g_value_type_transformable (G_PARAM_SPEC_VALUE_TYPE (pspec), G_VALUE_TYPE (value)))
11743 g_value_transform (peek_value, value);
11745 g_warning ("can't retrieve style property `%s' of type `%s' as value of type `%s'",
11747 g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)),
11748 G_VALUE_TYPE_NAME (value));
11750 g_object_unref (widget);
11754 * gtk_widget_style_get_valist:
11755 * @widget: a #GtkWidget
11756 * @first_property_name: the name of the first property to get
11757 * @var_args: a <type>va_list</type> of pairs of property names and
11758 * locations to return the property values, starting with the location
11759 * for @first_property_name.
11761 * Non-vararg variant of gtk_widget_style_get(). Used primarily by language
11765 gtk_widget_style_get_valist (GtkWidget *widget,
11766 const gchar *first_property_name,
11769 GtkStyleContext *context;
11770 GtkStateFlags state;
11773 g_return_if_fail (GTK_IS_WIDGET (widget));
11775 g_object_ref (widget);
11776 context = gtk_widget_get_style_context (widget);
11777 state = gtk_widget_get_state_flags (widget);
11779 name = first_property_name;
11782 const GValue *peek_value;
11786 pspec = g_param_spec_pool_lookup (style_property_spec_pool,
11788 G_OBJECT_TYPE (widget),
11792 g_warning ("%s: widget class `%s' has no property named `%s'",
11794 G_OBJECT_TYPE_NAME (widget),
11798 /* style pspecs are always readable so we can spare that check here */
11800 peek_value = _gtk_style_context_peek_style_property (context,
11801 G_OBJECT_TYPE (widget),
11804 G_VALUE_LCOPY (peek_value, var_args, 0, &error);
11807 g_warning ("%s: %s", G_STRLOC, error);
11812 name = va_arg (var_args, gchar*);
11815 g_object_unref (widget);
11819 * gtk_widget_style_get:
11820 * @widget: a #GtkWidget
11821 * @first_property_name: the name of the first property to get
11822 * @...: pairs of property names and locations to return the
11823 * property values, starting with the location for
11824 * @first_property_name, terminated by %NULL.
11826 * Gets the values of a multiple style properties of @widget.
11829 gtk_widget_style_get (GtkWidget *widget,
11830 const gchar *first_property_name,
11835 g_return_if_fail (GTK_IS_WIDGET (widget));
11837 va_start (var_args, first_property_name);
11838 gtk_widget_style_get_valist (widget, first_property_name, var_args);
11843 * gtk_requisition_new:
11845 * Allocates a new #GtkRequisition structure and initializes its elements to zero.
11847 * Returns: a new empty #GtkRequisition. The newly allocated #GtkRequisition should
11848 * be freed with gtk_requisition_free().
11853 gtk_requisition_new (void)
11855 return g_slice_new0 (GtkRequisition);
11859 * gtk_requisition_copy:
11860 * @requisition: a #GtkRequisition
11862 * Copies a #GtkRequisition.
11864 * Returns: a copy of @requisition
11867 gtk_requisition_copy (const GtkRequisition *requisition)
11869 return g_slice_dup (GtkRequisition, requisition);
11873 * gtk_requisition_free:
11874 * @requisition: a #GtkRequisition
11876 * Frees a #GtkRequisition.
11879 gtk_requisition_free (GtkRequisition *requisition)
11881 g_slice_free (GtkRequisition, requisition);
11884 G_DEFINE_BOXED_TYPE (GtkRequisition, gtk_requisition,
11885 gtk_requisition_copy,
11886 gtk_requisition_free)
11889 * gtk_widget_class_set_accessible_type:
11890 * @widget_class: class to set the accessible type for
11891 * @type: The object type that implements the accessible for @widget_class
11893 * Sets the type to be used for creating accessibles for widgets of
11894 * @widget_class. The given @type must be a subtype of the type used for
11895 * accessibles of the parent class.
11897 * This function should only be called from class init functions of widgets.
11902 gtk_widget_class_set_accessible_type (GtkWidgetClass *widget_class,
11905 GtkWidgetClassPrivate *priv;
11907 g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
11908 g_return_if_fail (g_type_is_a (type, widget_class->priv->accessible_type));
11910 priv = widget_class->priv;
11912 priv->accessible_type = type;
11913 /* reset this - honoring the type's role is better. */
11914 priv->accessible_role = ATK_ROLE_INVALID;
11918 * gtk_widget_class_set_accessible_role:
11919 * @widget_class: class to set the accessible role for
11920 * @role: The role to use for accessibles created for @widget_class
11922 * Sets the default #AtkRole to be set on accessibles created for
11923 * widgets of @widget_class. Accessibles may decide to not honor this
11924 * setting if their role reporting is more refined. Calls to
11925 * gtk_widget_class_set_accessible_type() will reset this value.
11927 * In cases where you want more fine-grained control over the role of
11928 * accessibles created for @widget_class, you should provide your own
11929 * accessible type and use gtk_widget_class_set_accessible_type()
11932 * If @role is #ATK_ROLE_INVALID, the default role will not be changed
11933 * and the accessible's default role will be used instead.
11935 * This function should only be called from class init functions of widgets.
11940 gtk_widget_class_set_accessible_role (GtkWidgetClass *widget_class,
11943 GtkWidgetClassPrivate *priv;
11945 g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
11947 priv = widget_class->priv;
11949 priv->accessible_role = role;
11953 * _gtk_widget_peek_accessible:
11954 * @widget: a #GtkWidget
11956 * Gets the accessible for @widget, if it has been created yet.
11957 * Otherwise, this function returns %NULL. If the @widget's implementation
11958 * does not use the default way to create accessibles, %NULL will always be
11961 * Returns: the accessible for @widget or %NULL if none has been
11965 _gtk_widget_peek_accessible (GtkWidget *widget)
11967 return g_object_get_qdata (G_OBJECT (widget),
11968 quark_accessible_object);
11972 * gtk_widget_get_accessible:
11973 * @widget: a #GtkWidget
11975 * Returns the accessible object that describes the widget to an
11976 * assistive technology.
11978 * If accessibility support is not available, this #AtkObject
11979 * instance may be a no-op. Likewise, if no class-specific #AtkObject
11980 * implementation is available for the widget instance in question,
11981 * it will inherit an #AtkObject implementation from the first ancestor
11982 * class for which such an implementation is defined.
11984 * The documentation of the
11985 * <ulink url="http://developer.gnome.org/atk/stable/">ATK</ulink>
11986 * library contains more information about accessible objects and their uses.
11988 * Returns: (transfer none): the #AtkObject associated with @widget
11991 gtk_widget_get_accessible (GtkWidget *widget)
11993 GtkWidgetClass *klass;
11995 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
11997 klass = GTK_WIDGET_GET_CLASS (widget);
11999 g_return_val_if_fail (klass->get_accessible != NULL, NULL);
12001 return klass->get_accessible (widget);
12005 gtk_widget_real_get_accessible (GtkWidget *widget)
12007 AtkObject* accessible;
12009 accessible = g_object_get_qdata (G_OBJECT (widget),
12010 quark_accessible_object);
12013 GtkWidgetClass *widget_class;
12014 GtkWidgetClassPrivate *priv;
12015 AtkObjectFactory *factory;
12016 AtkRegistry *default_registry;
12018 widget_class = GTK_WIDGET_GET_CLASS (widget);
12019 priv = widget_class->priv;
12021 if (priv->accessible_type == GTK_TYPE_ACCESSIBLE)
12023 default_registry = atk_get_default_registry ();
12024 factory = atk_registry_get_factory (default_registry,
12025 G_TYPE_FROM_INSTANCE (widget));
12027 atk_object_factory_create_accessible (factory,
12028 G_OBJECT (widget));
12030 if (priv->accessible_role != ATK_ROLE_INVALID)
12031 atk_object_set_role (accessible, priv->accessible_role);
12033 g_object_set_qdata (G_OBJECT (widget),
12034 quark_accessible_object,
12039 accessible = g_object_new (priv->accessible_type,
12042 if (priv->accessible_role != ATK_ROLE_INVALID)
12043 atk_object_set_role (accessible, priv->accessible_role);
12045 g_object_set_qdata (G_OBJECT (widget),
12046 quark_accessible_object,
12049 atk_object_initialize (accessible, widget);
12051 /* Set the role again, since we don't want a role set
12052 * in some parent initialize() function to override
12055 if (priv->accessible_role != ATK_ROLE_INVALID)
12056 atk_object_set_role (accessible, priv->accessible_role);
12063 * Initialize a AtkImplementorIface instance's virtual pointers as
12064 * appropriate to this implementor's class (GtkWidget).
12067 gtk_widget_accessible_interface_init (AtkImplementorIface *iface)
12069 iface->ref_accessible = gtk_widget_ref_accessible;
12073 gtk_widget_ref_accessible (AtkImplementor *implementor)
12075 AtkObject *accessible;
12077 accessible = gtk_widget_get_accessible (GTK_WIDGET (implementor));
12079 g_object_ref (accessible);
12084 * Expand flag management
12088 gtk_widget_update_computed_expand (GtkWidget *widget)
12090 GtkWidgetPrivate *priv;
12092 priv = widget->priv;
12094 if (priv->need_compute_expand)
12098 if (priv->hexpand_set)
12103 if (priv->vexpand_set)
12108 /* we don't need to use compute_expand if both expands are
12109 * forced by the app
12111 if (!(priv->hexpand_set && priv->vexpand_set))
12113 if (GTK_WIDGET_GET_CLASS (widget)->compute_expand != NULL)
12117 GTK_WIDGET_GET_CLASS (widget)->compute_expand (widget,
12118 priv->hexpand_set ? &ignored : &h,
12119 priv->vexpand_set ? &ignored : &v);
12123 priv->need_compute_expand = FALSE;
12124 priv->computed_hexpand = h != FALSE;
12125 priv->computed_vexpand = v != FALSE;
12130 * gtk_widget_queue_compute_expand:
12131 * @widget: a #GtkWidget
12133 * Mark @widget as needing to recompute its expand flags. Call
12134 * this function when setting legacy expand child properties
12135 * on the child of a container.
12137 * See gtk_widget_compute_expand().
12140 gtk_widget_queue_compute_expand (GtkWidget *widget)
12143 gboolean changed_anything;
12145 if (widget->priv->need_compute_expand)
12148 changed_anything = FALSE;
12150 while (parent != NULL)
12152 if (!parent->priv->need_compute_expand)
12154 parent->priv->need_compute_expand = TRUE;
12155 changed_anything = TRUE;
12158 /* Note: if we had an invariant that "if a child needs to
12159 * compute expand, its parents also do" then we could stop going
12160 * up when we got to a parent that already needed to
12161 * compute. However, in general we compute expand lazily (as
12162 * soon as we see something in a subtree that is expand, we know
12163 * we're expanding) and so this invariant does not hold and we
12164 * have to always walk all the way up in case some ancestor
12165 * is not currently need_compute_expand.
12168 parent = parent->priv->parent;
12171 /* recomputing expand always requires
12172 * a relayout as well
12174 if (changed_anything)
12175 gtk_widget_queue_resize (widget);
12179 * gtk_widget_compute_expand:
12180 * @widget: the widget
12181 * @orientation: expand direction
12183 * Computes whether a container should give this widget extra space
12184 * when possible. Containers should check this, rather than
12185 * looking at gtk_widget_get_hexpand() or gtk_widget_get_vexpand().
12187 * This function already checks whether the widget is visible, so
12188 * visibility does not need to be checked separately. Non-visible
12189 * widgets are not expanded.
12191 * The computed expand value uses either the expand setting explicitly
12192 * set on the widget itself, or, if none has been explicitly set,
12193 * the widget may expand if some of its children do.
12195 * Return value: whether widget tree rooted here should be expanded
12198 gtk_widget_compute_expand (GtkWidget *widget,
12199 GtkOrientation orientation)
12201 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
12203 /* We never make a widget expand if not even showing. */
12204 if (!gtk_widget_get_visible (widget))
12207 gtk_widget_update_computed_expand (widget);
12209 if (orientation == GTK_ORIENTATION_HORIZONTAL)
12211 return widget->priv->computed_hexpand;
12215 return widget->priv->computed_vexpand;
12220 gtk_widget_set_expand (GtkWidget *widget,
12221 GtkOrientation orientation,
12224 const char *expand_prop;
12225 const char *expand_set_prop;
12227 GtkWidgetPrivate *priv;
12229 g_return_if_fail (GTK_IS_WIDGET (widget));
12231 priv = widget->priv;
12233 expand = expand != FALSE;
12235 was_both = priv->hexpand && priv->vexpand;
12237 if (orientation == GTK_ORIENTATION_HORIZONTAL)
12239 if (priv->hexpand_set &&
12240 priv->hexpand == expand)
12243 priv->hexpand_set = TRUE;
12244 priv->hexpand = expand;
12246 expand_prop = "hexpand";
12247 expand_set_prop = "hexpand-set";
12251 if (priv->vexpand_set &&
12252 priv->vexpand == expand)
12255 priv->vexpand_set = TRUE;
12256 priv->vexpand = expand;
12258 expand_prop = "vexpand";
12259 expand_set_prop = "vexpand-set";
12262 gtk_widget_queue_compute_expand (widget);
12264 g_object_freeze_notify (G_OBJECT (widget));
12265 g_object_notify (G_OBJECT (widget), expand_prop);
12266 g_object_notify (G_OBJECT (widget), expand_set_prop);
12267 if (was_both != (priv->hexpand && priv->vexpand))
12268 g_object_notify (G_OBJECT (widget), "expand");
12269 g_object_thaw_notify (G_OBJECT (widget));
12273 gtk_widget_set_expand_set (GtkWidget *widget,
12274 GtkOrientation orientation,
12277 GtkWidgetPrivate *priv;
12280 priv = widget->priv;
12282 set = set != FALSE;
12284 if (orientation == GTK_ORIENTATION_HORIZONTAL)
12286 if (set == priv->hexpand_set)
12289 priv->hexpand_set = set;
12290 prop = "hexpand-set";
12294 if (set == priv->vexpand_set)
12297 priv->vexpand_set = set;
12298 prop = "vexpand-set";
12301 gtk_widget_queue_compute_expand (widget);
12303 g_object_notify (G_OBJECT (widget), prop);
12307 * gtk_widget_get_hexpand:
12308 * @widget: the widget
12310 * Gets whether the widget would like any available extra horizontal
12311 * space. When a user resizes a #GtkWindow, widgets with expand=TRUE
12312 * generally receive the extra space. For example, a list or
12313 * scrollable area or document in your window would often be set to
12316 * Containers should use gtk_widget_compute_expand() rather than
12317 * this function, to see whether a widget, or any of its children,
12318 * has the expand flag set. If any child of a widget wants to
12319 * expand, the parent may ask to expand also.
12321 * This function only looks at the widget's own hexpand flag, rather
12322 * than computing whether the entire widget tree rooted at this widget
12325 * Return value: whether hexpand flag is set
12328 gtk_widget_get_hexpand (GtkWidget *widget)
12330 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
12332 return widget->priv->hexpand;
12336 * gtk_widget_set_hexpand:
12337 * @widget: the widget
12338 * @expand: whether to expand
12340 * Sets whether the widget would like any available extra horizontal
12341 * space. When a user resizes a #GtkWindow, widgets with expand=TRUE
12342 * generally receive the extra space. For example, a list or
12343 * scrollable area or document in your window would often be set to
12346 * Call this function to set the expand flag if you would like your
12347 * widget to become larger horizontally when the window has extra
12350 * By default, widgets automatically expand if any of their children
12351 * want to expand. (To see if a widget will automatically expand given
12352 * its current children and state, call gtk_widget_compute_expand(). A
12353 * container can decide how the expandability of children affects the
12354 * expansion of the container by overriding the compute_expand virtual
12355 * method on #GtkWidget.).
12357 * Setting hexpand explicitly with this function will override the
12358 * automatic expand behavior.
12360 * This function forces the widget to expand or not to expand,
12361 * regardless of children. The override occurs because
12362 * gtk_widget_set_hexpand() sets the hexpand-set property (see
12363 * gtk_widget_set_hexpand_set()) which causes the widget's hexpand
12364 * value to be used, rather than looking at children and widget state.
12367 gtk_widget_set_hexpand (GtkWidget *widget,
12370 g_return_if_fail (GTK_IS_WIDGET (widget));
12372 gtk_widget_set_expand (widget, GTK_ORIENTATION_HORIZONTAL, expand);
12376 * gtk_widget_get_hexpand_set:
12377 * @widget: the widget
12379 * Gets whether gtk_widget_set_hexpand() has been used to
12380 * explicitly set the expand flag on this widget.
12382 * If hexpand is set, then it overrides any computed
12383 * expand value based on child widgets. If hexpand is not
12384 * set, then the expand value depends on whether any
12385 * children of the widget would like to expand.
12387 * There are few reasons to use this function, but it's here
12388 * for completeness and consistency.
12390 * Return value: whether hexpand has been explicitly set
12393 gtk_widget_get_hexpand_set (GtkWidget *widget)
12395 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
12397 return widget->priv->hexpand_set;
12401 * gtk_widget_set_hexpand_set:
12402 * @widget: the widget
12403 * @set: value for hexpand-set property
12405 * Sets whether the hexpand flag (see gtk_widget_get_hexpand()) will
12408 * The hexpand-set property will be set automatically when you call
12409 * gtk_widget_set_hexpand() to set hexpand, so the most likely
12410 * reason to use this function would be to unset an explicit expand
12413 * If hexpand is set, then it overrides any computed
12414 * expand value based on child widgets. If hexpand is not
12415 * set, then the expand value depends on whether any
12416 * children of the widget would like to expand.
12418 * There are few reasons to use this function, but it's here
12419 * for completeness and consistency.
12422 gtk_widget_set_hexpand_set (GtkWidget *widget,
12425 g_return_if_fail (GTK_IS_WIDGET (widget));
12427 gtk_widget_set_expand_set (widget, GTK_ORIENTATION_HORIZONTAL, set);
12432 * gtk_widget_get_vexpand:
12433 * @widget: the widget
12435 * Gets whether the widget would like any available extra vertical
12438 * See gtk_widget_get_hexpand() for more detail.
12440 * Return value: whether vexpand flag is set
12443 gtk_widget_get_vexpand (GtkWidget *widget)
12445 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
12447 return widget->priv->vexpand;
12451 * gtk_widget_set_vexpand:
12452 * @widget: the widget
12453 * @expand: whether to expand
12455 * Sets whether the widget would like any available extra vertical
12458 * See gtk_widget_set_hexpand() for more detail.
12461 gtk_widget_set_vexpand (GtkWidget *widget,
12464 g_return_if_fail (GTK_IS_WIDGET (widget));
12466 gtk_widget_set_expand (widget, GTK_ORIENTATION_VERTICAL, expand);
12470 * gtk_widget_get_vexpand_set:
12471 * @widget: the widget
12473 * Gets whether gtk_widget_set_vexpand() has been used to
12474 * explicitly set the expand flag on this widget.
12476 * See gtk_widget_get_hexpand_set() for more detail.
12478 * Return value: whether vexpand has been explicitly set
12481 gtk_widget_get_vexpand_set (GtkWidget *widget)
12483 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
12485 return widget->priv->vexpand_set;
12489 * gtk_widget_set_vexpand_set:
12490 * @widget: the widget
12491 * @set: value for vexpand-set property
12493 * Sets whether the vexpand flag (see gtk_widget_get_vexpand()) will
12496 * See gtk_widget_set_hexpand_set() for more detail.
12499 gtk_widget_set_vexpand_set (GtkWidget *widget,
12502 g_return_if_fail (GTK_IS_WIDGET (widget));
12504 gtk_widget_set_expand_set (widget, GTK_ORIENTATION_VERTICAL, set);
12508 * GtkBuildable implementation
12510 static GQuark quark_builder_has_default = 0;
12511 static GQuark quark_builder_has_focus = 0;
12512 static GQuark quark_builder_atk_relations = 0;
12513 static GQuark quark_builder_set_name = 0;
12516 gtk_widget_buildable_interface_init (GtkBuildableIface *iface)
12518 quark_builder_has_default = g_quark_from_static_string ("gtk-builder-has-default");
12519 quark_builder_has_focus = g_quark_from_static_string ("gtk-builder-has-focus");
12520 quark_builder_atk_relations = g_quark_from_static_string ("gtk-builder-atk-relations");
12521 quark_builder_set_name = g_quark_from_static_string ("gtk-builder-set-name");
12523 iface->set_name = gtk_widget_buildable_set_name;
12524 iface->get_name = gtk_widget_buildable_get_name;
12525 iface->get_internal_child = gtk_widget_buildable_get_internal_child;
12526 iface->set_buildable_property = gtk_widget_buildable_set_buildable_property;
12527 iface->parser_finished = gtk_widget_buildable_parser_finished;
12528 iface->custom_tag_start = gtk_widget_buildable_custom_tag_start;
12529 iface->custom_finished = gtk_widget_buildable_custom_finished;
12533 gtk_widget_buildable_set_name (GtkBuildable *buildable,
12536 g_object_set_qdata_full (G_OBJECT (buildable), quark_builder_set_name,
12537 g_strdup (name), g_free);
12540 static const gchar *
12541 gtk_widget_buildable_get_name (GtkBuildable *buildable)
12543 return g_object_get_qdata (G_OBJECT (buildable), quark_builder_set_name);
12547 gtk_widget_buildable_get_internal_child (GtkBuildable *buildable,
12548 GtkBuilder *builder,
12549 const gchar *childname)
12551 if (strcmp (childname, "accessible") == 0)
12552 return G_OBJECT (gtk_widget_get_accessible (GTK_WIDGET (buildable)));
12558 gtk_widget_buildable_set_buildable_property (GtkBuildable *buildable,
12559 GtkBuilder *builder,
12561 const GValue *value)
12563 if (strcmp (name, "has-default") == 0 && g_value_get_boolean (value))
12564 g_object_set_qdata (G_OBJECT (buildable), quark_builder_has_default,
12565 GINT_TO_POINTER (TRUE));
12566 else if (strcmp (name, "has-focus") == 0 && g_value_get_boolean (value))
12567 g_object_set_qdata (G_OBJECT (buildable), quark_builder_has_focus,
12568 GINT_TO_POINTER (TRUE));
12570 g_object_set_property (G_OBJECT (buildable), name, value);
12575 gchar *action_name;
12576 GString *description;
12578 gboolean translatable;
12588 free_action (AtkActionData *data, gpointer user_data)
12590 g_free (data->action_name);
12591 g_string_free (data->description, TRUE);
12592 g_free (data->context);
12593 g_slice_free (AtkActionData, data);
12597 free_relation (AtkRelationData *data, gpointer user_data)
12599 g_free (data->target);
12600 g_free (data->type);
12601 g_slice_free (AtkRelationData, data);
12605 gtk_widget_buildable_parser_finished (GtkBuildable *buildable,
12606 GtkBuilder *builder)
12608 GSList *atk_relations;
12610 if (g_object_get_qdata (G_OBJECT (buildable), quark_builder_has_default))
12611 gtk_widget_grab_default (GTK_WIDGET (buildable));
12612 if (g_object_get_qdata (G_OBJECT (buildable), quark_builder_has_focus))
12613 gtk_widget_grab_focus (GTK_WIDGET (buildable));
12615 atk_relations = g_object_get_qdata (G_OBJECT (buildable),
12616 quark_builder_atk_relations);
12619 AtkObject *accessible;
12620 AtkRelationSet *relation_set;
12623 AtkRelationType relation_type;
12624 AtkObject *target_accessible;
12626 accessible = gtk_widget_get_accessible (GTK_WIDGET (buildable));
12627 relation_set = atk_object_ref_relation_set (accessible);
12629 for (l = atk_relations; l; l = l->next)
12631 AtkRelationData *relation = (AtkRelationData*)l->data;
12633 target = gtk_builder_get_object (builder, relation->target);
12636 g_warning ("Target object %s in <relation> does not exist",
12640 target_accessible = gtk_widget_get_accessible (GTK_WIDGET (target));
12641 g_assert (target_accessible != NULL);
12643 relation_type = atk_relation_type_for_name (relation->type);
12644 if (relation_type == ATK_RELATION_NULL)
12646 g_warning ("<relation> type %s not found",
12650 atk_relation_set_add_relation_by_type (relation_set, relation_type,
12651 target_accessible);
12653 g_object_unref (relation_set);
12655 g_slist_free_full (atk_relations, (GDestroyNotify) free_relation);
12656 g_object_set_qdata (G_OBJECT (buildable), quark_builder_atk_relations,
12665 } AccessibilitySubParserData;
12668 accessibility_start_element (GMarkupParseContext *context,
12669 const gchar *element_name,
12670 const gchar **names,
12671 const gchar **values,
12672 gpointer user_data,
12675 AccessibilitySubParserData *data = (AccessibilitySubParserData*)user_data;
12677 gint line_number, char_number;
12679 if (strcmp (element_name, "relation") == 0)
12681 gchar *target = NULL;
12682 gchar *type = NULL;
12683 AtkRelationData *relation;
12685 for (i = 0; names[i]; i++)
12687 if (strcmp (names[i], "target") == 0)
12688 target = g_strdup (values[i]);
12689 else if (strcmp (names[i], "type") == 0)
12690 type = g_strdup (values[i]);
12693 g_markup_parse_context_get_position (context,
12696 g_set_error (error,
12698 GTK_BUILDER_ERROR_INVALID_ATTRIBUTE,
12699 "%s:%d:%d '%s' is not a valid attribute of <%s>",
12701 line_number, char_number, names[i], "relation");
12708 if (!target || !type)
12710 g_markup_parse_context_get_position (context,
12713 g_set_error (error,
12715 GTK_BUILDER_ERROR_MISSING_ATTRIBUTE,
12716 "%s:%d:%d <%s> requires attribute \"%s\"",
12718 line_number, char_number, "relation",
12719 type ? "target" : "type");
12725 relation = g_slice_new (AtkRelationData);
12726 relation->target = target;
12727 relation->type = type;
12729 data->relations = g_slist_prepend (data->relations, relation);
12731 else if (strcmp (element_name, "action") == 0)
12733 const gchar *action_name = NULL;
12734 const gchar *description = NULL;
12735 const gchar *msg_context = NULL;
12736 gboolean translatable = FALSE;
12737 AtkActionData *action;
12739 for (i = 0; names[i]; i++)
12741 if (strcmp (names[i], "action_name") == 0)
12742 action_name = values[i];
12743 else if (strcmp (names[i], "description") == 0)
12744 description = values[i];
12745 else if (strcmp (names[i], "translatable") == 0)
12747 if (!_gtk_builder_boolean_from_string (values[i], &translatable, error))
12750 else if (strcmp (names[i], "comments") == 0)
12752 /* do nothing, comments are for translators */
12754 else if (strcmp (names[i], "context") == 0)
12755 msg_context = values[i];
12758 g_markup_parse_context_get_position (context,
12761 g_set_error (error,
12763 GTK_BUILDER_ERROR_INVALID_ATTRIBUTE,
12764 "%s:%d:%d '%s' is not a valid attribute of <%s>",
12766 line_number, char_number, names[i], "action");
12773 g_markup_parse_context_get_position (context,
12776 g_set_error (error,
12778 GTK_BUILDER_ERROR_MISSING_ATTRIBUTE,
12779 "%s:%d:%d <%s> requires attribute \"%s\"",
12781 line_number, char_number, "action",
12786 action = g_slice_new (AtkActionData);
12787 action->action_name = g_strdup (action_name);
12788 action->description = g_string_new (description);
12789 action->context = g_strdup (msg_context);
12790 action->translatable = translatable;
12792 data->actions = g_slist_prepend (data->actions, action);
12794 else if (strcmp (element_name, "accessibility") == 0)
12797 g_warning ("Unsupported tag for GtkWidget: %s\n", element_name);
12801 accessibility_text (GMarkupParseContext *context,
12804 gpointer user_data,
12807 AccessibilitySubParserData *data = (AccessibilitySubParserData*)user_data;
12809 if (strcmp (g_markup_parse_context_get_element (context), "action") == 0)
12811 AtkActionData *action = data->actions->data;
12813 g_string_append_len (action->description, text, text_len);
12817 static const GMarkupParser accessibility_parser =
12819 accessibility_start_element,
12821 accessibility_text,
12830 } AccelGroupParserData;
12833 accel_group_start_element (GMarkupParseContext *context,
12834 const gchar *element_name,
12835 const gchar **names,
12836 const gchar **values,
12837 gpointer user_data,
12842 guint modifiers = 0;
12843 gchar *signal = NULL;
12844 AccelGroupParserData *parser_data = (AccelGroupParserData*)user_data;
12846 for (i = 0; names[i]; i++)
12848 if (strcmp (names[i], "key") == 0)
12849 key = gdk_keyval_from_name (values[i]);
12850 else if (strcmp (names[i], "modifiers") == 0)
12852 if (!_gtk_builder_flags_from_string (GDK_TYPE_MODIFIER_TYPE,
12858 else if (strcmp (names[i], "signal") == 0)
12859 signal = g_strdup (values[i]);
12862 if (key == 0 || signal == NULL)
12864 g_warning ("<accelerator> requires key and signal attributes");
12867 parser_data->key = key;
12868 parser_data->modifiers = modifiers;
12869 parser_data->signal = signal;
12872 static const GMarkupParser accel_group_parser =
12874 accel_group_start_element,
12883 style_start_element (GMarkupParseContext *context,
12884 const gchar *element_name,
12885 const gchar **names,
12886 const gchar **values,
12887 gpointer user_data,
12890 StyleParserData *style_data = (StyleParserData *)user_data;
12893 if (strcmp (element_name, "class") == 0)
12895 if (g_markup_collect_attributes (element_name,
12899 G_MARKUP_COLLECT_STRDUP, "name", &class_name,
12900 G_MARKUP_COLLECT_INVALID))
12902 style_data->classes = g_slist_append (style_data->classes, class_name);
12905 else if (strcmp (element_name, "style") == 0)
12908 g_warning ("Unsupported tag for GtkWidget: %s\n", element_name);
12911 static const GMarkupParser style_parser =
12913 style_start_element,
12917 gtk_widget_buildable_custom_tag_start (GtkBuildable *buildable,
12918 GtkBuilder *builder,
12920 const gchar *tagname,
12921 GMarkupParser *parser,
12924 g_assert (buildable);
12926 if (strcmp (tagname, "accelerator") == 0)
12928 AccelGroupParserData *parser_data;
12930 parser_data = g_slice_new0 (AccelGroupParserData);
12931 parser_data->object = g_object_ref (buildable);
12932 *parser = accel_group_parser;
12933 *data = parser_data;
12936 if (strcmp (tagname, "accessibility") == 0)
12938 AccessibilitySubParserData *parser_data;
12940 parser_data = g_slice_new0 (AccessibilitySubParserData);
12941 *parser = accessibility_parser;
12942 *data = parser_data;
12945 if (strcmp (tagname, "style") == 0)
12947 StyleParserData *parser_data;
12949 parser_data = g_slice_new0 (StyleParserData);
12950 *parser = style_parser;
12951 *data = parser_data;
12959 _gtk_widget_buildable_finish_accelerator (GtkWidget *widget,
12960 GtkWidget *toplevel,
12961 gpointer user_data)
12963 AccelGroupParserData *accel_data;
12964 GSList *accel_groups;
12965 GtkAccelGroup *accel_group;
12967 g_return_if_fail (GTK_IS_WIDGET (widget));
12968 g_return_if_fail (GTK_IS_WIDGET (toplevel));
12969 g_return_if_fail (user_data != NULL);
12971 accel_data = (AccelGroupParserData*)user_data;
12972 accel_groups = gtk_accel_groups_from_object (G_OBJECT (toplevel));
12973 if (g_slist_length (accel_groups) == 0)
12975 accel_group = gtk_accel_group_new ();
12976 gtk_window_add_accel_group (GTK_WINDOW (toplevel), accel_group);
12980 g_assert (g_slist_length (accel_groups) == 1);
12981 accel_group = g_slist_nth_data (accel_groups, 0);
12984 gtk_widget_add_accelerator (GTK_WIDGET (accel_data->object),
12985 accel_data->signal,
12988 accel_data->modifiers,
12989 GTK_ACCEL_VISIBLE);
12991 g_object_unref (accel_data->object);
12992 g_free (accel_data->signal);
12993 g_slice_free (AccelGroupParserData, accel_data);
12997 gtk_widget_buildable_custom_finished (GtkBuildable *buildable,
12998 GtkBuilder *builder,
13000 const gchar *tagname,
13001 gpointer user_data)
13003 if (strcmp (tagname, "accelerator") == 0)
13005 AccelGroupParserData *accel_data;
13006 GtkWidget *toplevel;
13008 accel_data = (AccelGroupParserData*)user_data;
13009 g_assert (accel_data->object);
13011 toplevel = gtk_widget_get_toplevel (GTK_WIDGET (accel_data->object));
13013 _gtk_widget_buildable_finish_accelerator (GTK_WIDGET (buildable), toplevel, user_data);
13015 else if (strcmp (tagname, "accessibility") == 0)
13017 AccessibilitySubParserData *a11y_data;
13019 a11y_data = (AccessibilitySubParserData*)user_data;
13021 if (a11y_data->actions)
13023 AtkObject *accessible;
13028 accessible = gtk_widget_get_accessible (GTK_WIDGET (buildable));
13030 if (ATK_IS_ACTION (accessible))
13032 action = ATK_ACTION (accessible);
13033 n_actions = atk_action_get_n_actions (action);
13035 for (l = a11y_data->actions; l; l = l->next)
13037 AtkActionData *action_data = (AtkActionData*)l->data;
13039 for (i = 0; i < n_actions; i++)
13040 if (strcmp (atk_action_get_name (action, i),
13041 action_data->action_name) == 0)
13046 gchar *description;
13048 if (action_data->translatable && action_data->description->len)
13049 description = _gtk_builder_parser_translate (gtk_builder_get_translation_domain (builder),
13050 action_data->context,
13051 action_data->description->str);
13053 description = action_data->description->str;
13055 atk_action_set_description (action, i, description);
13060 g_warning ("accessibility action on a widget that does not implement AtkAction");
13062 g_slist_free_full (a11y_data->actions, (GDestroyNotify) free_action);
13065 if (a11y_data->relations)
13066 g_object_set_qdata (G_OBJECT (buildable), quark_builder_atk_relations,
13067 a11y_data->relations);
13069 g_slice_free (AccessibilitySubParserData, a11y_data);
13071 else if (strcmp (tagname, "style") == 0)
13073 StyleParserData *style_data = (StyleParserData *)user_data;
13074 GtkStyleContext *context;
13077 context = gtk_widget_get_style_context (GTK_WIDGET (buildable));
13079 for (l = style_data->classes; l; l = l->next)
13080 gtk_style_context_add_class (context, (const gchar *)l->data);
13082 gtk_widget_reset_style (GTK_WIDGET (buildable));
13084 g_slist_free_full (style_data->classes, g_free);
13085 g_slice_free (StyleParserData, style_data);
13089 static GtkSizeRequestMode
13090 gtk_widget_real_get_request_mode (GtkWidget *widget)
13092 /* By default widgets dont trade size at all. */
13093 return GTK_SIZE_REQUEST_CONSTANT_SIZE;
13097 gtk_widget_real_get_width (GtkWidget *widget,
13098 gint *minimum_size,
13099 gint *natural_size)
13109 gtk_widget_real_get_height (GtkWidget *widget,
13110 gint *minimum_size,
13111 gint *natural_size)
13121 gtk_widget_real_get_height_for_width (GtkWidget *widget,
13123 gint *minimum_height,
13124 gint *natural_height)
13126 GTK_WIDGET_GET_CLASS (widget)->get_preferred_height (widget, minimum_height, natural_height);
13130 gtk_widget_real_get_width_for_height (GtkWidget *widget,
13132 gint *minimum_width,
13133 gint *natural_width)
13135 GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget, minimum_width, natural_width);
13139 * gtk_widget_get_halign:
13140 * @widget: a #GtkWidget
13142 * Gets the value of the #GtkWidget:halign property.
13144 * Returns: the horizontal alignment of @widget
13147 gtk_widget_get_halign (GtkWidget *widget)
13149 g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_ALIGN_FILL);
13150 return _gtk_widget_get_aux_info_or_defaults (widget)->halign;
13154 * gtk_widget_set_halign:
13155 * @widget: a #GtkWidget
13156 * @align: the horizontal alignment
13158 * Sets the horizontal alignment of @widget.
13159 * See the #GtkWidget:halign property.
13162 gtk_widget_set_halign (GtkWidget *widget,
13165 GtkWidgetAuxInfo *aux_info;
13167 g_return_if_fail (GTK_IS_WIDGET (widget));
13169 aux_info = gtk_widget_get_aux_info (widget, TRUE);
13171 if (aux_info->halign == align)
13174 aux_info->halign = align;
13175 gtk_widget_queue_resize (widget);
13176 g_object_notify (G_OBJECT (widget), "halign");
13180 * gtk_widget_get_valign:
13181 * @widget: a #GtkWidget
13183 * Gets the value of the #GtkWidget:valign property.
13185 * Returns: the vertical alignment of @widget
13188 gtk_widget_get_valign (GtkWidget *widget)
13190 g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_ALIGN_FILL);
13191 return _gtk_widget_get_aux_info_or_defaults (widget)->valign;
13195 * gtk_widget_set_valign:
13196 * @widget: a #GtkWidget
13197 * @align: the vertical alignment
13199 * Sets the vertical alignment of @widget.
13200 * See the #GtkWidget:valign property.
13203 gtk_widget_set_valign (GtkWidget *widget,
13206 GtkWidgetAuxInfo *aux_info;
13208 g_return_if_fail (GTK_IS_WIDGET (widget));
13210 aux_info = gtk_widget_get_aux_info (widget, TRUE);
13212 if (aux_info->valign == align)
13215 aux_info->valign = align;
13216 gtk_widget_queue_resize (widget);
13217 g_object_notify (G_OBJECT (widget), "valign");
13221 * gtk_widget_get_margin_left:
13222 * @widget: a #GtkWidget
13224 * Gets the value of the #GtkWidget:margin-left property.
13226 * Returns: The left margin of @widget
13231 gtk_widget_get_margin_left (GtkWidget *widget)
13233 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
13235 return _gtk_widget_get_aux_info_or_defaults (widget)->margin.left;
13239 * gtk_widget_set_margin_left:
13240 * @widget: a #GtkWidget
13241 * @margin: the left margin
13243 * Sets the left margin of @widget.
13244 * See the #GtkWidget:margin-left property.
13249 gtk_widget_set_margin_left (GtkWidget *widget,
13252 GtkWidgetAuxInfo *aux_info;
13254 g_return_if_fail (GTK_IS_WIDGET (widget));
13255 g_return_if_fail (margin <= G_MAXINT16);
13257 aux_info = gtk_widget_get_aux_info (widget, TRUE);
13259 if (aux_info->margin.left == margin)
13262 aux_info->margin.left = margin;
13263 gtk_widget_queue_resize (widget);
13264 g_object_notify (G_OBJECT (widget), "margin-left");
13268 * gtk_widget_get_margin_right:
13269 * @widget: a #GtkWidget
13271 * Gets the value of the #GtkWidget:margin-right property.
13273 * Returns: The right margin of @widget
13278 gtk_widget_get_margin_right (GtkWidget *widget)
13280 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
13282 return _gtk_widget_get_aux_info_or_defaults (widget)->margin.right;
13286 * gtk_widget_set_margin_right:
13287 * @widget: a #GtkWidget
13288 * @margin: the right margin
13290 * Sets the right margin of @widget.
13291 * See the #GtkWidget:margin-right property.
13296 gtk_widget_set_margin_right (GtkWidget *widget,
13299 GtkWidgetAuxInfo *aux_info;
13301 g_return_if_fail (GTK_IS_WIDGET (widget));
13302 g_return_if_fail (margin <= G_MAXINT16);
13304 aux_info = gtk_widget_get_aux_info (widget, TRUE);
13306 if (aux_info->margin.right == margin)
13309 aux_info->margin.right = margin;
13310 gtk_widget_queue_resize (widget);
13311 g_object_notify (G_OBJECT (widget), "margin-right");
13315 * gtk_widget_get_margin_top:
13316 * @widget: a #GtkWidget
13318 * Gets the value of the #GtkWidget:margin-top property.
13320 * Returns: The top margin of @widget
13325 gtk_widget_get_margin_top (GtkWidget *widget)
13327 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
13329 return _gtk_widget_get_aux_info_or_defaults (widget)->margin.top;
13333 * gtk_widget_set_margin_top:
13334 * @widget: a #GtkWidget
13335 * @margin: the top margin
13337 * Sets the top margin of @widget.
13338 * See the #GtkWidget:margin-top property.
13343 gtk_widget_set_margin_top (GtkWidget *widget,
13346 GtkWidgetAuxInfo *aux_info;
13348 g_return_if_fail (GTK_IS_WIDGET (widget));
13349 g_return_if_fail (margin <= G_MAXINT16);
13351 aux_info = gtk_widget_get_aux_info (widget, TRUE);
13353 if (aux_info->margin.top == margin)
13356 aux_info->margin.top = margin;
13357 gtk_widget_queue_resize (widget);
13358 g_object_notify (G_OBJECT (widget), "margin-top");
13362 * gtk_widget_get_margin_bottom:
13363 * @widget: a #GtkWidget
13365 * Gets the value of the #GtkWidget:margin-bottom property.
13367 * Returns: The bottom margin of @widget
13372 gtk_widget_get_margin_bottom (GtkWidget *widget)
13374 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
13376 return _gtk_widget_get_aux_info_or_defaults (widget)->margin.bottom;
13380 * gtk_widget_set_margin_bottom:
13381 * @widget: a #GtkWidget
13382 * @margin: the bottom margin
13384 * Sets the bottom margin of @widget.
13385 * See the #GtkWidget:margin-bottom property.
13390 gtk_widget_set_margin_bottom (GtkWidget *widget,
13393 GtkWidgetAuxInfo *aux_info;
13395 g_return_if_fail (GTK_IS_WIDGET (widget));
13396 g_return_if_fail (margin <= G_MAXINT16);
13398 aux_info = gtk_widget_get_aux_info (widget, TRUE);
13400 if (aux_info->margin.bottom == margin)
13403 aux_info->margin.bottom = margin;
13404 gtk_widget_queue_resize (widget);
13405 g_object_notify (G_OBJECT (widget), "margin-bottom");
13409 * gtk_widget_get_clipboard:
13410 * @widget: a #GtkWidget
13411 * @selection: a #GdkAtom which identifies the clipboard
13412 * to use. %GDK_SELECTION_CLIPBOARD gives the
13413 * default clipboard. Another common value
13414 * is %GDK_SELECTION_PRIMARY, which gives
13415 * the primary X selection.
13417 * Returns the clipboard object for the given selection to
13418 * be used with @widget. @widget must have a #GdkDisplay
13419 * associated with it, so must be attached to a toplevel
13422 * Return value: (transfer none): the appropriate clipboard object. If no
13423 * clipboard already exists, a new one will
13424 * be created. Once a clipboard object has
13425 * been created, it is persistent for all time.
13430 gtk_widget_get_clipboard (GtkWidget *widget, GdkAtom selection)
13432 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
13433 g_return_val_if_fail (gtk_widget_has_screen (widget), NULL);
13435 return gtk_clipboard_get_for_display (gtk_widget_get_display (widget),
13440 * gtk_widget_list_mnemonic_labels:
13441 * @widget: a #GtkWidget
13443 * Returns a newly allocated list of the widgets, normally labels, for
13444 * which this widget is the target of a mnemonic (see for example,
13445 * gtk_label_set_mnemonic_widget()).
13447 * The widgets in the list are not individually referenced. If you
13448 * want to iterate through the list and perform actions involving
13449 * callbacks that might destroy the widgets, you
13450 * <emphasis>must</emphasis> call <literal>g_list_foreach (result,
13451 * (GFunc)g_object_ref, NULL)</literal> first, and then unref all the
13452 * widgets afterwards.
13454 * Return value: (element-type GtkWidget) (transfer container): the list of
13455 * mnemonic labels; free this list
13456 * with g_list_free() when you are done with it.
13461 gtk_widget_list_mnemonic_labels (GtkWidget *widget)
13463 GList *list = NULL;
13466 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
13468 for (l = g_object_get_qdata (G_OBJECT (widget), quark_mnemonic_labels); l; l = l->next)
13469 list = g_list_prepend (list, l->data);
13475 * gtk_widget_add_mnemonic_label:
13476 * @widget: a #GtkWidget
13477 * @label: a #GtkWidget that acts as a mnemonic label for @widget
13479 * Adds a widget to the list of mnemonic labels for
13480 * this widget. (See gtk_widget_list_mnemonic_labels()). Note the
13481 * list of mnemonic labels for the widget is cleared when the
13482 * widget is destroyed, so the caller must make sure to update
13483 * its internal state at this point as well, by using a connection
13484 * to the #GtkWidget::destroy signal or a weak notifier.
13489 gtk_widget_add_mnemonic_label (GtkWidget *widget,
13492 GSList *old_list, *new_list;
13494 g_return_if_fail (GTK_IS_WIDGET (widget));
13495 g_return_if_fail (GTK_IS_WIDGET (label));
13497 old_list = g_object_steal_qdata (G_OBJECT (widget), quark_mnemonic_labels);
13498 new_list = g_slist_prepend (old_list, label);
13500 g_object_set_qdata_full (G_OBJECT (widget), quark_mnemonic_labels,
13501 new_list, (GDestroyNotify) g_slist_free);
13505 * gtk_widget_remove_mnemonic_label:
13506 * @widget: a #GtkWidget
13507 * @label: a #GtkWidget that was previously set as a mnemnic label for
13508 * @widget with gtk_widget_add_mnemonic_label().
13510 * Removes a widget from the list of mnemonic labels for
13511 * this widget. (See gtk_widget_list_mnemonic_labels()). The widget
13512 * must have previously been added to the list with
13513 * gtk_widget_add_mnemonic_label().
13518 gtk_widget_remove_mnemonic_label (GtkWidget *widget,
13521 GSList *old_list, *new_list;
13523 g_return_if_fail (GTK_IS_WIDGET (widget));
13524 g_return_if_fail (GTK_IS_WIDGET (label));
13526 old_list = g_object_steal_qdata (G_OBJECT (widget), quark_mnemonic_labels);
13527 new_list = g_slist_remove (old_list, label);
13530 g_object_set_qdata_full (G_OBJECT (widget), quark_mnemonic_labels,
13531 new_list, (GDestroyNotify) g_slist_free);
13535 * gtk_widget_get_no_show_all:
13536 * @widget: a #GtkWidget
13538 * Returns the current value of the #GtkWidget:no-show-all property,
13539 * which determines whether calls to gtk_widget_show_all()
13540 * will affect this widget.
13542 * Return value: the current value of the "no-show-all" property.
13547 gtk_widget_get_no_show_all (GtkWidget *widget)
13549 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
13551 return widget->priv->no_show_all;
13555 * gtk_widget_set_no_show_all:
13556 * @widget: a #GtkWidget
13557 * @no_show_all: the new value for the "no-show-all" property
13559 * Sets the #GtkWidget:no-show-all property, which determines whether
13560 * calls to gtk_widget_show_all() will affect this widget.
13562 * This is mostly for use in constructing widget hierarchies with externally
13563 * controlled visibility, see #GtkUIManager.
13568 gtk_widget_set_no_show_all (GtkWidget *widget,
13569 gboolean no_show_all)
13571 g_return_if_fail (GTK_IS_WIDGET (widget));
13573 no_show_all = (no_show_all != FALSE);
13575 if (widget->priv->no_show_all != no_show_all)
13577 widget->priv->no_show_all = no_show_all;
13579 g_object_notify (G_OBJECT (widget), "no-show-all");
13585 gtk_widget_real_set_has_tooltip (GtkWidget *widget,
13586 gboolean has_tooltip,
13589 GtkWidgetPrivate *priv = widget->priv;
13590 gboolean priv_has_tooltip;
13592 priv_has_tooltip = GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (widget),
13593 quark_has_tooltip));
13595 if (priv_has_tooltip != has_tooltip || force)
13597 priv_has_tooltip = has_tooltip;
13599 if (priv_has_tooltip)
13601 if (gtk_widget_get_realized (widget) && !gtk_widget_get_has_window (widget))
13602 gdk_window_set_events (priv->window,
13603 gdk_window_get_events (priv->window) |
13604 GDK_LEAVE_NOTIFY_MASK |
13605 GDK_POINTER_MOTION_MASK |
13606 GDK_POINTER_MOTION_HINT_MASK);
13608 if (gtk_widget_get_has_window (widget))
13609 gtk_widget_add_events (widget,
13610 GDK_LEAVE_NOTIFY_MASK |
13611 GDK_POINTER_MOTION_MASK |
13612 GDK_POINTER_MOTION_HINT_MASK);
13615 g_object_set_qdata (G_OBJECT (widget), quark_has_tooltip,
13616 GUINT_TO_POINTER (priv_has_tooltip));
13621 * gtk_widget_set_tooltip_window:
13622 * @widget: a #GtkWidget
13623 * @custom_window: (allow-none): a #GtkWindow, or %NULL
13625 * Replaces the default, usually yellow, window used for displaying
13626 * tooltips with @custom_window. GTK+ will take care of showing and
13627 * hiding @custom_window at the right moment, to behave likewise as
13628 * the default tooltip window. If @custom_window is %NULL, the default
13629 * tooltip window will be used.
13631 * If the custom window should have the default theming it needs to
13632 * have the name "gtk-tooltip", see gtk_widget_set_name().
13637 gtk_widget_set_tooltip_window (GtkWidget *widget,
13638 GtkWindow *custom_window)
13640 gboolean has_tooltip;
13641 gchar *tooltip_markup;
13643 g_return_if_fail (GTK_IS_WIDGET (widget));
13644 g_return_if_fail (custom_window == NULL || GTK_IS_WINDOW (custom_window));
13646 tooltip_markup = g_object_get_qdata (G_OBJECT (widget), quark_tooltip_markup);
13649 g_object_ref (custom_window);
13651 g_object_set_qdata_full (G_OBJECT (widget), quark_tooltip_window,
13652 custom_window, g_object_unref);
13654 has_tooltip = (custom_window != NULL || tooltip_markup != NULL);
13655 gtk_widget_real_set_has_tooltip (widget, has_tooltip, FALSE);
13657 if (has_tooltip && gtk_widget_get_visible (widget))
13658 gtk_widget_queue_tooltip_query (widget);
13662 * gtk_widget_get_tooltip_window:
13663 * @widget: a #GtkWidget
13665 * Returns the #GtkWindow of the current tooltip. This can be the
13666 * GtkWindow created by default, or the custom tooltip window set
13667 * using gtk_widget_set_tooltip_window().
13669 * Return value: (transfer none): The #GtkWindow of the current tooltip.
13674 gtk_widget_get_tooltip_window (GtkWidget *widget)
13676 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
13678 return g_object_get_qdata (G_OBJECT (widget), quark_tooltip_window);
13682 * gtk_widget_trigger_tooltip_query:
13683 * @widget: a #GtkWidget
13685 * Triggers a tooltip query on the display where the toplevel of @widget
13686 * is located. See gtk_tooltip_trigger_tooltip_query() for more
13692 gtk_widget_trigger_tooltip_query (GtkWidget *widget)
13694 gtk_tooltip_trigger_tooltip_query (gtk_widget_get_display (widget));
13697 static guint tooltip_query_id;
13698 static GSList *tooltip_query_displays;
13701 tooltip_query_idle (gpointer data)
13703 g_slist_foreach (tooltip_query_displays, (GFunc)gtk_tooltip_trigger_tooltip_query, NULL);
13704 g_slist_foreach (tooltip_query_displays, (GFunc)g_object_unref, NULL);
13705 g_slist_free (tooltip_query_displays);
13707 tooltip_query_displays = NULL;
13708 tooltip_query_id = 0;
13714 gtk_widget_queue_tooltip_query (GtkWidget *widget)
13716 GdkDisplay *display;
13718 display = gtk_widget_get_display (widget);
13720 if (!g_slist_find (tooltip_query_displays, display))
13721 tooltip_query_displays = g_slist_prepend (tooltip_query_displays, g_object_ref (display));
13723 if (tooltip_query_id == 0)
13724 tooltip_query_id = gdk_threads_add_idle (tooltip_query_idle, NULL);
13728 * gtk_widget_set_tooltip_text:
13729 * @widget: a #GtkWidget
13730 * @text: (allow-none): the contents of the tooltip for @widget
13732 * Sets @text as the contents of the tooltip. This function will take
13733 * care of setting #GtkWidget:has-tooltip to %TRUE and of the default
13734 * handler for the #GtkWidget::query-tooltip signal.
13736 * See also the #GtkWidget:tooltip-text property and gtk_tooltip_set_text().
13741 gtk_widget_set_tooltip_text (GtkWidget *widget,
13744 g_return_if_fail (GTK_IS_WIDGET (widget));
13746 g_object_set (G_OBJECT (widget), "tooltip-text", text, NULL);
13750 * gtk_widget_get_tooltip_text:
13751 * @widget: a #GtkWidget
13753 * Gets the contents of the tooltip for @widget.
13755 * Return value: the tooltip text, or %NULL. You should free the
13756 * returned string with g_free() when done.
13761 gtk_widget_get_tooltip_text (GtkWidget *widget)
13763 gchar *text = NULL;
13765 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
13767 g_object_get (G_OBJECT (widget), "tooltip-text", &text, NULL);
13773 * gtk_widget_set_tooltip_markup:
13774 * @widget: a #GtkWidget
13775 * @markup: (allow-none): the contents of the tooltip for @widget, or %NULL
13777 * Sets @markup as the contents of the tooltip, which is marked up with
13778 * the <link linkend="PangoMarkupFormat">Pango text markup language</link>.
13780 * This function will take care of setting #GtkWidget:has-tooltip to %TRUE
13781 * and of the default handler for the #GtkWidget::query-tooltip signal.
13783 * See also the #GtkWidget:tooltip-markup property and
13784 * gtk_tooltip_set_markup().
13789 gtk_widget_set_tooltip_markup (GtkWidget *widget,
13790 const gchar *markup)
13792 g_return_if_fail (GTK_IS_WIDGET (widget));
13794 g_object_set (G_OBJECT (widget), "tooltip-markup", markup, NULL);
13798 * gtk_widget_get_tooltip_markup:
13799 * @widget: a #GtkWidget
13801 * Gets the contents of the tooltip for @widget.
13803 * Return value: the tooltip text, or %NULL. You should free the
13804 * returned string with g_free() when done.
13809 gtk_widget_get_tooltip_markup (GtkWidget *widget)
13811 gchar *text = NULL;
13813 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
13815 g_object_get (G_OBJECT (widget), "tooltip-markup", &text, NULL);
13821 * gtk_widget_set_has_tooltip:
13822 * @widget: a #GtkWidget
13823 * @has_tooltip: whether or not @widget has a tooltip.
13825 * Sets the has-tooltip property on @widget to @has_tooltip. See
13826 * #GtkWidget:has-tooltip for more information.
13831 gtk_widget_set_has_tooltip (GtkWidget *widget,
13832 gboolean has_tooltip)
13834 g_return_if_fail (GTK_IS_WIDGET (widget));
13836 g_object_set (G_OBJECT (widget), "has-tooltip", has_tooltip, NULL);
13840 * gtk_widget_get_has_tooltip:
13841 * @widget: a #GtkWidget
13843 * Returns the current value of the has-tooltip property. See
13844 * #GtkWidget:has-tooltip for more information.
13846 * Return value: current value of has-tooltip on @widget.
13851 gtk_widget_get_has_tooltip (GtkWidget *widget)
13853 gboolean has_tooltip = FALSE;
13855 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
13857 g_object_get (G_OBJECT (widget), "has-tooltip", &has_tooltip, NULL);
13859 return has_tooltip;
13863 * gtk_widget_get_allocation:
13864 * @widget: a #GtkWidget
13865 * @allocation: (out): a pointer to a #GtkAllocation to copy to
13867 * Retrieves the widget's allocation.
13869 * Note, when implementing a #GtkContainer: a widget's allocation will
13870 * be its "adjusted" allocation, that is, the widget's parent
13871 * container typically calls gtk_widget_size_allocate() with an
13872 * allocation, and that allocation is then adjusted (to handle margin
13873 * and alignment for example) before assignment to the widget.
13874 * gtk_widget_get_allocation() returns the adjusted allocation that
13875 * was actually assigned to the widget. The adjusted allocation is
13876 * guaranteed to be completely contained within the
13877 * gtk_widget_size_allocate() allocation, however. So a #GtkContainer
13878 * is guaranteed that its children stay inside the assigned bounds,
13879 * but not that they have exactly the bounds the container assigned.
13880 * There is no way to get the original allocation assigned by
13881 * gtk_widget_size_allocate(), since it isn't stored; if a container
13882 * implementation needs that information it will have to track it itself.
13887 gtk_widget_get_allocation (GtkWidget *widget,
13888 GtkAllocation *allocation)
13890 GtkWidgetPrivate *priv;
13892 g_return_if_fail (GTK_IS_WIDGET (widget));
13893 g_return_if_fail (allocation != NULL);
13895 priv = widget->priv;
13897 *allocation = priv->allocation;
13901 * gtk_widget_set_allocation:
13902 * @widget: a #GtkWidget
13903 * @allocation: a pointer to a #GtkAllocation to copy from
13905 * Sets the widget's allocation. This should not be used
13906 * directly, but from within a widget's size_allocate method.
13908 * The allocation set should be the "adjusted" or actual
13909 * allocation. If you're implementing a #GtkContainer, you want to use
13910 * gtk_widget_size_allocate() instead of gtk_widget_set_allocation().
13911 * The GtkWidgetClass::adjust_size_allocation virtual method adjusts the
13912 * allocation inside gtk_widget_size_allocate() to create an adjusted
13918 gtk_widget_set_allocation (GtkWidget *widget,
13919 const GtkAllocation *allocation)
13921 GtkWidgetPrivate *priv;
13923 g_return_if_fail (GTK_IS_WIDGET (widget));
13924 g_return_if_fail (gtk_widget_get_visible (widget) || gtk_widget_is_toplevel (widget));
13925 g_return_if_fail (allocation != NULL);
13927 priv = widget->priv;
13929 priv->allocation = *allocation;
13933 * gtk_widget_get_allocated_width:
13934 * @widget: the widget to query
13936 * Returns the width that has currently been allocated to @widget.
13937 * This function is intended to be used when implementing handlers
13938 * for the #GtkWidget::draw function.
13940 * Returns: the width of the @widget
13943 gtk_widget_get_allocated_width (GtkWidget *widget)
13945 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
13947 return widget->priv->allocation.width;
13951 * gtk_widget_get_allocated_height:
13952 * @widget: the widget to query
13954 * Returns the height that has currently been allocated to @widget.
13955 * This function is intended to be used when implementing handlers
13956 * for the #GtkWidget::draw function.
13958 * Returns: the height of the @widget
13961 gtk_widget_get_allocated_height (GtkWidget *widget)
13963 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
13965 return widget->priv->allocation.height;
13969 * gtk_widget_get_requisition:
13970 * @widget: a #GtkWidget
13971 * @requisition: (out): a pointer to a #GtkRequisition to copy to
13973 * Retrieves the widget's requisition.
13975 * This function should only be used by widget implementations in
13976 * order to figure whether the widget's requisition has actually
13977 * changed after some internal state change (so that they can call
13978 * gtk_widget_queue_resize() instead of gtk_widget_queue_draw()).
13980 * Normally, gtk_widget_size_request() should be used.
13984 * Deprecated: 3.0: The #GtkRequisition cache on the widget was
13985 * removed, If you need to cache sizes across requests and allocations,
13986 * add an explicit cache to the widget in question instead.
13989 gtk_widget_get_requisition (GtkWidget *widget,
13990 GtkRequisition *requisition)
13992 g_return_if_fail (GTK_IS_WIDGET (widget));
13993 g_return_if_fail (requisition != NULL);
13995 gtk_widget_get_preferred_size (widget, requisition, NULL);
13999 * gtk_widget_set_window:
14000 * @widget: a #GtkWidget
14001 * @window: (transfer full): a #GdkWindow
14003 * Sets a widget's window. This function should only be used in a
14004 * widget's #GtkWidget::realize implementation. The %window passed is
14005 * usually either new window created with gdk_window_new(), or the
14006 * window of its parent widget as returned by
14007 * gtk_widget_get_parent_window().
14009 * Widgets must indicate whether they will create their own #GdkWindow
14010 * by calling gtk_widget_set_has_window(). This is usually done in the
14011 * widget's init() function.
14013 * <note><para>This function does not add any reference to @window.</para></note>
14018 gtk_widget_set_window (GtkWidget *widget,
14021 GtkWidgetPrivate *priv;
14023 g_return_if_fail (GTK_IS_WIDGET (widget));
14024 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
14026 priv = widget->priv;
14028 if (priv->window != window)
14030 priv->window = window;
14032 if (gtk_widget_get_has_window (widget) && window != NULL && !gdk_window_has_native (window))
14033 gdk_window_set_opacity (window,
14034 priv->norender ? 0 : priv->alpha / 255.0);
14036 g_object_notify (G_OBJECT (widget), "window");
14041 * gtk_widget_register_window:
14042 * @widget: a #GtkWidget
14043 * @window: a #GdkWindow
14045 * Registers a #GdkWindow with the widget and sets it up so that
14046 * the widget recieves events for it. Call gtk_widget_unregister_window()
14047 * when destroying the window.
14049 * Before 3.8 you needed to call gdk_window_set_user_data() directly to set
14050 * this up. This is now deprecated and you should use gtk_widget_register_window()
14051 * instead. Old code will keep working as is, although some new features like
14052 * transparency might not work perfectly.
14057 gtk_widget_register_window (GtkWidget *widget,
14060 GtkWidgetPrivate *priv;
14061 gpointer user_data;
14063 g_return_if_fail (GTK_IS_WIDGET (widget));
14064 g_return_if_fail (GDK_IS_WINDOW (window));
14066 gdk_window_get_user_data (window, &user_data);
14067 g_assert (user_data == NULL);
14069 priv = widget->priv;
14071 gdk_window_set_user_data (window, widget);
14072 priv->registered_windows = g_list_prepend (priv->registered_windows, window);
14074 if (!gtk_widget_get_has_window (widget) && !gdk_window_has_native (window))
14075 gdk_window_set_opacity (window,
14076 priv->norender_children ? 0.0 : 1.0);
14080 * gtk_widget_unregister_window:
14081 * @widget: a #GtkWidget
14082 * @window: a #GdkWindow
14084 * Unregisters a #GdkWindow from the widget that was previously set up with
14085 * gtk_widget_register_window(). You need to call this when the window is
14086 * no longer used by the widget, such as when you destroy it.
14091 gtk_widget_unregister_window (GtkWidget *widget,
14094 GtkWidgetPrivate *priv;
14095 gpointer user_data;
14097 g_return_if_fail (GTK_IS_WIDGET (widget));
14098 g_return_if_fail (GDK_IS_WINDOW (window));
14100 priv = widget->priv;
14102 gdk_window_get_user_data (window, &user_data);
14103 g_assert (user_data == widget);
14104 gdk_window_set_user_data (window, NULL);
14105 priv->registered_windows = g_list_remove (priv->registered_windows, window);
14109 * gtk_widget_get_window:
14110 * @widget: a #GtkWidget
14112 * Returns the widget's window if it is realized, %NULL otherwise
14114 * Return value: (transfer none): @widget's window.
14119 gtk_widget_get_window (GtkWidget *widget)
14121 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
14123 return widget->priv->window;
14127 * gtk_widget_get_support_multidevice:
14128 * @widget: a #GtkWidget
14130 * Returns %TRUE if @widget is multiple pointer aware. See
14131 * gtk_widget_set_support_multidevice() for more information.
14133 * Returns: %TRUE if @widget is multidevice aware.
14136 gtk_widget_get_support_multidevice (GtkWidget *widget)
14138 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
14140 return widget->priv->multidevice;
14144 * gtk_widget_set_support_multidevice:
14145 * @widget: a #GtkWidget
14146 * @support_multidevice: %TRUE to support input from multiple devices.
14148 * Enables or disables multiple pointer awareness. If this setting is %TRUE,
14149 * @widget will start receiving multiple, per device enter/leave events. Note
14150 * that if custom #GdkWindow<!-- -->s are created in #GtkWidget::realize,
14151 * gdk_window_set_support_multidevice() will have to be called manually on them.
14156 gtk_widget_set_support_multidevice (GtkWidget *widget,
14157 gboolean support_multidevice)
14159 GtkWidgetPrivate *priv;
14161 g_return_if_fail (GTK_IS_WIDGET (widget));
14163 priv = widget->priv;
14164 priv->multidevice = (support_multidevice == TRUE);
14166 if (gtk_widget_get_realized (widget))
14167 gdk_window_set_support_multidevice (priv->window, support_multidevice);
14170 /* There are multiple alpha related sources. First of all the user can specify alpha
14171 * in gtk_widget_set_opacity, secondly we can get it from the css opacity. These two
14172 * are multiplied together to form the total alpha. Secondly, the user can specify
14173 * an opacity group for a widget, which means we must essentially handle it as having alpha.
14175 * We handle opacity in two ways. For a windowed widget, with opacity set but no opacity
14176 * group we directly set the opacity of widget->window. This will cause gdk to properly
14177 * redirect drawing inside the window to a buffer and do OVER paint_with_alpha.
14179 * However, if the widget is not windowed, or the user specified an opacity group for the
14180 * widget we do the opacity handling in the ::draw marshaller for the widget. A naive
14181 * implementation of this would break for windowed widgets or descendant widgets with
14182 * windows, as these would not be handled by the ::draw signal. To handle this we set
14183 * all such gdkwindows as fully transparent and then override gtk_cairo_should_draw_window()
14184 * to make the draw signal propagate to *all* child widgets/windows.
14186 * Note: We don't make all child windows fully transparent, we stop at the first one
14187 * in each branch when propagating down the hierarchy.
14191 /* This is called when priv->alpha or priv->opacity_group group changes, and should
14192 * update priv->norender and GdkWindow opacity for this widget and any children that
14193 * needs changing. It is also called whenver the parent changes, the parents
14194 * norender_children state changes, or the has_window state of the widget changes.
14197 gtk_widget_propagate_alpha (GtkWidget *widget)
14199 GtkWidgetPrivate *priv = widget->priv;
14201 gboolean norender, norender_children;
14204 parent = priv->parent;
14207 /* If this widget has an opacity group, never render it */
14208 priv->opacity_group ||
14209 /* If the parent has norender_children, propagate that here */
14210 (parent != NULL && parent->priv->norender_children);
14212 /* Windowed widget children should norender if: */
14213 norender_children =
14214 /* The widget is no_window (otherwise its enought to mark it norender/alpha), and */
14215 !gtk_widget_get_has_window (widget) &&
14216 ( /* norender is set, or */
14218 /* widget has an alpha */
14222 if (gtk_widget_get_has_window (widget))
14224 if (priv->window != NULL && !gdk_window_has_native (priv->window))
14225 gdk_window_set_opacity (priv->window,
14226 norender ? 0 : priv->alpha / 255.0);
14228 else /* !has_window */
14230 for (l = priv->registered_windows; l != NULL; l = l->next)
14232 GdkWindow *w = l->data;
14233 if (!gdk_window_has_native (w))
14234 gdk_window_set_opacity (w, norender_children ? 0.0 : 1.0);
14238 priv->norender = norender;
14239 if (priv->norender_children != norender_children)
14241 priv->norender_children = norender_children;
14243 if (GTK_IS_CONTAINER (widget))
14244 gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback)gtk_widget_propagate_alpha, NULL);
14247 if (gtk_widget_get_realized (widget))
14248 gtk_widget_queue_draw (widget);
14252 gtk_widget_update_alpha (GtkWidget *widget)
14254 GtkWidgetPrivate *priv;
14258 priv = widget->priv;
14260 alpha = priv->user_alpha;
14265 _gtk_css_number_value_get (_gtk_style_context_peek_property (priv->context,
14266 GTK_CSS_PROPERTY_OPACITY),
14268 opacity = CLAMP (opacity, 0.0, 1.0);
14269 alpha = round (priv->user_alpha * opacity);
14272 if (alpha == priv->alpha)
14275 priv->alpha = alpha;
14277 gtk_widget_propagate_alpha (widget);
14282 gtk_widget_set_has_opacity_group (GtkWidget *widget,
14283 gboolean has_opacity_group)
14285 GtkWidgetPrivate *priv;
14287 g_return_if_fail (GTK_IS_WIDGET (widget));
14289 priv = widget->priv;
14291 has_opacity_group = !!has_opacity_group;
14293 if (priv->opacity_group == has_opacity_group)
14296 priv->opacity_group = has_opacity_group;
14298 gtk_widget_propagate_alpha (widget);
14302 * gtk_widget_set_opacity:
14303 * @widget: a #GtkWidget
14304 * @opacity: desired opacity, between 0 and 1
14306 * Request the @widget to be rendered partially transparent,
14307 * with opacity 0 being fully transparent and 1 fully opaque. (Opacity values
14308 * are clamped to the [0,1] range.).
14309 * This works on both toplevel widget, and child widgets, although there
14310 * are some limitations:
14312 * For toplevel widgets this depends on the capabilities of the windowing
14313 * system. On X11 this has any effect only on X screens with a compositing manager
14314 * running. See gtk_widget_is_composited(). On Windows it should work
14315 * always, although setting a window's opacity after the window has been
14316 * shown causes it to flicker once on Windows.
14318 * For child widgets it doesn't work if any affected widget has a native window, or
14319 * disables double buffering.
14324 gtk_widget_set_opacity (GtkWidget *widget,
14327 GtkWidgetPrivate *priv;
14330 g_return_if_fail (GTK_IS_WIDGET (widget));
14332 priv = widget->priv;
14334 opacity = CLAMP (opacity, 0.0, 1.0);
14336 alpha = round (opacity * 255);
14338 /* As a kind of hack for internal use we treat an alpha very
14339 close to 1.0 (rounds to 255) but not 1.0 as specifying that
14340 we want the opacity group behaviour wrt draw handling, but
14341 not actually an alpha value. See bug #687842 for discussions. */
14342 gtk_widget_set_has_opacity_group (widget,
14343 alpha == 255 && opacity != 1.0);
14345 if (alpha == priv->user_alpha)
14348 priv->user_alpha = alpha;
14350 gtk_widget_update_alpha (widget);
14355 * gtk_widget_get_opacity:
14356 * @widget: a #GtkWidget
14358 * Fetches the requested opacity for this widget. See
14359 * gtk_widget_set_opacity().
14361 * Return value: the requested opacity for this widget.
14366 gtk_widget_get_opacity (GtkWidget *widget)
14368 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0.0);
14370 return widget->priv->alpha / 255.0;
14374 _gtk_widget_set_has_focus (GtkWidget *widget,
14375 gboolean has_focus)
14377 widget->priv->has_focus = has_focus;
14380 gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_FOCUSED, FALSE);
14382 gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_FOCUSED);
14386 * gtk_widget_send_focus_change:
14387 * @widget: a #GtkWidget
14388 * @event: a #GdkEvent of type GDK_FOCUS_CHANGE
14390 * Sends the focus change @event to @widget
14392 * This function is not meant to be used by applications. The only time it
14393 * should be used is when it is necessary for a #GtkWidget to assign focus
14394 * to a widget that is semantically owned by the first widget even though
14395 * it's not a direct child - for instance, a search entry in a floating
14396 * window similar to the quick search in #GtkTreeView.
14398 * An example of its usage is:
14401 * GdkEvent *fevent = gdk_event_new (GDK_FOCUS_CHANGE);
14403 * fevent->focus_change.type = GDK_FOCUS_CHANGE;
14404 * fevent->focus_change.in = TRUE;
14405 * fevent->focus_change.window = gtk_widget_get_window (widget);
14406 * if (fevent->focus_change.window != NULL)
14407 * g_object_ref (fevent->focus_change.window);
14409 * gtk_widget_send_focus_change (widget, fevent);
14411 * gdk_event_free (event);
14414 * Return value: the return value from the event signal emission: %TRUE
14415 * if the event was handled, and %FALSE otherwise
14420 gtk_widget_send_focus_change (GtkWidget *widget,
14425 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
14426 g_return_val_if_fail (event != NULL && event->type == GDK_FOCUS_CHANGE, FALSE);
14428 g_object_ref (widget);
14430 _gtk_widget_set_has_focus (widget, event->focus_change.in);
14432 res = gtk_widget_event (widget, event);
14434 g_object_notify (G_OBJECT (widget), "has-focus");
14436 g_object_unref (widget);
14442 * gtk_widget_in_destruction:
14443 * @widget: a #GtkWidget
14445 * Returns whether the widget is currently being destroyed.
14446 * This information can sometimes be used to avoid doing
14447 * unnecessary work.
14449 * Returns: %TRUE if @widget is being destroyed
14452 gtk_widget_in_destruction (GtkWidget *widget)
14454 return widget->priv->in_destruction;
14458 _gtk_widget_get_in_reparent (GtkWidget *widget)
14460 return widget->priv->in_reparent;
14464 _gtk_widget_set_in_reparent (GtkWidget *widget,
14465 gboolean in_reparent)
14467 widget->priv->in_reparent = in_reparent;
14471 _gtk_widget_get_anchored (GtkWidget *widget)
14473 return widget->priv->anchored;
14477 _gtk_widget_set_anchored (GtkWidget *widget,
14480 widget->priv->anchored = anchored;
14484 _gtk_widget_get_shadowed (GtkWidget *widget)
14486 return widget->priv->shadowed;
14490 _gtk_widget_set_shadowed (GtkWidget *widget,
14493 widget->priv->shadowed = shadowed;
14497 _gtk_widget_get_alloc_needed (GtkWidget *widget)
14499 return widget->priv->alloc_needed;
14503 _gtk_widget_set_alloc_needed (GtkWidget *widget,
14504 gboolean alloc_needed)
14506 widget->priv->alloc_needed = alloc_needed;
14510 _gtk_widget_add_sizegroup (GtkWidget *widget,
14515 groups = g_object_get_qdata (G_OBJECT (widget), quark_size_groups);
14516 groups = g_slist_prepend (groups, group);
14517 g_object_set_qdata (G_OBJECT (widget), quark_size_groups, groups);
14519 widget->priv->have_size_groups = TRUE;
14523 _gtk_widget_remove_sizegroup (GtkWidget *widget,
14528 groups = g_object_get_qdata (G_OBJECT (widget), quark_size_groups);
14529 groups = g_slist_remove (groups, group);
14530 g_object_set_qdata (G_OBJECT (widget), quark_size_groups, groups);
14532 widget->priv->have_size_groups = groups != NULL;
14536 _gtk_widget_get_sizegroups (GtkWidget *widget)
14538 if (widget->priv->have_size_groups)
14539 return g_object_get_qdata (G_OBJECT (widget), quark_size_groups);
14545 _gtk_widget_add_attached_window (GtkWidget *widget,
14548 widget->priv->attached_windows = g_list_prepend (widget->priv->attached_windows, window);
14552 _gtk_widget_remove_attached_window (GtkWidget *widget,
14555 widget->priv->attached_windows = g_list_remove (widget->priv->attached_windows, window);
14559 * gtk_widget_path_append_for_widget:
14560 * @path: a widget path
14561 * @widget: the widget to append to the widget path
14563 * Appends the data from @widget to the widget hierarchy represented
14564 * by @path. This function is a shortcut for adding information from
14565 * @widget to the given @path. This includes setting the name or
14566 * adding the style classes from @widget.
14568 * Returns: the position where the data was inserted
14573 gtk_widget_path_append_for_widget (GtkWidgetPath *path,
14578 g_return_val_if_fail (path != NULL, 0);
14579 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
14581 pos = gtk_widget_path_append_type (path, G_OBJECT_TYPE (widget));
14583 if (widget->priv->name)
14584 gtk_widget_path_iter_set_name (path, pos, widget->priv->name);
14586 if (widget->priv->context)
14588 GList *classes, *l;
14590 /* Also add any persistent classes in
14591 * the style context the widget path
14593 classes = gtk_style_context_list_classes (widget->priv->context);
14595 for (l = classes; l; l = l->next)
14596 gtk_widget_path_iter_add_class (path, pos, l->data);
14598 g_list_free (classes);
14605 _gtk_widget_create_path (GtkWidget *widget)
14609 parent = widget->priv->parent;
14612 return gtk_container_get_path_for_child (GTK_CONTAINER (parent), widget);
14615 /* Widget is either toplevel or unparented, treat both
14616 * as toplevels style wise, since there are situations
14617 * where style properties might be retrieved on that
14620 GtkWidget *attach_widget = NULL;
14621 GtkWidgetPath *result;
14623 if (GTK_IS_WINDOW (widget))
14624 attach_widget = gtk_window_get_attached_to (GTK_WINDOW (widget));
14626 if (attach_widget != NULL)
14627 result = gtk_widget_path_copy (gtk_widget_get_path (attach_widget));
14629 result = gtk_widget_path_new ();
14631 gtk_widget_path_append_for_widget (result, widget);
14638 * gtk_widget_get_path:
14639 * @widget: a #GtkWidget
14641 * Returns the #GtkWidgetPath representing @widget, if the widget
14642 * is not connected to a toplevel widget, a partial path will be
14645 * Returns: (transfer none): The #GtkWidgetPath representing @widget
14648 gtk_widget_get_path (GtkWidget *widget)
14650 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
14652 if (!widget->priv->path)
14653 widget->priv->path = _gtk_widget_create_path (widget);
14655 return widget->priv->path;
14659 _gtk_widget_style_context_invalidated (GtkWidget *widget)
14661 if (widget->priv->path)
14663 gtk_widget_path_free (widget->priv->path);
14664 widget->priv->path = NULL;
14667 if (gtk_widget_get_realized (widget))
14668 g_signal_emit (widget, widget_signals[STYLE_UPDATED], 0);
14671 /* Compress all style updates so it
14672 * is only emitted once pre-realize.
14674 widget->priv->style_update_pending = TRUE;
14679 * gtk_widget_get_style_context:
14680 * @widget: a #GtkWidget
14682 * Returns the style context associated to @widget.
14684 * Returns: (transfer none): a #GtkStyleContext. This memory is owned by @widget and
14685 * must not be freed.
14688 gtk_widget_get_style_context (GtkWidget *widget)
14690 GtkWidgetPrivate *priv;
14692 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
14694 priv = widget->priv;
14696 if (G_UNLIKELY (priv->context == NULL))
14699 GdkFrameClock *frame_clock;
14701 priv->context = gtk_style_context_new ();
14703 gtk_style_context_set_state (priv->context, priv->state_flags);
14705 screen = gtk_widget_get_screen (widget);
14707 gtk_style_context_set_screen (priv->context, screen);
14709 frame_clock = gtk_widget_get_frame_clock (widget);
14711 gtk_style_context_set_frame_clock (priv->context, frame_clock);
14714 gtk_style_context_set_parent (priv->context,
14715 gtk_widget_get_style_context (priv->parent));
14717 _gtk_style_context_set_widget (priv->context, widget);
14720 return widget->priv->context;
14724 _gtk_widget_invalidate_style_context (GtkWidget *widget,
14725 GtkCssChange change)
14727 GtkWidgetPrivate *priv;
14729 priv = widget->priv;
14731 if (priv->context == NULL)
14734 _gtk_style_context_queue_invalidate (priv->context, change);
14738 * gtk_widget_get_modifier_mask:
14739 * @widget: a #GtkWidget
14740 * @intent: the use case for the modifier mask
14742 * Returns the modifier mask the @widget's windowing system backend
14743 * uses for a particular purpose.
14745 * See gdk_keymap_get_modifier_mask().
14747 * Returns: the modifier mask used for @intent.
14752 gtk_widget_get_modifier_mask (GtkWidget *widget,
14753 GdkModifierIntent intent)
14755 GdkDisplay *display;
14757 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
14759 display = gtk_widget_get_display (widget);
14761 return gdk_keymap_get_modifier_mask (gdk_keymap_get_for_display (display),
14766 _gtk_widget_get_style (GtkWidget *widget)
14768 return widget->priv->style;
14772 _gtk_widget_set_style (GtkWidget *widget,
14775 widget->priv->style = style;
14779 _gtk_widget_update_parent_muxer (GtkWidget *widget)
14782 GActionMuxer *parent_muxer;
14784 if (widget->priv->muxer == NULL)
14787 if (GTK_IS_MENU (widget))
14788 parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
14790 parent = gtk_widget_get_parent (widget);
14792 parent_muxer = parent ? _gtk_widget_get_action_muxer (parent) : NULL;
14794 g_action_muxer_set_parent (widget->priv->muxer, parent_muxer);
14798 _gtk_widget_get_action_muxer (GtkWidget *widget)
14800 if (widget->priv->muxer == NULL)
14802 widget->priv->muxer = g_action_muxer_new ();
14803 _gtk_widget_update_parent_muxer (widget);
14806 return widget->priv->muxer;
14810 * gtk_widget_insert_action_group:
14811 * @widget: a #GtkWidget
14812 * @name: the prefix for actions in @group
14813 * @group: a #GActionGroup
14815 * Inserts @group into @widget. Children of @widget that implement
14816 * #GtkActionable can then be associated with actions in @group by
14817 * setting their 'action-name' to
14818 * @prefix.<replaceable>action-name</replaceable>.
14823 gtk_widget_insert_action_group (GtkWidget *widget,
14825 GActionGroup *group)
14827 GActionMuxer *muxer;
14829 g_return_if_fail (GTK_IS_WIDGET (widget));
14830 g_return_if_fail (name != NULL);
14832 muxer = _gtk_widget_get_action_muxer (widget);
14835 g_action_muxer_insert (muxer, name, group);
14837 g_action_muxer_remove (muxer, name);