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 Free
16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include "gtkcontainer.h"
23 #include "gtkselection.h"
24 #include "gtksignal.h"
25 #include "gtkwidget.h"
26 #include "gtkwindow.h"
27 #include "gtkprivate.h"
32 #define WIDGET_CLASS(w) GTK_WIDGET_CLASS (GTK_OBJECT (w)->klass)
66 PROPERTY_NOTIFY_EVENT,
67 SELECTION_CLEAR_EVENT,
68 SELECTION_REQUEST_EVENT,
69 SELECTION_NOTIFY_EVENT,
77 DROP_DATA_AVAILABLE_EVENT,
104 typedef void (*GtkWidgetSignal1) (GtkObject *object,
107 typedef gint (*GtkWidgetSignal2) (GtkObject *object,
112 typedef void (*GtkWidgetSignal3) (GtkObject *object,
115 typedef gint (*GtkWidgetSignal4) (GtkObject *object,
118 typedef void (*GtkWidgetSignal5) (GtkObject *object,
122 typedef struct _GtkStateData GtkStateData;
127 gint parent_sensitive;
131 static void gtk_widget_marshal_signal_1 (GtkObject *object,
135 static void gtk_widget_marshal_signal_2 (GtkObject *object,
139 static void gtk_widget_marshal_signal_3 (GtkObject *object,
143 static void gtk_widget_marshal_signal_4 (GtkObject *object,
147 static void gtk_widget_marshal_signal_5 (GtkObject *object,
152 static void gtk_widget_class_init (GtkWidgetClass *klass);
153 static void gtk_widget_init (GtkWidget *widget);
154 static void gtk_widget_set_arg (GtkWidget *widget,
157 static void gtk_widget_get_arg (GtkWidget *widget,
160 static void gtk_widget_real_destroy (GtkObject *object);
161 static void gtk_widget_real_finalize (GtkObject *object);
162 static void gtk_widget_real_show (GtkWidget *widget);
163 static void gtk_widget_real_hide (GtkWidget *widget);
164 static void gtk_widget_real_map (GtkWidget *widget);
165 static void gtk_widget_real_unmap (GtkWidget *widget);
166 static void gtk_widget_real_realize (GtkWidget *widget);
167 static void gtk_widget_real_unrealize (GtkWidget *widget);
168 static void gtk_widget_real_draw (GtkWidget *widget,
170 static gint gtk_widget_real_queue_draw (GtkWidget *widget);
171 static gint gtk_widget_real_queue_resize (GtkWidget *widget);
172 static void gtk_widget_real_size_allocate (GtkWidget *widget,
173 GtkAllocation *allocation);
175 static GdkColormap* gtk_widget_peek_colormap (void);
176 static GdkVisual* gtk_widget_peek_visual (void);
177 static GtkStyle* gtk_widget_peek_style (void);
179 static void gtk_widget_reparent_container_child (GtkWidget *widget,
180 gpointer client_data);
181 static void gtk_widget_propagate_state (GtkWidget *widget,
183 static void gtk_widget_draw_children_recurse (GtkWidget *widget,
184 gpointer client_data);
185 static void gtk_widget_set_style_internal (GtkWidget *widget,
187 static void gtk_widget_set_style_recurse (GtkWidget *widget,
188 gpointer client_data);
190 extern GtkArg* gtk_object_collect_args (guint *nargs,
194 static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
195 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
197 static GtkObjectClass *parent_class = NULL;
198 static gint widget_signals[LAST_SIGNAL] = { 0 };
200 static GMemChunk *aux_info_mem_chunk = NULL;
202 static GdkColormap *default_colormap = NULL;
203 static GdkVisual *default_visual = NULL;
204 static GtkStyle *default_style = NULL;
206 static GSList *colormap_stack = NULL;
207 static GSList *visual_stack = NULL;
208 static GSList *style_stack = NULL;
210 static GSList *gtk_widget_redraw_queue = NULL;
211 static GSList *gtk_widget_resize_queue = NULL;
213 static const gchar *aux_info_key = "gtk-aux-info";
214 static const gchar *colormap_key = "gtk-colormap";
215 static const gchar *visual_key = "gtk-visual";
216 static const gchar *event_key = "gtk-event-mask";
217 static const gchar *extension_event_key = "gtk-extension-event-mode";
218 static const gchar *parent_window_key = "gtk-parent-window";
219 static const gchar *shape_info_key = "gtk-shape-info";
223 /*****************************************
224 * gtk_widget_get_type:
229 *****************************************/
232 gtk_widget_get_type ()
234 static guint widget_type = 0;
238 GtkTypeInfo widget_info =
242 sizeof (GtkWidgetClass),
243 (GtkClassInitFunc) gtk_widget_class_init,
244 (GtkObjectInitFunc) gtk_widget_init,
245 (GtkArgSetFunc) gtk_widget_set_arg,
246 (GtkArgGetFunc) gtk_widget_get_arg,
249 widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);
255 /*****************************************
256 * gtk_widget_class_init:
261 *****************************************/
264 gtk_widget_class_init (GtkWidgetClass *klass)
266 GtkObjectClass *object_class;
268 object_class = (GtkObjectClass*) klass;
270 parent_class = gtk_type_class (gtk_object_get_type ());
272 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, ARG_X);
273 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, ARG_Y);
274 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, ARG_WIDTH);
275 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, ARG_HEIGHT);
276 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, ARG_VISIBLE);
277 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, ARG_SENSITIVE);
278 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, ARG_CAN_FOCUS);
279 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, ARG_HAS_FOCUS);
280 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, ARG_CAN_DEFAULT);
281 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, ARG_HAS_DEFAULT);
282 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, ARG_EVENTS);
283 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, ARG_EXTENSION_EVENTS);
284 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, ARG_NAME);
285 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, ARG_STYLE);
286 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, ARG_PARENT);
288 widget_signals[SHOW] =
289 gtk_signal_new ("show",
292 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
293 gtk_signal_default_marshaller,
295 widget_signals[HIDE] =
296 gtk_signal_new ("hide",
299 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
300 gtk_signal_default_marshaller,
302 widget_signals[MAP] =
303 gtk_signal_new ("map",
306 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
307 gtk_signal_default_marshaller,
309 widget_signals[UNMAP] =
310 gtk_signal_new ("unmap",
313 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
314 gtk_signal_default_marshaller,
316 widget_signals[REALIZE] =
317 gtk_signal_new ("realize",
320 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
321 gtk_signal_default_marshaller,
323 widget_signals[UNREALIZE] =
324 gtk_signal_new ("unrealize",
327 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
328 gtk_signal_default_marshaller,
330 widget_signals[DRAW] =
331 gtk_signal_new ("draw",
334 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
335 gtk_widget_marshal_signal_1,
338 widget_signals[DRAW_FOCUS] =
339 gtk_signal_new ("draw_focus",
342 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
343 gtk_signal_default_marshaller,
345 widget_signals[DRAW_DEFAULT] =
346 gtk_signal_new ("draw_default",
349 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
350 gtk_signal_default_marshaller,
352 widget_signals[SIZE_REQUEST] =
353 gtk_signal_new ("size_request",
356 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
357 gtk_widget_marshal_signal_1,
360 widget_signals[SIZE_ALLOCATE] =
361 gtk_signal_new ("size_allocate",
364 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
365 gtk_widget_marshal_signal_1,
368 widget_signals[STATE_CHANGED] =
369 gtk_signal_new ("state_changed",
372 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
373 gtk_widget_marshal_signal_5,
376 widget_signals[INSTALL_ACCELERATOR] =
377 gtk_signal_new ("install_accelerator",
380 GTK_SIGNAL_OFFSET (GtkWidgetClass, install_accelerator),
381 gtk_widget_marshal_signal_2,
386 widget_signals[REMOVE_ACCELERATOR] =
387 gtk_signal_new ("remove_accelerator",
390 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator),
391 gtk_widget_marshal_signal_3,
394 widget_signals[EVENT] =
395 gtk_signal_new ("event",
398 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
399 gtk_widget_marshal_signal_4,
402 widget_signals[BUTTON_PRESS_EVENT] =
403 gtk_signal_new ("button_press_event",
406 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
407 gtk_widget_marshal_signal_4,
410 widget_signals[BUTTON_RELEASE_EVENT] =
411 gtk_signal_new ("button_release_event",
414 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
415 gtk_widget_marshal_signal_4,
418 widget_signals[MOTION_NOTIFY_EVENT] =
419 gtk_signal_new ("motion_notify_event",
422 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
423 gtk_widget_marshal_signal_4,
426 widget_signals[DELETE_EVENT] =
427 gtk_signal_new ("delete_event",
430 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
431 gtk_widget_marshal_signal_4,
434 widget_signals[DESTROY_EVENT] =
435 gtk_signal_new ("destroy_event",
438 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
439 gtk_widget_marshal_signal_4,
442 widget_signals[EXPOSE_EVENT] =
443 gtk_signal_new ("expose_event",
446 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
447 gtk_widget_marshal_signal_4,
450 widget_signals[KEY_PRESS_EVENT] =
451 gtk_signal_new ("key_press_event",
454 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
455 gtk_widget_marshal_signal_4,
458 widget_signals[KEY_RELEASE_EVENT] =
459 gtk_signal_new ("key_release_event",
462 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
463 gtk_widget_marshal_signal_4,
466 widget_signals[ENTER_NOTIFY_EVENT] =
467 gtk_signal_new ("enter_notify_event",
470 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
471 gtk_widget_marshal_signal_4,
474 widget_signals[LEAVE_NOTIFY_EVENT] =
475 gtk_signal_new ("leave_notify_event",
478 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
479 gtk_widget_marshal_signal_4,
482 widget_signals[CONFIGURE_EVENT] =
483 gtk_signal_new ("configure_event",
486 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
487 gtk_widget_marshal_signal_4,
490 widget_signals[FOCUS_IN_EVENT] =
491 gtk_signal_new ("focus_in_event",
494 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
495 gtk_widget_marshal_signal_4,
498 widget_signals[FOCUS_OUT_EVENT] =
499 gtk_signal_new ("focus_out_event",
502 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
503 gtk_widget_marshal_signal_4,
506 widget_signals[MAP_EVENT] =
507 gtk_signal_new ("map_event",
510 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
511 gtk_widget_marshal_signal_4,
514 widget_signals[UNMAP_EVENT] =
515 gtk_signal_new ("unmap_event",
518 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
519 gtk_widget_marshal_signal_4,
522 widget_signals[PROPERTY_NOTIFY_EVENT] =
523 gtk_signal_new ("property_notify_event",
526 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
527 gtk_widget_marshal_signal_4,
530 widget_signals[SELECTION_CLEAR_EVENT] =
531 gtk_signal_new ("selection_clear_event",
534 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
535 gtk_widget_marshal_signal_4,
538 widget_signals[SELECTION_REQUEST_EVENT] =
539 gtk_signal_new ("selection_request_event",
542 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
543 gtk_widget_marshal_signal_4,
546 widget_signals[SELECTION_NOTIFY_EVENT] =
547 gtk_signal_new ("selection_notify_event",
550 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
551 gtk_widget_marshal_signal_4,
554 widget_signals[SELECTION_RECEIVED] =
555 gtk_signal_new ("selection_received",
558 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
559 gtk_widget_marshal_signal_1,
562 widget_signals[PROXIMITY_IN_EVENT] =
563 gtk_signal_new ("proximity_in_event",
566 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
567 gtk_widget_marshal_signal_4,
570 widget_signals[PROXIMITY_OUT_EVENT] =
571 gtk_signal_new ("proximity_out_event",
574 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
575 gtk_widget_marshal_signal_4,
578 widget_signals[DRAG_BEGIN_EVENT] =
579 gtk_signal_new ("drag_begin_event",
582 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin_event),
583 gtk_widget_marshal_signal_4,
586 widget_signals[DRAG_REQUEST_EVENT] =
587 gtk_signal_new ("drag_request_event",
590 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_request_event),
591 gtk_widget_marshal_signal_4,
594 widget_signals[DROP_ENTER_EVENT] =
595 gtk_signal_new ("drop_enter_event",
598 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_enter_event),
599 gtk_widget_marshal_signal_4,
602 widget_signals[DROP_LEAVE_EVENT] =
603 gtk_signal_new ("drop_leave_event",
606 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_leave_event),
607 gtk_widget_marshal_signal_4,
610 widget_signals[DROP_DATA_AVAILABLE_EVENT] =
611 gtk_signal_new ("drop_data_available_event",
614 GTK_SIGNAL_OFFSET (GtkWidgetClass,
615 drop_data_available_event),
616 gtk_widget_marshal_signal_4,
619 widget_signals[OTHER_EVENT] =
620 gtk_signal_new ("other_event",
623 GTK_SIGNAL_OFFSET (GtkWidgetClass, other_event),
624 gtk_widget_marshal_signal_4,
627 widget_signals[CLIENT_EVENT] =
628 gtk_signal_new ("client_event",
631 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
632 gtk_widget_marshal_signal_4,
635 widget_signals[NO_EXPOSE_EVENT] =
636 gtk_signal_new ("no_expose_event",
639 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
640 gtk_widget_marshal_signal_4,
644 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
646 object_class->destroy = gtk_widget_real_destroy;
647 object_class->finalize = gtk_widget_real_finalize;
649 klass->activate_signal = 0;
650 klass->show = gtk_widget_real_show;
651 klass->hide = gtk_widget_real_hide;
652 klass->show_all = gtk_widget_real_show;
653 klass->hide_all = gtk_widget_real_hide;
654 klass->map = gtk_widget_real_map;
655 klass->unmap = gtk_widget_real_unmap;
656 klass->realize = gtk_widget_real_realize;
657 klass->unrealize = gtk_widget_real_unrealize;
658 klass->draw = gtk_widget_real_draw;
659 klass->draw_focus = NULL;
660 klass->size_request = NULL;
661 klass->size_allocate = gtk_widget_real_size_allocate;
662 klass->state_changed = NULL;
663 klass->install_accelerator = NULL;
664 klass->remove_accelerator = NULL;
666 klass->button_press_event = NULL;
667 klass->button_release_event = NULL;
668 klass->motion_notify_event = NULL;
669 klass->delete_event = NULL;
670 klass->destroy_event = NULL;
671 klass->expose_event = NULL;
672 klass->key_press_event = NULL;
673 klass->key_release_event = NULL;
674 klass->enter_notify_event = NULL;
675 klass->leave_notify_event = NULL;
676 klass->configure_event = NULL;
677 klass->focus_in_event = NULL;
678 klass->focus_out_event = NULL;
679 klass->map_event = NULL;
680 klass->unmap_event = NULL;
681 klass->property_notify_event = gtk_selection_property_notify;
682 klass->selection_clear_event = gtk_selection_clear;
683 klass->selection_request_event = gtk_selection_request;
684 klass->selection_notify_event = gtk_selection_notify;
685 klass->selection_received = NULL;
686 klass->proximity_in_event = NULL;
687 klass->proximity_out_event = NULL;
688 klass->drag_begin_event = NULL;
689 klass->drag_request_event = NULL;
690 klass->drop_enter_event = NULL;
691 klass->drop_leave_event = NULL;
692 klass->drop_data_available_event = NULL;
693 klass->other_event = NULL;
694 klass->no_expose_event = NULL;
697 /*****************************************
698 * gtk_widget_set_arg:
703 *****************************************/
706 gtk_widget_set_arg (GtkWidget *widget,
713 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
716 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
719 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -1);
722 gtk_widget_set_usize (widget, -1, GTK_VALUE_INT (*arg));
725 if (GTK_VALUE_BOOL(*arg))
726 gtk_widget_show (widget);
728 gtk_widget_hide (widget);
731 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
734 if (GTK_VALUE_BOOL (*arg))
735 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
737 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
740 if (GTK_VALUE_BOOL (*arg))
741 gtk_widget_grab_focus (widget);
743 case ARG_CAN_DEFAULT:
744 if (GTK_VALUE_BOOL (*arg))
745 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
747 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
749 case ARG_HAS_DEFAULT:
750 if (GTK_VALUE_BOOL (*arg))
751 gtk_widget_grab_default (widget);
754 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
756 case ARG_EXTENSION_EVENTS:
757 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
760 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
763 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
766 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
769 arg->type = GTK_TYPE_INVALID;
774 /*****************************************
775 * gtk_widget_get_arg:
780 *****************************************/
783 gtk_widget_get_arg (GtkWidget *widget,
787 GtkWidgetAuxInfo *aux_info;
789 GdkExtensionMode *modep;
794 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
796 GTK_VALUE_INT (*arg) = -2;
798 GTK_VALUE_INT (*arg) = aux_info->x;
801 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
803 GTK_VALUE_INT (*arg) = -2;
805 GTK_VALUE_INT (*arg) = aux_info->y;
808 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
810 GTK_VALUE_INT (*arg) = -2;
812 GTK_VALUE_INT (*arg) = aux_info->width;
815 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
817 GTK_VALUE_INT (*arg) = -2;
819 GTK_VALUE_INT (*arg) = aux_info->height;
822 GTK_VALUE_BOOL (*arg) = GTK_WIDGET_VISIBLE (widget);
825 GTK_VALUE_BOOL (*arg) = GTK_WIDGET_SENSITIVE (widget);
828 GTK_VALUE_BOOL (*arg) = GTK_WIDGET_CAN_FOCUS (widget);
831 GTK_VALUE_BOOL (*arg) = GTK_WIDGET_HAS_FOCUS (widget);
833 case ARG_CAN_DEFAULT:
834 GTK_VALUE_BOOL (*arg) = GTK_WIDGET_CAN_DEFAULT (widget);
836 case ARG_HAS_DEFAULT:
837 GTK_VALUE_BOOL (*arg) = GTK_WIDGET_HAS_DEFAULT (widget);
840 eventp = gtk_object_get_data (GTK_OBJECT (widget), event_key);
842 GTK_VALUE_FLAGS (*arg) = 0;
844 GTK_VALUE_FLAGS (*arg) = *eventp;
846 case ARG_EXTENSION_EVENTS:
847 modep = gtk_object_get_data (GTK_OBJECT (widget), extension_event_key);
849 GTK_VALUE_FLAGS (*arg) = 0;
851 GTK_VALUE_FLAGS (*arg) = *modep;
855 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
857 GTK_VALUE_STRING (*arg) = g_strdup ("");
860 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
863 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
866 arg->type = GTK_TYPE_INVALID;
871 /*****************************************
877 *****************************************/
880 gtk_widget_init (GtkWidget *widget)
882 GdkColormap *colormap;
885 GTK_PRIVATE_FLAGS (widget) = 0;
886 widget->state = GTK_STATE_NORMAL;
887 widget->saved_state = GTK_STATE_NORMAL;
889 widget->requisition.width = 0;
890 widget->requisition.height = 0;
891 widget->allocation.x = -1;
892 widget->allocation.y = -1;
893 widget->allocation.width = 1;
894 widget->allocation.height = 1;
895 widget->window = NULL;
896 widget->parent = NULL;
898 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE | GTK_PARENT_SENSITIVE);
900 widget->style = gtk_widget_peek_style ();
901 gtk_style_ref (widget->style);
903 colormap = gtk_widget_peek_colormap ();
904 visual = gtk_widget_peek_visual ();
906 /* XXX - should we ref the colormap and visual, too? */
908 if (colormap != gtk_widget_get_default_colormap ())
910 /* gdk_colormap_ref (colormap); */
911 gtk_object_set_data (GTK_OBJECT (widget), colormap_key, colormap);
914 if (visual != gtk_widget_get_default_visual ())
916 /* gdk_visual_ref (visual); */
917 gtk_object_set_data (GTK_OBJECT (widget), visual_key, visual);
921 /*****************************************
927 *****************************************/
930 gtk_widget_new (guint type,
939 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
941 obj = gtk_type_new (type);
943 va_start (args1, type);
944 va_start (args2, type);
946 args = gtk_object_collect_args (&nargs, args1, args2);
947 gtk_object_setv (obj, nargs, args);
953 return GTK_WIDGET (obj);
957 gtk_widget_ref (GtkWidget *widget)
959 gtk_object_ref (GTK_OBJECT (widget));
963 gtk_widget_unref (GtkWidget *widget)
965 gtk_object_unref (GTK_OBJECT (widget));
968 /*****************************************
974 *****************************************/
977 gtk_widget_newv (guint type,
981 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
983 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
986 /*****************************************
992 *****************************************/
995 gtk_widget_get (GtkWidget *widget,
998 g_return_if_fail (widget != NULL);
999 g_return_if_fail (arg != NULL);
1001 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1004 /*****************************************
1010 *****************************************/
1013 gtk_widget_getv (GtkWidget *widget,
1017 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1020 /*****************************************
1026 *****************************************/
1029 gtk_widget_set (GtkWidget *widget,
1037 g_return_if_fail (widget != NULL);
1039 va_start (args1, widget);
1040 va_start (args2, widget);
1042 args = gtk_object_collect_args (&nargs, args1, args2);
1043 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1050 /*****************************************
1056 *****************************************/
1059 gtk_widget_setv (GtkWidget *widget,
1063 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1066 /*****************************************
1067 * gtk_widget_unparent:
1068 * do any cleanup necessary necessary
1069 * before setting parent = NULL.
1070 * In particular, remove the focus
1076 *****************************************/
1079 gtk_widget_unparent (GtkWidget *widget)
1081 GtkWidget *toplevel;
1084 g_return_if_fail (widget != NULL);
1085 if (widget->parent == NULL)
1088 toplevel = gtk_widget_get_toplevel (widget);
1089 if (GTK_IS_WINDOW (toplevel))
1091 child = GTK_WINDOW (toplevel)->focus_widget;
1093 while (child && child != widget)
1094 child = child->parent;
1096 if (child == widget)
1097 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1100 if (widget->window &&
1101 GTK_WIDGET_NO_WINDOW (widget) &&
1102 GTK_WIDGET_DRAWABLE (widget))
1103 gdk_window_clear_area (widget->window,
1104 widget->allocation.x,
1105 widget->allocation.y,
1106 widget->allocation.width,
1107 widget->allocation.height);
1109 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1110 gtk_widget_unrealize (widget);
1112 widget->parent = NULL;
1114 gtk_widget_unref (widget);
1117 /*****************************************
1118 * gtk_widget_destroy:
1123 *****************************************/
1126 gtk_widget_destroy (GtkWidget *widget)
1128 g_return_if_fail (widget != NULL);
1129 g_return_if_fail (GTK_IS_WIDGET (widget));
1131 gtk_object_destroy (GTK_OBJECT (widget));
1135 gtk_widget_destroyed (GtkWidget *widget,
1136 GtkWidget **widget_pointer)
1139 *widget_pointer = NULL;
1142 /*****************************************
1148 *****************************************/
1151 gtk_widget_show (GtkWidget *widget)
1153 g_return_if_fail (widget != NULL);
1155 if (!GTK_WIDGET_VISIBLE (widget))
1156 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1159 /*****************************************
1165 *****************************************/
1168 gtk_widget_hide (GtkWidget *widget)
1170 g_return_if_fail (widget != NULL);
1172 if (GTK_WIDGET_VISIBLE (widget))
1173 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1176 /*****************************************
1177 * gtk_widget_show_all:
1179 * Shows the widget and all children.
1181 * Container classes overwrite
1182 * show_all and hide_all to call
1183 * show_all (hide_all) on both themselves
1184 * and on their child widgets.
1189 *****************************************/
1192 gtk_widget_show_all (GtkWidget *widget)
1194 GtkWidgetClass *widget_class;
1196 g_return_if_fail (widget != NULL);
1198 /* show_all shouldn't be invoked through a signal,
1199 because in this case it would be quite slow - there would
1200 be a show and show_all signal emitted for every child widget.
1202 widget_class = GTK_WIDGET_CLASS(GTK_OBJECT(widget)->klass);
1203 widget_class->show_all (widget);
1206 /*****************************************
1207 * gtk_widget_hide_all:
1209 * Hides the widget and all children.
1210 * See gtk_widget_show_all.
1215 *****************************************/
1218 gtk_widget_hide_all (GtkWidget *widget)
1220 GtkWidgetClass *widget_class;
1222 g_return_if_fail (widget != NULL);
1223 g_assert (widget->parent);
1225 if (GTK_WIDGET_RESIZE_NEEDED (widget))
1227 GtkWidget *toplevel;
1229 toplevel = gtk_widget_get_toplevel (widget);
1230 if (toplevel != widget)
1231 GTK_CONTAINER (toplevel)->resize_widgets =
1232 g_slist_remove (GTK_CONTAINER (toplevel)->resize_widgets, widget);
1233 GTK_PRIVATE_UNSET_FLAGS (widget, GTK_RESIZE_NEEDED);
1236 widget_class = GTK_WIDGET_CLASS(GTK_OBJECT(widget)->klass);
1237 widget_class->hide_all (widget);
1240 /*****************************************
1246 *****************************************/
1249 gtk_widget_map (GtkWidget *widget)
1251 g_return_if_fail (widget != NULL);
1253 if (!GTK_WIDGET_MAPPED (widget))
1255 if (!GTK_WIDGET_REALIZED (widget))
1256 gtk_widget_realize (widget);
1258 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1262 /*****************************************
1268 *****************************************/
1271 gtk_widget_unmap (GtkWidget *widget)
1273 g_return_if_fail (widget != NULL);
1275 if (GTK_WIDGET_MAPPED (widget))
1276 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1279 /*****************************************
1280 * gtk_widget_realize:
1285 *****************************************/
1288 gtk_widget_realize (GtkWidget *widget)
1290 GtkStyle *new_style;
1292 GdkExtensionMode mode;
1293 GtkWidgetShapeInfo *shape_info;
1295 g_return_if_fail (widget != NULL);
1297 if (!GTK_WIDGET_REALIZED (widget))
1300 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1301 g_print ("%s\n", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1304 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1305 gtk_widget_realize (widget->parent);
1307 if (!GTK_WIDGET_USER_STYLE (widget))
1309 new_style = gtk_rc_get_style (widget);
1310 if (new_style != widget->style)
1311 gtk_widget_set_style_internal (widget, new_style);
1314 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1316 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1318 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1320 gdk_window_shape_combine_mask (widget->window,
1321 shape_info->shape_mask,
1322 shape_info->offset_x,
1323 shape_info->offset_y);
1326 if (!GTK_WIDGET_NO_WINDOW (widget))
1328 mode = gtk_widget_get_extension_events (widget);
1329 if (mode != GDK_EXTENSION_EVENTS_NONE)
1331 events = gtk_widget_get_events (widget);
1332 gdk_input_set_extension_events (widget->window, events, mode);
1339 /*****************************************
1340 * gtk_widget_unrealize:
1345 *****************************************/
1348 gtk_widget_unrealize (GtkWidget *widget)
1350 g_return_if_fail (widget != NULL);
1352 if (GTK_WIDGET_REALIZED (widget))
1353 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1356 /*****************************************
1357 * gtk_widget_queue_draw:
1362 *****************************************/
1365 gtk_widget_idle_draw (void *data)
1369 node = gtk_widget_redraw_queue;
1370 gtk_widget_redraw_queue = NULL;
1373 gtk_widget_real_queue_draw ((GtkWidget*) node->data);
1377 return gtk_widget_redraw_queue != NULL;
1381 gtk_widget_queue_draw (GtkWidget *widget)
1385 g_return_if_fail (widget != NULL);
1387 if (GTK_WIDGET_DRAWABLE (widget))
1389 /* We queue the redraw if:
1390 * a) the widget is not already queued for redraw and
1391 * b) non of the widgets ancestors are queued for redraw.
1396 if (GTK_WIDGET_REDRAW_PENDING (parent))
1398 parent = parent->parent;
1401 GTK_PRIVATE_SET_FLAGS (widget, GTK_REDRAW_PENDING);
1402 if (gtk_widget_redraw_queue == NULL)
1403 gtk_idle_add ((GtkFunction) gtk_widget_idle_draw, NULL);
1405 gtk_widget_redraw_queue = g_slist_prepend (gtk_widget_redraw_queue, widget);
1409 /*****************************************
1410 * gtk_widget_queue_resize:
1415 *****************************************/
1418 gtk_widget_idle_sizer (void *data)
1422 node = gtk_widget_resize_queue;
1423 gtk_widget_resize_queue = NULL;
1426 gtk_widget_real_queue_resize ((GtkWidget *)node->data);
1430 return gtk_widget_resize_queue != NULL;
1434 gtk_widget_queue_resize (GtkWidget *widget)
1436 GtkWidget *toplevel;
1438 g_return_if_fail (widget != NULL);
1440 toplevel = gtk_widget_get_toplevel (widget);
1441 if (GTK_WIDGET_TOPLEVEL (toplevel))
1443 if (GTK_WIDGET_VISIBLE (toplevel))
1445 if (!GTK_CONTAINER_RESIZE_PENDING (toplevel))
1447 GTK_PRIVATE_SET_FLAGS (toplevel, GTK_RESIZE_PENDING);
1448 if (gtk_widget_resize_queue == NULL)
1449 gtk_idle_add ((GtkFunction) gtk_widget_idle_sizer, NULL);
1450 gtk_widget_resize_queue = g_slist_prepend (gtk_widget_resize_queue, toplevel);
1453 if (!GTK_WIDGET_RESIZE_NEEDED (widget))
1455 GTK_PRIVATE_SET_FLAGS (widget, GTK_RESIZE_NEEDED);
1456 GTK_CONTAINER (toplevel)->resize_widgets =
1457 g_slist_prepend (GTK_CONTAINER (toplevel)->resize_widgets, widget);
1460 g_assert (g_slist_find (GTK_CONTAINER (toplevel)->resize_widgets, widget)); /* paranoid */
1463 gtk_container_need_resize (GTK_CONTAINER (toplevel));
1467 /*****************************************
1473 *****************************************/
1476 gtk_widget_draw (GtkWidget *widget,
1479 GdkRectangle temp_area;
1481 g_return_if_fail (widget != NULL);
1483 if (GTK_WIDGET_DRAWABLE (widget) &&
1484 !GTK_WIDGET_REDRAW_PENDING (widget))
1488 if (GTK_WIDGET_NO_WINDOW (widget))
1490 temp_area.x = widget->allocation.x;
1491 temp_area.y = widget->allocation.y;
1499 temp_area.width = widget->allocation.width;
1500 temp_area.height = widget->allocation.height;
1504 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
1508 /*****************************************
1509 * gtk_widget_draw_focus:
1514 *****************************************/
1517 gtk_widget_draw_focus (GtkWidget *widget)
1519 g_return_if_fail (widget != NULL);
1521 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
1524 /*****************************************
1525 * gtk_widget_draw_default:
1530 *****************************************/
1533 gtk_widget_draw_default (GtkWidget *widget)
1535 g_return_if_fail (widget != NULL);
1537 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
1540 /*****************************************
1541 * gtk_widget_draw_children:
1546 *****************************************/
1549 gtk_widget_draw_children (GtkWidget *widget)
1551 g_return_if_fail (widget != NULL);
1553 if (GTK_IS_CONTAINER (widget))
1554 gtk_container_foreach (GTK_CONTAINER (widget),
1555 gtk_widget_draw_children_recurse,
1559 /*****************************************
1560 * gtk_widget_size_request:
1565 *****************************************/
1568 gtk_widget_size_request (GtkWidget *widget,
1569 GtkRequisition *requisition)
1571 GtkWidgetAuxInfo *aux_info;
1573 g_return_if_fail (widget != NULL);
1575 gtk_widget_ref (widget);
1576 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
1578 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
1581 if (aux_info->width > 0)
1582 requisition->width = aux_info->width;
1583 if (aux_info->height > 0)
1584 requisition->height = aux_info->height;
1586 gtk_widget_unref (widget);
1589 /*****************************************
1590 * gtk_widget_size_allocate:
1595 *****************************************/
1598 gtk_widget_size_allocate (GtkWidget *widget,
1599 GtkAllocation *allocation)
1601 GtkWidgetAuxInfo *aux_info;
1602 GtkAllocation real_allocation;
1604 g_return_if_fail (widget != NULL);
1606 real_allocation = *allocation;
1607 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
1611 if (aux_info->x != -1)
1612 real_allocation.x = aux_info->x;
1613 if (aux_info->y != -1)
1614 real_allocation.y = aux_info->y;
1617 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
1620 /*****************************************
1621 * gtk_widget_install_accelerator:
1626 *****************************************/
1629 gtk_widget_install_accelerator (GtkWidget *widget,
1630 GtkAcceleratorTable *table,
1631 const gchar *signal_name,
1637 g_return_if_fail (widget != NULL);
1639 gtk_widget_ref (widget);
1641 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[INSTALL_ACCELERATOR],
1642 signal_name, key, modifiers, &return_val);
1644 gtk_accelerator_table_install (table,
1645 GTK_OBJECT (widget),
1649 gtk_widget_unref (widget);
1652 /*****************************************
1653 * gtk_widget_remove_accelerator:
1658 *****************************************/
1661 gtk_widget_remove_accelerator (GtkWidget *widget,
1662 GtkAcceleratorTable *table,
1663 const gchar *signal_name)
1665 g_return_if_fail (widget != NULL);
1667 gtk_widget_ref (widget);
1668 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR],
1670 gtk_accelerator_table_remove (table, GTK_OBJECT (widget), signal_name);
1671 gtk_widget_unref (widget);
1674 /*****************************************
1680 *****************************************/
1683 gtk_widget_event (GtkWidget *widget,
1689 g_return_val_if_fail (widget != NULL, FALSE);
1691 gtk_widget_ref (widget);
1693 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
1697 gtk_widget_unref (widget);
1701 switch (event->type)
1706 case GDK_BUTTON_PRESS:
1707 case GDK_2BUTTON_PRESS:
1708 case GDK_3BUTTON_PRESS:
1709 signal_num = BUTTON_PRESS_EVENT;
1711 case GDK_BUTTON_RELEASE:
1712 signal_num = BUTTON_RELEASE_EVENT;
1714 case GDK_MOTION_NOTIFY:
1715 signal_num = MOTION_NOTIFY_EVENT;
1718 signal_num = DELETE_EVENT;
1721 signal_num = DESTROY_EVENT;
1724 signal_num = EXPOSE_EVENT;
1727 signal_num = KEY_PRESS_EVENT;
1729 case GDK_KEY_RELEASE:
1730 signal_num = KEY_RELEASE_EVENT;
1732 case GDK_ENTER_NOTIFY:
1733 signal_num = ENTER_NOTIFY_EVENT;
1735 case GDK_LEAVE_NOTIFY:
1736 signal_num = LEAVE_NOTIFY_EVENT;
1738 case GDK_FOCUS_CHANGE:
1739 if (event->focus_change.in)
1740 signal_num = FOCUS_IN_EVENT;
1742 signal_num = FOCUS_OUT_EVENT;
1745 signal_num = CONFIGURE_EVENT;
1748 signal_num = MAP_EVENT;
1751 signal_num = UNMAP_EVENT;
1753 case GDK_PROPERTY_NOTIFY:
1754 signal_num = PROPERTY_NOTIFY_EVENT;
1756 case GDK_SELECTION_CLEAR:
1757 signal_num = SELECTION_CLEAR_EVENT;
1759 case GDK_SELECTION_REQUEST:
1760 signal_num = SELECTION_REQUEST_EVENT;
1762 case GDK_SELECTION_NOTIFY:
1763 signal_num = SELECTION_NOTIFY_EVENT;
1765 case GDK_PROXIMITY_IN:
1766 signal_num = PROXIMITY_IN_EVENT;
1768 case GDK_PROXIMITY_OUT:
1769 signal_num = PROXIMITY_OUT_EVENT;
1771 case GDK_DRAG_BEGIN:
1772 signal_num = DRAG_BEGIN_EVENT;
1774 case GDK_DRAG_REQUEST:
1775 signal_num = DRAG_REQUEST_EVENT;
1777 case GDK_DROP_ENTER:
1778 signal_num = DROP_ENTER_EVENT;
1780 case GDK_DROP_LEAVE:
1781 signal_num = DROP_LEAVE_EVENT;
1783 case GDK_DROP_DATA_AVAIL:
1784 signal_num = DROP_DATA_AVAILABLE_EVENT;
1786 case GDK_OTHER_EVENT:
1787 signal_num = OTHER_EVENT;
1790 signal_num = NO_EXPOSE_EVENT;
1792 case GDK_CLIENT_EVENT:
1793 signal_num = CLIENT_EVENT;
1796 g_warning ("could not determine signal number for event: %d", event->type);
1797 gtk_widget_unref (widget);
1801 if (signal_num != -1)
1802 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
1804 gtk_widget_unref (widget);
1808 /*****************************************
1809 * gtk_widget_activate:
1814 *****************************************/
1817 gtk_widget_activate (GtkWidget *widget)
1819 g_return_if_fail (widget != NULL);
1820 g_return_if_fail (GTK_IS_WIDGET (widget));
1822 if (WIDGET_CLASS (widget)->activate_signal)
1823 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
1826 /*****************************************
1827 * gtk_widget_reparent_container_child:
1828 * assistent function to gtk_widget_reparent
1833 *****************************************/
1836 gtk_widget_reparent_container_child(GtkWidget *widget,
1837 gpointer client_data)
1839 g_return_if_fail (widget != NULL);
1840 g_return_if_fail (client_data != NULL);
1842 if (GTK_WIDGET_NO_WINDOW (widget))
1845 gdk_window_unref (widget->window);
1846 widget->window = (GdkWindow*) client_data;
1848 gdk_window_ref (widget->window);
1850 if (GTK_IS_CONTAINER (widget))
1851 gtk_container_foreach (GTK_CONTAINER (widget),
1852 gtk_widget_reparent_container_child,
1856 gdk_window_reparent (widget->window,
1857 (GdkWindow*) client_data, 0, 0);
1860 /*****************************************
1861 * gtk_widget_reparent:
1866 *****************************************/
1869 gtk_widget_reparent (GtkWidget *widget,
1870 GtkWidget *new_parent)
1872 g_return_if_fail (widget != NULL);
1873 g_return_if_fail (new_parent != NULL);
1874 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
1876 if (widget->parent != new_parent)
1878 /* First try to see if we can get away without unrealizing
1879 * the widget as we reparent it
1882 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
1884 /* Set a flag so that gtk_widget_unparent doesn't unrealize widget
1886 GTK_PRIVATE_SET_FLAGS (widget, GTK_IN_REPARENT);
1889 gtk_widget_ref (widget);
1890 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
1891 gtk_container_add (GTK_CONTAINER (new_parent), widget);
1892 gtk_widget_unref (widget);
1894 if (GTK_WIDGET_IN_REPARENT (widget))
1896 /* OK, now fix up the widget's window. (And that for any
1897 * children, if the widget is NO_WINDOW and a container)
1899 if (GTK_WIDGET_NO_WINDOW (widget))
1901 if (GTK_IS_CONTAINER (widget))
1902 gtk_container_foreach (GTK_CONTAINER(widget),
1903 gtk_widget_reparent_container_child,
1904 gtk_widget_get_parent_window (widget));
1907 GdkWindow *parent_window;
1909 parent_window = gtk_widget_get_parent_window (widget);
1910 if (parent_window != widget->window)
1913 gdk_window_unref (widget->window);
1914 widget->window = parent_window;
1916 gdk_window_ref (widget->window);
1921 gdk_window_reparent (widget->window, gtk_widget_get_parent_window (widget), 0, 0);
1923 GTK_PRIVATE_UNSET_FLAGS (widget, GTK_IN_REPARENT);
1928 /*****************************************
1934 *****************************************/
1937 gtk_widget_popup (GtkWidget *widget,
1941 g_return_if_fail (widget != NULL);
1943 if (!GTK_WIDGET_VISIBLE (widget))
1945 if (!GTK_WIDGET_REALIZED (widget))
1946 gtk_widget_realize (widget);
1947 if (!GTK_WIDGET_NO_WINDOW (widget))
1948 gdk_window_move (widget->window, x, y);
1949 gtk_widget_show (widget);
1953 /*****************************************
1954 * gtk_widget_intersect:
1959 *****************************************/
1962 gtk_widget_intersect (GtkWidget *widget,
1964 GdkRectangle *intersection)
1970 g_return_val_if_fail (widget != NULL, FALSE);
1971 g_return_val_if_fail (area != NULL, FALSE);
1974 dest = intersection;
1978 return_val = gdk_rectangle_intersect ((GdkRectangle*) &widget->allocation, area, dest);
1980 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
1982 intersection->x -= widget->allocation.x;
1983 intersection->y -= widget->allocation.y;
1991 gtk_widget_basic (GtkWidget *widget)
1997 g_return_val_if_fail (widget != NULL, FALSE);
1999 if (!GTK_WIDGET_BASIC (widget))
2001 else if (GTK_IS_CONTAINER (widget))
2003 children = gtk_container_children (GTK_CONTAINER (widget));
2007 tmp_list = children;
2011 if (!gtk_widget_basic (GTK_WIDGET (tmp_list->data)))
2017 tmp_list = tmp_list->next;
2020 g_list_free (children);
2029 /*****************************************
2030 * gtk_widget_grab_focus:
2035 *****************************************/
2038 gtk_widget_grab_focus (GtkWidget *widget)
2044 g_return_if_fail (widget != NULL);
2046 window_type = gtk_window_get_type ();
2047 window = widget->parent;
2050 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2052 GTK_CONTAINER (window)->focus_child = child;
2054 window = window->parent;
2057 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2059 GTK_CONTAINER (window)->focus_child = child;
2060 gtk_window_set_focus (GTK_WINDOW (window), widget);
2064 /*****************************************
2065 * gtk_widget_grab_default:
2070 *****************************************/
2073 gtk_widget_grab_default (GtkWidget *widget)
2078 g_return_if_fail (widget != NULL);
2079 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
2081 window_type = gtk_window_get_type ();
2082 window = widget->parent;
2084 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2085 window = window->parent;
2087 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2088 gtk_window_set_default (GTK_WINDOW (window), widget);
2091 /*****************************************
2092 * gtk_widget_set_name:
2097 *****************************************/
2100 gtk_widget_set_name (GtkWidget *widget,
2103 GtkStyle *new_style;
2105 g_return_if_fail (widget != NULL);
2108 g_free (widget->name);
2109 widget->name = g_strdup (name);
2111 if (!GTK_WIDGET_USER_STYLE (widget))
2113 new_style = gtk_rc_get_style (widget);
2114 gtk_widget_set_style_internal (widget, new_style);
2118 /*****************************************
2119 * gtk_widget_get_name:
2124 *****************************************/
2127 gtk_widget_get_name (GtkWidget *widget)
2129 g_return_val_if_fail (widget != NULL, NULL);
2132 return widget->name;
2133 return gtk_type_name (GTK_WIDGET_TYPE (widget));
2136 /*****************************************
2137 * gtk_widget_set_state:
2144 *****************************************/
2147 gtk_widget_set_state (GtkWidget *widget,
2150 g_return_if_fail (widget != NULL);
2152 if (state == GTK_WIDGET_STATE (widget))
2155 if (state == GTK_STATE_INSENSITIVE)
2156 gtk_widget_set_sensitive (widget, FALSE);
2160 GtkStateType old_state;
2164 data.parent_sensitive = GTK_WIDGET_IS_SENSITIVE (widget->parent);
2166 data.parent_sensitive = GTK_PARENT_SENSITIVE;
2168 old_state = GTK_WIDGET_STATE (widget);
2170 gtk_widget_propagate_state (widget, &data);
2171 if (old_state != GTK_WIDGET_STATE (widget))
2172 gtk_widget_queue_draw (widget);
2176 /*****************************************
2177 * gtk_widget_set_sensitive:
2181 * boolean value for sensitivity
2184 *****************************************/
2187 gtk_widget_set_sensitive (GtkWidget *widget,
2191 GtkStateType old_state;
2193 g_return_if_fail (widget != NULL);
2197 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
2198 if (GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE)
2199 data.state = GTK_WIDGET_SAVED_STATE (widget);
2201 data.state = GTK_WIDGET_STATE (widget);
2205 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
2206 data.state = GTK_WIDGET_STATE (widget);
2210 data.parent_sensitive = GTK_WIDGET_IS_SENSITIVE (widget->parent);
2212 data.parent_sensitive = GTK_PARENT_SENSITIVE;
2214 old_state = GTK_WIDGET_STATE (widget);
2215 gtk_widget_propagate_state (widget, &data);
2216 if (old_state != GTK_WIDGET_STATE (widget))
2217 gtk_widget_queue_draw (widget);
2220 /*****************************************
2221 * gtk_widget_set_parent:
2226 *****************************************/
2229 gtk_widget_set_parent (GtkWidget *widget,
2235 g_return_if_fail (widget != NULL);
2236 g_assert (widget->parent == NULL);
2237 g_return_if_fail (parent != NULL);
2239 gtk_widget_ref (widget);
2240 gtk_object_sink (GTK_OBJECT(widget));
2241 widget->parent = parent;
2243 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
2244 data.state = GTK_WIDGET_STATE (parent);
2246 data.state = GTK_WIDGET_STATE (widget);
2247 data.parent_sensitive = GTK_WIDGET_IS_SENSITIVE (parent);
2249 gtk_widget_propagate_state (widget, &data);
2251 while (parent->parent != NULL)
2252 parent = parent->parent;
2254 if (GTK_WIDGET_TOPLEVEL (parent))
2256 if (!GTK_WIDGET_USER_STYLE (widget))
2258 style = gtk_rc_get_style (widget);
2259 if (style != widget->style)
2260 gtk_widget_set_style_internal (widget, style);
2263 if (GTK_IS_CONTAINER (widget))
2264 gtk_container_foreach (GTK_CONTAINER (widget),
2265 gtk_widget_set_style_recurse,
2270 /*************************************************************
2271 * gtk_widget_set_parent_window:
2272 * Set a non default parent window for widget
2279 *************************************************************/
2282 gtk_widget_set_parent_window (GtkWidget *widget,
2283 GdkWindow *parent_window)
2285 GdkWindow *old_parent_window;
2287 g_return_if_fail (widget != NULL);
2289 old_parent_window = gtk_object_get_data (GTK_OBJECT (widget),
2292 if (parent_window != old_parent_window)
2294 gtk_object_set_data (GTK_OBJECT (widget), parent_window_key,
2296 if (old_parent_window)
2297 gdk_window_unref (old_parent_window);
2299 gdk_window_ref (parent_window);
2303 /*************************************************************
2304 * gtk_widget_get_parent_window:
2305 * Get widget's parent window
2312 *************************************************************/
2315 gtk_widget_get_parent_window (GtkWidget *widget)
2317 GdkWindow *parent_window;
2319 g_return_val_if_fail (widget != NULL, NULL);
2321 parent_window = gtk_object_get_data (GTK_OBJECT (widget),
2324 return (parent_window != NULL) ? parent_window : widget->parent->window;
2328 /*****************************************
2329 * gtk_widget_set_style:
2334 *****************************************/
2337 gtk_widget_set_style (GtkWidget *widget,
2340 g_return_if_fail (widget != NULL);
2342 GTK_PRIVATE_SET_FLAGS (widget, GTK_USER_STYLE);
2343 gtk_widget_set_style_internal (widget, style);
2346 /*****************************************
2347 * gtk_widget_set_uposition:
2352 *****************************************/
2355 gtk_widget_set_uposition (GtkWidget *widget,
2359 GtkWidgetAuxInfo *aux_info;
2361 g_return_if_fail (widget != NULL);
2363 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
2366 aux_info = gtk_widget_aux_info_new ();
2367 gtk_object_set_data (GTK_OBJECT (widget), aux_info_key, aux_info);
2375 if (GTK_WIDGET_REALIZED (widget) && GTK_IS_WINDOW (widget) &&
2376 (aux_info->x != -1) && (aux_info->y != -1))
2378 gdk_window_set_hints (widget->window, aux_info->x, aux_info->y, 0, 0, 0, 0, GDK_HINT_POS);
2379 gdk_window_move (widget->window, aux_info->x, aux_info->y);
2382 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
2383 gtk_widget_size_allocate (widget, &widget->allocation);
2386 /*****************************************
2387 * gtk_widget_set_usize:
2392 *****************************************/
2395 gtk_widget_set_usize (GtkWidget *widget,
2399 GtkWidgetAuxInfo *aux_info;
2401 g_return_if_fail (widget != NULL);
2403 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
2406 aux_info = gtk_widget_aux_info_new ();
2407 gtk_object_set_data (GTK_OBJECT (widget), aux_info_key, aux_info);
2411 aux_info->width = width;
2413 aux_info->height = height;
2415 if (GTK_WIDGET_VISIBLE (widget))
2416 gtk_widget_queue_resize (widget);
2419 /*****************************************
2420 * gtk_widget_set_events:
2425 *****************************************/
2428 gtk_widget_set_events (GtkWidget *widget,
2433 g_return_if_fail (widget != NULL);
2434 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
2435 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
2437 eventp = gtk_object_get_data (GTK_OBJECT (widget), event_key);
2442 eventp = g_new (gint, 1);
2445 gtk_object_set_data (GTK_OBJECT (widget), event_key, eventp);
2452 gtk_object_remove_data (GTK_OBJECT (widget), event_key);
2456 /*****************************************
2457 * gtk_widget_set_extension_events:
2462 *****************************************/
2465 gtk_widget_set_extension_events (GtkWidget *widget,
2466 GdkExtensionMode mode)
2468 GdkExtensionMode *modep;
2470 g_return_if_fail (widget != NULL);
2472 modep = gtk_object_get_data (GTK_OBJECT (widget), extension_event_key);
2475 modep = g_new (GdkExtensionMode, 1);
2478 gtk_object_set_data (GTK_OBJECT (widget), extension_event_key, modep);
2482 /*****************************************
2483 * gtk_widget_get_toplevel:
2488 *****************************************/
2491 gtk_widget_get_toplevel (GtkWidget *widget)
2493 g_return_val_if_fail (widget != NULL, NULL);
2495 while (widget->parent)
2496 widget = widget->parent;
2501 /*****************************************
2502 * gtk_widget_get_ancestor:
2507 *****************************************/
2510 gtk_widget_get_ancestor (GtkWidget *widget,
2513 g_return_val_if_fail (widget != NULL, NULL);
2515 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), type))
2516 widget = widget->parent;
2518 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), type)))
2524 /*****************************************
2525 * gtk_widget_get_colormap:
2530 *****************************************/
2533 gtk_widget_get_colormap (GtkWidget *widget)
2535 GdkColormap *colormap;
2537 g_return_val_if_fail (widget != NULL, NULL);
2539 if (!widget->window)
2541 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
2544 return gtk_widget_get_default_colormap ();
2547 return gdk_window_get_colormap (widget->window);
2550 /*****************************************
2551 * gtk_widget_get_visual:
2556 *****************************************/
2559 gtk_widget_get_visual (GtkWidget *widget)
2563 g_return_val_if_fail (widget != NULL, NULL);
2565 if (!widget->window)
2567 visual = gtk_object_get_data (GTK_OBJECT (widget), visual_key);
2570 return gtk_widget_get_default_visual ();
2573 return gdk_window_get_visual (widget->window);
2576 /*****************************************
2577 * gtk_widget_get_style:
2582 *****************************************/
2585 gtk_widget_get_style (GtkWidget *widget)
2587 g_return_val_if_fail (widget != NULL, NULL);
2589 return widget->style;
2592 /*****************************************
2593 * gtk_widget_get_events:
2598 *****************************************/
2601 gtk_widget_get_events (GtkWidget *widget)
2605 g_return_val_if_fail (widget != NULL, 0);
2607 events = gtk_object_get_data (GTK_OBJECT (widget), event_key);
2614 /*****************************************
2615 * gtk_widget_get_extension_events:
2620 *****************************************/
2623 gtk_widget_get_extension_events (GtkWidget *widget)
2625 GdkExtensionMode *mode;
2627 g_return_val_if_fail (widget != NULL, 0);
2629 mode = gtk_object_get_data (GTK_OBJECT (widget), extension_event_key);
2636 /*****************************************
2637 * gtk_widget_get_pointer:
2642 *****************************************/
2645 gtk_widget_get_pointer (GtkWidget *widget,
2649 g_return_if_fail (widget != NULL);
2656 if (GTK_WIDGET_REALIZED (widget))
2658 gdk_window_get_pointer (widget->window, x, y, NULL);
2660 if (GTK_WIDGET_NO_WINDOW (widget))
2663 *x -= widget->allocation.x;
2665 *y -= widget->allocation.y;
2670 /*****************************************
2671 * gtk_widget_is_ancestor:
2676 *****************************************/
2679 gtk_widget_is_ancestor (GtkWidget *widget,
2680 GtkWidget *ancestor)
2682 g_return_val_if_fail (widget != NULL, FALSE);
2683 g_return_val_if_fail (ancestor != NULL, FALSE);
2687 if (widget->parent == ancestor)
2689 widget = widget->parent;
2695 /*****************************************
2696 * gtk_widget_is_child:
2701 *****************************************/
2704 gtk_widget_is_child (GtkWidget *widget,
2707 g_return_val_if_fail (widget != NULL, FALSE);
2708 g_return_val_if_fail (child != NULL, FALSE);
2710 return (child->parent == widget);
2713 /*****************************************
2714 * gtk_widget_push_colormap:
2719 *****************************************/
2722 gtk_widget_push_colormap (GdkColormap *cmap)
2724 colormap_stack = g_slist_prepend (colormap_stack, cmap);
2727 /*****************************************
2728 * gtk_widget_push_visual:
2733 *****************************************/
2736 gtk_widget_push_visual (GdkVisual *visual)
2738 visual_stack = g_slist_prepend (visual_stack, visual);
2741 /*****************************************
2742 * gtk_widget_push_style:
2747 *****************************************/
2750 gtk_widget_push_style (GtkStyle *style)
2752 gtk_style_ref (style);
2753 style_stack = g_slist_prepend (style_stack, style);
2756 /*****************************************
2757 * gtk_widget_pop_colormap:
2762 *****************************************/
2765 gtk_widget_pop_colormap ()
2771 tmp = colormap_stack;
2772 colormap_stack = colormap_stack->next;
2773 g_slist_free_1 (tmp);
2777 /*****************************************
2778 * gtk_widget_pop_visual:
2783 *****************************************/
2786 gtk_widget_pop_visual ()
2793 visual_stack = visual_stack->next;
2794 g_slist_free_1 (tmp);
2798 /*****************************************
2799 * gtk_widget_pop_style:
2804 *****************************************/
2807 gtk_widget_pop_style ()
2814 style_stack = style_stack->next;
2815 gtk_style_unref ((GtkStyle*) tmp->data);
2816 g_slist_free_1 (tmp);
2820 /*****************************************
2821 * gtk_widget_set_default_colormap:
2826 *****************************************/
2829 gtk_widget_set_default_colormap (GdkColormap *colormap)
2831 if (default_colormap != colormap)
2833 if (default_colormap)
2834 gdk_colormap_unref (default_colormap);
2835 default_colormap = colormap;
2836 if (default_colormap)
2837 gdk_colormap_ref (default_colormap);
2841 /*****************************************
2842 * gtk_widget_set_default_visual:
2847 *****************************************/
2850 gtk_widget_set_default_visual (GdkVisual *visual)
2852 default_visual = visual;
2855 /*****************************************
2856 * gtk_widget_set_default_style:
2861 *****************************************/
2864 gtk_widget_set_default_style (GtkStyle *style)
2866 if (style != default_style)
2869 gtk_style_unref (default_style);
2870 default_style = style;
2872 gtk_style_ref (default_style);
2876 /* Basically, send a message to all toplevel windows telling them
2877 * that a new _GTK_STYLE_COLORS property is available on the root
2881 gtk_widget_propagate_default_style (void)
2886 /* Set the property on the root window */
2887 gdk_property_change(GDK_ROOT_PARENT(),
2888 gdk_atom_intern("_GTK_DEFAULT_COLORS", FALSE),
2889 gdk_atom_intern("STRING", FALSE),
2891 GDK_PROP_MODE_REPLACE,
2892 (guchar *)gtk_widget_get_default_style(),
2893 GTK_STYLE_NUM_STYLECOLORS() * sizeof(GdkColor));
2895 for(i = 0; i < 5; i++)
2897 sev.data_format = 32;
2898 sev.message_type = gdk_atom_intern ("_GTK_STYLE_CHANGED", FALSE);
2899 gdk_event_send_clientmessage_toall ((GdkEvent *) &sev);
2902 /*****************************************
2903 * gtk_widget_get_default_colormap:
2908 *****************************************/
2911 gtk_widget_get_default_colormap ()
2913 if (!default_colormap)
2914 default_colormap = gdk_colormap_get_system ();
2916 return default_colormap;
2919 /*****************************************
2920 * gtk_widget_get_default_visual:
2925 *****************************************/
2928 gtk_widget_get_default_visual ()
2930 if (!default_visual)
2931 default_visual = gdk_visual_get_system ();
2933 return default_visual;
2936 /*****************************************
2937 * gtk_widget_get_default_style:
2942 *****************************************/
2945 gtk_widget_get_default_style ()
2949 default_style = gtk_style_new ();
2950 gtk_style_ref (default_style);
2953 return default_style;
2957 /*****************************************
2958 * gtk_widget_marshal_signal_1:
2963 *****************************************/
2966 gtk_widget_marshal_signal_1 (GtkObject *object,
2971 GtkWidgetSignal1 rfunc;
2973 rfunc = (GtkWidgetSignal1) func;
2975 (* rfunc) (object, GTK_VALUE_POINTER (args[0]), func_data);
2978 /*****************************************
2979 * gtk_widget_marshal_signal_2:
2984 *****************************************/
2987 gtk_widget_marshal_signal_2 (GtkObject *object,
2992 GtkWidgetSignal2 rfunc;
2995 rfunc = (GtkWidgetSignal2) func;
2996 return_val = GTK_RETLOC_BOOL (args[3]);
2998 *return_val = (* rfunc) (object, GTK_VALUE_STRING (args[0]),
2999 GTK_VALUE_CHAR (args[1]), GTK_VALUE_INT (args[2]),
3003 /*****************************************
3004 * gtk_widget_marshal_signal_3:
3009 *****************************************/
3012 gtk_widget_marshal_signal_3 (GtkObject *object,
3017 GtkWidgetSignal3 rfunc;
3019 rfunc = (GtkWidgetSignal3) func;
3021 (* rfunc) (object, GTK_VALUE_STRING (args[0]), func_data);
3024 /*****************************************
3025 * gtk_widget_marshal_signal_4:
3030 *****************************************/
3033 gtk_widget_marshal_signal_4 (GtkObject *object,
3038 GtkWidgetSignal4 rfunc;
3041 rfunc = (GtkWidgetSignal4) func;
3042 return_val = GTK_RETLOC_BOOL (args[1]);
3044 *return_val = (* rfunc) (object, GTK_VALUE_BOXED (args[0]), func_data);
3047 /*****************************************
3048 * gtk_widget_marshal_signal_5:
3053 *****************************************/
3056 gtk_widget_marshal_signal_5 (GtkObject *object,
3061 GtkWidgetSignal5 rfunc;
3064 rfunc = (GtkWidgetSignal5) func;
3065 return_val = GTK_RETLOC_BOOL (args[1]);
3067 (* rfunc) (object, GTK_VALUE_UINT (args[0]), func_data);
3071 gtk_widget_real_destroy (GtkObject *object)
3073 GtkWidget *widget = GTK_WIDGET (object);
3075 gtk_widget_ref (widget);
3077 if (GTK_WIDGET_REDRAW_PENDING (widget))
3079 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
3080 GTK_PRIVATE_UNSET_FLAGS (widget, GTK_REDRAW_PENDING);
3083 if (GTK_CONTAINER_RESIZE_PENDING (widget))
3085 gtk_widget_resize_queue = g_slist_remove (gtk_widget_resize_queue, widget);
3086 GTK_PRIVATE_UNSET_FLAGS (widget, GTK_RESIZE_PENDING);
3089 if (GTK_WIDGET_RESIZE_NEEDED (widget))
3091 GtkWidget *toplevel;
3093 toplevel = gtk_widget_get_toplevel (widget);
3094 GTK_CONTAINER (toplevel)->resize_widgets =
3095 g_slist_remove (GTK_CONTAINER (toplevel)->resize_widgets, widget);
3096 GTK_PRIVATE_UNSET_FLAGS (widget, GTK_RESIZE_NEEDED);
3099 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
3100 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
3102 gtk_grab_remove (widget);
3103 gtk_selection_remove_all (widget);
3104 gtk_widget_unrealize (widget);
3107 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
3109 if (GTK_OBJECT_CLASS (parent_class)->destroy)
3110 (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
3112 gtk_widget_unref (widget);
3116 gtk_widget_real_finalize (GtkObject *object)
3119 GtkWidgetAuxInfo *aux_info;
3121 GdkExtensionMode *mode;
3123 g_return_if_fail (object != NULL);
3124 g_return_if_fail (GTK_IS_WIDGET (object));
3126 widget = GTK_WIDGET (object);
3130 g_free (widget->name);
3131 widget->name = NULL;
3134 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
3137 gtk_widget_aux_info_destroy (aux_info);
3138 gtk_object_remove_data (GTK_OBJECT (widget), aux_info_key);
3141 events = gtk_object_get_data (GTK_OBJECT (widget), event_key);
3145 gtk_object_remove_data (GTK_OBJECT (widget), event_key);
3148 mode = gtk_object_get_data (GTK_OBJECT (widget), extension_event_key);
3152 gtk_object_remove_data (GTK_OBJECT (widget), extension_event_key);
3155 gtk_style_unref (widget->style);
3156 widget->style = NULL;
3158 parent_class->finalize (object);
3161 /*****************************************
3162 * gtk_widget_real_show:
3167 *****************************************/
3170 gtk_widget_real_show (GtkWidget *widget)
3172 g_return_if_fail (widget != NULL);
3173 g_return_if_fail (GTK_IS_WIDGET (widget));
3175 if (!GTK_WIDGET_VISIBLE (widget))
3177 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
3181 gtk_widget_queue_resize (widget);
3183 if (GTK_WIDGET_MAPPED (widget->parent))
3184 gtk_widget_map (widget);
3189 /*****************************************
3190 * gtk_widget_real_hide:
3195 *****************************************/
3198 gtk_widget_real_hide (GtkWidget *widget)
3200 g_return_if_fail (widget != NULL);
3201 g_return_if_fail (GTK_IS_WIDGET (widget));
3203 if (GTK_WIDGET_VISIBLE (widget))
3205 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3207 if (GTK_WIDGET_MAPPED (widget))
3208 gtk_widget_unmap (widget);
3211 gtk_widget_queue_resize (widget);
3215 /*****************************************
3216 * gtk_widget_real_map:
3221 *****************************************/
3224 gtk_widget_real_map (GtkWidget *widget)
3226 g_return_if_fail (widget != NULL);
3227 g_return_if_fail (GTK_IS_WIDGET (widget));
3229 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget))
3231 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
3233 if (!GTK_WIDGET_NO_WINDOW (widget))
3234 gdk_window_show (widget->window);
3236 gtk_widget_queue_draw (widget);
3240 /*****************************************
3241 * gtk_widget_real_unmap:
3246 *****************************************/
3249 gtk_widget_real_unmap (GtkWidget *widget)
3251 g_return_if_fail (widget != NULL);
3252 g_return_if_fail (GTK_IS_WIDGET (widget));
3254 if (GTK_WIDGET_MAPPED (widget))
3256 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
3258 if (GTK_WIDGET_NO_WINDOW (widget))
3259 gdk_window_clear_area (widget->window,
3260 widget->allocation.x,
3261 widget->allocation.y,
3262 widget->allocation.width,
3263 widget->allocation.height);
3265 gdk_window_hide (widget->window);
3269 /*****************************************
3270 * gtk_widget_real_realize:
3275 *****************************************/
3278 gtk_widget_real_realize (GtkWidget *widget)
3280 g_return_if_fail (widget != NULL);
3281 g_return_if_fail (GTK_IS_WIDGET (widget));
3283 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
3286 widget->window = gtk_widget_get_parent_window (widget);
3287 gdk_window_ref (widget->window);
3289 widget->style = gtk_style_attach (widget->style, widget->window);
3292 /*****************************************
3293 * gtk_widget_real_unrealize:
3298 *****************************************/
3301 gtk_widget_real_unrealize (GtkWidget *widget)
3303 g_return_if_fail (widget != NULL);
3304 g_return_if_fail (GTK_IS_WIDGET (widget));
3306 if (GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_MAPPED (widget))
3307 gtk_widget_real_unmap (widget);
3309 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
3311 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT(widget)->klass->type));
3314 if (GTK_IS_CONTAINER (widget))
3315 gtk_container_foreach (GTK_CONTAINER (widget),
3316 (GtkCallback)gtk_widget_unrealize,
3319 gtk_style_detach (widget->style);
3320 if (!GTK_WIDGET_NO_WINDOW (widget))
3322 gdk_window_set_user_data (widget->window, NULL);
3323 gdk_window_destroy (widget->window);
3327 gdk_window_unref (widget->window);
3329 widget->window = NULL;
3332 /*****************************************
3333 * gtk_widget_real_draw:
3338 *****************************************/
3341 gtk_widget_real_draw (GtkWidget *widget,
3344 GdkEventExpose event;
3346 g_return_if_fail (widget != NULL);
3347 g_return_if_fail (GTK_IS_WIDGET (widget));
3348 g_return_if_fail (area != NULL);
3350 if (GTK_WIDGET_DRAWABLE (widget))
3352 event.type = GDK_EXPOSE;
3353 event.window = widget->window;
3356 gdk_window_ref (event.window);
3357 gtk_widget_event (widget, (GdkEvent*) &event);
3358 gdk_window_unref (event.window);
3362 /*****************************************
3363 * gtk_widget_real_queue_draw:
3368 *****************************************/
3371 gtk_widget_real_queue_draw (GtkWidget *widget)
3373 g_return_val_if_fail (widget != NULL, FALSE);
3374 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
3376 GTK_PRIVATE_UNSET_FLAGS (widget, GTK_REDRAW_PENDING);
3377 gtk_widget_draw (widget, NULL);
3382 /*****************************************
3383 * gtk_widget_real_queue_resize:
3388 *****************************************/
3391 gtk_widget_real_queue_resize (GtkWidget *widget)
3393 g_return_val_if_fail (widget != NULL, FALSE);
3394 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
3396 GTK_PRIVATE_UNSET_FLAGS (widget, GTK_RESIZE_PENDING);
3397 gtk_container_need_resize (GTK_CONTAINER (widget));
3402 /*****************************************
3403 * gtk_widget_real_size_allocate:
3408 *****************************************/
3411 gtk_widget_real_size_allocate (GtkWidget *widget,
3412 GtkAllocation *allocation)
3414 g_return_if_fail (widget != NULL);
3415 g_return_if_fail (GTK_IS_WIDGET (widget));
3417 if (GTK_WIDGET_NO_WINDOW (widget) &&
3418 GTK_WIDGET_MAPPED (widget) &&
3419 ((widget->allocation.x != allocation->x) ||
3420 (widget->allocation.y != allocation->y) ||
3421 (widget->allocation.width != allocation->width) ||
3422 (widget->allocation.height != allocation->height)) &&
3423 (widget->allocation.width != 0) &&
3424 (widget->allocation.height != 0))
3425 gdk_window_clear_area (widget->window,
3426 widget->allocation.x,
3427 widget->allocation.y,
3428 widget->allocation.width,
3429 widget->allocation.height);
3431 widget->allocation = *allocation;
3433 if (GTK_WIDGET_REALIZED (widget) &&
3434 !GTK_WIDGET_NO_WINDOW (widget))
3435 gdk_window_move_resize (widget->window,
3436 allocation->x, allocation->y,
3437 allocation->width, allocation->height);
3440 /*****************************************
3441 * gtk_widget_peek_colormap:
3446 *****************************************/
3449 gtk_widget_peek_colormap ()
3452 return (GdkColormap*) colormap_stack->data;
3453 return gtk_widget_get_default_colormap ();
3456 /*****************************************
3457 * gtk_widget_peek_visual:
3462 *****************************************/
3465 gtk_widget_peek_visual ()
3468 return (GdkVisual*) visual_stack->data;
3469 return gtk_widget_get_default_visual ();
3472 /*****************************************
3473 * gtk_widget_peek_style:
3478 *****************************************/
3481 gtk_widget_peek_style ()
3484 return (GtkStyle*) style_stack->data;
3485 return gtk_widget_get_default_style ();
3488 /*************************************************************
3489 * gtk_widget_propagate_state:
3490 * Propagate a change in the widgets state down the tree
3494 * GtkStateData: state
3498 *************************************************************/
3501 gtk_widget_propagate_state (GtkWidget *widget,
3506 /* don't call this function with state=GTK_STATE_INSENSITIVE,
3507 * parent_sensitive=TRUE and a sensitive widget
3510 old_state = GTK_WIDGET_STATE (widget);
3512 if (data->parent_sensitive)
3514 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3516 if (GTK_WIDGET_IS_SENSITIVE (widget))
3517 GTK_WIDGET_STATE (widget) = data->state;
3520 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3521 if (data->state != GTK_STATE_INSENSITIVE)
3522 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3527 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3528 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3529 if (data->state != GTK_STATE_INSENSITIVE)
3530 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3533 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
3537 window = gtk_widget_get_ancestor (widget, gtk_window_get_type ());
3539 gtk_window_set_focus (GTK_WINDOW (window), NULL);
3542 if (old_state != GTK_WIDGET_STATE (widget))
3544 gtk_widget_ref (widget);
3545 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
3547 if (GTK_IS_CONTAINER (widget))
3549 data->parent_sensitive = GTK_WIDGET_IS_SENSITIVE (widget);
3550 data->state = GTK_WIDGET_STATE (widget);
3551 gtk_container_foreach (GTK_CONTAINER (widget),
3552 (GtkCallback) gtk_widget_propagate_state,
3555 gtk_widget_unref (widget);
3559 /*****************************************
3560 * gtk_widget_draw_children_recurse:
3565 *****************************************/
3568 gtk_widget_draw_children_recurse (GtkWidget *widget,
3569 gpointer client_data)
3571 gtk_widget_draw (widget, NULL);
3572 gtk_widget_draw_children (widget);
3575 /*****************************************
3576 * gtk_widget_set_style_internal:
3581 *****************************************/
3584 gtk_widget_set_style_internal (GtkWidget *widget,
3587 GtkRequisition old_requisition;
3589 g_return_if_fail (widget != NULL);
3591 if (widget->style != style)
3593 if (GTK_WIDGET_REALIZED (widget))
3594 gtk_style_detach (widget->style);
3596 gtk_style_unref (widget->style);
3597 widget->style = style;
3598 gtk_style_ref (widget->style);
3600 if (GTK_WIDGET_REALIZED (widget))
3601 widget->style = gtk_style_attach (widget->style, widget->window);
3605 old_requisition = widget->requisition;
3606 gtk_widget_size_request (widget, &widget->requisition);
3608 if ((old_requisition.width != widget->requisition.width) ||
3609 (old_requisition.height != widget->requisition.height))
3610 gtk_widget_queue_resize (widget);
3611 else if (GTK_WIDGET_DRAWABLE (widget))
3612 gtk_widget_queue_draw (widget);
3617 /*****************************************
3618 * gtk_widget_set_style_recurse:
3623 *****************************************/
3626 gtk_widget_set_style_recurse (GtkWidget *widget,
3627 gpointer client_data)
3631 style = gtk_rc_get_style (widget);
3632 if (style != widget->style)
3633 gtk_widget_set_style_internal (widget, style);
3635 if (GTK_IS_CONTAINER (widget))
3636 gtk_container_foreach (GTK_CONTAINER (widget),
3637 gtk_widget_set_style_recurse,
3641 /*****************************************
3642 * gtk_widget_aux_info_new:
3647 *****************************************/
3649 static GtkWidgetAuxInfo*
3650 gtk_widget_aux_info_new ()
3652 GtkWidgetAuxInfo *aux_info;
3654 if (!aux_info_mem_chunk)
3655 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
3656 sizeof (GtkWidgetAuxInfo),
3657 1024, G_ALLOC_AND_FREE);
3659 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
3663 aux_info->width = 0;
3664 aux_info->height = 0;
3669 /*****************************************
3670 * gtk_widget_aux_info_destroy:
3675 *****************************************/
3678 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
3680 g_return_if_fail (aux_info != NULL);
3682 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
3685 /*****************************************
3686 * gtk_widget_shape_combine_mask:
3687 * set a shape for this widgets' gdk window, this allows for
3688 * transparent windows etc., see gdk_window_shape_combine_mask
3689 * for more information
3694 *****************************************/
3696 gtk_widget_shape_combine_mask (GtkWidget *widget,
3697 GdkBitmap *shape_mask,
3701 GtkWidgetShapeInfo* shape_info;
3703 g_return_if_fail (widget != NULL);
3704 /* set_shape doesn't work on widgets without gdk window */
3705 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3709 GTK_PRIVATE_UNSET_FLAGS (widget, GTK_HAS_SHAPE_MASK);
3711 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
3712 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
3713 g_free (shape_info);
3717 /* FIXME: we need gdk code here that removes the shape from a window
3723 GTK_PRIVATE_SET_FLAGS (widget, GTK_HAS_SHAPE_MASK);
3725 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
3728 shape_info = g_new (GtkWidgetShapeInfo, 1);
3729 gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
3731 shape_info->shape_mask = shape_mask;
3732 shape_info->offset_x = offset_x;
3733 shape_info->offset_y = offset_y;
3735 /* set shape if widget has a gdk window allready.
3736 * otherwise the shape is scheduled to be set by gtk_widget_realize.
3739 gdk_window_shape_combine_mask (widget->window, shape_mask,
3740 offset_x, offset_y);
3744 /*****************************************
3745 * gtk_widget_dnd_drag_add:
3746 * when you get a DRAG_ENTER event, you can use this
3747 * to tell Gtk ofother widgets that are to be dragged as well
3752 *****************************************/
3754 gtk_widget_dnd_drag_add (GtkWidget *widget)
3758 /*****************************************
3759 * gtk_widget_dnd_drag_set:
3760 * these two functions enable drag and/or drop on a
3761 * widget and also let Gtk know what data types will be accepted
3762 * use MIME type naming,plus tacking "URL:" on the front for link
3769 *****************************************/
3771 gtk_widget_dnd_drag_set (GtkWidget *widget,
3773 gchar **type_accept_list,
3776 g_return_if_fail(widget != NULL);
3778 if (!widget->window)
3779 gtk_widget_realize (widget);
3781 g_return_if_fail (widget->window != NULL);
3782 gdk_window_dnd_drag_set (widget->window,
3788 /*****************************************
3789 * gtk_widget_dnd_drop_set:
3794 *****************************************/
3796 gtk_widget_dnd_drop_set (GtkWidget *widget,
3798 gchar **type_accept_list,
3800 guint8 is_destructive_operation)
3802 g_return_if_fail(widget != NULL);
3804 if (!widget->window)
3805 gtk_widget_realize (widget);
3807 g_return_if_fail (widget->window != NULL);
3808 gdk_window_dnd_drop_set (widget->window,
3812 is_destructive_operation);
3815 /*****************************************
3816 * gtk_widget_dnd_data_set:
3821 *****************************************/
3823 gtk_widget_dnd_data_set (GtkWidget *widget,
3826 gulong data_numbytes)
3828 g_return_if_fail (widget != NULL);
3829 g_return_if_fail (widget->window != NULL);
3831 gdk_window_dnd_data_set (widget->window, event, data, data_numbytes);