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,
112 typedef void (*GtkWidgetSignal1) (GtkObject *object,
115 typedef gint (*GtkWidgetSignal2) (GtkObject *object,
120 typedef void (*GtkWidgetSignal3) (GtkObject *object,
123 typedef gint (*GtkWidgetSignal4) (GtkObject *object,
126 typedef void (*GtkWidgetSignal5) (GtkObject *object,
129 typedef void (*GtkWidgetSignal6) (GtkObject *object,
132 typedef void (*GtkWidgetSignal7) (GtkObject *object,
136 typedef struct _GtkStateData GtkStateData;
141 guint state_restauration : 1;
142 guint parent_sensitive : 1;
146 static void gtk_widget_marshal_signal_1 (GtkObject *object,
150 static void gtk_widget_marshal_signal_4 (GtkObject *object,
154 static void gtk_widget_marshal_signal_5 (GtkObject *object,
158 static void gtk_widget_marshal_signal_6 (GtkObject *object,
162 static void gtk_widget_marshal_signal_7 (GtkObject *object,
167 static void gtk_widget_class_init (GtkWidgetClass *klass);
168 static void gtk_widget_init (GtkWidget *widget);
169 static void gtk_widget_set_arg (GtkObject *object,
172 static void gtk_widget_get_arg (GtkObject *object,
175 static void gtk_widget_shutdown (GtkObject *object);
176 static void gtk_widget_real_destroy (GtkObject *object);
177 static void gtk_widget_finalize (GtkObject *object);
178 static void gtk_widget_real_show (GtkWidget *widget);
179 static void gtk_widget_real_hide (GtkWidget *widget);
180 static void gtk_widget_real_map (GtkWidget *widget);
181 static void gtk_widget_real_unmap (GtkWidget *widget);
182 static void gtk_widget_real_realize (GtkWidget *widget);
183 static void gtk_widget_real_unrealize (GtkWidget *widget);
184 static void gtk_widget_real_draw (GtkWidget *widget,
186 static void gtk_widget_real_size_allocate (GtkWidget *widget,
187 GtkAllocation *allocation);
188 static gint gtk_widget_real_key_press_event (GtkWidget *widget,
190 static gint gtk_widget_real_key_release_event (GtkWidget *widget,
192 static void gtk_widget_style_set (GtkWidget *widget,
193 GtkStyle *previous_style);
195 static GdkColormap* gtk_widget_peek_colormap (void);
196 static GdkVisual* gtk_widget_peek_visual (void);
197 static GtkStyle* gtk_widget_peek_style (void);
199 static void gtk_widget_reparent_container_child (GtkWidget *widget,
200 gpointer client_data);
201 static void gtk_widget_propagate_state (GtkWidget *widget,
203 static void gtk_widget_draw_children_recurse (GtkWidget *widget,
204 gpointer client_data);
205 static void gtk_widget_set_style_internal (GtkWidget *widget,
207 gboolean initial_emission);
208 static void gtk_widget_set_style_recurse (GtkWidget *widget,
209 gpointer client_data);
211 static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
212 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
214 static GtkObjectClass *parent_class = NULL;
215 static guint widget_signals[LAST_SIGNAL] = { 0 };
217 static GMemChunk *aux_info_mem_chunk = NULL;
219 static GdkColormap *default_colormap = NULL;
220 static GdkVisual *default_visual = NULL;
221 static GtkStyle *default_style = NULL;
223 static GSList *colormap_stack = NULL;
224 static GSList *visual_stack = NULL;
225 static GSList *style_stack = NULL;
227 static GSList *gtk_widget_redraw_queue = NULL;
229 static const gchar *aux_info_key = "gtk-aux-info";
230 static guint aux_info_key_id = 0;
231 static const gchar *event_key = "gtk-event-mask";
232 static guint event_key_id = 0;
233 static const gchar *extension_event_key = "gtk-extension-event-mode";
234 static guint extension_event_key_id = 0;
235 static const gchar *parent_window_key = "gtk-parent-window";
236 static guint parent_window_key_id = 0;
237 static const gchar *saved_default_style_key = "gtk-saved-default-style";
238 static guint saved_default_style_key_id = 0;
239 static const gchar *shape_info_key = "gtk-shape-info";
240 static const gchar *colormap_key = "gtk-colormap";
241 static const gchar *visual_key = "gtk-visual";
245 /*****************************************
246 * gtk_widget_get_type:
251 *****************************************/
254 gtk_widget_get_type (void)
256 static GtkType widget_type = 0;
260 GtkTypeInfo widget_info =
264 sizeof (GtkWidgetClass),
265 (GtkClassInitFunc) gtk_widget_class_init,
266 (GtkObjectInitFunc) gtk_widget_init,
267 /* reserved_1 */ NULL,
268 /* reserved_2 */ NULL,
269 (GtkClassInitFunc) NULL,
272 widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);
278 /*****************************************
279 * gtk_widget_class_init:
284 *****************************************/
287 gtk_widget_debug_msg (GtkWidget *widget,
290 fprintf (stderr, "Gtk-DEBUG: %s\n", string);
294 gtk_widget_class_init (GtkWidgetClass *klass)
296 GtkObjectClass *object_class;
298 object_class = (GtkObjectClass*) klass;
300 parent_class = gtk_type_class (gtk_object_get_type ());
302 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
303 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
304 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
305 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
306 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
307 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
308 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
309 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
310 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
311 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
312 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
313 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
314 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
315 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
316 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
318 widget_signals[SHOW] =
319 gtk_signal_new ("show",
322 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
323 gtk_signal_default_marshaller,
325 widget_signals[HIDE] =
326 gtk_signal_new ("hide",
329 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
330 gtk_signal_default_marshaller,
332 widget_signals[MAP] =
333 gtk_signal_new ("map",
336 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
337 gtk_signal_default_marshaller,
339 widget_signals[UNMAP] =
340 gtk_signal_new ("unmap",
343 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
344 gtk_signal_default_marshaller,
346 widget_signals[REALIZE] =
347 gtk_signal_new ("realize",
350 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
351 gtk_signal_default_marshaller,
353 widget_signals[UNREALIZE] =
354 gtk_signal_new ("unrealize",
357 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
358 gtk_signal_default_marshaller,
360 widget_signals[DRAW] =
361 gtk_signal_new ("draw",
364 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
365 gtk_widget_marshal_signal_1,
368 widget_signals[DRAW_FOCUS] =
369 gtk_signal_new ("draw_focus",
372 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
373 gtk_signal_default_marshaller,
375 widget_signals[DRAW_DEFAULT] =
376 gtk_signal_new ("draw_default",
379 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
380 gtk_signal_default_marshaller,
382 widget_signals[SIZE_REQUEST] =
383 gtk_signal_new ("size_request",
386 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
387 gtk_widget_marshal_signal_1,
390 widget_signals[SIZE_ALLOCATE] =
391 gtk_signal_new ("size_allocate",
394 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
395 gtk_widget_marshal_signal_1,
398 widget_signals[STATE_CHANGED] =
399 gtk_signal_new ("state_changed",
402 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
403 gtk_widget_marshal_signal_5,
405 GTK_TYPE_STATE_TYPE);
406 widget_signals[PARENT_SET] =
407 gtk_signal_new ("parent_set",
410 GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
411 gtk_widget_marshal_signal_6,
414 widget_signals[STYLE_SET] =
415 gtk_signal_new ("style_set",
418 GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
419 gtk_widget_marshal_signal_7,
422 widget_signals[ADD_ACCELERATOR] =
423 gtk_accel_group_create_add (object_class->type, GTK_RUN_LAST,
424 GTK_SIGNAL_OFFSET (GtkWidgetClass, add_accelerator));
425 widget_signals[REMOVE_ACCELERATOR] =
426 gtk_accel_group_create_remove (object_class->type, GTK_RUN_LAST,
427 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));
428 widget_signals[EVENT] =
429 gtk_signal_new ("event",
432 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
433 gtk_widget_marshal_signal_4,
436 widget_signals[BUTTON_PRESS_EVENT] =
437 gtk_signal_new ("button_press_event",
440 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
441 gtk_widget_marshal_signal_4,
444 widget_signals[BUTTON_RELEASE_EVENT] =
445 gtk_signal_new ("button_release_event",
448 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
449 gtk_widget_marshal_signal_4,
452 widget_signals[MOTION_NOTIFY_EVENT] =
453 gtk_signal_new ("motion_notify_event",
456 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
457 gtk_widget_marshal_signal_4,
460 widget_signals[DELETE_EVENT] =
461 gtk_signal_new ("delete_event",
464 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
465 gtk_widget_marshal_signal_4,
468 widget_signals[DESTROY_EVENT] =
469 gtk_signal_new ("destroy_event",
472 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
473 gtk_widget_marshal_signal_4,
476 widget_signals[EXPOSE_EVENT] =
477 gtk_signal_new ("expose_event",
480 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
481 gtk_widget_marshal_signal_4,
484 widget_signals[KEY_PRESS_EVENT] =
485 gtk_signal_new ("key_press_event",
488 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
489 gtk_widget_marshal_signal_4,
492 widget_signals[KEY_RELEASE_EVENT] =
493 gtk_signal_new ("key_release_event",
496 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
497 gtk_widget_marshal_signal_4,
500 widget_signals[ENTER_NOTIFY_EVENT] =
501 gtk_signal_new ("enter_notify_event",
504 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
505 gtk_widget_marshal_signal_4,
508 widget_signals[LEAVE_NOTIFY_EVENT] =
509 gtk_signal_new ("leave_notify_event",
512 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
513 gtk_widget_marshal_signal_4,
516 widget_signals[CONFIGURE_EVENT] =
517 gtk_signal_new ("configure_event",
520 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
521 gtk_widget_marshal_signal_4,
524 widget_signals[FOCUS_IN_EVENT] =
525 gtk_signal_new ("focus_in_event",
528 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
529 gtk_widget_marshal_signal_4,
532 widget_signals[FOCUS_OUT_EVENT] =
533 gtk_signal_new ("focus_out_event",
536 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
537 gtk_widget_marshal_signal_4,
540 widget_signals[MAP_EVENT] =
541 gtk_signal_new ("map_event",
544 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
545 gtk_widget_marshal_signal_4,
548 widget_signals[UNMAP_EVENT] =
549 gtk_signal_new ("unmap_event",
552 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
553 gtk_widget_marshal_signal_4,
556 widget_signals[PROPERTY_NOTIFY_EVENT] =
557 gtk_signal_new ("property_notify_event",
560 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
561 gtk_widget_marshal_signal_4,
564 widget_signals[SELECTION_CLEAR_EVENT] =
565 gtk_signal_new ("selection_clear_event",
568 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
569 gtk_widget_marshal_signal_4,
572 widget_signals[SELECTION_REQUEST_EVENT] =
573 gtk_signal_new ("selection_request_event",
576 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
577 gtk_widget_marshal_signal_4,
580 widget_signals[SELECTION_NOTIFY_EVENT] =
581 gtk_signal_new ("selection_notify_event",
584 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
585 gtk_widget_marshal_signal_4,
588 widget_signals[SELECTION_RECEIVED] =
589 gtk_signal_new ("selection_received",
592 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
593 gtk_widget_marshal_signal_1,
595 GTK_TYPE_SELECTION_DATA);
596 widget_signals[PROXIMITY_IN_EVENT] =
597 gtk_signal_new ("proximity_in_event",
600 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
601 gtk_widget_marshal_signal_4,
604 widget_signals[PROXIMITY_OUT_EVENT] =
605 gtk_signal_new ("proximity_out_event",
608 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
609 gtk_widget_marshal_signal_4,
612 widget_signals[DRAG_BEGIN_EVENT] =
613 gtk_signal_new ("drag_begin_event",
616 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin_event),
617 gtk_widget_marshal_signal_4,
620 widget_signals[DRAG_REQUEST_EVENT] =
621 gtk_signal_new ("drag_request_event",
624 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_request_event),
625 gtk_widget_marshal_signal_4,
628 widget_signals[DRAG_END_EVENT] =
629 gtk_signal_new ("drag_end_event",
632 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end_event),
633 gtk_widget_marshal_signal_4,
636 widget_signals[DROP_ENTER_EVENT] =
637 gtk_signal_new ("drop_enter_event",
640 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_enter_event),
641 gtk_widget_marshal_signal_4,
644 widget_signals[DROP_LEAVE_EVENT] =
645 gtk_signal_new ("drop_leave_event",
648 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_leave_event),
649 gtk_widget_marshal_signal_4,
652 widget_signals[DROP_DATA_AVAILABLE_EVENT] =
653 gtk_signal_new ("drop_data_available_event",
656 GTK_SIGNAL_OFFSET (GtkWidgetClass,
657 drop_data_available_event),
658 gtk_widget_marshal_signal_4,
661 widget_signals[VISIBILITY_NOTIFY_EVENT] =
662 gtk_signal_new ("visibility_notify_event",
665 GTK_SIGNAL_OFFSET (GtkWidgetClass, visibility_notify_event),
666 gtk_widget_marshal_signal_4,
669 widget_signals[CLIENT_EVENT] =
670 gtk_signal_new ("client_event",
673 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
674 gtk_widget_marshal_signal_4,
677 widget_signals[NO_EXPOSE_EVENT] =
678 gtk_signal_new ("no_expose_event",
681 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
682 gtk_widget_marshal_signal_4,
685 widget_signals[OTHER_EVENT] =
686 gtk_signal_new ("other_event",
689 GTK_SIGNAL_OFFSET (GtkWidgetClass, other_event),
690 gtk_widget_marshal_signal_4,
693 widget_signals[DEBUG_MSG] =
694 gtk_signal_new ("debug_msg",
695 GTK_RUN_LAST | GTK_RUN_ACTION,
697 GTK_SIGNAL_OFFSET (GtkWidgetClass, debug_msg),
698 gtk_widget_marshal_signal_1,
702 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
704 object_class->set_arg = gtk_widget_set_arg;
705 object_class->get_arg = gtk_widget_get_arg;
706 object_class->shutdown = gtk_widget_shutdown;
707 object_class->destroy = gtk_widget_real_destroy;
708 object_class->finalize = gtk_widget_finalize;
710 klass->activate_signal = 0;
711 klass->show = gtk_widget_real_show;
712 klass->hide = gtk_widget_real_hide;
713 klass->show_all = gtk_widget_real_show;
714 klass->hide_all = gtk_widget_real_hide;
715 klass->map = gtk_widget_real_map;
716 klass->unmap = gtk_widget_real_unmap;
717 klass->realize = gtk_widget_real_realize;
718 klass->unrealize = gtk_widget_real_unrealize;
719 klass->draw = gtk_widget_real_draw;
720 klass->draw_focus = NULL;
721 klass->size_request = NULL;
722 klass->size_allocate = gtk_widget_real_size_allocate;
723 klass->state_changed = NULL;
724 klass->parent_set = NULL;
725 klass->style_set = gtk_widget_style_set;
726 klass->add_accelerator = (void*) gtk_accel_group_handle_add;
727 klass->remove_accelerator = (void*) gtk_accel_group_handle_remove;
729 klass->button_press_event = NULL;
730 klass->button_release_event = NULL;
731 klass->motion_notify_event = NULL;
732 klass->delete_event = NULL;
733 klass->destroy_event = NULL;
734 klass->expose_event = NULL;
735 klass->key_press_event = gtk_widget_real_key_press_event;
736 klass->key_release_event = gtk_widget_real_key_release_event;
737 klass->enter_notify_event = NULL;
738 klass->leave_notify_event = NULL;
739 klass->configure_event = NULL;
740 klass->focus_in_event = NULL;
741 klass->focus_out_event = NULL;
742 klass->map_event = NULL;
743 klass->unmap_event = NULL;
744 klass->property_notify_event = gtk_selection_property_notify;
745 klass->selection_clear_event = gtk_selection_clear;
746 klass->selection_request_event = gtk_selection_request;
747 klass->selection_notify_event = gtk_selection_notify;
748 klass->selection_received = NULL;
749 klass->proximity_in_event = NULL;
750 klass->proximity_out_event = NULL;
751 klass->drag_begin_event = NULL;
752 klass->drag_request_event = NULL;
753 klass->drop_enter_event = NULL;
754 klass->drop_leave_event = NULL;
755 klass->drop_data_available_event = NULL;
756 klass->no_expose_event = NULL;
757 klass->other_event = NULL;
759 klass->debug_msg = gtk_widget_debug_msg;
764 GtkBindingSet *binding_set;
766 binding_set = gtk_binding_set_by_class (klass);
767 gtk_binding_entry_add_signal (binding_set,
768 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
771 GTK_TYPE_STRING, "GtkWidgetClass test");
776 gtk_widget_set_arg (GtkObject *object,
782 widget = GTK_WIDGET (object);
789 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
792 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
795 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
798 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
801 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -2);
804 gtk_widget_set_usize (widget, -2, GTK_VALUE_INT (*arg));
807 if (GTK_VALUE_BOOL(*arg))
808 gtk_widget_show (widget);
810 gtk_widget_hide (widget);
813 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
816 saved_flags = GTK_WIDGET_FLAGS (widget);
817 if (GTK_VALUE_BOOL (*arg))
818 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
820 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
821 if (saved_flags != GTK_WIDGET_FLAGS (widget))
822 gtk_widget_queue_resize (widget);
825 if (GTK_VALUE_BOOL (*arg))
826 gtk_widget_grab_focus (widget);
828 case ARG_CAN_DEFAULT:
829 saved_flags = GTK_WIDGET_FLAGS (widget);
830 if (GTK_VALUE_BOOL (*arg))
831 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
833 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
834 if (saved_flags != GTK_WIDGET_FLAGS (widget))
835 gtk_widget_queue_resize (widget);
837 case ARG_HAS_DEFAULT:
838 if (GTK_VALUE_BOOL (*arg))
839 gtk_widget_grab_default (widget);
842 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
845 if (!GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_NO_WINDOW (widget))
846 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
848 case ARG_EXTENSION_EVENTS:
849 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
856 /*****************************************
857 * gtk_widget_get_arg:
862 *****************************************/
865 gtk_widget_get_arg (GtkObject *object,
871 widget = GTK_WIDGET (object);
875 GtkWidgetAuxInfo *aux_info;
877 GdkExtensionMode *modep;
881 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
883 GTK_VALUE_STRING (*arg) = g_strdup ("");
886 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
889 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
891 GTK_VALUE_INT (*arg) = -2;
893 GTK_VALUE_INT (*arg) = aux_info->x;
896 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
898 GTK_VALUE_INT (*arg) = -2;
900 GTK_VALUE_INT (*arg) = aux_info->y;
903 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
905 GTK_VALUE_INT (*arg) = -2;
907 GTK_VALUE_INT (*arg) = aux_info->width;
910 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
912 GTK_VALUE_INT (*arg) = -2;
914 GTK_VALUE_INT (*arg) = aux_info->height;
917 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_VISIBLE (widget) != FALSE);
920 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_SENSITIVE (widget) != FALSE);
923 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_FOCUS (widget) != FALSE);
926 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_FOCUS (widget) != FALSE);
928 case ARG_CAN_DEFAULT:
929 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_DEFAULT (widget) != FALSE);
931 case ARG_HAS_DEFAULT:
932 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
935 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
938 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
940 GTK_VALUE_FLAGS (*arg) = 0;
942 GTK_VALUE_FLAGS (*arg) = *eventp;
944 case ARG_EXTENSION_EVENTS:
945 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
947 GTK_VALUE_FLAGS (*arg) = 0;
949 GTK_VALUE_FLAGS (*arg) = *modep;
952 arg->type = GTK_TYPE_INVALID;
957 /*****************************************
963 *****************************************/
966 gtk_widget_init (GtkWidget *widget)
968 GdkColormap *colormap;
971 GTK_PRIVATE_FLAGS (widget) = 0;
972 widget->state = GTK_STATE_NORMAL;
973 widget->saved_state = GTK_STATE_NORMAL;
975 widget->requisition.width = 0;
976 widget->requisition.height = 0;
977 widget->allocation.x = -1;
978 widget->allocation.y = -1;
979 widget->allocation.width = 1;
980 widget->allocation.height = 1;
981 widget->window = NULL;
982 widget->parent = NULL;
984 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE | GTK_PARENT_SENSITIVE);
986 widget->style = gtk_widget_peek_style ();
987 gtk_style_ref (widget->style);
989 colormap = gtk_widget_peek_colormap ();
990 visual = gtk_widget_peek_visual ();
992 /* XXX - should we ref the colormap and visual, too? */
994 if (colormap != gtk_widget_get_default_colormap ())
996 /* gdk_colormap_ref (colormap); */
997 gtk_object_set_data (GTK_OBJECT (widget), colormap_key, colormap);
1000 if (visual != gtk_widget_get_default_visual ())
1002 /* gdk_visual_ref (visual); */
1003 gtk_object_set_data (GTK_OBJECT (widget), visual_key, visual);
1007 /*****************************************
1013 *****************************************/
1016 gtk_widget_new (guint widget_type,
1021 GSList *arg_list = NULL;
1022 GSList *info_list = NULL;
1025 g_return_val_if_fail (gtk_type_is_a (widget_type, GTK_TYPE_WIDGET), NULL);
1027 object = gtk_type_new (widget_type);
1029 va_start (var_args, widget_type);
1030 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1038 g_warning ("gtk_widget_new(): %s", error);
1046 slist_arg = arg_list;
1047 slist_info = info_list;
1050 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1051 slist_arg = slist_arg->next;
1052 slist_info = slist_info->next;
1054 gtk_args_collect_cleanup (arg_list, info_list);
1057 return GTK_WIDGET (object);
1060 /*****************************************
1066 *****************************************/
1069 gtk_widget_newv (guint type,
1073 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1075 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1078 /*****************************************
1084 *****************************************/
1087 gtk_widget_get (GtkWidget *widget,
1090 g_return_if_fail (widget != NULL);
1091 g_return_if_fail (arg != NULL);
1093 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1096 /*****************************************
1102 *****************************************/
1105 gtk_widget_getv (GtkWidget *widget,
1109 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1112 /*****************************************
1118 *****************************************/
1121 gtk_widget_set (GtkWidget *widget,
1126 GSList *arg_list = NULL;
1127 GSList *info_list = NULL;
1130 g_return_if_fail (widget != NULL);
1131 g_return_if_fail (GTK_IS_WIDGET (widget));
1133 object = GTK_OBJECT (widget);
1135 va_start (var_args, widget);
1136 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1144 g_warning ("gtk_widget_set(): %s", error);
1152 slist_arg = arg_list;
1153 slist_info = info_list;
1156 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1157 slist_arg = slist_arg->next;
1158 slist_info = slist_info->next;
1160 gtk_args_collect_cleanup (arg_list, info_list);
1164 /*****************************************
1170 *****************************************/
1173 gtk_widget_setv (GtkWidget *widget,
1177 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1180 /*****************************************
1181 * gtk_widget_unparent:
1182 * do any cleanup necessary necessary
1183 * for setting parent = NULL.
1188 *****************************************/
1191 gtk_widget_unparent (GtkWidget *widget)
1193 GtkWidget *toplevel;
1194 GtkWidget *old_parent;
1196 g_return_if_fail (widget != NULL);
1197 if (widget->parent == NULL)
1200 /* keep this function in sync with gtk_menu_detach()
1203 /* unset focused and default children properly, this code
1204 * should eventually move into some gtk_window_unparent_branch() or
1207 toplevel = gtk_widget_get_toplevel (widget);
1208 if (GTK_CONTAINER (widget->parent)->focus_child == widget)
1210 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL);
1212 if (GTK_IS_WINDOW (toplevel))
1216 child = GTK_WINDOW (toplevel)->focus_widget;
1218 while (child && child != widget)
1219 child = child->parent;
1221 if (child == widget)
1222 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1225 if (GTK_IS_WINDOW (toplevel))
1229 child = GTK_WINDOW (toplevel)->default_widget;
1231 while (child && child != widget)
1232 child = child->parent;
1234 if (child == widget)
1235 gtk_window_set_default (GTK_WINDOW (toplevel), NULL);
1238 if (GTK_IS_RESIZE_CONTAINER (widget))
1239 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1241 /* Remove the widget and all its children from any ->resize_widgets list
1242 * of all the parents in our branch. This code should move into gtkcontainer.c
1243 * somwhen, since we mess around with ->resize_widgets, which is
1244 * actually not of our business.
1246 * Two ways to make this prettier:
1247 * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer))
1248 * Change resize_widgets to a GList
1250 toplevel = widget->parent;
1256 if (!GTK_CONTAINER (toplevel)->resize_widgets)
1258 toplevel = toplevel->parent;
1263 slist = GTK_CONTAINER (toplevel)->resize_widgets;
1275 while (parent && (parent != widget))
1276 parent = parent->parent;
1278 if (parent == widget)
1280 GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED);
1286 /* it is really messy to have this signal disconnection
1287 * in gtkwidget.c, the resize_widgets invariants should
1288 * all be taken care off by gtkcontainer.c exclusively.
1291 gtk_signal_disconnect_by_func (GTK_OBJECT (toplevel),
1292 GTK_SIGNAL_FUNC (gtk_container_clear_resize_widgets),
1294 GTK_CONTAINER (toplevel)->resize_widgets = slist;
1297 g_slist_free_1 (last);
1303 toplevel = toplevel->parent;
1306 if (widget->window &&
1307 GTK_WIDGET_NO_WINDOW (widget) &&
1308 GTK_WIDGET_DRAWABLE (widget))
1309 gdk_window_clear_area (widget->window,
1310 widget->allocation.x,
1311 widget->allocation.y,
1312 widget->allocation.width,
1313 widget->allocation.height);
1315 /* Reset the width and height here, to force reallocation if we
1316 * get added back to a new parent. This won't work if our new
1317 * allocation is smaller than 1x1 and we actually want a size of 1x1...
1318 * (would 0x0 be OK here?)
1320 widget->allocation.width = 1;
1321 widget->allocation.height = 1;
1323 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1324 gtk_widget_unrealize (widget);
1326 old_parent = widget->parent;
1327 widget->parent = NULL;
1328 gtk_widget_set_parent_window (widget, NULL);
1329 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1331 gtk_widget_unref (widget);
1334 /*****************************************
1335 * gtk_widget_destroy:
1340 *****************************************/
1343 gtk_widget_destroy (GtkWidget *widget)
1345 g_return_if_fail (widget != NULL);
1346 g_return_if_fail (GTK_IS_WIDGET (widget));
1348 gtk_object_destroy ((GtkObject*) widget);
1351 /*****************************************
1352 * gtk_widget_destroyed:
1353 * Utility function: sets widget_pointer
1354 * to NULL when widget is destroyed.
1359 *****************************************/
1362 gtk_widget_destroyed (GtkWidget *widget,
1363 GtkWidget **widget_pointer)
1365 /* Don't make any assumptions about the
1367 * Even check widget_pointer.
1370 *widget_pointer = NULL;
1373 /*****************************************
1379 *****************************************/
1382 gtk_widget_show (GtkWidget *widget)
1384 g_return_if_fail (widget != NULL);
1386 if (!GTK_WIDGET_VISIBLE (widget))
1387 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1391 /*************************************************************
1392 * gtk_widget_show_now:
1393 * Show a widget, and if it is an unmapped toplevel widget
1394 * wait for the map_event before returning
1396 * Warning: This routine will call the main loop recursively.
1401 *************************************************************/
1404 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
1407 gtk_signal_disconnect_by_data (GTK_OBJECT (widget), flag);
1411 gtk_widget_show_now (GtkWidget *widget)
1415 /* make sure we will get event */
1416 if (!GTK_WIDGET_MAPPED (widget) &&
1417 GTK_WIDGET_TOPLEVEL (widget))
1419 gtk_widget_show (widget);
1421 gtk_signal_connect (GTK_OBJECT (widget), "map_event",
1422 GTK_SIGNAL_FUNC (gtk_widget_show_map_callback),
1426 gtk_main_iteration();
1429 gtk_widget_show (widget);
1432 /*****************************************
1438 *****************************************/
1441 gtk_widget_hide (GtkWidget *widget)
1443 g_return_if_fail (widget != NULL);
1444 g_return_if_fail (GTK_IS_WIDGET (widget));
1446 if (GTK_WIDGET_VISIBLE (widget))
1447 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1451 gtk_widget_hide_on_delete (GtkWidget *widget)
1453 g_return_val_if_fail (widget != NULL, FALSE);
1454 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
1456 gtk_widget_hide (widget);
1461 /*****************************************
1462 * gtk_widget_show_all:
1464 * Shows the widget and all children.
1466 * Container classes overwrite
1467 * show_all and hide_all to call
1468 * show_all (hide_all) on both themselves
1469 * and on their child widgets.
1474 *****************************************/
1477 gtk_widget_show_all (GtkWidget *widget)
1479 GtkWidgetClass *widget_class;
1481 g_return_if_fail (widget != NULL);
1483 /* show_all shouldn't be invoked through a signal,
1484 because in this case it would be quite slow - there would
1485 be a show and show_all signal emitted for every child widget.
1487 widget_class = GTK_WIDGET_CLASS(GTK_OBJECT(widget)->klass);
1488 widget_class->show_all (widget);
1491 /*****************************************
1492 * gtk_widget_hide_all:
1494 * Hides the widget and all children.
1495 * See gtk_widget_show_all.
1500 *****************************************/
1503 gtk_widget_hide_all (GtkWidget *widget)
1505 g_return_if_fail (widget != NULL);
1506 g_assert (widget->parent);
1508 GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass)->hide_all (widget);
1511 /*****************************************
1517 *****************************************/
1520 gtk_widget_map (GtkWidget *widget)
1522 g_return_if_fail (widget != NULL);
1524 if (!GTK_WIDGET_MAPPED (widget))
1526 if (!GTK_WIDGET_REALIZED (widget))
1527 gtk_widget_realize (widget);
1529 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1533 /*****************************************
1539 *****************************************/
1542 gtk_widget_unmap (GtkWidget *widget)
1544 g_return_if_fail (widget != NULL);
1546 if (GTK_WIDGET_MAPPED (widget))
1547 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1550 /*****************************************
1551 * gtk_widget_realize:
1556 *****************************************/
1559 gtk_widget_realize (GtkWidget *widget)
1562 GdkExtensionMode mode;
1563 GtkWidgetShapeInfo *shape_info;
1565 g_return_if_fail (widget != NULL);
1567 if (!GTK_WIDGET_REALIZED (widget))
1570 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1571 g_print ("%s\n", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1574 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1575 gtk_widget_realize (widget->parent);
1577 gtk_widget_ensure_style (widget);
1579 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1581 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1583 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1585 gdk_window_shape_combine_mask (widget->window,
1586 shape_info->shape_mask,
1587 shape_info->offset_x,
1588 shape_info->offset_y);
1591 if (!GTK_WIDGET_NO_WINDOW (widget))
1593 mode = gtk_widget_get_extension_events (widget);
1594 if (mode != GDK_EXTENSION_EVENTS_NONE)
1596 events = gtk_widget_get_events (widget);
1597 gdk_input_set_extension_events (widget->window, events, mode);
1604 /*****************************************
1605 * gtk_widget_unrealize:
1610 *****************************************/
1613 gtk_widget_unrealize (GtkWidget *widget)
1615 g_return_if_fail (widget != NULL);
1617 if (GTK_WIDGET_REDRAW_PENDING (widget))
1619 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1620 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1623 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1624 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
1626 if (GTK_WIDGET_REALIZED (widget))
1628 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1629 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
1633 /*****************************************
1634 * gtk_widget_queue_draw:
1639 *****************************************/
1642 gtk_widget_idle_draw (gpointer data)
1644 while (gtk_widget_redraw_queue)
1645 gtk_widget_draw (gtk_widget_redraw_queue->data, NULL);
1651 gtk_widget_queue_draw (GtkWidget *widget)
1655 g_return_if_fail (widget != NULL);
1657 if (GTK_WIDGET_DRAWABLE (widget))
1659 /* We queue the redraw if:
1660 * a) the widget is not already queued for redraw and
1661 * b) non of the widgets ancestors are queued for redraw.
1666 if (GTK_WIDGET_REDRAW_PENDING (parent))
1668 parent = parent->parent;
1671 GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_PENDING);
1672 if (gtk_widget_redraw_queue == NULL)
1673 gtk_idle_add_priority (GTK_PRIORITY_INTERNAL,
1674 gtk_widget_idle_draw,
1677 gtk_widget_redraw_queue = g_slist_prepend (gtk_widget_redraw_queue, widget);
1682 gtk_widget_queue_resize (GtkWidget *widget)
1684 g_return_if_fail (widget != NULL);
1685 g_return_if_fail (GTK_IS_WIDGET (widget));
1687 if (GTK_IS_RESIZE_CONTAINER (widget))
1688 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1691 gtk_container_queue_resize (GTK_CONTAINER (widget->parent));
1692 else if (GTK_WIDGET_TOPLEVEL (widget))
1693 gtk_container_queue_resize (GTK_CONTAINER (widget));
1696 /*****************************************
1702 *****************************************/
1705 gtk_widget_draw (GtkWidget *widget,
1708 GdkRectangle temp_area;
1710 g_return_if_fail (widget != NULL);
1712 if (GTK_WIDGET_REDRAW_PENDING (widget))
1714 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1715 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1720 if (GTK_WIDGET_DRAWABLE (widget))
1724 if (GTK_WIDGET_NO_WINDOW (widget))
1726 temp_area.x = widget->allocation.x;
1727 temp_area.y = widget->allocation.y;
1735 temp_area.width = widget->allocation.width;
1736 temp_area.height = widget->allocation.height;
1740 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
1744 /*****************************************
1745 * gtk_widget_draw_focus:
1750 *****************************************/
1753 gtk_widget_draw_focus (GtkWidget *widget)
1755 g_return_if_fail (widget != NULL);
1757 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
1760 /*****************************************
1761 * gtk_widget_draw_default:
1766 *****************************************/
1769 gtk_widget_draw_default (GtkWidget *widget)
1771 g_return_if_fail (widget != NULL);
1773 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
1776 /*****************************************
1777 * gtk_widget_draw_children:
1782 *****************************************/
1785 gtk_widget_draw_children (GtkWidget *widget)
1787 g_return_if_fail (widget != NULL);
1789 if (GTK_IS_CONTAINER (widget))
1790 gtk_container_foreach (GTK_CONTAINER (widget),
1791 gtk_widget_draw_children_recurse,
1795 /*****************************************
1796 * gtk_widget_size_request:
1801 *****************************************/
1804 gtk_widget_size_request (GtkWidget *widget,
1805 GtkRequisition *requisition)
1807 GtkWidgetAuxInfo *aux_info;
1809 g_return_if_fail (widget != NULL);
1811 gtk_widget_ref (widget);
1812 gtk_widget_ensure_style (widget);
1813 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
1815 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1818 if (aux_info->width > 0)
1819 requisition->width = aux_info->width;
1820 if (aux_info->height > 0)
1821 requisition->height = aux_info->height;
1823 gtk_widget_unref (widget);
1826 /*****************************************
1827 * gtk_widget_size_allocate:
1832 *****************************************/
1835 gtk_widget_size_allocate (GtkWidget *widget,
1836 GtkAllocation *allocation)
1838 GtkWidgetAuxInfo *aux_info;
1839 GtkAllocation real_allocation;
1841 g_return_if_fail (widget != NULL);
1843 real_allocation = *allocation;
1844 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1848 if (aux_info->x != -1)
1849 real_allocation.x = aux_info->x;
1850 if (aux_info->y != -1)
1851 real_allocation.y = aux_info->y;
1854 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
1858 gtk_widget_stop_add_accelerator (GtkWidget *widget)
1860 g_return_if_fail (widget != NULL);
1861 g_return_if_fail (GTK_IS_WIDGET (widget));
1863 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
1867 gtk_widget_stop_remove_accelerator (GtkWidget *widget)
1869 g_return_if_fail (widget != NULL);
1870 g_return_if_fail (GTK_IS_WIDGET (widget));
1872 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR]);
1876 gtk_widget_freeze_accelerators (GtkWidget *widget)
1878 g_return_if_fail (widget != NULL);
1879 g_return_if_fail (GTK_IS_WIDGET (widget));
1881 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
1882 widget_signals[ADD_ACCELERATOR],
1884 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1887 gtk_signal_connect (GTK_OBJECT (widget),
1889 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1891 gtk_signal_connect (GTK_OBJECT (widget),
1892 "remove_accelerator",
1893 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
1899 gtk_widget_thaw_accelerators (GtkWidget *widget)
1901 g_return_if_fail (widget != NULL);
1902 g_return_if_fail (GTK_IS_WIDGET (widget));
1904 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
1905 widget_signals[ADD_ACCELERATOR],
1907 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1910 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
1911 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1913 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
1914 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
1920 gtk_widget_add_accelerator (GtkWidget *widget,
1921 const gchar *accel_signal,
1922 GtkAccelGroup *accel_group,
1925 GtkAccelFlags accel_flags)
1927 g_return_if_fail (widget != NULL);
1928 g_return_if_fail (GTK_IS_WIDGET (widget));
1929 g_return_if_fail (accel_group != NULL);
1931 gtk_accel_group_add (accel_group,
1935 (GtkObject*) widget,
1940 gtk_widget_remove_accelerator (GtkWidget *widget,
1941 GtkAccelGroup *accel_group,
1945 g_return_if_fail (widget != NULL);
1946 g_return_if_fail (GTK_IS_WIDGET (widget));
1947 g_return_if_fail (accel_group != NULL);
1949 gtk_accel_group_remove (accel_group,
1952 (GtkObject*) widget);
1956 gtk_widget_remove_accelerators (GtkWidget *widget,
1957 const gchar *accel_signal,
1958 gboolean visible_only)
1963 g_return_if_fail (widget != NULL);
1964 g_return_if_fail (GTK_IS_WIDGET (widget));
1965 g_return_if_fail (accel_signal != NULL);
1967 signal_id = gtk_signal_lookup (accel_signal, GTK_OBJECT_TYPE (widget));
1968 g_return_if_fail (signal_id != 0);
1970 slist = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
1973 GtkAccelEntry *ac_entry;
1975 ac_entry = slist->data;
1976 slist = slist->next;
1977 if (ac_entry->accel_flags & GTK_ACCEL_VISIBLE &&
1978 ac_entry->signal_id == signal_id)
1979 gtk_widget_remove_accelerator (GTK_WIDGET (widget),
1980 ac_entry->accel_group,
1981 ac_entry->accelerator_key,
1982 ac_entry->accelerator_mods);
1987 gtk_widget_accelerator_signal (GtkWidget *widget,
1988 GtkAccelGroup *accel_group,
1992 GtkAccelEntry *ac_entry;
1994 g_return_val_if_fail (widget != NULL, 0);
1995 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
1996 g_return_val_if_fail (accel_group != NULL, 0);
1998 ac_entry = gtk_accel_group_get_entry (accel_group, accel_key, accel_mods);
2000 if (ac_entry && ac_entry->object == (GtkObject*) widget)
2001 return ac_entry->signal_id;
2006 gtk_widget_real_key_press_event (GtkWidget *widget,
2009 gboolean handled = FALSE;
2011 g_return_val_if_fail (widget != NULL, handled);
2012 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
2013 g_return_val_if_fail (event != NULL, handled);
2016 handled = gtk_bindings_activate (GTK_OBJECT (widget),
2024 gtk_widget_real_key_release_event (GtkWidget *widget,
2027 gboolean handled = FALSE;
2029 g_return_val_if_fail (widget != NULL, handled);
2030 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
2031 g_return_val_if_fail (event != NULL, handled);
2034 handled = gtk_bindings_activate (GTK_OBJECT (widget),
2036 event->state | GDK_RELEASE_MASK);
2041 /*****************************************
2047 *****************************************/
2050 gtk_widget_event (GtkWidget *widget,
2056 g_return_val_if_fail (widget != NULL, TRUE);
2058 gtk_widget_ref (widget);
2060 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
2062 if (return_val || GTK_OBJECT_DESTROYED (widget))
2064 gtk_widget_unref (widget);
2068 switch (event->type)
2073 case GDK_BUTTON_PRESS:
2074 case GDK_2BUTTON_PRESS:
2075 case GDK_3BUTTON_PRESS:
2076 signal_num = BUTTON_PRESS_EVENT;
2078 case GDK_BUTTON_RELEASE:
2079 signal_num = BUTTON_RELEASE_EVENT;
2081 case GDK_MOTION_NOTIFY:
2082 signal_num = MOTION_NOTIFY_EVENT;
2085 signal_num = DELETE_EVENT;
2088 signal_num = DESTROY_EVENT;
2091 signal_num = KEY_PRESS_EVENT;
2093 case GDK_KEY_RELEASE:
2094 signal_num = KEY_RELEASE_EVENT;
2096 case GDK_ENTER_NOTIFY:
2097 signal_num = ENTER_NOTIFY_EVENT;
2099 case GDK_LEAVE_NOTIFY:
2100 signal_num = LEAVE_NOTIFY_EVENT;
2102 case GDK_FOCUS_CHANGE:
2103 if (event->focus_change.in)
2104 signal_num = FOCUS_IN_EVENT;
2106 signal_num = FOCUS_OUT_EVENT;
2109 signal_num = CONFIGURE_EVENT;
2112 signal_num = MAP_EVENT;
2115 signal_num = UNMAP_EVENT;
2117 case GDK_PROPERTY_NOTIFY:
2118 signal_num = PROPERTY_NOTIFY_EVENT;
2120 case GDK_SELECTION_CLEAR:
2121 signal_num = SELECTION_CLEAR_EVENT;
2123 case GDK_SELECTION_REQUEST:
2124 signal_num = SELECTION_REQUEST_EVENT;
2126 case GDK_SELECTION_NOTIFY:
2127 signal_num = SELECTION_NOTIFY_EVENT;
2129 case GDK_PROXIMITY_IN:
2130 signal_num = PROXIMITY_IN_EVENT;
2132 case GDK_PROXIMITY_OUT:
2133 signal_num = PROXIMITY_OUT_EVENT;
2135 case GDK_DRAG_BEGIN:
2136 signal_num = DRAG_BEGIN_EVENT;
2138 case GDK_DRAG_REQUEST:
2139 signal_num = DRAG_REQUEST_EVENT;
2141 case GDK_DROP_ENTER:
2142 signal_num = DROP_ENTER_EVENT;
2144 case GDK_DROP_LEAVE:
2145 signal_num = DROP_LEAVE_EVENT;
2147 case GDK_DROP_DATA_AVAIL:
2148 signal_num = DROP_DATA_AVAILABLE_EVENT;
2150 case GDK_OTHER_EVENT:
2151 signal_num = OTHER_EVENT;
2154 signal_num = NO_EXPOSE_EVENT;
2156 case GDK_CLIENT_EVENT:
2157 signal_num = CLIENT_EVENT;
2160 /* there is no sense in providing a widget with bogus expose events
2162 if (!event->any.window)
2164 gtk_widget_unref (widget);
2167 signal_num = EXPOSE_EVENT;
2169 case GDK_VISIBILITY_NOTIFY:
2170 signal_num = VISIBILITY_NOTIFY_EVENT;
2173 g_warning ("could not determine signal number for event: %d", event->type);
2174 gtk_widget_unref (widget);
2178 if (signal_num != -1)
2179 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
2181 return_val |= GTK_OBJECT_DESTROYED (widget);
2183 gtk_widget_unref (widget);
2188 /*****************************************
2189 * gtk_widget_activate:
2194 *****************************************/
2197 gtk_widget_activate (GtkWidget *widget)
2199 g_return_if_fail (widget != NULL);
2200 g_return_if_fail (GTK_IS_WIDGET (widget));
2202 if (WIDGET_CLASS (widget)->activate_signal)
2203 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
2206 /*****************************************
2207 * gtk_widget_reparent_container_child:
2208 * assistent function to gtk_widget_reparent
2213 *****************************************/
2216 gtk_widget_reparent_container_child(GtkWidget *widget,
2217 gpointer client_data)
2219 g_return_if_fail (widget != NULL);
2220 g_return_if_fail (client_data != NULL);
2222 if (GTK_WIDGET_NO_WINDOW (widget))
2225 gdk_window_unref (widget->window);
2226 widget->window = (GdkWindow*) client_data;
2228 gdk_window_ref (widget->window);
2230 if (GTK_IS_CONTAINER (widget))
2231 gtk_container_foreach (GTK_CONTAINER (widget),
2232 gtk_widget_reparent_container_child,
2236 gdk_window_reparent (widget->window,
2237 (GdkWindow*) client_data, 0, 0);
2240 /*****************************************
2241 * gtk_widget_reparent:
2246 *****************************************/
2249 gtk_widget_reparent (GtkWidget *widget,
2250 GtkWidget *new_parent)
2252 g_return_if_fail (widget != NULL);
2253 g_return_if_fail (GTK_IS_WIDGET (widget));
2254 g_return_if_fail (new_parent != NULL);
2255 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
2256 g_return_if_fail (widget->parent != NULL);
2258 if (widget->parent != new_parent)
2260 /* First try to see if we can get away without unrealizing
2261 * the widget as we reparent it. if so we set a flag so
2262 * that gtk_widget_unparent doesn't unrealize widget
2264 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
2265 GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
2267 gtk_widget_ref (widget);
2268 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
2269 gtk_container_add (GTK_CONTAINER (new_parent), widget);
2270 gtk_widget_unref (widget);
2272 if (GTK_WIDGET_IN_REPARENT (widget))
2274 GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
2276 /* OK, now fix up the widget's window. (And that for any
2277 * children, if the widget is NO_WINDOW and a container)
2279 if (GTK_WIDGET_NO_WINDOW (widget))
2281 if (GTK_IS_CONTAINER (widget))
2282 gtk_container_foreach (GTK_CONTAINER (widget),
2283 gtk_widget_reparent_container_child,
2284 gtk_widget_get_parent_window (widget));
2287 GdkWindow *parent_window;
2289 parent_window = gtk_widget_get_parent_window (widget);
2290 if (parent_window != widget->window)
2293 gdk_window_unref (widget->window);
2294 widget->window = parent_window;
2296 gdk_window_ref (widget->window);
2301 gdk_window_reparent (widget->window, gtk_widget_get_parent_window (widget), 0, 0);
2306 /*****************************************
2312 *****************************************/
2315 gtk_widget_popup (GtkWidget *widget,
2319 g_return_if_fail (widget != NULL);
2321 if (!GTK_WIDGET_VISIBLE (widget))
2323 if (!GTK_WIDGET_REALIZED (widget))
2324 gtk_widget_realize (widget);
2325 if (!GTK_WIDGET_NO_WINDOW (widget))
2326 gdk_window_move (widget->window, x, y);
2327 gtk_widget_show (widget);
2331 /*****************************************
2332 * gtk_widget_intersect:
2337 *****************************************/
2340 gtk_widget_intersect (GtkWidget *widget,
2342 GdkRectangle *intersection)
2348 g_return_val_if_fail (widget != NULL, FALSE);
2349 g_return_val_if_fail (area != NULL, FALSE);
2352 dest = intersection;
2356 return_val = gdk_rectangle_intersect ((GdkRectangle*) &widget->allocation, area, dest);
2358 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2360 intersection->x -= widget->allocation.x;
2361 intersection->y -= widget->allocation.y;
2369 gtk_widget_basic (GtkWidget *widget)
2375 g_return_val_if_fail (widget != NULL, FALSE);
2377 if (!GTK_WIDGET_BASIC (widget))
2379 else if (GTK_IS_CONTAINER (widget))
2381 children = gtk_container_children (GTK_CONTAINER (widget));
2385 tmp_list = children;
2389 if (!gtk_widget_basic (GTK_WIDGET (tmp_list->data)))
2395 tmp_list = tmp_list->next;
2398 g_list_free (children);
2407 /*****************************************
2408 * gtk_widget_grab_focus:
2413 *****************************************/
2416 gtk_widget_grab_focus (GtkWidget *widget)
2418 g_return_if_fail (widget != NULL);
2419 g_return_if_fail (GTK_IS_WIDGET (widget));
2421 if (GTK_WIDGET_CAN_FOCUS (widget))
2425 GtkType window_type;
2427 window_type = gtk_window_get_type ();
2428 parent = widget->parent;
2431 while (parent && !gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2433 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2435 parent = parent->parent;
2438 if (parent && gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2440 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2441 gtk_window_set_focus (GTK_WINDOW (parent), widget);
2446 /*****************************************
2447 * gtk_widget_grab_default:
2452 *****************************************/
2455 gtk_widget_grab_default (GtkWidget *widget)
2458 GtkType window_type;
2460 g_return_if_fail (widget != NULL);
2461 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
2463 window_type = gtk_window_get_type ();
2464 window = widget->parent;
2466 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2467 window = window->parent;
2469 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2470 gtk_window_set_default (GTK_WINDOW (window), widget);
2473 /*****************************************
2474 * gtk_widget_set_name:
2479 *****************************************/
2482 gtk_widget_set_name (GtkWidget *widget,
2485 g_return_if_fail (widget != NULL);
2488 g_free (widget->name);
2489 widget->name = g_strdup (name);
2491 if (!GTK_WIDGET_USER_STYLE (widget))
2492 gtk_widget_set_rc_style (widget);
2495 /*****************************************
2496 * gtk_widget_get_name:
2501 *****************************************/
2504 gtk_widget_get_name (GtkWidget *widget)
2506 g_return_val_if_fail (widget != NULL, NULL);
2509 return widget->name;
2510 return gtk_type_name (GTK_WIDGET_TYPE (widget));
2513 /*****************************************
2514 * gtk_widget_set_state:
2521 *****************************************/
2524 gtk_widget_set_state (GtkWidget *widget,
2527 g_return_if_fail (widget != NULL);
2528 g_return_if_fail (GTK_IS_WIDGET (widget));
2530 if (state == GTK_WIDGET_STATE (widget))
2533 if (state == GTK_STATE_INSENSITIVE)
2534 gtk_widget_set_sensitive (widget, FALSE);
2540 data.state_restauration = FALSE;
2542 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2544 data.parent_sensitive = TRUE;
2546 gtk_widget_propagate_state (widget, &data);
2547 gtk_widget_queue_draw (widget);
2551 /*****************************************
2552 * gtk_widget_set_sensitive:
2556 * boolean value for sensitivity
2559 *****************************************/
2562 gtk_widget_set_sensitive (GtkWidget *widget,
2567 g_return_if_fail (widget != NULL);
2568 g_return_if_fail (GTK_IS_WIDGET (widget));
2570 sensitive = (sensitive != FALSE);
2572 if (sensitive == (GTK_WIDGET_SENSITIVE (widget) != FALSE))
2577 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
2578 data.state = GTK_WIDGET_SAVED_STATE (widget);
2582 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
2583 data.state = GTK_WIDGET_STATE (widget);
2585 data.state_restauration = TRUE;
2588 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2590 data.parent_sensitive = TRUE;
2592 gtk_widget_propagate_state (widget, &data);
2593 gtk_widget_queue_draw (widget);
2596 /*****************************************
2597 * gtk_widget_set_parent:
2602 *****************************************/
2605 gtk_widget_set_parent (GtkWidget *widget,
2610 g_return_if_fail (widget != NULL);
2611 g_return_if_fail (widget->parent == NULL);
2612 g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
2613 g_return_if_fail (parent != NULL);
2614 g_return_if_fail (widget != parent);
2616 /* keep this function in sync with gtk_menu_attach_to_widget()
2619 gtk_widget_ref (widget);
2620 gtk_object_sink (GTK_OBJECT (widget));
2621 widget->parent = parent;
2623 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
2624 data.state = GTK_WIDGET_STATE (parent);
2626 data.state = GTK_WIDGET_STATE (widget);
2627 data.state_restauration = FALSE;
2628 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (parent) != FALSE);
2630 gtk_widget_propagate_state (widget, &data);
2632 gtk_widget_set_style_recurse (widget, NULL);
2634 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
2637 /*****************************************
2639 * see docs/styles.txt
2640 *****************************************/
2642 gtk_widget_set_style (GtkWidget *widget,
2645 GtkStyle *default_style;
2646 gboolean initial_emission;
2648 g_return_if_fail (widget != NULL);
2649 g_return_if_fail (style != NULL);
2651 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2653 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
2654 GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
2656 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2659 gtk_style_ref (widget->style);
2660 if (!saved_default_style_key_id)
2661 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2662 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2665 gtk_widget_set_style_internal (widget, style, initial_emission);
2669 gtk_widget_ensure_style (GtkWidget *widget)
2671 if (!GTK_WIDGET_USER_STYLE (widget) &&
2672 !GTK_WIDGET_RC_STYLE (widget))
2673 gtk_widget_set_rc_style (widget);
2677 gtk_widget_set_rc_style (GtkWidget *widget)
2679 GtkStyle *saved_style;
2680 GtkStyle *new_style;
2681 gboolean initial_emission;
2683 g_return_if_fail (widget != NULL);
2685 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2687 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2688 GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
2690 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2691 new_style = gtk_rc_get_style (widget);
2696 gtk_style_ref (widget->style);
2697 if (!saved_default_style_key_id)
2698 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2699 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2701 gtk_widget_set_style_internal (widget, new_style, initial_emission);
2707 g_assert (initial_emission == FALSE); /* FIXME: remove this line */
2709 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2710 gtk_widget_set_style_internal (widget, saved_style, initial_emission);
2711 gtk_style_unref (saved_style);
2715 if (initial_emission)
2716 gtk_widget_set_style_internal (widget, widget->style, TRUE);
2722 gtk_widget_restore_default_style (GtkWidget *widget)
2724 GtkStyle *default_style;
2726 g_return_if_fail (widget != NULL);
2728 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2730 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2733 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2734 gtk_widget_set_style_internal (widget, default_style, FALSE);
2735 gtk_style_unref (default_style);
2740 gtk_widget_get_style (GtkWidget *widget)
2742 g_return_val_if_fail (widget != NULL, NULL);
2744 return widget->style;
2748 gtk_widget_style_set (GtkWidget *widget,
2749 GtkStyle *previous_style)
2751 if (GTK_WIDGET_REALIZED (widget) &&
2752 !GTK_WIDGET_NO_WINDOW (widget))
2754 gtk_style_set_background (widget->style, widget->window, widget->state);
2755 if (GTK_WIDGET_DRAWABLE (widget))
2756 gdk_window_clear (widget->window);
2761 gtk_widget_set_style_internal (GtkWidget *widget,
2763 gboolean initial_emission)
2765 g_return_if_fail (widget != NULL);
2766 g_return_if_fail (style != NULL);
2768 if (widget->style != style)
2770 GtkStyle *previous_style;
2772 if (GTK_WIDGET_REALIZED (widget))
2773 gtk_style_detach (widget->style);
2775 previous_style = widget->style;
2776 widget->style = style;
2777 gtk_style_ref (widget->style);
2779 if (GTK_WIDGET_REALIZED (widget))
2780 widget->style = gtk_style_attach (widget->style, widget->window);
2782 gtk_signal_emit (GTK_OBJECT (widget),
2783 widget_signals[STYLE_SET],
2784 initial_emission ? NULL : previous_style);
2785 gtk_style_unref (previous_style);
2787 if (widget->parent && !initial_emission)
2789 GtkRequisition old_requisition;
2791 old_requisition = widget->requisition;
2792 gtk_widget_size_request (widget, &widget->requisition);
2794 if ((old_requisition.width != widget->requisition.width) ||
2795 (old_requisition.height != widget->requisition.height))
2796 gtk_widget_queue_resize (widget);
2797 else if (GTK_WIDGET_DRAWABLE (widget))
2798 gtk_widget_queue_draw (widget);
2801 else if (initial_emission)
2803 gtk_signal_emit (GTK_OBJECT (widget),
2804 widget_signals[STYLE_SET],
2810 gtk_widget_set_style_recurse (GtkWidget *widget,
2811 gpointer client_data)
2813 if (GTK_WIDGET_RC_STYLE (widget))
2814 gtk_widget_set_rc_style (widget);
2816 if (GTK_IS_CONTAINER (widget))
2817 gtk_container_foreach (GTK_CONTAINER (widget),
2818 gtk_widget_set_style_recurse,
2823 gtk_widget_reset_rc_styles (GtkWidget *widget)
2825 gtk_widget_set_style_recurse (widget, NULL);
2829 gtk_widget_set_default_style (GtkStyle *style)
2831 if (style != default_style)
2834 gtk_style_unref (default_style);
2835 default_style = style;
2837 gtk_style_ref (default_style);
2842 gtk_widget_get_default_style (void)
2846 default_style = gtk_style_new ();
2847 gtk_style_ref (default_style);
2850 return default_style;
2854 gtk_widget_push_style (GtkStyle *style)
2856 g_return_if_fail (style != NULL);
2858 gtk_style_ref (style);
2859 style_stack = g_slist_prepend (style_stack, style);
2863 gtk_widget_peek_style (void)
2866 return (GtkStyle*) style_stack->data;
2868 return gtk_widget_get_default_style ();
2872 gtk_widget_pop_style (void)
2879 style_stack = style_stack->next;
2880 gtk_style_unref ((GtkStyle*) tmp->data);
2881 g_slist_free_1 (tmp);
2885 /*************************************************************
2886 * gtk_widget_set_parent_window:
2887 * Set a non default parent window for widget
2894 *************************************************************/
2897 gtk_widget_set_parent_window (GtkWidget *widget,
2898 GdkWindow *parent_window)
2900 GdkWindow *old_parent_window;
2902 g_return_if_fail (widget != NULL);
2904 old_parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2905 parent_window_key_id);
2907 if (parent_window != old_parent_window)
2909 if (!parent_window_key_id)
2910 parent_window_key_id = g_quark_from_static_string (parent_window_key);
2911 gtk_object_set_data_by_id (GTK_OBJECT (widget), parent_window_key_id,
2913 if (old_parent_window)
2914 gdk_window_unref (old_parent_window);
2916 gdk_window_ref (parent_window);
2920 /*************************************************************
2921 * gtk_widget_get_parent_window:
2922 * Get widget's parent window
2929 *************************************************************/
2932 gtk_widget_get_parent_window (GtkWidget *widget)
2934 GdkWindow *parent_window;
2936 g_return_val_if_fail (widget != NULL, NULL);
2937 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
2938 g_return_val_if_fail (widget->parent != NULL, NULL);
2940 parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2941 parent_window_key_id);
2943 return (parent_window != NULL) ? parent_window : widget->parent->window;
2946 /*****************************************
2947 * gtk_widget_set_uposition:
2952 *****************************************/
2955 gtk_widget_set_uposition (GtkWidget *widget,
2959 GtkWidgetAuxInfo *aux_info;
2961 g_return_if_fail (widget != NULL);
2963 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2966 if (!aux_info_key_id)
2967 aux_info_key_id = g_quark_from_static_string (aux_info_key);
2968 aux_info = gtk_widget_aux_info_new ();
2969 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2977 if (GTK_WIDGET_REALIZED (widget) && GTK_IS_WINDOW (widget) &&
2978 (aux_info->x != -1) && (aux_info->y != -1))
2980 gdk_window_set_hints (widget->window, aux_info->x, aux_info->y, 0, 0, 0, 0, GDK_HINT_POS);
2981 gdk_window_move (widget->window, aux_info->x, aux_info->y);
2984 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
2985 gtk_widget_size_allocate (widget, &widget->allocation);
2988 /*****************************************
2989 * gtk_widget_set_usize:
2994 *****************************************/
2997 gtk_widget_set_usize (GtkWidget *widget,
3001 GtkWidgetAuxInfo *aux_info;
3003 g_return_if_fail (widget != NULL);
3005 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3008 if (!aux_info_key_id)
3009 aux_info_key_id = g_quark_from_static_string (aux_info_key);
3010 aux_info = gtk_widget_aux_info_new ();
3011 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
3015 aux_info->width = width;
3017 aux_info->height = height;
3019 if (GTK_WIDGET_VISIBLE (widget))
3020 gtk_widget_queue_resize (widget);
3023 /*****************************************
3024 * gtk_widget_set_events:
3029 *****************************************/
3032 gtk_widget_set_events (GtkWidget *widget,
3037 g_return_if_fail (widget != NULL);
3038 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3039 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
3041 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3046 eventp = g_new (gint, 1);
3050 event_key_id = g_quark_from_static_string (event_key);
3051 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3056 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3060 /*****************************************
3061 * gtk_widget_set_extension_events:
3066 *****************************************/
3069 gtk_widget_set_extension_events (GtkWidget *widget,
3070 GdkExtensionMode mode)
3072 GdkExtensionMode *modep;
3074 g_return_if_fail (widget != NULL);
3076 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3079 modep = g_new (GdkExtensionMode, 1);
3082 if (!extension_event_key_id)
3083 extension_event_key_id = g_quark_from_static_string (extension_event_key);
3084 gtk_object_set_data_by_id (GTK_OBJECT (widget), extension_event_key_id, modep);
3087 /*****************************************
3088 * gtk_widget_get_toplevel:
3093 *****************************************/
3096 gtk_widget_get_toplevel (GtkWidget *widget)
3098 g_return_val_if_fail (widget != NULL, NULL);
3100 while (widget->parent)
3101 widget = widget->parent;
3106 /*****************************************
3107 * gtk_widget_get_ancestor:
3112 *****************************************/
3115 gtk_widget_get_ancestor (GtkWidget *widget,
3116 GtkType widget_type)
3118 g_return_val_if_fail (widget != NULL, NULL);
3120 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type))
3121 widget = widget->parent;
3123 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type)))
3129 /*****************************************
3130 * gtk_widget_get_colormap:
3135 *****************************************/
3138 gtk_widget_get_colormap (GtkWidget *widget)
3140 GdkColormap *colormap;
3142 g_return_val_if_fail (widget != NULL, NULL);
3144 if (!widget->window)
3146 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
3149 return gtk_widget_get_default_colormap ();
3152 return gdk_window_get_colormap (widget->window);
3155 /*****************************************
3156 * gtk_widget_get_visual:
3161 *****************************************/
3164 gtk_widget_get_visual (GtkWidget *widget)
3168 g_return_val_if_fail (widget != NULL, NULL);
3170 if (!widget->window)
3172 visual = gtk_object_get_data (GTK_OBJECT (widget), visual_key);
3175 return gtk_widget_get_default_visual ();
3178 return gdk_window_get_visual (widget->window);
3181 /*****************************************
3182 * gtk_widget_get_events:
3187 *****************************************/
3190 gtk_widget_get_events (GtkWidget *widget)
3194 g_return_val_if_fail (widget != NULL, 0);
3196 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3203 /*****************************************
3204 * gtk_widget_get_extension_events:
3209 *****************************************/
3212 gtk_widget_get_extension_events (GtkWidget *widget)
3214 GdkExtensionMode *mode;
3216 g_return_val_if_fail (widget != NULL, 0);
3218 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3225 /*****************************************
3226 * gtk_widget_get_pointer:
3231 *****************************************/
3234 gtk_widget_get_pointer (GtkWidget *widget,
3238 g_return_if_fail (widget != NULL);
3245 if (GTK_WIDGET_REALIZED (widget))
3247 gdk_window_get_pointer (widget->window, x, y, NULL);
3249 if (GTK_WIDGET_NO_WINDOW (widget))
3252 *x -= widget->allocation.x;
3254 *y -= widget->allocation.y;
3259 /*****************************************
3260 * gtk_widget_is_ancestor:
3265 *****************************************/
3268 gtk_widget_is_ancestor (GtkWidget *widget,
3269 GtkWidget *ancestor)
3271 g_return_val_if_fail (widget != NULL, FALSE);
3272 g_return_val_if_fail (ancestor != NULL, FALSE);
3276 if (widget->parent == ancestor)
3278 widget = widget->parent;
3284 /*****************************************
3285 * gtk_widget_is_child:
3290 *****************************************/
3293 gtk_widget_is_child (GtkWidget *widget,
3296 g_return_val_if_fail (widget != NULL, FALSE);
3297 g_return_val_if_fail (child != NULL, FALSE);
3299 return (child->parent == widget);
3302 /*****************************************
3303 * gtk_widget_push_colormap:
3308 *****************************************/
3311 gtk_widget_push_colormap (GdkColormap *cmap)
3313 g_return_if_fail (cmap != NULL);
3315 colormap_stack = g_slist_prepend (colormap_stack, cmap);
3318 /*****************************************
3319 * gtk_widget_push_visual:
3324 *****************************************/
3327 gtk_widget_push_visual (GdkVisual *visual)
3329 g_return_if_fail (visual != NULL);
3331 visual_stack = g_slist_prepend (visual_stack, visual);
3334 /*****************************************
3335 * gtk_widget_pop_colormap:
3340 *****************************************/
3343 gtk_widget_pop_colormap (void)
3349 tmp = colormap_stack;
3350 colormap_stack = colormap_stack->next;
3351 g_slist_free_1 (tmp);
3355 /*****************************************
3356 * gtk_widget_pop_visual:
3361 *****************************************/
3364 gtk_widget_pop_visual (void)
3371 visual_stack = visual_stack->next;
3372 g_slist_free_1 (tmp);
3376 /*****************************************
3377 * gtk_widget_set_default_colormap:
3382 *****************************************/
3385 gtk_widget_set_default_colormap (GdkColormap *colormap)
3387 if (default_colormap != colormap)
3389 if (default_colormap)
3390 gdk_colormap_unref (default_colormap);
3391 default_colormap = colormap;
3392 if (default_colormap)
3393 gdk_colormap_ref (default_colormap);
3397 /*****************************************
3398 * gtk_widget_set_default_visual:
3403 *****************************************/
3406 gtk_widget_set_default_visual (GdkVisual *visual)
3408 default_visual = visual;
3411 /*****************************************
3412 * gtk_widget_get_default_colormap:
3417 *****************************************/
3420 gtk_widget_get_default_colormap (void)
3422 if (!default_colormap)
3423 default_colormap = gdk_colormap_get_system ();
3425 return default_colormap;
3428 /*****************************************
3429 * gtk_widget_get_default_visual:
3434 *****************************************/
3437 gtk_widget_get_default_visual (void)
3439 if (!default_visual)
3440 default_visual = gdk_visual_get_system ();
3442 return default_visual;
3445 /*****************************************
3446 * gtk_widget_marshal_signal_1:
3451 *****************************************/
3454 gtk_widget_marshal_signal_1 (GtkObject *object,
3459 GtkWidgetSignal1 rfunc;
3461 rfunc = (GtkWidgetSignal1) func;
3464 GTK_VALUE_POINTER (args[0]),
3468 /*****************************************
3469 * gtk_widget_marshal_signal_4:
3474 *****************************************/
3477 gtk_widget_marshal_signal_4 (GtkObject *object,
3482 GtkWidgetSignal4 rfunc;
3485 rfunc = (GtkWidgetSignal4) func;
3486 return_val = GTK_RETLOC_BOOL (args[1]);
3488 *return_val = (* rfunc) (object,
3489 GTK_VALUE_BOXED (args[0]),
3493 /*****************************************
3494 * gtk_widget_marshal_signal_5:
3499 *****************************************/
3502 gtk_widget_marshal_signal_5 (GtkObject *object,
3507 GtkWidgetSignal5 rfunc;
3509 rfunc = (GtkWidgetSignal5) func;
3512 GTK_VALUE_UINT (args[0]),
3516 /*****************************************
3517 * gtk_widget_marshal_signal_6:
3522 *****************************************/
3525 gtk_widget_marshal_signal_6 (GtkObject *object,
3530 GtkWidgetSignal6 rfunc;
3532 rfunc = (GtkWidgetSignal6) func;
3535 GTK_VALUE_OBJECT (args[0]),
3539 /*****************************************
3540 * gtk_widget_marshal_signal_7:
3545 *****************************************/
3548 gtk_widget_marshal_signal_7 (GtkObject *object,
3553 GtkWidgetSignal7 rfunc;
3555 rfunc = (GtkWidgetSignal7) func;
3558 GTK_VALUE_BOXED (args[0]),
3563 gtk_widget_shutdown (GtkObject *object)
3567 /* gtk_object_destroy() will already hold a refcount on object
3569 widget = GTK_WIDGET (object);
3572 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
3574 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3575 if (GTK_WIDGET_REALIZED (widget))
3576 gtk_widget_unrealize (widget);
3578 parent_class->shutdown (object);
3582 gtk_widget_real_destroy (GtkObject *object)
3585 GtkStyle *saved_style;
3587 /* gtk_object_destroy() will already hold a refcount on object
3589 widget = GTK_WIDGET (object);
3591 gtk_grab_remove (widget);
3592 gtk_selection_remove_all (widget);
3594 saved_style = gtk_object_get_data_by_id (object, saved_default_style_key_id);
3597 gtk_style_unref (saved_style);
3598 gtk_object_remove_data_by_id (object, saved_default_style_key_id);
3601 gtk_style_unref (widget->style);
3602 widget->style = NULL;
3604 parent_class->destroy (object);
3608 gtk_widget_finalize (GtkObject *object)
3611 GtkWidgetAuxInfo *aux_info;
3613 GdkExtensionMode *mode;
3615 widget = GTK_WIDGET (object);
3618 g_free (widget->name);
3620 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3622 gtk_widget_aux_info_destroy (aux_info);
3624 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3628 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3632 parent_class->finalize (object);
3635 /*****************************************
3636 * gtk_widget_real_show:
3641 *****************************************/
3644 gtk_widget_real_show (GtkWidget *widget)
3646 g_return_if_fail (widget != NULL);
3647 g_return_if_fail (GTK_IS_WIDGET (widget));
3649 if (!GTK_WIDGET_VISIBLE (widget))
3651 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
3655 gtk_widget_queue_resize (widget->parent);
3657 if (GTK_WIDGET_MAPPED (widget->parent))
3658 gtk_widget_map (widget);
3663 /*****************************************
3664 * gtk_widget_real_hide:
3669 *****************************************/
3672 gtk_widget_real_hide (GtkWidget *widget)
3674 g_return_if_fail (widget != NULL);
3675 g_return_if_fail (GTK_IS_WIDGET (widget));
3677 if (GTK_WIDGET_VISIBLE (widget))
3679 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3681 if (GTK_WIDGET_MAPPED (widget))
3682 gtk_widget_unmap (widget);
3685 gtk_widget_queue_resize (widget->parent);
3689 /*****************************************
3690 * gtk_widget_real_map:
3695 *****************************************/
3698 gtk_widget_real_map (GtkWidget *widget)
3700 g_return_if_fail (widget != NULL);
3701 g_return_if_fail (GTK_IS_WIDGET (widget));
3703 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget))
3705 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
3707 if (!GTK_WIDGET_NO_WINDOW (widget))
3708 gdk_window_show (widget->window);
3710 gtk_widget_queue_draw (widget);
3714 /*****************************************
3715 * gtk_widget_real_unmap:
3720 *****************************************/
3723 gtk_widget_real_unmap (GtkWidget *widget)
3725 g_return_if_fail (widget != NULL);
3726 g_return_if_fail (GTK_IS_WIDGET (widget));
3728 if (GTK_WIDGET_MAPPED (widget))
3730 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
3732 if (GTK_WIDGET_NO_WINDOW (widget))
3733 gdk_window_clear_area (widget->window,
3734 widget->allocation.x,
3735 widget->allocation.y,
3736 widget->allocation.width,
3737 widget->allocation.height);
3739 gdk_window_hide (widget->window);
3743 /*****************************************
3744 * gtk_widget_real_realize:
3749 *****************************************/
3752 gtk_widget_real_realize (GtkWidget *widget)
3754 g_return_if_fail (widget != NULL);
3755 g_return_if_fail (GTK_IS_WIDGET (widget));
3756 g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
3758 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
3761 widget->window = gtk_widget_get_parent_window (widget);
3762 gdk_window_ref (widget->window);
3764 widget->style = gtk_style_attach (widget->style, widget->window);
3767 /*****************************************
3768 * gtk_widget_real_unrealize:
3773 *****************************************/
3776 gtk_widget_real_unrealize (GtkWidget *widget)
3778 g_return_if_fail (widget != NULL);
3779 g_return_if_fail (GTK_IS_WIDGET (widget));
3781 if (GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_MAPPED (widget))
3782 gtk_widget_real_unmap (widget);
3784 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
3786 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT(widget)->klass->type));
3789 gtk_style_detach (widget->style);
3790 if (!GTK_WIDGET_NO_WINDOW (widget))
3792 gdk_window_set_user_data (widget->window, NULL);
3793 gdk_window_destroy (widget->window);
3794 widget->window = NULL;
3798 gdk_window_unref (widget->window);
3799 widget->window = NULL;
3802 /* Unrealize afterwards to improve visual effect */
3804 if (GTK_IS_CONTAINER (widget))
3805 gtk_container_foreach (GTK_CONTAINER (widget),
3806 (GtkCallback) gtk_widget_unrealize,
3810 /*****************************************
3811 * gtk_widget_real_draw:
3816 *****************************************/
3819 gtk_widget_real_draw (GtkWidget *widget,
3822 GdkEventExpose event;
3824 g_return_if_fail (widget != NULL);
3825 g_return_if_fail (GTK_IS_WIDGET (widget));
3826 g_return_if_fail (area != NULL);
3828 if (GTK_WIDGET_DRAWABLE (widget))
3830 event.type = GDK_EXPOSE;
3831 event.send_event = TRUE;
3832 event.window = widget->window;
3836 gdk_window_ref (event.window);
3837 gtk_widget_event (widget, (GdkEvent*) &event);
3838 gdk_window_unref (event.window);
3842 /*****************************************
3843 * gtk_widget_real_size_allocate:
3848 *****************************************/
3851 gtk_widget_real_size_allocate (GtkWidget *widget,
3852 GtkAllocation *allocation)
3854 g_return_if_fail (widget != NULL);
3855 g_return_if_fail (GTK_IS_WIDGET (widget));
3857 if (GTK_WIDGET_NO_WINDOW (widget) &&
3858 GTK_WIDGET_MAPPED (widget) &&
3859 ((widget->allocation.x != allocation->x) ||
3860 (widget->allocation.y != allocation->y) ||
3861 (widget->allocation.width != allocation->width) ||
3862 (widget->allocation.height != allocation->height)) &&
3863 (widget->allocation.width != 0) &&
3864 (widget->allocation.height != 0))
3865 gdk_window_clear_area (widget->window,
3866 widget->allocation.x,
3867 widget->allocation.y,
3868 widget->allocation.width,
3869 widget->allocation.height);
3871 widget->allocation = *allocation;
3873 if (GTK_WIDGET_REALIZED (widget) &&
3874 !GTK_WIDGET_NO_WINDOW (widget))
3875 gdk_window_move_resize (widget->window,
3876 allocation->x, allocation->y,
3877 allocation->width, allocation->height);
3880 /*****************************************
3881 * gtk_widget_peek_colormap:
3886 *****************************************/
3889 gtk_widget_peek_colormap (void)
3892 return (GdkColormap*) colormap_stack->data;
3893 return gtk_widget_get_default_colormap ();
3896 /*****************************************
3897 * gtk_widget_peek_visual:
3902 *****************************************/
3905 gtk_widget_peek_visual (void)
3908 return (GdkVisual*) visual_stack->data;
3909 return gtk_widget_get_default_visual ();
3912 /*************************************************************
3913 * gtk_widget_propagate_state:
3914 * Propagate a change in the widgets state down the tree
3918 * GtkStateData: state
3922 *************************************************************/
3925 gtk_widget_propagate_state (GtkWidget *widget,
3930 /* don't call this function with state==GTK_STATE_INSENSITIVE,
3931 * parent_sensitive==TRUE on a sensitive widget
3934 old_state = GTK_WIDGET_STATE (widget);
3936 if (data->parent_sensitive)
3938 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3940 if (GTK_WIDGET_IS_SENSITIVE (widget))
3942 if (data->state_restauration)
3943 GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget);
3945 GTK_WIDGET_STATE (widget) = data->state;
3949 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3950 if (!data->state_restauration &&
3951 data->state != GTK_STATE_INSENSITIVE)
3952 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3957 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3958 if (!data->state_restauration)
3960 if (data->state != GTK_STATE_INSENSITIVE)
3961 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3963 else if (GTK_WIDGET_STATE (widget) != GTK_STATE_INSENSITIVE)
3964 GTK_WIDGET_SAVED_STATE (widget) = GTK_WIDGET_STATE (widget);
3965 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3968 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
3972 window = gtk_widget_get_ancestor (widget, gtk_window_get_type ());
3974 gtk_window_set_focus (GTK_WINDOW (window), NULL);
3977 if (old_state != GTK_WIDGET_STATE (widget))
3979 gtk_widget_ref (widget);
3980 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
3982 if (GTK_IS_CONTAINER (widget))
3984 data->parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget) != FALSE);
3985 data->state = GTK_WIDGET_STATE (widget);
3986 gtk_container_foreach (GTK_CONTAINER (widget),
3987 (GtkCallback) gtk_widget_propagate_state,
3990 gtk_widget_unref (widget);
3994 /*****************************************
3995 * gtk_widget_draw_children_recurse:
4000 *****************************************/
4003 gtk_widget_draw_children_recurse (GtkWidget *widget,
4004 gpointer client_data)
4006 gtk_widget_draw (widget, NULL);
4007 gtk_widget_draw_children (widget);
4010 /*****************************************
4011 * gtk_widget_aux_info_new:
4016 *****************************************/
4018 static GtkWidgetAuxInfo*
4019 gtk_widget_aux_info_new (void)
4021 GtkWidgetAuxInfo *aux_info;
4023 if (!aux_info_mem_chunk)
4024 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
4025 sizeof (GtkWidgetAuxInfo),
4026 1024, G_ALLOC_AND_FREE);
4028 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
4032 aux_info->width = 0;
4033 aux_info->height = 0;
4038 /*****************************************
4039 * gtk_widget_aux_info_destroy:
4044 *****************************************/
4047 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
4049 g_return_if_fail (aux_info != NULL);
4051 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
4054 /*****************************************
4055 * gtk_widget_shape_combine_mask:
4056 * set a shape for this widgets' gdk window, this allows for
4057 * transparent windows etc., see gdk_window_shape_combine_mask
4058 * for more information
4063 *****************************************/
4065 gtk_widget_shape_combine_mask (GtkWidget *widget,
4066 GdkBitmap *shape_mask,
4070 GtkWidgetShapeInfo* shape_info;
4072 g_return_if_fail (widget != NULL);
4073 /* set_shape doesn't work on widgets without gdk window */
4074 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
4078 GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4081 gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
4083 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4084 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
4085 g_free (shape_info);
4089 GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4091 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4094 shape_info = g_new (GtkWidgetShapeInfo, 1);
4095 gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
4097 shape_info->shape_mask = shape_mask;
4098 shape_info->offset_x = offset_x;
4099 shape_info->offset_y = offset_y;
4101 /* set shape if widget has a gdk window allready.
4102 * otherwise the shape is scheduled to be set by gtk_widget_realize.
4105 gdk_window_shape_combine_mask (widget->window, shape_mask,
4106 offset_x, offset_y);
4110 /*****************************************
4111 * gtk_widget_dnd_drag_add:
4112 * when you get a DRAG_ENTER event, you can use this
4113 * to tell Gtk ofother widgets that are to be dragged as well
4118 *****************************************/
4120 gtk_widget_dnd_drag_add (GtkWidget *widget)
4124 /*****************************************
4125 * gtk_widget_dnd_drag_set:
4126 * these two functions enable drag and/or drop on a
4127 * widget and also let Gtk know what data types will be accepted
4128 * use MIME type naming,plus tacking "URL:" on the front for link
4135 *****************************************/
4137 gtk_widget_dnd_drag_set (GtkWidget *widget,
4139 gchar **type_accept_list,
4142 g_return_if_fail(widget != NULL);
4144 if (!widget->window)
4145 gtk_widget_realize (widget);
4147 g_return_if_fail (widget->window != NULL);
4148 gdk_window_dnd_drag_set (widget->window,
4154 /*****************************************
4155 * gtk_widget_dnd_drop_set:
4160 *****************************************/
4162 gtk_widget_dnd_drop_set (GtkWidget *widget,
4164 gchar **type_accept_list,
4166 guint8 is_destructive_operation)
4168 g_return_if_fail(widget != NULL);
4170 if (!widget->window)
4171 gtk_widget_realize (widget);
4173 g_return_if_fail (widget->window != NULL);
4174 gdk_window_dnd_drop_set (widget->window,
4178 is_destructive_operation);
4181 /*****************************************
4182 * gtk_widget_dnd_data_set:
4187 *****************************************/
4189 gtk_widget_dnd_data_set (GtkWidget *widget,
4192 gulong data_numbytes)
4194 g_return_if_fail (widget != NULL);
4195 g_return_if_fail (widget->window != NULL);
4197 gdk_window_dnd_data_set (widget->window, event, data, data_numbytes);
4201 gtk_widget_ref (GtkWidget *widget)
4203 g_return_if_fail (widget != NULL);
4204 g_return_if_fail (GTK_IS_WIDGET (widget));
4206 gtk_object_ref ((GtkObject*) widget);
4210 gtk_widget_unref (GtkWidget *widget)
4212 g_return_if_fail (widget != NULL);
4213 g_return_if_fail (GTK_IS_WIDGET (widget));
4215 gtk_object_unref ((GtkObject*) widget);
4219 gtk_widget_path (GtkWidget *widget,
4220 guint *path_length_p,
4222 gchar **path_reversed_p)
4224 static gchar *rev_path = NULL;
4225 static guint path_len = 0;
4228 g_return_if_fail (widget != NULL);
4229 g_return_if_fail (GTK_IS_WIDGET (widget));
4238 string = gtk_widget_get_name (widget);
4239 l = strlen (string);
4240 while (path_len <= len + l + 1)
4242 path_len += INIT_PATH_SIZE;
4243 rev_path = g_realloc (rev_path, path_len);
4251 widget = widget->parent;
4254 rev_path[len++] = '.';
4256 rev_path[len++] = 0;
4261 *path_length_p = len - 1;
4262 if (path_reversed_p)
4263 *path_reversed_p = g_strdup (rev_path);
4266 *path_p = g_strdup (rev_path);
4267 g_strreverse (*path_p);
4272 gtk_widget_class_path (GtkWidget *widget,
4273 guint *path_length_p,
4275 gchar **path_reversed_p)
4277 static gchar *rev_path = NULL;
4278 static guint path_len = 0;
4281 g_return_if_fail (widget != NULL);
4282 g_return_if_fail (GTK_IS_WIDGET (widget));
4291 string = gtk_type_name (GTK_WIDGET_TYPE (widget));
4292 l = strlen (string);
4293 while (path_len <= len + l + 1)
4295 path_len += INIT_PATH_SIZE;
4296 rev_path = g_realloc (rev_path, path_len);
4304 widget = widget->parent;
4307 rev_path[len++] = '.';
4309 rev_path[len++] = 0;
4314 *path_length_p = len - 1;
4315 if (path_reversed_p)
4316 *path_reversed_p = g_strdup (rev_path);
4319 *path_p = g_strdup (rev_path);
4320 g_strreverse (*path_p);