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,
110 ARG_RECEIVES_DEFAULT,
117 typedef struct _GtkStateData GtkStateData;
122 guint state_restoration : 1;
123 guint parent_sensitive : 1;
124 guint use_forall : 1;
127 static void gtk_widget_class_init (GtkWidgetClass *klass);
128 static void gtk_widget_init (GtkWidget *widget);
129 static void gtk_widget_set_arg (GtkObject *object,
132 static void gtk_widget_get_arg (GtkObject *object,
135 static void gtk_widget_shutdown (GtkObject *object);
136 static void gtk_widget_real_destroy (GtkObject *object);
137 static void gtk_widget_finalize (GtkObject *object);
138 static void gtk_widget_real_show (GtkWidget *widget);
139 static void gtk_widget_real_hide (GtkWidget *widget);
140 static void gtk_widget_real_map (GtkWidget *widget);
141 static void gtk_widget_real_unmap (GtkWidget *widget);
142 static void gtk_widget_real_realize (GtkWidget *widget);
143 static void gtk_widget_real_unrealize (GtkWidget *widget);
144 static void gtk_widget_real_draw (GtkWidget *widget,
146 static void gtk_widget_real_size_request (GtkWidget *widget,
147 GtkRequisition *requisition);
148 static void gtk_widget_real_size_allocate (GtkWidget *widget,
149 GtkAllocation *allocation);
150 static gint gtk_widget_real_key_press_event (GtkWidget *widget,
152 static gint gtk_widget_real_key_release_event (GtkWidget *widget,
154 static void gtk_widget_style_set (GtkWidget *widget,
155 GtkStyle *previous_style);
156 static void gtk_widget_real_grab_focus (GtkWidget *focus_widget);
158 static void gtk_widget_redraw_queue_remove (GtkWidget *widget);
161 static GdkColormap* gtk_widget_peek_colormap (void);
162 static GdkVisual* gtk_widget_peek_visual (void);
163 static GtkStyle* gtk_widget_peek_style (void);
165 static void gtk_widget_reparent_container_child (GtkWidget *widget,
166 gpointer client_data);
167 static void gtk_widget_propagate_state (GtkWidget *widget,
169 static void gtk_widget_set_style_internal (GtkWidget *widget,
171 gboolean initial_emission);
172 static void gtk_widget_set_style_recurse (GtkWidget *widget,
173 gpointer client_data);
175 static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
176 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
178 static GtkObjectClass *parent_class = NULL;
179 static guint widget_signals[LAST_SIGNAL] = { 0 };
181 static GMemChunk *aux_info_mem_chunk = NULL;
183 static GdkColormap *default_colormap = NULL;
184 static GdkVisual *default_visual = NULL;
185 static GtkStyle *gtk_default_style = NULL;
187 static GSList *colormap_stack = NULL;
188 static GSList *visual_stack = NULL;
189 static GSList *style_stack = NULL;
190 static guint composite_child_stack = 0;
191 static GSList *gtk_widget_redraw_queue = NULL;
193 static const gchar *aux_info_key = "gtk-aux-info";
194 static guint aux_info_key_id = 0;
195 static const gchar *event_key = "gtk-event-mask";
196 static guint event_key_id = 0;
197 static const gchar *extension_event_key = "gtk-extension-event-mode";
198 static guint extension_event_key_id = 0;
199 static const gchar *parent_window_key = "gtk-parent-window";
200 static guint parent_window_key_id = 0;
201 static const gchar *saved_default_style_key = "gtk-saved-default-style";
202 static guint saved_default_style_key_id = 0;
203 static const gchar *shape_info_key = "gtk-shape-info";
204 static const gchar *colormap_key = "gtk-colormap";
205 static const gchar *visual_key = "gtk-visual";
207 static const gchar *rc_style_key = "gtk-rc-style";
208 static guint rc_style_key_id = 0;
210 /*****************************************
211 * gtk_widget_get_type:
216 *****************************************/
219 gtk_widget_get_type (void)
221 static GtkType widget_type = 0;
225 static const GtkTypeInfo widget_info =
229 sizeof (GtkWidgetClass),
230 (GtkClassInitFunc) gtk_widget_class_init,
231 (GtkObjectInitFunc) gtk_widget_init,
232 /* reserved_1 */ NULL,
233 /* reserved_2 */ NULL,
234 (GtkClassInitFunc) NULL,
237 widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);
243 /*****************************************
244 * gtk_widget_class_init:
249 *****************************************/
252 gtk_widget_debug_msg (GtkWidget *widget,
255 fprintf (stderr, "Gtk-DEBUG: %s\n", string);
259 gtk_widget_class_init (GtkWidgetClass *klass)
261 GtkObjectClass *object_class;
263 object_class = (GtkObjectClass*) klass;
265 parent_class = gtk_type_class (gtk_object_get_type ());
267 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
268 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
269 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
270 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
271 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
272 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
273 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
274 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
275 gtk_object_add_arg_type ("GtkWidget::app_paintable", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_APP_PAINTABLE);
276 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
277 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
278 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
279 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
280 gtk_object_add_arg_type ("GtkWidget::receives_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_RECEIVES_DEFAULT);
281 gtk_object_add_arg_type ("GtkWidget::composite_child", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_COMPOSITE_CHILD);
282 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
283 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
284 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
286 widget_signals[SHOW] =
287 gtk_signal_new ("show",
290 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
291 gtk_marshal_NONE__NONE,
293 widget_signals[HIDE] =
294 gtk_signal_new ("hide",
297 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
298 gtk_marshal_NONE__NONE,
300 widget_signals[MAP] =
301 gtk_signal_new ("map",
304 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
305 gtk_marshal_NONE__NONE,
307 widget_signals[UNMAP] =
308 gtk_signal_new ("unmap",
311 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
312 gtk_marshal_NONE__NONE,
314 widget_signals[REALIZE] =
315 gtk_signal_new ("realize",
318 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
319 gtk_marshal_NONE__NONE,
321 widget_signals[UNREALIZE] =
322 gtk_signal_new ("unrealize",
325 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
326 gtk_marshal_NONE__NONE,
328 widget_signals[DRAW] =
329 gtk_signal_new ("draw",
332 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
333 gtk_marshal_NONE__POINTER,
336 widget_signals[DRAW_FOCUS] =
337 gtk_signal_new ("draw_focus",
340 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
341 gtk_marshal_NONE__NONE,
343 widget_signals[DRAW_DEFAULT] =
344 gtk_signal_new ("draw_default",
347 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
348 gtk_marshal_NONE__NONE,
350 widget_signals[SIZE_REQUEST] =
351 gtk_signal_new ("size_request",
354 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
355 gtk_marshal_NONE__POINTER,
358 widget_signals[SIZE_ALLOCATE] =
359 gtk_signal_new ("size_allocate",
362 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
363 gtk_marshal_NONE__POINTER,
366 widget_signals[STATE_CHANGED] =
367 gtk_signal_new ("state_changed",
370 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
371 gtk_marshal_NONE__UINT,
373 GTK_TYPE_STATE_TYPE);
374 widget_signals[PARENT_SET] =
375 gtk_signal_new ("parent_set",
378 GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
379 gtk_marshal_NONE__OBJECT,
382 widget_signals[STYLE_SET] =
383 gtk_signal_new ("style_set",
386 GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
387 gtk_marshal_NONE__POINTER,
390 widget_signals[ADD_ACCELERATOR] =
391 gtk_accel_group_create_add (object_class->type, GTK_RUN_LAST,
392 GTK_SIGNAL_OFFSET (GtkWidgetClass, add_accelerator));
393 widget_signals[REMOVE_ACCELERATOR] =
394 gtk_accel_group_create_remove (object_class->type, GTK_RUN_LAST,
395 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));
396 widget_signals[GRAB_FOCUS] =
397 gtk_signal_new ("grab_focus",
398 GTK_RUN_LAST | GTK_RUN_ACTION,
400 GTK_SIGNAL_OFFSET (GtkWidgetClass, grab_focus),
401 gtk_marshal_NONE__NONE,
403 widget_signals[EVENT] =
404 gtk_signal_new ("event",
407 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
408 gtk_marshal_BOOL__POINTER,
411 widget_signals[BUTTON_PRESS_EVENT] =
412 gtk_signal_new ("button_press_event",
415 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
416 gtk_marshal_BOOL__POINTER,
419 widget_signals[BUTTON_RELEASE_EVENT] =
420 gtk_signal_new ("button_release_event",
423 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
424 gtk_marshal_BOOL__POINTER,
427 widget_signals[MOTION_NOTIFY_EVENT] =
428 gtk_signal_new ("motion_notify_event",
431 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
432 gtk_marshal_BOOL__POINTER,
435 widget_signals[DELETE_EVENT] =
436 gtk_signal_new ("delete_event",
439 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
440 gtk_marshal_BOOL__POINTER,
443 widget_signals[DESTROY_EVENT] =
444 gtk_signal_new ("destroy_event",
447 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
448 gtk_marshal_BOOL__POINTER,
451 widget_signals[EXPOSE_EVENT] =
452 gtk_signal_new ("expose_event",
455 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
456 gtk_marshal_BOOL__POINTER,
459 widget_signals[KEY_PRESS_EVENT] =
460 gtk_signal_new ("key_press_event",
463 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
464 gtk_marshal_BOOL__POINTER,
467 widget_signals[KEY_RELEASE_EVENT] =
468 gtk_signal_new ("key_release_event",
471 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
472 gtk_marshal_BOOL__POINTER,
475 widget_signals[ENTER_NOTIFY_EVENT] =
476 gtk_signal_new ("enter_notify_event",
479 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
480 gtk_marshal_BOOL__POINTER,
483 widget_signals[LEAVE_NOTIFY_EVENT] =
484 gtk_signal_new ("leave_notify_event",
487 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
488 gtk_marshal_BOOL__POINTER,
491 widget_signals[CONFIGURE_EVENT] =
492 gtk_signal_new ("configure_event",
495 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
496 gtk_marshal_BOOL__POINTER,
499 widget_signals[FOCUS_IN_EVENT] =
500 gtk_signal_new ("focus_in_event",
503 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
504 gtk_marshal_BOOL__POINTER,
507 widget_signals[FOCUS_OUT_EVENT] =
508 gtk_signal_new ("focus_out_event",
511 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
512 gtk_marshal_BOOL__POINTER,
515 widget_signals[MAP_EVENT] =
516 gtk_signal_new ("map_event",
519 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
520 gtk_marshal_BOOL__POINTER,
523 widget_signals[UNMAP_EVENT] =
524 gtk_signal_new ("unmap_event",
527 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
528 gtk_marshal_BOOL__POINTER,
531 widget_signals[PROPERTY_NOTIFY_EVENT] =
532 gtk_signal_new ("property_notify_event",
535 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
536 gtk_marshal_BOOL__POINTER,
539 widget_signals[SELECTION_CLEAR_EVENT] =
540 gtk_signal_new ("selection_clear_event",
543 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
544 gtk_marshal_BOOL__POINTER,
547 widget_signals[SELECTION_REQUEST_EVENT] =
548 gtk_signal_new ("selection_request_event",
551 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
552 gtk_marshal_BOOL__POINTER,
555 widget_signals[SELECTION_NOTIFY_EVENT] =
556 gtk_signal_new ("selection_notify_event",
559 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
560 gtk_marshal_BOOL__POINTER,
563 widget_signals[SELECTION_RECEIVED] =
564 gtk_signal_new ("selection_received",
567 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
568 gtk_marshal_NONE__POINTER_UINT,
570 GTK_TYPE_SELECTION_DATA,
572 widget_signals[SELECTION_GET] =
573 gtk_signal_new ("selection_get",
576 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_get),
577 gtk_marshal_NONE__POINTER_UINT_UINT,
579 GTK_TYPE_SELECTION_DATA,
582 widget_signals[PROXIMITY_IN_EVENT] =
583 gtk_signal_new ("proximity_in_event",
586 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
587 gtk_marshal_BOOL__POINTER,
590 widget_signals[PROXIMITY_OUT_EVENT] =
591 gtk_signal_new ("proximity_out_event",
594 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
595 gtk_marshal_BOOL__POINTER,
598 widget_signals[DRAG_LEAVE] =
599 gtk_signal_new ("drag_leave",
602 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_leave),
603 gtk_marshal_NONE__POINTER_UINT,
605 GTK_TYPE_GDK_DRAG_CONTEXT,
607 widget_signals[DRAG_BEGIN] =
608 gtk_signal_new ("drag_begin",
611 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin),
612 gtk_marshal_NONE__POINTER,
614 GTK_TYPE_GDK_DRAG_CONTEXT);
615 widget_signals[DRAG_END] =
616 gtk_signal_new ("drag_end",
619 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end),
620 gtk_marshal_NONE__POINTER,
622 GTK_TYPE_GDK_DRAG_CONTEXT);
623 widget_signals[DRAG_DATA_DELETE] =
624 gtk_signal_new ("drag_data_delete",
627 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_delete),
628 gtk_marshal_NONE__POINTER,
630 GTK_TYPE_GDK_DRAG_CONTEXT);
631 widget_signals[DRAG_MOTION] =
632 gtk_signal_new ("drag_motion",
635 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_motion),
636 gtk_marshal_BOOL__POINTER_INT_INT_UINT,
638 GTK_TYPE_GDK_DRAG_CONTEXT,
642 widget_signals[DRAG_DROP] =
643 gtk_signal_new ("drag_drop",
646 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_drop),
647 gtk_marshal_BOOL__POINTER_INT_INT_UINT,
649 GTK_TYPE_GDK_DRAG_CONTEXT,
653 widget_signals[DRAG_DATA_GET] =
654 gtk_signal_new ("drag_data_get",
657 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_get),
658 gtk_marshal_NONE__POINTER_POINTER_UINT_UINT,
660 GTK_TYPE_GDK_DRAG_CONTEXT,
661 GTK_TYPE_SELECTION_DATA,
664 widget_signals[DRAG_DATA_RECEIVED] =
665 gtk_signal_new ("drag_data_received",
668 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_received),
669 gtk_marshal_NONE__POINTER_INT_INT_POINTER_UINT_UINT,
671 GTK_TYPE_GDK_DRAG_CONTEXT,
674 GTK_TYPE_SELECTION_DATA,
677 widget_signals[VISIBILITY_NOTIFY_EVENT] =
678 gtk_signal_new ("visibility_notify_event",
681 GTK_SIGNAL_OFFSET (GtkWidgetClass, visibility_notify_event),
682 gtk_marshal_BOOL__POINTER,
685 widget_signals[CLIENT_EVENT] =
686 gtk_signal_new ("client_event",
689 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
690 gtk_marshal_BOOL__POINTER,
693 widget_signals[NO_EXPOSE_EVENT] =
694 gtk_signal_new ("no_expose_event",
697 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
698 gtk_marshal_BOOL__POINTER,
701 widget_signals[DEBUG_MSG] =
702 gtk_signal_new ("debug_msg",
703 GTK_RUN_LAST | GTK_RUN_ACTION,
705 GTK_SIGNAL_OFFSET (GtkWidgetClass, debug_msg),
706 gtk_marshal_NONE__STRING,
710 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
712 object_class->set_arg = gtk_widget_set_arg;
713 object_class->get_arg = gtk_widget_get_arg;
714 object_class->shutdown = gtk_widget_shutdown;
715 object_class->destroy = gtk_widget_real_destroy;
716 object_class->finalize = gtk_widget_finalize;
718 klass->activate_signal = 0;
719 klass->set_scroll_adjustments_signal = 0;
720 klass->show = gtk_widget_real_show;
721 klass->show_all = gtk_widget_show;
722 klass->hide = gtk_widget_real_hide;
723 klass->hide_all = gtk_widget_hide;
724 klass->map = gtk_widget_real_map;
725 klass->unmap = gtk_widget_real_unmap;
726 klass->realize = gtk_widget_real_realize;
727 klass->unrealize = gtk_widget_real_unrealize;
728 klass->draw = gtk_widget_real_draw;
729 klass->draw_focus = NULL;
730 klass->size_request = gtk_widget_real_size_request;
731 klass->size_allocate = gtk_widget_real_size_allocate;
732 klass->state_changed = NULL;
733 klass->parent_set = NULL;
734 klass->style_set = gtk_widget_style_set;
735 klass->add_accelerator = (void*) gtk_accel_group_handle_add;
736 klass->remove_accelerator = (void*) gtk_accel_group_handle_remove;
737 klass->grab_focus = gtk_widget_real_grab_focus;
739 klass->button_press_event = NULL;
740 klass->button_release_event = NULL;
741 klass->motion_notify_event = NULL;
742 klass->delete_event = NULL;
743 klass->destroy_event = NULL;
744 klass->expose_event = NULL;
745 klass->key_press_event = gtk_widget_real_key_press_event;
746 klass->key_release_event = gtk_widget_real_key_release_event;
747 klass->enter_notify_event = NULL;
748 klass->leave_notify_event = NULL;
749 klass->configure_event = NULL;
750 klass->focus_in_event = NULL;
751 klass->focus_out_event = NULL;
752 klass->map_event = NULL;
753 klass->unmap_event = NULL;
754 klass->property_notify_event = gtk_selection_property_notify;
755 klass->selection_clear_event = gtk_selection_clear;
756 klass->selection_request_event = gtk_selection_request;
757 klass->selection_notify_event = gtk_selection_notify;
758 klass->selection_received = NULL;
759 klass->proximity_in_event = NULL;
760 klass->proximity_out_event = NULL;
761 klass->drag_begin = NULL;
762 klass->drag_end = NULL;
763 klass->drag_data_delete = NULL;
764 klass->drag_leave = NULL;
765 klass->drag_motion = NULL;
766 klass->drag_drop = NULL;
767 klass->drag_data_received = NULL;
769 klass->no_expose_event = NULL;
771 klass->debug_msg = gtk_widget_debug_msg;
775 gtk_widget_set_arg (GtkObject *object,
781 widget = GTK_WIDGET (object);
788 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
791 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
794 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
797 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
800 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -2);
803 gtk_widget_set_usize (widget, -2, GTK_VALUE_INT (*arg));
806 if (GTK_VALUE_BOOL(*arg))
807 gtk_widget_show (widget);
809 gtk_widget_hide (widget);
812 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
814 case ARG_APP_PAINTABLE:
815 gtk_widget_set_app_paintable (widget, GTK_VALUE_BOOL (*arg));
818 saved_flags = GTK_WIDGET_FLAGS (widget);
819 if (GTK_VALUE_BOOL (*arg))
820 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
822 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
823 if (saved_flags != GTK_WIDGET_FLAGS (widget))
824 gtk_widget_queue_resize (widget);
827 if (GTK_VALUE_BOOL (*arg))
828 gtk_widget_grab_focus (widget);
830 case ARG_CAN_DEFAULT:
831 saved_flags = GTK_WIDGET_FLAGS (widget);
832 if (GTK_VALUE_BOOL (*arg))
833 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
835 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
836 if (saved_flags != GTK_WIDGET_FLAGS (widget))
837 gtk_widget_queue_resize (widget);
839 case ARG_HAS_DEFAULT:
840 if (GTK_VALUE_BOOL (*arg))
841 gtk_widget_grab_default (widget);
843 case ARG_RECEIVES_DEFAULT:
844 if (GTK_VALUE_BOOL (*arg))
845 GTK_WIDGET_SET_FLAGS (widget, GTK_RECEIVES_DEFAULT);
847 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RECEIVES_DEFAULT);
849 case ARG_COMPOSITE_CHILD:
850 if (GTK_VALUE_BOOL(*arg))
851 GTK_WIDGET_SET_FLAGS (widget, GTK_COMPOSITE_CHILD);
853 GTK_WIDGET_UNSET_FLAGS (widget, GTK_COMPOSITE_CHILD);
856 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
859 if (!GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_NO_WINDOW (widget))
860 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
862 case ARG_EXTENSION_EVENTS:
863 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
870 /*****************************************
871 * gtk_widget_get_arg:
876 *****************************************/
879 gtk_widget_get_arg (GtkObject *object,
885 widget = GTK_WIDGET (object);
889 GtkWidgetAuxInfo *aux_info;
891 GdkExtensionMode *modep;
895 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
897 GTK_VALUE_STRING (*arg) = g_strdup ("");
900 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
903 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
905 GTK_VALUE_INT (*arg) = -1;
907 GTK_VALUE_INT (*arg) = aux_info->x;
910 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
912 GTK_VALUE_INT (*arg) = -1;
914 GTK_VALUE_INT (*arg) = aux_info->y;
917 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
919 GTK_VALUE_INT (*arg) = -1;
921 GTK_VALUE_INT (*arg) = aux_info->width;
924 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
926 GTK_VALUE_INT (*arg) = -1;
928 GTK_VALUE_INT (*arg) = aux_info->height;
931 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_VISIBLE (widget) != FALSE);
934 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_SENSITIVE (widget) != FALSE);
936 case ARG_APP_PAINTABLE:
937 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_APP_PAINTABLE (widget) != FALSE);
940 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_FOCUS (widget) != FALSE);
943 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_FOCUS (widget) != FALSE);
945 case ARG_CAN_DEFAULT:
946 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_DEFAULT (widget) != FALSE);
948 case ARG_HAS_DEFAULT:
949 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
951 case ARG_RECEIVES_DEFAULT:
952 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_RECEIVES_DEFAULT (widget) != FALSE);
954 case ARG_COMPOSITE_CHILD:
955 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_COMPOSITE_CHILD (widget) != FALSE);
958 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
961 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
963 GTK_VALUE_FLAGS (*arg) = 0;
965 GTK_VALUE_FLAGS (*arg) = *eventp;
967 case ARG_EXTENSION_EVENTS:
968 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
970 GTK_VALUE_FLAGS (*arg) = 0;
972 GTK_VALUE_FLAGS (*arg) = *modep;
975 arg->type = GTK_TYPE_INVALID;
980 /*****************************************
986 *****************************************/
989 gtk_widget_init (GtkWidget *widget)
991 GdkColormap *colormap;
994 GTK_PRIVATE_FLAGS (widget) = 0;
995 widget->state = GTK_STATE_NORMAL;
996 widget->saved_state = GTK_STATE_NORMAL;
998 widget->requisition.width = 0;
999 widget->requisition.height = 0;
1000 widget->allocation.x = -1;
1001 widget->allocation.y = -1;
1002 widget->allocation.width = 1;
1003 widget->allocation.height = 1;
1004 widget->window = NULL;
1005 widget->parent = NULL;
1007 GTK_WIDGET_SET_FLAGS (widget,
1009 GTK_PARENT_SENSITIVE |
1010 (composite_child_stack ? GTK_COMPOSITE_CHILD : 0));
1012 widget->style = gtk_widget_peek_style ();
1013 gtk_style_ref (widget->style);
1015 colormap = gtk_widget_peek_colormap ();
1016 visual = gtk_widget_peek_visual ();
1018 /* XXX - should we ref the colormap and visual, too? */
1020 if (colormap != gtk_widget_get_default_colormap ())
1022 /* gdk_colormap_ref (colormap); */
1023 gtk_object_set_data (GTK_OBJECT (widget), colormap_key, colormap);
1026 if (visual != gtk_widget_get_default_visual ())
1028 /* gdk_visual_ref (visual); */
1029 gtk_object_set_data (GTK_OBJECT (widget), visual_key, visual);
1033 /*****************************************
1039 *****************************************/
1042 gtk_widget_new (GtkType widget_type,
1043 const gchar *first_arg_name,
1048 GSList *arg_list = NULL;
1049 GSList *info_list = NULL;
1052 g_return_val_if_fail (gtk_type_is_a (widget_type, GTK_TYPE_WIDGET), NULL);
1054 object = gtk_type_new (widget_type);
1056 va_start (var_args, first_arg_name);
1057 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1066 g_warning ("gtk_widget_new(): %s", error);
1074 slist_arg = arg_list;
1075 slist_info = info_list;
1078 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1079 slist_arg = slist_arg->next;
1080 slist_info = slist_info->next;
1082 gtk_args_collect_cleanup (arg_list, info_list);
1085 if (!GTK_OBJECT_CONSTRUCTED (object))
1086 gtk_object_default_construct (object);
1088 return GTK_WIDGET (object);
1091 /*****************************************
1097 *****************************************/
1100 gtk_widget_newv (GtkType type,
1104 g_return_val_if_fail (gtk_type_is_a (type, GTK_TYPE_WIDGET), NULL);
1106 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1109 /*****************************************
1115 *****************************************/
1118 gtk_widget_get (GtkWidget *widget,
1121 g_return_if_fail (widget != NULL);
1122 g_return_if_fail (GTK_IS_WIDGET (widget));
1123 g_return_if_fail (arg != NULL);
1125 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1128 /*****************************************
1134 *****************************************/
1137 gtk_widget_getv (GtkWidget *widget,
1141 g_return_if_fail (widget != NULL);
1142 g_return_if_fail (GTK_IS_WIDGET (widget));
1144 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1147 /*****************************************
1153 *****************************************/
1156 gtk_widget_set (GtkWidget *widget,
1157 const gchar *first_arg_name,
1162 GSList *arg_list = NULL;
1163 GSList *info_list = NULL;
1166 g_return_if_fail (widget != NULL);
1167 g_return_if_fail (GTK_IS_WIDGET (widget));
1169 object = GTK_OBJECT (widget);
1171 va_start (var_args, first_arg_name);
1172 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1181 g_warning ("gtk_widget_set(): %s", error);
1189 slist_arg = arg_list;
1190 slist_info = info_list;
1193 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1194 slist_arg = slist_arg->next;
1195 slist_info = slist_info->next;
1197 gtk_args_collect_cleanup (arg_list, info_list);
1201 /*****************************************
1207 *****************************************/
1210 gtk_widget_setv (GtkWidget *widget,
1214 g_return_if_fail (widget != NULL);
1215 g_return_if_fail (GTK_IS_WIDGET (widget));
1217 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1221 gtk_widget_queue_clear_child (GtkWidget *widget)
1225 parent = widget->parent;
1226 if (parent && GTK_WIDGET_DRAWABLE (parent))
1227 gtk_widget_queue_clear_area (parent,
1228 widget->allocation.x,
1229 widget->allocation.y,
1230 widget->allocation.width,
1231 widget->allocation.height);
1235 gtk_widget_unparent (GtkWidget *widget)
1237 GtkWidget *toplevel;
1238 GtkWidget *old_parent;
1240 g_return_if_fail (widget != NULL);
1241 g_return_if_fail (GTK_IS_WIDGET (widget));
1242 if (widget->parent == NULL)
1245 /* keep this function in sync with gtk_menu_detach()
1248 /* unset focused and default children properly, this code
1249 * should eventually move into some gtk_window_unparent_branch() or
1253 toplevel = gtk_widget_get_toplevel (widget);
1254 if (GTK_CONTAINER (widget->parent)->focus_child == widget)
1256 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL);
1258 if (GTK_IS_WINDOW (toplevel))
1262 child = GTK_WINDOW (toplevel)->focus_widget;
1264 while (child && child != widget)
1265 child = child->parent;
1267 if (child == widget)
1268 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1271 if (GTK_IS_WINDOW (toplevel))
1275 child = GTK_WINDOW (toplevel)->default_widget;
1277 while (child && child != widget)
1278 child = child->parent;
1280 if (child == widget)
1281 gtk_window_set_default (GTK_WINDOW (toplevel), NULL);
1284 if (GTK_WIDGET_REDRAW_PENDING (widget))
1285 gtk_widget_redraw_queue_remove (widget);
1287 if (GTK_IS_RESIZE_CONTAINER (widget))
1288 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1290 /* Remove the widget and all its children from any ->resize_widgets list
1291 * of all the parents in our branch. This code should move into gtkcontainer.c
1292 * somwhen, since we mess around with ->resize_widgets, which is
1293 * actually not of our business.
1295 * Two ways to make this prettier:
1296 * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer))
1297 * Change resize_widgets to a GList
1299 toplevel = widget->parent;
1305 if (!GTK_CONTAINER (toplevel)->resize_widgets)
1307 toplevel = toplevel->parent;
1312 slist = GTK_CONTAINER (toplevel)->resize_widgets;
1324 while (parent && (parent != widget))
1325 parent = parent->parent;
1327 if (parent == widget)
1329 GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED);
1335 /* it is really messy to have this signal disconnection
1336 * in gtkwidget.c, the resize_widgets invariants should
1337 * all be taken care off by gtkcontainer.c exclusively.
1340 gtk_signal_disconnect_by_func (GTK_OBJECT (toplevel),
1341 GTK_SIGNAL_FUNC (gtk_container_clear_resize_widgets),
1343 GTK_CONTAINER (toplevel)->resize_widgets = slist;
1346 g_slist_free_1 (last);
1352 toplevel = toplevel->parent;
1355 gtk_widget_queue_clear_child (widget);
1357 /* Reset the width and height here, to force reallocation if we
1358 * get added back to a new parent. This won't work if our new
1359 * allocation is smaller than 1x1 and we actually want a size of 1x1...
1360 * (would 0x0 be OK here?)
1362 widget->allocation.width = 1;
1363 widget->allocation.height = 1;
1365 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1366 gtk_widget_unrealize (widget);
1368 old_parent = widget->parent;
1369 widget->parent = NULL;
1370 gtk_widget_set_parent_window (widget, NULL);
1371 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1373 gtk_widget_unref (widget);
1376 /*****************************************
1377 * gtk_widget_destroy:
1382 *****************************************/
1385 gtk_widget_destroy (GtkWidget *widget)
1387 g_return_if_fail (widget != NULL);
1388 g_return_if_fail (GTK_IS_WIDGET (widget));
1389 g_return_if_fail (GTK_OBJECT_CONSTRUCTED (widget));
1391 gtk_object_destroy ((GtkObject*) widget);
1394 /*****************************************
1395 * gtk_widget_destroyed:
1396 * Utility function: sets widget_pointer
1397 * to NULL when widget is destroyed.
1402 *****************************************/
1405 gtk_widget_destroyed (GtkWidget *widget,
1406 GtkWidget **widget_pointer)
1408 /* Don't make any assumptions about the
1410 * Even check widget_pointer.
1413 *widget_pointer = NULL;
1416 /*****************************************
1422 *****************************************/
1425 gtk_widget_show (GtkWidget *widget)
1427 g_return_if_fail (widget != NULL);
1428 g_return_if_fail (GTK_IS_WIDGET (widget));
1430 if (!GTK_WIDGET_VISIBLE (widget))
1432 gtk_widget_queue_resize (widget);
1433 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1438 gtk_widget_real_show (GtkWidget *widget)
1440 g_return_if_fail (widget != NULL);
1441 g_return_if_fail (GTK_IS_WIDGET (widget));
1443 if (!GTK_WIDGET_VISIBLE (widget))
1445 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
1447 if (widget->parent && GTK_WIDGET_MAPPED (widget->parent))
1448 gtk_widget_map (widget);
1452 /*************************************************************
1453 * gtk_widget_show_now:
1454 * Show a widget, and if it is an unmapped toplevel widget
1455 * wait for the map_event before returning
1457 * Warning: This routine will call the main loop recursively.
1462 *************************************************************/
1465 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
1468 gtk_signal_disconnect_by_data (GTK_OBJECT (widget), flag);
1472 gtk_widget_show_now (GtkWidget *widget)
1476 g_return_if_fail (widget != NULL);
1477 g_return_if_fail (GTK_IS_WIDGET (widget));
1479 /* make sure we will get event */
1480 if (!GTK_WIDGET_MAPPED (widget) &&
1481 GTK_WIDGET_TOPLEVEL (widget))
1483 gtk_widget_show (widget);
1485 gtk_signal_connect (GTK_OBJECT (widget), "map_event",
1486 GTK_SIGNAL_FUNC (gtk_widget_show_map_callback),
1490 gtk_main_iteration();
1493 gtk_widget_show (widget);
1496 /*****************************************
1502 *****************************************/
1505 gtk_widget_hide (GtkWidget *widget)
1507 g_return_if_fail (widget != NULL);
1508 g_return_if_fail (GTK_IS_WIDGET (widget));
1510 if (GTK_WIDGET_VISIBLE (widget))
1512 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1513 gtk_widget_queue_resize (widget);
1518 gtk_widget_real_hide (GtkWidget *widget)
1520 g_return_if_fail (widget != NULL);
1521 g_return_if_fail (GTK_IS_WIDGET (widget));
1523 if (GTK_WIDGET_VISIBLE (widget))
1525 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
1527 if (GTK_WIDGET_MAPPED (widget))
1528 gtk_widget_unmap (widget);
1533 gtk_widget_hide_on_delete (GtkWidget *widget)
1535 g_return_val_if_fail (widget != NULL, FALSE);
1536 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
1538 gtk_widget_hide (widget);
1544 gtk_widget_show_all (GtkWidget *widget)
1546 GtkWidgetClass *class;
1548 g_return_if_fail (widget != NULL);
1549 g_return_if_fail (GTK_IS_WIDGET (widget));
1551 class = GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass);
1553 if (class->show_all)
1554 class->show_all (widget);
1558 gtk_widget_hide_all (GtkWidget *widget)
1560 GtkWidgetClass *class;
1562 g_return_if_fail (widget != NULL);
1563 g_return_if_fail (GTK_IS_WIDGET (widget));
1565 class = GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass);
1567 if (class->hide_all)
1568 class->hide_all (widget);
1571 /*****************************************
1577 *****************************************/
1580 gtk_widget_map (GtkWidget *widget)
1582 g_return_if_fail (widget != NULL);
1583 g_return_if_fail (GTK_IS_WIDGET (widget));
1585 if (!GTK_WIDGET_MAPPED (widget))
1587 if (!GTK_WIDGET_REALIZED (widget))
1588 gtk_widget_realize (widget);
1590 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1592 if (GTK_WIDGET_NO_WINDOW (widget))
1593 gtk_widget_queue_draw (widget);
1597 /*****************************************
1603 *****************************************/
1606 gtk_widget_unmap (GtkWidget *widget)
1608 g_return_if_fail (widget != NULL);
1609 g_return_if_fail (GTK_IS_WIDGET (widget));
1611 if (GTK_WIDGET_MAPPED (widget))
1613 if (GTK_WIDGET_NO_WINDOW (widget))
1614 gtk_widget_queue_clear_child (widget);
1615 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1619 /*****************************************
1620 * gtk_widget_realize:
1625 *****************************************/
1628 gtk_widget_realize (GtkWidget *widget)
1631 GdkExtensionMode mode;
1632 GtkWidgetShapeInfo *shape_info;
1634 g_return_if_fail (widget != NULL);
1635 g_return_if_fail (GTK_IS_WIDGET (widget));
1637 if (!GTK_WIDGET_REALIZED (widget))
1640 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1641 g_message ("gtk_widget_realize(%s)", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1644 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1645 gtk_widget_realize (widget->parent);
1647 gtk_widget_ensure_style (widget);
1649 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1651 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1653 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1655 gdk_window_shape_combine_mask (widget->window,
1656 shape_info->shape_mask,
1657 shape_info->offset_x,
1658 shape_info->offset_y);
1661 if (!GTK_WIDGET_NO_WINDOW (widget))
1663 mode = gtk_widget_get_extension_events (widget);
1664 if (mode != GDK_EXTENSION_EVENTS_NONE)
1666 events = gtk_widget_get_events (widget);
1667 gdk_input_set_extension_events (widget->window, events, mode);
1674 /*****************************************
1675 * gtk_widget_unrealize:
1680 *****************************************/
1683 gtk_widget_unrealize (GtkWidget *widget)
1685 g_return_if_fail (widget != NULL);
1686 g_return_if_fail (GTK_IS_WIDGET (widget));
1688 if (GTK_WIDGET_REDRAW_PENDING (widget))
1689 gtk_widget_redraw_queue_remove (widget);
1691 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1692 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
1694 if (GTK_WIDGET_REALIZED (widget))
1696 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1697 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
1701 /*****************************************
1702 * gtk_widget_queue_draw:
1707 *****************************************/
1709 typedef struct _GtkDrawData GtkDrawData;
1710 struct _GtkDrawData {
1715 static GMemChunk *draw_data_mem_chunk = NULL;
1716 static GSList *draw_data_free_list = NULL;
1717 static const gchar *draw_data_key = "gtk-draw-data";
1718 static GQuark draw_data_key_id = 0;
1719 static const gchar *draw_data_tmp_key = "gtk-draw-data-tmp";
1720 static GQuark draw_data_tmp_key_id = 0;
1722 static gint gtk_widget_idle_draw (gpointer data);
1725 gtk_widget_queue_draw_data (GtkWidget *widget,
1735 g_return_if_fail (widget != NULL);
1737 if ((width != 0) && (height != 0) && GTK_WIDGET_DRAWABLE (widget))
1739 if (!draw_data_key_id)
1740 draw_data_key_id = g_quark_from_static_string (draw_data_key);
1742 if (draw_data_free_list)
1744 node = draw_data_free_list;
1746 draw_data_free_list = draw_data_free_list->next;
1750 if (!draw_data_mem_chunk)
1751 draw_data_mem_chunk = g_mem_chunk_create (GtkDrawData, 64,
1753 data = g_chunk_new (GtkDrawData, draw_data_mem_chunk);
1754 node = g_slist_alloc();
1761 if ((width < 0) || (height < 0))
1763 data->rect.width = 0;
1764 data->rect.height = 0;
1768 data->rect.width = width;
1769 data->rect.height = height;
1771 data->window = window;
1773 if ((width < 0) || (height < 0))
1775 GSList *draw_data_list =
1776 gtk_object_get_data_by_id (GTK_OBJECT (widget),
1779 draw_data_free_list = g_slist_concat (draw_data_list,
1780 draw_data_free_list);
1784 node->next = gtk_object_get_data_by_id (GTK_OBJECT (widget),
1787 if (!GTK_WIDGET_REDRAW_PENDING (widget))
1789 GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_PENDING);
1790 if (gtk_widget_redraw_queue == NULL)
1791 gtk_idle_add_priority (GTK_PRIORITY_REDRAW,
1792 gtk_widget_idle_draw,
1794 gtk_widget_redraw_queue = g_slist_prepend (gtk_widget_redraw_queue, widget);
1797 gtk_object_set_data_by_id (GTK_OBJECT (widget), draw_data_key_id, node);
1802 gtk_widget_queue_draw_area (GtkWidget *widget,
1808 g_return_if_fail (widget != NULL);
1809 g_return_if_fail (GTK_IS_WIDGET (widget));
1811 if (widget->window && gdk_window_is_viewable (widget->window))
1812 gtk_widget_queue_draw_data (widget, x, y, width, height, NULL);
1816 gtk_widget_queue_draw (GtkWidget *widget)
1818 g_return_if_fail (widget != NULL);
1819 g_return_if_fail (GTK_IS_WIDGET (widget));
1821 if (widget->window && gdk_window_is_viewable (widget->window))
1822 gtk_widget_queue_draw_data (widget, 0, 0, -1, -1, NULL);
1826 gtk_widget_queue_clear_area (GtkWidget *widget,
1834 g_return_if_fail (widget != NULL);
1835 g_return_if_fail (GTK_IS_WIDGET (widget));
1837 if (!(widget->window && gdk_window_is_viewable (widget->window)))
1840 /* Find the correct widget */
1842 if (GTK_WIDGET_NO_WINDOW (widget))
1845 while (parent && GTK_WIDGET_NO_WINDOW (parent))
1846 parent = parent->parent;
1849 gtk_widget_queue_draw_data (parent, x, y, width, height, widget->window);
1853 gint wx, wy, wwidth, wheight;
1854 /* Translate widget relative to window-relative */
1856 gdk_window_get_position (widget->window, &wx, &wy);
1857 x -= wx - widget->allocation.x;
1858 y -= wy - widget->allocation.y;
1860 gdk_window_get_size (widget->window, &wwidth, &wheight);
1870 if (x + width > wwidth)
1872 if (y + height > wheight)
1873 height = wheight - y;
1875 gtk_widget_queue_draw_data (widget, x, y, width, height, NULL);
1880 gtk_widget_redraw_queue_remove (GtkWidget *widget)
1882 GSList *draw_data_list;
1885 g_return_if_fail (GTK_WIDGET_REDRAW_PENDING (widget));
1887 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1889 draw_data_list = gtk_object_get_data_by_id (GTK_OBJECT (widget),
1891 tmp_list = g_slist_last (draw_data_list);
1894 tmp_list->next = draw_data_free_list;
1895 draw_data_free_list = draw_data_list;
1898 gtk_object_set_data_by_id (GTK_OBJECT (widget),
1902 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1906 gtk_widget_queue_clear (GtkWidget *widget)
1908 g_return_if_fail (widget != NULL);
1909 g_return_if_fail (GTK_IS_WIDGET (widget));
1911 if (widget->allocation.width || widget->allocation.height)
1913 if (GTK_WIDGET_NO_WINDOW (widget))
1914 gtk_widget_queue_clear_area (widget, widget->allocation.x,
1915 widget->allocation.y,
1916 widget->allocation.width,
1917 widget->allocation.height);
1919 gtk_widget_queue_clear_area (widget, 0, 0,
1920 widget->allocation.width,
1921 widget->allocation.height);
1926 gtk_widget_draw_data_combine (GtkDrawData *parent, GtkDrawData *child)
1928 gint parent_x2, parent_y2;
1929 gint child_x2, child_y2;
1931 /* Check for intersection */
1933 parent_x2 = parent->rect.x + parent->rect.width;
1934 child_x2 = child->rect.x + child->rect.width;
1935 parent_y2 = parent->rect.y + parent->rect.height;
1936 child_y2 = child->rect.y + child->rect.height;
1938 if ((child->rect.x > parent_x2) || (parent->rect.x > child_x2) ||
1939 (child->rect.y > parent_y2) || (parent->rect.y > child_y2))
1943 parent->rect.x = MIN (parent->rect.x, child->rect.x);
1944 parent->rect.y = MIN (parent->rect.y, child->rect.y);
1945 parent->rect.width = MAX (parent_x2, child_x2) - parent->rect.x;
1946 parent->rect.height = MAX (parent_y2, child_y2) - parent->rect.y;
1952 /* Take a rectangle with respect to window, and translate it
1953 * to coordinates relative to widget's allocation, clipping through
1954 * intermediate windows. Returns whether translation failed. If the
1955 * translation failed, we have something like a handlebox, where
1956 * the child widget's GdkWindow is not a child of the parents GdkWindow.
1959 gtk_widget_clip_rect (GtkWidget *widget,
1965 gint x,y, width, height;
1967 while (window && (window != widget->window))
1969 gdk_window_get_position (window, &x, &y);
1977 window = gdk_window_get_parent (window);
1981 gdk_window_get_size (window, &width, &height);
1985 rect->width = (rect->width > -rect->x) ? rect->width + rect->x : 0;
1990 rect->height = (rect->height > -rect->y) ? rect->width + rect->y : 0;
1993 if (rect->x + rect->width > width)
1994 rect->width = (width > rect->x) ? width - rect->x : 0;
1995 if (rect->y + rect->height > height)
1996 rect->height = (height > rect->y) ? height - rect->y : 0;
2002 if (!GTK_WIDGET_NO_WINDOW (widget))
2004 if (gdk_window_get_toplevel (window) != window)
2006 gdk_window_get_position (window, &x, &y);
2007 rect->x += x - widget->allocation.x;
2009 *x_offset += x - widget->allocation.x;
2010 rect->y += y - widget->allocation.y;
2012 *y_offset += y - widget->allocation.y;
2020 gtk_widget_idle_draw (gpointer cb_data)
2022 GSList *widget_list;
2024 GSList *draw_data_list;
2027 if (!draw_data_tmp_key_id)
2028 draw_data_tmp_key_id = g_quark_from_static_string (draw_data_tmp_key);
2030 GDK_THREADS_ENTER ();
2032 old_queue = gtk_widget_redraw_queue;
2033 gtk_widget_redraw_queue = NULL;
2035 /* Translate all draw requests to be allocation-relative.
2036 * At the same time, move all the data out of the way,
2037 * so when we get down to the draw step, we can queue
2038 * more information for "next time", if the application
2039 * is that foolhardy.
2041 widget_list = old_queue;
2045 widget = widget_list->data;
2046 draw_data_list = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2048 gtk_object_set_data_by_id (GTK_OBJECT (widget),
2051 gtk_object_set_data_by_id (GTK_OBJECT (widget),
2052 draw_data_tmp_key_id,
2055 /* XXX: Since we are unsetting this flag here, further
2056 * down the only way we can check if a redraw is queued
2057 * on a given widget is by calling gtk_object_get_data.
2058 * for speed purposes we might well want a private
2059 * flag GTK_REDRAW_PROCESSING or something.
2061 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
2063 while (draw_data_list)
2065 gboolean full_allocation = FALSE;
2066 GtkDrawData *data = draw_data_list->data;
2070 /* If the translation fails, we have a handlebox,
2071 * so redraw the whole widget. Could be done better?
2073 full_allocation = !gtk_widget_clip_rect (widget,
2077 data->window = NULL;
2081 if ((data->rect.width == 0) && (data->rect.height == 0))
2083 if (GTK_WIDGET_NO_WINDOW (widget))
2085 data->rect.x = widget->allocation.x;
2086 data->rect.y = widget->allocation.y;
2093 data->rect.width = widget->allocation.width;
2094 data->rect.height = widget->allocation.height;
2098 draw_data_list = draw_data_list->next;
2101 widget_list = widget_list->next;
2104 /* Coalesce redraws.
2106 widget_list = old_queue;
2109 GSList *prev_node = NULL;
2110 widget = widget_list->data;
2111 draw_data_list = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2112 draw_data_tmp_key_id);
2114 while (draw_data_list)
2116 gint x_offset, y_offset;
2117 GtkDrawData *data = draw_data_list->data;
2118 GSList *parent_list = draw_data_list->next;
2130 if (gtk_widget_draw_data_combine (parent_list->data, data))
2134 prev_node->next = draw_data_list->next;
2136 gtk_object_set_data_by_id (GTK_OBJECT (widget),
2137 draw_data_tmp_key_id,
2138 draw_data_list->next);
2140 tmp = draw_data_list->next;
2141 draw_data_list->next = draw_data_free_list;
2142 draw_data_free_list = draw_data_list;
2143 draw_data_list = tmp;
2148 parent_list = parent_list->next;
2151 window = parent->window;
2153 if (parent->parent && parent->parent->window != window)
2155 if (!GTK_WIDGET_NO_WINDOW (parent))
2158 gdk_window_get_position (window, &x, &y);
2159 data->rect.x -= x - parent->allocation.x;
2160 x_offset -= x - parent->allocation.x;
2161 data->rect.y -= y - parent->allocation.y;
2162 y_offset -= y - parent->allocation.y;
2164 /* If we can't translate the rectangle, stop trying to
2165 * merge. (This occurs for a handlebox)
2167 if (!gtk_widget_clip_rect (parent->parent, window, &data->rect,
2168 &x_offset, &y_offset))
2173 parent = parent->parent;
2176 parent_list = gtk_object_get_data_by_id (GTK_OBJECT (parent),
2177 draw_data_tmp_key_id);
2182 /* OK, this rectangle stays around. But take advantage
2183 * of the work we've done to clip it to the visible area -
2184 * rect.width/height have already been appropriately
2187 data->rect.x -= x_offset;
2188 data->rect.y -= y_offset;
2191 prev_node = draw_data_list;
2193 draw_data_list = draw_data_list->next;
2197 widget_list = widget_list->next;
2200 /* Process the draws */
2202 widget_list = old_queue;
2206 widget = widget_list->data;
2207 draw_data_list = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2208 draw_data_tmp_key_id);
2209 gtk_object_set_data_by_id (GTK_OBJECT (widget),
2210 draw_data_tmp_key_id,
2213 while (draw_data_list)
2215 GtkDrawData *data = draw_data_list->data;
2216 if ((data->rect.width != 0) || (data->rect.height != 0))
2217 gtk_widget_draw (widget, &data->rect);
2219 if (draw_data_list->next)
2220 draw_data_list = draw_data_list->next;
2223 draw_data_list->next = draw_data_free_list;
2224 draw_data_free_list = draw_data_list;
2229 widget_list = widget_list->next;
2232 g_slist_free (old_queue);
2234 GDK_THREADS_LEAVE ();
2240 gtk_widget_queue_resize (GtkWidget *widget)
2242 g_return_if_fail (widget != NULL);
2243 g_return_if_fail (GTK_IS_WIDGET (widget));
2245 if (GTK_IS_RESIZE_CONTAINER (widget))
2246 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
2248 if (GTK_WIDGET_DRAWABLE (widget))
2249 gtk_widget_queue_clear (widget);
2252 gtk_container_queue_resize (GTK_CONTAINER (widget->parent));
2253 else if (GTK_WIDGET_TOPLEVEL (widget))
2254 gtk_container_queue_resize (GTK_CONTAINER (widget));
2257 /*****************************************
2263 *****************************************/
2266 gtk_widget_draw (GtkWidget *widget,
2269 GdkRectangle temp_area;
2271 g_return_if_fail (widget != NULL);
2272 g_return_if_fail (GTK_IS_WIDGET (widget));
2274 if (GTK_WIDGET_DRAWABLE (widget))
2278 if (GTK_WIDGET_NO_WINDOW (widget))
2280 temp_area.x = widget->allocation.x;
2281 temp_area.y = widget->allocation.y;
2289 temp_area.width = widget->allocation.width;
2290 temp_area.height = widget->allocation.height;
2294 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
2298 /*****************************************
2299 * gtk_widget_draw_focus:
2304 *****************************************/
2307 gtk_widget_draw_focus (GtkWidget *widget)
2309 g_return_if_fail (widget != NULL);
2310 g_return_if_fail (GTK_IS_WIDGET (widget));
2312 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
2315 /*****************************************
2316 * gtk_widget_draw_default:
2321 *****************************************/
2324 gtk_widget_draw_default (GtkWidget *widget)
2326 g_return_if_fail (widget != NULL);
2327 g_return_if_fail (GTK_IS_WIDGET (widget));
2329 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
2332 /*****************************************
2333 * gtk_widget_size_request:
2338 *****************************************/
2341 gtk_widget_size_request (GtkWidget *widget,
2342 GtkRequisition *requisition)
2344 GtkWidgetAuxInfo *aux_info;
2346 g_return_if_fail (widget != NULL);
2347 g_return_if_fail (GTK_IS_WIDGET (widget));
2349 gtk_widget_ref (widget);
2350 gtk_widget_ensure_style (widget);
2351 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
2353 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2356 if (aux_info->width > 0)
2357 requisition->width = aux_info->width;
2358 if (aux_info->height > 0)
2359 requisition->height = aux_info->height;
2361 gtk_widget_unref (widget);
2364 /*****************************************
2365 * gtk_widget_size_allocate:
2370 *****************************************/
2373 gtk_widget_size_allocate (GtkWidget *widget,
2374 GtkAllocation *allocation)
2376 GtkWidgetAuxInfo *aux_info;
2377 GtkAllocation real_allocation;
2378 gboolean needs_draw = FALSE;
2380 g_return_if_fail (widget != NULL);
2381 g_return_if_fail (GTK_IS_WIDGET (widget));
2383 real_allocation = *allocation;
2384 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2388 if (aux_info->x != -1)
2389 real_allocation.x = aux_info->x;
2390 if (aux_info->y != -1)
2391 real_allocation.y = aux_info->y;
2394 if (GTK_WIDGET_NO_WINDOW (widget))
2396 if (widget->allocation.x != real_allocation.x ||
2397 widget->allocation.y != real_allocation.y ||
2398 widget->allocation.width != real_allocation.width ||
2399 widget->allocation.height != real_allocation.height)
2401 gtk_widget_queue_clear_child (widget);
2405 else if (widget->allocation.width != real_allocation.width ||
2406 widget->allocation.height != real_allocation.height)
2411 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
2414 gtk_widget_queue_draw (widget);
2418 gtk_widget_real_size_allocate (GtkWidget *widget,
2419 GtkAllocation *allocation)
2421 g_return_if_fail (widget != NULL);
2422 g_return_if_fail (GTK_IS_WIDGET (widget));
2424 widget->allocation = *allocation;
2426 if (GTK_WIDGET_REALIZED (widget) &&
2427 !GTK_WIDGET_NO_WINDOW (widget))
2429 gdk_window_move_resize (widget->window,
2430 allocation->x, allocation->y,
2431 allocation->width, allocation->height);
2436 gtk_widget_stop_add_accelerator (GtkWidget *widget)
2438 g_return_if_fail (widget != NULL);
2439 g_return_if_fail (GTK_IS_WIDGET (widget));
2441 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
2445 gtk_widget_stop_remove_accelerator (GtkWidget *widget)
2447 g_return_if_fail (widget != NULL);
2448 g_return_if_fail (GTK_IS_WIDGET (widget));
2450 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR]);
2454 gtk_widget_lock_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_connect (GTK_OBJECT (widget),
2467 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2469 gtk_signal_connect (GTK_OBJECT (widget),
2470 "remove_accelerator",
2471 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
2477 gtk_widget_unlock_accelerators (GtkWidget *widget)
2479 g_return_if_fail (widget != NULL);
2480 g_return_if_fail (GTK_IS_WIDGET (widget));
2482 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
2483 widget_signals[ADD_ACCELERATOR],
2485 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2488 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
2489 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2491 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
2492 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
2498 gtk_widget_add_accelerator (GtkWidget *widget,
2499 const gchar *accel_signal,
2500 GtkAccelGroup *accel_group,
2503 GtkAccelFlags accel_flags)
2505 g_return_if_fail (widget != NULL);
2506 g_return_if_fail (GTK_IS_WIDGET (widget));
2507 g_return_if_fail (accel_group != NULL);
2509 gtk_accel_group_add (accel_group,
2513 (GtkObject*) widget,
2518 gtk_widget_remove_accelerator (GtkWidget *widget,
2519 GtkAccelGroup *accel_group,
2523 g_return_if_fail (widget != NULL);
2524 g_return_if_fail (GTK_IS_WIDGET (widget));
2525 g_return_if_fail (accel_group != NULL);
2527 gtk_accel_group_remove (accel_group,
2530 (GtkObject*) widget);
2534 gtk_widget_remove_accelerators (GtkWidget *widget,
2535 const gchar *accel_signal,
2536 gboolean visible_only)
2541 g_return_if_fail (widget != NULL);
2542 g_return_if_fail (GTK_IS_WIDGET (widget));
2543 g_return_if_fail (accel_signal != NULL);
2545 signal_id = gtk_signal_lookup (accel_signal, GTK_OBJECT_TYPE (widget));
2546 g_return_if_fail (signal_id != 0);
2548 slist = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
2551 GtkAccelEntry *ac_entry;
2553 ac_entry = slist->data;
2554 slist = slist->next;
2555 if (ac_entry->accel_flags & GTK_ACCEL_VISIBLE &&
2556 ac_entry->signal_id == signal_id)
2557 gtk_widget_remove_accelerator (GTK_WIDGET (widget),
2558 ac_entry->accel_group,
2559 ac_entry->accelerator_key,
2560 ac_entry->accelerator_mods);
2565 gtk_widget_accelerator_signal (GtkWidget *widget,
2566 GtkAccelGroup *accel_group,
2570 GtkAccelEntry *ac_entry;
2572 g_return_val_if_fail (widget != NULL, 0);
2573 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
2574 g_return_val_if_fail (accel_group != NULL, 0);
2576 ac_entry = gtk_accel_group_get_entry (accel_group, accel_key, accel_mods);
2578 if (ac_entry && ac_entry->object == (GtkObject*) widget)
2579 return ac_entry->signal_id;
2584 gtk_widget_real_key_press_event (GtkWidget *widget,
2587 gboolean handled = FALSE;
2589 g_return_val_if_fail (widget != NULL, handled);
2590 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
2591 g_return_val_if_fail (event != NULL, handled);
2594 handled = gtk_bindings_activate (GTK_OBJECT (widget),
2602 gtk_widget_real_key_release_event (GtkWidget *widget,
2605 gboolean handled = FALSE;
2607 g_return_val_if_fail (widget != NULL, handled);
2608 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
2609 g_return_val_if_fail (event != NULL, handled);
2612 handled = gtk_bindings_activate (GTK_OBJECT (widget),
2614 event->state | GDK_RELEASE_MASK);
2619 /*****************************************
2625 *****************************************/
2628 gtk_widget_event (GtkWidget *widget,
2634 g_return_val_if_fail (widget != NULL, TRUE);
2635 g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
2637 gtk_widget_ref (widget);
2639 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
2641 if (return_val || GTK_OBJECT_DESTROYED (widget))
2643 gtk_widget_unref (widget);
2647 switch (event->type)
2652 case GDK_BUTTON_PRESS:
2653 case GDK_2BUTTON_PRESS:
2654 case GDK_3BUTTON_PRESS:
2655 signal_num = BUTTON_PRESS_EVENT;
2657 case GDK_BUTTON_RELEASE:
2658 signal_num = BUTTON_RELEASE_EVENT;
2660 case GDK_MOTION_NOTIFY:
2661 signal_num = MOTION_NOTIFY_EVENT;
2664 signal_num = DELETE_EVENT;
2667 signal_num = DESTROY_EVENT;
2670 signal_num = KEY_PRESS_EVENT;
2672 case GDK_KEY_RELEASE:
2673 signal_num = KEY_RELEASE_EVENT;
2675 case GDK_ENTER_NOTIFY:
2676 signal_num = ENTER_NOTIFY_EVENT;
2678 case GDK_LEAVE_NOTIFY:
2679 signal_num = LEAVE_NOTIFY_EVENT;
2681 case GDK_FOCUS_CHANGE:
2682 if (event->focus_change.in)
2683 signal_num = FOCUS_IN_EVENT;
2685 signal_num = FOCUS_OUT_EVENT;
2688 signal_num = CONFIGURE_EVENT;
2691 signal_num = MAP_EVENT;
2694 signal_num = UNMAP_EVENT;
2696 case GDK_PROPERTY_NOTIFY:
2697 signal_num = PROPERTY_NOTIFY_EVENT;
2699 case GDK_SELECTION_CLEAR:
2700 signal_num = SELECTION_CLEAR_EVENT;
2702 case GDK_SELECTION_REQUEST:
2703 signal_num = SELECTION_REQUEST_EVENT;
2705 case GDK_SELECTION_NOTIFY:
2706 signal_num = SELECTION_NOTIFY_EVENT;
2708 case GDK_PROXIMITY_IN:
2709 signal_num = PROXIMITY_IN_EVENT;
2711 case GDK_PROXIMITY_OUT:
2712 signal_num = PROXIMITY_OUT_EVENT;
2715 signal_num = NO_EXPOSE_EVENT;
2717 case GDK_CLIENT_EVENT:
2718 signal_num = CLIENT_EVENT;
2721 /* there is no sense in providing a widget with bogus expose events.
2723 if (!event->any.window)
2725 gtk_widget_unref (widget);
2728 signal_num = EXPOSE_EVENT;
2730 case GDK_VISIBILITY_NOTIFY:
2731 signal_num = VISIBILITY_NOTIFY_EVENT;
2734 g_warning ("could not determine signal number for event: %d", event->type);
2735 gtk_widget_unref (widget);
2739 if (signal_num != -1)
2740 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
2742 return_val |= GTK_OBJECT_DESTROYED (widget);
2744 gtk_widget_unref (widget);
2749 /*****************************************
2750 * gtk_widget_activate:
2755 *****************************************/
2758 gtk_widget_activate (GtkWidget *widget)
2760 g_return_val_if_fail (widget != NULL, FALSE);
2761 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2763 if (WIDGET_CLASS (widget)->activate_signal)
2765 /* FIXME: we should eventually check the signals signature here */
2766 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
2775 gtk_widget_set_scroll_adjustments (GtkWidget *widget,
2776 GtkAdjustment *hadjustment,
2777 GtkAdjustment *vadjustment)
2779 g_return_val_if_fail (widget != NULL, FALSE);
2780 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2782 g_return_val_if_fail (GTK_IS_ADJUSTMENT (hadjustment), FALSE);
2784 g_return_val_if_fail (GTK_IS_ADJUSTMENT (vadjustment), FALSE);
2786 if (WIDGET_CLASS (widget)->set_scroll_adjustments_signal)
2788 /* FIXME: we should eventually check the signals signature here */
2789 gtk_signal_emit (GTK_OBJECT (widget),
2790 WIDGET_CLASS (widget)->set_scroll_adjustments_signal,
2791 hadjustment, vadjustment);
2798 /*****************************************
2799 * gtk_widget_reparent_container_child:
2800 * assistent function to gtk_widget_reparent
2805 *****************************************/
2808 gtk_widget_reparent_container_child (GtkWidget *widget,
2809 gpointer client_data)
2811 g_return_if_fail (widget != NULL);
2812 g_return_if_fail (GTK_IS_WIDGET (widget));
2813 g_return_if_fail (client_data != NULL);
2815 if (GTK_WIDGET_NO_WINDOW (widget))
2818 gdk_window_unref (widget->window);
2819 widget->window = (GdkWindow*) client_data;
2821 gdk_window_ref (widget->window);
2823 if (GTK_IS_CONTAINER (widget))
2824 gtk_container_forall (GTK_CONTAINER (widget),
2825 gtk_widget_reparent_container_child,
2829 gdk_window_reparent (widget->window,
2830 (GdkWindow*) client_data, 0, 0);
2833 /*****************************************
2834 * gtk_widget_reparent:
2839 *****************************************/
2842 gtk_widget_reparent (GtkWidget *widget,
2843 GtkWidget *new_parent)
2845 g_return_if_fail (widget != NULL);
2846 g_return_if_fail (GTK_IS_WIDGET (widget));
2847 g_return_if_fail (new_parent != NULL);
2848 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
2849 g_return_if_fail (widget->parent != NULL);
2851 if (widget->parent != new_parent)
2853 /* First try to see if we can get away without unrealizing
2854 * the widget as we reparent it. if so we set a flag so
2855 * that gtk_widget_unparent doesn't unrealize widget
2857 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
2858 GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
2860 gtk_widget_ref (widget);
2861 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
2862 gtk_container_add (GTK_CONTAINER (new_parent), widget);
2863 gtk_widget_unref (widget);
2865 if (GTK_WIDGET_IN_REPARENT (widget))
2867 GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
2869 /* OK, now fix up the widget's window. (And that for any
2870 * children, if the widget is NO_WINDOW and a container)
2872 if (GTK_WIDGET_NO_WINDOW (widget))
2874 if (GTK_IS_CONTAINER (widget))
2875 gtk_container_forall (GTK_CONTAINER (widget),
2876 gtk_widget_reparent_container_child,
2877 gtk_widget_get_parent_window (widget));
2880 GdkWindow *parent_window;
2882 parent_window = gtk_widget_get_parent_window (widget);
2883 if (parent_window != widget->window)
2886 gdk_window_unref (widget->window);
2887 widget->window = parent_window;
2889 gdk_window_ref (widget->window);
2894 gdk_window_reparent (widget->window, gtk_widget_get_parent_window (widget), 0, 0);
2899 /*****************************************
2905 *****************************************/
2908 gtk_widget_popup (GtkWidget *widget,
2912 g_return_if_fail (widget != NULL);
2913 g_return_if_fail (GTK_IS_WIDGET (widget));
2915 if (!GTK_WIDGET_VISIBLE (widget))
2917 if (!GTK_WIDGET_REALIZED (widget))
2918 gtk_widget_realize (widget);
2919 if (!GTK_WIDGET_NO_WINDOW (widget))
2920 gdk_window_move (widget->window, x, y);
2921 gtk_widget_show (widget);
2925 /*****************************************
2926 * gtk_widget_intersect:
2931 *****************************************/
2934 gtk_widget_intersect (GtkWidget *widget,
2936 GdkRectangle *intersection)
2942 g_return_val_if_fail (widget != NULL, FALSE);
2943 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2944 g_return_val_if_fail (area != NULL, FALSE);
2947 dest = intersection;
2951 return_val = gdk_rectangle_intersect ((GdkRectangle*) &widget->allocation, area, dest);
2953 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2955 intersection->x -= widget->allocation.x;
2956 intersection->y -= widget->allocation.y;
2962 /*****************************************
2963 * gtk_widget_grab_focus:
2968 *****************************************/
2971 gtk_widget_grab_focus (GtkWidget *widget)
2973 g_return_if_fail (widget != NULL);
2974 g_return_if_fail (GTK_IS_WIDGET (widget));
2976 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[GRAB_FOCUS]);
2980 reset_focus_recurse (GtkWidget *widget,
2983 if (GTK_IS_CONTAINER (widget))
2985 GtkContainer *container;
2987 container = GTK_CONTAINER (widget);
2988 gtk_container_set_focus_child (container, NULL);
2990 gtk_container_foreach (container,
2991 reset_focus_recurse,
2997 gtk_widget_real_grab_focus (GtkWidget *focus_widget)
2999 g_return_if_fail (focus_widget != NULL);
3000 g_return_if_fail (GTK_IS_WIDGET (focus_widget));
3002 if (GTK_WIDGET_CAN_FOCUS (focus_widget))
3004 GtkWidget *toplevel;
3007 /* clear the current focus setting, break if the current widget
3008 * is the focus widget's parent, since containers above that will
3009 * be set by the next loop.
3011 toplevel = gtk_widget_get_toplevel (focus_widget);
3012 if (GTK_IS_WINDOW (toplevel))
3014 widget = GTK_WINDOW (toplevel)->focus_widget;
3016 if (widget == focus_widget)
3021 while (widget->parent && widget->parent != focus_widget->parent)
3023 widget = widget->parent;
3024 gtk_container_set_focus_child (GTK_CONTAINER (widget), NULL);
3028 else if (toplevel != focus_widget)
3030 /* gtk_widget_grab_focus() operates on a tree without window...
3031 * actually, this is very questionable behaviour.
3034 gtk_container_foreach (GTK_CONTAINER (toplevel),
3035 reset_focus_recurse,
3039 /* now propagate the new focus up the widget tree and finally
3040 * set it on the window
3042 widget = focus_widget;
3043 while (widget->parent)
3045 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), widget);
3046 widget = widget->parent;
3048 if (GTK_IS_WINDOW (widget))
3049 gtk_window_set_focus (GTK_WINDOW (widget), focus_widget);
3053 /*****************************************
3054 * gtk_widget_grab_default:
3059 *****************************************/
3062 gtk_widget_grab_default (GtkWidget *widget)
3065 GtkType window_type;
3067 g_return_if_fail (widget != NULL);
3068 g_return_if_fail (GTK_IS_WIDGET (widget));
3069 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
3071 window_type = gtk_window_get_type ();
3072 window = widget->parent;
3074 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
3075 window = window->parent;
3077 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
3078 gtk_window_set_default (GTK_WINDOW (window), widget);
3081 /*****************************************
3082 * gtk_widget_set_name:
3087 *****************************************/
3090 gtk_widget_set_name (GtkWidget *widget,
3093 g_return_if_fail (widget != NULL);
3094 g_return_if_fail (GTK_IS_WIDGET (widget));
3097 g_free (widget->name);
3098 widget->name = g_strdup (name);
3100 if (!GTK_WIDGET_USER_STYLE (widget))
3101 gtk_widget_set_rc_style (widget);
3104 /*****************************************
3105 * gtk_widget_get_name:
3110 *****************************************/
3113 gtk_widget_get_name (GtkWidget *widget)
3115 g_return_val_if_fail (widget != NULL, NULL);
3116 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3119 return widget->name;
3120 return gtk_type_name (GTK_WIDGET_TYPE (widget));
3123 /*****************************************
3124 * gtk_widget_set_state:
3131 *****************************************/
3134 gtk_widget_set_state (GtkWidget *widget,
3137 g_return_if_fail (widget != NULL);
3138 g_return_if_fail (GTK_IS_WIDGET (widget));
3140 if (state == GTK_WIDGET_STATE (widget))
3143 if (state == GTK_STATE_INSENSITIVE)
3144 gtk_widget_set_sensitive (widget, FALSE);
3150 data.state_restoration = FALSE;
3151 data.use_forall = FALSE;
3153 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
3155 data.parent_sensitive = TRUE;
3157 gtk_widget_propagate_state (widget, &data);
3159 if (GTK_WIDGET_DRAWABLE (widget))
3160 gtk_widget_queue_clear (widget);
3165 gtk_widget_set_app_paintable (GtkWidget *widget,
3166 gboolean app_paintable)
3168 g_return_if_fail (widget != NULL);
3169 g_return_if_fail (GTK_IS_WIDGET (widget));
3171 app_paintable = (app_paintable != FALSE);
3173 if (GTK_WIDGET_APP_PAINTABLE (widget) != app_paintable)
3176 GTK_WIDGET_SET_FLAGS (widget, GTK_APP_PAINTABLE);
3178 GTK_WIDGET_UNSET_FLAGS (widget, GTK_APP_PAINTABLE);
3180 if (GTK_WIDGET_DRAWABLE (widget))
3181 gtk_widget_queue_clear (widget);
3185 /*****************************************
3186 * gtk_widget_set_sensitive:
3190 * boolean value for sensitivity
3193 *****************************************/
3196 gtk_widget_set_sensitive (GtkWidget *widget,
3201 g_return_if_fail (widget != NULL);
3202 g_return_if_fail (GTK_IS_WIDGET (widget));
3204 sensitive = (sensitive != FALSE);
3206 if (sensitive == (GTK_WIDGET_SENSITIVE (widget) != FALSE))
3211 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
3212 data.state = GTK_WIDGET_SAVED_STATE (widget);
3216 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
3217 data.state = GTK_WIDGET_STATE (widget);
3219 data.state_restoration = TRUE;
3220 data.use_forall = TRUE;
3223 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
3225 data.parent_sensitive = TRUE;
3227 gtk_widget_propagate_state (widget, &data);
3228 if (GTK_WIDGET_DRAWABLE (widget))
3229 gtk_widget_queue_clear (widget);
3232 /*****************************************
3233 * gtk_widget_set_parent:
3238 *****************************************/
3241 gtk_widget_set_parent (GtkWidget *widget,
3246 g_return_if_fail (widget != NULL);
3247 g_return_if_fail (GTK_IS_WIDGET (widget));
3248 g_return_if_fail (widget->parent == NULL);
3249 g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
3250 g_return_if_fail (parent != NULL);
3251 g_return_if_fail (GTK_IS_WIDGET (parent));
3252 g_return_if_fail (widget != parent);
3254 /* keep this function in sync with gtk_menu_attach_to_widget()
3257 gtk_widget_ref (widget);
3258 gtk_object_sink (GTK_OBJECT (widget));
3259 widget->parent = parent;
3261 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
3262 data.state = GTK_WIDGET_STATE (parent);
3264 data.state = GTK_WIDGET_STATE (widget);
3265 data.state_restoration = FALSE;
3266 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (parent) != FALSE);
3267 data.use_forall = GTK_WIDGET_IS_SENSITIVE (parent) != GTK_WIDGET_IS_SENSITIVE (widget);
3269 gtk_widget_propagate_state (widget, &data);
3271 gtk_widget_set_style_recurse (widget, NULL);
3273 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
3276 /*****************************************
3278 * see docs/styles.txt
3279 *****************************************/
3281 gtk_widget_set_style (GtkWidget *widget,
3284 GtkStyle *default_style;
3285 gboolean initial_emission;
3287 g_return_if_fail (widget != NULL);
3288 g_return_if_fail (GTK_IS_WIDGET (widget));
3289 g_return_if_fail (style != NULL);
3291 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
3293 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
3294 GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
3296 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3299 gtk_style_ref (widget->style);
3300 if (!saved_default_style_key_id)
3301 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
3302 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
3305 gtk_widget_set_style_internal (widget, style, initial_emission);
3309 gtk_widget_ensure_style (GtkWidget *widget)
3311 g_return_if_fail (widget != NULL);
3312 g_return_if_fail (GTK_IS_WIDGET (widget));
3314 if (!GTK_WIDGET_USER_STYLE (widget) &&
3315 !GTK_WIDGET_RC_STYLE (widget))
3316 gtk_widget_set_rc_style (widget);
3320 gtk_widget_set_rc_style (GtkWidget *widget)
3322 GtkStyle *saved_style;
3323 GtkStyle *new_style;
3324 gboolean initial_emission;
3326 g_return_if_fail (widget != NULL);
3327 g_return_if_fail (GTK_IS_WIDGET (widget));
3329 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
3331 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
3332 GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
3334 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3335 new_style = gtk_rc_get_style (widget);
3340 gtk_style_ref (widget->style);
3341 if (!saved_default_style_key_id)
3342 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
3343 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
3345 gtk_widget_set_style_internal (widget, new_style, initial_emission);
3351 g_assert (initial_emission == FALSE); /* FIXME: remove this line */
3353 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3354 gtk_widget_set_style_internal (widget, saved_style, initial_emission);
3355 gtk_style_unref (saved_style);
3359 if (initial_emission)
3360 gtk_widget_set_style_internal (widget, widget->style, TRUE);
3366 gtk_widget_restore_default_style (GtkWidget *widget)
3368 GtkStyle *default_style;
3370 g_return_if_fail (widget != NULL);
3371 g_return_if_fail (GTK_IS_WIDGET (widget));
3373 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
3375 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3378 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3379 gtk_widget_set_style_internal (widget, default_style, FALSE);
3380 gtk_style_unref (default_style);
3385 gtk_widget_get_style (GtkWidget *widget)
3387 g_return_val_if_fail (widget != NULL, NULL);
3388 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3390 return widget->style;
3394 gtk_widget_modify_style (GtkWidget *widget,
3397 GtkRcStyle *old_style;
3399 if (!rc_style_key_id)
3400 rc_style_key_id = g_quark_from_static_string (rc_style_key);
3402 old_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), rc_style_key_id);
3404 if (style != old_style)
3405 gtk_object_set_data_by_id_full (GTK_OBJECT (widget),
3408 (GtkDestroyNotify)gtk_rc_style_unref);
3412 gtk_widget_style_set (GtkWidget *widget,
3413 GtkStyle *previous_style)
3415 if (GTK_WIDGET_REALIZED (widget) &&
3416 !GTK_WIDGET_NO_WINDOW (widget))
3418 gtk_style_set_background (widget->style, widget->window, widget->state);
3419 if (GTK_WIDGET_DRAWABLE (widget))
3420 gdk_window_clear (widget->window);
3425 gtk_widget_set_style_internal (GtkWidget *widget,
3427 gboolean initial_emission)
3429 g_return_if_fail (widget != NULL);
3430 g_return_if_fail (GTK_IS_WIDGET (widget));
3431 g_return_if_fail (style != NULL);
3433 if (widget->style != style)
3435 GtkStyle *previous_style;
3437 if (GTK_WIDGET_REALIZED (widget))
3439 gtk_widget_reset_shapes (widget);
3440 gtk_style_detach (widget->style);
3443 previous_style = widget->style;
3444 widget->style = style;
3445 gtk_style_ref (widget->style);
3447 if (GTK_WIDGET_REALIZED (widget))
3448 widget->style = gtk_style_attach (widget->style, widget->window);
3450 gtk_signal_emit (GTK_OBJECT (widget),
3451 widget_signals[STYLE_SET],
3452 initial_emission ? NULL : previous_style);
3453 gtk_style_unref (previous_style);
3455 if (widget->parent && !initial_emission)
3457 GtkRequisition old_requisition;
3459 old_requisition = widget->requisition;
3460 gtk_widget_size_request (widget, &widget->requisition);
3462 if ((old_requisition.width != widget->requisition.width) ||
3463 (old_requisition.height != widget->requisition.height))
3464 gtk_widget_queue_resize (widget);
3465 else if (GTK_WIDGET_DRAWABLE (widget))
3466 gtk_widget_queue_clear (widget);
3469 else if (initial_emission)
3471 gtk_signal_emit (GTK_OBJECT (widget),
3472 widget_signals[STYLE_SET],
3478 gtk_widget_set_style_recurse (GtkWidget *widget,
3479 gpointer client_data)
3481 if (GTK_WIDGET_RC_STYLE (widget))
3482 gtk_widget_set_rc_style (widget);
3484 if (GTK_IS_CONTAINER (widget))
3485 gtk_container_forall (GTK_CONTAINER (widget),
3486 gtk_widget_set_style_recurse,
3491 gtk_widget_reset_rc_styles (GtkWidget *widget)
3493 g_return_if_fail (widget != NULL);
3494 g_return_if_fail (GTK_IS_WIDGET (widget));
3496 gtk_widget_set_style_recurse (widget, NULL);
3500 gtk_widget_set_default_style (GtkStyle *style)
3502 if (style != gtk_default_style)
3504 if (gtk_default_style)
3505 gtk_style_unref (gtk_default_style);
3506 gtk_default_style = style;
3507 if (gtk_default_style)
3508 gtk_style_ref (gtk_default_style);
3513 gtk_widget_get_default_style (void)
3515 if (!gtk_default_style)
3517 gtk_default_style = gtk_style_new ();
3518 gtk_style_ref (gtk_default_style);
3521 return gtk_default_style;
3525 gtk_widget_push_style (GtkStyle *style)
3527 g_return_if_fail (style != NULL);
3529 gtk_style_ref (style);
3530 style_stack = g_slist_prepend (style_stack, style);
3534 gtk_widget_peek_style (void)
3537 return (GtkStyle*) style_stack->data;
3539 return gtk_widget_get_default_style ();
3543 gtk_widget_pop_style (void)
3550 style_stack = style_stack->next;
3551 gtk_style_unref ((GtkStyle*) tmp->data);
3552 g_slist_free_1 (tmp);
3556 /*************************************************************
3557 * gtk_widget_set_parent_window:
3558 * Set a non default parent window for widget
3565 *************************************************************/
3568 gtk_widget_set_parent_window (GtkWidget *widget,
3569 GdkWindow *parent_window)
3571 GdkWindow *old_parent_window;
3573 g_return_if_fail (widget != NULL);
3574 g_return_if_fail (GTK_IS_WIDGET (widget));
3576 old_parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
3577 parent_window_key_id);
3579 if (parent_window != old_parent_window)
3581 if (!parent_window_key_id)
3582 parent_window_key_id = g_quark_from_static_string (parent_window_key);
3583 gtk_object_set_data_by_id (GTK_OBJECT (widget), parent_window_key_id,
3585 if (old_parent_window)
3586 gdk_window_unref (old_parent_window);
3588 gdk_window_ref (parent_window);
3592 /*************************************************************
3593 * gtk_widget_get_parent_window:
3594 * Get widget's parent window
3601 *************************************************************/
3604 gtk_widget_get_parent_window (GtkWidget *widget)
3606 GdkWindow *parent_window;
3608 g_return_val_if_fail (widget != NULL, NULL);
3609 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3610 g_return_val_if_fail (widget->parent != NULL, NULL);
3612 parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
3613 parent_window_key_id);
3615 return (parent_window != NULL) ? parent_window : widget->parent->window;
3618 /*****************************************
3619 * gtk_widget_set_uposition:
3624 *****************************************/
3627 gtk_widget_set_uposition (GtkWidget *widget,
3631 GtkWidgetAuxInfo *aux_info;
3633 g_return_if_fail (widget != NULL);
3634 g_return_if_fail (GTK_IS_WIDGET (widget));
3636 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3639 if (!aux_info_key_id)
3640 aux_info_key_id = g_quark_from_static_string (aux_info_key);
3641 aux_info = gtk_widget_aux_info_new ();
3642 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
3650 if (GTK_WIDGET_REALIZED (widget) && GTK_IS_WINDOW (widget) &&
3651 (aux_info->x != -1) && (aux_info->y != -1))
3653 gdk_window_set_hints (widget->window, aux_info->x, aux_info->y, 0, 0, 0, 0, GDK_HINT_POS);
3654 gdk_window_move (widget->window, aux_info->x, aux_info->y);
3657 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
3658 gtk_widget_size_allocate (widget, &widget->allocation);
3661 /*****************************************
3662 * gtk_widget_set_usize:
3667 *****************************************/
3670 gtk_widget_set_usize (GtkWidget *widget,
3674 GtkWidgetAuxInfo *aux_info;
3676 g_return_if_fail (widget != NULL);
3677 g_return_if_fail (GTK_IS_WIDGET (widget));
3679 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3682 if (!aux_info_key_id)
3683 aux_info_key_id = g_quark_from_static_string (aux_info_key);
3684 aux_info = gtk_widget_aux_info_new ();
3685 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
3689 aux_info->width = width;
3691 aux_info->height = height;
3693 if (GTK_WIDGET_VISIBLE (widget))
3694 gtk_widget_queue_resize (widget);
3697 /*****************************************
3698 * gtk_widget_set_events:
3703 *****************************************/
3706 gtk_widget_set_events (GtkWidget *widget,
3711 g_return_if_fail (widget != NULL);
3712 g_return_if_fail (GTK_IS_WIDGET (widget));
3713 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3714 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
3716 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3721 eventp = g_new (gint, 1);
3725 event_key_id = g_quark_from_static_string (event_key);
3726 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3731 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3735 /*****************************************
3736 * gtk_widget_add_events:
3741 *****************************************/
3744 gtk_widget_add_events (GtkWidget *widget,
3749 g_return_if_fail (widget != NULL);
3750 g_return_if_fail (GTK_IS_WIDGET (widget));
3751 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3753 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3759 eventp = g_new (gint, 1);
3765 event_key_id = g_quark_from_static_string (event_key);
3766 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3771 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3774 if (GTK_WIDGET_REALIZED (widget))
3776 gdk_window_set_events (widget->window,
3777 gdk_window_get_events (widget->window) | events);
3781 /*****************************************
3782 * gtk_widget_set_extension_events:
3787 *****************************************/
3790 gtk_widget_set_extension_events (GtkWidget *widget,
3791 GdkExtensionMode mode)
3793 GdkExtensionMode *modep;
3795 g_return_if_fail (widget != NULL);
3796 g_return_if_fail (GTK_IS_WIDGET (widget));
3798 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3801 modep = g_new (GdkExtensionMode, 1);
3804 if (!extension_event_key_id)
3805 extension_event_key_id = g_quark_from_static_string (extension_event_key);
3806 gtk_object_set_data_by_id (GTK_OBJECT (widget), extension_event_key_id, modep);
3809 /*****************************************
3810 * gtk_widget_get_toplevel:
3815 *****************************************/
3818 gtk_widget_get_toplevel (GtkWidget *widget)
3820 g_return_val_if_fail (widget != NULL, NULL);
3821 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3823 while (widget->parent)
3824 widget = widget->parent;
3829 /*****************************************
3830 * gtk_widget_get_ancestor:
3835 *****************************************/
3838 gtk_widget_get_ancestor (GtkWidget *widget,
3839 GtkType widget_type)
3841 g_return_val_if_fail (widget != NULL, NULL);
3842 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3844 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type))
3845 widget = widget->parent;
3847 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type)))
3853 /*****************************************
3854 * gtk_widget_get_colormap:
3859 *****************************************/
3862 gtk_widget_get_colormap (GtkWidget *widget)
3864 GdkColormap *colormap;
3866 g_return_val_if_fail (widget != NULL, NULL);
3867 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3871 colormap = gdk_window_get_colormap (widget->window);
3872 /* If window was destroyed previously, we'll get NULL here */
3877 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
3881 return gtk_widget_get_default_colormap ();
3884 /*****************************************
3885 * gtk_widget_get_visual:
3890 *****************************************/
3893 gtk_widget_get_visual (GtkWidget *widget)
3897 g_return_val_if_fail (widget != NULL, NULL);
3898 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3902 visual = gdk_window_get_visual (widget->window);
3903 /* If window was destroyed previously, we'll get NULL here */
3908 visual = gtk_object_get_data (GTK_OBJECT (widget), visual_key);
3912 return gtk_widget_get_default_visual ();
3915 /*****************************************
3916 * gtk_widget_get_events:
3921 *****************************************/
3924 gtk_widget_get_events (GtkWidget *widget)
3928 g_return_val_if_fail (widget != NULL, 0);
3929 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
3931 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3938 /*****************************************
3939 * gtk_widget_get_extension_events:
3944 *****************************************/
3947 gtk_widget_get_extension_events (GtkWidget *widget)
3949 GdkExtensionMode *mode;
3951 g_return_val_if_fail (widget != NULL, 0);
3952 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
3954 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3961 /*****************************************
3962 * gtk_widget_get_pointer:
3967 *****************************************/
3970 gtk_widget_get_pointer (GtkWidget *widget,
3974 g_return_if_fail (widget != NULL);
3975 g_return_if_fail (GTK_IS_WIDGET (widget));
3982 if (GTK_WIDGET_REALIZED (widget))
3984 gdk_window_get_pointer (widget->window, x, y, NULL);
3986 if (GTK_WIDGET_NO_WINDOW (widget))
3989 *x -= widget->allocation.x;
3991 *y -= widget->allocation.y;
3996 /*****************************************
3997 * gtk_widget_is_ancestor:
4002 *****************************************/
4005 gtk_widget_is_ancestor (GtkWidget *widget,
4006 GtkWidget *ancestor)
4008 g_return_val_if_fail (widget != NULL, FALSE);
4009 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
4010 g_return_val_if_fail (ancestor != NULL, FALSE);
4014 if (widget->parent == ancestor)
4016 widget = widget->parent;
4022 static GQuark quark_composite_name = 0;
4025 gtk_widget_set_composite_name (GtkWidget *widget,
4028 g_return_if_fail (widget != NULL);
4029 g_return_if_fail (GTK_IS_WIDGET (widget));
4030 g_return_if_fail (GTK_WIDGET_COMPOSITE_CHILD (widget));
4031 g_return_if_fail (name != NULL);
4033 if (!quark_composite_name)
4034 quark_composite_name = g_quark_from_static_string ("gtk-composite-name");
4036 gtk_object_set_data_by_id_full (GTK_OBJECT (widget),
4037 quark_composite_name,
4043 gtk_widget_get_composite_name (GtkWidget *widget)
4045 g_return_val_if_fail (widget != NULL, NULL);
4046 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
4048 if (GTK_WIDGET_COMPOSITE_CHILD (widget) && widget->parent)
4049 return gtk_container_child_composite_name (GTK_CONTAINER (widget->parent),
4056 gtk_widget_push_composite_child (void)
4058 composite_child_stack++;
4062 gtk_widget_pop_composite_child (void)
4064 if (composite_child_stack)
4065 composite_child_stack--;
4068 /*****************************************
4069 * gtk_widget_push_colormap:
4074 *****************************************/
4077 gtk_widget_push_colormap (GdkColormap *cmap)
4079 g_return_if_fail (cmap != NULL);
4081 colormap_stack = g_slist_prepend (colormap_stack, cmap);
4084 /*****************************************
4085 * gtk_widget_push_visual:
4090 *****************************************/
4093 gtk_widget_push_visual (GdkVisual *visual)
4095 g_return_if_fail (visual != NULL);
4097 visual_stack = g_slist_prepend (visual_stack, visual);
4100 /*****************************************
4101 * gtk_widget_pop_colormap:
4106 *****************************************/
4109 gtk_widget_pop_colormap (void)
4115 tmp = colormap_stack;
4116 colormap_stack = colormap_stack->next;
4117 g_slist_free_1 (tmp);
4121 /*****************************************
4122 * gtk_widget_pop_visual:
4127 *****************************************/
4130 gtk_widget_pop_visual (void)
4137 visual_stack = visual_stack->next;
4138 g_slist_free_1 (tmp);
4142 /*****************************************
4143 * gtk_widget_set_default_colormap:
4148 *****************************************/
4151 gtk_widget_set_default_colormap (GdkColormap *colormap)
4153 if (default_colormap != colormap)
4155 if (default_colormap)
4156 gdk_colormap_unref (default_colormap);
4157 default_colormap = colormap;
4158 if (default_colormap)
4159 gdk_colormap_ref (default_colormap);
4163 /*****************************************
4164 * gtk_widget_set_default_visual:
4169 *****************************************/
4172 gtk_widget_set_default_visual (GdkVisual *visual)
4174 default_visual = visual;
4177 /*****************************************
4178 * gtk_widget_get_default_colormap:
4183 *****************************************/
4186 gtk_widget_get_default_colormap (void)
4188 if (!default_colormap)
4189 default_colormap = gdk_colormap_get_system ();
4191 return default_colormap;
4194 /*****************************************
4195 * gtk_widget_get_default_visual:
4200 *****************************************/
4203 gtk_widget_get_default_visual (void)
4205 if (!default_visual)
4206 default_visual = gdk_visual_get_system ();
4208 return default_visual;
4212 gtk_widget_shutdown (GtkObject *object)
4216 /* gtk_object_destroy() will already hold a refcount on object
4218 widget = GTK_WIDGET (object);
4221 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
4223 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
4224 if (GTK_WIDGET_REALIZED (widget))
4225 gtk_widget_unrealize (widget);
4227 parent_class->shutdown (object);
4231 gtk_widget_real_destroy (GtkObject *object)
4234 GtkStyle *saved_style;
4236 /* gtk_object_destroy() will already hold a refcount on object
4238 widget = GTK_WIDGET (object);
4240 gtk_grab_remove (widget);
4241 gtk_selection_remove_all (widget);
4243 saved_style = gtk_object_get_data_by_id (object, saved_default_style_key_id);
4246 gtk_style_unref (saved_style);
4247 gtk_object_remove_data_by_id (object, saved_default_style_key_id);
4250 gtk_style_unref (widget->style);
4251 widget->style = NULL;
4253 parent_class->destroy (object);
4257 gtk_widget_finalize (GtkObject *object)
4260 GtkWidgetAuxInfo *aux_info;
4262 GdkExtensionMode *mode;
4264 widget = GTK_WIDGET (object);
4267 g_free (widget->name);
4269 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
4271 gtk_widget_aux_info_destroy (aux_info);
4273 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
4277 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
4281 parent_class->finalize (object);
4284 /*****************************************
4285 * gtk_widget_real_map:
4290 *****************************************/
4293 gtk_widget_real_map (GtkWidget *widget)
4295 g_return_if_fail (widget != NULL);
4296 g_return_if_fail (GTK_IS_WIDGET (widget));
4298 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget))
4300 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
4302 if (!GTK_WIDGET_NO_WINDOW (widget))
4303 gdk_window_show (widget->window);
4307 /*****************************************
4308 * gtk_widget_real_unmap:
4313 *****************************************/
4316 gtk_widget_real_unmap (GtkWidget *widget)
4318 g_return_if_fail (widget != NULL);
4319 g_return_if_fail (GTK_IS_WIDGET (widget));
4321 if (GTK_WIDGET_MAPPED (widget))
4323 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
4325 if (!GTK_WIDGET_NO_WINDOW (widget))
4326 gdk_window_hide (widget->window);
4330 /*****************************************
4331 * gtk_widget_real_realize:
4336 *****************************************/
4339 gtk_widget_real_realize (GtkWidget *widget)
4341 g_return_if_fail (widget != NULL);
4342 g_return_if_fail (GTK_IS_WIDGET (widget));
4343 g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
4345 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
4348 widget->window = gtk_widget_get_parent_window (widget);
4349 gdk_window_ref (widget->window);
4351 widget->style = gtk_style_attach (widget->style, widget->window);
4354 /*****************************************
4355 * gtk_widget_real_unrealize:
4360 *****************************************/
4363 gtk_widget_real_unrealize (GtkWidget *widget)
4365 g_return_if_fail (widget != NULL);
4366 g_return_if_fail (GTK_IS_WIDGET (widget));
4368 if (GTK_WIDGET_MAPPED (widget))
4369 gtk_widget_real_unmap (widget);
4371 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
4373 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT(widget)->klass->type));
4376 /* We must do unrealize child widget BEFORE container widget.
4377 * gdk_window_destroy() destroys specified xwindow and it's sub-xwindows.
4378 * So, unrealizing container widget bofore it's children causes the problem
4379 * (for example, gdk_ic_destroy () with destroyed window causes crash. )
4382 if (GTK_IS_CONTAINER (widget))
4383 gtk_container_foreach (GTK_CONTAINER (widget),
4384 (GtkCallback) gtk_widget_unrealize,
4387 gtk_style_detach (widget->style);
4388 if (!GTK_WIDGET_NO_WINDOW (widget))
4390 gdk_window_set_user_data (widget->window, NULL);
4391 gdk_window_destroy (widget->window);
4392 widget->window = NULL;
4396 gdk_window_unref (widget->window);
4397 widget->window = NULL;
4400 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED);
4404 gtk_widget_real_draw (GtkWidget *widget,
4407 GdkEventExpose event;
4409 g_return_if_fail (widget != NULL);
4410 g_return_if_fail (GTK_IS_WIDGET (widget));
4411 g_return_if_fail (area != NULL);
4413 if (GTK_WIDGET_DRAWABLE (widget))
4415 event.type = GDK_EXPOSE;
4416 event.send_event = TRUE;
4417 event.window = widget->window;
4421 gdk_window_ref (event.window);
4422 gtk_widget_event (widget, (GdkEvent*) &event);
4423 gdk_window_unref (event.window);
4428 gtk_widget_real_size_request (GtkWidget *widget,
4429 GtkRequisition *requisition)
4431 g_return_if_fail (widget != NULL);
4432 g_return_if_fail (GTK_IS_WIDGET (widget));
4434 requisition->width = widget->requisition.width;
4435 requisition->height = widget->requisition.height;
4438 /*****************************************
4439 * gtk_widget_peek_colormap:
4444 *****************************************/
4447 gtk_widget_peek_colormap (void)
4450 return (GdkColormap*) colormap_stack->data;
4451 return gtk_widget_get_default_colormap ();
4454 /*****************************************
4455 * gtk_widget_peek_visual:
4460 *****************************************/
4463 gtk_widget_peek_visual (void)
4466 return (GdkVisual*) visual_stack->data;
4467 return gtk_widget_get_default_visual ();
4471 gtk_widget_propagate_state (GtkWidget *widget,
4476 /* don't call this function with state==GTK_STATE_INSENSITIVE,
4477 * parent_sensitive==TRUE on a sensitive widget
4480 old_state = GTK_WIDGET_STATE (widget);
4482 if (data->parent_sensitive)
4484 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
4486 if (GTK_WIDGET_IS_SENSITIVE (widget))
4488 if (data->state_restoration)
4489 GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget);
4491 GTK_WIDGET_STATE (widget) = data->state;
4495 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
4496 if (!data->state_restoration &&
4497 data->state != GTK_STATE_INSENSITIVE)
4498 GTK_WIDGET_SAVED_STATE (widget) = data->state;
4503 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
4504 if (!data->state_restoration)
4506 if (data->state != GTK_STATE_INSENSITIVE)
4507 GTK_WIDGET_SAVED_STATE (widget) = data->state;
4509 else if (GTK_WIDGET_STATE (widget) != GTK_STATE_INSENSITIVE)
4510 GTK_WIDGET_SAVED_STATE (widget) = GTK_WIDGET_STATE (widget);
4511 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
4514 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
4518 window = gtk_widget_get_ancestor (widget, gtk_window_get_type ());
4520 gtk_window_set_focus (GTK_WINDOW (window), NULL);
4523 if (old_state != GTK_WIDGET_STATE (widget))
4525 gtk_widget_ref (widget);
4526 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
4528 if (GTK_IS_CONTAINER (widget))
4530 data->parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget) != FALSE);
4531 data->state = GTK_WIDGET_STATE (widget);
4532 if (data->use_forall)
4533 gtk_container_forall (GTK_CONTAINER (widget),
4534 (GtkCallback) gtk_widget_propagate_state,
4537 gtk_container_foreach (GTK_CONTAINER (widget),
4538 (GtkCallback) gtk_widget_propagate_state,
4541 gtk_widget_unref (widget);
4545 /*****************************************
4546 * gtk_widget_aux_info_new:
4551 *****************************************/
4553 static GtkWidgetAuxInfo*
4554 gtk_widget_aux_info_new (void)
4556 GtkWidgetAuxInfo *aux_info;
4558 if (!aux_info_mem_chunk)
4559 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
4560 sizeof (GtkWidgetAuxInfo),
4561 1024, G_ALLOC_AND_FREE);
4563 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
4567 aux_info->width = 0;
4568 aux_info->height = 0;
4573 /*****************************************
4574 * gtk_widget_aux_info_destroy:
4579 *****************************************/
4582 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
4584 g_return_if_fail (aux_info != NULL);
4586 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
4589 /*****************************************
4590 * gtk_widget_shape_combine_mask:
4591 * set a shape for this widgets' gdk window, this allows for
4592 * transparent windows etc., see gdk_window_shape_combine_mask
4593 * for more information
4598 *****************************************/
4600 gtk_widget_shape_combine_mask (GtkWidget *widget,
4601 GdkBitmap *shape_mask,
4605 GtkWidgetShapeInfo* shape_info;
4607 g_return_if_fail (widget != NULL);
4608 g_return_if_fail (GTK_IS_WIDGET (widget));
4609 /* set_shape doesn't work on widgets without gdk window */
4610 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
4614 GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4617 gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
4619 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4620 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
4621 g_free (shape_info);
4625 GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4627 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4630 shape_info = g_new (GtkWidgetShapeInfo, 1);
4631 gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
4633 shape_info->shape_mask = shape_mask;
4634 shape_info->offset_x = offset_x;
4635 shape_info->offset_y = offset_y;
4637 /* set shape if widget has a gdk window allready.
4638 * otherwise the shape is scheduled to be set by gtk_widget_realize.
4641 gdk_window_shape_combine_mask (widget->window, shape_mask,
4642 offset_x, offset_y);
4647 gtk_reset_shapes_recurse (GtkWidget *widget,
4650 GdkWindowPrivate *private;
4654 private = (GdkWindowPrivate*) window;
4656 if (private->destroyed)
4658 gdk_window_get_user_data (window, &data);
4662 gdk_window_shape_combine_mask (window, NULL, 0, 0);
4663 for (list = private->children; list; list = list->next)
4664 gtk_reset_shapes_recurse (widget, list->data);
4668 gtk_widget_reset_shapes (GtkWidget *widget)
4670 g_return_if_fail (widget != NULL);
4671 g_return_if_fail (GTK_IS_WIDGET (widget));
4672 g_return_if_fail (GTK_WIDGET_REALIZED (widget));
4674 if (!GTK_WIDGET_HAS_SHAPE_MASK (widget))
4675 gtk_reset_shapes_recurse (widget, widget->window);
4679 gtk_widget_ref (GtkWidget *widget)
4681 g_return_if_fail (widget != NULL);
4682 g_return_if_fail (GTK_IS_WIDGET (widget));
4684 gtk_object_ref ((GtkObject*) widget);
4688 gtk_widget_unref (GtkWidget *widget)
4690 g_return_if_fail (widget != NULL);
4691 g_return_if_fail (GTK_IS_WIDGET (widget));
4693 gtk_object_unref ((GtkObject*) widget);
4697 gtk_widget_path (GtkWidget *widget,
4698 guint *path_length_p,
4700 gchar **path_reversed_p)
4702 static gchar *rev_path = NULL;
4703 static guint path_len = 0;
4706 g_return_if_fail (widget != NULL);
4707 g_return_if_fail (GTK_IS_WIDGET (widget));
4716 string = gtk_widget_get_name (widget);
4717 l = strlen (string);
4718 while (path_len <= len + l + 1)
4720 path_len += INIT_PATH_SIZE;
4721 rev_path = g_realloc (rev_path, path_len);
4729 widget = widget->parent;
4732 rev_path[len++] = '.';
4734 rev_path[len++] = 0;
4739 *path_length_p = len - 1;
4740 if (path_reversed_p)
4741 *path_reversed_p = g_strdup (rev_path);
4744 *path_p = g_strdup (rev_path);
4745 g_strreverse (*path_p);
4750 gtk_widget_class_path (GtkWidget *widget,
4751 guint *path_length_p,
4753 gchar **path_reversed_p)
4755 static gchar *rev_path = NULL;
4756 static guint path_len = 0;
4759 g_return_if_fail (widget != NULL);
4760 g_return_if_fail (GTK_IS_WIDGET (widget));
4769 string = gtk_type_name (GTK_WIDGET_TYPE (widget));
4770 l = strlen (string);
4771 while (path_len <= len + l + 1)
4773 path_len += INIT_PATH_SIZE;
4774 rev_path = g_realloc (rev_path, path_len);
4782 widget = widget->parent;
4785 rev_path[len++] = '.';
4787 rev_path[len++] = 0;
4792 *path_length_p = len - 1;
4793 if (path_reversed_p)
4794 *path_reversed_p = g_strdup (rev_path);
4797 *path_p = g_strdup (rev_path);
4798 g_strreverse (*path_p);