1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 #include "gtkcontainer.h"
24 #include "gtkselection.h"
25 #include "gtksignal.h"
26 #include "gtkwidget.h"
27 #include "gtkwindow.h"
28 #include "gtkbindings.h"
29 #include "gtkprivate.h"
34 #define WIDGET_CLASS(w) GTK_WIDGET_CLASS (GTK_OBJECT (w)->klass)
35 #define INIT_PATH_SIZE (512)
71 PROPERTY_NOTIFY_EVENT,
72 SELECTION_CLEAR_EVENT,
73 SELECTION_REQUEST_EVENT,
74 SELECTION_NOTIFY_EVENT,
83 DROP_DATA_AVAILABLE_EVENT,
87 VISIBILITY_NOTIFY_EVENT,
111 typedef void (*GtkWidgetSignal1) (GtkObject *object,
114 typedef gint (*GtkWidgetSignal2) (GtkObject *object,
119 typedef void (*GtkWidgetSignal3) (GtkObject *object,
122 typedef gint (*GtkWidgetSignal4) (GtkObject *object,
125 typedef void (*GtkWidgetSignal5) (GtkObject *object,
128 typedef void (*GtkWidgetSignal6) (GtkObject *object,
131 typedef void (*GtkWidgetSignal7) (GtkObject *object,
135 typedef struct _GtkStateData GtkStateData;
140 guint state_restauration : 1;
141 guint parent_sensitive : 1;
145 static void gtk_widget_marshal_signal_1 (GtkObject *object,
149 static void gtk_widget_marshal_signal_4 (GtkObject *object,
153 static void gtk_widget_marshal_signal_5 (GtkObject *object,
157 static void gtk_widget_marshal_signal_6 (GtkObject *object,
161 static void gtk_widget_marshal_signal_7 (GtkObject *object,
166 static void gtk_widget_class_init (GtkWidgetClass *klass);
167 static void gtk_widget_init (GtkWidget *widget);
168 static void gtk_widget_set_arg (GtkObject *object,
171 static void gtk_widget_get_arg (GtkObject *object,
174 static void gtk_widget_shutdown (GtkObject *object);
175 static void gtk_widget_real_destroy (GtkObject *object);
176 static void gtk_widget_finalize (GtkObject *object);
177 static void gtk_widget_real_show (GtkWidget *widget);
178 static void gtk_widget_real_hide (GtkWidget *widget);
179 static void gtk_widget_real_map (GtkWidget *widget);
180 static void gtk_widget_real_unmap (GtkWidget *widget);
181 static void gtk_widget_real_realize (GtkWidget *widget);
182 static void gtk_widget_real_unrealize (GtkWidget *widget);
183 static void gtk_widget_real_draw (GtkWidget *widget,
185 static void gtk_widget_real_size_allocate (GtkWidget *widget,
186 GtkAllocation *allocation);
187 static gint gtk_widget_real_key_press_event (GtkWidget *widget,
189 static gint gtk_widget_real_key_release_event (GtkWidget *widget,
191 static void gtk_widget_style_set (GtkWidget *widget,
192 GtkStyle *previous_style);
194 static GdkColormap* gtk_widget_peek_colormap (void);
195 static GdkVisual* gtk_widget_peek_visual (void);
196 static GtkStyle* gtk_widget_peek_style (void);
198 static void gtk_widget_reparent_container_child (GtkWidget *widget,
199 gpointer client_data);
200 static void gtk_widget_propagate_state (GtkWidget *widget,
202 static void gtk_widget_draw_children_recurse (GtkWidget *widget,
203 gpointer client_data);
204 static void gtk_widget_set_style_internal (GtkWidget *widget,
206 gboolean initial_emission);
207 static void gtk_widget_set_style_recurse (GtkWidget *widget,
208 gpointer client_data);
210 extern GtkArg* gtk_object_collect_args (guint *nargs,
211 GtkType (*) (const gchar*),
215 static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
216 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
218 static GtkObjectClass *parent_class = NULL;
219 static guint widget_signals[LAST_SIGNAL] = { 0 };
221 static GMemChunk *aux_info_mem_chunk = NULL;
223 static GdkColormap *default_colormap = NULL;
224 static GdkVisual *default_visual = NULL;
225 static GtkStyle *default_style = NULL;
227 static GSList *colormap_stack = NULL;
228 static GSList *visual_stack = NULL;
229 static GSList *style_stack = NULL;
231 static GSList *gtk_widget_redraw_queue = NULL;
233 static const gchar *aux_info_key = "gtk-aux-info";
234 static guint aux_info_key_id = 0;
235 static const gchar *event_key = "gtk-event-mask";
236 static guint event_key_id = 0;
237 static const gchar *extension_event_key = "gtk-extension-event-mode";
238 static guint extension_event_key_id = 0;
239 static const gchar *parent_window_key = "gtk-parent-window";
240 static guint parent_window_key_id = 0;
241 static const gchar *saved_default_style_key = "gtk-saved-default-style";
242 static guint saved_default_style_key_id = 0;
243 static const gchar *shape_info_key = "gtk-shape-info";
244 static const gchar *colormap_key = "gtk-colormap";
245 static const gchar *visual_key = "gtk-visual";
249 /*****************************************
250 * gtk_widget_get_type:
255 *****************************************/
258 gtk_widget_get_type (void)
260 static GtkType widget_type = 0;
264 GtkTypeInfo widget_info =
268 sizeof (GtkWidgetClass),
269 (GtkClassInitFunc) gtk_widget_class_init,
270 (GtkObjectInitFunc) gtk_widget_init,
271 /* reversed_1 */ NULL,
272 /* reversed_2 */ NULL,
273 (GtkClassInitFunc) NULL,
276 widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);
282 /*****************************************
283 * gtk_widget_class_init:
288 *****************************************/
291 gtk_widget_class_init (GtkWidgetClass *klass)
293 GtkObjectClass *object_class;
295 object_class = (GtkObjectClass*) klass;
297 parent_class = gtk_type_class (gtk_object_get_type ());
299 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
300 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
301 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
302 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
303 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
304 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
305 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
306 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
307 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
308 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
309 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
310 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
311 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
312 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
313 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
315 widget_signals[SHOW] =
316 gtk_signal_new ("show",
319 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
320 gtk_signal_default_marshaller,
322 widget_signals[HIDE] =
323 gtk_signal_new ("hide",
326 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
327 gtk_signal_default_marshaller,
329 widget_signals[MAP] =
330 gtk_signal_new ("map",
333 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
334 gtk_signal_default_marshaller,
336 widget_signals[UNMAP] =
337 gtk_signal_new ("unmap",
340 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
341 gtk_signal_default_marshaller,
343 widget_signals[REALIZE] =
344 gtk_signal_new ("realize",
347 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
348 gtk_signal_default_marshaller,
350 widget_signals[UNREALIZE] =
351 gtk_signal_new ("unrealize",
354 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
355 gtk_signal_default_marshaller,
357 widget_signals[DRAW] =
358 gtk_signal_new ("draw",
361 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
362 gtk_widget_marshal_signal_1,
365 widget_signals[DRAW_FOCUS] =
366 gtk_signal_new ("draw_focus",
369 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
370 gtk_signal_default_marshaller,
372 widget_signals[DRAW_DEFAULT] =
373 gtk_signal_new ("draw_default",
376 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
377 gtk_signal_default_marshaller,
379 widget_signals[SIZE_REQUEST] =
380 gtk_signal_new ("size_request",
383 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
384 gtk_widget_marshal_signal_1,
387 widget_signals[SIZE_ALLOCATE] =
388 gtk_signal_new ("size_allocate",
391 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
392 gtk_widget_marshal_signal_1,
395 widget_signals[STATE_CHANGED] =
396 gtk_signal_new ("state_changed",
399 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
400 gtk_widget_marshal_signal_5,
402 GTK_TYPE_STATE_TYPE);
403 widget_signals[PARENT_SET] =
404 gtk_signal_new ("parent_set",
407 GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
408 gtk_widget_marshal_signal_6,
411 widget_signals[STYLE_SET] =
412 gtk_signal_new ("style_set",
415 GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
416 gtk_widget_marshal_signal_7,
419 widget_signals[ADD_ACCELERATOR] =
420 gtk_accel_group_create_add (object_class->type, GTK_RUN_LAST,
421 GTK_SIGNAL_OFFSET (GtkWidgetClass, add_accelerator));
422 widget_signals[REMOVE_ACCELERATOR] =
423 gtk_accel_group_create_remove (object_class->type, GTK_RUN_LAST,
424 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));
425 widget_signals[EVENT] =
426 gtk_signal_new ("event",
429 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
430 gtk_widget_marshal_signal_4,
433 widget_signals[BUTTON_PRESS_EVENT] =
434 gtk_signal_new ("button_press_event",
437 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
438 gtk_widget_marshal_signal_4,
441 widget_signals[BUTTON_RELEASE_EVENT] =
442 gtk_signal_new ("button_release_event",
445 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
446 gtk_widget_marshal_signal_4,
449 widget_signals[MOTION_NOTIFY_EVENT] =
450 gtk_signal_new ("motion_notify_event",
453 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
454 gtk_widget_marshal_signal_4,
457 widget_signals[DELETE_EVENT] =
458 gtk_signal_new ("delete_event",
461 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
462 gtk_widget_marshal_signal_4,
465 widget_signals[DESTROY_EVENT] =
466 gtk_signal_new ("destroy_event",
469 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
470 gtk_widget_marshal_signal_4,
473 widget_signals[EXPOSE_EVENT] =
474 gtk_signal_new ("expose_event",
477 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
478 gtk_widget_marshal_signal_4,
481 widget_signals[KEY_PRESS_EVENT] =
482 gtk_signal_new ("key_press_event",
485 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
486 gtk_widget_marshal_signal_4,
489 widget_signals[KEY_RELEASE_EVENT] =
490 gtk_signal_new ("key_release_event",
493 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
494 gtk_widget_marshal_signal_4,
497 widget_signals[ENTER_NOTIFY_EVENT] =
498 gtk_signal_new ("enter_notify_event",
501 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
502 gtk_widget_marshal_signal_4,
505 widget_signals[LEAVE_NOTIFY_EVENT] =
506 gtk_signal_new ("leave_notify_event",
509 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
510 gtk_widget_marshal_signal_4,
513 widget_signals[CONFIGURE_EVENT] =
514 gtk_signal_new ("configure_event",
517 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
518 gtk_widget_marshal_signal_4,
521 widget_signals[FOCUS_IN_EVENT] =
522 gtk_signal_new ("focus_in_event",
525 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
526 gtk_widget_marshal_signal_4,
529 widget_signals[FOCUS_OUT_EVENT] =
530 gtk_signal_new ("focus_out_event",
533 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
534 gtk_widget_marshal_signal_4,
537 widget_signals[MAP_EVENT] =
538 gtk_signal_new ("map_event",
541 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
542 gtk_widget_marshal_signal_4,
545 widget_signals[UNMAP_EVENT] =
546 gtk_signal_new ("unmap_event",
549 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
550 gtk_widget_marshal_signal_4,
553 widget_signals[PROPERTY_NOTIFY_EVENT] =
554 gtk_signal_new ("property_notify_event",
557 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
558 gtk_widget_marshal_signal_4,
561 widget_signals[SELECTION_CLEAR_EVENT] =
562 gtk_signal_new ("selection_clear_event",
565 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
566 gtk_widget_marshal_signal_4,
569 widget_signals[SELECTION_REQUEST_EVENT] =
570 gtk_signal_new ("selection_request_event",
573 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
574 gtk_widget_marshal_signal_4,
577 widget_signals[SELECTION_NOTIFY_EVENT] =
578 gtk_signal_new ("selection_notify_event",
581 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
582 gtk_widget_marshal_signal_4,
585 widget_signals[SELECTION_RECEIVED] =
586 gtk_signal_new ("selection_received",
589 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
590 gtk_widget_marshal_signal_1,
592 GTK_TYPE_SELECTION_DATA);
593 widget_signals[PROXIMITY_IN_EVENT] =
594 gtk_signal_new ("proximity_in_event",
597 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
598 gtk_widget_marshal_signal_4,
601 widget_signals[PROXIMITY_OUT_EVENT] =
602 gtk_signal_new ("proximity_out_event",
605 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
606 gtk_widget_marshal_signal_4,
609 widget_signals[DRAG_BEGIN_EVENT] =
610 gtk_signal_new ("drag_begin_event",
613 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin_event),
614 gtk_widget_marshal_signal_4,
617 widget_signals[DRAG_REQUEST_EVENT] =
618 gtk_signal_new ("drag_request_event",
621 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_request_event),
622 gtk_widget_marshal_signal_4,
625 widget_signals[DRAG_END_EVENT] =
626 gtk_signal_new ("drag_end_event",
629 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end_event),
630 gtk_widget_marshal_signal_4,
633 widget_signals[DROP_ENTER_EVENT] =
634 gtk_signal_new ("drop_enter_event",
637 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_enter_event),
638 gtk_widget_marshal_signal_4,
641 widget_signals[DROP_LEAVE_EVENT] =
642 gtk_signal_new ("drop_leave_event",
645 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_leave_event),
646 gtk_widget_marshal_signal_4,
649 widget_signals[DROP_DATA_AVAILABLE_EVENT] =
650 gtk_signal_new ("drop_data_available_event",
653 GTK_SIGNAL_OFFSET (GtkWidgetClass,
654 drop_data_available_event),
655 gtk_widget_marshal_signal_4,
658 widget_signals[VISIBILITY_NOTIFY_EVENT] =
659 gtk_signal_new ("visibility_notify_event",
662 GTK_SIGNAL_OFFSET (GtkWidgetClass, visibility_notify_event),
663 gtk_widget_marshal_signal_4,
666 widget_signals[CLIENT_EVENT] =
667 gtk_signal_new ("client_event",
670 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
671 gtk_widget_marshal_signal_4,
674 widget_signals[NO_EXPOSE_EVENT] =
675 gtk_signal_new ("no_expose_event",
678 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
679 gtk_widget_marshal_signal_4,
682 widget_signals[OTHER_EVENT] =
683 gtk_signal_new ("other_event",
686 GTK_SIGNAL_OFFSET (GtkWidgetClass, other_event),
687 gtk_widget_marshal_signal_4,
691 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
693 object_class->set_arg = gtk_widget_set_arg;
694 object_class->get_arg = gtk_widget_get_arg;
695 object_class->shutdown = gtk_widget_shutdown;
696 object_class->destroy = gtk_widget_real_destroy;
697 object_class->finalize = gtk_widget_finalize;
699 klass->activate_signal = 0;
700 klass->show = gtk_widget_real_show;
701 klass->hide = gtk_widget_real_hide;
702 klass->show_all = gtk_widget_real_show;
703 klass->hide_all = gtk_widget_real_hide;
704 klass->map = gtk_widget_real_map;
705 klass->unmap = gtk_widget_real_unmap;
706 klass->realize = gtk_widget_real_realize;
707 klass->unrealize = gtk_widget_real_unrealize;
708 klass->draw = gtk_widget_real_draw;
709 klass->draw_focus = NULL;
710 klass->size_request = NULL;
711 klass->size_allocate = gtk_widget_real_size_allocate;
712 klass->state_changed = NULL;
713 klass->parent_set = NULL;
714 klass->style_set = gtk_widget_style_set;
715 klass->add_accelerator = (void*) gtk_accel_group_handle_add;
716 klass->remove_accelerator = (void*) gtk_accel_group_handle_remove;
718 klass->button_press_event = NULL;
719 klass->button_release_event = NULL;
720 klass->motion_notify_event = NULL;
721 klass->delete_event = NULL;
722 klass->destroy_event = NULL;
723 klass->expose_event = NULL;
724 klass->key_press_event = gtk_widget_real_key_press_event;
725 klass->key_release_event = gtk_widget_real_key_release_event;
726 klass->enter_notify_event = NULL;
727 klass->leave_notify_event = NULL;
728 klass->configure_event = NULL;
729 klass->focus_in_event = NULL;
730 klass->focus_out_event = NULL;
731 klass->map_event = NULL;
732 klass->unmap_event = NULL;
733 klass->property_notify_event = gtk_selection_property_notify;
734 klass->selection_clear_event = gtk_selection_clear;
735 klass->selection_request_event = gtk_selection_request;
736 klass->selection_notify_event = gtk_selection_notify;
737 klass->selection_received = NULL;
738 klass->proximity_in_event = NULL;
739 klass->proximity_out_event = NULL;
740 klass->drag_begin_event = NULL;
741 klass->drag_request_event = NULL;
742 klass->drop_enter_event = NULL;
743 klass->drop_leave_event = NULL;
744 klass->drop_data_available_event = NULL;
745 klass->other_event = NULL;
746 klass->no_expose_event = NULL;
751 GtkBindingSet *binding_set;
753 binding_set = gtk_binding_set_by_class (klass);
754 gtk_binding_entry_add_signal (binding_set, '9', GDK_CONTROL_MASK|GDK_RELEASE_MASK, "hide", 0);
755 gtk_binding_entry_add_signal (binding_set, '9', GDK_CONTROL_MASK|GDK_RELEASE_MASK, "show", 0);
760 gtk_widget_set_arg (GtkObject *object,
766 widget = GTK_WIDGET (object);
773 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
776 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
779 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
782 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
785 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -1);
788 gtk_widget_set_usize (widget, -1, GTK_VALUE_INT (*arg));
791 if (GTK_VALUE_BOOL(*arg))
792 gtk_widget_show (widget);
794 gtk_widget_hide (widget);
797 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
800 saved_flags = GTK_WIDGET_FLAGS (widget);
801 if (GTK_VALUE_BOOL (*arg))
802 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
804 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
805 if (saved_flags != GTK_WIDGET_FLAGS (widget))
806 gtk_widget_queue_resize (widget);
809 if (GTK_VALUE_BOOL (*arg))
810 gtk_widget_grab_focus (widget);
812 case ARG_CAN_DEFAULT:
813 saved_flags = GTK_WIDGET_FLAGS (widget);
814 if (GTK_VALUE_BOOL (*arg))
815 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
817 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
818 if (saved_flags != GTK_WIDGET_FLAGS (widget))
819 gtk_widget_queue_resize (widget);
821 case ARG_HAS_DEFAULT:
822 if (GTK_VALUE_BOOL (*arg))
823 gtk_widget_grab_default (widget);
826 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
829 if (!GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_NO_WINDOW (widget))
830 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
832 case ARG_EXTENSION_EVENTS:
833 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
840 /*****************************************
841 * gtk_widget_get_arg:
846 *****************************************/
849 gtk_widget_get_arg (GtkObject *object,
855 widget = GTK_WIDGET (object);
859 GtkWidgetAuxInfo *aux_info;
861 GdkExtensionMode *modep;
865 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
867 GTK_VALUE_STRING (*arg) = g_strdup ("");
870 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
873 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
875 GTK_VALUE_INT (*arg) = -2;
877 GTK_VALUE_INT (*arg) = aux_info->x;
880 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
882 GTK_VALUE_INT (*arg) = -2;
884 GTK_VALUE_INT (*arg) = aux_info->y;
887 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
889 GTK_VALUE_INT (*arg) = -2;
891 GTK_VALUE_INT (*arg) = aux_info->width;
894 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
896 GTK_VALUE_INT (*arg) = -2;
898 GTK_VALUE_INT (*arg) = aux_info->height;
901 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_VISIBLE (widget) != FALSE);
904 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_SENSITIVE (widget) != FALSE);
907 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_FOCUS (widget) != FALSE);
910 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_FOCUS (widget) != FALSE);
912 case ARG_CAN_DEFAULT:
913 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_DEFAULT (widget) != FALSE);
915 case ARG_HAS_DEFAULT:
916 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
919 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
922 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
924 GTK_VALUE_FLAGS (*arg) = 0;
926 GTK_VALUE_FLAGS (*arg) = *eventp;
928 case ARG_EXTENSION_EVENTS:
929 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
931 GTK_VALUE_FLAGS (*arg) = 0;
933 GTK_VALUE_FLAGS (*arg) = *modep;
936 arg->type = GTK_TYPE_INVALID;
941 /*****************************************
947 *****************************************/
950 gtk_widget_init (GtkWidget *widget)
952 GdkColormap *colormap;
955 GTK_PRIVATE_FLAGS (widget) = 0;
956 widget->state = GTK_STATE_NORMAL;
957 widget->saved_state = GTK_STATE_NORMAL;
959 widget->requisition.width = 0;
960 widget->requisition.height = 0;
961 widget->allocation.x = -1;
962 widget->allocation.y = -1;
963 widget->allocation.width = 1;
964 widget->allocation.height = 1;
965 widget->window = NULL;
966 widget->parent = NULL;
968 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE | GTK_PARENT_SENSITIVE);
970 widget->style = gtk_widget_peek_style ();
971 gtk_style_ref (widget->style);
973 colormap = gtk_widget_peek_colormap ();
974 visual = gtk_widget_peek_visual ();
976 /* XXX - should we ref the colormap and visual, too? */
978 if (colormap != gtk_widget_get_default_colormap ())
980 /* gdk_colormap_ref (colormap); */
981 gtk_object_set_data (GTK_OBJECT (widget), colormap_key, colormap);
984 if (visual != gtk_widget_get_default_visual ())
986 /* gdk_visual_ref (visual); */
987 gtk_object_set_data (GTK_OBJECT (widget), visual_key, visual);
991 /*****************************************
997 *****************************************/
1000 gtk_widget_new (guint type,
1009 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1011 obj = gtk_type_new (type);
1013 va_start (args1, type);
1014 va_start (args2, type);
1016 args = gtk_object_collect_args (&nargs, gtk_object_get_arg_type, args1, args2);
1017 gtk_object_setv (obj, nargs, args);
1023 return GTK_WIDGET (obj);
1026 /*****************************************
1032 *****************************************/
1035 gtk_widget_newv (guint type,
1039 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1041 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1044 /*****************************************
1050 *****************************************/
1053 gtk_widget_get (GtkWidget *widget,
1056 g_return_if_fail (widget != NULL);
1057 g_return_if_fail (arg != NULL);
1059 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1062 /*****************************************
1068 *****************************************/
1071 gtk_widget_getv (GtkWidget *widget,
1075 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1078 /*****************************************
1084 *****************************************/
1087 gtk_widget_set (GtkWidget *widget,
1095 g_return_if_fail (widget != NULL);
1097 va_start (args1, widget);
1098 va_start (args2, widget);
1100 args = gtk_object_collect_args (&nargs, gtk_object_get_arg_type, args1, args2);
1101 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1108 /*****************************************
1114 *****************************************/
1117 gtk_widget_setv (GtkWidget *widget,
1121 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1124 /*****************************************
1125 * gtk_widget_unparent:
1126 * do any cleanup necessary necessary
1127 * for setting parent = NULL.
1132 *****************************************/
1135 gtk_widget_unparent (GtkWidget *widget)
1137 GtkWidget *toplevel;
1138 GtkWidget *old_parent;
1140 g_return_if_fail (widget != NULL);
1141 if (widget->parent == NULL)
1144 /* keep this function in sync with gtk_menu_detach()
1147 /* unset focused and default children properly, this code
1148 * should eventually move into some gtk_window_unparent_branch() or
1151 toplevel = gtk_widget_get_toplevel (widget);
1152 if (GTK_CONTAINER (widget->parent)->focus_child == widget)
1154 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL);
1156 if (GTK_IS_WINDOW (toplevel))
1160 child = GTK_WINDOW (toplevel)->focus_widget;
1162 while (child && child != widget)
1163 child = child->parent;
1165 if (child == widget)
1166 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1169 if (GTK_IS_WINDOW (toplevel))
1173 child = GTK_WINDOW (toplevel)->default_widget;
1175 while (child && child != widget)
1176 child = child->parent;
1178 if (child == widget)
1179 gtk_window_set_default (GTK_WINDOW (toplevel), NULL);
1182 if (GTK_IS_RESIZE_CONTAINER (widget))
1183 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1185 /* Remove the widget and all its children from any ->resize_widgets list
1186 * of all the parents in our branch. This code should move into gtkcontainer.c
1187 * somwhen, since we mess around with ->resize_widgets, which is
1188 * actually not of our business.
1190 * Two ways to make this prettier:
1191 * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer))
1192 * Change resize_widgets to a GList
1194 toplevel = widget->parent;
1200 if (!GTK_CONTAINER (toplevel)->resize_widgets)
1202 toplevel = toplevel->parent;
1207 slist = GTK_CONTAINER (toplevel)->resize_widgets;
1219 while (parent && (parent != widget))
1220 parent = parent->parent;
1222 if (parent == widget)
1224 GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED);
1230 /* it is really messy to have this signal disconnection
1231 * in gtkwidget.c, the resize_widgets invariants should
1232 * all be taken care off by gtkcontainer.c exclusively.
1235 gtk_signal_disconnect_by_func (GTK_OBJECT (toplevel),
1236 GTK_SIGNAL_FUNC (gtk_container_clear_resize_widgets),
1238 GTK_CONTAINER (toplevel)->resize_widgets = slist;
1241 g_slist_free_1 (last);
1247 toplevel = toplevel->parent;
1250 if (widget->window &&
1251 GTK_WIDGET_NO_WINDOW (widget) &&
1252 GTK_WIDGET_DRAWABLE (widget))
1253 gdk_window_clear_area (widget->window,
1254 widget->allocation.x,
1255 widget->allocation.y,
1256 widget->allocation.width,
1257 widget->allocation.height);
1259 /* Reset the width and height here, to force reallocation if we
1260 * get added back to a new parent. This won't work if our new
1261 * allocation is smaller than 1x1 and we actually want a size of 1x1...
1262 * (would 0x0 be OK here?)
1264 widget->allocation.width = 1;
1265 widget->allocation.height = 1;
1267 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1268 gtk_widget_unrealize (widget);
1270 old_parent = widget->parent;
1271 widget->parent = NULL;
1272 gtk_widget_set_parent_window (widget, NULL);
1273 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1275 gtk_widget_unref (widget);
1278 /*****************************************
1279 * gtk_widget_destroy:
1284 *****************************************/
1287 gtk_widget_destroy (GtkWidget *widget)
1289 g_return_if_fail (widget != NULL);
1290 g_return_if_fail (GTK_IS_WIDGET (widget));
1292 gtk_object_destroy ((GtkObject*) widget);
1295 /*****************************************
1296 * gtk_widget_destroyed:
1297 * Utility function: sets widget_pointer
1298 * to NULL when widget is destroyed.
1303 *****************************************/
1306 gtk_widget_destroyed (GtkWidget *widget,
1307 GtkWidget **widget_pointer)
1309 /* Don't make any assumptions about the
1311 * Even check widget_pointer.
1314 *widget_pointer = NULL;
1317 /*****************************************
1323 *****************************************/
1326 gtk_widget_show (GtkWidget *widget)
1328 g_return_if_fail (widget != NULL);
1330 if (!GTK_WIDGET_VISIBLE (widget))
1331 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1335 /*************************************************************
1336 * gtk_widget_show_now:
1337 * Show a widget, and if it is an unmapped toplevel widget
1338 * wait for the map_event before returning
1340 * Warning: This routine will call the main loop recursively.
1345 *************************************************************/
1348 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
1351 gtk_signal_disconnect_by_data (GTK_OBJECT (widget), flag);
1355 gtk_widget_show_now (GtkWidget *widget)
1359 /* make sure we will get event */
1360 if (!GTK_WIDGET_MAPPED (widget) &&
1361 GTK_WIDGET_TOPLEVEL (widget))
1363 gtk_widget_show (widget);
1365 gtk_signal_connect (GTK_OBJECT (widget), "map_event",
1366 GTK_SIGNAL_FUNC (gtk_widget_show_map_callback),
1370 gtk_main_iteration();
1373 gtk_widget_show (widget);
1376 /*****************************************
1382 *****************************************/
1385 gtk_widget_hide (GtkWidget *widget)
1387 g_return_if_fail (widget != NULL);
1388 g_return_if_fail (GTK_IS_WIDGET (widget));
1390 if (GTK_WIDGET_VISIBLE (widget))
1391 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1395 gtk_widget_hide_on_delete (GtkWidget *widget)
1397 g_return_val_if_fail (widget != NULL, FALSE);
1398 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
1400 gtk_widget_hide (widget);
1405 /*****************************************
1406 * gtk_widget_show_all:
1408 * Shows the widget and all children.
1410 * Container classes overwrite
1411 * show_all and hide_all to call
1412 * show_all (hide_all) on both themselves
1413 * and on their child widgets.
1418 *****************************************/
1421 gtk_widget_show_all (GtkWidget *widget)
1423 GtkWidgetClass *widget_class;
1425 g_return_if_fail (widget != NULL);
1427 /* show_all shouldn't be invoked through a signal,
1428 because in this case it would be quite slow - there would
1429 be a show and show_all signal emitted for every child widget.
1431 widget_class = GTK_WIDGET_CLASS(GTK_OBJECT(widget)->klass);
1432 widget_class->show_all (widget);
1435 /*****************************************
1436 * gtk_widget_hide_all:
1438 * Hides the widget and all children.
1439 * See gtk_widget_show_all.
1444 *****************************************/
1447 gtk_widget_hide_all (GtkWidget *widget)
1449 g_return_if_fail (widget != NULL);
1450 g_assert (widget->parent);
1452 GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass)->hide_all (widget);
1455 /*****************************************
1461 *****************************************/
1464 gtk_widget_map (GtkWidget *widget)
1466 g_return_if_fail (widget != NULL);
1468 if (!GTK_WIDGET_MAPPED (widget))
1470 if (!GTK_WIDGET_REALIZED (widget))
1471 gtk_widget_realize (widget);
1473 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1477 /*****************************************
1483 *****************************************/
1486 gtk_widget_unmap (GtkWidget *widget)
1488 g_return_if_fail (widget != NULL);
1490 if (GTK_WIDGET_MAPPED (widget))
1491 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1494 /*****************************************
1495 * gtk_widget_realize:
1500 *****************************************/
1503 gtk_widget_realize (GtkWidget *widget)
1506 GdkExtensionMode mode;
1507 GtkWidgetShapeInfo *shape_info;
1509 g_return_if_fail (widget != NULL);
1511 if (!GTK_WIDGET_REALIZED (widget))
1514 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1515 g_print ("%s\n", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1518 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1519 gtk_widget_realize (widget->parent);
1521 gtk_widget_ensure_style (widget);
1523 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1525 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1527 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1529 gdk_window_shape_combine_mask (widget->window,
1530 shape_info->shape_mask,
1531 shape_info->offset_x,
1532 shape_info->offset_y);
1535 if (!GTK_WIDGET_NO_WINDOW (widget))
1537 mode = gtk_widget_get_extension_events (widget);
1538 if (mode != GDK_EXTENSION_EVENTS_NONE)
1540 events = gtk_widget_get_events (widget);
1541 gdk_input_set_extension_events (widget->window, events, mode);
1548 /*****************************************
1549 * gtk_widget_unrealize:
1554 *****************************************/
1557 gtk_widget_unrealize (GtkWidget *widget)
1559 g_return_if_fail (widget != NULL);
1561 if (GTK_WIDGET_REDRAW_PENDING (widget))
1563 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1564 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1567 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1568 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
1570 if (GTK_WIDGET_REALIZED (widget))
1572 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1573 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
1577 /*****************************************
1578 * gtk_widget_queue_draw:
1583 *****************************************/
1586 gtk_widget_idle_draw (gpointer data)
1588 while (gtk_widget_redraw_queue)
1589 gtk_widget_draw (gtk_widget_redraw_queue->data, NULL);
1595 gtk_widget_queue_draw (GtkWidget *widget)
1599 g_return_if_fail (widget != NULL);
1601 if (GTK_WIDGET_DRAWABLE (widget))
1603 /* We queue the redraw if:
1604 * a) the widget is not already queued for redraw and
1605 * b) non of the widgets ancestors are queued for redraw.
1610 if (GTK_WIDGET_REDRAW_PENDING (parent))
1612 parent = parent->parent;
1615 GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_PENDING);
1616 if (gtk_widget_redraw_queue == NULL)
1617 gtk_idle_add_priority (GTK_PRIORITY_INTERNAL,
1618 gtk_widget_idle_draw,
1621 gtk_widget_redraw_queue = g_slist_prepend (gtk_widget_redraw_queue, widget);
1626 gtk_widget_queue_resize (GtkWidget *widget)
1628 g_return_if_fail (widget != NULL);
1629 g_return_if_fail (GTK_IS_WIDGET (widget));
1631 if (GTK_IS_RESIZE_CONTAINER (widget))
1632 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1635 gtk_container_queue_resize (GTK_CONTAINER (widget->parent));
1636 else if (GTK_WIDGET_TOPLEVEL (widget))
1637 gtk_container_queue_resize (GTK_CONTAINER (widget));
1640 /*****************************************
1646 *****************************************/
1649 gtk_widget_draw (GtkWidget *widget,
1652 GdkRectangle temp_area;
1654 g_return_if_fail (widget != NULL);
1656 if (GTK_WIDGET_REDRAW_PENDING (widget))
1658 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1659 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1664 if (GTK_WIDGET_DRAWABLE (widget))
1668 if (GTK_WIDGET_NO_WINDOW (widget))
1670 temp_area.x = widget->allocation.x;
1671 temp_area.y = widget->allocation.y;
1679 temp_area.width = widget->allocation.width;
1680 temp_area.height = widget->allocation.height;
1684 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
1688 /*****************************************
1689 * gtk_widget_draw_focus:
1694 *****************************************/
1697 gtk_widget_draw_focus (GtkWidget *widget)
1699 g_return_if_fail (widget != NULL);
1701 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
1704 /*****************************************
1705 * gtk_widget_draw_default:
1710 *****************************************/
1713 gtk_widget_draw_default (GtkWidget *widget)
1715 g_return_if_fail (widget != NULL);
1717 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
1720 /*****************************************
1721 * gtk_widget_draw_children:
1726 *****************************************/
1729 gtk_widget_draw_children (GtkWidget *widget)
1731 g_return_if_fail (widget != NULL);
1733 if (GTK_IS_CONTAINER (widget))
1734 gtk_container_foreach (GTK_CONTAINER (widget),
1735 gtk_widget_draw_children_recurse,
1739 /*****************************************
1740 * gtk_widget_size_request:
1745 *****************************************/
1748 gtk_widget_size_request (GtkWidget *widget,
1749 GtkRequisition *requisition)
1751 GtkWidgetAuxInfo *aux_info;
1753 g_return_if_fail (widget != NULL);
1755 gtk_widget_ref (widget);
1756 gtk_widget_ensure_style (widget);
1757 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
1759 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1762 if (aux_info->width > 0)
1763 requisition->width = aux_info->width;
1764 if (aux_info->height > 0)
1765 requisition->height = aux_info->height;
1767 gtk_widget_unref (widget);
1770 /*****************************************
1771 * gtk_widget_size_allocate:
1776 *****************************************/
1779 gtk_widget_size_allocate (GtkWidget *widget,
1780 GtkAllocation *allocation)
1782 GtkWidgetAuxInfo *aux_info;
1783 GtkAllocation real_allocation;
1785 g_return_if_fail (widget != NULL);
1787 real_allocation = *allocation;
1788 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1792 if (aux_info->x != -1)
1793 real_allocation.x = aux_info->x;
1794 if (aux_info->y != -1)
1795 real_allocation.y = aux_info->y;
1798 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
1802 gtk_widget_stop_add_accelerator (GtkWidget *widget)
1804 g_return_if_fail (widget != NULL);
1805 g_return_if_fail (GTK_IS_WIDGET (widget));
1807 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
1811 gtk_widget_stop_remove_accelerator (GtkWidget *widget)
1813 g_return_if_fail (widget != NULL);
1814 g_return_if_fail (GTK_IS_WIDGET (widget));
1816 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR]);
1820 gtk_widget_freeze_accelerators (GtkWidget *widget)
1822 g_return_if_fail (widget != NULL);
1823 g_return_if_fail (GTK_IS_WIDGET (widget));
1825 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
1826 widget_signals[ADD_ACCELERATOR],
1828 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1831 gtk_signal_connect (GTK_OBJECT (widget),
1833 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1835 gtk_signal_connect (GTK_OBJECT (widget),
1836 "remove_accelerator",
1837 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
1843 gtk_widget_thaw_accelerators (GtkWidget *widget)
1845 g_return_if_fail (widget != NULL);
1846 g_return_if_fail (GTK_IS_WIDGET (widget));
1848 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
1849 widget_signals[ADD_ACCELERATOR],
1851 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1854 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
1855 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1857 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
1858 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
1864 gtk_widget_add_accelerator (GtkWidget *widget,
1865 const gchar *accel_signal,
1866 GtkAccelGroup *accel_group,
1869 GtkAccelFlags accel_flags)
1871 g_return_if_fail (widget != NULL);
1872 g_return_if_fail (GTK_IS_WIDGET (widget));
1873 g_return_if_fail (accel_group != NULL);
1875 gtk_accel_group_add (accel_group,
1879 (GtkObject*) widget,
1884 gtk_widget_remove_accelerator (GtkWidget *widget,
1885 GtkAccelGroup *accel_group,
1889 g_return_if_fail (widget != NULL);
1890 g_return_if_fail (GTK_IS_WIDGET (widget));
1891 g_return_if_fail (accel_group != NULL);
1893 gtk_accel_group_remove (accel_group,
1896 (GtkObject*) widget);
1900 gtk_widget_remove_accelerators (GtkWidget *widget,
1901 const gchar *accel_signal,
1902 gboolean visible_only)
1907 g_return_if_fail (widget != NULL);
1908 g_return_if_fail (GTK_IS_WIDGET (widget));
1909 g_return_if_fail (accel_signal != NULL);
1911 signal_id = gtk_signal_lookup (accel_signal, GTK_OBJECT_TYPE (widget));
1912 g_return_if_fail (signal_id != 0);
1914 slist = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
1917 GtkAccelEntry *ac_entry;
1919 ac_entry = slist->data;
1920 slist = slist->next;
1921 if (ac_entry->accel_flags & GTK_ACCEL_VISIBLE &&
1922 ac_entry->signal_id == signal_id)
1923 gtk_widget_remove_accelerator (GTK_WIDGET (widget),
1924 ac_entry->accel_group,
1925 ac_entry->accelerator_key,
1926 ac_entry->accelerator_mods);
1931 gtk_widget_accelerator_signal (GtkWidget *widget,
1932 GtkAccelGroup *accel_group,
1936 GtkAccelEntry *ac_entry;
1938 g_return_val_if_fail (widget != NULL, 0);
1939 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
1940 g_return_val_if_fail (accel_group != NULL, 0);
1942 ac_entry = gtk_accel_group_get_entry (accel_group, accel_key, accel_mods);
1944 if (ac_entry && ac_entry->object == (GtkObject*) widget)
1945 return ac_entry->signal_id;
1950 gtk_widget_real_key_press_event (GtkWidget *widget,
1953 gboolean handled = FALSE;
1955 g_return_val_if_fail (widget != NULL, handled);
1956 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
1957 g_return_val_if_fail (event != NULL, handled);
1960 handled = gtk_bindings_activate (GTK_OBJECT (widget),
1968 gtk_widget_real_key_release_event (GtkWidget *widget,
1971 gboolean handled = FALSE;
1973 g_return_val_if_fail (widget != NULL, handled);
1974 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
1975 g_return_val_if_fail (event != NULL, handled);
1978 handled = gtk_bindings_activate (GTK_OBJECT (widget),
1980 event->state | GDK_RELEASE_MASK);
1985 /*****************************************
1991 *****************************************/
1994 gtk_widget_event (GtkWidget *widget,
2000 g_return_val_if_fail (widget != NULL, TRUE);
2002 gtk_widget_ref (widget);
2004 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
2006 if (return_val || GTK_OBJECT_DESTROYED (widget))
2008 gtk_widget_unref (widget);
2012 switch (event->type)
2017 case GDK_BUTTON_PRESS:
2018 case GDK_2BUTTON_PRESS:
2019 case GDK_3BUTTON_PRESS:
2020 signal_num = BUTTON_PRESS_EVENT;
2022 case GDK_BUTTON_RELEASE:
2023 signal_num = BUTTON_RELEASE_EVENT;
2025 case GDK_MOTION_NOTIFY:
2026 signal_num = MOTION_NOTIFY_EVENT;
2029 signal_num = DELETE_EVENT;
2032 signal_num = DESTROY_EVENT;
2035 signal_num = KEY_PRESS_EVENT;
2037 case GDK_KEY_RELEASE:
2038 signal_num = KEY_RELEASE_EVENT;
2040 case GDK_ENTER_NOTIFY:
2041 signal_num = ENTER_NOTIFY_EVENT;
2043 case GDK_LEAVE_NOTIFY:
2044 signal_num = LEAVE_NOTIFY_EVENT;
2046 case GDK_FOCUS_CHANGE:
2047 if (event->focus_change.in)
2048 signal_num = FOCUS_IN_EVENT;
2050 signal_num = FOCUS_OUT_EVENT;
2053 signal_num = CONFIGURE_EVENT;
2056 signal_num = MAP_EVENT;
2059 signal_num = UNMAP_EVENT;
2061 case GDK_PROPERTY_NOTIFY:
2062 signal_num = PROPERTY_NOTIFY_EVENT;
2064 case GDK_SELECTION_CLEAR:
2065 signal_num = SELECTION_CLEAR_EVENT;
2067 case GDK_SELECTION_REQUEST:
2068 signal_num = SELECTION_REQUEST_EVENT;
2070 case GDK_SELECTION_NOTIFY:
2071 signal_num = SELECTION_NOTIFY_EVENT;
2073 case GDK_PROXIMITY_IN:
2074 signal_num = PROXIMITY_IN_EVENT;
2076 case GDK_PROXIMITY_OUT:
2077 signal_num = PROXIMITY_OUT_EVENT;
2079 case GDK_DRAG_BEGIN:
2080 signal_num = DRAG_BEGIN_EVENT;
2082 case GDK_DRAG_REQUEST:
2083 signal_num = DRAG_REQUEST_EVENT;
2085 case GDK_DROP_ENTER:
2086 signal_num = DROP_ENTER_EVENT;
2088 case GDK_DROP_LEAVE:
2089 signal_num = DROP_LEAVE_EVENT;
2091 case GDK_DROP_DATA_AVAIL:
2092 signal_num = DROP_DATA_AVAILABLE_EVENT;
2094 case GDK_OTHER_EVENT:
2095 signal_num = OTHER_EVENT;
2098 signal_num = NO_EXPOSE_EVENT;
2100 case GDK_CLIENT_EVENT:
2101 signal_num = CLIENT_EVENT;
2104 /* there is no sense in providing a widget with bogus expose events
2106 if (!event->any.window)
2108 gtk_widget_unref (widget);
2111 signal_num = EXPOSE_EVENT;
2113 case GDK_VISIBILITY_NOTIFY:
2114 signal_num = VISIBILITY_NOTIFY_EVENT;
2117 g_warning ("could not determine signal number for event: %d", event->type);
2118 gtk_widget_unref (widget);
2122 if (signal_num != -1)
2123 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
2125 return_val |= GTK_OBJECT_DESTROYED (widget);
2127 gtk_widget_unref (widget);
2132 /*****************************************
2133 * gtk_widget_activate:
2138 *****************************************/
2141 gtk_widget_activate (GtkWidget *widget)
2143 g_return_if_fail (widget != NULL);
2144 g_return_if_fail (GTK_IS_WIDGET (widget));
2146 if (WIDGET_CLASS (widget)->activate_signal)
2147 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
2150 /*****************************************
2151 * gtk_widget_reparent_container_child:
2152 * assistent function to gtk_widget_reparent
2157 *****************************************/
2160 gtk_widget_reparent_container_child(GtkWidget *widget,
2161 gpointer client_data)
2163 g_return_if_fail (widget != NULL);
2164 g_return_if_fail (client_data != NULL);
2166 if (GTK_WIDGET_NO_WINDOW (widget))
2169 gdk_window_unref (widget->window);
2170 widget->window = (GdkWindow*) client_data;
2172 gdk_window_ref (widget->window);
2174 if (GTK_IS_CONTAINER (widget))
2175 gtk_container_foreach (GTK_CONTAINER (widget),
2176 gtk_widget_reparent_container_child,
2180 gdk_window_reparent (widget->window,
2181 (GdkWindow*) client_data, 0, 0);
2184 /*****************************************
2185 * gtk_widget_reparent:
2190 *****************************************/
2193 gtk_widget_reparent (GtkWidget *widget,
2194 GtkWidget *new_parent)
2196 g_return_if_fail (widget != NULL);
2197 g_return_if_fail (GTK_IS_WIDGET (widget));
2198 g_return_if_fail (new_parent != NULL);
2199 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
2200 g_return_if_fail (widget->parent != NULL);
2202 if (widget->parent != new_parent)
2204 /* First try to see if we can get away without unrealizing
2205 * the widget as we reparent it. if so we set a flag so
2206 * that gtk_widget_unparent doesn't unrealize widget
2208 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
2209 GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
2211 gtk_widget_ref (widget);
2212 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
2213 gtk_container_add (GTK_CONTAINER (new_parent), widget);
2214 gtk_widget_unref (widget);
2216 if (GTK_WIDGET_IN_REPARENT (widget))
2218 GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
2220 /* OK, now fix up the widget's window. (And that for any
2221 * children, if the widget is NO_WINDOW and a container)
2223 if (GTK_WIDGET_NO_WINDOW (widget))
2225 if (GTK_IS_CONTAINER (widget))
2226 gtk_container_foreach (GTK_CONTAINER (widget),
2227 gtk_widget_reparent_container_child,
2228 gtk_widget_get_parent_window (widget));
2231 GdkWindow *parent_window;
2233 parent_window = gtk_widget_get_parent_window (widget);
2234 if (parent_window != widget->window)
2237 gdk_window_unref (widget->window);
2238 widget->window = parent_window;
2240 gdk_window_ref (widget->window);
2245 gdk_window_reparent (widget->window, gtk_widget_get_parent_window (widget), 0, 0);
2250 /*****************************************
2256 *****************************************/
2259 gtk_widget_popup (GtkWidget *widget,
2263 g_return_if_fail (widget != NULL);
2265 if (!GTK_WIDGET_VISIBLE (widget))
2267 if (!GTK_WIDGET_REALIZED (widget))
2268 gtk_widget_realize (widget);
2269 if (!GTK_WIDGET_NO_WINDOW (widget))
2270 gdk_window_move (widget->window, x, y);
2271 gtk_widget_show (widget);
2275 /*****************************************
2276 * gtk_widget_intersect:
2281 *****************************************/
2284 gtk_widget_intersect (GtkWidget *widget,
2286 GdkRectangle *intersection)
2292 g_return_val_if_fail (widget != NULL, FALSE);
2293 g_return_val_if_fail (area != NULL, FALSE);
2296 dest = intersection;
2300 return_val = gdk_rectangle_intersect ((GdkRectangle*) &widget->allocation, area, dest);
2302 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2304 intersection->x -= widget->allocation.x;
2305 intersection->y -= widget->allocation.y;
2313 gtk_widget_basic (GtkWidget *widget)
2319 g_return_val_if_fail (widget != NULL, FALSE);
2321 if (!GTK_WIDGET_BASIC (widget))
2323 else if (GTK_IS_CONTAINER (widget))
2325 children = gtk_container_children (GTK_CONTAINER (widget));
2329 tmp_list = children;
2333 if (!gtk_widget_basic (GTK_WIDGET (tmp_list->data)))
2339 tmp_list = tmp_list->next;
2342 g_list_free (children);
2351 /*****************************************
2352 * gtk_widget_grab_focus:
2357 *****************************************/
2360 gtk_widget_grab_focus (GtkWidget *widget)
2362 g_return_if_fail (widget != NULL);
2363 g_return_if_fail (GTK_IS_WIDGET (widget));
2365 if (GTK_WIDGET_CAN_FOCUS (widget))
2369 GtkType window_type;
2371 window_type = gtk_window_get_type ();
2372 parent = widget->parent;
2375 while (parent && !gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2377 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2379 parent = parent->parent;
2382 if (parent && gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2384 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2385 gtk_window_set_focus (GTK_WINDOW (parent), widget);
2390 /*****************************************
2391 * gtk_widget_grab_default:
2396 *****************************************/
2399 gtk_widget_grab_default (GtkWidget *widget)
2402 GtkType window_type;
2404 g_return_if_fail (widget != NULL);
2405 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
2407 window_type = gtk_window_get_type ();
2408 window = widget->parent;
2410 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2411 window = window->parent;
2413 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2414 gtk_window_set_default (GTK_WINDOW (window), widget);
2417 /*****************************************
2418 * gtk_widget_set_name:
2423 *****************************************/
2426 gtk_widget_set_name (GtkWidget *widget,
2429 g_return_if_fail (widget != NULL);
2432 g_free (widget->name);
2433 widget->name = g_strdup (name);
2435 if (!GTK_WIDGET_USER_STYLE (widget))
2436 gtk_widget_set_rc_style (widget);
2439 /*****************************************
2440 * gtk_widget_get_name:
2445 *****************************************/
2448 gtk_widget_get_name (GtkWidget *widget)
2450 g_return_val_if_fail (widget != NULL, NULL);
2453 return widget->name;
2454 return gtk_type_name (GTK_WIDGET_TYPE (widget));
2457 /*****************************************
2458 * gtk_widget_set_state:
2465 *****************************************/
2468 gtk_widget_set_state (GtkWidget *widget,
2471 g_return_if_fail (widget != NULL);
2472 g_return_if_fail (GTK_IS_WIDGET (widget));
2474 if (state == GTK_WIDGET_STATE (widget))
2477 if (state == GTK_STATE_INSENSITIVE)
2478 gtk_widget_set_sensitive (widget, FALSE);
2484 data.state_restauration = FALSE;
2486 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2488 data.parent_sensitive = TRUE;
2490 gtk_widget_propagate_state (widget, &data);
2491 gtk_widget_queue_draw (widget);
2495 /*****************************************
2496 * gtk_widget_set_sensitive:
2500 * boolean value for sensitivity
2503 *****************************************/
2506 gtk_widget_set_sensitive (GtkWidget *widget,
2511 g_return_if_fail (widget != NULL);
2512 g_return_if_fail (GTK_IS_WIDGET (widget));
2514 sensitive = (sensitive != FALSE);
2516 if (sensitive == (GTK_WIDGET_SENSITIVE (widget) != FALSE))
2521 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
2522 data.state = GTK_WIDGET_SAVED_STATE (widget);
2526 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
2527 data.state = GTK_WIDGET_STATE (widget);
2529 data.state_restauration = TRUE;
2532 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2534 data.parent_sensitive = TRUE;
2536 gtk_widget_propagate_state (widget, &data);
2537 gtk_widget_queue_draw (widget);
2540 /*****************************************
2541 * gtk_widget_set_parent:
2546 *****************************************/
2549 gtk_widget_set_parent (GtkWidget *widget,
2554 g_return_if_fail (widget != NULL);
2555 g_return_if_fail (widget->parent == NULL);
2556 g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
2557 g_return_if_fail (parent != NULL);
2558 g_return_if_fail (widget != parent);
2560 /* keep this function in sync with gtk_menu_attach_to_widget()
2563 gtk_widget_ref (widget);
2564 gtk_object_sink (GTK_OBJECT (widget));
2565 widget->parent = parent;
2567 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
2568 data.state = GTK_WIDGET_STATE (parent);
2570 data.state = GTK_WIDGET_STATE (widget);
2571 data.state_restauration = FALSE;
2572 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (parent) != FALSE);
2574 gtk_widget_propagate_state (widget, &data);
2576 gtk_widget_set_style_recurse (widget, NULL);
2578 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
2581 /*****************************************
2583 * see docs/styles.txt
2584 *****************************************/
2586 gtk_widget_set_style (GtkWidget *widget,
2589 GtkStyle *default_style;
2590 gboolean initial_emission;
2592 g_return_if_fail (widget != NULL);
2593 g_return_if_fail (style != NULL);
2595 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2597 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
2598 GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
2600 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2603 gtk_style_ref (widget->style);
2604 if (!saved_default_style_key_id)
2605 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2606 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2609 gtk_widget_set_style_internal (widget, style, initial_emission);
2613 gtk_widget_ensure_style (GtkWidget *widget)
2615 if (!GTK_WIDGET_USER_STYLE (widget) &&
2616 !GTK_WIDGET_RC_STYLE (widget))
2617 gtk_widget_set_rc_style (widget);
2621 gtk_widget_set_rc_style (GtkWidget *widget)
2623 GtkStyle *saved_style;
2624 GtkStyle *new_style;
2625 gboolean initial_emission;
2627 g_return_if_fail (widget != NULL);
2629 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2631 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2632 GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
2634 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2635 new_style = gtk_rc_get_style (widget);
2640 gtk_style_ref (widget->style);
2641 if (!saved_default_style_key_id)
2642 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2643 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2645 gtk_widget_set_style_internal (widget, new_style, initial_emission);
2651 g_assert (initial_emission == FALSE); /* FIXME: remove this line */
2653 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2654 gtk_widget_set_style_internal (widget, saved_style, initial_emission);
2655 gtk_style_unref (saved_style);
2659 if (initial_emission)
2660 gtk_widget_set_style_internal (widget, widget->style, TRUE);
2666 gtk_widget_restore_default_style (GtkWidget *widget)
2668 GtkStyle *default_style;
2670 g_return_if_fail (widget != NULL);
2672 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2674 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2677 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2678 gtk_widget_set_style_internal (widget, default_style, FALSE);
2679 gtk_style_unref (default_style);
2684 gtk_widget_get_style (GtkWidget *widget)
2686 g_return_val_if_fail (widget != NULL, NULL);
2688 return widget->style;
2692 gtk_widget_style_set (GtkWidget *widget,
2693 GtkStyle *previous_style)
2695 if (GTK_WIDGET_REALIZED (widget) &&
2696 !GTK_WIDGET_NO_WINDOW (widget))
2698 gtk_style_set_background (widget->style, widget->window, widget->state);
2699 if (GTK_WIDGET_DRAWABLE (widget))
2700 gdk_window_clear (widget->window);
2705 gtk_widget_set_style_internal (GtkWidget *widget,
2707 gboolean initial_emission)
2709 g_return_if_fail (widget != NULL);
2710 g_return_if_fail (style != NULL);
2712 if (widget->style != style)
2714 GtkStyle *previous_style;
2716 if (GTK_WIDGET_REALIZED (widget))
2717 gtk_style_detach (widget->style);
2719 previous_style = widget->style;
2720 widget->style = style;
2721 gtk_style_ref (widget->style);
2723 if (GTK_WIDGET_REALIZED (widget))
2724 widget->style = gtk_style_attach (widget->style, widget->window);
2726 gtk_signal_emit (GTK_OBJECT (widget),
2727 widget_signals[STYLE_SET],
2728 initial_emission ? NULL : previous_style);
2729 gtk_style_unref (previous_style);
2731 if (widget->parent && !initial_emission)
2733 GtkRequisition old_requisition;
2735 old_requisition = widget->requisition;
2736 gtk_widget_size_request (widget, &widget->requisition);
2738 if ((old_requisition.width != widget->requisition.width) ||
2739 (old_requisition.height != widget->requisition.height))
2740 gtk_widget_queue_resize (widget);
2741 else if (GTK_WIDGET_DRAWABLE (widget))
2742 gtk_widget_queue_draw (widget);
2745 else if (initial_emission)
2747 gtk_signal_emit (GTK_OBJECT (widget),
2748 widget_signals[STYLE_SET],
2754 gtk_widget_set_style_recurse (GtkWidget *widget,
2755 gpointer client_data)
2757 if (GTK_WIDGET_RC_STYLE (widget))
2758 gtk_widget_set_rc_style (widget);
2760 if (GTK_IS_CONTAINER (widget))
2761 gtk_container_foreach (GTK_CONTAINER (widget),
2762 gtk_widget_set_style_recurse,
2767 gtk_widget_reset_rc_styles (GtkWidget *widget)
2769 gtk_widget_set_style_recurse (widget, NULL);
2773 gtk_widget_set_default_style (GtkStyle *style)
2775 if (style != default_style)
2778 gtk_style_unref (default_style);
2779 default_style = style;
2781 gtk_style_ref (default_style);
2786 gtk_widget_get_default_style (void)
2790 default_style = gtk_style_new ();
2791 gtk_style_ref (default_style);
2794 return default_style;
2798 gtk_widget_push_style (GtkStyle *style)
2800 g_return_if_fail (style != NULL);
2802 gtk_style_ref (style);
2803 style_stack = g_slist_prepend (style_stack, style);
2807 gtk_widget_peek_style (void)
2810 return (GtkStyle*) style_stack->data;
2812 return gtk_widget_get_default_style ();
2816 gtk_widget_pop_style (void)
2823 style_stack = style_stack->next;
2824 gtk_style_unref ((GtkStyle*) tmp->data);
2825 g_slist_free_1 (tmp);
2829 /*************************************************************
2830 * gtk_widget_set_parent_window:
2831 * Set a non default parent window for widget
2838 *************************************************************/
2841 gtk_widget_set_parent_window (GtkWidget *widget,
2842 GdkWindow *parent_window)
2844 GdkWindow *old_parent_window;
2846 g_return_if_fail (widget != NULL);
2848 old_parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2849 parent_window_key_id);
2851 if (parent_window != old_parent_window)
2853 if (!parent_window_key_id)
2854 parent_window_key_id = g_quark_from_static_string (parent_window_key);
2855 gtk_object_set_data_by_id (GTK_OBJECT (widget), parent_window_key_id,
2857 if (old_parent_window)
2858 gdk_window_unref (old_parent_window);
2860 gdk_window_ref (parent_window);
2864 /*************************************************************
2865 * gtk_widget_get_parent_window:
2866 * Get widget's parent window
2873 *************************************************************/
2876 gtk_widget_get_parent_window (GtkWidget *widget)
2878 GdkWindow *parent_window;
2880 g_return_val_if_fail (widget != NULL, NULL);
2881 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
2882 g_return_val_if_fail (widget->parent != NULL, NULL);
2884 parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2885 parent_window_key_id);
2887 return (parent_window != NULL) ? parent_window : widget->parent->window;
2890 /*****************************************
2891 * gtk_widget_set_uposition:
2896 *****************************************/
2899 gtk_widget_set_uposition (GtkWidget *widget,
2903 GtkWidgetAuxInfo *aux_info;
2905 g_return_if_fail (widget != NULL);
2907 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2910 if (!aux_info_key_id)
2911 aux_info_key_id = g_quark_from_static_string (aux_info_key);
2912 aux_info = gtk_widget_aux_info_new ();
2913 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2921 if (GTK_WIDGET_REALIZED (widget) && GTK_IS_WINDOW (widget) &&
2922 (aux_info->x != -1) && (aux_info->y != -1))
2924 gdk_window_set_hints (widget->window, aux_info->x, aux_info->y, 0, 0, 0, 0, GDK_HINT_POS);
2925 gdk_window_move (widget->window, aux_info->x, aux_info->y);
2928 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
2929 gtk_widget_size_allocate (widget, &widget->allocation);
2932 /*****************************************
2933 * gtk_widget_set_usize:
2938 *****************************************/
2941 gtk_widget_set_usize (GtkWidget *widget,
2945 GtkWidgetAuxInfo *aux_info;
2947 g_return_if_fail (widget != NULL);
2949 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2952 if (!aux_info_key_id)
2953 aux_info_key_id = g_quark_from_static_string (aux_info_key);
2954 aux_info = gtk_widget_aux_info_new ();
2955 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2959 aux_info->width = width;
2961 aux_info->height = height;
2963 if (GTK_WIDGET_VISIBLE (widget))
2964 gtk_widget_queue_resize (widget);
2967 /*****************************************
2968 * gtk_widget_set_events:
2973 *****************************************/
2976 gtk_widget_set_events (GtkWidget *widget,
2981 g_return_if_fail (widget != NULL);
2982 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
2983 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
2985 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
2990 eventp = g_new (gint, 1);
2994 event_key_id = g_quark_from_static_string (event_key);
2995 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3000 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3004 /*****************************************
3005 * gtk_widget_set_extension_events:
3010 *****************************************/
3013 gtk_widget_set_extension_events (GtkWidget *widget,
3014 GdkExtensionMode mode)
3016 GdkExtensionMode *modep;
3018 g_return_if_fail (widget != NULL);
3020 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3023 modep = g_new (GdkExtensionMode, 1);
3026 if (!extension_event_key_id)
3027 extension_event_key_id = g_quark_from_static_string (extension_event_key);
3028 gtk_object_set_data_by_id (GTK_OBJECT (widget), extension_event_key_id, modep);
3031 /*****************************************
3032 * gtk_widget_get_toplevel:
3037 *****************************************/
3040 gtk_widget_get_toplevel (GtkWidget *widget)
3042 g_return_val_if_fail (widget != NULL, NULL);
3044 while (widget->parent)
3045 widget = widget->parent;
3050 /*****************************************
3051 * gtk_widget_get_ancestor:
3056 *****************************************/
3059 gtk_widget_get_ancestor (GtkWidget *widget,
3060 GtkType widget_type)
3062 g_return_val_if_fail (widget != NULL, NULL);
3064 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type))
3065 widget = widget->parent;
3067 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type)))
3073 /*****************************************
3074 * gtk_widget_get_colormap:
3079 *****************************************/
3082 gtk_widget_get_colormap (GtkWidget *widget)
3084 GdkColormap *colormap;
3086 g_return_val_if_fail (widget != NULL, NULL);
3088 if (!widget->window)
3090 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
3093 return gtk_widget_get_default_colormap ();
3096 return gdk_window_get_colormap (widget->window);
3099 /*****************************************
3100 * gtk_widget_get_visual:
3105 *****************************************/
3108 gtk_widget_get_visual (GtkWidget *widget)
3112 g_return_val_if_fail (widget != NULL, NULL);
3114 if (!widget->window)
3116 visual = gtk_object_get_data (GTK_OBJECT (widget), visual_key);
3119 return gtk_widget_get_default_visual ();
3122 return gdk_window_get_visual (widget->window);
3125 /*****************************************
3126 * gtk_widget_get_events:
3131 *****************************************/
3134 gtk_widget_get_events (GtkWidget *widget)
3138 g_return_val_if_fail (widget != NULL, 0);
3140 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3147 /*****************************************
3148 * gtk_widget_get_extension_events:
3153 *****************************************/
3156 gtk_widget_get_extension_events (GtkWidget *widget)
3158 GdkExtensionMode *mode;
3160 g_return_val_if_fail (widget != NULL, 0);
3162 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3169 /*****************************************
3170 * gtk_widget_get_pointer:
3175 *****************************************/
3178 gtk_widget_get_pointer (GtkWidget *widget,
3182 g_return_if_fail (widget != NULL);
3189 if (GTK_WIDGET_REALIZED (widget))
3191 gdk_window_get_pointer (widget->window, x, y, NULL);
3193 if (GTK_WIDGET_NO_WINDOW (widget))
3196 *x -= widget->allocation.x;
3198 *y -= widget->allocation.y;
3203 /*****************************************
3204 * gtk_widget_is_ancestor:
3209 *****************************************/
3212 gtk_widget_is_ancestor (GtkWidget *widget,
3213 GtkWidget *ancestor)
3215 g_return_val_if_fail (widget != NULL, FALSE);
3216 g_return_val_if_fail (ancestor != NULL, FALSE);
3220 if (widget->parent == ancestor)
3222 widget = widget->parent;
3228 /*****************************************
3229 * gtk_widget_is_child:
3234 *****************************************/
3237 gtk_widget_is_child (GtkWidget *widget,
3240 g_return_val_if_fail (widget != NULL, FALSE);
3241 g_return_val_if_fail (child != NULL, FALSE);
3243 return (child->parent == widget);
3246 /*****************************************
3247 * gtk_widget_push_colormap:
3252 *****************************************/
3255 gtk_widget_push_colormap (GdkColormap *cmap)
3257 g_return_if_fail (cmap != NULL);
3259 colormap_stack = g_slist_prepend (colormap_stack, cmap);
3262 /*****************************************
3263 * gtk_widget_push_visual:
3268 *****************************************/
3271 gtk_widget_push_visual (GdkVisual *visual)
3273 g_return_if_fail (visual != NULL);
3275 visual_stack = g_slist_prepend (visual_stack, visual);
3278 /*****************************************
3279 * gtk_widget_pop_colormap:
3284 *****************************************/
3287 gtk_widget_pop_colormap (void)
3293 tmp = colormap_stack;
3294 colormap_stack = colormap_stack->next;
3295 g_slist_free_1 (tmp);
3299 /*****************************************
3300 * gtk_widget_pop_visual:
3305 *****************************************/
3308 gtk_widget_pop_visual (void)
3315 visual_stack = visual_stack->next;
3316 g_slist_free_1 (tmp);
3320 /*****************************************
3321 * gtk_widget_set_default_colormap:
3326 *****************************************/
3329 gtk_widget_set_default_colormap (GdkColormap *colormap)
3331 if (default_colormap != colormap)
3333 if (default_colormap)
3334 gdk_colormap_unref (default_colormap);
3335 default_colormap = colormap;
3336 if (default_colormap)
3337 gdk_colormap_ref (default_colormap);
3341 /*****************************************
3342 * gtk_widget_set_default_visual:
3347 *****************************************/
3350 gtk_widget_set_default_visual (GdkVisual *visual)
3352 default_visual = visual;
3355 /*****************************************
3356 * gtk_widget_get_default_colormap:
3361 *****************************************/
3364 gtk_widget_get_default_colormap (void)
3366 if (!default_colormap)
3367 default_colormap = gdk_colormap_get_system ();
3369 return default_colormap;
3372 /*****************************************
3373 * gtk_widget_get_default_visual:
3378 *****************************************/
3381 gtk_widget_get_default_visual (void)
3383 if (!default_visual)
3384 default_visual = gdk_visual_get_system ();
3386 return default_visual;
3389 /*****************************************
3390 * gtk_widget_marshal_signal_1:
3395 *****************************************/
3398 gtk_widget_marshal_signal_1 (GtkObject *object,
3403 GtkWidgetSignal1 rfunc;
3405 rfunc = (GtkWidgetSignal1) func;
3408 GTK_VALUE_POINTER (args[0]),
3412 /*****************************************
3413 * gtk_widget_marshal_signal_4:
3418 *****************************************/
3421 gtk_widget_marshal_signal_4 (GtkObject *object,
3426 GtkWidgetSignal4 rfunc;
3429 rfunc = (GtkWidgetSignal4) func;
3430 return_val = GTK_RETLOC_BOOL (args[1]);
3432 *return_val = (* rfunc) (object,
3433 GTK_VALUE_BOXED (args[0]),
3437 /*****************************************
3438 * gtk_widget_marshal_signal_5:
3443 *****************************************/
3446 gtk_widget_marshal_signal_5 (GtkObject *object,
3451 GtkWidgetSignal5 rfunc;
3453 rfunc = (GtkWidgetSignal5) func;
3456 GTK_VALUE_UINT (args[0]),
3460 /*****************************************
3461 * gtk_widget_marshal_signal_6:
3466 *****************************************/
3469 gtk_widget_marshal_signal_6 (GtkObject *object,
3474 GtkWidgetSignal6 rfunc;
3476 rfunc = (GtkWidgetSignal6) func;
3479 GTK_VALUE_OBJECT (args[0]),
3483 /*****************************************
3484 * gtk_widget_marshal_signal_7:
3489 *****************************************/
3492 gtk_widget_marshal_signal_7 (GtkObject *object,
3497 GtkWidgetSignal7 rfunc;
3499 rfunc = (GtkWidgetSignal7) func;
3502 GTK_VALUE_BOXED (args[0]),
3507 gtk_widget_shutdown (GtkObject *object)
3511 /* gtk_object_destroy() will already hold a refcount on object
3513 widget = GTK_WIDGET (object);
3516 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
3518 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3519 if (GTK_WIDGET_REALIZED (widget))
3520 gtk_widget_unrealize (widget);
3522 parent_class->shutdown (object);
3526 gtk_widget_real_destroy (GtkObject *object)
3529 GtkStyle *saved_style;
3531 /* gtk_object_destroy() will already hold a refcount on object
3533 widget = GTK_WIDGET (object);
3535 gtk_grab_remove (widget);
3536 gtk_selection_remove_all (widget);
3538 saved_style = gtk_object_get_data_by_id (object, saved_default_style_key_id);
3541 gtk_style_unref (saved_style);
3542 gtk_object_remove_data_by_id (object, saved_default_style_key_id);
3545 gtk_style_unref (widget->style);
3546 widget->style = NULL;
3548 parent_class->destroy (object);
3552 gtk_widget_finalize (GtkObject *object)
3555 GtkWidgetAuxInfo *aux_info;
3557 GdkExtensionMode *mode;
3559 widget = GTK_WIDGET (object);
3562 g_free (widget->name);
3564 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3566 gtk_widget_aux_info_destroy (aux_info);
3568 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3572 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3576 parent_class->finalize (object);
3579 /*****************************************
3580 * gtk_widget_real_show:
3585 *****************************************/
3588 gtk_widget_real_show (GtkWidget *widget)
3590 g_return_if_fail (widget != NULL);
3591 g_return_if_fail (GTK_IS_WIDGET (widget));
3593 if (!GTK_WIDGET_VISIBLE (widget))
3595 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
3599 gtk_widget_queue_resize (widget->parent);
3601 if (GTK_WIDGET_MAPPED (widget->parent))
3602 gtk_widget_map (widget);
3607 /*****************************************
3608 * gtk_widget_real_hide:
3613 *****************************************/
3616 gtk_widget_real_hide (GtkWidget *widget)
3618 g_return_if_fail (widget != NULL);
3619 g_return_if_fail (GTK_IS_WIDGET (widget));
3621 if (GTK_WIDGET_VISIBLE (widget))
3623 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3625 if (GTK_WIDGET_MAPPED (widget))
3626 gtk_widget_unmap (widget);
3629 gtk_widget_queue_resize (widget->parent);
3633 /*****************************************
3634 * gtk_widget_real_map:
3639 *****************************************/
3642 gtk_widget_real_map (GtkWidget *widget)
3644 g_return_if_fail (widget != NULL);
3645 g_return_if_fail (GTK_IS_WIDGET (widget));
3647 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget))
3649 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
3651 if (!GTK_WIDGET_NO_WINDOW (widget))
3652 gdk_window_show (widget->window);
3654 gtk_widget_queue_draw (widget);
3658 /*****************************************
3659 * gtk_widget_real_unmap:
3664 *****************************************/
3667 gtk_widget_real_unmap (GtkWidget *widget)
3669 g_return_if_fail (widget != NULL);
3670 g_return_if_fail (GTK_IS_WIDGET (widget));
3672 if (GTK_WIDGET_MAPPED (widget))
3674 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
3676 if (GTK_WIDGET_NO_WINDOW (widget))
3677 gdk_window_clear_area (widget->window,
3678 widget->allocation.x,
3679 widget->allocation.y,
3680 widget->allocation.width,
3681 widget->allocation.height);
3683 gdk_window_hide (widget->window);
3687 /*****************************************
3688 * gtk_widget_real_realize:
3693 *****************************************/
3696 gtk_widget_real_realize (GtkWidget *widget)
3698 g_return_if_fail (widget != NULL);
3699 g_return_if_fail (GTK_IS_WIDGET (widget));
3700 g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
3702 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
3705 widget->window = gtk_widget_get_parent_window (widget);
3706 gdk_window_ref (widget->window);
3708 widget->style = gtk_style_attach (widget->style, widget->window);
3711 /*****************************************
3712 * gtk_widget_real_unrealize:
3717 *****************************************/
3720 gtk_widget_real_unrealize (GtkWidget *widget)
3722 g_return_if_fail (widget != NULL);
3723 g_return_if_fail (GTK_IS_WIDGET (widget));
3725 if (GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_MAPPED (widget))
3726 gtk_widget_real_unmap (widget);
3728 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
3730 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT(widget)->klass->type));
3733 gtk_style_detach (widget->style);
3734 if (!GTK_WIDGET_NO_WINDOW (widget))
3736 gdk_window_set_user_data (widget->window, NULL);
3737 gdk_window_destroy (widget->window);
3738 widget->window = NULL;
3742 gdk_window_unref (widget->window);
3743 widget->window = NULL;
3746 /* Unrealize afterwards to improve visual effect */
3748 if (GTK_IS_CONTAINER (widget))
3749 gtk_container_foreach (GTK_CONTAINER (widget),
3750 (GtkCallback) gtk_widget_unrealize,
3754 /*****************************************
3755 * gtk_widget_real_draw:
3760 *****************************************/
3763 gtk_widget_real_draw (GtkWidget *widget,
3766 GdkEventExpose event;
3768 g_return_if_fail (widget != NULL);
3769 g_return_if_fail (GTK_IS_WIDGET (widget));
3770 g_return_if_fail (area != NULL);
3772 if (GTK_WIDGET_DRAWABLE (widget))
3774 event.type = GDK_EXPOSE;
3775 event.send_event = TRUE;
3776 event.window = widget->window;
3780 gdk_window_ref (event.window);
3781 gtk_widget_event (widget, (GdkEvent*) &event);
3782 gdk_window_unref (event.window);
3786 /*****************************************
3787 * gtk_widget_real_size_allocate:
3792 *****************************************/
3795 gtk_widget_real_size_allocate (GtkWidget *widget,
3796 GtkAllocation *allocation)
3798 g_return_if_fail (widget != NULL);
3799 g_return_if_fail (GTK_IS_WIDGET (widget));
3801 if (GTK_WIDGET_NO_WINDOW (widget) &&
3802 GTK_WIDGET_MAPPED (widget) &&
3803 ((widget->allocation.x != allocation->x) ||
3804 (widget->allocation.y != allocation->y) ||
3805 (widget->allocation.width != allocation->width) ||
3806 (widget->allocation.height != allocation->height)) &&
3807 (widget->allocation.width != 0) &&
3808 (widget->allocation.height != 0))
3809 gdk_window_clear_area (widget->window,
3810 widget->allocation.x,
3811 widget->allocation.y,
3812 widget->allocation.width,
3813 widget->allocation.height);
3815 widget->allocation = *allocation;
3817 if (GTK_WIDGET_REALIZED (widget) &&
3818 !GTK_WIDGET_NO_WINDOW (widget))
3819 gdk_window_move_resize (widget->window,
3820 allocation->x, allocation->y,
3821 allocation->width, allocation->height);
3824 /*****************************************
3825 * gtk_widget_peek_colormap:
3830 *****************************************/
3833 gtk_widget_peek_colormap (void)
3836 return (GdkColormap*) colormap_stack->data;
3837 return gtk_widget_get_default_colormap ();
3840 /*****************************************
3841 * gtk_widget_peek_visual:
3846 *****************************************/
3849 gtk_widget_peek_visual (void)
3852 return (GdkVisual*) visual_stack->data;
3853 return gtk_widget_get_default_visual ();
3856 /*************************************************************
3857 * gtk_widget_propagate_state:
3858 * Propagate a change in the widgets state down the tree
3862 * GtkStateData: state
3866 *************************************************************/
3869 gtk_widget_propagate_state (GtkWidget *widget,
3874 /* don't call this function with state==GTK_STATE_INSENSITIVE,
3875 * parent_sensitive==TRUE on a sensitive widget
3878 old_state = GTK_WIDGET_STATE (widget);
3880 if (data->parent_sensitive)
3882 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3884 if (GTK_WIDGET_IS_SENSITIVE (widget))
3886 if (data->state_restauration)
3887 GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget);
3889 GTK_WIDGET_STATE (widget) = data->state;
3893 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3894 if (!data->state_restauration &&
3895 data->state != GTK_STATE_INSENSITIVE)
3896 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3901 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3902 if (!data->state_restauration)
3904 if (data->state != GTK_STATE_INSENSITIVE)
3905 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3907 else if (GTK_WIDGET_STATE (widget) != GTK_STATE_INSENSITIVE)
3908 GTK_WIDGET_SAVED_STATE (widget) = GTK_WIDGET_STATE (widget);
3909 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3912 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
3916 window = gtk_widget_get_ancestor (widget, gtk_window_get_type ());
3918 gtk_window_set_focus (GTK_WINDOW (window), NULL);
3921 if (old_state != GTK_WIDGET_STATE (widget))
3923 gtk_widget_ref (widget);
3924 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
3926 if (GTK_IS_CONTAINER (widget))
3928 data->parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget) != FALSE);
3929 data->state = GTK_WIDGET_STATE (widget);
3930 gtk_container_foreach (GTK_CONTAINER (widget),
3931 (GtkCallback) gtk_widget_propagate_state,
3934 gtk_widget_unref (widget);
3938 /*****************************************
3939 * gtk_widget_draw_children_recurse:
3944 *****************************************/
3947 gtk_widget_draw_children_recurse (GtkWidget *widget,
3948 gpointer client_data)
3950 gtk_widget_draw (widget, NULL);
3951 gtk_widget_draw_children (widget);
3954 /*****************************************
3955 * gtk_widget_aux_info_new:
3960 *****************************************/
3962 static GtkWidgetAuxInfo*
3963 gtk_widget_aux_info_new (void)
3965 GtkWidgetAuxInfo *aux_info;
3967 if (!aux_info_mem_chunk)
3968 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
3969 sizeof (GtkWidgetAuxInfo),
3970 1024, G_ALLOC_AND_FREE);
3972 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
3976 aux_info->width = 0;
3977 aux_info->height = 0;
3982 /*****************************************
3983 * gtk_widget_aux_info_destroy:
3988 *****************************************/
3991 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
3993 g_return_if_fail (aux_info != NULL);
3995 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
3998 /*****************************************
3999 * gtk_widget_shape_combine_mask:
4000 * set a shape for this widgets' gdk window, this allows for
4001 * transparent windows etc., see gdk_window_shape_combine_mask
4002 * for more information
4007 *****************************************/
4009 gtk_widget_shape_combine_mask (GtkWidget *widget,
4010 GdkBitmap *shape_mask,
4014 GtkWidgetShapeInfo* shape_info;
4016 g_return_if_fail (widget != NULL);
4017 /* set_shape doesn't work on widgets without gdk window */
4018 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
4022 GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4025 gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
4027 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4028 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
4029 g_free (shape_info);
4033 GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4035 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4038 shape_info = g_new (GtkWidgetShapeInfo, 1);
4039 gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
4041 shape_info->shape_mask = shape_mask;
4042 shape_info->offset_x = offset_x;
4043 shape_info->offset_y = offset_y;
4045 /* set shape if widget has a gdk window allready.
4046 * otherwise the shape is scheduled to be set by gtk_widget_realize.
4049 gdk_window_shape_combine_mask (widget->window, shape_mask,
4050 offset_x, offset_y);
4054 /*****************************************
4055 * gtk_widget_dnd_drag_add:
4056 * when you get a DRAG_ENTER event, you can use this
4057 * to tell Gtk ofother widgets that are to be dragged as well
4062 *****************************************/
4064 gtk_widget_dnd_drag_add (GtkWidget *widget)
4068 /*****************************************
4069 * gtk_widget_dnd_drag_set:
4070 * these two functions enable drag and/or drop on a
4071 * widget and also let Gtk know what data types will be accepted
4072 * use MIME type naming,plus tacking "URL:" on the front for link
4079 *****************************************/
4081 gtk_widget_dnd_drag_set (GtkWidget *widget,
4083 gchar **type_accept_list,
4086 g_return_if_fail(widget != NULL);
4088 if (!widget->window)
4089 gtk_widget_realize (widget);
4091 g_return_if_fail (widget->window != NULL);
4092 gdk_window_dnd_drag_set (widget->window,
4098 /*****************************************
4099 * gtk_widget_dnd_drop_set:
4104 *****************************************/
4106 gtk_widget_dnd_drop_set (GtkWidget *widget,
4108 gchar **type_accept_list,
4110 guint8 is_destructive_operation)
4112 g_return_if_fail(widget != NULL);
4114 if (!widget->window)
4115 gtk_widget_realize (widget);
4117 g_return_if_fail (widget->window != NULL);
4118 gdk_window_dnd_drop_set (widget->window,
4122 is_destructive_operation);
4125 /*****************************************
4126 * gtk_widget_dnd_data_set:
4131 *****************************************/
4133 gtk_widget_dnd_data_set (GtkWidget *widget,
4136 gulong data_numbytes)
4138 g_return_if_fail (widget != NULL);
4139 g_return_if_fail (widget->window != NULL);
4141 gdk_window_dnd_data_set (widget->window, event, data, data_numbytes);
4145 gtk_widget_ref (GtkWidget *widget)
4147 g_return_if_fail (widget != NULL);
4148 g_return_if_fail (GTK_IS_WIDGET (widget));
4150 gtk_object_ref ((GtkObject*) widget);
4154 gtk_widget_unref (GtkWidget *widget)
4156 g_return_if_fail (widget != NULL);
4157 g_return_if_fail (GTK_IS_WIDGET (widget));
4159 gtk_object_unref ((GtkObject*) widget);
4163 gtk_widget_path (GtkWidget *widget,
4164 guint *path_length_p,
4166 gchar **path_reversed_p)
4168 static gchar *rev_path = NULL;
4169 static guint path_len = 0;
4172 g_return_if_fail (widget != NULL);
4173 g_return_if_fail (GTK_IS_WIDGET (widget));
4182 string = gtk_widget_get_name (widget);
4183 l = strlen (string);
4184 while (path_len <= len + l + 1)
4186 path_len += INIT_PATH_SIZE;
4187 rev_path = g_realloc (rev_path, path_len);
4195 widget = widget->parent;
4198 rev_path[len++] = '.';
4200 rev_path[len++] = 0;
4205 *path_length_p = len - 1;
4206 if (path_reversed_p)
4207 *path_reversed_p = g_strdup (rev_path);
4210 *path_p = g_strdup (rev_path);
4211 g_strreverse (*path_p);
4216 gtk_widget_class_path (GtkWidget *widget,
4217 guint *path_length_p,
4219 gchar **path_reversed_p)
4221 static gchar *rev_path = NULL;
4222 static guint path_len = 0;
4225 g_return_if_fail (widget != NULL);
4226 g_return_if_fail (GTK_IS_WIDGET (widget));
4235 string = gtk_type_name (GTK_WIDGET_TYPE (widget));
4236 l = strlen (string);
4237 while (path_len <= len + l + 1)
4239 path_len += INIT_PATH_SIZE;
4240 rev_path = g_realloc (rev_path, path_len);
4248 widget = widget->parent;
4251 rev_path[len++] = '.';
4253 rev_path[len++] = 0;
4258 *path_length_p = len - 1;
4259 if (path_reversed_p)
4260 *path_reversed_p = g_strdup (rev_path);
4263 *path_p = g_strdup (rev_path);
4264 g_strreverse (*path_p);