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)
68 PROPERTY_NOTIFY_EVENT,
69 SELECTION_CLEAR_EVENT,
70 SELECTION_REQUEST_EVENT,
71 SELECTION_NOTIFY_EVENT,
80 DROP_DATA_AVAILABLE_EVENT,
100 ARG_EXTENSION_EVENTS,
107 typedef void (*GtkWidgetSignal1) (GtkObject *object,
110 typedef gint (*GtkWidgetSignal2) (GtkObject *object,
115 typedef void (*GtkWidgetSignal3) (GtkObject *object,
118 typedef gint (*GtkWidgetSignal4) (GtkObject *object,
121 typedef void (*GtkWidgetSignal5) (GtkObject *object,
124 typedef void (*GtkWidgetSignal6) (GtkObject *object,
127 typedef void (*GtkWidgetSignal7) (GtkObject *object,
131 typedef struct _GtkStateData GtkStateData;
136 gint parent_sensitive;
140 static void gtk_widget_marshal_signal_1 (GtkObject *object,
144 static void gtk_widget_marshal_signal_2 (GtkObject *object,
148 static void gtk_widget_marshal_signal_3 (GtkObject *object,
152 static void gtk_widget_marshal_signal_4 (GtkObject *object,
156 static void gtk_widget_marshal_signal_5 (GtkObject *object,
160 static void gtk_widget_marshal_signal_6 (GtkObject *object,
164 static void gtk_widget_marshal_signal_7 (GtkObject *object,
169 static void gtk_widget_class_init (GtkWidgetClass *klass);
170 static void gtk_widget_init (GtkWidget *widget);
171 static void gtk_widget_set_arg (GtkWidget *widget,
174 static void gtk_widget_get_arg (GtkWidget *widget,
177 static void gtk_widget_real_destroy (GtkObject *object);
178 static void gtk_widget_real_finalize (GtkObject *object);
179 static void gtk_widget_real_show (GtkWidget *widget);
180 static void gtk_widget_real_hide (GtkWidget *widget);
181 static void gtk_widget_real_map (GtkWidget *widget);
182 static void gtk_widget_real_unmap (GtkWidget *widget);
183 static void gtk_widget_real_realize (GtkWidget *widget);
184 static void gtk_widget_real_unrealize (GtkWidget *widget);
185 static void gtk_widget_real_draw (GtkWidget *widget,
187 static gint gtk_widget_real_queue_draw (GtkWidget *widget);
188 static void gtk_widget_real_size_allocate (GtkWidget *widget,
189 GtkAllocation *allocation);
190 static void gtk_widget_style_set (GtkWidget *widget,
191 GtkStyle *previous_style);
193 static GdkColormap* gtk_widget_peek_colormap (void);
194 static GdkVisual* gtk_widget_peek_visual (void);
195 static GtkStyle* gtk_widget_peek_style (void);
197 static void gtk_widget_reparent_container_child (GtkWidget *widget,
198 gpointer client_data);
199 static void gtk_widget_propagate_state (GtkWidget *widget,
201 static void gtk_widget_draw_children_recurse (GtkWidget *widget,
202 gpointer client_data);
203 static void gtk_widget_set_style_internal (GtkWidget *widget,
205 gboolean initial_emission);
206 static void gtk_widget_set_style_recurse (GtkWidget *widget,
207 gpointer client_data);
209 extern GtkArg* gtk_object_collect_args (guint *nargs,
213 static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
214 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
216 static GtkObjectClass *parent_class = NULL;
217 static gint widget_signals[LAST_SIGNAL] = { 0 };
219 static GMemChunk *aux_info_mem_chunk = NULL;
221 static GdkColormap *default_colormap = NULL;
222 static GdkVisual *default_visual = NULL;
223 static GtkStyle *default_style = NULL;
225 static GSList *colormap_stack = NULL;
226 static GSList *visual_stack = NULL;
227 static GSList *style_stack = NULL;
229 static GSList *gtk_widget_redraw_queue = NULL;
230 static GSList *gtk_widget_resize_queue = NULL;
232 static const gchar *aux_info_key = "gtk-aux-info";
233 static const gchar *colormap_key = "gtk-colormap";
234 static const gchar *visual_key = "gtk-visual";
235 static const gchar *event_key = "gtk-event-mask";
236 static const gchar *extension_event_key = "gtk-extension-event-mode";
237 static const gchar *parent_window_key = "gtk-parent-window";
238 static const gchar *shape_info_key = "gtk-shape-info";
239 static const gchar *saved_default_style_key = "gtk-saved-default-style";
243 /*****************************************
244 * gtk_widget_get_type:
249 *****************************************/
252 gtk_widget_get_type ()
254 static guint widget_type = 0;
258 GtkTypeInfo widget_info =
262 sizeof (GtkWidgetClass),
263 (GtkClassInitFunc) gtk_widget_class_init,
264 (GtkObjectInitFunc) gtk_widget_init,
265 (GtkArgSetFunc) gtk_widget_set_arg,
266 (GtkArgGetFunc) gtk_widget_get_arg,
269 widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);
275 /*****************************************
276 * gtk_widget_class_init:
281 *****************************************/
284 gtk_widget_class_init (GtkWidgetClass *klass)
286 GtkObjectClass *object_class;
288 object_class = (GtkObjectClass*) klass;
290 parent_class = gtk_type_class (gtk_object_get_type ());
292 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
293 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
294 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
295 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
296 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
297 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
298 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
299 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
300 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
301 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
302 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
303 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
304 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
305 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
306 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
308 widget_signals[SHOW] =
309 gtk_signal_new ("show",
312 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
313 gtk_signal_default_marshaller,
315 widget_signals[HIDE] =
316 gtk_signal_new ("hide",
319 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
320 gtk_signal_default_marshaller,
322 widget_signals[MAP] =
323 gtk_signal_new ("map",
326 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
327 gtk_signal_default_marshaller,
329 widget_signals[UNMAP] =
330 gtk_signal_new ("unmap",
333 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
334 gtk_signal_default_marshaller,
336 widget_signals[REALIZE] =
337 gtk_signal_new ("realize",
340 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
341 gtk_signal_default_marshaller,
343 widget_signals[UNREALIZE] =
344 gtk_signal_new ("unrealize",
347 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
348 gtk_signal_default_marshaller,
350 widget_signals[DRAW] =
351 gtk_signal_new ("draw",
354 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
355 gtk_widget_marshal_signal_1,
358 widget_signals[DRAW_FOCUS] =
359 gtk_signal_new ("draw_focus",
362 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
363 gtk_signal_default_marshaller,
365 widget_signals[DRAW_DEFAULT] =
366 gtk_signal_new ("draw_default",
369 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
370 gtk_signal_default_marshaller,
372 widget_signals[SIZE_REQUEST] =
373 gtk_signal_new ("size_request",
376 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
377 gtk_widget_marshal_signal_1,
380 widget_signals[SIZE_ALLOCATE] =
381 gtk_signal_new ("size_allocate",
384 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
385 gtk_widget_marshal_signal_1,
388 widget_signals[STATE_CHANGED] =
389 gtk_signal_new ("state_changed",
392 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
393 gtk_widget_marshal_signal_5,
396 widget_signals[PARENT_SET] =
397 gtk_signal_new ("parent_set",
400 GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
401 gtk_widget_marshal_signal_6,
404 widget_signals[STYLE_SET] =
405 gtk_signal_new ("style_set",
408 GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
409 gtk_widget_marshal_signal_7,
412 widget_signals[INSTALL_ACCELERATOR] =
413 gtk_signal_new ("install_accelerator",
416 GTK_SIGNAL_OFFSET (GtkWidgetClass, install_accelerator),
417 gtk_widget_marshal_signal_2,
422 widget_signals[REMOVE_ACCELERATOR] =
423 gtk_signal_new ("remove_accelerator",
426 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator),
427 gtk_widget_marshal_signal_3,
430 widget_signals[EVENT] =
431 gtk_signal_new ("event",
434 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
435 gtk_widget_marshal_signal_4,
438 widget_signals[BUTTON_PRESS_EVENT] =
439 gtk_signal_new ("button_press_event",
442 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
443 gtk_widget_marshal_signal_4,
446 widget_signals[BUTTON_RELEASE_EVENT] =
447 gtk_signal_new ("button_release_event",
450 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
451 gtk_widget_marshal_signal_4,
454 widget_signals[MOTION_NOTIFY_EVENT] =
455 gtk_signal_new ("motion_notify_event",
458 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
459 gtk_widget_marshal_signal_4,
462 widget_signals[DELETE_EVENT] =
463 gtk_signal_new ("delete_event",
466 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
467 gtk_widget_marshal_signal_4,
470 widget_signals[DESTROY_EVENT] =
471 gtk_signal_new ("destroy_event",
474 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
475 gtk_widget_marshal_signal_4,
478 widget_signals[EXPOSE_EVENT] =
479 gtk_signal_new ("expose_event",
482 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
483 gtk_widget_marshal_signal_4,
486 widget_signals[KEY_PRESS_EVENT] =
487 gtk_signal_new ("key_press_event",
490 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
491 gtk_widget_marshal_signal_4,
494 widget_signals[KEY_RELEASE_EVENT] =
495 gtk_signal_new ("key_release_event",
498 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
499 gtk_widget_marshal_signal_4,
502 widget_signals[ENTER_NOTIFY_EVENT] =
503 gtk_signal_new ("enter_notify_event",
506 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
507 gtk_widget_marshal_signal_4,
510 widget_signals[LEAVE_NOTIFY_EVENT] =
511 gtk_signal_new ("leave_notify_event",
514 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
515 gtk_widget_marshal_signal_4,
518 widget_signals[CONFIGURE_EVENT] =
519 gtk_signal_new ("configure_event",
522 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
523 gtk_widget_marshal_signal_4,
526 widget_signals[FOCUS_IN_EVENT] =
527 gtk_signal_new ("focus_in_event",
530 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
531 gtk_widget_marshal_signal_4,
534 widget_signals[FOCUS_OUT_EVENT] =
535 gtk_signal_new ("focus_out_event",
538 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
539 gtk_widget_marshal_signal_4,
542 widget_signals[MAP_EVENT] =
543 gtk_signal_new ("map_event",
546 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
547 gtk_widget_marshal_signal_4,
550 widget_signals[UNMAP_EVENT] =
551 gtk_signal_new ("unmap_event",
554 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
555 gtk_widget_marshal_signal_4,
558 widget_signals[PROPERTY_NOTIFY_EVENT] =
559 gtk_signal_new ("property_notify_event",
562 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
563 gtk_widget_marshal_signal_4,
566 widget_signals[SELECTION_CLEAR_EVENT] =
567 gtk_signal_new ("selection_clear_event",
570 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
571 gtk_widget_marshal_signal_4,
574 widget_signals[SELECTION_REQUEST_EVENT] =
575 gtk_signal_new ("selection_request_event",
578 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
579 gtk_widget_marshal_signal_4,
582 widget_signals[SELECTION_NOTIFY_EVENT] =
583 gtk_signal_new ("selection_notify_event",
586 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
587 gtk_widget_marshal_signal_4,
590 widget_signals[SELECTION_RECEIVED] =
591 gtk_signal_new ("selection_received",
594 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
595 gtk_widget_marshal_signal_1,
598 widget_signals[PROXIMITY_IN_EVENT] =
599 gtk_signal_new ("proximity_in_event",
602 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
603 gtk_widget_marshal_signal_4,
606 widget_signals[PROXIMITY_OUT_EVENT] =
607 gtk_signal_new ("proximity_out_event",
610 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
611 gtk_widget_marshal_signal_4,
614 widget_signals[DRAG_BEGIN_EVENT] =
615 gtk_signal_new ("drag_begin_event",
618 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin_event),
619 gtk_widget_marshal_signal_4,
622 widget_signals[DRAG_REQUEST_EVENT] =
623 gtk_signal_new ("drag_request_event",
626 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_request_event),
627 gtk_widget_marshal_signal_4,
630 widget_signals[DRAG_END_EVENT] =
631 gtk_signal_new ("drag_end_event",
634 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end_event),
635 gtk_widget_marshal_signal_4,
638 widget_signals[DROP_ENTER_EVENT] =
639 gtk_signal_new ("drop_enter_event",
642 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_enter_event),
643 gtk_widget_marshal_signal_4,
646 widget_signals[DROP_LEAVE_EVENT] =
647 gtk_signal_new ("drop_leave_event",
650 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_leave_event),
651 gtk_widget_marshal_signal_4,
654 widget_signals[DROP_DATA_AVAILABLE_EVENT] =
655 gtk_signal_new ("drop_data_available_event",
658 GTK_SIGNAL_OFFSET (GtkWidgetClass,
659 drop_data_available_event),
660 gtk_widget_marshal_signal_4,
663 widget_signals[OTHER_EVENT] =
664 gtk_signal_new ("other_event",
667 GTK_SIGNAL_OFFSET (GtkWidgetClass, other_event),
668 gtk_widget_marshal_signal_4,
671 widget_signals[CLIENT_EVENT] =
672 gtk_signal_new ("client_event",
675 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
676 gtk_widget_marshal_signal_4,
679 widget_signals[NO_EXPOSE_EVENT] =
680 gtk_signal_new ("no_expose_event",
683 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
684 gtk_widget_marshal_signal_4,
688 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
690 object_class->destroy = gtk_widget_real_destroy;
691 object_class->finalize = gtk_widget_real_finalize;
693 klass->activate_signal = 0;
694 klass->show = gtk_widget_real_show;
695 klass->hide = gtk_widget_real_hide;
696 klass->show_all = gtk_widget_real_show;
697 klass->hide_all = gtk_widget_real_hide;
698 klass->map = gtk_widget_real_map;
699 klass->unmap = gtk_widget_real_unmap;
700 klass->realize = gtk_widget_real_realize;
701 klass->unrealize = gtk_widget_real_unrealize;
702 klass->draw = gtk_widget_real_draw;
703 klass->draw_focus = NULL;
704 klass->size_request = NULL;
705 klass->size_allocate = gtk_widget_real_size_allocate;
706 klass->state_changed = NULL;
707 klass->parent_set = NULL;
708 klass->style_set = gtk_widget_style_set;
709 klass->install_accelerator = NULL;
710 klass->remove_accelerator = NULL;
712 klass->button_press_event = NULL;
713 klass->button_release_event = NULL;
714 klass->motion_notify_event = NULL;
715 klass->delete_event = NULL;
716 klass->destroy_event = NULL;
717 klass->expose_event = NULL;
718 klass->key_press_event = NULL;
719 klass->key_release_event = NULL;
720 klass->enter_notify_event = NULL;
721 klass->leave_notify_event = NULL;
722 klass->configure_event = NULL;
723 klass->focus_in_event = NULL;
724 klass->focus_out_event = NULL;
725 klass->map_event = NULL;
726 klass->unmap_event = NULL;
727 klass->property_notify_event = gtk_selection_property_notify;
728 klass->selection_clear_event = gtk_selection_clear;
729 klass->selection_request_event = gtk_selection_request;
730 klass->selection_notify_event = gtk_selection_notify;
731 klass->selection_received = NULL;
732 klass->proximity_in_event = NULL;
733 klass->proximity_out_event = NULL;
734 klass->drag_begin_event = NULL;
735 klass->drag_request_event = NULL;
736 klass->drop_enter_event = NULL;
737 klass->drop_leave_event = NULL;
738 klass->drop_data_available_event = NULL;
739 klass->other_event = NULL;
740 klass->no_expose_event = NULL;
743 /*****************************************
744 * gtk_widget_set_arg:
749 *****************************************/
752 gtk_widget_set_arg (GtkWidget *widget,
759 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
762 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
765 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -1);
768 gtk_widget_set_usize (widget, -1, GTK_VALUE_INT (*arg));
771 if (GTK_VALUE_BOOL(*arg))
772 gtk_widget_show (widget);
774 gtk_widget_hide (widget);
777 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
780 if (GTK_VALUE_BOOL (*arg))
781 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
783 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
786 if (GTK_VALUE_BOOL (*arg))
787 gtk_widget_grab_focus (widget);
789 case ARG_CAN_DEFAULT:
790 if (GTK_VALUE_BOOL (*arg))
791 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
793 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
795 case ARG_HAS_DEFAULT:
796 if (GTK_VALUE_BOOL (*arg))
797 gtk_widget_grab_default (widget);
800 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
802 case ARG_EXTENSION_EVENTS:
803 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
806 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
809 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
812 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
815 arg->type = GTK_TYPE_INVALID;
820 /*****************************************
821 * gtk_widget_get_arg:
826 *****************************************/
829 gtk_widget_get_arg (GtkWidget *widget,
833 GtkWidgetAuxInfo *aux_info;
835 GdkExtensionMode *modep;
840 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
842 GTK_VALUE_INT (*arg) = -2;
844 GTK_VALUE_INT (*arg) = aux_info->x;
847 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
849 GTK_VALUE_INT (*arg) = -2;
851 GTK_VALUE_INT (*arg) = aux_info->y;
854 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
856 GTK_VALUE_INT (*arg) = -2;
858 GTK_VALUE_INT (*arg) = aux_info->width;
861 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
863 GTK_VALUE_INT (*arg) = -2;
865 GTK_VALUE_INT (*arg) = aux_info->height;
868 GTK_VALUE_BOOL (*arg) = GTK_WIDGET_VISIBLE (widget);
871 GTK_VALUE_BOOL (*arg) = GTK_WIDGET_SENSITIVE (widget);
874 GTK_VALUE_BOOL (*arg) = GTK_WIDGET_CAN_FOCUS (widget);
877 GTK_VALUE_BOOL (*arg) = GTK_WIDGET_HAS_FOCUS (widget);
879 case ARG_CAN_DEFAULT:
880 GTK_VALUE_BOOL (*arg) = GTK_WIDGET_CAN_DEFAULT (widget);
882 case ARG_HAS_DEFAULT:
883 GTK_VALUE_BOOL (*arg) = GTK_WIDGET_HAS_DEFAULT (widget);
886 eventp = gtk_object_get_data (GTK_OBJECT (widget), event_key);
888 GTK_VALUE_FLAGS (*arg) = 0;
890 GTK_VALUE_FLAGS (*arg) = *eventp;
892 case ARG_EXTENSION_EVENTS:
893 modep = gtk_object_get_data (GTK_OBJECT (widget), extension_event_key);
895 GTK_VALUE_FLAGS (*arg) = 0;
897 GTK_VALUE_FLAGS (*arg) = *modep;
901 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
903 GTK_VALUE_STRING (*arg) = g_strdup ("");
906 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
909 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
912 arg->type = GTK_TYPE_INVALID;
917 /*****************************************
923 *****************************************/
926 gtk_widget_init (GtkWidget *widget)
928 GdkColormap *colormap;
931 GTK_PRIVATE_FLAGS (widget) = 0;
932 widget->state = GTK_STATE_NORMAL;
933 widget->saved_state = GTK_STATE_NORMAL;
935 widget->requisition.width = 0;
936 widget->requisition.height = 0;
937 widget->allocation.x = -1;
938 widget->allocation.y = -1;
939 widget->allocation.width = 1;
940 widget->allocation.height = 1;
941 widget->window = NULL;
942 widget->parent = NULL;
944 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE | GTK_PARENT_SENSITIVE);
946 widget->style = gtk_widget_peek_style ();
947 gtk_style_ref (widget->style);
949 colormap = gtk_widget_peek_colormap ();
950 visual = gtk_widget_peek_visual ();
952 /* XXX - should we ref the colormap and visual, too? */
954 if (colormap != gtk_widget_get_default_colormap ())
956 /* gdk_colormap_ref (colormap); */
957 gtk_object_set_data (GTK_OBJECT (widget), colormap_key, colormap);
960 if (visual != gtk_widget_get_default_visual ())
962 /* gdk_visual_ref (visual); */
963 gtk_object_set_data (GTK_OBJECT (widget), visual_key, visual);
967 /*****************************************
973 *****************************************/
976 gtk_widget_new (guint type,
985 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
987 obj = gtk_type_new (type);
989 va_start (args1, type);
990 va_start (args2, type);
992 args = gtk_object_collect_args (&nargs, args1, args2);
993 gtk_object_setv (obj, nargs, args);
999 return GTK_WIDGET (obj);
1002 /*****************************************
1008 *****************************************/
1011 gtk_widget_newv (guint type,
1015 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1017 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1020 /*****************************************
1026 *****************************************/
1029 gtk_widget_get (GtkWidget *widget,
1032 g_return_if_fail (widget != NULL);
1033 g_return_if_fail (arg != NULL);
1035 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1038 /*****************************************
1044 *****************************************/
1047 gtk_widget_getv (GtkWidget *widget,
1051 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1054 /*****************************************
1060 *****************************************/
1063 gtk_widget_set (GtkWidget *widget,
1071 g_return_if_fail (widget != NULL);
1073 va_start (args1, widget);
1074 va_start (args2, widget);
1076 args = gtk_object_collect_args (&nargs, args1, args2);
1077 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1084 /*****************************************
1090 *****************************************/
1093 gtk_widget_setv (GtkWidget *widget,
1097 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1100 /*****************************************
1101 * gtk_widget_unparent:
1102 * do any cleanup necessary necessary
1103 * for setting parent = NULL.
1108 *****************************************/
1111 gtk_widget_unparent (GtkWidget *widget)
1113 GtkWidget *toplevel;
1115 GtkWidget *old_parent;
1117 g_return_if_fail (widget != NULL);
1118 if (widget->parent == NULL)
1121 /* keep this function in sync with gtk_menu_detach()
1124 toplevel = gtk_widget_get_toplevel (widget);
1125 if (GTK_IS_WINDOW (toplevel))
1127 child = GTK_WINDOW (toplevel)->focus_widget;
1129 while (child && child != widget)
1130 child = child->parent;
1132 if (child == widget)
1133 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1136 if (GTK_WIDGET_RESIZE_NEEDED (widget))
1138 GTK_CONTAINER (toplevel)->resize_widgets =
1139 g_slist_remove (GTK_CONTAINER (toplevel)->resize_widgets, widget);
1140 GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_NEEDED);
1143 /* Reset the width and height here, to force reallocation if we
1144 * get added back to a new parent. This won't work if our new
1145 * allocation is smaller than 1x1 and we actually want a size of 1x1...
1146 * (would 0x0 be OK here?)
1148 widget->allocation.width = 1;
1149 widget->allocation.height = 1;
1151 if (widget->window &&
1152 GTK_WIDGET_NO_WINDOW (widget) &&
1153 GTK_WIDGET_DRAWABLE (widget))
1154 gdk_window_clear_area (widget->window,
1155 widget->allocation.x,
1156 widget->allocation.y,
1157 widget->allocation.width,
1158 widget->allocation.height);
1160 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1161 gtk_widget_unrealize (widget);
1163 old_parent = widget->parent;
1164 widget->parent = NULL;
1165 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1167 gtk_widget_unref (widget);
1170 /*****************************************
1171 * gtk_widget_destroy:
1176 *****************************************/
1179 gtk_widget_destroy (GtkWidget *widget)
1181 g_return_if_fail (widget != NULL);
1182 g_return_if_fail (GTK_IS_WIDGET (widget));
1184 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
1185 if (GTK_WIDGET_REALIZED (widget))
1186 gtk_widget_unrealize (widget);
1188 gtk_object_destroy (GTK_OBJECT (widget));
1191 /*****************************************
1192 * gtk_widget_destroyed:
1193 * Utility function: sets widget_pointer
1194 * to NULL when widget is destroyed.
1199 *****************************************/
1202 gtk_widget_destroyed (GtkWidget *widget,
1203 GtkWidget **widget_pointer)
1205 /* Don't make any assumptions about the
1207 * Even check widget_pointer.
1210 *widget_pointer = NULL;
1213 /*****************************************
1219 *****************************************/
1222 gtk_widget_show (GtkWidget *widget)
1224 g_return_if_fail (widget != NULL);
1226 if (!GTK_WIDGET_VISIBLE (widget))
1227 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1230 /*****************************************
1236 *****************************************/
1239 gtk_widget_hide (GtkWidget *widget)
1241 g_return_if_fail (widget != NULL);
1243 if (GTK_WIDGET_VISIBLE (widget))
1244 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1247 /*****************************************
1248 * gtk_widget_show_all:
1250 * Shows the widget and all children.
1252 * Container classes overwrite
1253 * show_all and hide_all to call
1254 * show_all (hide_all) on both themselves
1255 * and on their child widgets.
1260 *****************************************/
1263 gtk_widget_show_all (GtkWidget *widget)
1265 GtkWidgetClass *widget_class;
1267 g_return_if_fail (widget != NULL);
1269 /* show_all shouldn't be invoked through a signal,
1270 because in this case it would be quite slow - there would
1271 be a show and show_all signal emitted for every child widget.
1273 widget_class = GTK_WIDGET_CLASS(GTK_OBJECT(widget)->klass);
1274 widget_class->show_all (widget);
1277 /*****************************************
1278 * gtk_widget_hide_all:
1280 * Hides the widget and all children.
1281 * See gtk_widget_show_all.
1286 *****************************************/
1289 gtk_widget_hide_all (GtkWidget *widget)
1291 GtkWidgetClass *widget_class;
1293 g_return_if_fail (widget != NULL);
1294 g_assert (widget->parent);
1296 if (GTK_WIDGET_RESIZE_NEEDED (widget))
1298 GtkWidget *toplevel;
1300 toplevel = gtk_widget_get_toplevel (widget);
1301 if (toplevel != widget)
1302 GTK_CONTAINER (toplevel)->resize_widgets =
1303 g_slist_remove (GTK_CONTAINER (toplevel)->resize_widgets, widget);
1304 GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_NEEDED);
1307 widget_class = GTK_WIDGET_CLASS(GTK_OBJECT(widget)->klass);
1308 widget_class->hide_all (widget);
1311 /*****************************************
1317 *****************************************/
1320 gtk_widget_map (GtkWidget *widget)
1322 g_return_if_fail (widget != NULL);
1324 if (!GTK_WIDGET_MAPPED (widget))
1326 if (!GTK_WIDGET_REALIZED (widget))
1327 gtk_widget_realize (widget);
1329 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1333 /*****************************************
1339 *****************************************/
1342 gtk_widget_unmap (GtkWidget *widget)
1344 g_return_if_fail (widget != NULL);
1346 if (GTK_WIDGET_MAPPED (widget))
1347 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1350 /*****************************************
1351 * gtk_widget_realize:
1356 *****************************************/
1359 gtk_widget_realize (GtkWidget *widget)
1362 GdkExtensionMode mode;
1363 GtkWidgetShapeInfo *shape_info;
1365 g_return_if_fail (widget != NULL);
1367 if (!GTK_WIDGET_REALIZED (widget))
1370 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1371 g_print ("%s\n", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1374 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1375 gtk_widget_realize (widget->parent);
1377 gtk_widget_ensure_style (widget);
1379 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1381 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1383 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1385 gdk_window_shape_combine_mask (widget->window,
1386 shape_info->shape_mask,
1387 shape_info->offset_x,
1388 shape_info->offset_y);
1391 if (!GTK_WIDGET_NO_WINDOW (widget))
1393 mode = gtk_widget_get_extension_events (widget);
1394 if (mode != GDK_EXTENSION_EVENTS_NONE)
1396 events = gtk_widget_get_events (widget);
1397 gdk_input_set_extension_events (widget->window, events, mode);
1404 /*****************************************
1405 * gtk_widget_unrealize:
1410 *****************************************/
1413 gtk_widget_unrealize (GtkWidget *widget)
1415 g_return_if_fail (widget != NULL);
1417 if (GTK_WIDGET_REALIZED (widget))
1418 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1421 /*****************************************
1422 * gtk_widget_queue_draw:
1427 *****************************************/
1430 gtk_widget_idle_draw (void *data)
1434 node = gtk_widget_redraw_queue;
1435 gtk_widget_redraw_queue = NULL;
1438 gtk_widget_real_queue_draw ((GtkWidget*) node->data);
1442 return gtk_widget_redraw_queue != NULL;
1446 gtk_widget_queue_draw (GtkWidget *widget)
1450 g_return_if_fail (widget != NULL);
1452 if (GTK_WIDGET_DRAWABLE (widget))
1454 /* We queue the redraw if:
1455 * a) the widget is not already queued for redraw and
1456 * b) non of the widgets ancestors are queued for redraw.
1461 if (GTK_WIDGET_REDRAW_PENDING (parent))
1463 parent = parent->parent;
1466 GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_PENDING);
1467 if (gtk_widget_redraw_queue == NULL)
1468 gtk_idle_add_priority (GTK_PRIORITY_INTERNAL,
1469 (GtkFunction) gtk_widget_idle_draw, NULL);
1471 gtk_widget_redraw_queue = g_slist_prepend (gtk_widget_redraw_queue, widget);
1475 /*****************************************
1476 * gtk_widget_queue_resize:
1481 *****************************************/
1484 gtk_widget_idle_sizer (void *data)
1486 GSList *slist, *free_slist;
1488 free_slist = gtk_widget_resize_queue;
1489 gtk_widget_resize_queue = NULL;
1495 widget = slist->data;
1497 GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_PENDING);
1498 if (gtk_container_need_resize (GTK_CONTAINER (widget)))
1499 gtk_widget_queue_resize (widget);
1501 slist = slist->next;
1503 g_slist_free (free_slist);
1505 return gtk_widget_resize_queue != NULL;
1509 gtk_widget_queue_resize (GtkWidget *widget)
1511 GtkWidget *toplevel;
1513 g_return_if_fail (widget != NULL);
1515 toplevel = gtk_widget_get_toplevel (widget);
1516 if (GTK_WIDGET_TOPLEVEL (toplevel))
1518 if (GTK_WIDGET_VISIBLE (toplevel))
1520 if (!GTK_CONTAINER_RESIZE_PENDING (toplevel))
1522 GTK_PRIVATE_SET_FLAG (toplevel, GTK_RESIZE_PENDING);
1523 if (gtk_widget_resize_queue == NULL)
1524 gtk_idle_add_priority (GTK_PRIORITY_INTERNAL,
1525 (GtkFunction) gtk_widget_idle_sizer, NULL);
1526 gtk_widget_resize_queue = g_slist_prepend (gtk_widget_resize_queue, toplevel);
1529 if (!GTK_WIDGET_RESIZE_NEEDED (widget))
1531 GTK_PRIVATE_SET_FLAG (widget, GTK_RESIZE_NEEDED);
1532 GTK_CONTAINER (toplevel)->resize_widgets =
1533 g_slist_prepend (GTK_CONTAINER (toplevel)->resize_widgets, widget);
1536 g_assert (g_slist_find (GTK_CONTAINER (toplevel)->resize_widgets, widget)); /* paranoid */
1539 gtk_container_need_resize (GTK_CONTAINER (toplevel));
1543 /*****************************************
1549 *****************************************/
1552 gtk_widget_draw (GtkWidget *widget,
1555 GdkRectangle temp_area;
1557 g_return_if_fail (widget != NULL);
1559 if (GTK_WIDGET_DRAWABLE (widget) &&
1560 !GTK_WIDGET_REDRAW_PENDING (widget))
1564 if (GTK_WIDGET_NO_WINDOW (widget))
1566 temp_area.x = widget->allocation.x;
1567 temp_area.y = widget->allocation.y;
1575 temp_area.width = widget->allocation.width;
1576 temp_area.height = widget->allocation.height;
1580 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
1584 /*****************************************
1585 * gtk_widget_draw_focus:
1590 *****************************************/
1593 gtk_widget_draw_focus (GtkWidget *widget)
1595 g_return_if_fail (widget != NULL);
1597 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
1600 /*****************************************
1601 * gtk_widget_draw_default:
1606 *****************************************/
1609 gtk_widget_draw_default (GtkWidget *widget)
1611 g_return_if_fail (widget != NULL);
1613 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
1616 /*****************************************
1617 * gtk_widget_draw_children:
1622 *****************************************/
1625 gtk_widget_draw_children (GtkWidget *widget)
1627 g_return_if_fail (widget != NULL);
1629 if (GTK_IS_CONTAINER (widget))
1630 gtk_container_foreach (GTK_CONTAINER (widget),
1631 gtk_widget_draw_children_recurse,
1635 /*****************************************
1636 * gtk_widget_size_request:
1641 *****************************************/
1644 gtk_widget_size_request (GtkWidget *widget,
1645 GtkRequisition *requisition)
1647 GtkWidgetAuxInfo *aux_info;
1649 g_return_if_fail (widget != NULL);
1651 gtk_widget_ref (widget);
1652 gtk_widget_ensure_style (widget);
1653 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
1655 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
1658 if (aux_info->width > 0)
1659 requisition->width = aux_info->width;
1660 if (aux_info->height > 0)
1661 requisition->height = aux_info->height;
1663 gtk_widget_unref (widget);
1666 /*****************************************
1667 * gtk_widget_size_allocate:
1672 *****************************************/
1675 gtk_widget_size_allocate (GtkWidget *widget,
1676 GtkAllocation *allocation)
1678 GtkWidgetAuxInfo *aux_info;
1679 GtkAllocation real_allocation;
1681 g_return_if_fail (widget != NULL);
1683 real_allocation = *allocation;
1684 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
1688 if (aux_info->x != -1)
1689 real_allocation.x = aux_info->x;
1690 if (aux_info->y != -1)
1691 real_allocation.y = aux_info->y;
1694 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
1697 /*****************************************
1698 * gtk_widget_install_accelerator:
1703 *****************************************/
1706 gtk_widget_install_accelerator (GtkWidget *widget,
1707 GtkAcceleratorTable *table,
1708 const gchar *signal_name,
1714 g_return_if_fail (widget != NULL);
1716 gtk_widget_ref (widget);
1718 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[INSTALL_ACCELERATOR],
1719 signal_name, key, modifiers, &return_val);
1721 gtk_accelerator_table_install (table,
1722 GTK_OBJECT (widget),
1726 gtk_widget_unref (widget);
1729 /*****************************************
1730 * gtk_widget_remove_accelerator:
1735 *****************************************/
1738 gtk_widget_remove_accelerator (GtkWidget *widget,
1739 GtkAcceleratorTable *table,
1740 const gchar *signal_name)
1742 g_return_if_fail (widget != NULL);
1744 gtk_widget_ref (widget);
1745 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR],
1747 gtk_accelerator_table_remove (table, GTK_OBJECT (widget), signal_name);
1748 gtk_widget_unref (widget);
1751 /*****************************************
1757 *****************************************/
1760 gtk_widget_event (GtkWidget *widget,
1766 g_return_val_if_fail (widget != NULL, TRUE);
1768 gtk_widget_ref (widget);
1770 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
1772 if (return_val || GTK_OBJECT_DESTROYED (widget))
1774 gtk_widget_unref (widget);
1778 switch (event->type)
1783 case GDK_BUTTON_PRESS:
1784 case GDK_2BUTTON_PRESS:
1785 case GDK_3BUTTON_PRESS:
1786 signal_num = BUTTON_PRESS_EVENT;
1788 case GDK_BUTTON_RELEASE:
1789 signal_num = BUTTON_RELEASE_EVENT;
1791 case GDK_MOTION_NOTIFY:
1792 signal_num = MOTION_NOTIFY_EVENT;
1795 signal_num = DELETE_EVENT;
1798 signal_num = DESTROY_EVENT;
1801 signal_num = KEY_PRESS_EVENT;
1803 case GDK_KEY_RELEASE:
1804 signal_num = KEY_RELEASE_EVENT;
1806 case GDK_ENTER_NOTIFY:
1807 signal_num = ENTER_NOTIFY_EVENT;
1809 case GDK_LEAVE_NOTIFY:
1810 signal_num = LEAVE_NOTIFY_EVENT;
1812 case GDK_FOCUS_CHANGE:
1813 if (event->focus_change.in)
1814 signal_num = FOCUS_IN_EVENT;
1816 signal_num = FOCUS_OUT_EVENT;
1819 signal_num = CONFIGURE_EVENT;
1822 signal_num = MAP_EVENT;
1825 signal_num = UNMAP_EVENT;
1827 case GDK_PROPERTY_NOTIFY:
1828 signal_num = PROPERTY_NOTIFY_EVENT;
1830 case GDK_SELECTION_CLEAR:
1831 signal_num = SELECTION_CLEAR_EVENT;
1833 case GDK_SELECTION_REQUEST:
1834 signal_num = SELECTION_REQUEST_EVENT;
1836 case GDK_SELECTION_NOTIFY:
1837 signal_num = SELECTION_NOTIFY_EVENT;
1839 case GDK_PROXIMITY_IN:
1840 signal_num = PROXIMITY_IN_EVENT;
1842 case GDK_PROXIMITY_OUT:
1843 signal_num = PROXIMITY_OUT_EVENT;
1845 case GDK_DRAG_BEGIN:
1846 signal_num = DRAG_BEGIN_EVENT;
1848 case GDK_DRAG_REQUEST:
1849 signal_num = DRAG_REQUEST_EVENT;
1851 case GDK_DROP_ENTER:
1852 signal_num = DROP_ENTER_EVENT;
1854 case GDK_DROP_LEAVE:
1855 signal_num = DROP_LEAVE_EVENT;
1857 case GDK_DROP_DATA_AVAIL:
1858 signal_num = DROP_DATA_AVAILABLE_EVENT;
1860 case GDK_OTHER_EVENT:
1861 signal_num = OTHER_EVENT;
1864 signal_num = NO_EXPOSE_EVENT;
1866 case GDK_CLIENT_EVENT:
1867 signal_num = CLIENT_EVENT;
1870 /* there is no sense in providing a widget with bogus expose events
1872 if (!event->any.window)
1874 gtk_widget_unref (widget);
1877 signal_num = EXPOSE_EVENT;
1880 g_warning ("could not determine signal number for event: %d", event->type);
1881 gtk_widget_unref (widget);
1885 if (signal_num != -1)
1886 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
1888 return_val |= GTK_OBJECT_DESTROYED (widget);
1890 gtk_widget_unref (widget);
1895 /*****************************************
1896 * gtk_widget_activate:
1901 *****************************************/
1904 gtk_widget_activate (GtkWidget *widget)
1906 g_return_if_fail (widget != NULL);
1907 g_return_if_fail (GTK_IS_WIDGET (widget));
1909 if (WIDGET_CLASS (widget)->activate_signal)
1910 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
1913 /*****************************************
1914 * gtk_widget_reparent_container_child:
1915 * assistent function to gtk_widget_reparent
1920 *****************************************/
1923 gtk_widget_reparent_container_child(GtkWidget *widget,
1924 gpointer client_data)
1926 g_return_if_fail (widget != NULL);
1927 g_return_if_fail (client_data != NULL);
1929 if (GTK_WIDGET_NO_WINDOW (widget))
1932 gdk_window_unref (widget->window);
1933 widget->window = (GdkWindow*) client_data;
1935 gdk_window_ref (widget->window);
1937 if (GTK_IS_CONTAINER (widget))
1938 gtk_container_foreach (GTK_CONTAINER (widget),
1939 gtk_widget_reparent_container_child,
1943 gdk_window_reparent (widget->window,
1944 (GdkWindow*) client_data, 0, 0);
1947 /*****************************************
1948 * gtk_widget_reparent:
1953 *****************************************/
1956 gtk_widget_reparent (GtkWidget *widget,
1957 GtkWidget *new_parent)
1959 g_return_if_fail (widget != NULL);
1960 g_return_if_fail (GTK_IS_WIDGET (widget));
1961 g_return_if_fail (new_parent != NULL);
1962 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
1963 g_return_if_fail (widget->parent != NULL);
1965 if (widget->parent != new_parent)
1967 /* First try to see if we can get away without unrealizing
1968 * the widget as we reparent it. if so we set a flag so
1969 * that gtk_widget_unparent doesn't unrealize widget
1971 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
1972 GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
1974 gtk_widget_ref (widget);
1975 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
1976 gtk_container_add (GTK_CONTAINER (new_parent), widget);
1977 gtk_widget_unref (widget);
1979 if (GTK_WIDGET_IN_REPARENT (widget))
1981 GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
1983 /* OK, now fix up the widget's window. (And that for any
1984 * children, if the widget is NO_WINDOW and a container)
1986 if (GTK_WIDGET_NO_WINDOW (widget))
1988 if (GTK_IS_CONTAINER (widget))
1989 gtk_container_foreach (GTK_CONTAINER (widget),
1990 gtk_widget_reparent_container_child,
1991 gtk_widget_get_parent_window (widget));
1994 GdkWindow *parent_window;
1996 parent_window = gtk_widget_get_parent_window (widget);
1997 if (parent_window != widget->window)
2000 gdk_window_unref (widget->window);
2001 widget->window = parent_window;
2003 gdk_window_ref (widget->window);
2008 gdk_window_reparent (widget->window, gtk_widget_get_parent_window (widget), 0, 0);
2013 /*****************************************
2019 *****************************************/
2022 gtk_widget_popup (GtkWidget *widget,
2026 g_return_if_fail (widget != NULL);
2028 if (!GTK_WIDGET_VISIBLE (widget))
2030 if (!GTK_WIDGET_REALIZED (widget))
2031 gtk_widget_realize (widget);
2032 if (!GTK_WIDGET_NO_WINDOW (widget))
2033 gdk_window_move (widget->window, x, y);
2034 gtk_widget_show (widget);
2038 /*****************************************
2039 * gtk_widget_intersect:
2044 *****************************************/
2047 gtk_widget_intersect (GtkWidget *widget,
2049 GdkRectangle *intersection)
2055 g_return_val_if_fail (widget != NULL, FALSE);
2056 g_return_val_if_fail (area != NULL, FALSE);
2059 dest = intersection;
2063 return_val = gdk_rectangle_intersect ((GdkRectangle*) &widget->allocation, area, dest);
2065 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2067 intersection->x -= widget->allocation.x;
2068 intersection->y -= widget->allocation.y;
2076 gtk_widget_basic (GtkWidget *widget)
2082 g_return_val_if_fail (widget != NULL, FALSE);
2084 if (!GTK_WIDGET_BASIC (widget))
2086 else if (GTK_IS_CONTAINER (widget))
2088 children = gtk_container_children (GTK_CONTAINER (widget));
2092 tmp_list = children;
2096 if (!gtk_widget_basic (GTK_WIDGET (tmp_list->data)))
2102 tmp_list = tmp_list->next;
2105 g_list_free (children);
2114 /*****************************************
2115 * gtk_widget_grab_focus:
2120 *****************************************/
2123 gtk_widget_grab_focus (GtkWidget *widget)
2129 g_return_if_fail (widget != NULL);
2131 window_type = gtk_window_get_type ();
2132 window = widget->parent;
2135 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2137 GTK_CONTAINER (window)->focus_child = child;
2139 window = window->parent;
2142 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2144 GTK_CONTAINER (window)->focus_child = child;
2145 gtk_window_set_focus (GTK_WINDOW (window), widget);
2149 /*****************************************
2150 * gtk_widget_grab_default:
2155 *****************************************/
2158 gtk_widget_grab_default (GtkWidget *widget)
2163 g_return_if_fail (widget != NULL);
2164 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
2166 window_type = gtk_window_get_type ();
2167 window = widget->parent;
2169 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2170 window = window->parent;
2172 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2173 gtk_window_set_default (GTK_WINDOW (window), widget);
2176 /*****************************************
2177 * gtk_widget_set_name:
2182 *****************************************/
2185 gtk_widget_set_name (GtkWidget *widget,
2188 g_return_if_fail (widget != NULL);
2191 g_free (widget->name);
2192 widget->name = g_strdup (name);
2194 if (!GTK_WIDGET_USER_STYLE (widget))
2195 gtk_widget_set_rc_style (widget);
2198 /*****************************************
2199 * gtk_widget_get_name:
2204 *****************************************/
2207 gtk_widget_get_name (GtkWidget *widget)
2209 g_return_val_if_fail (widget != NULL, NULL);
2212 return widget->name;
2213 return gtk_type_name (GTK_WIDGET_TYPE (widget));
2216 /*****************************************
2217 * gtk_widget_set_state:
2224 *****************************************/
2227 gtk_widget_set_state (GtkWidget *widget,
2230 g_return_if_fail (widget != NULL);
2232 if (state == GTK_WIDGET_STATE (widget))
2235 if (state == GTK_STATE_INSENSITIVE)
2236 gtk_widget_set_sensitive (widget, FALSE);
2240 GtkStateType old_state;
2244 data.parent_sensitive = GTK_WIDGET_IS_SENSITIVE (widget->parent);
2246 data.parent_sensitive = GTK_PARENT_SENSITIVE;
2248 old_state = GTK_WIDGET_STATE (widget);
2250 gtk_widget_propagate_state (widget, &data);
2251 if (old_state != GTK_WIDGET_STATE (widget))
2252 gtk_widget_queue_draw (widget);
2256 /*****************************************
2257 * gtk_widget_set_sensitive:
2261 * boolean value for sensitivity
2264 *****************************************/
2267 gtk_widget_set_sensitive (GtkWidget *widget,
2271 GtkStateType old_state;
2273 g_return_if_fail (widget != NULL);
2277 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
2278 if (GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE)
2279 data.state = GTK_WIDGET_SAVED_STATE (widget);
2281 data.state = GTK_WIDGET_STATE (widget);
2285 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
2286 data.state = GTK_WIDGET_STATE (widget);
2290 data.parent_sensitive = GTK_WIDGET_IS_SENSITIVE (widget->parent);
2292 data.parent_sensitive = GTK_PARENT_SENSITIVE;
2294 old_state = GTK_WIDGET_STATE (widget);
2295 gtk_widget_propagate_state (widget, &data);
2296 if (old_state != GTK_WIDGET_STATE (widget))
2297 gtk_widget_queue_draw (widget);
2300 /*****************************************
2301 * gtk_widget_set_parent:
2306 *****************************************/
2309 gtk_widget_set_parent (GtkWidget *widget,
2314 g_return_if_fail (widget != NULL);
2315 g_return_if_fail (widget->parent == NULL);
2316 g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
2317 g_return_if_fail (parent != NULL);
2319 /* keep this function in sync with gtk_menu_attach_to_widget()
2322 gtk_widget_ref (widget);
2323 gtk_object_sink (GTK_OBJECT (widget));
2324 widget->parent = parent;
2326 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
2327 data.state = GTK_WIDGET_STATE (parent);
2329 data.state = GTK_WIDGET_STATE (widget);
2330 data.parent_sensitive = GTK_WIDGET_IS_SENSITIVE (parent);
2332 gtk_widget_propagate_state (widget, &data);
2334 while (parent->parent != NULL)
2335 parent = parent->parent;
2337 gtk_widget_set_style_recurse (widget, NULL);
2339 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
2342 /*****************************************
2344 * see docs/styles.txt
2345 *****************************************/
2347 gtk_widget_set_style (GtkWidget *widget,
2350 GtkStyle *default_style;
2351 gboolean initial_emission;
2353 g_return_if_fail (widget != NULL);
2354 g_return_if_fail (style != NULL);
2356 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2358 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
2359 GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
2361 default_style = gtk_object_get_data (GTK_OBJECT (widget), saved_default_style_key);
2364 gtk_style_ref (widget->style);
2365 gtk_object_set_data (GTK_OBJECT (widget), saved_default_style_key, widget->style);
2368 gtk_widget_set_style_internal (widget, style, initial_emission);
2372 gtk_widget_ensure_style (GtkWidget *widget)
2374 if (!GTK_WIDGET_USER_STYLE (widget) &&
2375 !GTK_WIDGET_RC_STYLE (widget))
2376 gtk_widget_set_rc_style (widget);
2380 gtk_widget_set_rc_style (GtkWidget *widget)
2382 GtkStyle *saved_style;
2383 GtkStyle *new_style;
2384 gboolean initial_emission;
2386 g_return_if_fail (widget != NULL);
2388 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2390 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2391 GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
2393 saved_style = gtk_object_get_data (GTK_OBJECT (widget), saved_default_style_key);
2394 new_style = gtk_rc_get_style (widget);
2399 gtk_style_ref (widget->style);
2400 gtk_object_set_data (GTK_OBJECT (widget), saved_default_style_key, widget->style);
2402 gtk_widget_set_style_internal (widget, new_style, initial_emission);
2408 g_assert (initial_emission == FALSE); /* FIXME: remove this line */
2410 gtk_object_remove_data (GTK_OBJECT (widget), saved_default_style_key);
2411 gtk_widget_set_style_internal (widget, saved_style, initial_emission);
2412 gtk_style_unref (saved_style);
2416 if (initial_emission)
2417 gtk_widget_set_style_internal (widget, widget->style, TRUE);
2423 gtk_widget_restore_default_style (GtkWidget *widget)
2425 GtkStyle *default_style;
2427 g_return_if_fail (widget != NULL);
2429 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2431 default_style = gtk_object_get_data (GTK_OBJECT (widget), saved_default_style_key);
2434 gtk_object_remove_data (GTK_OBJECT (widget), saved_default_style_key);
2435 gtk_widget_set_style_internal (widget, default_style, FALSE);
2436 gtk_style_unref (default_style);
2441 gtk_widget_get_style (GtkWidget *widget)
2443 g_return_val_if_fail (widget != NULL, NULL);
2445 return widget->style;
2449 gtk_widget_style_set (GtkWidget *widget,
2450 GtkStyle *previous_style)
2452 if (GTK_WIDGET_REALIZED (widget) &&
2453 !GTK_WIDGET_NO_WINDOW (widget))
2454 gtk_style_set_background (widget->style, widget->window, widget->state);
2458 gtk_widget_set_style_internal (GtkWidget *widget,
2460 gboolean initial_emission)
2462 g_return_if_fail (widget != NULL);
2463 g_return_if_fail (style != NULL);
2465 if (widget->style != style)
2467 GtkStyle *previous_style;
2469 if (GTK_WIDGET_REALIZED (widget))
2470 gtk_style_detach (widget->style);
2472 previous_style = widget->style;
2473 widget->style = style;
2474 gtk_style_ref (widget->style);
2476 if (GTK_WIDGET_REALIZED (widget))
2477 widget->style = gtk_style_attach (widget->style, widget->window);
2479 gtk_signal_emit (GTK_OBJECT (widget),
2480 widget_signals[STYLE_SET],
2481 initial_emission ? NULL : previous_style);
2482 gtk_style_unref (previous_style);
2484 if (widget->parent && !initial_emission)
2486 GtkRequisition old_requisition;
2488 old_requisition = widget->requisition;
2489 gtk_widget_size_request (widget, &widget->requisition);
2491 if ((old_requisition.width != widget->requisition.width) ||
2492 (old_requisition.height != widget->requisition.height))
2493 gtk_widget_queue_resize (widget);
2494 else if (GTK_WIDGET_DRAWABLE (widget))
2495 gtk_widget_queue_draw (widget);
2498 else if (initial_emission)
2500 gtk_signal_emit (GTK_OBJECT (widget),
2501 widget_signals[STYLE_SET],
2507 gtk_widget_set_style_recurse (GtkWidget *widget,
2508 gpointer client_data)
2510 if (GTK_WIDGET_RC_STYLE (widget))
2511 gtk_widget_set_rc_style (widget);
2513 if (GTK_IS_CONTAINER (widget))
2514 gtk_container_foreach (GTK_CONTAINER (widget),
2515 gtk_widget_set_style_recurse,
2520 gtk_widget_set_default_style (GtkStyle *style)
2522 if (style != default_style)
2525 gtk_style_unref (default_style);
2526 default_style = style;
2528 gtk_style_ref (default_style);
2533 gtk_widget_get_default_style ()
2537 default_style = gtk_style_new ();
2538 gtk_style_ref (default_style);
2541 return default_style;
2545 gtk_widget_push_style (GtkStyle *style)
2547 g_return_if_fail (style != NULL);
2549 gtk_style_ref (style);
2550 style_stack = g_slist_prepend (style_stack, style);
2554 gtk_widget_peek_style ()
2557 return (GtkStyle*) style_stack->data;
2559 return gtk_widget_get_default_style ();
2563 gtk_widget_pop_style ()
2570 style_stack = style_stack->next;
2571 gtk_style_unref ((GtkStyle*) tmp->data);
2572 g_slist_free_1 (tmp);
2576 /* Basically, send a message to all toplevel windows telling them
2577 * that a new _GTK_STYLE_COLORS property is available on the root
2581 gtk_widget_propagate_default_style (void)
2586 /* Set the property on the root window */
2587 gdk_property_change(GDK_ROOT_PARENT(),
2588 gdk_atom_intern("_GTK_DEFAULT_COLORS", FALSE),
2589 gdk_atom_intern("STRING", FALSE),
2591 GDK_PROP_MODE_REPLACE,
2592 (guchar *)gtk_widget_get_default_style(),
2593 GTK_STYLE_NUM_STYLECOLORS() * sizeof(GdkColor));
2595 for(i = 0; i < 5; i++)
2597 sev.data_format = 32;
2598 sev.message_type = gdk_atom_intern ("_GTK_STYLE_CHANGED", FALSE);
2599 gdk_event_send_clientmessage_toall ((GdkEvent *) &sev);
2602 /*************************************************************
2603 * gtk_widget_set_parent_window:
2604 * Set a non default parent window for widget
2611 *************************************************************/
2614 gtk_widget_set_parent_window (GtkWidget *widget,
2615 GdkWindow *parent_window)
2617 GdkWindow *old_parent_window;
2619 g_return_if_fail (widget != NULL);
2621 old_parent_window = gtk_object_get_data (GTK_OBJECT (widget),
2624 if (parent_window != old_parent_window)
2626 gtk_object_set_data (GTK_OBJECT (widget), parent_window_key,
2628 if (old_parent_window)
2629 gdk_window_unref (old_parent_window);
2631 gdk_window_ref (parent_window);
2635 /*************************************************************
2636 * gtk_widget_get_parent_window:
2637 * Get widget's parent window
2644 *************************************************************/
2647 gtk_widget_get_parent_window (GtkWidget *widget)
2649 GdkWindow *parent_window;
2651 g_return_val_if_fail (widget != NULL, NULL);
2652 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
2653 g_return_val_if_fail (widget->parent != NULL, NULL);
2655 parent_window = gtk_object_get_data (GTK_OBJECT (widget),
2658 return (parent_window != NULL) ? parent_window : widget->parent->window;
2661 /*****************************************
2662 * gtk_widget_set_uposition:
2667 *****************************************/
2670 gtk_widget_set_uposition (GtkWidget *widget,
2674 GtkWidgetAuxInfo *aux_info;
2676 g_return_if_fail (widget != NULL);
2678 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
2681 aux_info = gtk_widget_aux_info_new ();
2682 gtk_object_set_data (GTK_OBJECT (widget), aux_info_key, aux_info);
2690 if (GTK_WIDGET_REALIZED (widget) && GTK_IS_WINDOW (widget) &&
2691 (aux_info->x != -1) && (aux_info->y != -1))
2693 gdk_window_set_hints (widget->window, aux_info->x, aux_info->y, 0, 0, 0, 0, GDK_HINT_POS);
2694 gdk_window_move (widget->window, aux_info->x, aux_info->y);
2697 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
2698 gtk_widget_size_allocate (widget, &widget->allocation);
2701 /*****************************************
2702 * gtk_widget_set_usize:
2707 *****************************************/
2710 gtk_widget_set_usize (GtkWidget *widget,
2714 GtkWidgetAuxInfo *aux_info;
2716 g_return_if_fail (widget != NULL);
2718 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
2721 aux_info = gtk_widget_aux_info_new ();
2722 gtk_object_set_data (GTK_OBJECT (widget), aux_info_key, aux_info);
2726 aux_info->width = width;
2728 aux_info->height = height;
2730 if (GTK_WIDGET_VISIBLE (widget))
2731 gtk_widget_queue_resize (widget);
2734 /*****************************************
2735 * gtk_widget_set_events:
2740 *****************************************/
2743 gtk_widget_set_events (GtkWidget *widget,
2748 g_return_if_fail (widget != NULL);
2749 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
2750 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
2752 eventp = gtk_object_get_data (GTK_OBJECT (widget), event_key);
2757 eventp = g_new (gint, 1);
2760 gtk_object_set_data (GTK_OBJECT (widget), event_key, eventp);
2767 gtk_object_remove_data (GTK_OBJECT (widget), event_key);
2771 /*****************************************
2772 * gtk_widget_set_extension_events:
2777 *****************************************/
2780 gtk_widget_set_extension_events (GtkWidget *widget,
2781 GdkExtensionMode mode)
2783 GdkExtensionMode *modep;
2785 g_return_if_fail (widget != NULL);
2787 modep = gtk_object_get_data (GTK_OBJECT (widget), extension_event_key);
2790 modep = g_new (GdkExtensionMode, 1);
2793 gtk_object_set_data (GTK_OBJECT (widget), extension_event_key, modep);
2797 /*****************************************
2798 * gtk_widget_get_toplevel:
2803 *****************************************/
2806 gtk_widget_get_toplevel (GtkWidget *widget)
2808 g_return_val_if_fail (widget != NULL, NULL);
2810 while (widget->parent)
2811 widget = widget->parent;
2816 /*****************************************
2817 * gtk_widget_get_ancestor:
2822 *****************************************/
2825 gtk_widget_get_ancestor (GtkWidget *widget,
2828 g_return_val_if_fail (widget != NULL, NULL);
2830 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), type))
2831 widget = widget->parent;
2833 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), type)))
2839 /*****************************************
2840 * gtk_widget_get_colormap:
2845 *****************************************/
2848 gtk_widget_get_colormap (GtkWidget *widget)
2850 GdkColormap *colormap;
2852 g_return_val_if_fail (widget != NULL, NULL);
2854 if (!widget->window)
2856 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
2859 return gtk_widget_get_default_colormap ();
2862 return gdk_window_get_colormap (widget->window);
2865 /*****************************************
2866 * gtk_widget_get_visual:
2871 *****************************************/
2874 gtk_widget_get_visual (GtkWidget *widget)
2878 g_return_val_if_fail (widget != NULL, NULL);
2880 if (!widget->window)
2882 visual = gtk_object_get_data (GTK_OBJECT (widget), visual_key);
2885 return gtk_widget_get_default_visual ();
2888 return gdk_window_get_visual (widget->window);
2891 /*****************************************
2892 * gtk_widget_get_events:
2897 *****************************************/
2900 gtk_widget_get_events (GtkWidget *widget)
2904 g_return_val_if_fail (widget != NULL, 0);
2906 events = gtk_object_get_data (GTK_OBJECT (widget), event_key);
2913 /*****************************************
2914 * gtk_widget_get_extension_events:
2919 *****************************************/
2922 gtk_widget_get_extension_events (GtkWidget *widget)
2924 GdkExtensionMode *mode;
2926 g_return_val_if_fail (widget != NULL, 0);
2928 mode = gtk_object_get_data (GTK_OBJECT (widget), extension_event_key);
2935 /*****************************************
2936 * gtk_widget_get_pointer:
2941 *****************************************/
2944 gtk_widget_get_pointer (GtkWidget *widget,
2948 g_return_if_fail (widget != NULL);
2955 if (GTK_WIDGET_REALIZED (widget))
2957 gdk_window_get_pointer (widget->window, x, y, NULL);
2959 if (GTK_WIDGET_NO_WINDOW (widget))
2962 *x -= widget->allocation.x;
2964 *y -= widget->allocation.y;
2969 /*****************************************
2970 * gtk_widget_is_ancestor:
2975 *****************************************/
2978 gtk_widget_is_ancestor (GtkWidget *widget,
2979 GtkWidget *ancestor)
2981 g_return_val_if_fail (widget != NULL, FALSE);
2982 g_return_val_if_fail (ancestor != NULL, FALSE);
2986 if (widget->parent == ancestor)
2988 widget = widget->parent;
2994 /*****************************************
2995 * gtk_widget_is_child:
3000 *****************************************/
3003 gtk_widget_is_child (GtkWidget *widget,
3006 g_return_val_if_fail (widget != NULL, FALSE);
3007 g_return_val_if_fail (child != NULL, FALSE);
3009 return (child->parent == widget);
3012 /*****************************************
3013 * gtk_widget_push_colormap:
3018 *****************************************/
3021 gtk_widget_push_colormap (GdkColormap *cmap)
3023 g_return_if_fail (cmap != NULL);
3025 colormap_stack = g_slist_prepend (colormap_stack, cmap);
3028 /*****************************************
3029 * gtk_widget_push_visual:
3034 *****************************************/
3037 gtk_widget_push_visual (GdkVisual *visual)
3039 g_return_if_fail (visual != NULL);
3041 visual_stack = g_slist_prepend (visual_stack, visual);
3044 /*****************************************
3045 * gtk_widget_pop_colormap:
3050 *****************************************/
3053 gtk_widget_pop_colormap ()
3059 tmp = colormap_stack;
3060 colormap_stack = colormap_stack->next;
3061 g_slist_free_1 (tmp);
3065 /*****************************************
3066 * gtk_widget_pop_visual:
3071 *****************************************/
3074 gtk_widget_pop_visual ()
3081 visual_stack = visual_stack->next;
3082 g_slist_free_1 (tmp);
3086 /*****************************************
3087 * gtk_widget_set_default_colormap:
3092 *****************************************/
3095 gtk_widget_set_default_colormap (GdkColormap *colormap)
3097 if (default_colormap != colormap)
3099 if (default_colormap)
3100 gdk_colormap_unref (default_colormap);
3101 default_colormap = colormap;
3102 if (default_colormap)
3103 gdk_colormap_ref (default_colormap);
3107 /*****************************************
3108 * gtk_widget_set_default_visual:
3113 *****************************************/
3116 gtk_widget_set_default_visual (GdkVisual *visual)
3118 default_visual = visual;
3121 /*****************************************
3122 * gtk_widget_get_default_colormap:
3127 *****************************************/
3130 gtk_widget_get_default_colormap ()
3132 if (!default_colormap)
3133 default_colormap = gdk_colormap_get_system ();
3135 return default_colormap;
3138 /*****************************************
3139 * gtk_widget_get_default_visual:
3144 *****************************************/
3147 gtk_widget_get_default_visual ()
3149 if (!default_visual)
3150 default_visual = gdk_visual_get_system ();
3152 return default_visual;
3155 /*****************************************
3156 * gtk_widget_marshal_signal_1:
3161 *****************************************/
3164 gtk_widget_marshal_signal_1 (GtkObject *object,
3169 GtkWidgetSignal1 rfunc;
3171 rfunc = (GtkWidgetSignal1) func;
3174 GTK_VALUE_POINTER (args[0]),
3178 /*****************************************
3179 * gtk_widget_marshal_signal_2:
3184 *****************************************/
3187 gtk_widget_marshal_signal_2 (GtkObject *object,
3192 GtkWidgetSignal2 rfunc;
3195 rfunc = (GtkWidgetSignal2) func;
3196 return_val = GTK_RETLOC_BOOL (args[3]);
3198 *return_val = (* rfunc) (object,
3199 GTK_VALUE_STRING (args[0]),
3200 GTK_VALUE_CHAR (args[1]),
3201 GTK_VALUE_INT (args[2]),
3205 /*****************************************
3206 * gtk_widget_marshal_signal_3:
3211 *****************************************/
3214 gtk_widget_marshal_signal_3 (GtkObject *object,
3219 GtkWidgetSignal3 rfunc;
3221 rfunc = (GtkWidgetSignal3) func;
3224 GTK_VALUE_STRING (args[0]),
3228 /*****************************************
3229 * gtk_widget_marshal_signal_4:
3234 *****************************************/
3237 gtk_widget_marshal_signal_4 (GtkObject *object,
3242 GtkWidgetSignal4 rfunc;
3245 rfunc = (GtkWidgetSignal4) func;
3246 return_val = GTK_RETLOC_BOOL (args[1]);
3248 *return_val = (* rfunc) (object,
3249 GTK_VALUE_BOXED (args[0]),
3253 /*****************************************
3254 * gtk_widget_marshal_signal_5:
3259 *****************************************/
3262 gtk_widget_marshal_signal_5 (GtkObject *object,
3267 GtkWidgetSignal5 rfunc;
3269 rfunc = (GtkWidgetSignal5) func;
3272 GTK_VALUE_UINT (args[0]),
3276 /*****************************************
3277 * gtk_widget_marshal_signal_6:
3282 *****************************************/
3285 gtk_widget_marshal_signal_6 (GtkObject *object,
3290 GtkWidgetSignal6 rfunc;
3292 rfunc = (GtkWidgetSignal6) func;
3295 GTK_VALUE_OBJECT (args[0]),
3299 /*****************************************
3300 * gtk_widget_marshal_signal_7:
3305 *****************************************/
3308 gtk_widget_marshal_signal_7 (GtkObject *object,
3313 GtkWidgetSignal7 rfunc;
3315 rfunc = (GtkWidgetSignal7) func;
3318 GTK_VALUE_BOXED (args[0]),
3323 gtk_widget_real_destroy (GtkObject *object)
3325 GtkWidget *widget = GTK_WIDGET (object);
3326 GtkStyle *saved_style;
3328 gtk_widget_ref (widget);
3330 if (GTK_WIDGET_REDRAW_PENDING (widget))
3332 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
3333 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
3336 if (GTK_CONTAINER_RESIZE_PENDING (widget))
3338 gtk_widget_resize_queue = g_slist_remove (gtk_widget_resize_queue, widget);
3339 GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_PENDING);
3342 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
3343 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
3345 gtk_grab_remove (widget);
3346 gtk_selection_remove_all (widget);
3349 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
3351 saved_style = gtk_object_get_data (GTK_OBJECT (widget), saved_default_style_key);
3354 gtk_style_unref (saved_style);
3355 gtk_object_remove_data (GTK_OBJECT (widget), saved_default_style_key);
3358 gtk_style_unref (widget->style);
3359 widget->style = NULL;
3361 parent_class->destroy (object);
3363 gtk_widget_unref (widget);
3367 gtk_widget_real_finalize (GtkObject *object)
3370 GtkWidgetAuxInfo *aux_info;
3372 GdkExtensionMode *mode;
3374 g_return_if_fail (object != NULL);
3375 g_return_if_fail (GTK_IS_WIDGET (object));
3377 widget = GTK_WIDGET (object);
3381 g_free (widget->name);
3382 widget->name = NULL;
3385 aux_info = gtk_object_get_data (GTK_OBJECT (widget), aux_info_key);
3388 gtk_widget_aux_info_destroy (aux_info);
3389 gtk_object_remove_data (GTK_OBJECT (widget), aux_info_key);
3392 events = gtk_object_get_data (GTK_OBJECT (widget), event_key);
3396 gtk_object_remove_data (GTK_OBJECT (widget), event_key);
3399 mode = gtk_object_get_data (GTK_OBJECT (widget), extension_event_key);
3403 gtk_object_remove_data (GTK_OBJECT (widget), extension_event_key);
3406 parent_class->finalize (object);
3409 /*****************************************
3410 * gtk_widget_real_show:
3415 *****************************************/
3418 gtk_widget_real_show (GtkWidget *widget)
3420 g_return_if_fail (widget != NULL);
3421 g_return_if_fail (GTK_IS_WIDGET (widget));
3423 if (!GTK_WIDGET_VISIBLE (widget))
3425 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
3429 gtk_widget_queue_resize (widget);
3431 if (GTK_WIDGET_MAPPED (widget->parent))
3432 gtk_widget_map (widget);
3437 /*****************************************
3438 * gtk_widget_real_hide:
3443 *****************************************/
3446 gtk_widget_real_hide (GtkWidget *widget)
3448 g_return_if_fail (widget != NULL);
3449 g_return_if_fail (GTK_IS_WIDGET (widget));
3451 if (GTK_WIDGET_VISIBLE (widget))
3453 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3455 if (GTK_WIDGET_MAPPED (widget))
3456 gtk_widget_unmap (widget);
3459 gtk_widget_queue_resize (widget);
3463 /*****************************************
3464 * gtk_widget_real_map:
3469 *****************************************/
3472 gtk_widget_real_map (GtkWidget *widget)
3474 g_return_if_fail (widget != NULL);
3475 g_return_if_fail (GTK_IS_WIDGET (widget));
3477 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget))
3479 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
3481 if (!GTK_WIDGET_NO_WINDOW (widget))
3482 gdk_window_show (widget->window);
3484 gtk_widget_queue_draw (widget);
3488 /*****************************************
3489 * gtk_widget_real_unmap:
3494 *****************************************/
3497 gtk_widget_real_unmap (GtkWidget *widget)
3499 g_return_if_fail (widget != NULL);
3500 g_return_if_fail (GTK_IS_WIDGET (widget));
3502 if (GTK_WIDGET_MAPPED (widget))
3504 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
3506 if (GTK_WIDGET_NO_WINDOW (widget))
3507 gdk_window_clear_area (widget->window,
3508 widget->allocation.x,
3509 widget->allocation.y,
3510 widget->allocation.width,
3511 widget->allocation.height);
3513 gdk_window_hide (widget->window);
3517 /*****************************************
3518 * gtk_widget_real_realize:
3523 *****************************************/
3526 gtk_widget_real_realize (GtkWidget *widget)
3528 g_return_if_fail (widget != NULL);
3529 g_return_if_fail (GTK_IS_WIDGET (widget));
3530 g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
3532 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
3535 widget->window = gtk_widget_get_parent_window (widget);
3536 gdk_window_ref (widget->window);
3538 widget->style = gtk_style_attach (widget->style, widget->window);
3541 /*****************************************
3542 * gtk_widget_real_unrealize:
3547 *****************************************/
3550 gtk_widget_real_unrealize (GtkWidget *widget)
3552 g_return_if_fail (widget != NULL);
3553 g_return_if_fail (GTK_IS_WIDGET (widget));
3555 if (GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_MAPPED (widget))
3556 gtk_widget_real_unmap (widget);
3558 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
3560 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT(widget)->klass->type));
3563 gtk_style_detach (widget->style);
3564 if (!GTK_WIDGET_NO_WINDOW (widget))
3566 gdk_window_set_user_data (widget->window, NULL);
3567 gdk_window_destroy (widget->window);
3571 gdk_window_unref (widget->window);
3574 /* Unrealize afterwards to improve visual effect */
3576 if (GTK_IS_CONTAINER (widget))
3577 gtk_container_foreach (GTK_CONTAINER (widget),
3578 (GtkCallback)gtk_widget_unrealize,
3581 widget->window = NULL;
3584 /*****************************************
3585 * gtk_widget_real_draw:
3590 *****************************************/
3593 gtk_widget_real_draw (GtkWidget *widget,
3596 GdkEventExpose event;
3598 g_return_if_fail (widget != NULL);
3599 g_return_if_fail (GTK_IS_WIDGET (widget));
3600 g_return_if_fail (area != NULL);
3602 if (GTK_WIDGET_DRAWABLE (widget))
3604 event.type = GDK_EXPOSE;
3605 event.window = widget->window;
3608 gdk_window_ref (event.window);
3609 gtk_widget_event (widget, (GdkEvent*) &event);
3610 gdk_window_unref (event.window);
3614 /*****************************************
3615 * gtk_widget_real_queue_draw:
3620 *****************************************/
3623 gtk_widget_real_queue_draw (GtkWidget *widget)
3625 g_return_val_if_fail (widget != NULL, FALSE);
3626 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
3628 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
3629 gtk_widget_draw (widget, NULL);
3634 /*****************************************
3635 * gtk_widget_real_size_allocate:
3640 *****************************************/
3643 gtk_widget_real_size_allocate (GtkWidget *widget,
3644 GtkAllocation *allocation)
3646 g_return_if_fail (widget != NULL);
3647 g_return_if_fail (GTK_IS_WIDGET (widget));
3649 if (GTK_WIDGET_NO_WINDOW (widget) &&
3650 GTK_WIDGET_MAPPED (widget) &&
3651 ((widget->allocation.x != allocation->x) ||
3652 (widget->allocation.y != allocation->y) ||
3653 (widget->allocation.width != allocation->width) ||
3654 (widget->allocation.height != allocation->height)) &&
3655 (widget->allocation.width != 0) &&
3656 (widget->allocation.height != 0))
3657 gdk_window_clear_area (widget->window,
3658 widget->allocation.x,
3659 widget->allocation.y,
3660 widget->allocation.width,
3661 widget->allocation.height);
3663 widget->allocation = *allocation;
3665 if (GTK_WIDGET_REALIZED (widget) &&
3666 !GTK_WIDGET_NO_WINDOW (widget))
3667 gdk_window_move_resize (widget->window,
3668 allocation->x, allocation->y,
3669 allocation->width, allocation->height);
3672 /*****************************************
3673 * gtk_widget_peek_colormap:
3678 *****************************************/
3681 gtk_widget_peek_colormap ()
3684 return (GdkColormap*) colormap_stack->data;
3685 return gtk_widget_get_default_colormap ();
3688 /*****************************************
3689 * gtk_widget_peek_visual:
3694 *****************************************/
3697 gtk_widget_peek_visual ()
3700 return (GdkVisual*) visual_stack->data;
3701 return gtk_widget_get_default_visual ();
3704 /*************************************************************
3705 * gtk_widget_propagate_state:
3706 * Propagate a change in the widgets state down the tree
3710 * GtkStateData: state
3714 *************************************************************/
3717 gtk_widget_propagate_state (GtkWidget *widget,
3722 /* don't call this function with state=GTK_STATE_INSENSITIVE,
3723 * parent_sensitive=TRUE and a sensitive widget
3726 old_state = GTK_WIDGET_STATE (widget);
3728 if (data->parent_sensitive)
3730 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3732 if (GTK_WIDGET_IS_SENSITIVE (widget))
3733 GTK_WIDGET_STATE (widget) = data->state;
3736 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3737 if (data->state != GTK_STATE_INSENSITIVE)
3738 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3743 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3744 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3745 if (data->state != GTK_STATE_INSENSITIVE)
3746 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3749 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
3753 window = gtk_widget_get_ancestor (widget, gtk_window_get_type ());
3755 gtk_window_set_focus (GTK_WINDOW (window), NULL);
3758 if (old_state != GTK_WIDGET_STATE (widget))
3760 gtk_widget_ref (widget);
3761 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
3763 if (GTK_IS_CONTAINER (widget))
3765 data->parent_sensitive = GTK_WIDGET_IS_SENSITIVE (widget);
3766 data->state = GTK_WIDGET_STATE (widget);
3767 gtk_container_foreach (GTK_CONTAINER (widget),
3768 (GtkCallback) gtk_widget_propagate_state,
3771 gtk_widget_unref (widget);
3775 /*****************************************
3776 * gtk_widget_draw_children_recurse:
3781 *****************************************/
3784 gtk_widget_draw_children_recurse (GtkWidget *widget,
3785 gpointer client_data)
3787 gtk_widget_draw (widget, NULL);
3788 gtk_widget_draw_children (widget);
3791 /*****************************************
3792 * gtk_widget_aux_info_new:
3797 *****************************************/
3799 static GtkWidgetAuxInfo*
3800 gtk_widget_aux_info_new ()
3802 GtkWidgetAuxInfo *aux_info;
3804 if (!aux_info_mem_chunk)
3805 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
3806 sizeof (GtkWidgetAuxInfo),
3807 1024, G_ALLOC_AND_FREE);
3809 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
3813 aux_info->width = 0;
3814 aux_info->height = 0;
3819 /*****************************************
3820 * gtk_widget_aux_info_destroy:
3825 *****************************************/
3828 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
3830 g_return_if_fail (aux_info != NULL);
3832 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
3835 /*****************************************
3836 * gtk_widget_shape_combine_mask:
3837 * set a shape for this widgets' gdk window, this allows for
3838 * transparent windows etc., see gdk_window_shape_combine_mask
3839 * for more information
3844 *****************************************/
3846 gtk_widget_shape_combine_mask (GtkWidget *widget,
3847 GdkBitmap *shape_mask,
3851 GtkWidgetShapeInfo* shape_info;
3853 g_return_if_fail (widget != NULL);
3854 /* set_shape doesn't work on widgets without gdk window */
3855 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3859 GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
3862 gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
3864 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
3865 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
3866 g_free (shape_info);
3870 GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
3872 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
3875 shape_info = g_new (GtkWidgetShapeInfo, 1);
3876 gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
3878 shape_info->shape_mask = shape_mask;
3879 shape_info->offset_x = offset_x;
3880 shape_info->offset_y = offset_y;
3882 /* set shape if widget has a gdk window allready.
3883 * otherwise the shape is scheduled to be set by gtk_widget_realize.
3886 gdk_window_shape_combine_mask (widget->window, shape_mask,
3887 offset_x, offset_y);
3891 /*****************************************
3892 * gtk_widget_dnd_drag_add:
3893 * when you get a DRAG_ENTER event, you can use this
3894 * to tell Gtk ofother widgets that are to be dragged as well
3899 *****************************************/
3901 gtk_widget_dnd_drag_add (GtkWidget *widget)
3905 /*****************************************
3906 * gtk_widget_dnd_drag_set:
3907 * these two functions enable drag and/or drop on a
3908 * widget and also let Gtk know what data types will be accepted
3909 * use MIME type naming,plus tacking "URL:" on the front for link
3916 *****************************************/
3918 gtk_widget_dnd_drag_set (GtkWidget *widget,
3920 gchar **type_accept_list,
3923 g_return_if_fail(widget != NULL);
3925 if (!widget->window)
3926 gtk_widget_realize (widget);
3928 g_return_if_fail (widget->window != NULL);
3929 gdk_window_dnd_drag_set (widget->window,
3935 /*****************************************
3936 * gtk_widget_dnd_drop_set:
3941 *****************************************/
3943 gtk_widget_dnd_drop_set (GtkWidget *widget,
3945 gchar **type_accept_list,
3947 guint8 is_destructive_operation)
3949 g_return_if_fail(widget != NULL);
3951 if (!widget->window)
3952 gtk_widget_realize (widget);
3954 g_return_if_fail (widget->window != NULL);
3955 gdk_window_dnd_drop_set (widget->window,
3959 is_destructive_operation);
3962 /*****************************************
3963 * gtk_widget_dnd_data_set:
3968 *****************************************/
3970 gtk_widget_dnd_data_set (GtkWidget *widget,
3973 gulong data_numbytes)
3975 g_return_if_fail (widget != NULL);
3976 g_return_if_fail (widget->window != NULL);
3978 gdk_window_dnd_data_set (widget->window, event, data, data_numbytes);
3982 #undef gtk_widget_ref
3983 #undef gtk_widget_unref
3987 gtk_widget_ref (GtkWidget *widget)
3989 gtk_object_ref (GTK_OBJECT (widget));
3993 gtk_widget_unref (GtkWidget *widget)
3995 gtk_object_unref (GTK_OBJECT (widget));