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)
72 PROPERTY_NOTIFY_EVENT,
73 SELECTION_CLEAR_EVENT,
74 SELECTION_REQUEST_EVENT,
75 SELECTION_NOTIFY_EVENT,
90 VISIBILITY_NOTIFY_EVENT,
116 typedef struct _GtkStateData GtkStateData;
121 guint state_restoration : 1;
122 guint parent_sensitive : 1;
123 guint use_forall : 1;
126 static void gtk_widget_class_init (GtkWidgetClass *klass);
127 static void gtk_widget_init (GtkWidget *widget);
128 static void gtk_widget_set_arg (GtkObject *object,
131 static void gtk_widget_get_arg (GtkObject *object,
134 static void gtk_widget_shutdown (GtkObject *object);
135 static void gtk_widget_real_destroy (GtkObject *object);
136 static void gtk_widget_finalize (GtkObject *object);
137 static void gtk_widget_real_show (GtkWidget *widget);
138 static void gtk_widget_real_hide (GtkWidget *widget);
139 static void gtk_widget_real_map (GtkWidget *widget);
140 static void gtk_widget_real_unmap (GtkWidget *widget);
141 static void gtk_widget_real_realize (GtkWidget *widget);
142 static void gtk_widget_real_unrealize (GtkWidget *widget);
143 static void gtk_widget_real_draw (GtkWidget *widget,
145 static void gtk_widget_real_size_request (GtkWidget *widget,
146 GtkRequisition *requisition);
147 static void gtk_widget_real_size_allocate (GtkWidget *widget,
148 GtkAllocation *allocation);
149 static gint gtk_widget_real_key_press_event (GtkWidget *widget,
151 static gint gtk_widget_real_key_release_event (GtkWidget *widget,
153 static void gtk_widget_style_set (GtkWidget *widget,
154 GtkStyle *previous_style);
155 static void gtk_widget_real_grab_focus (GtkWidget *focus_widget);
157 static void gtk_widget_redraw_queue_remove (GtkWidget *widget);
160 static GdkColormap* gtk_widget_peek_colormap (void);
161 static GdkVisual* gtk_widget_peek_visual (void);
162 static GtkStyle* gtk_widget_peek_style (void);
164 static void gtk_widget_reparent_container_child (GtkWidget *widget,
165 gpointer client_data);
166 static void gtk_widget_propagate_state (GtkWidget *widget,
168 static void gtk_widget_set_style_internal (GtkWidget *widget,
170 gboolean initial_emission);
171 static void gtk_widget_set_style_recurse (GtkWidget *widget,
172 gpointer client_data);
174 static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
175 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
177 static GtkObjectClass *parent_class = NULL;
178 static guint widget_signals[LAST_SIGNAL] = { 0 };
180 static GMemChunk *aux_info_mem_chunk = NULL;
182 static GdkColormap *default_colormap = NULL;
183 static GdkVisual *default_visual = NULL;
184 static GtkStyle *gtk_default_style = NULL;
186 static GSList *colormap_stack = NULL;
187 static GSList *visual_stack = NULL;
188 static GSList *style_stack = NULL;
189 static guint composite_child_stack = 0;
190 static GSList *gtk_widget_redraw_queue = NULL;
192 static const gchar *aux_info_key = "gtk-aux-info";
193 static guint aux_info_key_id = 0;
194 static const gchar *event_key = "gtk-event-mask";
195 static guint event_key_id = 0;
196 static const gchar *extension_event_key = "gtk-extension-event-mode";
197 static guint extension_event_key_id = 0;
198 static const gchar *parent_window_key = "gtk-parent-window";
199 static guint parent_window_key_id = 0;
200 static const gchar *saved_default_style_key = "gtk-saved-default-style";
201 static guint saved_default_style_key_id = 0;
202 static const gchar *shape_info_key = "gtk-shape-info";
203 static const gchar *colormap_key = "gtk-colormap";
204 static const gchar *visual_key = "gtk-visual";
206 static const gchar *rc_style_key = "gtk-rc-style";
207 static guint rc_style_key_id = 0;
209 /*****************************************
210 * gtk_widget_get_type:
215 *****************************************/
218 gtk_widget_get_type (void)
220 static GtkType widget_type = 0;
224 static const GtkTypeInfo widget_info =
228 sizeof (GtkWidgetClass),
229 (GtkClassInitFunc) gtk_widget_class_init,
230 (GtkObjectInitFunc) gtk_widget_init,
231 /* reserved_1 */ NULL,
232 /* reserved_2 */ NULL,
233 (GtkClassInitFunc) NULL,
236 widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);
242 /*****************************************
243 * gtk_widget_class_init:
248 *****************************************/
251 gtk_widget_debug_msg (GtkWidget *widget,
254 fprintf (stderr, "Gtk-DEBUG: %s\n", string);
258 gtk_widget_class_init (GtkWidgetClass *klass)
260 GtkObjectClass *object_class;
262 object_class = (GtkObjectClass*) klass;
264 parent_class = gtk_type_class (gtk_object_get_type ());
266 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
267 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
268 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
269 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
270 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
271 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
272 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
273 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
274 gtk_object_add_arg_type ("GtkWidget::app_paintable", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_APP_PAINTABLE);
275 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
276 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
277 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
278 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
279 gtk_object_add_arg_type ("GtkWidget::composite_child", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_COMPOSITE_CHILD);
280 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
281 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
282 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
284 widget_signals[SHOW] =
285 gtk_signal_new ("show",
288 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
289 gtk_marshal_NONE__NONE,
291 widget_signals[HIDE] =
292 gtk_signal_new ("hide",
295 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
296 gtk_marshal_NONE__NONE,
298 widget_signals[MAP] =
299 gtk_signal_new ("map",
302 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
303 gtk_marshal_NONE__NONE,
305 widget_signals[UNMAP] =
306 gtk_signal_new ("unmap",
309 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
310 gtk_marshal_NONE__NONE,
312 widget_signals[REALIZE] =
313 gtk_signal_new ("realize",
316 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
317 gtk_marshal_NONE__NONE,
319 widget_signals[UNREALIZE] =
320 gtk_signal_new ("unrealize",
323 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
324 gtk_marshal_NONE__NONE,
326 widget_signals[DRAW] =
327 gtk_signal_new ("draw",
330 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
331 gtk_marshal_NONE__POINTER,
334 widget_signals[DRAW_FOCUS] =
335 gtk_signal_new ("draw_focus",
338 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
339 gtk_marshal_NONE__NONE,
341 widget_signals[DRAW_DEFAULT] =
342 gtk_signal_new ("draw_default",
345 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
346 gtk_marshal_NONE__NONE,
348 widget_signals[SIZE_REQUEST] =
349 gtk_signal_new ("size_request",
352 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
353 gtk_marshal_NONE__POINTER,
356 widget_signals[SIZE_ALLOCATE] =
357 gtk_signal_new ("size_allocate",
360 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
361 gtk_marshal_NONE__POINTER,
364 widget_signals[STATE_CHANGED] =
365 gtk_signal_new ("state_changed",
368 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
369 gtk_marshal_NONE__UINT,
371 GTK_TYPE_STATE_TYPE);
372 widget_signals[PARENT_SET] =
373 gtk_signal_new ("parent_set",
376 GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
377 gtk_marshal_NONE__OBJECT,
380 widget_signals[STYLE_SET] =
381 gtk_signal_new ("style_set",
384 GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
385 gtk_marshal_NONE__POINTER,
388 widget_signals[ADD_ACCELERATOR] =
389 gtk_accel_group_create_add (object_class->type, GTK_RUN_LAST,
390 GTK_SIGNAL_OFFSET (GtkWidgetClass, add_accelerator));
391 widget_signals[REMOVE_ACCELERATOR] =
392 gtk_accel_group_create_remove (object_class->type, GTK_RUN_LAST,
393 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));
394 widget_signals[GRAB_FOCUS] =
395 gtk_signal_new ("grab_focus",
396 GTK_RUN_LAST | GTK_RUN_ACTION,
398 GTK_SIGNAL_OFFSET (GtkWidgetClass, grab_focus),
399 gtk_marshal_NONE__NONE,
401 widget_signals[EVENT] =
402 gtk_signal_new ("event",
405 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
406 gtk_marshal_BOOL__POINTER,
409 widget_signals[BUTTON_PRESS_EVENT] =
410 gtk_signal_new ("button_press_event",
413 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
414 gtk_marshal_BOOL__POINTER,
417 widget_signals[BUTTON_RELEASE_EVENT] =
418 gtk_signal_new ("button_release_event",
421 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
422 gtk_marshal_BOOL__POINTER,
425 widget_signals[MOTION_NOTIFY_EVENT] =
426 gtk_signal_new ("motion_notify_event",
429 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
430 gtk_marshal_BOOL__POINTER,
433 widget_signals[DELETE_EVENT] =
434 gtk_signal_new ("delete_event",
437 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
438 gtk_marshal_BOOL__POINTER,
441 widget_signals[DESTROY_EVENT] =
442 gtk_signal_new ("destroy_event",
445 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
446 gtk_marshal_BOOL__POINTER,
449 widget_signals[EXPOSE_EVENT] =
450 gtk_signal_new ("expose_event",
453 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
454 gtk_marshal_BOOL__POINTER,
457 widget_signals[KEY_PRESS_EVENT] =
458 gtk_signal_new ("key_press_event",
461 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
462 gtk_marshal_BOOL__POINTER,
465 widget_signals[KEY_RELEASE_EVENT] =
466 gtk_signal_new ("key_release_event",
469 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
470 gtk_marshal_BOOL__POINTER,
473 widget_signals[ENTER_NOTIFY_EVENT] =
474 gtk_signal_new ("enter_notify_event",
477 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
478 gtk_marshal_BOOL__POINTER,
481 widget_signals[LEAVE_NOTIFY_EVENT] =
482 gtk_signal_new ("leave_notify_event",
485 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
486 gtk_marshal_BOOL__POINTER,
489 widget_signals[CONFIGURE_EVENT] =
490 gtk_signal_new ("configure_event",
493 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
494 gtk_marshal_BOOL__POINTER,
497 widget_signals[FOCUS_IN_EVENT] =
498 gtk_signal_new ("focus_in_event",
501 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
502 gtk_marshal_BOOL__POINTER,
505 widget_signals[FOCUS_OUT_EVENT] =
506 gtk_signal_new ("focus_out_event",
509 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
510 gtk_marshal_BOOL__POINTER,
513 widget_signals[MAP_EVENT] =
514 gtk_signal_new ("map_event",
517 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
518 gtk_marshal_BOOL__POINTER,
521 widget_signals[UNMAP_EVENT] =
522 gtk_signal_new ("unmap_event",
525 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
526 gtk_marshal_BOOL__POINTER,
529 widget_signals[PROPERTY_NOTIFY_EVENT] =
530 gtk_signal_new ("property_notify_event",
533 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
534 gtk_marshal_BOOL__POINTER,
537 widget_signals[SELECTION_CLEAR_EVENT] =
538 gtk_signal_new ("selection_clear_event",
541 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
542 gtk_marshal_BOOL__POINTER,
545 widget_signals[SELECTION_REQUEST_EVENT] =
546 gtk_signal_new ("selection_request_event",
549 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
550 gtk_marshal_BOOL__POINTER,
553 widget_signals[SELECTION_NOTIFY_EVENT] =
554 gtk_signal_new ("selection_notify_event",
557 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
558 gtk_marshal_BOOL__POINTER,
561 widget_signals[SELECTION_RECEIVED] =
562 gtk_signal_new ("selection_received",
565 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
566 gtk_marshal_NONE__POINTER_UINT,
568 GTK_TYPE_SELECTION_DATA,
570 widget_signals[SELECTION_GET] =
571 gtk_signal_new ("selection_get",
574 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_get),
575 gtk_marshal_NONE__POINTER_UINT_UINT,
577 GTK_TYPE_SELECTION_DATA,
580 widget_signals[PROXIMITY_IN_EVENT] =
581 gtk_signal_new ("proximity_in_event",
584 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
585 gtk_marshal_BOOL__POINTER,
588 widget_signals[PROXIMITY_OUT_EVENT] =
589 gtk_signal_new ("proximity_out_event",
592 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
593 gtk_marshal_BOOL__POINTER,
596 widget_signals[DRAG_LEAVE] =
597 gtk_signal_new ("drag_leave",
600 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_leave),
601 gtk_marshal_NONE__POINTER_UINT,
603 GTK_TYPE_GDK_DRAG_CONTEXT,
605 widget_signals[DRAG_BEGIN] =
606 gtk_signal_new ("drag_begin",
609 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin),
610 gtk_marshal_NONE__POINTER,
612 GTK_TYPE_GDK_DRAG_CONTEXT);
613 widget_signals[DRAG_END] =
614 gtk_signal_new ("drag_end",
617 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end),
618 gtk_marshal_NONE__POINTER,
620 GTK_TYPE_GDK_DRAG_CONTEXT);
621 widget_signals[DRAG_DATA_DELETE] =
622 gtk_signal_new ("drag_data_delete",
625 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_delete),
626 gtk_marshal_NONE__POINTER,
628 GTK_TYPE_GDK_DRAG_CONTEXT);
629 widget_signals[DRAG_MOTION] =
630 gtk_signal_new ("drag_motion",
633 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_motion),
634 gtk_marshal_BOOL__POINTER_INT_INT_UINT,
636 GTK_TYPE_GDK_DRAG_CONTEXT,
640 widget_signals[DRAG_DROP] =
641 gtk_signal_new ("drag_drop",
644 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_drop),
645 gtk_marshal_BOOL__POINTER_INT_INT_UINT,
647 GTK_TYPE_GDK_DRAG_CONTEXT,
651 widget_signals[DRAG_DATA_GET] =
652 gtk_signal_new ("drag_data_get",
655 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_get),
656 gtk_marshal_NONE__POINTER_POINTER_UINT_UINT,
658 GTK_TYPE_GDK_DRAG_CONTEXT,
659 GTK_TYPE_SELECTION_DATA,
662 widget_signals[DRAG_DATA_RECEIVED] =
663 gtk_signal_new ("drag_data_received",
666 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_received),
667 gtk_marshal_NONE__POINTER_INT_INT_POINTER_UINT_UINT,
669 GTK_TYPE_GDK_DRAG_CONTEXT,
672 GTK_TYPE_SELECTION_DATA,
675 widget_signals[VISIBILITY_NOTIFY_EVENT] =
676 gtk_signal_new ("visibility_notify_event",
679 GTK_SIGNAL_OFFSET (GtkWidgetClass, visibility_notify_event),
680 gtk_marshal_BOOL__POINTER,
683 widget_signals[CLIENT_EVENT] =
684 gtk_signal_new ("client_event",
687 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
688 gtk_marshal_BOOL__POINTER,
691 widget_signals[NO_EXPOSE_EVENT] =
692 gtk_signal_new ("no_expose_event",
695 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
696 gtk_marshal_BOOL__POINTER,
699 widget_signals[DEBUG_MSG] =
700 gtk_signal_new ("debug_msg",
701 GTK_RUN_LAST | GTK_RUN_ACTION,
703 GTK_SIGNAL_OFFSET (GtkWidgetClass, debug_msg),
704 gtk_marshal_NONE__STRING,
708 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
710 object_class->set_arg = gtk_widget_set_arg;
711 object_class->get_arg = gtk_widget_get_arg;
712 object_class->shutdown = gtk_widget_shutdown;
713 object_class->destroy = gtk_widget_real_destroy;
714 object_class->finalize = gtk_widget_finalize;
716 klass->activate_signal = 0;
717 klass->set_scroll_adjustments_signal = 0;
718 klass->show = gtk_widget_real_show;
719 klass->show_all = gtk_widget_show;
720 klass->hide = gtk_widget_real_hide;
721 klass->hide_all = gtk_widget_hide;
722 klass->map = gtk_widget_real_map;
723 klass->unmap = gtk_widget_real_unmap;
724 klass->realize = gtk_widget_real_realize;
725 klass->unrealize = gtk_widget_real_unrealize;
726 klass->draw = gtk_widget_real_draw;
727 klass->draw_focus = NULL;
728 klass->size_request = gtk_widget_real_size_request;
729 klass->size_allocate = gtk_widget_real_size_allocate;
730 klass->state_changed = NULL;
731 klass->parent_set = NULL;
732 klass->style_set = gtk_widget_style_set;
733 klass->add_accelerator = (void*) gtk_accel_group_handle_add;
734 klass->remove_accelerator = (void*) gtk_accel_group_handle_remove;
735 klass->grab_focus = gtk_widget_real_grab_focus;
737 klass->button_press_event = NULL;
738 klass->button_release_event = NULL;
739 klass->motion_notify_event = NULL;
740 klass->delete_event = NULL;
741 klass->destroy_event = NULL;
742 klass->expose_event = NULL;
743 klass->key_press_event = gtk_widget_real_key_press_event;
744 klass->key_release_event = gtk_widget_real_key_release_event;
745 klass->enter_notify_event = NULL;
746 klass->leave_notify_event = NULL;
747 klass->configure_event = NULL;
748 klass->focus_in_event = NULL;
749 klass->focus_out_event = NULL;
750 klass->map_event = NULL;
751 klass->unmap_event = NULL;
752 klass->property_notify_event = gtk_selection_property_notify;
753 klass->selection_clear_event = gtk_selection_clear;
754 klass->selection_request_event = gtk_selection_request;
755 klass->selection_notify_event = gtk_selection_notify;
756 klass->selection_received = NULL;
757 klass->proximity_in_event = NULL;
758 klass->proximity_out_event = NULL;
759 klass->drag_begin = NULL;
760 klass->drag_end = NULL;
761 klass->drag_data_delete = NULL;
762 klass->drag_leave = NULL;
763 klass->drag_motion = NULL;
764 klass->drag_drop = NULL;
765 klass->drag_data_received = NULL;
767 klass->no_expose_event = NULL;
769 klass->debug_msg = gtk_widget_debug_msg;
773 gtk_widget_set_arg (GtkObject *object,
779 widget = GTK_WIDGET (object);
786 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
789 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
792 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
795 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
798 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -2);
801 gtk_widget_set_usize (widget, -2, GTK_VALUE_INT (*arg));
804 if (GTK_VALUE_BOOL(*arg))
805 gtk_widget_show (widget);
807 gtk_widget_hide (widget);
810 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
812 case ARG_APP_PAINTABLE:
813 gtk_widget_set_app_paintable (widget, GTK_VALUE_BOOL (*arg));
816 saved_flags = GTK_WIDGET_FLAGS (widget);
817 if (GTK_VALUE_BOOL (*arg))
818 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
820 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
821 if (saved_flags != GTK_WIDGET_FLAGS (widget))
822 gtk_widget_queue_resize (widget);
825 if (GTK_VALUE_BOOL (*arg))
826 gtk_widget_grab_focus (widget);
828 case ARG_CAN_DEFAULT:
829 saved_flags = GTK_WIDGET_FLAGS (widget);
830 if (GTK_VALUE_BOOL (*arg))
831 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
833 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
834 if (saved_flags != GTK_WIDGET_FLAGS (widget))
835 gtk_widget_queue_resize (widget);
837 case ARG_HAS_DEFAULT:
838 if (GTK_VALUE_BOOL (*arg))
839 gtk_widget_grab_default (widget);
841 case ARG_COMPOSITE_CHILD:
842 if (GTK_VALUE_BOOL(*arg))
843 GTK_WIDGET_SET_FLAGS (widget, GTK_COMPOSITE_CHILD);
845 GTK_WIDGET_UNSET_FLAGS (widget, GTK_COMPOSITE_CHILD);
848 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
851 if (!GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_NO_WINDOW (widget))
852 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
854 case ARG_EXTENSION_EVENTS:
855 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
862 /*****************************************
863 * gtk_widget_get_arg:
868 *****************************************/
871 gtk_widget_get_arg (GtkObject *object,
877 widget = GTK_WIDGET (object);
881 GtkWidgetAuxInfo *aux_info;
883 GdkExtensionMode *modep;
887 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
889 GTK_VALUE_STRING (*arg) = g_strdup ("");
892 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
895 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
897 GTK_VALUE_INT (*arg) = -1;
899 GTK_VALUE_INT (*arg) = aux_info->x;
902 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
904 GTK_VALUE_INT (*arg) = -1;
906 GTK_VALUE_INT (*arg) = aux_info->y;
909 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
911 GTK_VALUE_INT (*arg) = -1;
913 GTK_VALUE_INT (*arg) = aux_info->width;
916 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
918 GTK_VALUE_INT (*arg) = -1;
920 GTK_VALUE_INT (*arg) = aux_info->height;
923 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_VISIBLE (widget) != FALSE);
926 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_SENSITIVE (widget) != FALSE);
928 case ARG_APP_PAINTABLE:
929 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_APP_PAINTABLE (widget) != FALSE);
932 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_FOCUS (widget) != FALSE);
935 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_FOCUS (widget) != FALSE);
937 case ARG_CAN_DEFAULT:
938 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_DEFAULT (widget) != FALSE);
940 case ARG_HAS_DEFAULT:
941 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
943 case ARG_COMPOSITE_CHILD:
944 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_COMPOSITE_CHILD (widget) != FALSE);
947 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
950 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
952 GTK_VALUE_FLAGS (*arg) = 0;
954 GTK_VALUE_FLAGS (*arg) = *eventp;
956 case ARG_EXTENSION_EVENTS:
957 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
959 GTK_VALUE_FLAGS (*arg) = 0;
961 GTK_VALUE_FLAGS (*arg) = *modep;
964 arg->type = GTK_TYPE_INVALID;
969 /*****************************************
975 *****************************************/
978 gtk_widget_init (GtkWidget *widget)
980 GdkColormap *colormap;
983 GTK_PRIVATE_FLAGS (widget) = 0;
984 widget->state = GTK_STATE_NORMAL;
985 widget->saved_state = GTK_STATE_NORMAL;
987 widget->requisition.width = 0;
988 widget->requisition.height = 0;
989 widget->allocation.x = -1;
990 widget->allocation.y = -1;
991 widget->allocation.width = 1;
992 widget->allocation.height = 1;
993 widget->window = NULL;
994 widget->parent = NULL;
996 GTK_WIDGET_SET_FLAGS (widget,
998 GTK_PARENT_SENSITIVE |
999 (composite_child_stack ? GTK_COMPOSITE_CHILD : 0));
1001 widget->style = gtk_widget_peek_style ();
1002 gtk_style_ref (widget->style);
1004 colormap = gtk_widget_peek_colormap ();
1005 visual = gtk_widget_peek_visual ();
1007 /* XXX - should we ref the colormap and visual, too? */
1009 if (colormap != gtk_widget_get_default_colormap ())
1011 /* gdk_colormap_ref (colormap); */
1012 gtk_object_set_data (GTK_OBJECT (widget), colormap_key, colormap);
1015 if (visual != gtk_widget_get_default_visual ())
1017 /* gdk_visual_ref (visual); */
1018 gtk_object_set_data (GTK_OBJECT (widget), visual_key, visual);
1022 /*****************************************
1028 *****************************************/
1031 gtk_widget_new (GtkType widget_type,
1032 const gchar *first_arg_name,
1037 GSList *arg_list = NULL;
1038 GSList *info_list = NULL;
1041 g_return_val_if_fail (gtk_type_is_a (widget_type, GTK_TYPE_WIDGET), NULL);
1043 object = gtk_type_new (widget_type);
1045 va_start (var_args, first_arg_name);
1046 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1055 g_warning ("gtk_widget_new(): %s", error);
1063 slist_arg = arg_list;
1064 slist_info = info_list;
1067 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1068 slist_arg = slist_arg->next;
1069 slist_info = slist_info->next;
1071 gtk_args_collect_cleanup (arg_list, info_list);
1074 if (!GTK_OBJECT_CONSTRUCTED (object))
1075 gtk_object_default_construct (object);
1077 return GTK_WIDGET (object);
1080 /*****************************************
1086 *****************************************/
1089 gtk_widget_newv (GtkType type,
1093 g_return_val_if_fail (gtk_type_is_a (type, GTK_TYPE_WIDGET), NULL);
1095 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1098 /*****************************************
1104 *****************************************/
1107 gtk_widget_get (GtkWidget *widget,
1110 g_return_if_fail (widget != NULL);
1111 g_return_if_fail (GTK_IS_WIDGET (widget));
1112 g_return_if_fail (arg != NULL);
1114 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1117 /*****************************************
1123 *****************************************/
1126 gtk_widget_getv (GtkWidget *widget,
1130 g_return_if_fail (widget != NULL);
1131 g_return_if_fail (GTK_IS_WIDGET (widget));
1133 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1136 /*****************************************
1142 *****************************************/
1145 gtk_widget_set (GtkWidget *widget,
1146 const gchar *first_arg_name,
1151 GSList *arg_list = NULL;
1152 GSList *info_list = NULL;
1155 g_return_if_fail (widget != NULL);
1156 g_return_if_fail (GTK_IS_WIDGET (widget));
1158 object = GTK_OBJECT (widget);
1160 va_start (var_args, first_arg_name);
1161 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1170 g_warning ("gtk_widget_set(): %s", error);
1178 slist_arg = arg_list;
1179 slist_info = info_list;
1182 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1183 slist_arg = slist_arg->next;
1184 slist_info = slist_info->next;
1186 gtk_args_collect_cleanup (arg_list, info_list);
1190 /*****************************************
1196 *****************************************/
1199 gtk_widget_setv (GtkWidget *widget,
1203 g_return_if_fail (widget != NULL);
1204 g_return_if_fail (GTK_IS_WIDGET (widget));
1206 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1210 gtk_widget_queue_clear_child (GtkWidget *widget)
1214 parent = widget->parent;
1215 if (parent && GTK_WIDGET_DRAWABLE (parent))
1216 gtk_widget_queue_clear_area (parent,
1217 widget->allocation.x,
1218 widget->allocation.y,
1219 widget->allocation.width,
1220 widget->allocation.height);
1224 gtk_widget_unparent (GtkWidget *widget)
1226 GtkWidget *toplevel;
1227 GtkWidget *old_parent;
1229 g_return_if_fail (widget != NULL);
1230 g_return_if_fail (GTK_IS_WIDGET (widget));
1231 if (widget->parent == NULL)
1234 /* keep this function in sync with gtk_menu_detach()
1237 /* unset focused and default children properly, this code
1238 * should eventually move into some gtk_window_unparent_branch() or
1242 toplevel = gtk_widget_get_toplevel (widget);
1243 if (GTK_CONTAINER (widget->parent)->focus_child == widget)
1245 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL);
1247 if (GTK_IS_WINDOW (toplevel))
1251 child = GTK_WINDOW (toplevel)->focus_widget;
1253 while (child && child != widget)
1254 child = child->parent;
1256 if (child == widget)
1257 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1260 if (GTK_IS_WINDOW (toplevel))
1264 child = GTK_WINDOW (toplevel)->default_widget;
1266 while (child && child != widget)
1267 child = child->parent;
1269 if (child == widget)
1270 gtk_window_set_default (GTK_WINDOW (toplevel), NULL);
1273 if (GTK_WIDGET_REDRAW_PENDING (widget))
1274 gtk_widget_redraw_queue_remove (widget);
1276 if (GTK_IS_RESIZE_CONTAINER (widget))
1277 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1279 /* Remove the widget and all its children from any ->resize_widgets list
1280 * of all the parents in our branch. This code should move into gtkcontainer.c
1281 * somwhen, since we mess around with ->resize_widgets, which is
1282 * actually not of our business.
1284 * Two ways to make this prettier:
1285 * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer))
1286 * Change resize_widgets to a GList
1288 toplevel = widget->parent;
1294 if (!GTK_CONTAINER (toplevel)->resize_widgets)
1296 toplevel = toplevel->parent;
1301 slist = GTK_CONTAINER (toplevel)->resize_widgets;
1313 while (parent && (parent != widget))
1314 parent = parent->parent;
1316 if (parent == widget)
1318 GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED);
1324 /* it is really messy to have this signal disconnection
1325 * in gtkwidget.c, the resize_widgets invariants should
1326 * all be taken care off by gtkcontainer.c exclusively.
1329 gtk_signal_disconnect_by_func (GTK_OBJECT (toplevel),
1330 GTK_SIGNAL_FUNC (gtk_container_clear_resize_widgets),
1332 GTK_CONTAINER (toplevel)->resize_widgets = slist;
1335 g_slist_free_1 (last);
1341 toplevel = toplevel->parent;
1344 gtk_widget_queue_clear_child (widget);
1346 /* Reset the width and height here, to force reallocation if we
1347 * get added back to a new parent. This won't work if our new
1348 * allocation is smaller than 1x1 and we actually want a size of 1x1...
1349 * (would 0x0 be OK here?)
1351 widget->allocation.width = 1;
1352 widget->allocation.height = 1;
1354 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1355 gtk_widget_unrealize (widget);
1357 old_parent = widget->parent;
1358 widget->parent = NULL;
1359 gtk_widget_set_parent_window (widget, NULL);
1360 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1362 gtk_widget_unref (widget);
1365 /*****************************************
1366 * gtk_widget_destroy:
1371 *****************************************/
1374 gtk_widget_destroy (GtkWidget *widget)
1376 g_return_if_fail (widget != NULL);
1377 g_return_if_fail (GTK_IS_WIDGET (widget));
1378 g_return_if_fail (GTK_OBJECT_CONSTRUCTED (widget));
1380 gtk_object_destroy ((GtkObject*) widget);
1383 /*****************************************
1384 * gtk_widget_destroyed:
1385 * Utility function: sets widget_pointer
1386 * to NULL when widget is destroyed.
1391 *****************************************/
1394 gtk_widget_destroyed (GtkWidget *widget,
1395 GtkWidget **widget_pointer)
1397 /* Don't make any assumptions about the
1399 * Even check widget_pointer.
1402 *widget_pointer = NULL;
1405 /*****************************************
1411 *****************************************/
1414 gtk_widget_show (GtkWidget *widget)
1416 g_return_if_fail (widget != NULL);
1417 g_return_if_fail (GTK_IS_WIDGET (widget));
1419 if (!GTK_WIDGET_VISIBLE (widget))
1421 gtk_widget_queue_resize (widget);
1422 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1427 gtk_widget_real_show (GtkWidget *widget)
1429 g_return_if_fail (widget != NULL);
1430 g_return_if_fail (GTK_IS_WIDGET (widget));
1432 if (!GTK_WIDGET_VISIBLE (widget))
1434 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
1436 if (widget->parent && GTK_WIDGET_MAPPED (widget->parent))
1437 gtk_widget_map (widget);
1441 /*************************************************************
1442 * gtk_widget_show_now:
1443 * Show a widget, and if it is an unmapped toplevel widget
1444 * wait for the map_event before returning
1446 * Warning: This routine will call the main loop recursively.
1451 *************************************************************/
1454 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
1457 gtk_signal_disconnect_by_data (GTK_OBJECT (widget), flag);
1461 gtk_widget_show_now (GtkWidget *widget)
1465 g_return_if_fail (widget != NULL);
1466 g_return_if_fail (GTK_IS_WIDGET (widget));
1468 /* make sure we will get event */
1469 if (!GTK_WIDGET_MAPPED (widget) &&
1470 GTK_WIDGET_TOPLEVEL (widget))
1472 gtk_widget_show (widget);
1474 gtk_signal_connect (GTK_OBJECT (widget), "map_event",
1475 GTK_SIGNAL_FUNC (gtk_widget_show_map_callback),
1479 gtk_main_iteration();
1482 gtk_widget_show (widget);
1485 /*****************************************
1491 *****************************************/
1494 gtk_widget_hide (GtkWidget *widget)
1496 g_return_if_fail (widget != NULL);
1497 g_return_if_fail (GTK_IS_WIDGET (widget));
1499 if (GTK_WIDGET_VISIBLE (widget))
1501 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1502 gtk_widget_queue_resize (widget);
1507 gtk_widget_real_hide (GtkWidget *widget)
1509 g_return_if_fail (widget != NULL);
1510 g_return_if_fail (GTK_IS_WIDGET (widget));
1512 if (GTK_WIDGET_VISIBLE (widget))
1514 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
1516 if (GTK_WIDGET_MAPPED (widget))
1517 gtk_widget_unmap (widget);
1522 gtk_widget_hide_on_delete (GtkWidget *widget)
1524 g_return_val_if_fail (widget != NULL, FALSE);
1525 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
1527 gtk_widget_hide (widget);
1533 gtk_widget_show_all (GtkWidget *widget)
1535 GtkWidgetClass *class;
1537 g_return_if_fail (widget != NULL);
1538 g_return_if_fail (GTK_IS_WIDGET (widget));
1540 class = GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass);
1542 if (class->show_all)
1543 class->show_all (widget);
1547 gtk_widget_hide_all (GtkWidget *widget)
1549 GtkWidgetClass *class;
1551 g_return_if_fail (widget != NULL);
1552 g_return_if_fail (GTK_IS_WIDGET (widget));
1554 class = GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass);
1556 if (class->hide_all)
1557 class->hide_all (widget);
1560 /*****************************************
1566 *****************************************/
1569 gtk_widget_map (GtkWidget *widget)
1571 g_return_if_fail (widget != NULL);
1572 g_return_if_fail (GTK_IS_WIDGET (widget));
1574 if (!GTK_WIDGET_MAPPED (widget))
1576 if (!GTK_WIDGET_REALIZED (widget))
1577 gtk_widget_realize (widget);
1579 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1581 if (GTK_WIDGET_NO_WINDOW (widget))
1582 gtk_widget_queue_draw (widget);
1586 /*****************************************
1592 *****************************************/
1595 gtk_widget_unmap (GtkWidget *widget)
1597 g_return_if_fail (widget != NULL);
1598 g_return_if_fail (GTK_IS_WIDGET (widget));
1600 if (GTK_WIDGET_MAPPED (widget))
1602 if (GTK_WIDGET_NO_WINDOW (widget))
1603 gtk_widget_queue_clear_child (widget);
1604 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1608 /*****************************************
1609 * gtk_widget_realize:
1614 *****************************************/
1617 gtk_widget_realize (GtkWidget *widget)
1620 GdkExtensionMode mode;
1621 GtkWidgetShapeInfo *shape_info;
1623 g_return_if_fail (widget != NULL);
1624 g_return_if_fail (GTK_IS_WIDGET (widget));
1626 if (!GTK_WIDGET_REALIZED (widget))
1629 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1630 g_message ("gtk_widget_realize(%s)", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1633 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1634 gtk_widget_realize (widget->parent);
1636 gtk_widget_ensure_style (widget);
1638 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1640 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1642 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1644 gdk_window_shape_combine_mask (widget->window,
1645 shape_info->shape_mask,
1646 shape_info->offset_x,
1647 shape_info->offset_y);
1650 if (!GTK_WIDGET_NO_WINDOW (widget))
1652 mode = gtk_widget_get_extension_events (widget);
1653 if (mode != GDK_EXTENSION_EVENTS_NONE)
1655 events = gtk_widget_get_events (widget);
1656 gdk_input_set_extension_events (widget->window, events, mode);
1663 /*****************************************
1664 * gtk_widget_unrealize:
1669 *****************************************/
1672 gtk_widget_unrealize (GtkWidget *widget)
1674 g_return_if_fail (widget != NULL);
1675 g_return_if_fail (GTK_IS_WIDGET (widget));
1677 if (GTK_WIDGET_REDRAW_PENDING (widget))
1678 gtk_widget_redraw_queue_remove (widget);
1680 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1681 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
1683 if (GTK_WIDGET_REALIZED (widget))
1685 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1686 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
1690 /*****************************************
1691 * gtk_widget_queue_draw:
1696 *****************************************/
1698 typedef struct _GtkDrawData GtkDrawData;
1699 struct _GtkDrawData {
1704 static GMemChunk *draw_data_mem_chunk = NULL;
1705 static GSList *draw_data_free_list = NULL;
1706 static const gchar *draw_data_key = "gtk-draw-data";
1707 static GQuark draw_data_key_id = 0;
1708 static const gchar *draw_data_tmp_key = "gtk-draw-data-tmp";
1709 static GQuark draw_data_tmp_key_id = 0;
1711 static gint gtk_widget_idle_draw (gpointer data);
1714 gtk_widget_queue_draw_data (GtkWidget *widget,
1724 g_return_if_fail (widget != NULL);
1726 if ((width != 0) && (height != 0) && GTK_WIDGET_DRAWABLE (widget))
1728 if (!draw_data_key_id)
1729 draw_data_key_id = g_quark_from_static_string (draw_data_key);
1731 if (draw_data_free_list)
1733 node = draw_data_free_list;
1735 draw_data_free_list = draw_data_free_list->next;
1739 if (!draw_data_mem_chunk)
1740 draw_data_mem_chunk = g_mem_chunk_create (GtkDrawData, 64,
1742 data = g_chunk_new (GtkDrawData, draw_data_mem_chunk);
1743 node = g_slist_alloc();
1750 if ((width < 0) || (height < 0))
1752 data->rect.width = 0;
1753 data->rect.height = 0;
1757 data->rect.width = width;
1758 data->rect.height = height;
1760 data->window = window;
1762 if ((width < 0) || (height < 0))
1764 GSList *draw_data_list =
1765 gtk_object_get_data_by_id (GTK_OBJECT (widget),
1768 draw_data_free_list = g_slist_concat (draw_data_list,
1769 draw_data_free_list);
1773 node->next = gtk_object_get_data_by_id (GTK_OBJECT (widget),
1776 if (!GTK_WIDGET_REDRAW_PENDING (widget))
1778 GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_PENDING);
1779 if (gtk_widget_redraw_queue == NULL)
1780 gtk_idle_add_priority (GTK_PRIORITY_REDRAW,
1781 gtk_widget_idle_draw,
1783 gtk_widget_redraw_queue = g_slist_prepend (gtk_widget_redraw_queue, widget);
1786 gtk_object_set_data_by_id (GTK_OBJECT (widget), draw_data_key_id, node);
1791 gtk_widget_queue_draw_area (GtkWidget *widget,
1797 g_return_if_fail (widget != NULL);
1798 g_return_if_fail (GTK_IS_WIDGET (widget));
1800 gtk_widget_queue_draw_data (widget, x, y, width, height, NULL);
1804 gtk_widget_queue_draw (GtkWidget *widget)
1806 g_return_if_fail (widget != NULL);
1807 g_return_if_fail (GTK_IS_WIDGET (widget));
1809 gtk_widget_queue_draw_data (widget, 0, 0, -1, -1, NULL);
1813 gtk_widget_queue_clear_area (GtkWidget *widget,
1821 g_return_if_fail (widget != NULL);
1822 g_return_if_fail (GTK_IS_WIDGET (widget));
1824 /* Find the correct widget */
1826 if (GTK_WIDGET_NO_WINDOW (widget))
1829 while (parent && GTK_WIDGET_NO_WINDOW (parent))
1830 parent = parent->parent;
1833 gtk_widget_queue_draw_data (parent, x, y, width, height, widget->window);
1837 gint wx, wy, wwidth, wheight;
1838 /* Translate widget relative to window-relative */
1840 gdk_window_get_position (widget->window, &wx, &wy);
1841 x -= wx - widget->allocation.x;
1842 y -= wy - widget->allocation.y;
1844 gdk_window_get_size (widget->window, &wwidth, &wheight);
1854 if (x + width > wwidth)
1856 if (y + height > wheight)
1857 height = wheight - y;
1859 gtk_widget_queue_draw_data (widget, x, y, width, height, NULL);
1864 gtk_widget_redraw_queue_remove (GtkWidget *widget)
1866 GSList *draw_data_list;
1869 g_return_if_fail (GTK_WIDGET_REDRAW_PENDING (widget));
1871 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1873 draw_data_list = gtk_object_get_data_by_id (GTK_OBJECT (widget),
1875 tmp_list = g_slist_last (draw_data_list);
1878 tmp_list->next = draw_data_free_list;
1879 draw_data_free_list = draw_data_list;
1882 gtk_object_set_data_by_id (GTK_OBJECT (widget),
1886 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1890 gtk_widget_queue_clear (GtkWidget *widget)
1892 g_return_if_fail (widget != NULL);
1893 g_return_if_fail (GTK_IS_WIDGET (widget));
1895 if (widget->allocation.width || widget->allocation.height)
1897 if (GTK_WIDGET_NO_WINDOW (widget))
1898 gtk_widget_queue_clear_area (widget, widget->allocation.x,
1899 widget->allocation.y,
1900 widget->allocation.width,
1901 widget->allocation.height);
1903 gtk_widget_queue_clear_area (widget, 0, 0,
1904 widget->allocation.width,
1905 widget->allocation.height);
1910 gtk_widget_draw_data_combine (GtkDrawData *parent, GtkDrawData *child)
1912 gint parent_x2, parent_y2;
1913 gint child_x2, child_y2;
1915 /* Check for intersection */
1917 parent_x2 = parent->rect.x + parent->rect.width;
1918 child_x2 = child->rect.x + child->rect.width;
1919 parent_y2 = parent->rect.y + parent->rect.height;
1920 child_y2 = child->rect.y + child->rect.height;
1922 if ((child->rect.x > parent_x2) || (parent->rect.x > child_x2) ||
1923 (child->rect.y > parent_y2) || (parent->rect.y > child_y2))
1927 parent->rect.x = MIN (parent->rect.x, child->rect.x);
1928 parent->rect.y = MIN (parent->rect.y, child->rect.y);
1929 parent->rect.width = MAX (parent_x2, child_x2) - parent->rect.x;
1930 parent->rect.height = MAX (parent_y2, child_y2) - parent->rect.y;
1936 /* Take a rectangle with respect to window, and translate it
1937 * to coordinates relative to widget's allocation, clipping through
1938 * intermediate windows. Returns whether translation failed. If the
1939 * translation failed, we have something like a handlebox, where
1940 * the child widget's GdkWindow is not a child of the parents GdkWindow.
1943 gtk_widget_clip_rect (GtkWidget *widget,
1949 gint x,y, width, height;
1951 while (window && (window != widget->window))
1953 gdk_window_get_position (window, &x, &y);
1961 window = gdk_window_get_parent (window);
1965 gdk_window_get_size (window, &width, &height);
1969 rect->width += rect->x;
1974 rect->height += rect->y;
1977 if (rect->x + rect->width > width)
1978 rect->width = width - rect->x;
1979 if (rect->y + rect->height > height)
1980 rect->height = height - rect->y;
1986 if (!GTK_WIDGET_NO_WINDOW (widget))
1988 if (gdk_window_get_toplevel (window) != window)
1990 gdk_window_get_position (window, &x, &y);
1991 rect->x += x - widget->allocation.x;
1993 *x_offset += x - widget->allocation.x;
1994 rect->y += y - widget->allocation.y;
1996 *y_offset += y - widget->allocation.y;
2004 gtk_widget_idle_draw (gpointer data)
2006 GSList *widget_list;
2008 GSList *draw_data_list;
2011 if (!draw_data_tmp_key_id)
2012 draw_data_tmp_key_id = g_quark_from_static_string (draw_data_tmp_key);
2014 GDK_THREADS_ENTER ();
2016 old_queue = gtk_widget_redraw_queue;
2017 gtk_widget_redraw_queue = NULL;
2019 /* Translate all draw requests to be allocation-relative.
2020 * At the same time, move all the data out of the way,
2021 * so when we get down to the draw step, we can queue
2022 * more information for "next time", if the application
2023 * is that foolhardy.
2025 widget_list = old_queue;
2029 widget = widget_list->data;
2030 draw_data_list = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2032 gtk_object_set_data_by_id (GTK_OBJECT (widget),
2035 gtk_object_set_data_by_id (GTK_OBJECT (widget),
2036 draw_data_tmp_key_id,
2039 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
2041 while (draw_data_list)
2043 gboolean full_allocation = FALSE;
2044 GtkDrawData *data = draw_data_list->data;
2048 /* If the translation fails, we have a handlebox,
2049 * so redraw the whole widget. Could be done better?
2051 full_allocation = !gtk_widget_clip_rect (widget,
2055 data->window = NULL;
2059 if ((data->rect.width == 0) && (data->rect.height == 0))
2061 if (GTK_WIDGET_NO_WINDOW (widget))
2063 data->rect.x = widget->allocation.x;
2064 data->rect.y = widget->allocation.y;
2071 data->rect.width = widget->allocation.width;
2072 data->rect.height = widget->allocation.height;
2076 draw_data_list = draw_data_list->next;
2079 widget_list = widget_list->next;
2082 /* Coalesce redraws.
2084 widget_list = old_queue;
2087 GSList *prev_node = NULL;
2088 widget = widget_list->data;
2089 draw_data_list = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2090 draw_data_tmp_key_id);
2092 while (draw_data_list)
2094 gint x_offset, y_offset;
2095 GtkDrawData *data = draw_data_list->data;
2096 GSList *parent_list = draw_data_list->next;
2108 if (gtk_widget_draw_data_combine (parent_list->data, data))
2112 prev_node->next = draw_data_list->next;
2114 gtk_object_set_data_by_id (GTK_OBJECT (widget),
2115 draw_data_tmp_key_id,
2116 draw_data_list->next);
2118 tmp = draw_data_list->next;
2119 draw_data_list->next = draw_data_free_list;
2120 draw_data_free_list = draw_data_list;
2121 draw_data_list = tmp;
2126 parent_list = parent_list->next;
2129 window = parent->window;
2131 if (parent->parent && parent->parent->window != window)
2133 if (!GTK_WIDGET_NO_WINDOW (parent))
2136 gdk_window_get_position (window, &x, &y);
2137 data->rect.x -= x - parent->allocation.x;
2138 x_offset -= x - parent->allocation.x;
2139 data->rect.y -= y - parent->allocation.y;
2140 y_offset -= y - parent->allocation.y;
2142 /* If we can't translate the rectangle, stop trying to
2143 * merge. (This occurs for a handlebox)
2145 if (!gtk_widget_clip_rect (parent->parent, window, &data->rect,
2146 &x_offset, &y_offset))
2151 parent = parent->parent;
2153 if (parent && GTK_WIDGET_REDRAW_PENDING (parent))
2154 parent_list = gtk_object_get_data_by_id (GTK_OBJECT (parent),
2155 draw_data_tmp_key_id);
2160 /* OK, this rectangle stays around. But take advantage
2161 * of the work we've done to clip it to the visible area -
2162 * rect.width/height have already been appropriately
2165 data->rect.x -= x_offset;
2166 data->rect.y -= y_offset;
2169 prev_node = draw_data_list;
2171 draw_data_list = draw_data_list->next;
2175 widget_list = widget_list->next;
2178 /* Process the draws */
2180 widget_list = old_queue;
2184 widget = widget_list->data;
2185 draw_data_list = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2186 draw_data_tmp_key_id);
2187 gtk_object_set_data_by_id (GTK_OBJECT (widget),
2188 draw_data_tmp_key_id,
2191 while (draw_data_list)
2193 GtkDrawData *data = draw_data_list->data;
2194 gtk_widget_draw (widget, &data->rect);
2196 if (draw_data_list->next)
2197 draw_data_list = draw_data_list->next;
2200 draw_data_list->next = draw_data_free_list;
2201 draw_data_free_list = draw_data_list;
2206 widget_list = widget_list->next;
2209 g_slist_free (old_queue);
2211 GDK_THREADS_LEAVE ();
2217 gtk_widget_queue_resize (GtkWidget *widget)
2219 g_return_if_fail (widget != NULL);
2220 g_return_if_fail (GTK_IS_WIDGET (widget));
2222 if (GTK_IS_RESIZE_CONTAINER (widget))
2223 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
2225 if (GTK_WIDGET_DRAWABLE (widget))
2226 gtk_widget_queue_clear (widget);
2229 gtk_container_queue_resize (GTK_CONTAINER (widget->parent));
2230 else if (GTK_WIDGET_TOPLEVEL (widget))
2231 gtk_container_queue_resize (GTK_CONTAINER (widget));
2234 /*****************************************
2240 *****************************************/
2243 gtk_widget_draw (GtkWidget *widget,
2246 GdkRectangle temp_area;
2248 g_return_if_fail (widget != NULL);
2249 g_return_if_fail (GTK_IS_WIDGET (widget));
2251 if (GTK_WIDGET_DRAWABLE (widget))
2255 if (GTK_WIDGET_NO_WINDOW (widget))
2257 temp_area.x = widget->allocation.x;
2258 temp_area.y = widget->allocation.y;
2266 temp_area.width = widget->allocation.width;
2267 temp_area.height = widget->allocation.height;
2271 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
2275 /*****************************************
2276 * gtk_widget_draw_focus:
2281 *****************************************/
2284 gtk_widget_draw_focus (GtkWidget *widget)
2286 g_return_if_fail (widget != NULL);
2287 g_return_if_fail (GTK_IS_WIDGET (widget));
2289 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
2292 /*****************************************
2293 * gtk_widget_draw_default:
2298 *****************************************/
2301 gtk_widget_draw_default (GtkWidget *widget)
2303 g_return_if_fail (widget != NULL);
2304 g_return_if_fail (GTK_IS_WIDGET (widget));
2306 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
2309 /*****************************************
2310 * gtk_widget_size_request:
2315 *****************************************/
2318 gtk_widget_size_request (GtkWidget *widget,
2319 GtkRequisition *requisition)
2321 GtkWidgetAuxInfo *aux_info;
2323 g_return_if_fail (widget != NULL);
2324 g_return_if_fail (GTK_IS_WIDGET (widget));
2326 gtk_widget_ref (widget);
2327 gtk_widget_ensure_style (widget);
2328 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
2330 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2333 if (aux_info->width > 0)
2334 requisition->width = aux_info->width;
2335 if (aux_info->height > 0)
2336 requisition->height = aux_info->height;
2338 gtk_widget_unref (widget);
2341 /*****************************************
2342 * gtk_widget_size_allocate:
2347 *****************************************/
2350 gtk_widget_size_allocate (GtkWidget *widget,
2351 GtkAllocation *allocation)
2353 GtkWidgetAuxInfo *aux_info;
2354 GtkAllocation real_allocation;
2355 gboolean needs_draw = FALSE;
2357 g_return_if_fail (widget != NULL);
2358 g_return_if_fail (GTK_IS_WIDGET (widget));
2360 real_allocation = *allocation;
2361 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2365 if (aux_info->x != -1)
2366 real_allocation.x = aux_info->x;
2367 if (aux_info->y != -1)
2368 real_allocation.y = aux_info->y;
2371 if (GTK_WIDGET_NO_WINDOW (widget))
2373 if (widget->allocation.x != real_allocation.x ||
2374 widget->allocation.y != real_allocation.y ||
2375 widget->allocation.width != real_allocation.width ||
2376 widget->allocation.height != real_allocation.height)
2378 gtk_widget_queue_clear_child (widget);
2382 else if (widget->allocation.width != real_allocation.width ||
2383 widget->allocation.height != real_allocation.height)
2388 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
2391 gtk_widget_queue_draw (widget);
2395 gtk_widget_real_size_allocate (GtkWidget *widget,
2396 GtkAllocation *allocation)
2398 g_return_if_fail (widget != NULL);
2399 g_return_if_fail (GTK_IS_WIDGET (widget));
2401 widget->allocation = *allocation;
2403 if (GTK_WIDGET_REALIZED (widget) &&
2404 !GTK_WIDGET_NO_WINDOW (widget))
2406 gdk_window_move_resize (widget->window,
2407 allocation->x, allocation->y,
2408 allocation->width, allocation->height);
2413 gtk_widget_stop_add_accelerator (GtkWidget *widget)
2415 g_return_if_fail (widget != NULL);
2416 g_return_if_fail (GTK_IS_WIDGET (widget));
2418 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
2422 gtk_widget_stop_remove_accelerator (GtkWidget *widget)
2424 g_return_if_fail (widget != NULL);
2425 g_return_if_fail (GTK_IS_WIDGET (widget));
2427 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR]);
2431 gtk_widget_lock_accelerators (GtkWidget *widget)
2433 g_return_if_fail (widget != NULL);
2434 g_return_if_fail (GTK_IS_WIDGET (widget));
2436 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
2437 widget_signals[ADD_ACCELERATOR],
2439 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2442 gtk_signal_connect (GTK_OBJECT (widget),
2444 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2446 gtk_signal_connect (GTK_OBJECT (widget),
2447 "remove_accelerator",
2448 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
2454 gtk_widget_unlock_accelerators (GtkWidget *widget)
2456 g_return_if_fail (widget != NULL);
2457 g_return_if_fail (GTK_IS_WIDGET (widget));
2459 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
2460 widget_signals[ADD_ACCELERATOR],
2462 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2465 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
2466 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2468 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
2469 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
2475 gtk_widget_thaw_accelerators (GtkWidget *widget)
2477 g_message ("gtk_widget_thaw_accelerators() is deprecated");
2479 gtk_widget_unlock_accelerators (widget);
2483 gtk_widget_freeze_accelerators (GtkWidget *widget)
2485 g_message ("gtk_widget_freeze_accelerators() is deprecated");
2487 gtk_widget_lock_accelerators (widget);
2491 gtk_widget_add_accelerator (GtkWidget *widget,
2492 const gchar *accel_signal,
2493 GtkAccelGroup *accel_group,
2496 GtkAccelFlags accel_flags)
2498 g_return_if_fail (widget != NULL);
2499 g_return_if_fail (GTK_IS_WIDGET (widget));
2500 g_return_if_fail (accel_group != NULL);
2502 gtk_accel_group_add (accel_group,
2506 (GtkObject*) widget,
2511 gtk_widget_remove_accelerator (GtkWidget *widget,
2512 GtkAccelGroup *accel_group,
2516 g_return_if_fail (widget != NULL);
2517 g_return_if_fail (GTK_IS_WIDGET (widget));
2518 g_return_if_fail (accel_group != NULL);
2520 gtk_accel_group_remove (accel_group,
2523 (GtkObject*) widget);
2527 gtk_widget_remove_accelerators (GtkWidget *widget,
2528 const gchar *accel_signal,
2529 gboolean visible_only)
2534 g_return_if_fail (widget != NULL);
2535 g_return_if_fail (GTK_IS_WIDGET (widget));
2536 g_return_if_fail (accel_signal != NULL);
2538 signal_id = gtk_signal_lookup (accel_signal, GTK_OBJECT_TYPE (widget));
2539 g_return_if_fail (signal_id != 0);
2541 slist = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
2544 GtkAccelEntry *ac_entry;
2546 ac_entry = slist->data;
2547 slist = slist->next;
2548 if (ac_entry->accel_flags & GTK_ACCEL_VISIBLE &&
2549 ac_entry->signal_id == signal_id)
2550 gtk_widget_remove_accelerator (GTK_WIDGET (widget),
2551 ac_entry->accel_group,
2552 ac_entry->accelerator_key,
2553 ac_entry->accelerator_mods);
2558 gtk_widget_accelerator_signal (GtkWidget *widget,
2559 GtkAccelGroup *accel_group,
2563 GtkAccelEntry *ac_entry;
2565 g_return_val_if_fail (widget != NULL, 0);
2566 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
2567 g_return_val_if_fail (accel_group != NULL, 0);
2569 ac_entry = gtk_accel_group_get_entry (accel_group, accel_key, accel_mods);
2571 if (ac_entry && ac_entry->object == (GtkObject*) widget)
2572 return ac_entry->signal_id;
2577 gtk_widget_real_key_press_event (GtkWidget *widget,
2580 gboolean handled = FALSE;
2582 g_return_val_if_fail (widget != NULL, handled);
2583 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
2584 g_return_val_if_fail (event != NULL, handled);
2587 handled = gtk_bindings_activate (GTK_OBJECT (widget),
2595 gtk_widget_real_key_release_event (GtkWidget *widget,
2598 gboolean handled = FALSE;
2600 g_return_val_if_fail (widget != NULL, handled);
2601 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
2602 g_return_val_if_fail (event != NULL, handled);
2605 handled = gtk_bindings_activate (GTK_OBJECT (widget),
2607 event->state | GDK_RELEASE_MASK);
2612 /*****************************************
2618 *****************************************/
2621 gtk_widget_event (GtkWidget *widget,
2627 g_return_val_if_fail (widget != NULL, TRUE);
2628 g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
2630 gtk_widget_ref (widget);
2632 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
2634 if (return_val || GTK_OBJECT_DESTROYED (widget))
2636 gtk_widget_unref (widget);
2640 switch (event->type)
2645 case GDK_BUTTON_PRESS:
2646 case GDK_2BUTTON_PRESS:
2647 case GDK_3BUTTON_PRESS:
2648 signal_num = BUTTON_PRESS_EVENT;
2650 case GDK_BUTTON_RELEASE:
2651 signal_num = BUTTON_RELEASE_EVENT;
2653 case GDK_MOTION_NOTIFY:
2654 signal_num = MOTION_NOTIFY_EVENT;
2657 signal_num = DELETE_EVENT;
2660 signal_num = DESTROY_EVENT;
2663 signal_num = KEY_PRESS_EVENT;
2665 case GDK_KEY_RELEASE:
2666 signal_num = KEY_RELEASE_EVENT;
2668 case GDK_ENTER_NOTIFY:
2669 signal_num = ENTER_NOTIFY_EVENT;
2671 case GDK_LEAVE_NOTIFY:
2672 signal_num = LEAVE_NOTIFY_EVENT;
2674 case GDK_FOCUS_CHANGE:
2675 if (event->focus_change.in)
2676 signal_num = FOCUS_IN_EVENT;
2678 signal_num = FOCUS_OUT_EVENT;
2681 signal_num = CONFIGURE_EVENT;
2684 signal_num = MAP_EVENT;
2687 signal_num = UNMAP_EVENT;
2689 case GDK_PROPERTY_NOTIFY:
2690 signal_num = PROPERTY_NOTIFY_EVENT;
2692 case GDK_SELECTION_CLEAR:
2693 signal_num = SELECTION_CLEAR_EVENT;
2695 case GDK_SELECTION_REQUEST:
2696 signal_num = SELECTION_REQUEST_EVENT;
2698 case GDK_SELECTION_NOTIFY:
2699 signal_num = SELECTION_NOTIFY_EVENT;
2701 case GDK_PROXIMITY_IN:
2702 signal_num = PROXIMITY_IN_EVENT;
2704 case GDK_PROXIMITY_OUT:
2705 signal_num = PROXIMITY_OUT_EVENT;
2708 signal_num = NO_EXPOSE_EVENT;
2710 case GDK_CLIENT_EVENT:
2711 signal_num = CLIENT_EVENT;
2714 /* there is no sense in providing a widget with bogus expose events.
2715 * Widgets that are going to be resized don't need to be
2716 * exposed, since they will be redrawn anyways.
2718 if (!event->any.window ||
2719 GTK_WIDGET_RESIZE_NEEDED (widget) ||
2720 (widget->parent && GTK_WIDGET_RESIZE_NEEDED (widget->parent)))
2722 gtk_widget_unref (widget);
2725 signal_num = EXPOSE_EVENT;
2727 case GDK_VISIBILITY_NOTIFY:
2728 signal_num = VISIBILITY_NOTIFY_EVENT;
2731 g_warning ("could not determine signal number for event: %d", event->type);
2732 gtk_widget_unref (widget);
2736 if (signal_num != -1)
2737 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
2739 return_val |= GTK_OBJECT_DESTROYED (widget);
2741 gtk_widget_unref (widget);
2746 /*****************************************
2747 * gtk_widget_activate:
2752 *****************************************/
2755 gtk_widget_activate (GtkWidget *widget)
2757 g_return_val_if_fail (widget != NULL, FALSE);
2758 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2760 if (WIDGET_CLASS (widget)->activate_signal)
2762 /* FIXME: we should eventually check the signals signature here */
2763 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
2772 gtk_widget_set_scroll_adjustments (GtkWidget *widget,
2773 GtkAdjustment *hadjustment,
2774 GtkAdjustment *vadjustment)
2776 g_return_val_if_fail (widget != NULL, FALSE);
2777 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2779 g_return_val_if_fail (GTK_IS_ADJUSTMENT (hadjustment), FALSE);
2781 g_return_val_if_fail (GTK_IS_ADJUSTMENT (vadjustment), FALSE);
2783 if (WIDGET_CLASS (widget)->set_scroll_adjustments_signal)
2785 /* FIXME: we should eventually check the signals signature here */
2786 gtk_signal_emit (GTK_OBJECT (widget),
2787 WIDGET_CLASS (widget)->set_scroll_adjustments_signal,
2788 hadjustment, vadjustment);
2795 /*****************************************
2796 * gtk_widget_reparent_container_child:
2797 * assistent function to gtk_widget_reparent
2802 *****************************************/
2805 gtk_widget_reparent_container_child (GtkWidget *widget,
2806 gpointer client_data)
2808 g_return_if_fail (widget != NULL);
2809 g_return_if_fail (GTK_IS_WIDGET (widget));
2810 g_return_if_fail (client_data != NULL);
2812 if (GTK_WIDGET_NO_WINDOW (widget))
2815 gdk_window_unref (widget->window);
2816 widget->window = (GdkWindow*) client_data;
2818 gdk_window_ref (widget->window);
2820 if (GTK_IS_CONTAINER (widget))
2821 gtk_container_forall (GTK_CONTAINER (widget),
2822 gtk_widget_reparent_container_child,
2826 gdk_window_reparent (widget->window,
2827 (GdkWindow*) client_data, 0, 0);
2830 /*****************************************
2831 * gtk_widget_reparent:
2836 *****************************************/
2839 gtk_widget_reparent (GtkWidget *widget,
2840 GtkWidget *new_parent)
2842 g_return_if_fail (widget != NULL);
2843 g_return_if_fail (GTK_IS_WIDGET (widget));
2844 g_return_if_fail (new_parent != NULL);
2845 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
2846 g_return_if_fail (widget->parent != NULL);
2848 if (widget->parent != new_parent)
2850 /* First try to see if we can get away without unrealizing
2851 * the widget as we reparent it. if so we set a flag so
2852 * that gtk_widget_unparent doesn't unrealize widget
2854 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
2855 GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
2857 gtk_widget_ref (widget);
2858 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
2859 gtk_container_add (GTK_CONTAINER (new_parent), widget);
2860 gtk_widget_unref (widget);
2862 if (GTK_WIDGET_IN_REPARENT (widget))
2864 GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
2866 /* OK, now fix up the widget's window. (And that for any
2867 * children, if the widget is NO_WINDOW and a container)
2869 if (GTK_WIDGET_NO_WINDOW (widget))
2871 if (GTK_IS_CONTAINER (widget))
2872 gtk_container_forall (GTK_CONTAINER (widget),
2873 gtk_widget_reparent_container_child,
2874 gtk_widget_get_parent_window (widget));
2877 GdkWindow *parent_window;
2879 parent_window = gtk_widget_get_parent_window (widget);
2880 if (parent_window != widget->window)
2883 gdk_window_unref (widget->window);
2884 widget->window = parent_window;
2886 gdk_window_ref (widget->window);
2891 gdk_window_reparent (widget->window, gtk_widget_get_parent_window (widget), 0, 0);
2896 /*****************************************
2902 *****************************************/
2905 gtk_widget_popup (GtkWidget *widget,
2909 g_return_if_fail (widget != NULL);
2910 g_return_if_fail (GTK_IS_WIDGET (widget));
2912 if (!GTK_WIDGET_VISIBLE (widget))
2914 if (!GTK_WIDGET_REALIZED (widget))
2915 gtk_widget_realize (widget);
2916 if (!GTK_WIDGET_NO_WINDOW (widget))
2917 gdk_window_move (widget->window, x, y);
2918 gtk_widget_show (widget);
2922 /*****************************************
2923 * gtk_widget_intersect:
2928 *****************************************/
2931 gtk_widget_intersect (GtkWidget *widget,
2933 GdkRectangle *intersection)
2939 g_return_val_if_fail (widget != NULL, FALSE);
2940 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2941 g_return_val_if_fail (area != NULL, FALSE);
2944 dest = intersection;
2948 return_val = gdk_rectangle_intersect ((GdkRectangle*) &widget->allocation, area, dest);
2950 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2952 intersection->x -= widget->allocation.x;
2953 intersection->y -= widget->allocation.y;
2959 /*****************************************
2960 * gtk_widget_grab_focus:
2965 *****************************************/
2968 gtk_widget_grab_focus (GtkWidget *widget)
2970 g_return_if_fail (widget != NULL);
2971 g_return_if_fail (GTK_IS_WIDGET (widget));
2973 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[GRAB_FOCUS]);
2977 reset_focus_recurse (GtkWidget *widget,
2980 if (GTK_IS_CONTAINER (widget))
2982 GtkContainer *container;
2984 container = GTK_CONTAINER (widget);
2985 gtk_container_set_focus_child (container, NULL);
2987 gtk_container_foreach (container,
2988 reset_focus_recurse,
2994 gtk_widget_real_grab_focus (GtkWidget *focus_widget)
2996 g_return_if_fail (focus_widget != NULL);
2997 g_return_if_fail (GTK_IS_WIDGET (focus_widget));
2999 if (GTK_WIDGET_CAN_FOCUS (focus_widget))
3001 GtkWidget *toplevel;
3004 /* clear the current focus setting, break if the current widget
3005 * is the focus widget's parent, since containers above that will
3006 * be set by the next loop.
3008 toplevel = gtk_widget_get_toplevel (focus_widget);
3009 if (GTK_IS_WINDOW (toplevel))
3011 widget = GTK_WINDOW (toplevel)->focus_widget;
3013 if (widget == focus_widget)
3018 while (widget->parent && widget->parent != focus_widget->parent)
3020 widget = widget->parent;
3021 gtk_container_set_focus_child (GTK_CONTAINER (widget), NULL);
3025 else if (toplevel != focus_widget)
3027 /* gtk_widget_grab_focus() operates on a tree without window...
3028 * actually, this is very questionable behaviour.
3031 gtk_container_foreach (GTK_CONTAINER (toplevel),
3032 reset_focus_recurse,
3036 /* now propagate the new focus up the widget tree and finally
3037 * set it on the window
3039 widget = focus_widget;
3040 while (widget->parent)
3042 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), widget);
3043 widget = widget->parent;
3045 if (GTK_IS_WINDOW (widget))
3046 gtk_window_set_focus (GTK_WINDOW (widget), focus_widget);
3050 /*****************************************
3051 * gtk_widget_grab_default:
3056 *****************************************/
3059 gtk_widget_grab_default (GtkWidget *widget)
3062 GtkType window_type;
3064 g_return_if_fail (widget != NULL);
3065 g_return_if_fail (GTK_IS_WIDGET (widget));
3066 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
3068 window_type = gtk_window_get_type ();
3069 window = widget->parent;
3071 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
3072 window = window->parent;
3074 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
3075 gtk_window_set_default (GTK_WINDOW (window), widget);
3078 /*****************************************
3079 * gtk_widget_set_name:
3084 *****************************************/
3087 gtk_widget_set_name (GtkWidget *widget,
3090 g_return_if_fail (widget != NULL);
3091 g_return_if_fail (GTK_IS_WIDGET (widget));
3094 g_free (widget->name);
3095 widget->name = g_strdup (name);
3097 if (!GTK_WIDGET_USER_STYLE (widget))
3098 gtk_widget_set_rc_style (widget);
3101 /*****************************************
3102 * gtk_widget_get_name:
3107 *****************************************/
3110 gtk_widget_get_name (GtkWidget *widget)
3112 g_return_val_if_fail (widget != NULL, NULL);
3113 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3116 return widget->name;
3117 return gtk_type_name (GTK_WIDGET_TYPE (widget));
3120 /*****************************************
3121 * gtk_widget_set_state:
3128 *****************************************/
3131 gtk_widget_set_state (GtkWidget *widget,
3134 g_return_if_fail (widget != NULL);
3135 g_return_if_fail (GTK_IS_WIDGET (widget));
3137 if (state == GTK_WIDGET_STATE (widget))
3140 if (state == GTK_STATE_INSENSITIVE)
3141 gtk_widget_set_sensitive (widget, FALSE);
3147 data.state_restoration = FALSE;
3148 data.use_forall = FALSE;
3150 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
3152 data.parent_sensitive = TRUE;
3154 gtk_widget_propagate_state (widget, &data);
3156 if (GTK_WIDGET_DRAWABLE (widget))
3157 gtk_widget_queue_clear (widget);
3162 gtk_widget_set_app_paintable (GtkWidget *widget,
3163 gboolean app_paintable)
3165 g_return_if_fail (widget != NULL);
3166 g_return_if_fail (GTK_IS_WIDGET (widget));
3168 app_paintable = (app_paintable != FALSE);
3170 if (GTK_WIDGET_APP_PAINTABLE (widget) != app_paintable)
3173 GTK_WIDGET_SET_FLAGS (widget, GTK_APP_PAINTABLE);
3175 GTK_WIDGET_UNSET_FLAGS (widget, GTK_APP_PAINTABLE);
3177 if (GTK_WIDGET_DRAWABLE (widget))
3178 gtk_widget_queue_clear (widget);
3182 /*****************************************
3183 * gtk_widget_set_sensitive:
3187 * boolean value for sensitivity
3190 *****************************************/
3193 gtk_widget_set_sensitive (GtkWidget *widget,
3198 g_return_if_fail (widget != NULL);
3199 g_return_if_fail (GTK_IS_WIDGET (widget));
3201 sensitive = (sensitive != FALSE);
3203 if (sensitive == (GTK_WIDGET_SENSITIVE (widget) != FALSE))
3208 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
3209 data.state = GTK_WIDGET_SAVED_STATE (widget);
3213 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
3214 data.state = GTK_WIDGET_STATE (widget);
3216 data.state_restoration = TRUE;
3217 data.use_forall = TRUE;
3220 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
3222 data.parent_sensitive = TRUE;
3224 gtk_widget_propagate_state (widget, &data);
3225 if (GTK_WIDGET_DRAWABLE (widget))
3226 gtk_widget_queue_clear (widget);
3229 /*****************************************
3230 * gtk_widget_set_parent:
3235 *****************************************/
3238 gtk_widget_set_parent (GtkWidget *widget,
3243 g_return_if_fail (widget != NULL);
3244 g_return_if_fail (GTK_IS_WIDGET (widget));
3245 g_return_if_fail (widget->parent == NULL);
3246 g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
3247 g_return_if_fail (parent != NULL);
3248 g_return_if_fail (GTK_IS_WIDGET (parent));
3249 g_return_if_fail (widget != parent);
3251 /* keep this function in sync with gtk_menu_attach_to_widget()
3254 gtk_widget_ref (widget);
3255 gtk_object_sink (GTK_OBJECT (widget));
3256 widget->parent = parent;
3258 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
3259 data.state = GTK_WIDGET_STATE (parent);
3261 data.state = GTK_WIDGET_STATE (widget);
3262 data.state_restoration = FALSE;
3263 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (parent) != FALSE);
3264 data.use_forall = GTK_WIDGET_IS_SENSITIVE (parent) != GTK_WIDGET_IS_SENSITIVE (widget);
3266 gtk_widget_propagate_state (widget, &data);
3268 gtk_widget_set_style_recurse (widget, NULL);
3270 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
3273 /*****************************************
3275 * see docs/styles.txt
3276 *****************************************/
3278 gtk_widget_set_style (GtkWidget *widget,
3281 GtkStyle *default_style;
3282 gboolean initial_emission;
3284 g_return_if_fail (widget != NULL);
3285 g_return_if_fail (GTK_IS_WIDGET (widget));
3286 g_return_if_fail (style != NULL);
3288 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
3290 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
3291 GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
3293 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3296 gtk_style_ref (widget->style);
3297 if (!saved_default_style_key_id)
3298 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
3299 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
3302 gtk_widget_set_style_internal (widget, style, initial_emission);
3306 gtk_widget_ensure_style (GtkWidget *widget)
3308 g_return_if_fail (widget != NULL);
3309 g_return_if_fail (GTK_IS_WIDGET (widget));
3311 if (!GTK_WIDGET_USER_STYLE (widget) &&
3312 !GTK_WIDGET_RC_STYLE (widget))
3313 gtk_widget_set_rc_style (widget);
3317 gtk_widget_set_rc_style (GtkWidget *widget)
3319 GtkStyle *saved_style;
3320 GtkStyle *new_style;
3321 gboolean initial_emission;
3323 g_return_if_fail (widget != NULL);
3324 g_return_if_fail (GTK_IS_WIDGET (widget));
3326 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
3328 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
3329 GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
3331 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3332 new_style = gtk_rc_get_style (widget);
3337 gtk_style_ref (widget->style);
3338 if (!saved_default_style_key_id)
3339 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
3340 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
3342 gtk_widget_set_style_internal (widget, new_style, initial_emission);
3348 g_assert (initial_emission == FALSE); /* FIXME: remove this line */
3350 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3351 gtk_widget_set_style_internal (widget, saved_style, initial_emission);
3352 gtk_style_unref (saved_style);
3356 if (initial_emission)
3357 gtk_widget_set_style_internal (widget, widget->style, TRUE);
3363 gtk_widget_restore_default_style (GtkWidget *widget)
3365 GtkStyle *default_style;
3367 g_return_if_fail (widget != NULL);
3368 g_return_if_fail (GTK_IS_WIDGET (widget));
3370 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
3372 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3375 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3376 gtk_widget_set_style_internal (widget, default_style, FALSE);
3377 gtk_style_unref (default_style);
3382 gtk_widget_get_style (GtkWidget *widget)
3384 g_return_val_if_fail (widget != NULL, NULL);
3385 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3387 return widget->style;
3391 gtk_widget_modify_style (GtkWidget *widget,
3394 GtkRcStyle *old_style;
3396 if (!rc_style_key_id)
3397 rc_style_key_id = g_quark_from_static_string (rc_style_key);
3399 old_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), rc_style_key_id);
3401 if (style != old_style)
3402 gtk_object_set_data_by_id_full (GTK_OBJECT (widget),
3405 (GtkDestroyNotify)gtk_rc_style_unref);
3409 gtk_widget_style_set (GtkWidget *widget,
3410 GtkStyle *previous_style)
3412 if (GTK_WIDGET_REALIZED (widget) &&
3413 !GTK_WIDGET_NO_WINDOW (widget))
3415 gtk_style_set_background (widget->style, widget->window, widget->state);
3416 if (GTK_WIDGET_DRAWABLE (widget))
3417 gdk_window_clear (widget->window);
3422 gtk_widget_set_style_internal (GtkWidget *widget,
3424 gboolean initial_emission)
3426 g_return_if_fail (widget != NULL);
3427 g_return_if_fail (GTK_IS_WIDGET (widget));
3428 g_return_if_fail (style != NULL);
3430 if (widget->style != style)
3432 GtkStyle *previous_style;
3434 if (GTK_WIDGET_REALIZED (widget))
3436 gtk_widget_reset_shapes (widget);
3437 gtk_style_detach (widget->style);
3440 previous_style = widget->style;
3441 widget->style = style;
3442 gtk_style_ref (widget->style);
3444 if (GTK_WIDGET_REALIZED (widget))
3445 widget->style = gtk_style_attach (widget->style, widget->window);
3447 gtk_signal_emit (GTK_OBJECT (widget),
3448 widget_signals[STYLE_SET],
3449 initial_emission ? NULL : previous_style);
3450 gtk_style_unref (previous_style);
3452 if (widget->parent && !initial_emission)
3454 GtkRequisition old_requisition;
3456 old_requisition = widget->requisition;
3457 gtk_widget_size_request (widget, &widget->requisition);
3459 if ((old_requisition.width != widget->requisition.width) ||
3460 (old_requisition.height != widget->requisition.height))
3461 gtk_widget_queue_resize (widget);
3462 else if (GTK_WIDGET_DRAWABLE (widget))
3463 gtk_widget_queue_clear (widget);
3466 else if (initial_emission)
3468 gtk_signal_emit (GTK_OBJECT (widget),
3469 widget_signals[STYLE_SET],
3475 gtk_widget_set_style_recurse (GtkWidget *widget,
3476 gpointer client_data)
3478 if (GTK_WIDGET_RC_STYLE (widget))
3479 gtk_widget_set_rc_style (widget);
3481 if (GTK_IS_CONTAINER (widget))
3482 gtk_container_forall (GTK_CONTAINER (widget),
3483 gtk_widget_set_style_recurse,
3488 gtk_widget_reset_rc_styles (GtkWidget *widget)
3490 g_return_if_fail (widget != NULL);
3491 g_return_if_fail (GTK_IS_WIDGET (widget));
3493 gtk_widget_set_style_recurse (widget, NULL);
3497 gtk_widget_set_default_style (GtkStyle *style)
3499 if (style != gtk_default_style)
3501 if (gtk_default_style)
3502 gtk_style_unref (gtk_default_style);
3503 gtk_default_style = style;
3504 if (gtk_default_style)
3505 gtk_style_ref (gtk_default_style);
3510 gtk_widget_get_default_style (void)
3512 if (!gtk_default_style)
3514 gtk_default_style = gtk_style_new ();
3515 gtk_style_ref (gtk_default_style);
3518 return gtk_default_style;
3522 gtk_widget_push_style (GtkStyle *style)
3524 g_return_if_fail (style != NULL);
3526 gtk_style_ref (style);
3527 style_stack = g_slist_prepend (style_stack, style);
3531 gtk_widget_peek_style (void)
3534 return (GtkStyle*) style_stack->data;
3536 return gtk_widget_get_default_style ();
3540 gtk_widget_pop_style (void)
3547 style_stack = style_stack->next;
3548 gtk_style_unref ((GtkStyle*) tmp->data);
3549 g_slist_free_1 (tmp);
3553 /*************************************************************
3554 * gtk_widget_set_parent_window:
3555 * Set a non default parent window for widget
3562 *************************************************************/
3565 gtk_widget_set_parent_window (GtkWidget *widget,
3566 GdkWindow *parent_window)
3568 GdkWindow *old_parent_window;
3570 g_return_if_fail (widget != NULL);
3571 g_return_if_fail (GTK_IS_WIDGET (widget));
3573 old_parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
3574 parent_window_key_id);
3576 if (parent_window != old_parent_window)
3578 if (!parent_window_key_id)
3579 parent_window_key_id = g_quark_from_static_string (parent_window_key);
3580 gtk_object_set_data_by_id (GTK_OBJECT (widget), parent_window_key_id,
3582 if (old_parent_window)
3583 gdk_window_unref (old_parent_window);
3585 gdk_window_ref (parent_window);
3589 /*************************************************************
3590 * gtk_widget_get_parent_window:
3591 * Get widget's parent window
3598 *************************************************************/
3601 gtk_widget_get_parent_window (GtkWidget *widget)
3603 GdkWindow *parent_window;
3605 g_return_val_if_fail (widget != NULL, NULL);
3606 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3607 g_return_val_if_fail (widget->parent != NULL, NULL);
3609 parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
3610 parent_window_key_id);
3612 return (parent_window != NULL) ? parent_window : widget->parent->window;
3615 /*****************************************
3616 * gtk_widget_set_uposition:
3621 *****************************************/
3624 gtk_widget_set_uposition (GtkWidget *widget,
3628 GtkWidgetAuxInfo *aux_info;
3630 g_return_if_fail (widget != NULL);
3631 g_return_if_fail (GTK_IS_WIDGET (widget));
3633 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3636 if (!aux_info_key_id)
3637 aux_info_key_id = g_quark_from_static_string (aux_info_key);
3638 aux_info = gtk_widget_aux_info_new ();
3639 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
3647 if (GTK_WIDGET_REALIZED (widget) && GTK_IS_WINDOW (widget) &&
3648 (aux_info->x != -1) && (aux_info->y != -1))
3650 gdk_window_set_hints (widget->window, aux_info->x, aux_info->y, 0, 0, 0, 0, GDK_HINT_POS);
3651 gdk_window_move (widget->window, aux_info->x, aux_info->y);
3654 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
3655 gtk_widget_size_allocate (widget, &widget->allocation);
3658 /*****************************************
3659 * gtk_widget_set_usize:
3664 *****************************************/
3667 gtk_widget_set_usize (GtkWidget *widget,
3671 GtkWidgetAuxInfo *aux_info;
3673 g_return_if_fail (widget != NULL);
3674 g_return_if_fail (GTK_IS_WIDGET (widget));
3676 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3679 if (!aux_info_key_id)
3680 aux_info_key_id = g_quark_from_static_string (aux_info_key);
3681 aux_info = gtk_widget_aux_info_new ();
3682 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
3686 aux_info->width = width;
3688 aux_info->height = height;
3690 if (GTK_WIDGET_VISIBLE (widget))
3691 gtk_widget_queue_resize (widget);
3694 /*****************************************
3695 * gtk_widget_set_events:
3700 *****************************************/
3703 gtk_widget_set_events (GtkWidget *widget,
3708 g_return_if_fail (widget != NULL);
3709 g_return_if_fail (GTK_IS_WIDGET (widget));
3710 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3711 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
3713 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3718 eventp = g_new (gint, 1);
3722 event_key_id = g_quark_from_static_string (event_key);
3723 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3728 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3732 /*****************************************
3733 * gtk_widget_add_events:
3738 *****************************************/
3741 gtk_widget_add_events (GtkWidget *widget,
3746 g_return_if_fail (widget != NULL);
3747 g_return_if_fail (GTK_IS_WIDGET (widget));
3748 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3750 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3756 eventp = g_new (gint, 1);
3762 event_key_id = g_quark_from_static_string (event_key);
3763 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3768 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3771 if (GTK_WIDGET_REALIZED (widget))
3773 gdk_window_set_events (widget->window,
3774 gdk_window_get_events (widget->window) | events);
3778 /*****************************************
3779 * gtk_widget_set_extension_events:
3784 *****************************************/
3787 gtk_widget_set_extension_events (GtkWidget *widget,
3788 GdkExtensionMode mode)
3790 GdkExtensionMode *modep;
3792 g_return_if_fail (widget != NULL);
3793 g_return_if_fail (GTK_IS_WIDGET (widget));
3795 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3798 modep = g_new (GdkExtensionMode, 1);
3801 if (!extension_event_key_id)
3802 extension_event_key_id = g_quark_from_static_string (extension_event_key);
3803 gtk_object_set_data_by_id (GTK_OBJECT (widget), extension_event_key_id, modep);
3806 /*****************************************
3807 * gtk_widget_get_toplevel:
3812 *****************************************/
3815 gtk_widget_get_toplevel (GtkWidget *widget)
3817 g_return_val_if_fail (widget != NULL, NULL);
3818 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3820 while (widget->parent)
3821 widget = widget->parent;
3826 /*****************************************
3827 * gtk_widget_get_ancestor:
3832 *****************************************/
3835 gtk_widget_get_ancestor (GtkWidget *widget,
3836 GtkType widget_type)
3838 g_return_val_if_fail (widget != NULL, NULL);
3839 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3841 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type))
3842 widget = widget->parent;
3844 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type)))
3850 /*****************************************
3851 * gtk_widget_get_colormap:
3856 *****************************************/
3859 gtk_widget_get_colormap (GtkWidget *widget)
3861 GdkColormap *colormap;
3863 g_return_val_if_fail (widget != NULL, NULL);
3864 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3868 colormap = gdk_window_get_colormap (widget->window);
3869 /* If window was destroyed previously, we'll get NULL here */
3874 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
3878 return gtk_widget_get_default_colormap ();
3881 /*****************************************
3882 * gtk_widget_get_visual:
3887 *****************************************/
3890 gtk_widget_get_visual (GtkWidget *widget)
3894 g_return_val_if_fail (widget != NULL, NULL);
3895 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3899 visual = gdk_window_get_visual (widget->window);
3900 /* If window was destroyed previously, we'll get NULL here */
3905 visual = gtk_object_get_data (GTK_OBJECT (widget), visual_key);
3909 return gtk_widget_get_default_visual ();
3912 /*****************************************
3913 * gtk_widget_get_events:
3918 *****************************************/
3921 gtk_widget_get_events (GtkWidget *widget)
3925 g_return_val_if_fail (widget != NULL, 0);
3926 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
3928 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3935 /*****************************************
3936 * gtk_widget_get_extension_events:
3941 *****************************************/
3944 gtk_widget_get_extension_events (GtkWidget *widget)
3946 GdkExtensionMode *mode;
3948 g_return_val_if_fail (widget != NULL, 0);
3949 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
3951 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3958 /*****************************************
3959 * gtk_widget_get_pointer:
3964 *****************************************/
3967 gtk_widget_get_pointer (GtkWidget *widget,
3971 g_return_if_fail (widget != NULL);
3972 g_return_if_fail (GTK_IS_WIDGET (widget));
3979 if (GTK_WIDGET_REALIZED (widget))
3981 gdk_window_get_pointer (widget->window, x, y, NULL);
3983 if (GTK_WIDGET_NO_WINDOW (widget))
3986 *x -= widget->allocation.x;
3988 *y -= widget->allocation.y;
3993 /*****************************************
3994 * gtk_widget_is_ancestor:
3999 *****************************************/
4002 gtk_widget_is_ancestor (GtkWidget *widget,
4003 GtkWidget *ancestor)
4005 g_return_val_if_fail (widget != NULL, FALSE);
4006 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
4007 g_return_val_if_fail (ancestor != NULL, FALSE);
4011 if (widget->parent == ancestor)
4013 widget = widget->parent;
4019 static GQuark quark_composite_name = 0;
4022 gtk_widget_set_composite_name (GtkWidget *widget,
4025 g_return_if_fail (widget != NULL);
4026 g_return_if_fail (GTK_IS_WIDGET (widget));
4027 g_return_if_fail (GTK_WIDGET_COMPOSITE_CHILD (widget));
4028 g_return_if_fail (name != NULL);
4030 if (!quark_composite_name)
4031 quark_composite_name = g_quark_from_static_string ("gtk-composite-name");
4033 gtk_object_set_data_by_id_full (GTK_OBJECT (widget),
4034 quark_composite_name,
4040 gtk_widget_get_composite_name (GtkWidget *widget)
4042 g_return_val_if_fail (widget != NULL, NULL);
4043 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
4045 if (GTK_WIDGET_COMPOSITE_CHILD (widget) && widget->parent)
4046 return gtk_container_child_composite_name (GTK_CONTAINER (widget->parent),
4053 gtk_widget_push_composite_child (void)
4055 composite_child_stack++;
4059 gtk_widget_pop_composite_child (void)
4061 if (composite_child_stack)
4062 composite_child_stack--;
4065 /*****************************************
4066 * gtk_widget_push_colormap:
4071 *****************************************/
4074 gtk_widget_push_colormap (GdkColormap *cmap)
4076 g_return_if_fail (cmap != NULL);
4078 colormap_stack = g_slist_prepend (colormap_stack, cmap);
4081 /*****************************************
4082 * gtk_widget_push_visual:
4087 *****************************************/
4090 gtk_widget_push_visual (GdkVisual *visual)
4092 g_return_if_fail (visual != NULL);
4094 visual_stack = g_slist_prepend (visual_stack, visual);
4097 /*****************************************
4098 * gtk_widget_pop_colormap:
4103 *****************************************/
4106 gtk_widget_pop_colormap (void)
4112 tmp = colormap_stack;
4113 colormap_stack = colormap_stack->next;
4114 g_slist_free_1 (tmp);
4118 /*****************************************
4119 * gtk_widget_pop_visual:
4124 *****************************************/
4127 gtk_widget_pop_visual (void)
4134 visual_stack = visual_stack->next;
4135 g_slist_free_1 (tmp);
4139 /*****************************************
4140 * gtk_widget_set_default_colormap:
4145 *****************************************/
4148 gtk_widget_set_default_colormap (GdkColormap *colormap)
4150 if (default_colormap != colormap)
4152 if (default_colormap)
4153 gdk_colormap_unref (default_colormap);
4154 default_colormap = colormap;
4155 if (default_colormap)
4156 gdk_colormap_ref (default_colormap);
4160 /*****************************************
4161 * gtk_widget_set_default_visual:
4166 *****************************************/
4169 gtk_widget_set_default_visual (GdkVisual *visual)
4171 default_visual = visual;
4174 /*****************************************
4175 * gtk_widget_get_default_colormap:
4180 *****************************************/
4183 gtk_widget_get_default_colormap (void)
4185 if (!default_colormap)
4186 default_colormap = gdk_colormap_get_system ();
4188 return default_colormap;
4191 /*****************************************
4192 * gtk_widget_get_default_visual:
4197 *****************************************/
4200 gtk_widget_get_default_visual (void)
4202 if (!default_visual)
4203 default_visual = gdk_visual_get_system ();
4205 return default_visual;
4209 gtk_widget_shutdown (GtkObject *object)
4213 /* gtk_object_destroy() will already hold a refcount on object
4215 widget = GTK_WIDGET (object);
4218 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
4220 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
4221 if (GTK_WIDGET_REALIZED (widget))
4222 gtk_widget_unrealize (widget);
4224 parent_class->shutdown (object);
4228 gtk_widget_real_destroy (GtkObject *object)
4231 GtkStyle *saved_style;
4233 /* gtk_object_destroy() will already hold a refcount on object
4235 widget = GTK_WIDGET (object);
4237 gtk_grab_remove (widget);
4238 gtk_selection_remove_all (widget);
4240 saved_style = gtk_object_get_data_by_id (object, saved_default_style_key_id);
4243 gtk_style_unref (saved_style);
4244 gtk_object_remove_data_by_id (object, saved_default_style_key_id);
4247 gtk_style_unref (widget->style);
4248 widget->style = NULL;
4250 parent_class->destroy (object);
4254 gtk_widget_finalize (GtkObject *object)
4257 GtkWidgetAuxInfo *aux_info;
4259 GdkExtensionMode *mode;
4261 widget = GTK_WIDGET (object);
4264 g_free (widget->name);
4266 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
4268 gtk_widget_aux_info_destroy (aux_info);
4270 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
4274 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
4278 parent_class->finalize (object);
4281 /*****************************************
4282 * gtk_widget_real_map:
4287 *****************************************/
4290 gtk_widget_real_map (GtkWidget *widget)
4292 g_return_if_fail (widget != NULL);
4293 g_return_if_fail (GTK_IS_WIDGET (widget));
4295 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget))
4297 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
4299 if (!GTK_WIDGET_NO_WINDOW (widget))
4300 gdk_window_show (widget->window);
4304 /*****************************************
4305 * gtk_widget_real_unmap:
4310 *****************************************/
4313 gtk_widget_real_unmap (GtkWidget *widget)
4315 g_return_if_fail (widget != NULL);
4316 g_return_if_fail (GTK_IS_WIDGET (widget));
4318 if (GTK_WIDGET_MAPPED (widget))
4320 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
4322 if (!GTK_WIDGET_NO_WINDOW (widget))
4323 gdk_window_hide (widget->window);
4327 /*****************************************
4328 * gtk_widget_real_realize:
4333 *****************************************/
4336 gtk_widget_real_realize (GtkWidget *widget)
4338 g_return_if_fail (widget != NULL);
4339 g_return_if_fail (GTK_IS_WIDGET (widget));
4340 g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
4342 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
4345 widget->window = gtk_widget_get_parent_window (widget);
4346 gdk_window_ref (widget->window);
4348 widget->style = gtk_style_attach (widget->style, widget->window);
4351 /*****************************************
4352 * gtk_widget_real_unrealize:
4357 *****************************************/
4360 gtk_widget_real_unrealize (GtkWidget *widget)
4362 g_return_if_fail (widget != NULL);
4363 g_return_if_fail (GTK_IS_WIDGET (widget));
4365 if (GTK_WIDGET_MAPPED (widget))
4366 gtk_widget_real_unmap (widget);
4368 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
4370 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT(widget)->klass->type));
4373 /* We must do unrealize child widget BEFORE container widget.
4374 * gdk_window_destroy() destroys specified xwindow and it's sub-xwindows.
4375 * So, unrealizing container widget bofore it's children causes the problem
4376 * (for example, gdk_ic_destroy () with destroyed window causes crash. )
4379 if (GTK_IS_CONTAINER (widget))
4380 gtk_container_foreach (GTK_CONTAINER (widget),
4381 (GtkCallback) gtk_widget_unrealize,
4384 gtk_style_detach (widget->style);
4385 if (!GTK_WIDGET_NO_WINDOW (widget))
4387 gdk_window_set_user_data (widget->window, NULL);
4388 gdk_window_destroy (widget->window);
4389 widget->window = NULL;
4393 gdk_window_unref (widget->window);
4394 widget->window = NULL;
4397 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED);
4401 gtk_widget_real_draw (GtkWidget *widget,
4404 GdkEventExpose event;
4406 g_return_if_fail (widget != NULL);
4407 g_return_if_fail (GTK_IS_WIDGET (widget));
4408 g_return_if_fail (area != NULL);
4410 if (GTK_WIDGET_DRAWABLE (widget))
4412 event.type = GDK_EXPOSE;
4413 event.send_event = TRUE;
4414 event.window = widget->window;
4418 gdk_window_ref (event.window);
4419 gtk_widget_event (widget, (GdkEvent*) &event);
4420 gdk_window_unref (event.window);
4425 gtk_widget_real_size_request (GtkWidget *widget,
4426 GtkRequisition *requisition)
4428 g_return_if_fail (widget != NULL);
4429 g_return_if_fail (GTK_IS_WIDGET (widget));
4431 requisition->width = widget->requisition.width;
4432 requisition->height = widget->requisition.height;
4435 /*****************************************
4436 * gtk_widget_peek_colormap:
4441 *****************************************/
4444 gtk_widget_peek_colormap (void)
4447 return (GdkColormap*) colormap_stack->data;
4448 return gtk_widget_get_default_colormap ();
4451 /*****************************************
4452 * gtk_widget_peek_visual:
4457 *****************************************/
4460 gtk_widget_peek_visual (void)
4463 return (GdkVisual*) visual_stack->data;
4464 return gtk_widget_get_default_visual ();
4468 gtk_widget_propagate_state (GtkWidget *widget,
4473 /* don't call this function with state==GTK_STATE_INSENSITIVE,
4474 * parent_sensitive==TRUE on a sensitive widget
4477 old_state = GTK_WIDGET_STATE (widget);
4479 if (data->parent_sensitive)
4481 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
4483 if (GTK_WIDGET_IS_SENSITIVE (widget))
4485 if (data->state_restoration)
4486 GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget);
4488 GTK_WIDGET_STATE (widget) = data->state;
4492 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
4493 if (!data->state_restoration &&
4494 data->state != GTK_STATE_INSENSITIVE)
4495 GTK_WIDGET_SAVED_STATE (widget) = data->state;
4500 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
4501 if (!data->state_restoration)
4503 if (data->state != GTK_STATE_INSENSITIVE)
4504 GTK_WIDGET_SAVED_STATE (widget) = data->state;
4506 else if (GTK_WIDGET_STATE (widget) != GTK_STATE_INSENSITIVE)
4507 GTK_WIDGET_SAVED_STATE (widget) = GTK_WIDGET_STATE (widget);
4508 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
4511 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
4515 window = gtk_widget_get_ancestor (widget, gtk_window_get_type ());
4517 gtk_window_set_focus (GTK_WINDOW (window), NULL);
4520 if (old_state != GTK_WIDGET_STATE (widget))
4522 gtk_widget_ref (widget);
4523 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
4525 if (GTK_IS_CONTAINER (widget))
4527 data->parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget) != FALSE);
4528 data->state = GTK_WIDGET_STATE (widget);
4529 if (data->use_forall)
4530 gtk_container_forall (GTK_CONTAINER (widget),
4531 (GtkCallback) gtk_widget_propagate_state,
4534 gtk_container_foreach (GTK_CONTAINER (widget),
4535 (GtkCallback) gtk_widget_propagate_state,
4538 gtk_widget_unref (widget);
4542 /*****************************************
4543 * gtk_widget_aux_info_new:
4548 *****************************************/
4550 static GtkWidgetAuxInfo*
4551 gtk_widget_aux_info_new (void)
4553 GtkWidgetAuxInfo *aux_info;
4555 if (!aux_info_mem_chunk)
4556 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
4557 sizeof (GtkWidgetAuxInfo),
4558 1024, G_ALLOC_AND_FREE);
4560 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
4564 aux_info->width = 0;
4565 aux_info->height = 0;
4570 /*****************************************
4571 * gtk_widget_aux_info_destroy:
4576 *****************************************/
4579 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
4581 g_return_if_fail (aux_info != NULL);
4583 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
4586 /*****************************************
4587 * gtk_widget_shape_combine_mask:
4588 * set a shape for this widgets' gdk window, this allows for
4589 * transparent windows etc., see gdk_window_shape_combine_mask
4590 * for more information
4595 *****************************************/
4597 gtk_widget_shape_combine_mask (GtkWidget *widget,
4598 GdkBitmap *shape_mask,
4602 GtkWidgetShapeInfo* shape_info;
4604 g_return_if_fail (widget != NULL);
4605 g_return_if_fail (GTK_IS_WIDGET (widget));
4606 /* set_shape doesn't work on widgets without gdk window */
4607 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
4611 GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4614 gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
4616 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4617 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
4618 g_free (shape_info);
4622 GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4624 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4627 shape_info = g_new (GtkWidgetShapeInfo, 1);
4628 gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
4630 shape_info->shape_mask = shape_mask;
4631 shape_info->offset_x = offset_x;
4632 shape_info->offset_y = offset_y;
4634 /* set shape if widget has a gdk window allready.
4635 * otherwise the shape is scheduled to be set by gtk_widget_realize.
4638 gdk_window_shape_combine_mask (widget->window, shape_mask,
4639 offset_x, offset_y);
4644 gtk_reset_shapes_recurse (GtkWidget *widget,
4647 GdkWindowPrivate *private;
4651 private = (GdkWindowPrivate*) window;
4653 if (private->destroyed)
4655 gdk_window_get_user_data (window, &data);
4659 gdk_window_shape_combine_mask (window, NULL, 0, 0);
4660 for (list = private->children; list; list = list->next)
4661 gtk_reset_shapes_recurse (widget, list->data);
4665 gtk_widget_reset_shapes (GtkWidget *widget)
4667 g_return_if_fail (widget != NULL);
4668 g_return_if_fail (GTK_IS_WIDGET (widget));
4669 g_return_if_fail (GTK_WIDGET_REALIZED (widget));
4671 if (!GTK_WIDGET_HAS_SHAPE_MASK (widget))
4672 gtk_reset_shapes_recurse (widget, widget->window);
4676 gtk_widget_ref (GtkWidget *widget)
4678 g_return_if_fail (widget != NULL);
4679 g_return_if_fail (GTK_IS_WIDGET (widget));
4681 gtk_object_ref ((GtkObject*) widget);
4685 gtk_widget_unref (GtkWidget *widget)
4687 g_return_if_fail (widget != NULL);
4688 g_return_if_fail (GTK_IS_WIDGET (widget));
4690 gtk_object_unref ((GtkObject*) widget);
4694 gtk_widget_path (GtkWidget *widget,
4695 guint *path_length_p,
4697 gchar **path_reversed_p)
4699 static gchar *rev_path = NULL;
4700 static guint path_len = 0;
4703 g_return_if_fail (widget != NULL);
4704 g_return_if_fail (GTK_IS_WIDGET (widget));
4713 string = gtk_widget_get_name (widget);
4714 l = strlen (string);
4715 while (path_len <= len + l + 1)
4717 path_len += INIT_PATH_SIZE;
4718 rev_path = g_realloc (rev_path, path_len);
4726 widget = widget->parent;
4729 rev_path[len++] = '.';
4731 rev_path[len++] = 0;
4736 *path_length_p = len - 1;
4737 if (path_reversed_p)
4738 *path_reversed_p = g_strdup (rev_path);
4741 *path_p = g_strdup (rev_path);
4742 g_strreverse (*path_p);
4747 gtk_widget_class_path (GtkWidget *widget,
4748 guint *path_length_p,
4750 gchar **path_reversed_p)
4752 static gchar *rev_path = NULL;
4753 static guint path_len = 0;
4756 g_return_if_fail (widget != NULL);
4757 g_return_if_fail (GTK_IS_WIDGET (widget));
4766 string = gtk_type_name (GTK_WIDGET_TYPE (widget));
4767 l = strlen (string);
4768 while (path_len <= len + l + 1)
4770 path_len += INIT_PATH_SIZE;
4771 rev_path = g_realloc (rev_path, path_len);
4779 widget = widget->parent;
4782 rev_path[len++] = '.';
4784 rev_path[len++] = 0;
4789 *path_length_p = len - 1;
4790 if (path_reversed_p)
4791 *path_reversed_p = g_strdup (rev_path);
4794 *path_p = g_strdup (rev_path);
4795 g_strreverse (*path_p);