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 Library 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 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 #include "gtkcontainer.h"
24 #include "gtkselection.h"
25 #include "gtksignal.h"
26 #include "gtkwidget.h"
27 #include "gtkwindow.h"
28 #include "gtkbindings.h"
29 #include "gtkprivate.h"
34 #define WIDGET_CLASS(w) GTK_WIDGET_CLASS (GTK_OBJECT (w)->klass)
35 #define INIT_PATH_SIZE (512)
71 PROPERTY_NOTIFY_EVENT,
72 SELECTION_CLEAR_EVENT,
73 SELECTION_REQUEST_EVENT,
74 SELECTION_NOTIFY_EVENT,
89 VISIBILITY_NOTIFY_EVENT,
114 typedef struct _GtkStateData GtkStateData;
119 guint state_restoration : 1;
120 guint parent_sensitive : 1;
121 guint use_forall : 1;
124 static void gtk_widget_class_init (GtkWidgetClass *klass);
125 static void gtk_widget_init (GtkWidget *widget);
126 static void gtk_widget_set_arg (GtkObject *object,
129 static void gtk_widget_get_arg (GtkObject *object,
132 static void gtk_widget_shutdown (GtkObject *object);
133 static void gtk_widget_real_destroy (GtkObject *object);
134 static void gtk_widget_finalize (GtkObject *object);
135 static void gtk_widget_real_show (GtkWidget *widget);
136 static void gtk_widget_real_hide (GtkWidget *widget);
137 static void gtk_widget_real_map (GtkWidget *widget);
138 static void gtk_widget_real_unmap (GtkWidget *widget);
139 static void gtk_widget_real_realize (GtkWidget *widget);
140 static void gtk_widget_real_unrealize (GtkWidget *widget);
141 static void gtk_widget_real_draw (GtkWidget *widget,
143 static void gtk_widget_real_size_request (GtkWidget *widget,
144 GtkRequisition *requisition);
145 static void gtk_widget_real_size_allocate (GtkWidget *widget,
146 GtkAllocation *allocation);
147 static gint gtk_widget_real_key_press_event (GtkWidget *widget,
149 static gint gtk_widget_real_key_release_event (GtkWidget *widget,
151 static void gtk_widget_style_set (GtkWidget *widget,
152 GtkStyle *previous_style);
154 static GdkColormap* gtk_widget_peek_colormap (void);
155 static GdkVisual* gtk_widget_peek_visual (void);
156 static GtkStyle* gtk_widget_peek_style (void);
158 static void gtk_widget_reparent_container_child (GtkWidget *widget,
159 gpointer client_data);
160 static void gtk_widget_propagate_state (GtkWidget *widget,
162 static void gtk_widget_draw_children_recurse (GtkWidget *widget,
163 gpointer client_data);
164 static void gtk_widget_set_style_internal (GtkWidget *widget,
166 gboolean initial_emission);
167 static void gtk_widget_set_style_recurse (GtkWidget *widget,
168 gpointer client_data);
170 static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
171 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
173 static GtkObjectClass *parent_class = NULL;
174 static guint widget_signals[LAST_SIGNAL] = { 0 };
176 static GMemChunk *aux_info_mem_chunk = NULL;
178 static GdkColormap *default_colormap = NULL;
179 static GdkVisual *default_visual = NULL;
180 static GtkStyle *gtk_default_style = NULL;
182 static GSList *colormap_stack = NULL;
183 static GSList *visual_stack = NULL;
184 static GSList *style_stack = NULL;
185 static guint composite_child_stack = 0;
186 static GSList *gtk_widget_redraw_queue = NULL;
188 static const gchar *aux_info_key = "gtk-aux-info";
189 static guint aux_info_key_id = 0;
190 static const gchar *event_key = "gtk-event-mask";
191 static guint event_key_id = 0;
192 static const gchar *extension_event_key = "gtk-extension-event-mode";
193 static guint extension_event_key_id = 0;
194 static const gchar *parent_window_key = "gtk-parent-window";
195 static guint parent_window_key_id = 0;
196 static const gchar *saved_default_style_key = "gtk-saved-default-style";
197 static guint saved_default_style_key_id = 0;
198 static const gchar *shape_info_key = "gtk-shape-info";
199 static const gchar *colormap_key = "gtk-colormap";
200 static const gchar *visual_key = "gtk-visual";
204 /*****************************************
205 * gtk_widget_get_type:
210 *****************************************/
213 gtk_widget_get_type (void)
215 static GtkType widget_type = 0;
219 GtkTypeInfo widget_info =
223 sizeof (GtkWidgetClass),
224 (GtkClassInitFunc) gtk_widget_class_init,
225 (GtkObjectInitFunc) gtk_widget_init,
226 /* reserved_1 */ NULL,
227 /* reserved_2 */ NULL,
228 (GtkClassInitFunc) NULL,
231 widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);
237 /*****************************************
238 * gtk_widget_class_init:
243 *****************************************/
246 gtk_widget_debug_msg (GtkWidget *widget,
249 fprintf (stderr, "Gtk-DEBUG: %s\n", string);
253 gtk_widget_class_init (GtkWidgetClass *klass)
255 GtkObjectClass *object_class;
257 object_class = (GtkObjectClass*) klass;
259 parent_class = gtk_type_class (gtk_object_get_type ());
261 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
262 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
263 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
264 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
265 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
266 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
267 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
268 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
269 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
270 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
271 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
272 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
273 gtk_object_add_arg_type ("GtkWidget::composite_child", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_COMPOSITE_CHILD);
274 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
275 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
276 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
278 widget_signals[SHOW] =
279 gtk_signal_new ("show",
282 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
283 gtk_marshal_NONE__NONE,
285 widget_signals[HIDE] =
286 gtk_signal_new ("hide",
289 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
290 gtk_marshal_NONE__NONE,
292 widget_signals[MAP] =
293 gtk_signal_new ("map",
296 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
297 gtk_marshal_NONE__NONE,
299 widget_signals[UNMAP] =
300 gtk_signal_new ("unmap",
303 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
304 gtk_marshal_NONE__NONE,
306 widget_signals[REALIZE] =
307 gtk_signal_new ("realize",
310 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
311 gtk_marshal_NONE__NONE,
313 widget_signals[UNREALIZE] =
314 gtk_signal_new ("unrealize",
317 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
318 gtk_marshal_NONE__NONE,
320 widget_signals[DRAW] =
321 gtk_signal_new ("draw",
324 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
325 gtk_marshal_NONE__POINTER,
328 widget_signals[DRAW_FOCUS] =
329 gtk_signal_new ("draw_focus",
332 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
333 gtk_marshal_NONE__NONE,
335 widget_signals[DRAW_DEFAULT] =
336 gtk_signal_new ("draw_default",
339 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
340 gtk_marshal_NONE__NONE,
342 widget_signals[SIZE_REQUEST] =
343 gtk_signal_new ("size_request",
346 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
347 gtk_marshal_NONE__POINTER,
350 widget_signals[SIZE_ALLOCATE] =
351 gtk_signal_new ("size_allocate",
354 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
355 gtk_marshal_NONE__POINTER,
358 widget_signals[STATE_CHANGED] =
359 gtk_signal_new ("state_changed",
362 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
363 gtk_marshal_NONE__UINT,
365 GTK_TYPE_STATE_TYPE);
366 widget_signals[PARENT_SET] =
367 gtk_signal_new ("parent_set",
370 GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
371 gtk_marshal_NONE__OBJECT,
374 widget_signals[STYLE_SET] =
375 gtk_signal_new ("style_set",
378 GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
379 gtk_marshal_NONE__POINTER,
382 widget_signals[ADD_ACCELERATOR] =
383 gtk_accel_group_create_add (object_class->type, GTK_RUN_LAST,
384 GTK_SIGNAL_OFFSET (GtkWidgetClass, add_accelerator));
385 widget_signals[REMOVE_ACCELERATOR] =
386 gtk_accel_group_create_remove (object_class->type, GTK_RUN_LAST,
387 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));
388 widget_signals[EVENT] =
389 gtk_signal_new ("event",
392 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
393 gtk_marshal_BOOL__POINTER,
396 widget_signals[BUTTON_PRESS_EVENT] =
397 gtk_signal_new ("button_press_event",
400 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
401 gtk_marshal_BOOL__POINTER,
404 widget_signals[BUTTON_RELEASE_EVENT] =
405 gtk_signal_new ("button_release_event",
408 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
409 gtk_marshal_BOOL__POINTER,
412 widget_signals[MOTION_NOTIFY_EVENT] =
413 gtk_signal_new ("motion_notify_event",
416 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
417 gtk_marshal_BOOL__POINTER,
420 widget_signals[DELETE_EVENT] =
421 gtk_signal_new ("delete_event",
424 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
425 gtk_marshal_BOOL__POINTER,
428 widget_signals[DESTROY_EVENT] =
429 gtk_signal_new ("destroy_event",
432 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
433 gtk_marshal_BOOL__POINTER,
436 widget_signals[EXPOSE_EVENT] =
437 gtk_signal_new ("expose_event",
440 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
441 gtk_marshal_BOOL__POINTER,
444 widget_signals[KEY_PRESS_EVENT] =
445 gtk_signal_new ("key_press_event",
448 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
449 gtk_marshal_BOOL__POINTER,
452 widget_signals[KEY_RELEASE_EVENT] =
453 gtk_signal_new ("key_release_event",
456 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
457 gtk_marshal_BOOL__POINTER,
460 widget_signals[ENTER_NOTIFY_EVENT] =
461 gtk_signal_new ("enter_notify_event",
464 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
465 gtk_marshal_BOOL__POINTER,
468 widget_signals[LEAVE_NOTIFY_EVENT] =
469 gtk_signal_new ("leave_notify_event",
472 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
473 gtk_marshal_BOOL__POINTER,
476 widget_signals[CONFIGURE_EVENT] =
477 gtk_signal_new ("configure_event",
480 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
481 gtk_marshal_BOOL__POINTER,
484 widget_signals[FOCUS_IN_EVENT] =
485 gtk_signal_new ("focus_in_event",
488 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
489 gtk_marshal_BOOL__POINTER,
492 widget_signals[FOCUS_OUT_EVENT] =
493 gtk_signal_new ("focus_out_event",
496 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
497 gtk_marshal_BOOL__POINTER,
500 widget_signals[MAP_EVENT] =
501 gtk_signal_new ("map_event",
504 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
505 gtk_marshal_BOOL__POINTER,
508 widget_signals[UNMAP_EVENT] =
509 gtk_signal_new ("unmap_event",
512 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
513 gtk_marshal_BOOL__POINTER,
516 widget_signals[PROPERTY_NOTIFY_EVENT] =
517 gtk_signal_new ("property_notify_event",
520 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
521 gtk_marshal_BOOL__POINTER,
524 widget_signals[SELECTION_CLEAR_EVENT] =
525 gtk_signal_new ("selection_clear_event",
528 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
529 gtk_marshal_BOOL__POINTER,
532 widget_signals[SELECTION_REQUEST_EVENT] =
533 gtk_signal_new ("selection_request_event",
536 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
537 gtk_marshal_BOOL__POINTER,
540 widget_signals[SELECTION_NOTIFY_EVENT] =
541 gtk_signal_new ("selection_notify_event",
544 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
545 gtk_marshal_BOOL__POINTER,
548 widget_signals[SELECTION_RECEIVED] =
549 gtk_signal_new ("selection_received",
552 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
553 gtk_marshal_NONE__POINTER_UINT,
555 GTK_TYPE_SELECTION_DATA,
557 widget_signals[SELECTION_GET] =
558 gtk_signal_new ("selection_get",
561 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_get),
562 gtk_marshal_NONE__POINTER_UINT_UINT,
564 GTK_TYPE_SELECTION_DATA,
567 widget_signals[PROXIMITY_IN_EVENT] =
568 gtk_signal_new ("proximity_in_event",
571 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
572 gtk_marshal_BOOL__POINTER,
575 widget_signals[PROXIMITY_OUT_EVENT] =
576 gtk_signal_new ("proximity_out_event",
579 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
580 gtk_marshal_BOOL__POINTER,
583 widget_signals[DRAG_LEAVE] =
584 gtk_signal_new ("drag_leave",
587 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_leave),
588 gtk_marshal_NONE__POINTER_UINT,
590 GTK_TYPE_GDK_DRAG_CONTEXT,
592 widget_signals[DRAG_BEGIN] =
593 gtk_signal_new ("drag_begin",
596 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin),
597 gtk_marshal_NONE__POINTER,
599 GTK_TYPE_GDK_DRAG_CONTEXT);
600 widget_signals[DRAG_END] =
601 gtk_signal_new ("drag_end",
604 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end),
605 gtk_marshal_NONE__POINTER,
607 GTK_TYPE_GDK_DRAG_CONTEXT);
608 widget_signals[DRAG_DATA_DELETE] =
609 gtk_signal_new ("drag_data_delete",
612 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_delete),
613 gtk_marshal_NONE__POINTER,
615 GTK_TYPE_GDK_DRAG_CONTEXT);
616 widget_signals[DRAG_MOTION] =
617 gtk_signal_new ("drag_motion",
620 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_motion),
621 gtk_marshal_BOOL__POINTER_INT_INT_UINT,
623 GTK_TYPE_GDK_DRAG_CONTEXT,
627 widget_signals[DRAG_DROP] =
628 gtk_signal_new ("drag_drop",
631 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_drop),
632 gtk_marshal_BOOL__POINTER_INT_INT_UINT,
634 GTK_TYPE_GDK_DRAG_CONTEXT,
638 widget_signals[DRAG_DATA_GET] =
639 gtk_signal_new ("drag_data_get",
642 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_get),
643 gtk_marshal_NONE__POINTER_POINTER_UINT_UINT,
645 GTK_TYPE_GDK_DRAG_CONTEXT,
646 GTK_TYPE_SELECTION_DATA,
649 widget_signals[DRAG_DATA_RECEIVED] =
650 gtk_signal_new ("drag_data_received",
653 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_received),
654 gtk_marshal_NONE__POINTER_POINTER_UINT_UINT,
656 GTK_TYPE_GDK_DRAG_CONTEXT,
657 GTK_TYPE_SELECTION_DATA,
660 widget_signals[VISIBILITY_NOTIFY_EVENT] =
661 gtk_signal_new ("visibility_notify_event",
664 GTK_SIGNAL_OFFSET (GtkWidgetClass, visibility_notify_event),
665 gtk_marshal_BOOL__POINTER,
668 widget_signals[CLIENT_EVENT] =
669 gtk_signal_new ("client_event",
672 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
673 gtk_marshal_BOOL__POINTER,
676 widget_signals[NO_EXPOSE_EVENT] =
677 gtk_signal_new ("no_expose_event",
680 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
681 gtk_marshal_BOOL__POINTER,
684 widget_signals[DEBUG_MSG] =
685 gtk_signal_new ("debug_msg",
686 GTK_RUN_LAST | GTK_RUN_ACTION,
688 GTK_SIGNAL_OFFSET (GtkWidgetClass, debug_msg),
689 gtk_marshal_NONE__STRING,
693 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
695 object_class->set_arg = gtk_widget_set_arg;
696 object_class->get_arg = gtk_widget_get_arg;
697 object_class->shutdown = gtk_widget_shutdown;
698 object_class->destroy = gtk_widget_real_destroy;
699 object_class->finalize = gtk_widget_finalize;
701 klass->activate_signal = 0;
702 klass->show = gtk_widget_real_show;
703 klass->show_all = gtk_widget_show;
704 klass->hide = gtk_widget_real_hide;
705 klass->hide_all = gtk_widget_hide;
706 klass->map = gtk_widget_real_map;
707 klass->unmap = gtk_widget_real_unmap;
708 klass->realize = gtk_widget_real_realize;
709 klass->unrealize = gtk_widget_real_unrealize;
710 klass->draw = gtk_widget_real_draw;
711 klass->draw_focus = NULL;
712 klass->size_request = gtk_widget_real_size_request;
713 klass->size_allocate = gtk_widget_real_size_allocate;
714 klass->state_changed = NULL;
715 klass->parent_set = NULL;
716 klass->style_set = gtk_widget_style_set;
717 klass->add_accelerator = (void*) gtk_accel_group_handle_add;
718 klass->remove_accelerator = (void*) gtk_accel_group_handle_remove;
720 klass->button_press_event = NULL;
721 klass->button_release_event = NULL;
722 klass->motion_notify_event = NULL;
723 klass->delete_event = NULL;
724 klass->destroy_event = NULL;
725 klass->expose_event = NULL;
726 klass->key_press_event = gtk_widget_real_key_press_event;
727 klass->key_release_event = gtk_widget_real_key_release_event;
728 klass->enter_notify_event = NULL;
729 klass->leave_notify_event = NULL;
730 klass->configure_event = NULL;
731 klass->focus_in_event = NULL;
732 klass->focus_out_event = NULL;
733 klass->map_event = NULL;
734 klass->unmap_event = NULL;
735 klass->property_notify_event = gtk_selection_property_notify;
736 klass->selection_clear_event = gtk_selection_clear;
737 klass->selection_request_event = gtk_selection_request;
738 klass->selection_notify_event = gtk_selection_notify;
739 klass->selection_received = NULL;
740 klass->proximity_in_event = NULL;
741 klass->proximity_out_event = NULL;
742 klass->drag_begin = NULL;
743 klass->drag_end = NULL;
744 klass->drag_data_delete = NULL;
745 klass->drag_leave = NULL;
746 klass->drag_motion = NULL;
747 klass->drag_drop = NULL;
748 klass->drag_data_received = NULL;
750 klass->no_expose_event = NULL;
752 klass->debug_msg = gtk_widget_debug_msg;
756 gtk_widget_set_arg (GtkObject *object,
762 widget = GTK_WIDGET (object);
769 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
772 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
775 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
778 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
781 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -2);
784 gtk_widget_set_usize (widget, -2, GTK_VALUE_INT (*arg));
787 if (GTK_VALUE_BOOL(*arg))
788 gtk_widget_show (widget);
790 gtk_widget_hide (widget);
793 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
796 saved_flags = GTK_WIDGET_FLAGS (widget);
797 if (GTK_VALUE_BOOL (*arg))
798 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
800 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
801 if (saved_flags != GTK_WIDGET_FLAGS (widget))
802 gtk_widget_queue_resize (widget);
805 if (GTK_VALUE_BOOL (*arg))
806 gtk_widget_grab_focus (widget);
808 case ARG_CAN_DEFAULT:
809 saved_flags = GTK_WIDGET_FLAGS (widget);
810 if (GTK_VALUE_BOOL (*arg))
811 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
813 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
814 if (saved_flags != GTK_WIDGET_FLAGS (widget))
815 gtk_widget_queue_resize (widget);
817 case ARG_HAS_DEFAULT:
818 if (GTK_VALUE_BOOL (*arg))
819 gtk_widget_grab_default (widget);
821 case ARG_COMPOSITE_CHILD:
822 if (GTK_VALUE_BOOL(*arg))
823 GTK_WIDGET_SET_FLAGS (widget, GTK_COMPOSITE_CHILD);
825 GTK_WIDGET_UNSET_FLAGS (widget, GTK_COMPOSITE_CHILD);
828 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
831 if (!GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_NO_WINDOW (widget))
832 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
834 case ARG_EXTENSION_EVENTS:
835 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
842 /*****************************************
843 * gtk_widget_get_arg:
848 *****************************************/
851 gtk_widget_get_arg (GtkObject *object,
857 widget = GTK_WIDGET (object);
861 GtkWidgetAuxInfo *aux_info;
863 GdkExtensionMode *modep;
867 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
869 GTK_VALUE_STRING (*arg) = g_strdup ("");
872 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
875 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
877 GTK_VALUE_INT (*arg) = -1;
879 GTK_VALUE_INT (*arg) = aux_info->x;
882 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
884 GTK_VALUE_INT (*arg) = -1;
886 GTK_VALUE_INT (*arg) = aux_info->y;
889 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
891 GTK_VALUE_INT (*arg) = -1;
893 GTK_VALUE_INT (*arg) = aux_info->width;
896 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
898 GTK_VALUE_INT (*arg) = -1;
900 GTK_VALUE_INT (*arg) = aux_info->height;
903 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_VISIBLE (widget) != FALSE);
906 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_SENSITIVE (widget) != FALSE);
909 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_FOCUS (widget) != FALSE);
912 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_FOCUS (widget) != FALSE);
914 case ARG_CAN_DEFAULT:
915 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_DEFAULT (widget) != FALSE);
917 case ARG_HAS_DEFAULT:
918 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
920 case ARG_COMPOSITE_CHILD:
921 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_COMPOSITE_CHILD (widget) != FALSE);
924 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
927 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
929 GTK_VALUE_FLAGS (*arg) = 0;
931 GTK_VALUE_FLAGS (*arg) = *eventp;
933 case ARG_EXTENSION_EVENTS:
934 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
936 GTK_VALUE_FLAGS (*arg) = 0;
938 GTK_VALUE_FLAGS (*arg) = *modep;
941 arg->type = GTK_TYPE_INVALID;
946 /*****************************************
952 *****************************************/
955 gtk_widget_init (GtkWidget *widget)
957 GdkColormap *colormap;
960 GTK_PRIVATE_FLAGS (widget) = 0;
961 widget->state = GTK_STATE_NORMAL;
962 widget->saved_state = GTK_STATE_NORMAL;
964 widget->requisition.width = 0;
965 widget->requisition.height = 0;
966 widget->allocation.x = -1;
967 widget->allocation.y = -1;
968 widget->allocation.width = 1;
969 widget->allocation.height = 1;
970 widget->window = NULL;
971 widget->parent = NULL;
973 GTK_WIDGET_SET_FLAGS (widget,
975 GTK_PARENT_SENSITIVE |
976 (composite_child_stack ? GTK_COMPOSITE_CHILD : 0));
978 widget->style = gtk_widget_peek_style ();
979 gtk_style_ref (widget->style);
981 colormap = gtk_widget_peek_colormap ();
982 visual = gtk_widget_peek_visual ();
984 /* XXX - should we ref the colormap and visual, too? */
986 if (colormap != gtk_widget_get_default_colormap ())
988 /* gdk_colormap_ref (colormap); */
989 gtk_object_set_data (GTK_OBJECT (widget), colormap_key, colormap);
992 if (visual != gtk_widget_get_default_visual ())
994 /* gdk_visual_ref (visual); */
995 gtk_object_set_data (GTK_OBJECT (widget), visual_key, visual);
999 /*****************************************
1005 *****************************************/
1008 gtk_widget_new (GtkType widget_type,
1009 const gchar *first_arg_name,
1014 GSList *arg_list = NULL;
1015 GSList *info_list = NULL;
1018 g_return_val_if_fail (gtk_type_is_a (widget_type, GTK_TYPE_WIDGET), NULL);
1020 object = gtk_type_new (widget_type);
1022 va_start (var_args, first_arg_name);
1023 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1032 g_warning ("gtk_widget_new(): %s", error);
1040 slist_arg = arg_list;
1041 slist_info = info_list;
1044 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1045 slist_arg = slist_arg->next;
1046 slist_info = slist_info->next;
1048 gtk_args_collect_cleanup (arg_list, info_list);
1051 return GTK_WIDGET (object);
1054 /*****************************************
1060 *****************************************/
1063 gtk_widget_newv (GtkType type,
1067 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1069 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1072 /*****************************************
1078 *****************************************/
1081 gtk_widget_get (GtkWidget *widget,
1084 g_return_if_fail (widget != NULL);
1085 g_return_if_fail (arg != NULL);
1087 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1090 /*****************************************
1096 *****************************************/
1099 gtk_widget_getv (GtkWidget *widget,
1103 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1106 /*****************************************
1112 *****************************************/
1115 gtk_widget_set (GtkWidget *widget,
1116 const gchar *first_arg_name,
1121 GSList *arg_list = NULL;
1122 GSList *info_list = NULL;
1125 g_return_if_fail (widget != NULL);
1126 g_return_if_fail (GTK_IS_WIDGET (widget));
1128 object = GTK_OBJECT (widget);
1130 va_start (var_args, first_arg_name);
1131 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1140 g_warning ("gtk_widget_set(): %s", error);
1148 slist_arg = arg_list;
1149 slist_info = info_list;
1152 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1153 slist_arg = slist_arg->next;
1154 slist_info = slist_info->next;
1156 gtk_args_collect_cleanup (arg_list, info_list);
1160 /*****************************************
1166 *****************************************/
1169 gtk_widget_setv (GtkWidget *widget,
1173 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1176 /*****************************************
1177 * gtk_widget_unparent:
1178 * do any cleanup necessary necessary
1179 * for setting parent = NULL.
1184 *****************************************/
1187 gtk_widget_unparent (GtkWidget *widget)
1189 GtkWidget *toplevel;
1190 GtkWidget *old_parent;
1192 g_return_if_fail (widget != NULL);
1193 if (widget->parent == NULL)
1196 /* keep this function in sync with gtk_menu_detach()
1199 /* unset focused and default children properly, this code
1200 * should eventually move into some gtk_window_unparent_branch() or
1203 toplevel = gtk_widget_get_toplevel (widget);
1204 if (GTK_CONTAINER (widget->parent)->focus_child == widget)
1206 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL);
1208 if (GTK_IS_WINDOW (toplevel))
1212 child = GTK_WINDOW (toplevel)->focus_widget;
1214 while (child && child != widget)
1215 child = child->parent;
1217 if (child == widget)
1218 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1221 if (GTK_IS_WINDOW (toplevel))
1225 child = GTK_WINDOW (toplevel)->default_widget;
1227 while (child && child != widget)
1228 child = child->parent;
1230 if (child == widget)
1231 gtk_window_set_default (GTK_WINDOW (toplevel), NULL);
1234 if (GTK_IS_RESIZE_CONTAINER (widget))
1235 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1237 /* Remove the widget and all its children from any ->resize_widgets list
1238 * of all the parents in our branch. This code should move into gtkcontainer.c
1239 * somwhen, since we mess around with ->resize_widgets, which is
1240 * actually not of our business.
1242 * Two ways to make this prettier:
1243 * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer))
1244 * Change resize_widgets to a GList
1246 toplevel = widget->parent;
1252 if (!GTK_CONTAINER (toplevel)->resize_widgets)
1254 toplevel = toplevel->parent;
1259 slist = GTK_CONTAINER (toplevel)->resize_widgets;
1271 while (parent && (parent != widget))
1272 parent = parent->parent;
1274 if (parent == widget)
1276 GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED);
1282 /* it is really messy to have this signal disconnection
1283 * in gtkwidget.c, the resize_widgets invariants should
1284 * all be taken care off by gtkcontainer.c exclusively.
1287 gtk_signal_disconnect_by_func (GTK_OBJECT (toplevel),
1288 GTK_SIGNAL_FUNC (gtk_container_clear_resize_widgets),
1290 GTK_CONTAINER (toplevel)->resize_widgets = slist;
1293 g_slist_free_1 (last);
1299 toplevel = toplevel->parent;
1302 if (widget->window &&
1303 GTK_WIDGET_NO_WINDOW (widget) &&
1304 GTK_WIDGET_DRAWABLE (widget))
1305 gdk_window_clear_area (widget->window,
1306 widget->allocation.x,
1307 widget->allocation.y,
1308 widget->allocation.width,
1309 widget->allocation.height);
1311 /* Reset the width and height here, to force reallocation if we
1312 * get added back to a new parent. This won't work if our new
1313 * allocation is smaller than 1x1 and we actually want a size of 1x1...
1314 * (would 0x0 be OK here?)
1316 widget->allocation.width = 1;
1317 widget->allocation.height = 1;
1319 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1320 gtk_widget_unrealize (widget);
1322 old_parent = widget->parent;
1323 widget->parent = NULL;
1324 gtk_widget_set_parent_window (widget, NULL);
1325 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1327 gtk_widget_unref (widget);
1330 /*****************************************
1331 * gtk_widget_destroy:
1336 *****************************************/
1339 gtk_widget_destroy (GtkWidget *widget)
1341 g_return_if_fail (widget != NULL);
1342 g_return_if_fail (GTK_IS_WIDGET (widget));
1344 gtk_object_destroy ((GtkObject*) widget);
1347 /*****************************************
1348 * gtk_widget_destroyed:
1349 * Utility function: sets widget_pointer
1350 * to NULL when widget is destroyed.
1355 *****************************************/
1358 gtk_widget_destroyed (GtkWidget *widget,
1359 GtkWidget **widget_pointer)
1361 /* Don't make any assumptions about the
1363 * Even check widget_pointer.
1366 *widget_pointer = NULL;
1369 /*****************************************
1375 *****************************************/
1378 gtk_widget_show (GtkWidget *widget)
1380 g_return_if_fail (widget != NULL);
1382 if (!GTK_WIDGET_VISIBLE (widget))
1383 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1387 /*************************************************************
1388 * gtk_widget_show_now:
1389 * Show a widget, and if it is an unmapped toplevel widget
1390 * wait for the map_event before returning
1392 * Warning: This routine will call the main loop recursively.
1397 *************************************************************/
1400 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
1403 gtk_signal_disconnect_by_data (GTK_OBJECT (widget), flag);
1407 gtk_widget_show_now (GtkWidget *widget)
1411 /* make sure we will get event */
1412 if (!GTK_WIDGET_MAPPED (widget) &&
1413 GTK_WIDGET_TOPLEVEL (widget))
1415 gtk_widget_show (widget);
1417 gtk_signal_connect (GTK_OBJECT (widget), "map_event",
1418 GTK_SIGNAL_FUNC (gtk_widget_show_map_callback),
1422 gtk_main_iteration();
1425 gtk_widget_show (widget);
1428 /*****************************************
1434 *****************************************/
1437 gtk_widget_hide (GtkWidget *widget)
1439 g_return_if_fail (widget != NULL);
1440 g_return_if_fail (GTK_IS_WIDGET (widget));
1442 if (GTK_WIDGET_VISIBLE (widget))
1443 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1447 gtk_widget_hide_on_delete (GtkWidget *widget)
1449 g_return_val_if_fail (widget != NULL, FALSE);
1450 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
1452 gtk_widget_hide (widget);
1458 gtk_widget_show_all (GtkWidget *widget)
1460 GtkWidgetClass *class;
1462 g_return_if_fail (widget != NULL);
1463 g_return_if_fail (GTK_IS_WIDGET (widget));
1465 class = GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass);
1467 if (class->show_all)
1468 class->show_all (widget);
1472 gtk_widget_hide_all (GtkWidget *widget)
1474 GtkWidgetClass *class;
1476 g_return_if_fail (widget != NULL);
1477 g_return_if_fail (GTK_IS_WIDGET (widget));
1479 class = GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass);
1481 if (class->hide_all)
1482 class->hide_all (widget);
1485 /*****************************************
1491 *****************************************/
1494 gtk_widget_map (GtkWidget *widget)
1496 g_return_if_fail (widget != NULL);
1498 if (!GTK_WIDGET_MAPPED (widget))
1500 if (!GTK_WIDGET_REALIZED (widget))
1501 gtk_widget_realize (widget);
1503 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1507 /*****************************************
1513 *****************************************/
1516 gtk_widget_unmap (GtkWidget *widget)
1518 g_return_if_fail (widget != NULL);
1520 if (GTK_WIDGET_MAPPED (widget))
1521 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1524 /*****************************************
1525 * gtk_widget_realize:
1530 *****************************************/
1533 gtk_widget_realize (GtkWidget *widget)
1536 GdkExtensionMode mode;
1537 GtkWidgetShapeInfo *shape_info;
1539 g_return_if_fail (widget != NULL);
1541 if (!GTK_WIDGET_REALIZED (widget))
1544 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1545 g_message ("gtk_widget_realize(%s)", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1548 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1549 gtk_widget_realize (widget->parent);
1551 gtk_widget_ensure_style (widget);
1553 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1555 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1557 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1559 gdk_window_shape_combine_mask (widget->window,
1560 shape_info->shape_mask,
1561 shape_info->offset_x,
1562 shape_info->offset_y);
1565 if (!GTK_WIDGET_NO_WINDOW (widget))
1567 mode = gtk_widget_get_extension_events (widget);
1568 if (mode != GDK_EXTENSION_EVENTS_NONE)
1570 events = gtk_widget_get_events (widget);
1571 gdk_input_set_extension_events (widget->window, events, mode);
1578 /*****************************************
1579 * gtk_widget_unrealize:
1584 *****************************************/
1587 gtk_widget_unrealize (GtkWidget *widget)
1589 g_return_if_fail (widget != NULL);
1591 if (GTK_WIDGET_REDRAW_PENDING (widget))
1593 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1594 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1597 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1598 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
1600 if (GTK_WIDGET_REALIZED (widget))
1602 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1603 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
1607 /*****************************************
1608 * gtk_widget_queue_draw:
1613 *****************************************/
1616 gtk_widget_idle_draw (gpointer data)
1618 while (gtk_widget_redraw_queue)
1619 gtk_widget_draw (gtk_widget_redraw_queue->data, NULL);
1625 gtk_widget_queue_draw (GtkWidget *widget)
1629 g_return_if_fail (widget != NULL);
1631 if (GTK_WIDGET_DRAWABLE (widget))
1633 /* We queue the redraw if:
1634 * a) the widget is not already queued for redraw and
1635 * b) non of the widgets ancestors are queued for redraw.
1640 if (GTK_WIDGET_REDRAW_PENDING (parent))
1642 parent = parent->parent;
1645 GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_PENDING);
1646 if (gtk_widget_redraw_queue == NULL)
1647 gtk_idle_add_priority (GTK_PRIORITY_INTERNAL,
1648 gtk_widget_idle_draw,
1651 gtk_widget_redraw_queue = g_slist_prepend (gtk_widget_redraw_queue, widget);
1656 gtk_widget_queue_resize (GtkWidget *widget)
1658 g_return_if_fail (widget != NULL);
1659 g_return_if_fail (GTK_IS_WIDGET (widget));
1661 if (GTK_IS_RESIZE_CONTAINER (widget))
1662 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1665 gtk_container_queue_resize (GTK_CONTAINER (widget->parent));
1666 else if (GTK_WIDGET_TOPLEVEL (widget))
1667 gtk_container_queue_resize (GTK_CONTAINER (widget));
1670 /*****************************************
1676 *****************************************/
1679 gtk_widget_draw (GtkWidget *widget,
1682 GdkRectangle temp_area;
1684 g_return_if_fail (widget != NULL);
1686 if (GTK_WIDGET_REDRAW_PENDING (widget))
1688 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1689 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1694 if (GTK_WIDGET_DRAWABLE (widget))
1698 if (GTK_WIDGET_NO_WINDOW (widget))
1700 temp_area.x = widget->allocation.x;
1701 temp_area.y = widget->allocation.y;
1709 temp_area.width = widget->allocation.width;
1710 temp_area.height = widget->allocation.height;
1714 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
1718 /*****************************************
1719 * gtk_widget_draw_focus:
1724 *****************************************/
1727 gtk_widget_draw_focus (GtkWidget *widget)
1729 g_return_if_fail (widget != NULL);
1731 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
1734 /*****************************************
1735 * gtk_widget_draw_default:
1740 *****************************************/
1743 gtk_widget_draw_default (GtkWidget *widget)
1745 g_return_if_fail (widget != NULL);
1747 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
1750 /*****************************************
1751 * gtk_widget_draw_children:
1756 *****************************************/
1759 gtk_widget_draw_children (GtkWidget *widget)
1761 g_return_if_fail (widget != NULL);
1763 if (GTK_IS_CONTAINER (widget))
1764 gtk_container_forall (GTK_CONTAINER (widget),
1765 gtk_widget_draw_children_recurse,
1769 /*****************************************
1770 * gtk_widget_size_request:
1775 *****************************************/
1778 gtk_widget_size_request (GtkWidget *widget,
1779 GtkRequisition *requisition)
1781 GtkWidgetAuxInfo *aux_info;
1783 g_return_if_fail (widget != NULL);
1785 gtk_widget_ref (widget);
1786 gtk_widget_ensure_style (widget);
1787 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
1789 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1792 if (aux_info->width > 0)
1793 requisition->width = aux_info->width;
1794 if (aux_info->height > 0)
1795 requisition->height = aux_info->height;
1797 gtk_widget_unref (widget);
1800 /*****************************************
1801 * gtk_widget_size_allocate:
1806 *****************************************/
1809 gtk_widget_size_allocate (GtkWidget *widget,
1810 GtkAllocation *allocation)
1812 GtkWidgetAuxInfo *aux_info;
1813 GtkAllocation real_allocation;
1815 g_return_if_fail (widget != NULL);
1817 real_allocation = *allocation;
1818 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1822 if (aux_info->x != -1)
1823 real_allocation.x = aux_info->x;
1824 if (aux_info->y != -1)
1825 real_allocation.y = aux_info->y;
1828 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
1832 gtk_widget_stop_add_accelerator (GtkWidget *widget)
1834 g_return_if_fail (widget != NULL);
1835 g_return_if_fail (GTK_IS_WIDGET (widget));
1837 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
1841 gtk_widget_stop_remove_accelerator (GtkWidget *widget)
1843 g_return_if_fail (widget != NULL);
1844 g_return_if_fail (GTK_IS_WIDGET (widget));
1846 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR]);
1850 gtk_widget_freeze_accelerators (GtkWidget *widget)
1852 g_return_if_fail (widget != NULL);
1853 g_return_if_fail (GTK_IS_WIDGET (widget));
1855 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
1856 widget_signals[ADD_ACCELERATOR],
1858 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1861 gtk_signal_connect (GTK_OBJECT (widget),
1863 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1865 gtk_signal_connect (GTK_OBJECT (widget),
1866 "remove_accelerator",
1867 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
1873 gtk_widget_thaw_accelerators (GtkWidget *widget)
1875 g_return_if_fail (widget != NULL);
1876 g_return_if_fail (GTK_IS_WIDGET (widget));
1878 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
1879 widget_signals[ADD_ACCELERATOR],
1881 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1884 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
1885 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1887 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
1888 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
1894 gtk_widget_add_accelerator (GtkWidget *widget,
1895 const gchar *accel_signal,
1896 GtkAccelGroup *accel_group,
1899 GtkAccelFlags accel_flags)
1901 g_return_if_fail (widget != NULL);
1902 g_return_if_fail (GTK_IS_WIDGET (widget));
1903 g_return_if_fail (accel_group != NULL);
1905 gtk_accel_group_add (accel_group,
1909 (GtkObject*) widget,
1914 gtk_widget_remove_accelerator (GtkWidget *widget,
1915 GtkAccelGroup *accel_group,
1919 g_return_if_fail (widget != NULL);
1920 g_return_if_fail (GTK_IS_WIDGET (widget));
1921 g_return_if_fail (accel_group != NULL);
1923 gtk_accel_group_remove (accel_group,
1926 (GtkObject*) widget);
1930 gtk_widget_remove_accelerators (GtkWidget *widget,
1931 const gchar *accel_signal,
1932 gboolean visible_only)
1937 g_return_if_fail (widget != NULL);
1938 g_return_if_fail (GTK_IS_WIDGET (widget));
1939 g_return_if_fail (accel_signal != NULL);
1941 signal_id = gtk_signal_lookup (accel_signal, GTK_OBJECT_TYPE (widget));
1942 g_return_if_fail (signal_id != 0);
1944 slist = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
1947 GtkAccelEntry *ac_entry;
1949 ac_entry = slist->data;
1950 slist = slist->next;
1951 if (ac_entry->accel_flags & GTK_ACCEL_VISIBLE &&
1952 ac_entry->signal_id == signal_id)
1953 gtk_widget_remove_accelerator (GTK_WIDGET (widget),
1954 ac_entry->accel_group,
1955 ac_entry->accelerator_key,
1956 ac_entry->accelerator_mods);
1961 gtk_widget_accelerator_signal (GtkWidget *widget,
1962 GtkAccelGroup *accel_group,
1966 GtkAccelEntry *ac_entry;
1968 g_return_val_if_fail (widget != NULL, 0);
1969 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
1970 g_return_val_if_fail (accel_group != NULL, 0);
1972 ac_entry = gtk_accel_group_get_entry (accel_group, accel_key, accel_mods);
1974 if (ac_entry && ac_entry->object == (GtkObject*) widget)
1975 return ac_entry->signal_id;
1980 gtk_widget_real_key_press_event (GtkWidget *widget,
1983 gboolean handled = FALSE;
1985 g_return_val_if_fail (widget != NULL, handled);
1986 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
1987 g_return_val_if_fail (event != NULL, handled);
1990 handled = gtk_bindings_activate (GTK_OBJECT (widget),
1998 gtk_widget_real_key_release_event (GtkWidget *widget,
2001 gboolean handled = FALSE;
2003 g_return_val_if_fail (widget != NULL, handled);
2004 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
2005 g_return_val_if_fail (event != NULL, handled);
2008 handled = gtk_bindings_activate (GTK_OBJECT (widget),
2010 event->state | GDK_RELEASE_MASK);
2015 /*****************************************
2021 *****************************************/
2024 gtk_widget_event (GtkWidget *widget,
2030 g_return_val_if_fail (widget != NULL, TRUE);
2032 gtk_widget_ref (widget);
2034 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
2036 if (return_val || GTK_OBJECT_DESTROYED (widget))
2038 gtk_widget_unref (widget);
2042 switch (event->type)
2047 case GDK_BUTTON_PRESS:
2048 case GDK_2BUTTON_PRESS:
2049 case GDK_3BUTTON_PRESS:
2050 signal_num = BUTTON_PRESS_EVENT;
2052 case GDK_BUTTON_RELEASE:
2053 signal_num = BUTTON_RELEASE_EVENT;
2055 case GDK_MOTION_NOTIFY:
2056 signal_num = MOTION_NOTIFY_EVENT;
2059 signal_num = DELETE_EVENT;
2062 signal_num = DESTROY_EVENT;
2065 signal_num = KEY_PRESS_EVENT;
2067 case GDK_KEY_RELEASE:
2068 signal_num = KEY_RELEASE_EVENT;
2070 case GDK_ENTER_NOTIFY:
2071 signal_num = ENTER_NOTIFY_EVENT;
2073 case GDK_LEAVE_NOTIFY:
2074 signal_num = LEAVE_NOTIFY_EVENT;
2076 case GDK_FOCUS_CHANGE:
2077 if (event->focus_change.in)
2078 signal_num = FOCUS_IN_EVENT;
2080 signal_num = FOCUS_OUT_EVENT;
2083 signal_num = CONFIGURE_EVENT;
2086 signal_num = MAP_EVENT;
2089 signal_num = UNMAP_EVENT;
2091 case GDK_PROPERTY_NOTIFY:
2092 signal_num = PROPERTY_NOTIFY_EVENT;
2094 case GDK_SELECTION_CLEAR:
2095 signal_num = SELECTION_CLEAR_EVENT;
2097 case GDK_SELECTION_REQUEST:
2098 signal_num = SELECTION_REQUEST_EVENT;
2100 case GDK_SELECTION_NOTIFY:
2101 signal_num = SELECTION_NOTIFY_EVENT;
2103 case GDK_PROXIMITY_IN:
2104 signal_num = PROXIMITY_IN_EVENT;
2106 case GDK_PROXIMITY_OUT:
2107 signal_num = PROXIMITY_OUT_EVENT;
2110 signal_num = NO_EXPOSE_EVENT;
2112 case GDK_CLIENT_EVENT:
2113 signal_num = CLIENT_EVENT;
2116 /* there is no sense in providing a widget with bogus expose events
2118 if (!event->any.window)
2120 gtk_widget_unref (widget);
2123 signal_num = EXPOSE_EVENT;
2125 case GDK_VISIBILITY_NOTIFY:
2126 signal_num = VISIBILITY_NOTIFY_EVENT;
2129 g_warning ("could not determine signal number for event: %d", event->type);
2130 gtk_widget_unref (widget);
2134 if (signal_num != -1)
2135 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
2137 return_val |= GTK_OBJECT_DESTROYED (widget);
2139 gtk_widget_unref (widget);
2144 /*****************************************
2145 * gtk_widget_activate:
2150 *****************************************/
2153 gtk_widget_activate (GtkWidget *widget)
2155 g_return_if_fail (widget != NULL);
2156 g_return_if_fail (GTK_IS_WIDGET (widget));
2158 if (WIDGET_CLASS (widget)->activate_signal)
2159 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
2162 /*****************************************
2163 * gtk_widget_reparent_container_child:
2164 * assistent function to gtk_widget_reparent
2169 *****************************************/
2172 gtk_widget_reparent_container_child(GtkWidget *widget,
2173 gpointer client_data)
2175 g_return_if_fail (widget != NULL);
2176 g_return_if_fail (client_data != NULL);
2178 if (GTK_WIDGET_NO_WINDOW (widget))
2181 gdk_window_unref (widget->window);
2182 widget->window = (GdkWindow*) client_data;
2184 gdk_window_ref (widget->window);
2186 if (GTK_IS_CONTAINER (widget))
2187 gtk_container_forall (GTK_CONTAINER (widget),
2188 gtk_widget_reparent_container_child,
2192 gdk_window_reparent (widget->window,
2193 (GdkWindow*) client_data, 0, 0);
2196 /*****************************************
2197 * gtk_widget_reparent:
2202 *****************************************/
2205 gtk_widget_reparent (GtkWidget *widget,
2206 GtkWidget *new_parent)
2208 g_return_if_fail (widget != NULL);
2209 g_return_if_fail (GTK_IS_WIDGET (widget));
2210 g_return_if_fail (new_parent != NULL);
2211 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
2212 g_return_if_fail (widget->parent != NULL);
2214 if (widget->parent != new_parent)
2216 /* First try to see if we can get away without unrealizing
2217 * the widget as we reparent it. if so we set a flag so
2218 * that gtk_widget_unparent doesn't unrealize widget
2220 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
2221 GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
2223 gtk_widget_ref (widget);
2224 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
2225 gtk_container_add (GTK_CONTAINER (new_parent), widget);
2226 gtk_widget_unref (widget);
2228 if (GTK_WIDGET_IN_REPARENT (widget))
2230 GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
2232 /* OK, now fix up the widget's window. (And that for any
2233 * children, if the widget is NO_WINDOW and a container)
2235 if (GTK_WIDGET_NO_WINDOW (widget))
2237 if (GTK_IS_CONTAINER (widget))
2238 gtk_container_forall (GTK_CONTAINER (widget),
2239 gtk_widget_reparent_container_child,
2240 gtk_widget_get_parent_window (widget));
2243 GdkWindow *parent_window;
2245 parent_window = gtk_widget_get_parent_window (widget);
2246 if (parent_window != widget->window)
2249 gdk_window_unref (widget->window);
2250 widget->window = parent_window;
2252 gdk_window_ref (widget->window);
2257 gdk_window_reparent (widget->window, gtk_widget_get_parent_window (widget), 0, 0);
2262 /*****************************************
2268 *****************************************/
2271 gtk_widget_popup (GtkWidget *widget,
2275 g_return_if_fail (widget != NULL);
2277 if (!GTK_WIDGET_VISIBLE (widget))
2279 if (!GTK_WIDGET_REALIZED (widget))
2280 gtk_widget_realize (widget);
2281 if (!GTK_WIDGET_NO_WINDOW (widget))
2282 gdk_window_move (widget->window, x, y);
2283 gtk_widget_show (widget);
2287 /*****************************************
2288 * gtk_widget_intersect:
2293 *****************************************/
2296 gtk_widget_intersect (GtkWidget *widget,
2298 GdkRectangle *intersection)
2304 g_return_val_if_fail (widget != NULL, FALSE);
2305 g_return_val_if_fail (area != NULL, FALSE);
2308 dest = intersection;
2312 return_val = gdk_rectangle_intersect ((GdkRectangle*) &widget->allocation, area, dest);
2314 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2316 intersection->x -= widget->allocation.x;
2317 intersection->y -= widget->allocation.y;
2325 gtk_widget_basic (GtkWidget *widget)
2331 g_return_val_if_fail (widget != NULL, FALSE);
2333 if (!GTK_WIDGET_BASIC (widget))
2335 else if (GTK_IS_CONTAINER (widget))
2337 children = gtk_container_children (GTK_CONTAINER (widget));
2341 tmp_list = children;
2345 if (!gtk_widget_basic (GTK_WIDGET (tmp_list->data)))
2351 tmp_list = tmp_list->next;
2354 g_list_free (children);
2363 /*****************************************
2364 * gtk_widget_grab_focus:
2369 *****************************************/
2372 gtk_widget_grab_focus (GtkWidget *widget)
2374 g_return_if_fail (widget != NULL);
2375 g_return_if_fail (GTK_IS_WIDGET (widget));
2377 if (GTK_WIDGET_CAN_FOCUS (widget))
2381 GtkType window_type;
2383 window_type = gtk_window_get_type ();
2384 parent = widget->parent;
2387 while (parent && !gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2389 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2391 parent = parent->parent;
2394 if (parent && gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2396 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2397 gtk_window_set_focus (GTK_WINDOW (parent), widget);
2402 /*****************************************
2403 * gtk_widget_grab_default:
2408 *****************************************/
2411 gtk_widget_grab_default (GtkWidget *widget)
2414 GtkType window_type;
2416 g_return_if_fail (widget != NULL);
2417 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
2419 window_type = gtk_window_get_type ();
2420 window = widget->parent;
2422 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2423 window = window->parent;
2425 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2426 gtk_window_set_default (GTK_WINDOW (window), widget);
2429 /*****************************************
2430 * gtk_widget_set_name:
2435 *****************************************/
2438 gtk_widget_set_name (GtkWidget *widget,
2441 g_return_if_fail (widget != NULL);
2444 g_free (widget->name);
2445 widget->name = g_strdup (name);
2447 if (!GTK_WIDGET_USER_STYLE (widget))
2448 gtk_widget_set_rc_style (widget);
2451 /*****************************************
2452 * gtk_widget_get_name:
2457 *****************************************/
2460 gtk_widget_get_name (GtkWidget *widget)
2462 g_return_val_if_fail (widget != NULL, NULL);
2465 return widget->name;
2466 return gtk_type_name (GTK_WIDGET_TYPE (widget));
2469 /*****************************************
2470 * gtk_widget_set_state:
2477 *****************************************/
2480 gtk_widget_set_state (GtkWidget *widget,
2483 g_return_if_fail (widget != NULL);
2484 g_return_if_fail (GTK_IS_WIDGET (widget));
2486 if (state == GTK_WIDGET_STATE (widget))
2489 if (state == GTK_STATE_INSENSITIVE)
2490 gtk_widget_set_sensitive (widget, FALSE);
2496 data.state_restoration = FALSE;
2497 data.use_forall = FALSE;
2499 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2501 data.parent_sensitive = TRUE;
2503 gtk_widget_propagate_state (widget, &data);
2504 gtk_widget_queue_draw (widget);
2508 /*****************************************
2509 * gtk_widget_set_sensitive:
2513 * boolean value for sensitivity
2516 *****************************************/
2519 gtk_widget_set_sensitive (GtkWidget *widget,
2524 g_return_if_fail (widget != NULL);
2525 g_return_if_fail (GTK_IS_WIDGET (widget));
2527 sensitive = (sensitive != FALSE);
2529 if (sensitive == (GTK_WIDGET_SENSITIVE (widget) != FALSE))
2534 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
2535 data.state = GTK_WIDGET_SAVED_STATE (widget);
2539 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
2540 data.state = GTK_WIDGET_STATE (widget);
2542 data.state_restoration = TRUE;
2543 data.use_forall = TRUE;
2546 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2548 data.parent_sensitive = TRUE;
2550 gtk_widget_propagate_state (widget, &data);
2551 gtk_widget_queue_draw (widget);
2554 /*****************************************
2555 * gtk_widget_set_parent:
2560 *****************************************/
2563 gtk_widget_set_parent (GtkWidget *widget,
2568 g_return_if_fail (widget != NULL);
2569 g_return_if_fail (widget->parent == NULL);
2570 g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
2571 g_return_if_fail (parent != NULL);
2572 g_return_if_fail (widget != parent);
2574 /* keep this function in sync with gtk_menu_attach_to_widget()
2577 gtk_widget_ref (widget);
2578 gtk_object_sink (GTK_OBJECT (widget));
2579 widget->parent = parent;
2581 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
2582 data.state = GTK_WIDGET_STATE (parent);
2584 data.state = GTK_WIDGET_STATE (widget);
2585 data.state_restoration = FALSE;
2586 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (parent) != FALSE);
2587 data.use_forall = GTK_WIDGET_IS_SENSITIVE (parent) != GTK_WIDGET_IS_SENSITIVE (widget);
2589 gtk_widget_propagate_state (widget, &data);
2591 gtk_widget_set_style_recurse (widget, NULL);
2593 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
2596 /*****************************************
2598 * see docs/styles.txt
2599 *****************************************/
2601 gtk_widget_set_style (GtkWidget *widget,
2604 GtkStyle *default_style;
2605 gboolean initial_emission;
2607 g_return_if_fail (widget != NULL);
2608 g_return_if_fail (style != NULL);
2610 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2612 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
2613 GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
2615 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2618 gtk_style_ref (widget->style);
2619 if (!saved_default_style_key_id)
2620 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2621 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2624 gtk_widget_set_style_internal (widget, style, initial_emission);
2628 gtk_widget_ensure_style (GtkWidget *widget)
2630 if (!GTK_WIDGET_USER_STYLE (widget) &&
2631 !GTK_WIDGET_RC_STYLE (widget))
2632 gtk_widget_set_rc_style (widget);
2636 gtk_widget_set_rc_style (GtkWidget *widget)
2638 GtkStyle *saved_style;
2639 GtkStyle *new_style;
2640 gboolean initial_emission;
2642 g_return_if_fail (widget != NULL);
2644 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2646 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2647 GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
2649 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2650 new_style = gtk_rc_get_style (widget);
2655 gtk_style_ref (widget->style);
2656 if (!saved_default_style_key_id)
2657 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2658 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2660 gtk_widget_set_style_internal (widget, new_style, initial_emission);
2666 g_assert (initial_emission == FALSE); /* FIXME: remove this line */
2668 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2669 gtk_widget_set_style_internal (widget, saved_style, initial_emission);
2670 gtk_style_unref (saved_style);
2674 if (initial_emission)
2675 gtk_widget_set_style_internal (widget, widget->style, TRUE);
2681 gtk_widget_restore_default_style (GtkWidget *widget)
2683 GtkStyle *default_style;
2685 g_return_if_fail (widget != NULL);
2687 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2689 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2692 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2693 gtk_widget_set_style_internal (widget, default_style, FALSE);
2694 gtk_style_unref (default_style);
2699 gtk_widget_get_style (GtkWidget *widget)
2701 g_return_val_if_fail (widget != NULL, NULL);
2703 return widget->style;
2707 gtk_widget_style_set (GtkWidget *widget,
2708 GtkStyle *previous_style)
2710 if (GTK_WIDGET_REALIZED (widget) &&
2711 !GTK_WIDGET_NO_WINDOW (widget))
2713 gtk_style_set_background (widget->style, widget->window, widget->state);
2714 if (GTK_WIDGET_DRAWABLE (widget))
2715 gdk_window_clear (widget->window);
2720 gtk_widget_set_style_internal (GtkWidget *widget,
2722 gboolean initial_emission)
2724 g_return_if_fail (widget != NULL);
2725 g_return_if_fail (style != NULL);
2727 if (widget->style != style)
2729 GtkStyle *previous_style;
2731 if (GTK_WIDGET_REALIZED (widget))
2732 gtk_style_detach (widget->style);
2734 previous_style = widget->style;
2735 widget->style = style;
2736 gtk_style_ref (widget->style);
2738 if (GTK_WIDGET_REALIZED (widget))
2739 widget->style = gtk_style_attach (widget->style, widget->window);
2741 gtk_signal_emit (GTK_OBJECT (widget),
2742 widget_signals[STYLE_SET],
2743 initial_emission ? NULL : previous_style);
2744 gtk_style_unref (previous_style);
2746 if (widget->parent && !initial_emission)
2748 GtkRequisition old_requisition;
2750 old_requisition = widget->requisition;
2751 gtk_widget_size_request (widget, &widget->requisition);
2753 if ((old_requisition.width != widget->requisition.width) ||
2754 (old_requisition.height != widget->requisition.height))
2755 gtk_widget_queue_resize (widget);
2756 else if (GTK_WIDGET_DRAWABLE (widget))
2757 gtk_widget_queue_draw (widget);
2760 else if (initial_emission)
2762 gtk_signal_emit (GTK_OBJECT (widget),
2763 widget_signals[STYLE_SET],
2769 gtk_widget_set_style_recurse (GtkWidget *widget,
2770 gpointer client_data)
2772 if (GTK_WIDGET_RC_STYLE (widget))
2773 gtk_widget_set_rc_style (widget);
2775 if (GTK_IS_CONTAINER (widget))
2776 gtk_container_forall (GTK_CONTAINER (widget),
2777 gtk_widget_set_style_recurse,
2782 gtk_widget_reset_rc_styles (GtkWidget *widget)
2784 gtk_widget_set_style_recurse (widget, NULL);
2788 gtk_widget_set_default_style (GtkStyle *style)
2790 if (style != gtk_default_style)
2792 if (gtk_default_style)
2793 gtk_style_unref (gtk_default_style);
2794 gtk_default_style = style;
2795 if (gtk_default_style)
2796 gtk_style_ref (gtk_default_style);
2801 gtk_widget_get_default_style (void)
2803 if (!gtk_default_style)
2805 gtk_default_style = gtk_style_new ();
2806 gtk_style_ref (gtk_default_style);
2809 return gtk_default_style;
2813 gtk_widget_push_style (GtkStyle *style)
2815 g_return_if_fail (style != NULL);
2817 gtk_style_ref (style);
2818 style_stack = g_slist_prepend (style_stack, style);
2822 gtk_widget_peek_style (void)
2825 return (GtkStyle*) style_stack->data;
2827 return gtk_widget_get_default_style ();
2831 gtk_widget_pop_style (void)
2838 style_stack = style_stack->next;
2839 gtk_style_unref ((GtkStyle*) tmp->data);
2840 g_slist_free_1 (tmp);
2844 /*************************************************************
2845 * gtk_widget_set_parent_window:
2846 * Set a non default parent window for widget
2853 *************************************************************/
2856 gtk_widget_set_parent_window (GtkWidget *widget,
2857 GdkWindow *parent_window)
2859 GdkWindow *old_parent_window;
2861 g_return_if_fail (widget != NULL);
2863 old_parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2864 parent_window_key_id);
2866 if (parent_window != old_parent_window)
2868 if (!parent_window_key_id)
2869 parent_window_key_id = g_quark_from_static_string (parent_window_key);
2870 gtk_object_set_data_by_id (GTK_OBJECT (widget), parent_window_key_id,
2872 if (old_parent_window)
2873 gdk_window_unref (old_parent_window);
2875 gdk_window_ref (parent_window);
2879 /*************************************************************
2880 * gtk_widget_get_parent_window:
2881 * Get widget's parent window
2888 *************************************************************/
2891 gtk_widget_get_parent_window (GtkWidget *widget)
2893 GdkWindow *parent_window;
2895 g_return_val_if_fail (widget != NULL, NULL);
2896 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
2897 g_return_val_if_fail (widget->parent != NULL, NULL);
2899 parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2900 parent_window_key_id);
2902 return (parent_window != NULL) ? parent_window : widget->parent->window;
2905 /*****************************************
2906 * gtk_widget_set_uposition:
2911 *****************************************/
2914 gtk_widget_set_uposition (GtkWidget *widget,
2918 GtkWidgetAuxInfo *aux_info;
2920 g_return_if_fail (widget != NULL);
2922 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2925 if (!aux_info_key_id)
2926 aux_info_key_id = g_quark_from_static_string (aux_info_key);
2927 aux_info = gtk_widget_aux_info_new ();
2928 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2936 if (GTK_WIDGET_REALIZED (widget) && GTK_IS_WINDOW (widget) &&
2937 (aux_info->x != -1) && (aux_info->y != -1))
2939 gdk_window_set_hints (widget->window, aux_info->x, aux_info->y, 0, 0, 0, 0, GDK_HINT_POS);
2940 gdk_window_move (widget->window, aux_info->x, aux_info->y);
2943 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
2944 gtk_widget_size_allocate (widget, &widget->allocation);
2947 /*****************************************
2948 * gtk_widget_set_usize:
2953 *****************************************/
2956 gtk_widget_set_usize (GtkWidget *widget,
2960 GtkWidgetAuxInfo *aux_info;
2962 g_return_if_fail (widget != NULL);
2964 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2967 if (!aux_info_key_id)
2968 aux_info_key_id = g_quark_from_static_string (aux_info_key);
2969 aux_info = gtk_widget_aux_info_new ();
2970 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2974 aux_info->width = width;
2976 aux_info->height = height;
2978 if (GTK_WIDGET_VISIBLE (widget))
2979 gtk_widget_queue_resize (widget);
2982 /*****************************************
2983 * gtk_widget_set_events:
2988 *****************************************/
2991 gtk_widget_set_events (GtkWidget *widget,
2996 g_return_if_fail (widget != NULL);
2997 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
2998 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
3000 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3005 eventp = g_new (gint, 1);
3009 event_key_id = g_quark_from_static_string (event_key);
3010 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3015 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3019 /*****************************************
3020 * gtk_widget_add_events:
3025 *****************************************/
3028 gtk_widget_add_events (GtkWidget *widget,
3033 g_return_if_fail (widget != NULL);
3034 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3036 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3042 eventp = g_new (gint, 1);
3048 event_key_id = g_quark_from_static_string (event_key);
3049 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3054 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3057 if (GTK_WIDGET_REALIZED (widget))
3059 gdk_window_set_events (widget->window,
3060 gdk_window_get_events (widget->window) | events);
3064 /*****************************************
3065 * gtk_widget_set_extension_events:
3070 *****************************************/
3073 gtk_widget_set_extension_events (GtkWidget *widget,
3074 GdkExtensionMode mode)
3076 GdkExtensionMode *modep;
3078 g_return_if_fail (widget != NULL);
3080 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3083 modep = g_new (GdkExtensionMode, 1);
3086 if (!extension_event_key_id)
3087 extension_event_key_id = g_quark_from_static_string (extension_event_key);
3088 gtk_object_set_data_by_id (GTK_OBJECT (widget), extension_event_key_id, modep);
3091 /*****************************************
3092 * gtk_widget_get_toplevel:
3097 *****************************************/
3100 gtk_widget_get_toplevel (GtkWidget *widget)
3102 g_return_val_if_fail (widget != NULL, NULL);
3104 while (widget->parent)
3105 widget = widget->parent;
3110 /*****************************************
3111 * gtk_widget_get_ancestor:
3116 *****************************************/
3119 gtk_widget_get_ancestor (GtkWidget *widget,
3120 GtkType widget_type)
3122 g_return_val_if_fail (widget != NULL, NULL);
3124 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type))
3125 widget = widget->parent;
3127 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type)))
3133 /*****************************************
3134 * gtk_widget_get_colormap:
3139 *****************************************/
3142 gtk_widget_get_colormap (GtkWidget *widget)
3144 GdkColormap *colormap;
3146 g_return_val_if_fail (widget != NULL, NULL);
3150 colormap = gdk_window_get_colormap (widget->window);
3151 /* If window was destroyed previously, we'll get NULL here */
3156 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
3160 return gtk_widget_get_default_colormap ();
3163 /*****************************************
3164 * gtk_widget_get_visual:
3169 *****************************************/
3172 gtk_widget_get_visual (GtkWidget *widget)
3176 g_return_val_if_fail (widget != NULL, NULL);
3180 visual = gdk_window_get_visual (widget->window);
3181 /* If window was destroyed previously, we'll get NULL here */
3186 visual = gtk_object_get_data (GTK_OBJECT (widget), visual_key);
3190 return gtk_widget_get_default_visual ();
3193 /*****************************************
3194 * gtk_widget_get_events:
3199 *****************************************/
3202 gtk_widget_get_events (GtkWidget *widget)
3206 g_return_val_if_fail (widget != NULL, 0);
3208 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3215 /*****************************************
3216 * gtk_widget_get_extension_events:
3221 *****************************************/
3224 gtk_widget_get_extension_events (GtkWidget *widget)
3226 GdkExtensionMode *mode;
3228 g_return_val_if_fail (widget != NULL, 0);
3230 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3237 /*****************************************
3238 * gtk_widget_get_pointer:
3243 *****************************************/
3246 gtk_widget_get_pointer (GtkWidget *widget,
3250 g_return_if_fail (widget != NULL);
3257 if (GTK_WIDGET_REALIZED (widget))
3259 gdk_window_get_pointer (widget->window, x, y, NULL);
3261 if (GTK_WIDGET_NO_WINDOW (widget))
3264 *x -= widget->allocation.x;
3266 *y -= widget->allocation.y;
3271 /*****************************************
3272 * gtk_widget_is_ancestor:
3277 *****************************************/
3280 gtk_widget_is_ancestor (GtkWidget *widget,
3281 GtkWidget *ancestor)
3283 g_return_val_if_fail (widget != NULL, FALSE);
3284 g_return_val_if_fail (ancestor != NULL, FALSE);
3288 if (widget->parent == ancestor)
3290 widget = widget->parent;
3296 /*****************************************
3297 * gtk_widget_is_child:
3302 *****************************************/
3305 gtk_widget_is_child (GtkWidget *widget,
3308 g_return_val_if_fail (widget != NULL, FALSE);
3309 g_return_val_if_fail (child != NULL, FALSE);
3311 return (child->parent == widget);
3314 /*****************************************
3315 * gtk_widget_push_colormap:
3320 *****************************************/
3323 gtk_widget_push_colormap (GdkColormap *cmap)
3325 g_return_if_fail (cmap != NULL);
3327 colormap_stack = g_slist_prepend (colormap_stack, cmap);
3330 /*****************************************
3331 * gtk_widget_push_visual:
3336 *****************************************/
3339 gtk_widget_push_visual (GdkVisual *visual)
3341 g_return_if_fail (visual != NULL);
3343 visual_stack = g_slist_prepend (visual_stack, visual);
3347 gtk_widget_push_composite (void)
3349 composite_child_stack++;
3353 gtk_widget_pop_composite (void)
3355 if (composite_child_stack)
3356 composite_child_stack--;
3359 /*****************************************
3360 * gtk_widget_pop_colormap:
3365 *****************************************/
3368 gtk_widget_pop_colormap (void)
3374 tmp = colormap_stack;
3375 colormap_stack = colormap_stack->next;
3376 g_slist_free_1 (tmp);
3380 /*****************************************
3381 * gtk_widget_pop_visual:
3386 *****************************************/
3389 gtk_widget_pop_visual (void)
3396 visual_stack = visual_stack->next;
3397 g_slist_free_1 (tmp);
3401 /*****************************************
3402 * gtk_widget_set_default_colormap:
3407 *****************************************/
3410 gtk_widget_set_default_colormap (GdkColormap *colormap)
3412 if (default_colormap != colormap)
3414 if (default_colormap)
3415 gdk_colormap_unref (default_colormap);
3416 default_colormap = colormap;
3417 if (default_colormap)
3418 gdk_colormap_ref (default_colormap);
3422 /*****************************************
3423 * gtk_widget_set_default_visual:
3428 *****************************************/
3431 gtk_widget_set_default_visual (GdkVisual *visual)
3433 default_visual = visual;
3436 /*****************************************
3437 * gtk_widget_get_default_colormap:
3442 *****************************************/
3445 gtk_widget_get_default_colormap (void)
3447 if (!default_colormap)
3448 default_colormap = gdk_colormap_get_system ();
3450 return default_colormap;
3453 /*****************************************
3454 * gtk_widget_get_default_visual:
3459 *****************************************/
3462 gtk_widget_get_default_visual (void)
3464 if (!default_visual)
3465 default_visual = gdk_visual_get_system ();
3467 return default_visual;
3471 gtk_widget_shutdown (GtkObject *object)
3475 /* gtk_object_destroy() will already hold a refcount on object
3477 widget = GTK_WIDGET (object);
3480 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
3482 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3483 if (GTK_WIDGET_REALIZED (widget))
3484 gtk_widget_unrealize (widget);
3486 parent_class->shutdown (object);
3490 gtk_widget_real_destroy (GtkObject *object)
3493 GtkStyle *saved_style;
3495 /* gtk_object_destroy() will already hold a refcount on object
3497 widget = GTK_WIDGET (object);
3499 gtk_grab_remove (widget);
3500 gtk_selection_remove_all (widget);
3502 saved_style = gtk_object_get_data_by_id (object, saved_default_style_key_id);
3505 gtk_style_unref (saved_style);
3506 gtk_object_remove_data_by_id (object, saved_default_style_key_id);
3509 gtk_style_unref (widget->style);
3510 widget->style = NULL;
3512 parent_class->destroy (object);
3516 gtk_widget_finalize (GtkObject *object)
3519 GtkWidgetAuxInfo *aux_info;
3521 GdkExtensionMode *mode;
3523 widget = GTK_WIDGET (object);
3526 g_free (widget->name);
3528 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3530 gtk_widget_aux_info_destroy (aux_info);
3532 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3536 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3540 parent_class->finalize (object);
3543 /*****************************************
3544 * gtk_widget_real_show:
3549 *****************************************/
3552 gtk_widget_real_show (GtkWidget *widget)
3554 g_return_if_fail (widget != NULL);
3555 g_return_if_fail (GTK_IS_WIDGET (widget));
3557 if (!GTK_WIDGET_VISIBLE (widget))
3559 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
3563 gtk_widget_queue_resize (widget->parent);
3565 if (GTK_WIDGET_MAPPED (widget->parent))
3566 gtk_widget_map (widget);
3571 /*****************************************
3572 * gtk_widget_real_hide:
3577 *****************************************/
3580 gtk_widget_real_hide (GtkWidget *widget)
3582 g_return_if_fail (widget != NULL);
3583 g_return_if_fail (GTK_IS_WIDGET (widget));
3585 if (GTK_WIDGET_VISIBLE (widget))
3587 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3589 if (GTK_WIDGET_MAPPED (widget))
3590 gtk_widget_unmap (widget);
3593 gtk_widget_queue_resize (widget->parent);
3597 /*****************************************
3598 * gtk_widget_real_map:
3603 *****************************************/
3606 gtk_widget_real_map (GtkWidget *widget)
3608 g_return_if_fail (widget != NULL);
3609 g_return_if_fail (GTK_IS_WIDGET (widget));
3611 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget))
3613 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
3615 if (!GTK_WIDGET_NO_WINDOW (widget))
3616 gdk_window_show (widget->window);
3618 gtk_widget_queue_draw (widget);
3622 /*****************************************
3623 * gtk_widget_real_unmap:
3628 *****************************************/
3631 gtk_widget_real_unmap (GtkWidget *widget)
3633 g_return_if_fail (widget != NULL);
3634 g_return_if_fail (GTK_IS_WIDGET (widget));
3636 if (GTK_WIDGET_MAPPED (widget))
3638 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
3640 if (GTK_WIDGET_NO_WINDOW (widget))
3641 gdk_window_clear_area (widget->window,
3642 widget->allocation.x,
3643 widget->allocation.y,
3644 widget->allocation.width,
3645 widget->allocation.height);
3647 gdk_window_hide (widget->window);
3651 /*****************************************
3652 * gtk_widget_real_realize:
3657 *****************************************/
3660 gtk_widget_real_realize (GtkWidget *widget)
3662 g_return_if_fail (widget != NULL);
3663 g_return_if_fail (GTK_IS_WIDGET (widget));
3664 g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
3666 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
3669 widget->window = gtk_widget_get_parent_window (widget);
3670 gdk_window_ref (widget->window);
3672 widget->style = gtk_style_attach (widget->style, widget->window);
3675 /*****************************************
3676 * gtk_widget_real_unrealize:
3681 *****************************************/
3684 gtk_widget_real_unrealize (GtkWidget *widget)
3686 g_return_if_fail (widget != NULL);
3687 g_return_if_fail (GTK_IS_WIDGET (widget));
3689 if (GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_MAPPED (widget))
3690 gtk_widget_real_unmap (widget);
3692 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
3694 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT(widget)->klass->type));
3697 gtk_style_detach (widget->style);
3698 if (!GTK_WIDGET_NO_WINDOW (widget))
3700 gdk_window_set_user_data (widget->window, NULL);
3701 gdk_window_destroy (widget->window);
3702 widget->window = NULL;
3706 gdk_window_unref (widget->window);
3707 widget->window = NULL;
3710 /* Unrealize afterwards to improve visual effect */
3712 if (GTK_IS_CONTAINER (widget))
3713 gtk_container_forall (GTK_CONTAINER (widget),
3714 (GtkCallback) gtk_widget_unrealize,
3718 /*****************************************
3719 * gtk_widget_real_draw:
3724 *****************************************/
3727 gtk_widget_real_draw (GtkWidget *widget,
3730 GdkEventExpose event;
3732 g_return_if_fail (widget != NULL);
3733 g_return_if_fail (GTK_IS_WIDGET (widget));
3734 g_return_if_fail (area != NULL);
3736 if (GTK_WIDGET_DRAWABLE (widget))
3738 event.type = GDK_EXPOSE;
3739 event.send_event = TRUE;
3740 event.window = widget->window;
3744 gdk_window_ref (event.window);
3745 gtk_widget_event (widget, (GdkEvent*) &event);
3746 gdk_window_unref (event.window);
3751 gtk_widget_real_size_request (GtkWidget *widget,
3752 GtkRequisition *requisition)
3754 g_return_if_fail (widget != NULL);
3755 g_return_if_fail (GTK_IS_WIDGET (widget));
3757 requisition->width = widget->requisition.width;
3758 requisition->height = widget->requisition.height;
3762 gtk_widget_real_size_allocate (GtkWidget *widget,
3763 GtkAllocation *allocation)
3765 g_return_if_fail (widget != NULL);
3766 g_return_if_fail (GTK_IS_WIDGET (widget));
3768 if (GTK_WIDGET_NO_WINDOW (widget) &&
3769 GTK_WIDGET_MAPPED (widget) &&
3770 ((widget->allocation.x != allocation->x) ||
3771 (widget->allocation.y != allocation->y) ||
3772 (widget->allocation.width != allocation->width) ||
3773 (widget->allocation.height != allocation->height)) &&
3774 (widget->allocation.width != 0) &&
3775 (widget->allocation.height != 0))
3776 gdk_window_clear_area (widget->window,
3777 widget->allocation.x,
3778 widget->allocation.y,
3779 widget->allocation.width,
3780 widget->allocation.height);
3782 widget->allocation = *allocation;
3784 if (GTK_WIDGET_REALIZED (widget) &&
3785 !GTK_WIDGET_NO_WINDOW (widget))
3786 gdk_window_move_resize (widget->window,
3787 allocation->x, allocation->y,
3788 allocation->width, allocation->height);
3791 /*****************************************
3792 * gtk_widget_peek_colormap:
3797 *****************************************/
3800 gtk_widget_peek_colormap (void)
3803 return (GdkColormap*) colormap_stack->data;
3804 return gtk_widget_get_default_colormap ();
3807 /*****************************************
3808 * gtk_widget_peek_visual:
3813 *****************************************/
3816 gtk_widget_peek_visual (void)
3819 return (GdkVisual*) visual_stack->data;
3820 return gtk_widget_get_default_visual ();
3824 gtk_widget_propagate_state (GtkWidget *widget,
3829 /* don't call this function with state==GTK_STATE_INSENSITIVE,
3830 * parent_sensitive==TRUE on a sensitive widget
3833 old_state = GTK_WIDGET_STATE (widget);
3835 if (data->parent_sensitive)
3837 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3839 if (GTK_WIDGET_IS_SENSITIVE (widget))
3841 if (data->state_restoration)
3842 GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget);
3844 GTK_WIDGET_STATE (widget) = data->state;
3848 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3849 if (!data->state_restoration &&
3850 data->state != GTK_STATE_INSENSITIVE)
3851 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3856 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3857 if (!data->state_restoration)
3859 if (data->state != GTK_STATE_INSENSITIVE)
3860 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3862 else if (GTK_WIDGET_STATE (widget) != GTK_STATE_INSENSITIVE)
3863 GTK_WIDGET_SAVED_STATE (widget) = GTK_WIDGET_STATE (widget);
3864 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3867 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
3871 window = gtk_widget_get_ancestor (widget, gtk_window_get_type ());
3873 gtk_window_set_focus (GTK_WINDOW (window), NULL);
3876 if (old_state != GTK_WIDGET_STATE (widget))
3878 gtk_widget_ref (widget);
3879 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
3881 if (GTK_IS_CONTAINER (widget))
3883 data->parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget) != FALSE);
3884 data->state = GTK_WIDGET_STATE (widget);
3885 if (data->use_forall)
3886 gtk_container_forall (GTK_CONTAINER (widget),
3887 (GtkCallback) gtk_widget_propagate_state,
3890 gtk_container_foreach (GTK_CONTAINER (widget),
3891 (GtkCallback) gtk_widget_propagate_state,
3894 gtk_widget_unref (widget);
3898 /*****************************************
3899 * gtk_widget_draw_children_recurse:
3904 *****************************************/
3907 gtk_widget_draw_children_recurse (GtkWidget *widget,
3908 gpointer client_data)
3910 gtk_widget_draw (widget, NULL);
3911 gtk_widget_draw_children (widget);
3914 /*****************************************
3915 * gtk_widget_aux_info_new:
3920 *****************************************/
3922 static GtkWidgetAuxInfo*
3923 gtk_widget_aux_info_new (void)
3925 GtkWidgetAuxInfo *aux_info;
3927 if (!aux_info_mem_chunk)
3928 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
3929 sizeof (GtkWidgetAuxInfo),
3930 1024, G_ALLOC_AND_FREE);
3932 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
3936 aux_info->width = 0;
3937 aux_info->height = 0;
3942 /*****************************************
3943 * gtk_widget_aux_info_destroy:
3948 *****************************************/
3951 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
3953 g_return_if_fail (aux_info != NULL);
3955 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
3958 /*****************************************
3959 * gtk_widget_shape_combine_mask:
3960 * set a shape for this widgets' gdk window, this allows for
3961 * transparent windows etc., see gdk_window_shape_combine_mask
3962 * for more information
3967 *****************************************/
3969 gtk_widget_shape_combine_mask (GtkWidget *widget,
3970 GdkBitmap *shape_mask,
3974 GtkWidgetShapeInfo* shape_info;
3976 g_return_if_fail (widget != NULL);
3977 /* set_shape doesn't work on widgets without gdk window */
3978 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3982 GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
3985 gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
3987 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
3988 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
3989 g_free (shape_info);
3993 GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
3995 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
3998 shape_info = g_new (GtkWidgetShapeInfo, 1);
3999 gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
4001 shape_info->shape_mask = shape_mask;
4002 shape_info->offset_x = offset_x;
4003 shape_info->offset_y = offset_y;
4005 /* set shape if widget has a gdk window allready.
4006 * otherwise the shape is scheduled to be set by gtk_widget_realize.
4009 gdk_window_shape_combine_mask (widget->window, shape_mask,
4010 offset_x, offset_y);
4015 gtk_widget_ref (GtkWidget *widget)
4017 g_return_if_fail (widget != NULL);
4018 g_return_if_fail (GTK_IS_WIDGET (widget));
4020 gtk_object_ref ((GtkObject*) widget);
4024 gtk_widget_unref (GtkWidget *widget)
4026 g_return_if_fail (widget != NULL);
4027 g_return_if_fail (GTK_IS_WIDGET (widget));
4029 gtk_object_unref ((GtkObject*) widget);
4033 gtk_widget_path (GtkWidget *widget,
4034 guint *path_length_p,
4036 gchar **path_reversed_p)
4038 static gchar *rev_path = NULL;
4039 static guint path_len = 0;
4042 g_return_if_fail (widget != NULL);
4043 g_return_if_fail (GTK_IS_WIDGET (widget));
4052 string = gtk_widget_get_name (widget);
4053 l = strlen (string);
4054 while (path_len <= len + l + 1)
4056 path_len += INIT_PATH_SIZE;
4057 rev_path = g_realloc (rev_path, path_len);
4065 widget = widget->parent;
4068 rev_path[len++] = '.';
4070 rev_path[len++] = 0;
4075 *path_length_p = len - 1;
4076 if (path_reversed_p)
4077 *path_reversed_p = g_strdup (rev_path);
4080 *path_p = g_strdup (rev_path);
4081 g_strreverse (*path_p);
4086 gtk_widget_class_path (GtkWidget *widget,
4087 guint *path_length_p,
4089 gchar **path_reversed_p)
4091 static gchar *rev_path = NULL;
4092 static guint path_len = 0;
4095 g_return_if_fail (widget != NULL);
4096 g_return_if_fail (GTK_IS_WIDGET (widget));
4105 string = gtk_type_name (GTK_WIDGET_TYPE (widget));
4106 l = strlen (string);
4107 while (path_len <= len + l + 1)
4109 path_len += INIT_PATH_SIZE;
4110 rev_path = g_realloc (rev_path, path_len);
4118 widget = widget->parent;
4121 rev_path[len++] = '.';
4123 rev_path[len++] = 0;
4128 *path_length_p = len - 1;
4129 if (path_reversed_p)
4130 *path_reversed_p = g_strdup (rev_path);
4133 *path_p = g_strdup (rev_path);
4134 g_strreverse (*path_p);