1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 #include "gtkcontainer.h"
24 #include "gtkselection.h"
25 #include "gtksignal.h"
26 #include "gtkwidget.h"
27 #include "gtkwindow.h"
28 #include "gtkbindings.h"
29 #include "gtkprivate.h"
34 #define WIDGET_CLASS(w) GTK_WIDGET_CLASS (GTK_OBJECT (w)->klass)
35 #define INIT_PATH_SIZE (512)
71 PROPERTY_NOTIFY_EVENT,
72 SELECTION_CLEAR_EVENT,
73 SELECTION_REQUEST_EVENT,
74 SELECTION_NOTIFY_EVENT,
83 DROP_DATA_AVAILABLE_EVENT,
87 VISIBILITY_NOTIFY_EVENT,
111 typedef void (*GtkWidgetSignal1) (GtkObject *object,
114 typedef gint (*GtkWidgetSignal2) (GtkObject *object,
119 typedef void (*GtkWidgetSignal3) (GtkObject *object,
122 typedef gint (*GtkWidgetSignal4) (GtkObject *object,
125 typedef void (*GtkWidgetSignal5) (GtkObject *object,
128 typedef void (*GtkWidgetSignal6) (GtkObject *object,
131 typedef void (*GtkWidgetSignal7) (GtkObject *object,
135 typedef struct _GtkStateData GtkStateData;
140 guint state_restauration : 1;
141 guint parent_sensitive : 1;
145 static void gtk_widget_marshal_signal_1 (GtkObject *object,
149 static void gtk_widget_marshal_signal_4 (GtkObject *object,
153 static void gtk_widget_marshal_signal_5 (GtkObject *object,
157 static void gtk_widget_marshal_signal_6 (GtkObject *object,
161 static void gtk_widget_marshal_signal_7 (GtkObject *object,
166 static void gtk_widget_class_init (GtkWidgetClass *klass);
167 static void gtk_widget_init (GtkWidget *widget);
168 static void gtk_widget_set_arg (GtkObject *object,
171 static void gtk_widget_get_arg (GtkObject *object,
174 static void gtk_widget_shutdown (GtkObject *object);
175 static void gtk_widget_real_destroy (GtkObject *object);
176 static void gtk_widget_finalize (GtkObject *object);
177 static void gtk_widget_real_show (GtkWidget *widget);
178 static void gtk_widget_real_hide (GtkWidget *widget);
179 static void gtk_widget_real_map (GtkWidget *widget);
180 static void gtk_widget_real_unmap (GtkWidget *widget);
181 static void gtk_widget_real_realize (GtkWidget *widget);
182 static void gtk_widget_real_unrealize (GtkWidget *widget);
183 static void gtk_widget_real_draw (GtkWidget *widget,
185 static void gtk_widget_real_size_allocate (GtkWidget *widget,
186 GtkAllocation *allocation);
187 static gint gtk_widget_real_key_press_event (GtkWidget *widget,
189 static void gtk_widget_style_set (GtkWidget *widget,
190 GtkStyle *previous_style);
192 static GdkColormap* gtk_widget_peek_colormap (void);
193 static GdkVisual* gtk_widget_peek_visual (void);
194 static GtkStyle* gtk_widget_peek_style (void);
196 static void gtk_widget_reparent_container_child (GtkWidget *widget,
197 gpointer client_data);
198 static void gtk_widget_propagate_state (GtkWidget *widget,
200 static void gtk_widget_draw_children_recurse (GtkWidget *widget,
201 gpointer client_data);
202 static void gtk_widget_set_style_internal (GtkWidget *widget,
204 gboolean initial_emission);
205 static void gtk_widget_set_style_recurse (GtkWidget *widget,
206 gpointer client_data);
208 extern GtkArg* gtk_object_collect_args (guint *nargs,
209 GtkType (*) (const gchar*),
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 guint 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;
231 static const gchar *aux_info_key = "gtk-aux-info";
232 static guint aux_info_key_id = 0;
233 static const gchar *event_key = "gtk-event-mask";
234 static guint event_key_id = 0;
235 static const gchar *extension_event_key = "gtk-extension-event-mode";
236 static guint extension_event_key_id = 0;
237 static const gchar *parent_window_key = "gtk-parent-window";
238 static guint parent_window_key_id = 0;
239 static const gchar *saved_default_style_key = "gtk-saved-default-style";
240 static guint saved_default_style_key_id = 0;
241 static const gchar *shape_info_key = "gtk-shape-info";
242 static const gchar *colormap_key = "gtk-colormap";
243 static const gchar *visual_key = "gtk-visual";
247 /*****************************************
248 * gtk_widget_get_type:
253 *****************************************/
256 gtk_widget_get_type (void)
258 static GtkType widget_type = 0;
262 GtkTypeInfo widget_info =
266 sizeof (GtkWidgetClass),
267 (GtkClassInitFunc) gtk_widget_class_init,
268 (GtkObjectInitFunc) gtk_widget_init,
269 /* reversed_1 */ NULL,
270 /* reversed_2 */ NULL,
271 (GtkClassInitFunc) NULL,
274 widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);
280 /*****************************************
281 * gtk_widget_class_init:
286 *****************************************/
289 gtk_widget_class_init (GtkWidgetClass *klass)
291 GtkObjectClass *object_class;
293 object_class = (GtkObjectClass*) klass;
295 parent_class = gtk_type_class (gtk_object_get_type ());
297 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
298 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
299 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
300 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
301 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
302 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
303 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
304 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
305 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
306 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
307 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
308 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
309 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
310 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
311 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
313 widget_signals[SHOW] =
314 gtk_signal_new ("show",
317 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
318 gtk_signal_default_marshaller,
320 widget_signals[HIDE] =
321 gtk_signal_new ("hide",
324 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
325 gtk_signal_default_marshaller,
327 widget_signals[MAP] =
328 gtk_signal_new ("map",
331 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
332 gtk_signal_default_marshaller,
334 widget_signals[UNMAP] =
335 gtk_signal_new ("unmap",
338 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
339 gtk_signal_default_marshaller,
341 widget_signals[REALIZE] =
342 gtk_signal_new ("realize",
345 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
346 gtk_signal_default_marshaller,
348 widget_signals[UNREALIZE] =
349 gtk_signal_new ("unrealize",
352 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
353 gtk_signal_default_marshaller,
355 widget_signals[DRAW] =
356 gtk_signal_new ("draw",
359 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
360 gtk_widget_marshal_signal_1,
363 widget_signals[DRAW_FOCUS] =
364 gtk_signal_new ("draw_focus",
367 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
368 gtk_signal_default_marshaller,
370 widget_signals[DRAW_DEFAULT] =
371 gtk_signal_new ("draw_default",
374 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
375 gtk_signal_default_marshaller,
377 widget_signals[SIZE_REQUEST] =
378 gtk_signal_new ("size_request",
381 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
382 gtk_widget_marshal_signal_1,
385 widget_signals[SIZE_ALLOCATE] =
386 gtk_signal_new ("size_allocate",
389 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
390 gtk_widget_marshal_signal_1,
393 widget_signals[STATE_CHANGED] =
394 gtk_signal_new ("state_changed",
397 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
398 gtk_widget_marshal_signal_5,
400 GTK_TYPE_STATE_TYPE);
401 widget_signals[PARENT_SET] =
402 gtk_signal_new ("parent_set",
405 GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
406 gtk_widget_marshal_signal_6,
409 widget_signals[STYLE_SET] =
410 gtk_signal_new ("style_set",
413 GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
414 gtk_widget_marshal_signal_7,
417 widget_signals[ADD_ACCELERATOR] =
418 gtk_accel_group_create_add (object_class->type, GTK_RUN_LAST,
419 GTK_SIGNAL_OFFSET (GtkWidgetClass, add_accelerator));
420 widget_signals[REMOVE_ACCELERATOR] =
421 gtk_accel_group_create_remove (object_class->type, GTK_RUN_LAST,
422 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));
423 widget_signals[EVENT] =
424 gtk_signal_new ("event",
427 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
428 gtk_widget_marshal_signal_4,
431 widget_signals[BUTTON_PRESS_EVENT] =
432 gtk_signal_new ("button_press_event",
435 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
436 gtk_widget_marshal_signal_4,
439 widget_signals[BUTTON_RELEASE_EVENT] =
440 gtk_signal_new ("button_release_event",
443 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
444 gtk_widget_marshal_signal_4,
447 widget_signals[MOTION_NOTIFY_EVENT] =
448 gtk_signal_new ("motion_notify_event",
451 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
452 gtk_widget_marshal_signal_4,
455 widget_signals[DELETE_EVENT] =
456 gtk_signal_new ("delete_event",
459 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
460 gtk_widget_marshal_signal_4,
463 widget_signals[DESTROY_EVENT] =
464 gtk_signal_new ("destroy_event",
467 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
468 gtk_widget_marshal_signal_4,
471 widget_signals[EXPOSE_EVENT] =
472 gtk_signal_new ("expose_event",
475 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
476 gtk_widget_marshal_signal_4,
479 widget_signals[KEY_PRESS_EVENT] =
480 gtk_signal_new ("key_press_event",
483 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
484 gtk_widget_marshal_signal_4,
487 widget_signals[KEY_RELEASE_EVENT] =
488 gtk_signal_new ("key_release_event",
491 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
492 gtk_widget_marshal_signal_4,
495 widget_signals[ENTER_NOTIFY_EVENT] =
496 gtk_signal_new ("enter_notify_event",
499 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
500 gtk_widget_marshal_signal_4,
503 widget_signals[LEAVE_NOTIFY_EVENT] =
504 gtk_signal_new ("leave_notify_event",
507 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
508 gtk_widget_marshal_signal_4,
511 widget_signals[CONFIGURE_EVENT] =
512 gtk_signal_new ("configure_event",
515 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
516 gtk_widget_marshal_signal_4,
519 widget_signals[FOCUS_IN_EVENT] =
520 gtk_signal_new ("focus_in_event",
523 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
524 gtk_widget_marshal_signal_4,
527 widget_signals[FOCUS_OUT_EVENT] =
528 gtk_signal_new ("focus_out_event",
531 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
532 gtk_widget_marshal_signal_4,
535 widget_signals[MAP_EVENT] =
536 gtk_signal_new ("map_event",
539 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
540 gtk_widget_marshal_signal_4,
543 widget_signals[UNMAP_EVENT] =
544 gtk_signal_new ("unmap_event",
547 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
548 gtk_widget_marshal_signal_4,
551 widget_signals[PROPERTY_NOTIFY_EVENT] =
552 gtk_signal_new ("property_notify_event",
555 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
556 gtk_widget_marshal_signal_4,
559 widget_signals[SELECTION_CLEAR_EVENT] =
560 gtk_signal_new ("selection_clear_event",
563 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
564 gtk_widget_marshal_signal_4,
567 widget_signals[SELECTION_REQUEST_EVENT] =
568 gtk_signal_new ("selection_request_event",
571 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
572 gtk_widget_marshal_signal_4,
575 widget_signals[SELECTION_NOTIFY_EVENT] =
576 gtk_signal_new ("selection_notify_event",
579 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
580 gtk_widget_marshal_signal_4,
583 widget_signals[SELECTION_RECEIVED] =
584 gtk_signal_new ("selection_received",
587 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
588 gtk_widget_marshal_signal_1,
590 GTK_TYPE_SELECTION_DATA);
591 widget_signals[PROXIMITY_IN_EVENT] =
592 gtk_signal_new ("proximity_in_event",
595 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
596 gtk_widget_marshal_signal_4,
599 widget_signals[PROXIMITY_OUT_EVENT] =
600 gtk_signal_new ("proximity_out_event",
603 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
604 gtk_widget_marshal_signal_4,
607 widget_signals[DRAG_BEGIN_EVENT] =
608 gtk_signal_new ("drag_begin_event",
611 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin_event),
612 gtk_widget_marshal_signal_4,
615 widget_signals[DRAG_REQUEST_EVENT] =
616 gtk_signal_new ("drag_request_event",
619 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_request_event),
620 gtk_widget_marshal_signal_4,
623 widget_signals[DRAG_END_EVENT] =
624 gtk_signal_new ("drag_end_event",
627 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end_event),
628 gtk_widget_marshal_signal_4,
631 widget_signals[DROP_ENTER_EVENT] =
632 gtk_signal_new ("drop_enter_event",
635 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_enter_event),
636 gtk_widget_marshal_signal_4,
639 widget_signals[DROP_LEAVE_EVENT] =
640 gtk_signal_new ("drop_leave_event",
643 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_leave_event),
644 gtk_widget_marshal_signal_4,
647 widget_signals[DROP_DATA_AVAILABLE_EVENT] =
648 gtk_signal_new ("drop_data_available_event",
651 GTK_SIGNAL_OFFSET (GtkWidgetClass,
652 drop_data_available_event),
653 gtk_widget_marshal_signal_4,
656 widget_signals[VISIBILITY_NOTIFY_EVENT] =
657 gtk_signal_new ("visibility_notify_event",
660 GTK_SIGNAL_OFFSET (GtkWidgetClass, visibility_notify_event),
661 gtk_widget_marshal_signal_4,
664 widget_signals[CLIENT_EVENT] =
665 gtk_signal_new ("client_event",
668 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
669 gtk_widget_marshal_signal_4,
672 widget_signals[NO_EXPOSE_EVENT] =
673 gtk_signal_new ("no_expose_event",
676 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
677 gtk_widget_marshal_signal_4,
680 widget_signals[OTHER_EVENT] =
681 gtk_signal_new ("other_event",
684 GTK_SIGNAL_OFFSET (GtkWidgetClass, other_event),
685 gtk_widget_marshal_signal_4,
689 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
691 object_class->set_arg = gtk_widget_set_arg;
692 object_class->get_arg = gtk_widget_get_arg;
693 object_class->shutdown = gtk_widget_shutdown;
694 object_class->destroy = gtk_widget_real_destroy;
695 object_class->finalize = gtk_widget_finalize;
697 klass->activate_signal = 0;
698 klass->show = gtk_widget_real_show;
699 klass->hide = gtk_widget_real_hide;
700 klass->show_all = gtk_widget_real_show;
701 klass->hide_all = gtk_widget_real_hide;
702 klass->map = gtk_widget_real_map;
703 klass->unmap = gtk_widget_real_unmap;
704 klass->realize = gtk_widget_real_realize;
705 klass->unrealize = gtk_widget_real_unrealize;
706 klass->draw = gtk_widget_real_draw;
707 klass->draw_focus = NULL;
708 klass->size_request = NULL;
709 klass->size_allocate = gtk_widget_real_size_allocate;
710 klass->state_changed = NULL;
711 klass->parent_set = NULL;
712 klass->style_set = gtk_widget_style_set;
713 klass->add_accelerator = (void*) gtk_accel_group_handle_add;
714 klass->remove_accelerator = (void*) gtk_accel_group_handle_remove;
716 klass->button_press_event = NULL;
717 klass->button_release_event = NULL;
718 klass->motion_notify_event = NULL;
719 klass->delete_event = NULL;
720 klass->destroy_event = NULL;
721 klass->expose_event = NULL;
722 klass->key_press_event = gtk_widget_real_key_press_event;
723 klass->key_release_event = NULL;
724 klass->enter_notify_event = NULL;
725 klass->leave_notify_event = NULL;
726 klass->configure_event = NULL;
727 klass->focus_in_event = NULL;
728 klass->focus_out_event = NULL;
729 klass->map_event = NULL;
730 klass->unmap_event = NULL;
731 klass->property_notify_event = gtk_selection_property_notify;
732 klass->selection_clear_event = gtk_selection_clear;
733 klass->selection_request_event = gtk_selection_request;
734 klass->selection_notify_event = gtk_selection_notify;
735 klass->selection_received = NULL;
736 klass->proximity_in_event = NULL;
737 klass->proximity_out_event = NULL;
738 klass->drag_begin_event = NULL;
739 klass->drag_request_event = NULL;
740 klass->drop_enter_event = NULL;
741 klass->drop_leave_event = NULL;
742 klass->drop_data_available_event = NULL;
743 klass->other_event = NULL;
744 klass->no_expose_event = NULL;
749 GtkBindingSet *binding_set;
751 binding_set = gtk_binding_set_by_class (klass);
752 gtk_binding_entry_add_signal (binding_set, '9', GDK_CONTROL_MASK, "hide", 0);
753 gtk_binding_entry_add_signal (binding_set, '9', GDK_CONTROL_MASK, "show", 0);
758 gtk_widget_set_arg (GtkObject *object,
764 widget = GTK_WIDGET (object);
771 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
774 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
777 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
780 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
783 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -1);
786 gtk_widget_set_usize (widget, -1, GTK_VALUE_INT (*arg));
789 if (GTK_VALUE_BOOL(*arg))
790 gtk_widget_show (widget);
792 gtk_widget_hide (widget);
795 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
798 saved_flags = GTK_WIDGET_FLAGS (widget);
799 if (GTK_VALUE_BOOL (*arg))
800 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
802 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
803 if (saved_flags != GTK_WIDGET_FLAGS (widget))
804 gtk_widget_queue_resize (widget);
807 if (GTK_VALUE_BOOL (*arg))
808 gtk_widget_grab_focus (widget);
810 case ARG_CAN_DEFAULT:
811 saved_flags = GTK_WIDGET_FLAGS (widget);
812 if (GTK_VALUE_BOOL (*arg))
813 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
815 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
816 if (saved_flags != GTK_WIDGET_FLAGS (widget))
817 gtk_widget_queue_resize (widget);
819 case ARG_HAS_DEFAULT:
820 if (GTK_VALUE_BOOL (*arg))
821 gtk_widget_grab_default (widget);
824 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
827 if (!GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_NO_WINDOW (widget))
828 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
830 case ARG_EXTENSION_EVENTS:
831 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
838 /*****************************************
839 * gtk_widget_get_arg:
844 *****************************************/
847 gtk_widget_get_arg (GtkObject *object,
853 widget = GTK_WIDGET (object);
857 GtkWidgetAuxInfo *aux_info;
859 GdkExtensionMode *modep;
863 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
865 GTK_VALUE_STRING (*arg) = g_strdup ("");
868 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
871 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
873 GTK_VALUE_INT (*arg) = -2;
875 GTK_VALUE_INT (*arg) = aux_info->x;
878 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
880 GTK_VALUE_INT (*arg) = -2;
882 GTK_VALUE_INT (*arg) = aux_info->y;
885 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
887 GTK_VALUE_INT (*arg) = -2;
889 GTK_VALUE_INT (*arg) = aux_info->width;
892 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
894 GTK_VALUE_INT (*arg) = -2;
896 GTK_VALUE_INT (*arg) = aux_info->height;
899 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_VISIBLE (widget) != FALSE);
902 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_SENSITIVE (widget) != FALSE);
905 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_FOCUS (widget) != FALSE);
908 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_FOCUS (widget) != FALSE);
910 case ARG_CAN_DEFAULT:
911 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_DEFAULT (widget) != FALSE);
913 case ARG_HAS_DEFAULT:
914 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
917 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
920 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
922 GTK_VALUE_FLAGS (*arg) = 0;
924 GTK_VALUE_FLAGS (*arg) = *eventp;
926 case ARG_EXTENSION_EVENTS:
927 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
929 GTK_VALUE_FLAGS (*arg) = 0;
931 GTK_VALUE_FLAGS (*arg) = *modep;
934 arg->type = GTK_TYPE_INVALID;
939 /*****************************************
945 *****************************************/
948 gtk_widget_init (GtkWidget *widget)
950 GdkColormap *colormap;
953 GTK_PRIVATE_FLAGS (widget) = 0;
954 widget->state = GTK_STATE_NORMAL;
955 widget->saved_state = GTK_STATE_NORMAL;
957 widget->requisition.width = 0;
958 widget->requisition.height = 0;
959 widget->allocation.x = -1;
960 widget->allocation.y = -1;
961 widget->allocation.width = 1;
962 widget->allocation.height = 1;
963 widget->window = NULL;
964 widget->parent = NULL;
966 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE | GTK_PARENT_SENSITIVE);
968 widget->style = gtk_widget_peek_style ();
969 gtk_style_ref (widget->style);
971 colormap = gtk_widget_peek_colormap ();
972 visual = gtk_widget_peek_visual ();
974 /* XXX - should we ref the colormap and visual, too? */
976 if (colormap != gtk_widget_get_default_colormap ())
978 /* gdk_colormap_ref (colormap); */
979 gtk_object_set_data (GTK_OBJECT (widget), colormap_key, colormap);
982 if (visual != gtk_widget_get_default_visual ())
984 /* gdk_visual_ref (visual); */
985 gtk_object_set_data (GTK_OBJECT (widget), visual_key, visual);
989 /*****************************************
995 *****************************************/
998 gtk_widget_new (guint type,
1007 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1009 obj = gtk_type_new (type);
1011 va_start (args1, type);
1012 va_start (args2, type);
1014 args = gtk_object_collect_args (&nargs, gtk_object_get_arg_type, args1, args2);
1015 gtk_object_setv (obj, nargs, args);
1021 return GTK_WIDGET (obj);
1024 /*****************************************
1030 *****************************************/
1033 gtk_widget_newv (guint type,
1037 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1039 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1042 /*****************************************
1048 *****************************************/
1051 gtk_widget_get (GtkWidget *widget,
1054 g_return_if_fail (widget != NULL);
1055 g_return_if_fail (arg != NULL);
1057 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1060 /*****************************************
1066 *****************************************/
1069 gtk_widget_getv (GtkWidget *widget,
1073 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1076 /*****************************************
1082 *****************************************/
1085 gtk_widget_set (GtkWidget *widget,
1093 g_return_if_fail (widget != NULL);
1095 va_start (args1, widget);
1096 va_start (args2, widget);
1098 args = gtk_object_collect_args (&nargs, gtk_object_get_arg_type, args1, args2);
1099 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1106 /*****************************************
1112 *****************************************/
1115 gtk_widget_setv (GtkWidget *widget,
1119 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1122 /*****************************************
1123 * gtk_widget_unparent:
1124 * do any cleanup necessary necessary
1125 * for setting parent = NULL.
1130 *****************************************/
1133 gtk_widget_unparent (GtkWidget *widget)
1135 GtkWidget *toplevel;
1136 GtkWidget *old_parent;
1138 g_return_if_fail (widget != NULL);
1139 if (widget->parent == NULL)
1142 /* keep this function in sync with gtk_menu_detach()
1145 /* unset focused and default children properly, this code
1146 * should eventually move into some gtk_window_unparent_branch() or
1149 toplevel = gtk_widget_get_toplevel (widget);
1150 if (GTK_CONTAINER (widget->parent)->focus_child == widget)
1152 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL);
1154 if (GTK_IS_WINDOW (toplevel))
1158 child = GTK_WINDOW (toplevel)->focus_widget;
1160 while (child && child != widget)
1161 child = child->parent;
1163 if (child == widget)
1164 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1167 if (GTK_IS_WINDOW (toplevel))
1171 child = GTK_WINDOW (toplevel)->default_widget;
1173 while (child && child != widget)
1174 child = child->parent;
1176 if (child == widget)
1177 gtk_window_set_default (GTK_WINDOW (toplevel), NULL);
1180 if (GTK_IS_RESIZE_CONTAINER (widget))
1181 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1183 /* Remove the widget and all its children from any ->resize_widgets list
1184 * of all the parents in our branch. This code should move into gtkcontainer.c
1185 * somwhen, since we mess around with ->resize_widgets, which is
1186 * actually not of our business.
1188 * Two ways to make this prettier:
1189 * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer))
1190 * Change resize_widgets to a GList
1192 toplevel = widget->parent;
1198 if (!GTK_CONTAINER (toplevel)->resize_widgets)
1200 toplevel = toplevel->parent;
1205 slist = GTK_CONTAINER (toplevel)->resize_widgets;
1217 while (parent && (parent != widget))
1218 parent = parent->parent;
1220 if (parent == widget)
1222 GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED);
1228 /* it is really messy to have this signal disconnection
1229 * in gtkwidget.c, the resize_widgets invariants should
1230 * all be taken care off by gtkcontainer.c exclusively.
1233 gtk_signal_disconnect_by_func (GTK_OBJECT (toplevel),
1234 GTK_SIGNAL_FUNC (gtk_container_clear_resize_widgets),
1236 GTK_CONTAINER (toplevel)->resize_widgets = slist;
1239 g_slist_free_1 (last);
1245 toplevel = toplevel->parent;
1248 if (widget->window &&
1249 GTK_WIDGET_NO_WINDOW (widget) &&
1250 GTK_WIDGET_DRAWABLE (widget))
1251 gdk_window_clear_area (widget->window,
1252 widget->allocation.x,
1253 widget->allocation.y,
1254 widget->allocation.width,
1255 widget->allocation.height);
1257 /* Reset the width and height here, to force reallocation if we
1258 * get added back to a new parent. This won't work if our new
1259 * allocation is smaller than 1x1 and we actually want a size of 1x1...
1260 * (would 0x0 be OK here?)
1262 widget->allocation.width = 1;
1263 widget->allocation.height = 1;
1265 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1266 gtk_widget_unrealize (widget);
1268 old_parent = widget->parent;
1269 widget->parent = NULL;
1270 gtk_widget_set_parent_window (widget, NULL);
1271 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1273 gtk_widget_unref (widget);
1276 /*****************************************
1277 * gtk_widget_destroy:
1282 *****************************************/
1285 gtk_widget_destroy (GtkWidget *widget)
1287 g_return_if_fail (widget != NULL);
1288 g_return_if_fail (GTK_IS_WIDGET (widget));
1290 gtk_object_destroy ((GtkObject*) widget);
1293 /*****************************************
1294 * gtk_widget_destroyed:
1295 * Utility function: sets widget_pointer
1296 * to NULL when widget is destroyed.
1301 *****************************************/
1304 gtk_widget_destroyed (GtkWidget *widget,
1305 GtkWidget **widget_pointer)
1307 /* Don't make any assumptions about the
1309 * Even check widget_pointer.
1312 *widget_pointer = NULL;
1315 /*****************************************
1321 *****************************************/
1324 gtk_widget_show (GtkWidget *widget)
1326 g_return_if_fail (widget != NULL);
1328 if (!GTK_WIDGET_VISIBLE (widget))
1329 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1333 /*************************************************************
1334 * gtk_widget_show_now:
1335 * Show a widget, and if it is an unmapped toplevel widget
1336 * wait for the map_event before returning
1338 * Warning: This routine will call the main loop recursively.
1343 *************************************************************/
1346 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
1349 gtk_signal_disconnect_by_data (GTK_OBJECT (widget), flag);
1353 gtk_widget_show_now (GtkWidget *widget)
1357 /* make sure we will get event */
1358 if (!GTK_WIDGET_MAPPED (widget) &&
1359 GTK_WIDGET_TOPLEVEL (widget))
1361 gtk_widget_show (widget);
1363 gtk_signal_connect (GTK_OBJECT (widget), "map_event",
1364 GTK_SIGNAL_FUNC (gtk_widget_show_map_callback),
1368 gtk_main_iteration();
1371 gtk_widget_show (widget);
1374 /*****************************************
1380 *****************************************/
1383 gtk_widget_hide (GtkWidget *widget)
1385 g_return_if_fail (widget != NULL);
1386 g_return_if_fail (GTK_IS_WIDGET (widget));
1388 if (GTK_WIDGET_VISIBLE (widget))
1389 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1393 gtk_widget_hide_on_delete (GtkWidget *widget)
1395 g_return_val_if_fail (widget != NULL, FALSE);
1396 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
1398 gtk_widget_hide (widget);
1403 /*****************************************
1404 * gtk_widget_show_all:
1406 * Shows the widget and all children.
1408 * Container classes overwrite
1409 * show_all and hide_all to call
1410 * show_all (hide_all) on both themselves
1411 * and on their child widgets.
1416 *****************************************/
1419 gtk_widget_show_all (GtkWidget *widget)
1421 GtkWidgetClass *widget_class;
1423 g_return_if_fail (widget != NULL);
1425 /* show_all shouldn't be invoked through a signal,
1426 because in this case it would be quite slow - there would
1427 be a show and show_all signal emitted for every child widget.
1429 widget_class = GTK_WIDGET_CLASS(GTK_OBJECT(widget)->klass);
1430 widget_class->show_all (widget);
1433 /*****************************************
1434 * gtk_widget_hide_all:
1436 * Hides the widget and all children.
1437 * See gtk_widget_show_all.
1442 *****************************************/
1445 gtk_widget_hide_all (GtkWidget *widget)
1447 g_return_if_fail (widget != NULL);
1448 g_assert (widget->parent);
1450 GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass)->hide_all (widget);
1453 /*****************************************
1459 *****************************************/
1462 gtk_widget_map (GtkWidget *widget)
1464 g_return_if_fail (widget != NULL);
1466 if (!GTK_WIDGET_MAPPED (widget))
1468 if (!GTK_WIDGET_REALIZED (widget))
1469 gtk_widget_realize (widget);
1471 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1475 /*****************************************
1481 *****************************************/
1484 gtk_widget_unmap (GtkWidget *widget)
1486 g_return_if_fail (widget != NULL);
1488 if (GTK_WIDGET_MAPPED (widget))
1489 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1492 /*****************************************
1493 * gtk_widget_realize:
1498 *****************************************/
1501 gtk_widget_realize (GtkWidget *widget)
1504 GdkExtensionMode mode;
1505 GtkWidgetShapeInfo *shape_info;
1507 g_return_if_fail (widget != NULL);
1509 if (!GTK_WIDGET_REALIZED (widget))
1512 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1513 g_print ("%s\n", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1516 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1517 gtk_widget_realize (widget->parent);
1519 gtk_widget_ensure_style (widget);
1521 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1523 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1525 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1527 gdk_window_shape_combine_mask (widget->window,
1528 shape_info->shape_mask,
1529 shape_info->offset_x,
1530 shape_info->offset_y);
1533 if (!GTK_WIDGET_NO_WINDOW (widget))
1535 mode = gtk_widget_get_extension_events (widget);
1536 if (mode != GDK_EXTENSION_EVENTS_NONE)
1538 events = gtk_widget_get_events (widget);
1539 gdk_input_set_extension_events (widget->window, events, mode);
1546 /*****************************************
1547 * gtk_widget_unrealize:
1552 *****************************************/
1555 gtk_widget_unrealize (GtkWidget *widget)
1557 g_return_if_fail (widget != NULL);
1559 if (GTK_WIDGET_REDRAW_PENDING (widget))
1561 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1562 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1565 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1566 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
1568 if (GTK_WIDGET_REALIZED (widget))
1570 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1571 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
1575 /*****************************************
1576 * gtk_widget_queue_draw:
1581 *****************************************/
1584 gtk_widget_idle_draw (gpointer data)
1586 while (gtk_widget_redraw_queue)
1587 gtk_widget_draw (gtk_widget_redraw_queue->data, NULL);
1593 gtk_widget_queue_draw (GtkWidget *widget)
1597 g_return_if_fail (widget != NULL);
1599 if (GTK_WIDGET_DRAWABLE (widget))
1601 /* We queue the redraw if:
1602 * a) the widget is not already queued for redraw and
1603 * b) non of the widgets ancestors are queued for redraw.
1608 if (GTK_WIDGET_REDRAW_PENDING (parent))
1610 parent = parent->parent;
1613 GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_PENDING);
1614 if (gtk_widget_redraw_queue == NULL)
1615 gtk_idle_add_priority (GTK_PRIORITY_INTERNAL,
1616 gtk_widget_idle_draw,
1619 gtk_widget_redraw_queue = g_slist_prepend (gtk_widget_redraw_queue, widget);
1624 gtk_widget_queue_resize (GtkWidget *widget)
1626 g_return_if_fail (widget != NULL);
1627 g_return_if_fail (GTK_IS_WIDGET (widget));
1629 if (GTK_IS_RESIZE_CONTAINER (widget))
1630 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1633 gtk_container_queue_resize (GTK_CONTAINER (widget->parent));
1634 else if (GTK_WIDGET_TOPLEVEL (widget))
1635 gtk_container_queue_resize (GTK_CONTAINER (widget));
1638 /*****************************************
1644 *****************************************/
1647 gtk_widget_draw (GtkWidget *widget,
1650 GdkRectangle temp_area;
1652 g_return_if_fail (widget != NULL);
1654 if (GTK_WIDGET_REDRAW_PENDING (widget))
1656 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1657 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1662 if (GTK_WIDGET_DRAWABLE (widget))
1666 if (GTK_WIDGET_NO_WINDOW (widget))
1668 temp_area.x = widget->allocation.x;
1669 temp_area.y = widget->allocation.y;
1677 temp_area.width = widget->allocation.width;
1678 temp_area.height = widget->allocation.height;
1682 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
1686 /*****************************************
1687 * gtk_widget_draw_focus:
1692 *****************************************/
1695 gtk_widget_draw_focus (GtkWidget *widget)
1697 g_return_if_fail (widget != NULL);
1699 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
1702 /*****************************************
1703 * gtk_widget_draw_default:
1708 *****************************************/
1711 gtk_widget_draw_default (GtkWidget *widget)
1713 g_return_if_fail (widget != NULL);
1715 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
1718 /*****************************************
1719 * gtk_widget_draw_children:
1724 *****************************************/
1727 gtk_widget_draw_children (GtkWidget *widget)
1729 g_return_if_fail (widget != NULL);
1731 if (GTK_IS_CONTAINER (widget))
1732 gtk_container_foreach (GTK_CONTAINER (widget),
1733 gtk_widget_draw_children_recurse,
1737 /*****************************************
1738 * gtk_widget_size_request:
1743 *****************************************/
1746 gtk_widget_size_request (GtkWidget *widget,
1747 GtkRequisition *requisition)
1749 GtkWidgetAuxInfo *aux_info;
1751 g_return_if_fail (widget != NULL);
1753 gtk_widget_ref (widget);
1754 gtk_widget_ensure_style (widget);
1755 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
1757 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1760 if (aux_info->width > 0)
1761 requisition->width = aux_info->width;
1762 if (aux_info->height > 0)
1763 requisition->height = aux_info->height;
1765 gtk_widget_unref (widget);
1768 /*****************************************
1769 * gtk_widget_size_allocate:
1774 *****************************************/
1777 gtk_widget_size_allocate (GtkWidget *widget,
1778 GtkAllocation *allocation)
1780 GtkWidgetAuxInfo *aux_info;
1781 GtkAllocation real_allocation;
1783 g_return_if_fail (widget != NULL);
1785 real_allocation = *allocation;
1786 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1790 if (aux_info->x != -1)
1791 real_allocation.x = aux_info->x;
1792 if (aux_info->y != -1)
1793 real_allocation.y = aux_info->y;
1796 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
1800 gtk_widget_stop_add_accelerator (GtkWidget *widget)
1802 g_return_if_fail (widget != NULL);
1803 g_return_if_fail (GTK_IS_WIDGET (widget));
1805 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
1809 gtk_widget_stop_remove_accelerator (GtkWidget *widget)
1811 g_return_if_fail (widget != NULL);
1812 g_return_if_fail (GTK_IS_WIDGET (widget));
1814 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR]);
1818 gtk_widget_freeze_accelerators (GtkWidget *widget)
1820 g_return_if_fail (widget != NULL);
1821 g_return_if_fail (GTK_IS_WIDGET (widget));
1823 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
1824 widget_signals[ADD_ACCELERATOR],
1826 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1829 gtk_signal_connect (GTK_OBJECT (widget),
1831 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1833 gtk_signal_connect (GTK_OBJECT (widget),
1834 "remove_accelerator",
1835 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
1841 gtk_widget_thaw_accelerators (GtkWidget *widget)
1843 g_return_if_fail (widget != NULL);
1844 g_return_if_fail (GTK_IS_WIDGET (widget));
1846 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
1847 widget_signals[ADD_ACCELERATOR],
1849 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1852 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
1853 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1855 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
1856 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
1862 gtk_widget_add_accelerator (GtkWidget *widget,
1863 const gchar *accel_signal,
1864 GtkAccelGroup *accel_group,
1867 GtkAccelFlags accel_flags)
1869 g_return_if_fail (widget != NULL);
1870 g_return_if_fail (GTK_IS_WIDGET (widget));
1871 g_return_if_fail (accel_group != NULL);
1873 gtk_accel_group_add (accel_group,
1877 (GtkObject*) widget,
1882 gtk_widget_remove_accelerator (GtkWidget *widget,
1883 GtkAccelGroup *accel_group,
1887 g_return_if_fail (widget != NULL);
1888 g_return_if_fail (GTK_IS_WIDGET (widget));
1889 g_return_if_fail (accel_group != NULL);
1891 gtk_accel_group_remove (accel_group,
1894 (GtkObject*) widget);
1898 gtk_widget_remove_accelerators (GtkWidget *widget,
1899 const gchar *accel_signal,
1900 gboolean visible_only)
1905 g_return_if_fail (widget != NULL);
1906 g_return_if_fail (GTK_IS_WIDGET (widget));
1907 g_return_if_fail (accel_signal != NULL);
1909 signal_id = gtk_signal_lookup (accel_signal, GTK_OBJECT_TYPE (widget));
1910 g_return_if_fail (signal_id != 0);
1912 slist = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
1915 GtkAccelEntry *ac_entry;
1917 ac_entry = slist->data;
1918 slist = slist->next;
1919 if (ac_entry->accel_flags & GTK_ACCEL_VISIBLE &&
1920 ac_entry->signal_id == signal_id)
1921 gtk_widget_remove_accelerator (GTK_WIDGET (widget),
1922 ac_entry->accel_group,
1923 ac_entry->accelerator_key,
1924 ac_entry->accelerator_mods);
1929 gtk_widget_accelerator_signal (GtkWidget *widget,
1930 GtkAccelGroup *accel_group,
1934 GtkAccelEntry *ac_entry;
1936 g_return_val_if_fail (widget != NULL, 0);
1937 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
1938 g_return_val_if_fail (accel_group != NULL, 0);
1940 ac_entry = gtk_accel_group_get_entry (accel_group, accel_key, accel_mods);
1942 if (ac_entry && ac_entry->object == (GtkObject*) widget)
1943 return ac_entry->signal_id;
1948 gtk_widget_real_key_press_event (GtkWidget *widget,
1951 gboolean handled = FALSE;
1953 g_return_val_if_fail (widget != NULL, handled);
1954 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
1955 g_return_val_if_fail (event != NULL, handled);
1958 handled = gtk_bindings_activate (GTK_OBJECT (widget),
1959 event->keyval, event->state);
1964 /*****************************************
1970 *****************************************/
1973 gtk_widget_event (GtkWidget *widget,
1979 g_return_val_if_fail (widget != NULL, TRUE);
1981 gtk_widget_ref (widget);
1983 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
1985 if (return_val || GTK_OBJECT_DESTROYED (widget))
1987 gtk_widget_unref (widget);
1991 switch (event->type)
1996 case GDK_BUTTON_PRESS:
1997 case GDK_2BUTTON_PRESS:
1998 case GDK_3BUTTON_PRESS:
1999 signal_num = BUTTON_PRESS_EVENT;
2001 case GDK_BUTTON_RELEASE:
2002 signal_num = BUTTON_RELEASE_EVENT;
2004 case GDK_MOTION_NOTIFY:
2005 signal_num = MOTION_NOTIFY_EVENT;
2008 signal_num = DELETE_EVENT;
2011 signal_num = DESTROY_EVENT;
2014 signal_num = KEY_PRESS_EVENT;
2016 case GDK_KEY_RELEASE:
2017 signal_num = KEY_RELEASE_EVENT;
2019 case GDK_ENTER_NOTIFY:
2020 signal_num = ENTER_NOTIFY_EVENT;
2022 case GDK_LEAVE_NOTIFY:
2023 signal_num = LEAVE_NOTIFY_EVENT;
2025 case GDK_FOCUS_CHANGE:
2026 if (event->focus_change.in)
2027 signal_num = FOCUS_IN_EVENT;
2029 signal_num = FOCUS_OUT_EVENT;
2032 signal_num = CONFIGURE_EVENT;
2035 signal_num = MAP_EVENT;
2038 signal_num = UNMAP_EVENT;
2040 case GDK_PROPERTY_NOTIFY:
2041 signal_num = PROPERTY_NOTIFY_EVENT;
2043 case GDK_SELECTION_CLEAR:
2044 signal_num = SELECTION_CLEAR_EVENT;
2046 case GDK_SELECTION_REQUEST:
2047 signal_num = SELECTION_REQUEST_EVENT;
2049 case GDK_SELECTION_NOTIFY:
2050 signal_num = SELECTION_NOTIFY_EVENT;
2052 case GDK_PROXIMITY_IN:
2053 signal_num = PROXIMITY_IN_EVENT;
2055 case GDK_PROXIMITY_OUT:
2056 signal_num = PROXIMITY_OUT_EVENT;
2058 case GDK_DRAG_BEGIN:
2059 signal_num = DRAG_BEGIN_EVENT;
2061 case GDK_DRAG_REQUEST:
2062 signal_num = DRAG_REQUEST_EVENT;
2064 case GDK_DROP_ENTER:
2065 signal_num = DROP_ENTER_EVENT;
2067 case GDK_DROP_LEAVE:
2068 signal_num = DROP_LEAVE_EVENT;
2070 case GDK_DROP_DATA_AVAIL:
2071 signal_num = DROP_DATA_AVAILABLE_EVENT;
2073 case GDK_OTHER_EVENT:
2074 signal_num = OTHER_EVENT;
2077 signal_num = NO_EXPOSE_EVENT;
2079 case GDK_CLIENT_EVENT:
2080 signal_num = CLIENT_EVENT;
2083 /* there is no sense in providing a widget with bogus expose events
2085 if (!event->any.window)
2087 gtk_widget_unref (widget);
2090 signal_num = EXPOSE_EVENT;
2092 case GDK_VISIBILITY_NOTIFY:
2093 signal_num = VISIBILITY_NOTIFY_EVENT;
2096 g_warning ("could not determine signal number for event: %d", event->type);
2097 gtk_widget_unref (widget);
2101 if (signal_num != -1)
2102 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
2104 return_val |= GTK_OBJECT_DESTROYED (widget);
2106 gtk_widget_unref (widget);
2111 /*****************************************
2112 * gtk_widget_activate:
2117 *****************************************/
2120 gtk_widget_activate (GtkWidget *widget)
2122 g_return_if_fail (widget != NULL);
2123 g_return_if_fail (GTK_IS_WIDGET (widget));
2125 if (WIDGET_CLASS (widget)->activate_signal)
2126 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
2129 /*****************************************
2130 * gtk_widget_reparent_container_child:
2131 * assistent function to gtk_widget_reparent
2136 *****************************************/
2139 gtk_widget_reparent_container_child(GtkWidget *widget,
2140 gpointer client_data)
2142 g_return_if_fail (widget != NULL);
2143 g_return_if_fail (client_data != NULL);
2145 if (GTK_WIDGET_NO_WINDOW (widget))
2148 gdk_window_unref (widget->window);
2149 widget->window = (GdkWindow*) client_data;
2151 gdk_window_ref (widget->window);
2153 if (GTK_IS_CONTAINER (widget))
2154 gtk_container_foreach (GTK_CONTAINER (widget),
2155 gtk_widget_reparent_container_child,
2159 gdk_window_reparent (widget->window,
2160 (GdkWindow*) client_data, 0, 0);
2163 /*****************************************
2164 * gtk_widget_reparent:
2169 *****************************************/
2172 gtk_widget_reparent (GtkWidget *widget,
2173 GtkWidget *new_parent)
2175 g_return_if_fail (widget != NULL);
2176 g_return_if_fail (GTK_IS_WIDGET (widget));
2177 g_return_if_fail (new_parent != NULL);
2178 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
2179 g_return_if_fail (widget->parent != NULL);
2181 if (widget->parent != new_parent)
2183 /* First try to see if we can get away without unrealizing
2184 * the widget as we reparent it. if so we set a flag so
2185 * that gtk_widget_unparent doesn't unrealize widget
2187 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
2188 GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
2190 gtk_widget_ref (widget);
2191 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
2192 gtk_container_add (GTK_CONTAINER (new_parent), widget);
2193 gtk_widget_unref (widget);
2195 if (GTK_WIDGET_IN_REPARENT (widget))
2197 GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
2199 /* OK, now fix up the widget's window. (And that for any
2200 * children, if the widget is NO_WINDOW and a container)
2202 if (GTK_WIDGET_NO_WINDOW (widget))
2204 if (GTK_IS_CONTAINER (widget))
2205 gtk_container_foreach (GTK_CONTAINER (widget),
2206 gtk_widget_reparent_container_child,
2207 gtk_widget_get_parent_window (widget));
2210 GdkWindow *parent_window;
2212 parent_window = gtk_widget_get_parent_window (widget);
2213 if (parent_window != widget->window)
2216 gdk_window_unref (widget->window);
2217 widget->window = parent_window;
2219 gdk_window_ref (widget->window);
2224 gdk_window_reparent (widget->window, gtk_widget_get_parent_window (widget), 0, 0);
2229 /*****************************************
2235 *****************************************/
2238 gtk_widget_popup (GtkWidget *widget,
2242 g_return_if_fail (widget != NULL);
2244 if (!GTK_WIDGET_VISIBLE (widget))
2246 if (!GTK_WIDGET_REALIZED (widget))
2247 gtk_widget_realize (widget);
2248 if (!GTK_WIDGET_NO_WINDOW (widget))
2249 gdk_window_move (widget->window, x, y);
2250 gtk_widget_show (widget);
2254 /*****************************************
2255 * gtk_widget_intersect:
2260 *****************************************/
2263 gtk_widget_intersect (GtkWidget *widget,
2265 GdkRectangle *intersection)
2271 g_return_val_if_fail (widget != NULL, FALSE);
2272 g_return_val_if_fail (area != NULL, FALSE);
2275 dest = intersection;
2279 return_val = gdk_rectangle_intersect ((GdkRectangle*) &widget->allocation, area, dest);
2281 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2283 intersection->x -= widget->allocation.x;
2284 intersection->y -= widget->allocation.y;
2292 gtk_widget_basic (GtkWidget *widget)
2298 g_return_val_if_fail (widget != NULL, FALSE);
2300 if (!GTK_WIDGET_BASIC (widget))
2302 else if (GTK_IS_CONTAINER (widget))
2304 children = gtk_container_children (GTK_CONTAINER (widget));
2308 tmp_list = children;
2312 if (!gtk_widget_basic (GTK_WIDGET (tmp_list->data)))
2318 tmp_list = tmp_list->next;
2321 g_list_free (children);
2330 /*****************************************
2331 * gtk_widget_grab_focus:
2336 *****************************************/
2339 gtk_widget_grab_focus (GtkWidget *widget)
2341 g_return_if_fail (widget != NULL);
2342 g_return_if_fail (GTK_IS_WIDGET (widget));
2344 if (GTK_WIDGET_CAN_FOCUS (widget))
2348 GtkType window_type;
2350 window_type = gtk_window_get_type ();
2351 parent = widget->parent;
2354 while (parent && !gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2356 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2358 parent = parent->parent;
2361 if (parent && gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2363 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2364 gtk_window_set_focus (GTK_WINDOW (parent), widget);
2369 /*****************************************
2370 * gtk_widget_grab_default:
2375 *****************************************/
2378 gtk_widget_grab_default (GtkWidget *widget)
2381 GtkType window_type;
2383 g_return_if_fail (widget != NULL);
2384 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
2386 window_type = gtk_window_get_type ();
2387 window = widget->parent;
2389 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2390 window = window->parent;
2392 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2393 gtk_window_set_default (GTK_WINDOW (window), widget);
2396 /*****************************************
2397 * gtk_widget_set_name:
2402 *****************************************/
2405 gtk_widget_set_name (GtkWidget *widget,
2408 g_return_if_fail (widget != NULL);
2411 g_free (widget->name);
2412 widget->name = g_strdup (name);
2414 if (!GTK_WIDGET_USER_STYLE (widget))
2415 gtk_widget_set_rc_style (widget);
2418 /*****************************************
2419 * gtk_widget_get_name:
2424 *****************************************/
2427 gtk_widget_get_name (GtkWidget *widget)
2429 g_return_val_if_fail (widget != NULL, NULL);
2432 return widget->name;
2433 return gtk_type_name (GTK_WIDGET_TYPE (widget));
2436 /*****************************************
2437 * gtk_widget_set_state:
2444 *****************************************/
2447 gtk_widget_set_state (GtkWidget *widget,
2450 g_return_if_fail (widget != NULL);
2451 g_return_if_fail (GTK_IS_WIDGET (widget));
2453 if (state == GTK_WIDGET_STATE (widget))
2456 if (state == GTK_STATE_INSENSITIVE)
2457 gtk_widget_set_sensitive (widget, FALSE);
2463 data.state_restauration = FALSE;
2465 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2467 data.parent_sensitive = TRUE;
2469 gtk_widget_propagate_state (widget, &data);
2470 gtk_widget_queue_draw (widget);
2474 /*****************************************
2475 * gtk_widget_set_sensitive:
2479 * boolean value for sensitivity
2482 *****************************************/
2485 gtk_widget_set_sensitive (GtkWidget *widget,
2490 g_return_if_fail (widget != NULL);
2491 g_return_if_fail (GTK_IS_WIDGET (widget));
2493 sensitive = (sensitive != FALSE);
2495 if (sensitive == (GTK_WIDGET_SENSITIVE (widget) != FALSE))
2500 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
2501 data.state = GTK_WIDGET_SAVED_STATE (widget);
2505 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
2506 data.state = GTK_WIDGET_STATE (widget);
2508 data.state_restauration = TRUE;
2511 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2513 data.parent_sensitive = TRUE;
2515 gtk_widget_propagate_state (widget, &data);
2516 gtk_widget_queue_draw (widget);
2519 /*****************************************
2520 * gtk_widget_set_parent:
2525 *****************************************/
2528 gtk_widget_set_parent (GtkWidget *widget,
2533 g_return_if_fail (widget != NULL);
2534 g_return_if_fail (widget->parent == NULL);
2535 g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
2536 g_return_if_fail (parent != NULL);
2537 g_return_if_fail (widget != parent);
2539 /* keep this function in sync with gtk_menu_attach_to_widget()
2542 gtk_widget_ref (widget);
2543 gtk_object_sink (GTK_OBJECT (widget));
2544 widget->parent = parent;
2546 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
2547 data.state = GTK_WIDGET_STATE (parent);
2549 data.state = GTK_WIDGET_STATE (widget);
2550 data.state_restauration = FALSE;
2551 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (parent) != FALSE);
2553 gtk_widget_propagate_state (widget, &data);
2555 gtk_widget_set_style_recurse (widget, NULL);
2557 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
2560 /*****************************************
2562 * see docs/styles.txt
2563 *****************************************/
2565 gtk_widget_set_style (GtkWidget *widget,
2568 GtkStyle *default_style;
2569 gboolean initial_emission;
2571 g_return_if_fail (widget != NULL);
2572 g_return_if_fail (style != NULL);
2574 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2576 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
2577 GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
2579 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2582 gtk_style_ref (widget->style);
2583 if (!saved_default_style_key_id)
2584 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2585 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2588 gtk_widget_set_style_internal (widget, style, initial_emission);
2592 gtk_widget_ensure_style (GtkWidget *widget)
2594 if (!GTK_WIDGET_USER_STYLE (widget) &&
2595 !GTK_WIDGET_RC_STYLE (widget))
2596 gtk_widget_set_rc_style (widget);
2600 gtk_widget_set_rc_style (GtkWidget *widget)
2602 GtkStyle *saved_style;
2603 GtkStyle *new_style;
2604 gboolean initial_emission;
2606 g_return_if_fail (widget != NULL);
2608 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2610 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2611 GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
2613 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2614 new_style = gtk_rc_get_style (widget);
2619 gtk_style_ref (widget->style);
2620 if (!saved_default_style_key_id)
2621 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2622 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2624 gtk_widget_set_style_internal (widget, new_style, initial_emission);
2630 g_assert (initial_emission == FALSE); /* FIXME: remove this line */
2632 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2633 gtk_widget_set_style_internal (widget, saved_style, initial_emission);
2634 gtk_style_unref (saved_style);
2638 if (initial_emission)
2639 gtk_widget_set_style_internal (widget, widget->style, TRUE);
2645 gtk_widget_restore_default_style (GtkWidget *widget)
2647 GtkStyle *default_style;
2649 g_return_if_fail (widget != NULL);
2651 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2653 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2656 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2657 gtk_widget_set_style_internal (widget, default_style, FALSE);
2658 gtk_style_unref (default_style);
2663 gtk_widget_get_style (GtkWidget *widget)
2665 g_return_val_if_fail (widget != NULL, NULL);
2667 return widget->style;
2671 gtk_widget_style_set (GtkWidget *widget,
2672 GtkStyle *previous_style)
2674 if (GTK_WIDGET_REALIZED (widget) &&
2675 !GTK_WIDGET_NO_WINDOW (widget))
2677 gtk_style_set_background (widget->style, widget->window, widget->state);
2678 if (GTK_WIDGET_DRAWABLE (widget))
2679 gdk_window_clear (widget->window);
2684 gtk_widget_set_style_internal (GtkWidget *widget,
2686 gboolean initial_emission)
2688 g_return_if_fail (widget != NULL);
2689 g_return_if_fail (style != NULL);
2691 if (widget->style != style)
2693 GtkStyle *previous_style;
2695 if (GTK_WIDGET_REALIZED (widget))
2696 gtk_style_detach (widget->style);
2698 previous_style = widget->style;
2699 widget->style = style;
2700 gtk_style_ref (widget->style);
2702 if (GTK_WIDGET_REALIZED (widget))
2703 widget->style = gtk_style_attach (widget->style, widget->window);
2705 gtk_signal_emit (GTK_OBJECT (widget),
2706 widget_signals[STYLE_SET],
2707 initial_emission ? NULL : previous_style);
2708 gtk_style_unref (previous_style);
2710 if (widget->parent && !initial_emission)
2712 GtkRequisition old_requisition;
2714 old_requisition = widget->requisition;
2715 gtk_widget_size_request (widget, &widget->requisition);
2717 if ((old_requisition.width != widget->requisition.width) ||
2718 (old_requisition.height != widget->requisition.height))
2719 gtk_widget_queue_resize (widget);
2720 else if (GTK_WIDGET_DRAWABLE (widget))
2721 gtk_widget_queue_draw (widget);
2724 else if (initial_emission)
2726 gtk_signal_emit (GTK_OBJECT (widget),
2727 widget_signals[STYLE_SET],
2733 gtk_widget_set_style_recurse (GtkWidget *widget,
2734 gpointer client_data)
2736 if (GTK_WIDGET_RC_STYLE (widget))
2737 gtk_widget_set_rc_style (widget);
2739 if (GTK_IS_CONTAINER (widget))
2740 gtk_container_foreach (GTK_CONTAINER (widget),
2741 gtk_widget_set_style_recurse,
2746 gtk_widget_reset_rc_styles (GtkWidget *widget)
2748 gtk_widget_set_style_recurse (widget, NULL);
2752 gtk_widget_set_default_style (GtkStyle *style)
2754 if (style != default_style)
2757 gtk_style_unref (default_style);
2758 default_style = style;
2760 gtk_style_ref (default_style);
2765 gtk_widget_get_default_style (void)
2769 default_style = gtk_style_new ();
2770 gtk_style_ref (default_style);
2773 return default_style;
2777 gtk_widget_push_style (GtkStyle *style)
2779 g_return_if_fail (style != NULL);
2781 gtk_style_ref (style);
2782 style_stack = g_slist_prepend (style_stack, style);
2786 gtk_widget_peek_style (void)
2789 return (GtkStyle*) style_stack->data;
2791 return gtk_widget_get_default_style ();
2795 gtk_widget_pop_style (void)
2802 style_stack = style_stack->next;
2803 gtk_style_unref ((GtkStyle*) tmp->data);
2804 g_slist_free_1 (tmp);
2808 /*************************************************************
2809 * gtk_widget_set_parent_window:
2810 * Set a non default parent window for widget
2817 *************************************************************/
2820 gtk_widget_set_parent_window (GtkWidget *widget,
2821 GdkWindow *parent_window)
2823 GdkWindow *old_parent_window;
2825 g_return_if_fail (widget != NULL);
2827 old_parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2828 parent_window_key_id);
2830 if (parent_window != old_parent_window)
2832 if (!parent_window_key_id)
2833 parent_window_key_id = g_quark_from_static_string (parent_window_key);
2834 gtk_object_set_data_by_id (GTK_OBJECT (widget), parent_window_key_id,
2836 if (old_parent_window)
2837 gdk_window_unref (old_parent_window);
2839 gdk_window_ref (parent_window);
2843 /*************************************************************
2844 * gtk_widget_get_parent_window:
2845 * Get widget's parent window
2852 *************************************************************/
2855 gtk_widget_get_parent_window (GtkWidget *widget)
2857 GdkWindow *parent_window;
2859 g_return_val_if_fail (widget != NULL, NULL);
2860 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
2861 g_return_val_if_fail (widget->parent != NULL, NULL);
2863 parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2864 parent_window_key_id);
2866 return (parent_window != NULL) ? parent_window : widget->parent->window;
2869 /*****************************************
2870 * gtk_widget_set_uposition:
2875 *****************************************/
2878 gtk_widget_set_uposition (GtkWidget *widget,
2882 GtkWidgetAuxInfo *aux_info;
2884 g_return_if_fail (widget != NULL);
2886 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2889 if (!aux_info_key_id)
2890 aux_info_key_id = g_quark_from_static_string (aux_info_key);
2891 aux_info = gtk_widget_aux_info_new ();
2892 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2900 if (GTK_WIDGET_REALIZED (widget) && GTK_IS_WINDOW (widget) &&
2901 (aux_info->x != -1) && (aux_info->y != -1))
2903 gdk_window_set_hints (widget->window, aux_info->x, aux_info->y, 0, 0, 0, 0, GDK_HINT_POS);
2904 gdk_window_move (widget->window, aux_info->x, aux_info->y);
2907 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
2908 gtk_widget_size_allocate (widget, &widget->allocation);
2911 /*****************************************
2912 * gtk_widget_set_usize:
2917 *****************************************/
2920 gtk_widget_set_usize (GtkWidget *widget,
2924 GtkWidgetAuxInfo *aux_info;
2926 g_return_if_fail (widget != NULL);
2928 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2931 if (!aux_info_key_id)
2932 aux_info_key_id = g_quark_from_static_string (aux_info_key);
2933 aux_info = gtk_widget_aux_info_new ();
2934 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2938 aux_info->width = width;
2940 aux_info->height = height;
2942 if (GTK_WIDGET_VISIBLE (widget))
2943 gtk_widget_queue_resize (widget);
2946 /*****************************************
2947 * gtk_widget_set_events:
2952 *****************************************/
2955 gtk_widget_set_events (GtkWidget *widget,
2960 g_return_if_fail (widget != NULL);
2961 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
2962 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
2964 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
2969 eventp = g_new (gint, 1);
2973 event_key_id = g_quark_from_static_string (event_key);
2974 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
2979 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
2983 /*****************************************
2984 * gtk_widget_set_extension_events:
2989 *****************************************/
2992 gtk_widget_set_extension_events (GtkWidget *widget,
2993 GdkExtensionMode mode)
2995 GdkExtensionMode *modep;
2997 g_return_if_fail (widget != NULL);
2999 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3002 modep = g_new (GdkExtensionMode, 1);
3005 if (!extension_event_key_id)
3006 extension_event_key_id = g_quark_from_static_string (extension_event_key);
3007 gtk_object_set_data_by_id (GTK_OBJECT (widget), extension_event_key_id, modep);
3010 /*****************************************
3011 * gtk_widget_get_toplevel:
3016 *****************************************/
3019 gtk_widget_get_toplevel (GtkWidget *widget)
3021 g_return_val_if_fail (widget != NULL, NULL);
3023 while (widget->parent)
3024 widget = widget->parent;
3029 /*****************************************
3030 * gtk_widget_get_ancestor:
3035 *****************************************/
3038 gtk_widget_get_ancestor (GtkWidget *widget,
3039 GtkType widget_type)
3041 g_return_val_if_fail (widget != NULL, NULL);
3043 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type))
3044 widget = widget->parent;
3046 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type)))
3052 /*****************************************
3053 * gtk_widget_get_colormap:
3058 *****************************************/
3061 gtk_widget_get_colormap (GtkWidget *widget)
3063 GdkColormap *colormap;
3065 g_return_val_if_fail (widget != NULL, NULL);
3067 if (!widget->window)
3069 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
3072 return gtk_widget_get_default_colormap ();
3075 return gdk_window_get_colormap (widget->window);
3078 /*****************************************
3079 * gtk_widget_get_visual:
3084 *****************************************/
3087 gtk_widget_get_visual (GtkWidget *widget)
3091 g_return_val_if_fail (widget != NULL, NULL);
3093 if (!widget->window)
3095 visual = gtk_object_get_data (GTK_OBJECT (widget), visual_key);
3098 return gtk_widget_get_default_visual ();
3101 return gdk_window_get_visual (widget->window);
3104 /*****************************************
3105 * gtk_widget_get_events:
3110 *****************************************/
3113 gtk_widget_get_events (GtkWidget *widget)
3117 g_return_val_if_fail (widget != NULL, 0);
3119 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3126 /*****************************************
3127 * gtk_widget_get_extension_events:
3132 *****************************************/
3135 gtk_widget_get_extension_events (GtkWidget *widget)
3137 GdkExtensionMode *mode;
3139 g_return_val_if_fail (widget != NULL, 0);
3141 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3148 /*****************************************
3149 * gtk_widget_get_pointer:
3154 *****************************************/
3157 gtk_widget_get_pointer (GtkWidget *widget,
3161 g_return_if_fail (widget != NULL);
3168 if (GTK_WIDGET_REALIZED (widget))
3170 gdk_window_get_pointer (widget->window, x, y, NULL);
3172 if (GTK_WIDGET_NO_WINDOW (widget))
3175 *x -= widget->allocation.x;
3177 *y -= widget->allocation.y;
3182 /*****************************************
3183 * gtk_widget_is_ancestor:
3188 *****************************************/
3191 gtk_widget_is_ancestor (GtkWidget *widget,
3192 GtkWidget *ancestor)
3194 g_return_val_if_fail (widget != NULL, FALSE);
3195 g_return_val_if_fail (ancestor != NULL, FALSE);
3199 if (widget->parent == ancestor)
3201 widget = widget->parent;
3207 /*****************************************
3208 * gtk_widget_is_child:
3213 *****************************************/
3216 gtk_widget_is_child (GtkWidget *widget,
3219 g_return_val_if_fail (widget != NULL, FALSE);
3220 g_return_val_if_fail (child != NULL, FALSE);
3222 return (child->parent == widget);
3225 /*****************************************
3226 * gtk_widget_push_colormap:
3231 *****************************************/
3234 gtk_widget_push_colormap (GdkColormap *cmap)
3236 g_return_if_fail (cmap != NULL);
3238 colormap_stack = g_slist_prepend (colormap_stack, cmap);
3241 /*****************************************
3242 * gtk_widget_push_visual:
3247 *****************************************/
3250 gtk_widget_push_visual (GdkVisual *visual)
3252 g_return_if_fail (visual != NULL);
3254 visual_stack = g_slist_prepend (visual_stack, visual);
3257 /*****************************************
3258 * gtk_widget_pop_colormap:
3263 *****************************************/
3266 gtk_widget_pop_colormap (void)
3272 tmp = colormap_stack;
3273 colormap_stack = colormap_stack->next;
3274 g_slist_free_1 (tmp);
3278 /*****************************************
3279 * gtk_widget_pop_visual:
3284 *****************************************/
3287 gtk_widget_pop_visual (void)
3294 visual_stack = visual_stack->next;
3295 g_slist_free_1 (tmp);
3299 /*****************************************
3300 * gtk_widget_set_default_colormap:
3305 *****************************************/
3308 gtk_widget_set_default_colormap (GdkColormap *colormap)
3310 if (default_colormap != colormap)
3312 if (default_colormap)
3313 gdk_colormap_unref (default_colormap);
3314 default_colormap = colormap;
3315 if (default_colormap)
3316 gdk_colormap_ref (default_colormap);
3320 /*****************************************
3321 * gtk_widget_set_default_visual:
3326 *****************************************/
3329 gtk_widget_set_default_visual (GdkVisual *visual)
3331 default_visual = visual;
3334 /*****************************************
3335 * gtk_widget_get_default_colormap:
3340 *****************************************/
3343 gtk_widget_get_default_colormap (void)
3345 if (!default_colormap)
3346 default_colormap = gdk_colormap_get_system ();
3348 return default_colormap;
3351 /*****************************************
3352 * gtk_widget_get_default_visual:
3357 *****************************************/
3360 gtk_widget_get_default_visual (void)
3362 if (!default_visual)
3363 default_visual = gdk_visual_get_system ();
3365 return default_visual;
3368 /*****************************************
3369 * gtk_widget_marshal_signal_1:
3374 *****************************************/
3377 gtk_widget_marshal_signal_1 (GtkObject *object,
3382 GtkWidgetSignal1 rfunc;
3384 rfunc = (GtkWidgetSignal1) func;
3387 GTK_VALUE_POINTER (args[0]),
3391 /*****************************************
3392 * gtk_widget_marshal_signal_4:
3397 *****************************************/
3400 gtk_widget_marshal_signal_4 (GtkObject *object,
3405 GtkWidgetSignal4 rfunc;
3408 rfunc = (GtkWidgetSignal4) func;
3409 return_val = GTK_RETLOC_BOOL (args[1]);
3411 *return_val = (* rfunc) (object,
3412 GTK_VALUE_BOXED (args[0]),
3416 /*****************************************
3417 * gtk_widget_marshal_signal_5:
3422 *****************************************/
3425 gtk_widget_marshal_signal_5 (GtkObject *object,
3430 GtkWidgetSignal5 rfunc;
3432 rfunc = (GtkWidgetSignal5) func;
3435 GTK_VALUE_UINT (args[0]),
3439 /*****************************************
3440 * gtk_widget_marshal_signal_6:
3445 *****************************************/
3448 gtk_widget_marshal_signal_6 (GtkObject *object,
3453 GtkWidgetSignal6 rfunc;
3455 rfunc = (GtkWidgetSignal6) func;
3458 GTK_VALUE_OBJECT (args[0]),
3462 /*****************************************
3463 * gtk_widget_marshal_signal_7:
3468 *****************************************/
3471 gtk_widget_marshal_signal_7 (GtkObject *object,
3476 GtkWidgetSignal7 rfunc;
3478 rfunc = (GtkWidgetSignal7) func;
3481 GTK_VALUE_BOXED (args[0]),
3486 gtk_widget_shutdown (GtkObject *object)
3490 /* gtk_object_destroy() will already hold a refcount on object
3492 widget = GTK_WIDGET (object);
3495 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
3497 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3498 if (GTK_WIDGET_REALIZED (widget))
3499 gtk_widget_unrealize (widget);
3501 parent_class->shutdown (object);
3505 gtk_widget_real_destroy (GtkObject *object)
3508 GtkStyle *saved_style;
3510 /* gtk_object_destroy() will already hold a refcount on object
3512 widget = GTK_WIDGET (object);
3514 gtk_grab_remove (widget);
3515 gtk_selection_remove_all (widget);
3517 saved_style = gtk_object_get_data_by_id (object, saved_default_style_key_id);
3520 gtk_style_unref (saved_style);
3521 gtk_object_remove_data_by_id (object, saved_default_style_key_id);
3524 gtk_style_unref (widget->style);
3525 widget->style = NULL;
3527 parent_class->destroy (object);
3531 gtk_widget_finalize (GtkObject *object)
3534 GtkWidgetAuxInfo *aux_info;
3536 GdkExtensionMode *mode;
3538 widget = GTK_WIDGET (object);
3541 g_free (widget->name);
3543 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3545 gtk_widget_aux_info_destroy (aux_info);
3547 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3551 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3555 parent_class->finalize (object);
3558 /*****************************************
3559 * gtk_widget_real_show:
3564 *****************************************/
3567 gtk_widget_real_show (GtkWidget *widget)
3569 g_return_if_fail (widget != NULL);
3570 g_return_if_fail (GTK_IS_WIDGET (widget));
3572 if (!GTK_WIDGET_VISIBLE (widget))
3574 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
3578 gtk_widget_queue_resize (widget->parent);
3580 if (GTK_WIDGET_MAPPED (widget->parent))
3581 gtk_widget_map (widget);
3586 /*****************************************
3587 * gtk_widget_real_hide:
3592 *****************************************/
3595 gtk_widget_real_hide (GtkWidget *widget)
3597 g_return_if_fail (widget != NULL);
3598 g_return_if_fail (GTK_IS_WIDGET (widget));
3600 if (GTK_WIDGET_VISIBLE (widget))
3602 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3604 if (GTK_WIDGET_MAPPED (widget))
3605 gtk_widget_unmap (widget);
3608 gtk_widget_queue_resize (widget->parent);
3612 /*****************************************
3613 * gtk_widget_real_map:
3618 *****************************************/
3621 gtk_widget_real_map (GtkWidget *widget)
3623 g_return_if_fail (widget != NULL);
3624 g_return_if_fail (GTK_IS_WIDGET (widget));
3626 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget))
3628 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
3630 if (!GTK_WIDGET_NO_WINDOW (widget))
3631 gdk_window_show (widget->window);
3633 gtk_widget_queue_draw (widget);
3637 /*****************************************
3638 * gtk_widget_real_unmap:
3643 *****************************************/
3646 gtk_widget_real_unmap (GtkWidget *widget)
3648 g_return_if_fail (widget != NULL);
3649 g_return_if_fail (GTK_IS_WIDGET (widget));
3651 if (GTK_WIDGET_MAPPED (widget))
3653 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
3655 if (GTK_WIDGET_NO_WINDOW (widget))
3656 gdk_window_clear_area (widget->window,
3657 widget->allocation.x,
3658 widget->allocation.y,
3659 widget->allocation.width,
3660 widget->allocation.height);
3662 gdk_window_hide (widget->window);
3666 /*****************************************
3667 * gtk_widget_real_realize:
3672 *****************************************/
3675 gtk_widget_real_realize (GtkWidget *widget)
3677 g_return_if_fail (widget != NULL);
3678 g_return_if_fail (GTK_IS_WIDGET (widget));
3679 g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
3681 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
3684 widget->window = gtk_widget_get_parent_window (widget);
3685 gdk_window_ref (widget->window);
3687 widget->style = gtk_style_attach (widget->style, widget->window);
3690 /*****************************************
3691 * gtk_widget_real_unrealize:
3696 *****************************************/
3699 gtk_widget_real_unrealize (GtkWidget *widget)
3701 g_return_if_fail (widget != NULL);
3702 g_return_if_fail (GTK_IS_WIDGET (widget));
3704 if (GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_MAPPED (widget))
3705 gtk_widget_real_unmap (widget);
3707 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
3709 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT(widget)->klass->type));
3712 gtk_style_detach (widget->style);
3713 if (!GTK_WIDGET_NO_WINDOW (widget))
3715 gdk_window_set_user_data (widget->window, NULL);
3716 gdk_window_destroy (widget->window);
3717 widget->window = NULL;
3721 gdk_window_unref (widget->window);
3722 widget->window = NULL;
3725 /* Unrealize afterwards to improve visual effect */
3727 if (GTK_IS_CONTAINER (widget))
3728 gtk_container_foreach (GTK_CONTAINER (widget),
3729 (GtkCallback) gtk_widget_unrealize,
3733 /*****************************************
3734 * gtk_widget_real_draw:
3739 *****************************************/
3742 gtk_widget_real_draw (GtkWidget *widget,
3745 GdkEventExpose event;
3747 g_return_if_fail (widget != NULL);
3748 g_return_if_fail (GTK_IS_WIDGET (widget));
3749 g_return_if_fail (area != NULL);
3751 if (GTK_WIDGET_DRAWABLE (widget))
3753 event.type = GDK_EXPOSE;
3754 event.send_event = TRUE;
3755 event.window = widget->window;
3759 gdk_window_ref (event.window);
3760 gtk_widget_event (widget, (GdkEvent*) &event);
3761 gdk_window_unref (event.window);
3765 /*****************************************
3766 * gtk_widget_real_size_allocate:
3771 *****************************************/
3774 gtk_widget_real_size_allocate (GtkWidget *widget,
3775 GtkAllocation *allocation)
3777 g_return_if_fail (widget != NULL);
3778 g_return_if_fail (GTK_IS_WIDGET (widget));
3780 if (GTK_WIDGET_NO_WINDOW (widget) &&
3781 GTK_WIDGET_MAPPED (widget) &&
3782 ((widget->allocation.x != allocation->x) ||
3783 (widget->allocation.y != allocation->y) ||
3784 (widget->allocation.width != allocation->width) ||
3785 (widget->allocation.height != allocation->height)) &&
3786 (widget->allocation.width != 0) &&
3787 (widget->allocation.height != 0))
3788 gdk_window_clear_area (widget->window,
3789 widget->allocation.x,
3790 widget->allocation.y,
3791 widget->allocation.width,
3792 widget->allocation.height);
3794 widget->allocation = *allocation;
3796 if (GTK_WIDGET_REALIZED (widget) &&
3797 !GTK_WIDGET_NO_WINDOW (widget))
3798 gdk_window_move_resize (widget->window,
3799 allocation->x, allocation->y,
3800 allocation->width, allocation->height);
3803 /*****************************************
3804 * gtk_widget_peek_colormap:
3809 *****************************************/
3812 gtk_widget_peek_colormap (void)
3815 return (GdkColormap*) colormap_stack->data;
3816 return gtk_widget_get_default_colormap ();
3819 /*****************************************
3820 * gtk_widget_peek_visual:
3825 *****************************************/
3828 gtk_widget_peek_visual (void)
3831 return (GdkVisual*) visual_stack->data;
3832 return gtk_widget_get_default_visual ();
3835 /*************************************************************
3836 * gtk_widget_propagate_state:
3837 * Propagate a change in the widgets state down the tree
3841 * GtkStateData: state
3845 *************************************************************/
3848 gtk_widget_propagate_state (GtkWidget *widget,
3853 /* don't call this function with state==GTK_STATE_INSENSITIVE,
3854 * parent_sensitive==TRUE on a sensitive widget
3857 old_state = GTK_WIDGET_STATE (widget);
3859 if (data->parent_sensitive)
3861 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3863 if (GTK_WIDGET_IS_SENSITIVE (widget))
3865 if (data->state_restauration)
3866 GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget);
3868 GTK_WIDGET_STATE (widget) = data->state;
3872 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3873 if (!data->state_restauration &&
3874 data->state != GTK_STATE_INSENSITIVE)
3875 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3880 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3881 if (!data->state_restauration)
3883 if (data->state != GTK_STATE_INSENSITIVE)
3884 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3886 else if (GTK_WIDGET_STATE (widget) != GTK_STATE_INSENSITIVE)
3887 GTK_WIDGET_SAVED_STATE (widget) = GTK_WIDGET_STATE (widget);
3888 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3891 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
3895 window = gtk_widget_get_ancestor (widget, gtk_window_get_type ());
3897 gtk_window_set_focus (GTK_WINDOW (window), NULL);
3900 if (old_state != GTK_WIDGET_STATE (widget))
3902 gtk_widget_ref (widget);
3903 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
3905 if (GTK_IS_CONTAINER (widget))
3907 data->parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget) != FALSE);
3908 data->state = GTK_WIDGET_STATE (widget);
3909 gtk_container_foreach (GTK_CONTAINER (widget),
3910 (GtkCallback) gtk_widget_propagate_state,
3913 gtk_widget_unref (widget);
3917 /*****************************************
3918 * gtk_widget_draw_children_recurse:
3923 *****************************************/
3926 gtk_widget_draw_children_recurse (GtkWidget *widget,
3927 gpointer client_data)
3929 gtk_widget_draw (widget, NULL);
3930 gtk_widget_draw_children (widget);
3933 /*****************************************
3934 * gtk_widget_aux_info_new:
3939 *****************************************/
3941 static GtkWidgetAuxInfo*
3942 gtk_widget_aux_info_new (void)
3944 GtkWidgetAuxInfo *aux_info;
3946 if (!aux_info_mem_chunk)
3947 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
3948 sizeof (GtkWidgetAuxInfo),
3949 1024, G_ALLOC_AND_FREE);
3951 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
3955 aux_info->width = 0;
3956 aux_info->height = 0;
3961 /*****************************************
3962 * gtk_widget_aux_info_destroy:
3967 *****************************************/
3970 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
3972 g_return_if_fail (aux_info != NULL);
3974 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
3977 /*****************************************
3978 * gtk_widget_shape_combine_mask:
3979 * set a shape for this widgets' gdk window, this allows for
3980 * transparent windows etc., see gdk_window_shape_combine_mask
3981 * for more information
3986 *****************************************/
3988 gtk_widget_shape_combine_mask (GtkWidget *widget,
3989 GdkBitmap *shape_mask,
3993 GtkWidgetShapeInfo* shape_info;
3995 g_return_if_fail (widget != NULL);
3996 /* set_shape doesn't work on widgets without gdk window */
3997 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
4001 GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4004 gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
4006 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4007 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
4008 g_free (shape_info);
4012 GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4014 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4017 shape_info = g_new (GtkWidgetShapeInfo, 1);
4018 gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
4020 shape_info->shape_mask = shape_mask;
4021 shape_info->offset_x = offset_x;
4022 shape_info->offset_y = offset_y;
4024 /* set shape if widget has a gdk window allready.
4025 * otherwise the shape is scheduled to be set by gtk_widget_realize.
4028 gdk_window_shape_combine_mask (widget->window, shape_mask,
4029 offset_x, offset_y);
4033 /*****************************************
4034 * gtk_widget_dnd_drag_add:
4035 * when you get a DRAG_ENTER event, you can use this
4036 * to tell Gtk ofother widgets that are to be dragged as well
4041 *****************************************/
4043 gtk_widget_dnd_drag_add (GtkWidget *widget)
4047 /*****************************************
4048 * gtk_widget_dnd_drag_set:
4049 * these two functions enable drag and/or drop on a
4050 * widget and also let Gtk know what data types will be accepted
4051 * use MIME type naming,plus tacking "URL:" on the front for link
4058 *****************************************/
4060 gtk_widget_dnd_drag_set (GtkWidget *widget,
4062 gchar **type_accept_list,
4065 g_return_if_fail(widget != NULL);
4067 if (!widget->window)
4068 gtk_widget_realize (widget);
4070 g_return_if_fail (widget->window != NULL);
4071 gdk_window_dnd_drag_set (widget->window,
4077 /*****************************************
4078 * gtk_widget_dnd_drop_set:
4083 *****************************************/
4085 gtk_widget_dnd_drop_set (GtkWidget *widget,
4087 gchar **type_accept_list,
4089 guint8 is_destructive_operation)
4091 g_return_if_fail(widget != NULL);
4093 if (!widget->window)
4094 gtk_widget_realize (widget);
4096 g_return_if_fail (widget->window != NULL);
4097 gdk_window_dnd_drop_set (widget->window,
4101 is_destructive_operation);
4104 /*****************************************
4105 * gtk_widget_dnd_data_set:
4110 *****************************************/
4112 gtk_widget_dnd_data_set (GtkWidget *widget,
4115 gulong data_numbytes)
4117 g_return_if_fail (widget != NULL);
4118 g_return_if_fail (widget->window != NULL);
4120 gdk_window_dnd_data_set (widget->window, event, data, data_numbytes);
4124 gtk_widget_ref (GtkWidget *widget)
4126 g_return_if_fail (widget != NULL);
4127 g_return_if_fail (GTK_IS_WIDGET (widget));
4129 gtk_object_ref ((GtkObject*) widget);
4133 gtk_widget_unref (GtkWidget *widget)
4135 g_return_if_fail (widget != NULL);
4136 g_return_if_fail (GTK_IS_WIDGET (widget));
4138 gtk_object_unref ((GtkObject*) widget);
4142 gtk_widget_path (GtkWidget *widget,
4143 guint *path_length_p,
4145 gchar **path_reversed_p)
4147 static gchar *rev_path = NULL;
4148 static guint path_len = 0;
4151 g_return_if_fail (widget != NULL);
4152 g_return_if_fail (GTK_IS_WIDGET (widget));
4161 string = gtk_widget_get_name (widget);
4162 l = strlen (string);
4163 while (path_len <= len + l + 1)
4165 path_len += INIT_PATH_SIZE;
4166 rev_path = g_realloc (rev_path, path_len);
4174 widget = widget->parent;
4177 rev_path[len++] = '.';
4179 rev_path[len++] = 0;
4184 *path_length_p = len - 1;
4185 if (path_reversed_p)
4186 *path_reversed_p = g_strdup (rev_path);
4189 *path_p = g_strdup (rev_path);
4190 g_strreverse (*path_p);
4195 gtk_widget_class_path (GtkWidget *widget,
4196 guint *path_length_p,
4198 gchar **path_reversed_p)
4200 static gchar *rev_path = NULL;
4201 static guint path_len = 0;
4204 g_return_if_fail (widget != NULL);
4205 g_return_if_fail (GTK_IS_WIDGET (widget));
4214 string = gtk_type_name (GTK_WIDGET_TYPE (widget));
4215 l = strlen (string);
4216 while (path_len <= len + l + 1)
4218 path_len += INIT_PATH_SIZE;
4219 rev_path = g_realloc (rev_path, path_len);
4227 widget = widget->parent;
4230 rev_path[len++] = '.';
4232 rev_path[len++] = 0;
4237 *path_length_p = len - 1;
4238 if (path_reversed_p)
4239 *path_reversed_p = g_strdup (rev_path);
4242 *path_p = g_strdup (rev_path);
4243 g_strreverse (*path_p);