1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 #include "gtkcontainer.h"
24 #include "gtkselection.h"
25 #include "gtksignal.h"
26 #include "gtkwidget.h"
27 #include "gtkwindow.h"
28 #include "gtkbindings.h"
29 #include "gtkprivate.h"
34 #define WIDGET_CLASS(w) GTK_WIDGET_CLASS (GTK_OBJECT (w)->klass)
35 #define INIT_PATH_SIZE (512)
71 PROPERTY_NOTIFY_EVENT,
72 SELECTION_CLEAR_EVENT,
73 SELECTION_REQUEST_EVENT,
74 SELECTION_NOTIFY_EVENT,
83 DROP_DATA_AVAILABLE_EVENT,
87 VISIBILITY_NOTIFY_EVENT,
112 typedef struct _GtkStateData GtkStateData;
117 guint state_restoration : 1;
118 guint parent_sensitive : 1;
119 guint use_forall : 1;
122 static void gtk_widget_class_init (GtkWidgetClass *klass);
123 static void gtk_widget_init (GtkWidget *widget);
124 static void gtk_widget_set_arg (GtkObject *object,
127 static void gtk_widget_get_arg (GtkObject *object,
130 static void gtk_widget_shutdown (GtkObject *object);
131 static void gtk_widget_real_destroy (GtkObject *object);
132 static void gtk_widget_finalize (GtkObject *object);
133 static void gtk_widget_real_show (GtkWidget *widget);
134 static void gtk_widget_real_hide (GtkWidget *widget);
135 static void gtk_widget_real_map (GtkWidget *widget);
136 static void gtk_widget_real_unmap (GtkWidget *widget);
137 static void gtk_widget_real_realize (GtkWidget *widget);
138 static void gtk_widget_real_unrealize (GtkWidget *widget);
139 static void gtk_widget_real_draw (GtkWidget *widget,
141 static void gtk_widget_real_size_request (GtkWidget *widget,
142 GtkRequisition *requisition);
143 static void gtk_widget_real_size_allocate (GtkWidget *widget,
144 GtkAllocation *allocation);
145 static gint gtk_widget_real_key_press_event (GtkWidget *widget,
147 static gint gtk_widget_real_key_release_event (GtkWidget *widget,
149 static void gtk_widget_style_set (GtkWidget *widget,
150 GtkStyle *previous_style);
152 static GdkColormap* gtk_widget_peek_colormap (void);
153 static GdkVisual* gtk_widget_peek_visual (void);
154 static GtkStyle* gtk_widget_peek_style (void);
156 static void gtk_widget_reparent_container_child (GtkWidget *widget,
157 gpointer client_data);
158 static void gtk_widget_propagate_state (GtkWidget *widget,
160 static void gtk_widget_draw_children_recurse (GtkWidget *widget,
161 gpointer client_data);
162 static void gtk_widget_set_style_internal (GtkWidget *widget,
164 gboolean initial_emission);
165 static void gtk_widget_set_style_recurse (GtkWidget *widget,
166 gpointer client_data);
168 static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
169 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
171 static GtkObjectClass *parent_class = NULL;
172 static guint widget_signals[LAST_SIGNAL] = { 0 };
174 static GMemChunk *aux_info_mem_chunk = NULL;
176 static GdkColormap *default_colormap = NULL;
177 static GdkVisual *default_visual = NULL;
178 static GtkStyle *gtk_default_style = NULL;
180 static GSList *colormap_stack = NULL;
181 static GSList *visual_stack = NULL;
182 static GSList *style_stack = NULL;
183 static guint composite_child_stack = 0;
184 static GSList *gtk_widget_redraw_queue = NULL;
186 static const gchar *aux_info_key = "gtk-aux-info";
187 static guint aux_info_key_id = 0;
188 static const gchar *event_key = "gtk-event-mask";
189 static guint event_key_id = 0;
190 static const gchar *extension_event_key = "gtk-extension-event-mode";
191 static guint extension_event_key_id = 0;
192 static const gchar *parent_window_key = "gtk-parent-window";
193 static guint parent_window_key_id = 0;
194 static const gchar *saved_default_style_key = "gtk-saved-default-style";
195 static guint saved_default_style_key_id = 0;
196 static const gchar *shape_info_key = "gtk-shape-info";
197 static const gchar *colormap_key = "gtk-colormap";
198 static const gchar *visual_key = "gtk-visual";
202 /*****************************************
203 * gtk_widget_get_type:
208 *****************************************/
211 gtk_widget_get_type (void)
213 static GtkType widget_type = 0;
217 GtkTypeInfo widget_info =
221 sizeof (GtkWidgetClass),
222 (GtkClassInitFunc) gtk_widget_class_init,
223 (GtkObjectInitFunc) gtk_widget_init,
224 /* reserved_1 */ NULL,
225 /* reserved_2 */ NULL,
226 (GtkClassInitFunc) NULL,
229 widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);
235 /*****************************************
236 * gtk_widget_class_init:
241 *****************************************/
244 gtk_widget_debug_msg (GtkWidget *widget,
247 fprintf (stderr, "Gtk-DEBUG: %s\n", string);
251 gtk_widget_class_init (GtkWidgetClass *klass)
253 GtkObjectClass *object_class;
255 object_class = (GtkObjectClass*) klass;
257 parent_class = gtk_type_class (gtk_object_get_type ());
259 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
260 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
261 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
262 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
263 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
264 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
265 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
266 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
267 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
268 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
269 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
270 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
271 gtk_object_add_arg_type ("GtkWidget::composite_child", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_COMPOSITE_CHILD);
272 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
273 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
274 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
276 widget_signals[SHOW] =
277 gtk_signal_new ("show",
280 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
281 gtk_marshal_NONE__NONE,
283 widget_signals[HIDE] =
284 gtk_signal_new ("hide",
287 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
288 gtk_marshal_NONE__NONE,
290 widget_signals[MAP] =
291 gtk_signal_new ("map",
294 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
295 gtk_marshal_NONE__NONE,
297 widget_signals[UNMAP] =
298 gtk_signal_new ("unmap",
301 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
302 gtk_marshal_NONE__NONE,
304 widget_signals[REALIZE] =
305 gtk_signal_new ("realize",
308 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
309 gtk_marshal_NONE__NONE,
311 widget_signals[UNREALIZE] =
312 gtk_signal_new ("unrealize",
315 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
316 gtk_marshal_NONE__NONE,
318 widget_signals[DRAW] =
319 gtk_signal_new ("draw",
322 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
323 gtk_marshal_NONE__POINTER,
326 widget_signals[DRAW_FOCUS] =
327 gtk_signal_new ("draw_focus",
330 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
331 gtk_marshal_NONE__NONE,
333 widget_signals[DRAW_DEFAULT] =
334 gtk_signal_new ("draw_default",
337 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
338 gtk_marshal_NONE__NONE,
340 widget_signals[SIZE_REQUEST] =
341 gtk_signal_new ("size_request",
344 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
345 gtk_marshal_NONE__POINTER,
348 widget_signals[SIZE_ALLOCATE] =
349 gtk_signal_new ("size_allocate",
352 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
353 gtk_marshal_NONE__POINTER,
356 widget_signals[STATE_CHANGED] =
357 gtk_signal_new ("state_changed",
360 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
361 gtk_marshal_NONE__UINT,
363 GTK_TYPE_STATE_TYPE);
364 widget_signals[PARENT_SET] =
365 gtk_signal_new ("parent_set",
368 GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
369 gtk_marshal_NONE__OBJECT,
372 widget_signals[STYLE_SET] =
373 gtk_signal_new ("style_set",
376 GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
377 gtk_marshal_NONE__POINTER,
380 widget_signals[ADD_ACCELERATOR] =
381 gtk_accel_group_create_add (object_class->type, GTK_RUN_LAST,
382 GTK_SIGNAL_OFFSET (GtkWidgetClass, add_accelerator));
383 widget_signals[REMOVE_ACCELERATOR] =
384 gtk_accel_group_create_remove (object_class->type, GTK_RUN_LAST,
385 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));
386 widget_signals[EVENT] =
387 gtk_signal_new ("event",
390 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
391 gtk_marshal_BOOL__POINTER,
394 widget_signals[BUTTON_PRESS_EVENT] =
395 gtk_signal_new ("button_press_event",
398 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
399 gtk_marshal_BOOL__POINTER,
402 widget_signals[BUTTON_RELEASE_EVENT] =
403 gtk_signal_new ("button_release_event",
406 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
407 gtk_marshal_BOOL__POINTER,
410 widget_signals[MOTION_NOTIFY_EVENT] =
411 gtk_signal_new ("motion_notify_event",
414 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
415 gtk_marshal_BOOL__POINTER,
418 widget_signals[DELETE_EVENT] =
419 gtk_signal_new ("delete_event",
422 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
423 gtk_marshal_BOOL__POINTER,
426 widget_signals[DESTROY_EVENT] =
427 gtk_signal_new ("destroy_event",
430 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
431 gtk_marshal_BOOL__POINTER,
434 widget_signals[EXPOSE_EVENT] =
435 gtk_signal_new ("expose_event",
438 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
439 gtk_marshal_BOOL__POINTER,
442 widget_signals[KEY_PRESS_EVENT] =
443 gtk_signal_new ("key_press_event",
446 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
447 gtk_marshal_BOOL__POINTER,
450 widget_signals[KEY_RELEASE_EVENT] =
451 gtk_signal_new ("key_release_event",
454 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
455 gtk_marshal_BOOL__POINTER,
458 widget_signals[ENTER_NOTIFY_EVENT] =
459 gtk_signal_new ("enter_notify_event",
462 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
463 gtk_marshal_BOOL__POINTER,
466 widget_signals[LEAVE_NOTIFY_EVENT] =
467 gtk_signal_new ("leave_notify_event",
470 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
471 gtk_marshal_BOOL__POINTER,
474 widget_signals[CONFIGURE_EVENT] =
475 gtk_signal_new ("configure_event",
478 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
479 gtk_marshal_BOOL__POINTER,
482 widget_signals[FOCUS_IN_EVENT] =
483 gtk_signal_new ("focus_in_event",
486 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
487 gtk_marshal_BOOL__POINTER,
490 widget_signals[FOCUS_OUT_EVENT] =
491 gtk_signal_new ("focus_out_event",
494 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
495 gtk_marshal_BOOL__POINTER,
498 widget_signals[MAP_EVENT] =
499 gtk_signal_new ("map_event",
502 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
503 gtk_marshal_BOOL__POINTER,
506 widget_signals[UNMAP_EVENT] =
507 gtk_signal_new ("unmap_event",
510 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
511 gtk_marshal_BOOL__POINTER,
514 widget_signals[PROPERTY_NOTIFY_EVENT] =
515 gtk_signal_new ("property_notify_event",
518 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
519 gtk_marshal_BOOL__POINTER,
522 widget_signals[SELECTION_CLEAR_EVENT] =
523 gtk_signal_new ("selection_clear_event",
526 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
527 gtk_marshal_BOOL__POINTER,
530 widget_signals[SELECTION_REQUEST_EVENT] =
531 gtk_signal_new ("selection_request_event",
534 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
535 gtk_marshal_BOOL__POINTER,
538 widget_signals[SELECTION_NOTIFY_EVENT] =
539 gtk_signal_new ("selection_notify_event",
542 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
543 gtk_marshal_BOOL__POINTER,
546 widget_signals[SELECTION_RECEIVED] =
547 gtk_signal_new ("selection_received",
550 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
551 gtk_marshal_NONE__ENUM,
553 GTK_TYPE_SELECTION_DATA);
554 widget_signals[PROXIMITY_IN_EVENT] =
555 gtk_signal_new ("proximity_in_event",
558 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
559 gtk_marshal_BOOL__POINTER,
562 widget_signals[PROXIMITY_OUT_EVENT] =
563 gtk_signal_new ("proximity_out_event",
566 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
567 gtk_marshal_BOOL__POINTER,
570 widget_signals[DRAG_BEGIN_EVENT] =
571 gtk_signal_new ("drag_begin_event",
574 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin_event),
575 gtk_marshal_BOOL__POINTER,
578 widget_signals[DRAG_REQUEST_EVENT] =
579 gtk_signal_new ("drag_request_event",
582 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_request_event),
583 gtk_marshal_BOOL__POINTER,
586 widget_signals[DRAG_END_EVENT] =
587 gtk_signal_new ("drag_end_event",
590 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end_event),
591 gtk_marshal_BOOL__POINTER,
594 widget_signals[DROP_ENTER_EVENT] =
595 gtk_signal_new ("drop_enter_event",
598 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_enter_event),
599 gtk_marshal_BOOL__POINTER,
602 widget_signals[DROP_LEAVE_EVENT] =
603 gtk_signal_new ("drop_leave_event",
606 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_leave_event),
607 gtk_marshal_BOOL__POINTER,
610 widget_signals[DROP_DATA_AVAILABLE_EVENT] =
611 gtk_signal_new ("drop_data_available_event",
614 GTK_SIGNAL_OFFSET (GtkWidgetClass,
615 drop_data_available_event),
616 gtk_marshal_BOOL__POINTER,
619 widget_signals[VISIBILITY_NOTIFY_EVENT] =
620 gtk_signal_new ("visibility_notify_event",
623 GTK_SIGNAL_OFFSET (GtkWidgetClass, visibility_notify_event),
624 gtk_marshal_BOOL__POINTER,
627 widget_signals[CLIENT_EVENT] =
628 gtk_signal_new ("client_event",
631 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
632 gtk_marshal_BOOL__POINTER,
635 widget_signals[NO_EXPOSE_EVENT] =
636 gtk_signal_new ("no_expose_event",
639 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
640 gtk_marshal_BOOL__POINTER,
643 widget_signals[OTHER_EVENT] =
644 gtk_signal_new ("other_event",
647 GTK_SIGNAL_OFFSET (GtkWidgetClass, other_event),
648 gtk_marshal_BOOL__POINTER,
651 widget_signals[DEBUG_MSG] =
652 gtk_signal_new ("debug_msg",
653 GTK_RUN_LAST | GTK_RUN_ACTION,
655 GTK_SIGNAL_OFFSET (GtkWidgetClass, debug_msg),
656 gtk_marshal_NONE__STRING,
660 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
662 object_class->set_arg = gtk_widget_set_arg;
663 object_class->get_arg = gtk_widget_get_arg;
664 object_class->shutdown = gtk_widget_shutdown;
665 object_class->destroy = gtk_widget_real_destroy;
666 object_class->finalize = gtk_widget_finalize;
668 klass->activate_signal = 0;
669 klass->show = gtk_widget_real_show;
670 klass->show_all = gtk_widget_show;
671 klass->hide = gtk_widget_real_hide;
672 klass->hide_all = gtk_widget_hide;
673 klass->map = gtk_widget_real_map;
674 klass->unmap = gtk_widget_real_unmap;
675 klass->realize = gtk_widget_real_realize;
676 klass->unrealize = gtk_widget_real_unrealize;
677 klass->draw = gtk_widget_real_draw;
678 klass->draw_focus = NULL;
679 klass->size_request = gtk_widget_real_size_request;
680 klass->size_allocate = gtk_widget_real_size_allocate;
681 klass->state_changed = NULL;
682 klass->parent_set = NULL;
683 klass->style_set = gtk_widget_style_set;
684 klass->add_accelerator = (void*) gtk_accel_group_handle_add;
685 klass->remove_accelerator = (void*) gtk_accel_group_handle_remove;
687 klass->button_press_event = NULL;
688 klass->button_release_event = NULL;
689 klass->motion_notify_event = NULL;
690 klass->delete_event = NULL;
691 klass->destroy_event = NULL;
692 klass->expose_event = NULL;
693 klass->key_press_event = gtk_widget_real_key_press_event;
694 klass->key_release_event = gtk_widget_real_key_release_event;
695 klass->enter_notify_event = NULL;
696 klass->leave_notify_event = NULL;
697 klass->configure_event = NULL;
698 klass->focus_in_event = NULL;
699 klass->focus_out_event = NULL;
700 klass->map_event = NULL;
701 klass->unmap_event = NULL;
702 klass->property_notify_event = gtk_selection_property_notify;
703 klass->selection_clear_event = gtk_selection_clear;
704 klass->selection_request_event = gtk_selection_request;
705 klass->selection_notify_event = gtk_selection_notify;
706 klass->selection_received = NULL;
707 klass->proximity_in_event = NULL;
708 klass->proximity_out_event = NULL;
709 klass->drag_begin_event = NULL;
710 klass->drag_request_event = NULL;
711 klass->drop_enter_event = NULL;
712 klass->drop_leave_event = NULL;
713 klass->drop_data_available_event = NULL;
714 klass->no_expose_event = NULL;
715 klass->other_event = NULL;
717 klass->debug_msg = gtk_widget_debug_msg;
721 gtk_widget_set_arg (GtkObject *object,
727 widget = GTK_WIDGET (object);
734 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
737 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
740 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
743 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
746 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -2);
749 gtk_widget_set_usize (widget, -2, GTK_VALUE_INT (*arg));
752 if (GTK_VALUE_BOOL(*arg))
753 gtk_widget_show (widget);
755 gtk_widget_hide (widget);
758 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
761 saved_flags = GTK_WIDGET_FLAGS (widget);
762 if (GTK_VALUE_BOOL (*arg))
763 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
765 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
766 if (saved_flags != GTK_WIDGET_FLAGS (widget))
767 gtk_widget_queue_resize (widget);
770 if (GTK_VALUE_BOOL (*arg))
771 gtk_widget_grab_focus (widget);
773 case ARG_CAN_DEFAULT:
774 saved_flags = GTK_WIDGET_FLAGS (widget);
775 if (GTK_VALUE_BOOL (*arg))
776 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
778 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
779 if (saved_flags != GTK_WIDGET_FLAGS (widget))
780 gtk_widget_queue_resize (widget);
782 case ARG_HAS_DEFAULT:
783 if (GTK_VALUE_BOOL (*arg))
784 gtk_widget_grab_default (widget);
786 case ARG_COMPOSITE_CHILD:
787 if (GTK_VALUE_BOOL(*arg))
788 GTK_WIDGET_SET_FLAGS (widget, GTK_COMPOSITE_CHILD);
790 GTK_WIDGET_UNSET_FLAGS (widget, GTK_COMPOSITE_CHILD);
793 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
796 if (!GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_NO_WINDOW (widget))
797 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
799 case ARG_EXTENSION_EVENTS:
800 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
807 /*****************************************
808 * gtk_widget_get_arg:
813 *****************************************/
816 gtk_widget_get_arg (GtkObject *object,
822 widget = GTK_WIDGET (object);
826 GtkWidgetAuxInfo *aux_info;
828 GdkExtensionMode *modep;
832 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
834 GTK_VALUE_STRING (*arg) = g_strdup ("");
837 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
840 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
842 GTK_VALUE_INT (*arg) = -1;
844 GTK_VALUE_INT (*arg) = aux_info->x;
847 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
849 GTK_VALUE_INT (*arg) = -1;
851 GTK_VALUE_INT (*arg) = aux_info->y;
854 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
856 GTK_VALUE_INT (*arg) = -1;
858 GTK_VALUE_INT (*arg) = aux_info->width;
861 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
863 GTK_VALUE_INT (*arg) = -1;
865 GTK_VALUE_INT (*arg) = aux_info->height;
868 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_VISIBLE (widget) != FALSE);
871 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_SENSITIVE (widget) != FALSE);
874 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_FOCUS (widget) != FALSE);
877 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_FOCUS (widget) != FALSE);
879 case ARG_CAN_DEFAULT:
880 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_DEFAULT (widget) != FALSE);
882 case ARG_HAS_DEFAULT:
883 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
885 case ARG_COMPOSITE_CHILD:
886 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_COMPOSITE_CHILD (widget) != FALSE);
889 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
892 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
894 GTK_VALUE_FLAGS (*arg) = 0;
896 GTK_VALUE_FLAGS (*arg) = *eventp;
898 case ARG_EXTENSION_EVENTS:
899 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
901 GTK_VALUE_FLAGS (*arg) = 0;
903 GTK_VALUE_FLAGS (*arg) = *modep;
906 arg->type = GTK_TYPE_INVALID;
911 /*****************************************
917 *****************************************/
920 gtk_widget_init (GtkWidget *widget)
922 GdkColormap *colormap;
925 GTK_PRIVATE_FLAGS (widget) = 0;
926 widget->state = GTK_STATE_NORMAL;
927 widget->saved_state = GTK_STATE_NORMAL;
929 widget->requisition.width = 0;
930 widget->requisition.height = 0;
931 widget->allocation.x = -1;
932 widget->allocation.y = -1;
933 widget->allocation.width = 1;
934 widget->allocation.height = 1;
935 widget->window = NULL;
936 widget->parent = NULL;
938 GTK_WIDGET_SET_FLAGS (widget,
940 GTK_PARENT_SENSITIVE |
941 (composite_child_stack ? GTK_COMPOSITE_CHILD : 0));
943 widget->style = gtk_widget_peek_style ();
944 gtk_style_ref (widget->style);
946 colormap = gtk_widget_peek_colormap ();
947 visual = gtk_widget_peek_visual ();
949 /* XXX - should we ref the colormap and visual, too? */
951 if (colormap != gtk_widget_get_default_colormap ())
953 /* gdk_colormap_ref (colormap); */
954 gtk_object_set_data (GTK_OBJECT (widget), colormap_key, colormap);
957 if (visual != gtk_widget_get_default_visual ())
959 /* gdk_visual_ref (visual); */
960 gtk_object_set_data (GTK_OBJECT (widget), visual_key, visual);
964 /*****************************************
970 *****************************************/
973 gtk_widget_new (GtkType widget_type,
974 const gchar *first_arg_name,
979 GSList *arg_list = NULL;
980 GSList *info_list = NULL;
983 g_return_val_if_fail (gtk_type_is_a (widget_type, GTK_TYPE_WIDGET), NULL);
985 object = gtk_type_new (widget_type);
987 va_start (var_args, first_arg_name);
988 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
997 g_warning ("gtk_widget_new(): %s", error);
1005 slist_arg = arg_list;
1006 slist_info = info_list;
1009 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1010 slist_arg = slist_arg->next;
1011 slist_info = slist_info->next;
1013 gtk_args_collect_cleanup (arg_list, info_list);
1016 return GTK_WIDGET (object);
1019 /*****************************************
1025 *****************************************/
1028 gtk_widget_newv (GtkType type,
1032 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1034 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1037 /*****************************************
1043 *****************************************/
1046 gtk_widget_get (GtkWidget *widget,
1049 g_return_if_fail (widget != NULL);
1050 g_return_if_fail (arg != NULL);
1052 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1055 /*****************************************
1061 *****************************************/
1064 gtk_widget_getv (GtkWidget *widget,
1068 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1071 /*****************************************
1077 *****************************************/
1080 gtk_widget_set (GtkWidget *widget,
1081 const gchar *first_arg_name,
1086 GSList *arg_list = NULL;
1087 GSList *info_list = NULL;
1090 g_return_if_fail (widget != NULL);
1091 g_return_if_fail (GTK_IS_WIDGET (widget));
1093 object = GTK_OBJECT (widget);
1095 va_start (var_args, first_arg_name);
1096 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1105 g_warning ("gtk_widget_set(): %s", error);
1113 slist_arg = arg_list;
1114 slist_info = info_list;
1117 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1118 slist_arg = slist_arg->next;
1119 slist_info = slist_info->next;
1121 gtk_args_collect_cleanup (arg_list, info_list);
1125 /*****************************************
1131 *****************************************/
1134 gtk_widget_setv (GtkWidget *widget,
1138 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1141 /*****************************************
1142 * gtk_widget_unparent:
1143 * do any cleanup necessary necessary
1144 * for setting parent = NULL.
1149 *****************************************/
1152 gtk_widget_unparent (GtkWidget *widget)
1154 GtkWidget *toplevel;
1155 GtkWidget *old_parent;
1157 g_return_if_fail (widget != NULL);
1158 if (widget->parent == NULL)
1161 /* keep this function in sync with gtk_menu_detach()
1164 /* unset focused and default children properly, this code
1165 * should eventually move into some gtk_window_unparent_branch() or
1168 toplevel = gtk_widget_get_toplevel (widget);
1169 if (GTK_CONTAINER (widget->parent)->focus_child == widget)
1171 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL);
1173 if (GTK_IS_WINDOW (toplevel))
1177 child = GTK_WINDOW (toplevel)->focus_widget;
1179 while (child && child != widget)
1180 child = child->parent;
1182 if (child == widget)
1183 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1186 if (GTK_IS_WINDOW (toplevel))
1190 child = GTK_WINDOW (toplevel)->default_widget;
1192 while (child && child != widget)
1193 child = child->parent;
1195 if (child == widget)
1196 gtk_window_set_default (GTK_WINDOW (toplevel), NULL);
1199 if (GTK_IS_RESIZE_CONTAINER (widget))
1200 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1202 /* Remove the widget and all its children from any ->resize_widgets list
1203 * of all the parents in our branch. This code should move into gtkcontainer.c
1204 * somwhen, since we mess around with ->resize_widgets, which is
1205 * actually not of our business.
1207 * Two ways to make this prettier:
1208 * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer))
1209 * Change resize_widgets to a GList
1211 toplevel = widget->parent;
1217 if (!GTK_CONTAINER (toplevel)->resize_widgets)
1219 toplevel = toplevel->parent;
1224 slist = GTK_CONTAINER (toplevel)->resize_widgets;
1236 while (parent && (parent != widget))
1237 parent = parent->parent;
1239 if (parent == widget)
1241 GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED);
1247 /* it is really messy to have this signal disconnection
1248 * in gtkwidget.c, the resize_widgets invariants should
1249 * all be taken care off by gtkcontainer.c exclusively.
1252 gtk_signal_disconnect_by_func (GTK_OBJECT (toplevel),
1253 GTK_SIGNAL_FUNC (gtk_container_clear_resize_widgets),
1255 GTK_CONTAINER (toplevel)->resize_widgets = slist;
1258 g_slist_free_1 (last);
1264 toplevel = toplevel->parent;
1267 if (widget->window &&
1268 GTK_WIDGET_NO_WINDOW (widget) &&
1269 GTK_WIDGET_DRAWABLE (widget))
1270 gdk_window_clear_area (widget->window,
1271 widget->allocation.x,
1272 widget->allocation.y,
1273 widget->allocation.width,
1274 widget->allocation.height);
1276 /* Reset the width and height here, to force reallocation if we
1277 * get added back to a new parent. This won't work if our new
1278 * allocation is smaller than 1x1 and we actually want a size of 1x1...
1279 * (would 0x0 be OK here?)
1281 widget->allocation.width = 1;
1282 widget->allocation.height = 1;
1284 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1285 gtk_widget_unrealize (widget);
1287 old_parent = widget->parent;
1288 widget->parent = NULL;
1289 gtk_widget_set_parent_window (widget, NULL);
1290 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1292 gtk_widget_unref (widget);
1295 /*****************************************
1296 * gtk_widget_destroy:
1301 *****************************************/
1304 gtk_widget_destroy (GtkWidget *widget)
1306 g_return_if_fail (widget != NULL);
1307 g_return_if_fail (GTK_IS_WIDGET (widget));
1309 gtk_object_destroy ((GtkObject*) widget);
1312 /*****************************************
1313 * gtk_widget_destroyed:
1314 * Utility function: sets widget_pointer
1315 * to NULL when widget is destroyed.
1320 *****************************************/
1323 gtk_widget_destroyed (GtkWidget *widget,
1324 GtkWidget **widget_pointer)
1326 /* Don't make any assumptions about the
1328 * Even check widget_pointer.
1331 *widget_pointer = NULL;
1334 /*****************************************
1340 *****************************************/
1343 gtk_widget_show (GtkWidget *widget)
1345 g_return_if_fail (widget != NULL);
1347 if (!GTK_WIDGET_VISIBLE (widget))
1348 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1352 /*************************************************************
1353 * gtk_widget_show_now:
1354 * Show a widget, and if it is an unmapped toplevel widget
1355 * wait for the map_event before returning
1357 * Warning: This routine will call the main loop recursively.
1362 *************************************************************/
1365 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
1368 gtk_signal_disconnect_by_data (GTK_OBJECT (widget), flag);
1372 gtk_widget_show_now (GtkWidget *widget)
1376 /* make sure we will get event */
1377 if (!GTK_WIDGET_MAPPED (widget) &&
1378 GTK_WIDGET_TOPLEVEL (widget))
1380 gtk_widget_show (widget);
1382 gtk_signal_connect (GTK_OBJECT (widget), "map_event",
1383 GTK_SIGNAL_FUNC (gtk_widget_show_map_callback),
1387 gtk_main_iteration();
1390 gtk_widget_show (widget);
1393 /*****************************************
1399 *****************************************/
1402 gtk_widget_hide (GtkWidget *widget)
1404 g_return_if_fail (widget != NULL);
1405 g_return_if_fail (GTK_IS_WIDGET (widget));
1407 if (GTK_WIDGET_VISIBLE (widget))
1408 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1412 gtk_widget_hide_on_delete (GtkWidget *widget)
1414 g_return_val_if_fail (widget != NULL, FALSE);
1415 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
1417 gtk_widget_hide (widget);
1423 gtk_widget_show_all (GtkWidget *widget)
1425 GtkWidgetClass *class;
1427 g_return_if_fail (widget != NULL);
1428 g_return_if_fail (GTK_IS_WIDGET (widget));
1430 class = GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass);
1432 if (class->show_all)
1433 class->show_all (widget);
1437 gtk_widget_hide_all (GtkWidget *widget)
1439 GtkWidgetClass *class;
1441 g_return_if_fail (widget != NULL);
1442 g_return_if_fail (GTK_IS_WIDGET (widget));
1444 class = GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass);
1446 if (class->hide_all)
1447 class->hide_all (widget);
1450 /*****************************************
1456 *****************************************/
1459 gtk_widget_map (GtkWidget *widget)
1461 g_return_if_fail (widget != NULL);
1463 if (!GTK_WIDGET_MAPPED (widget))
1465 if (!GTK_WIDGET_REALIZED (widget))
1466 gtk_widget_realize (widget);
1468 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1472 /*****************************************
1478 *****************************************/
1481 gtk_widget_unmap (GtkWidget *widget)
1483 g_return_if_fail (widget != NULL);
1485 if (GTK_WIDGET_MAPPED (widget))
1486 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1489 /*****************************************
1490 * gtk_widget_realize:
1495 *****************************************/
1498 gtk_widget_realize (GtkWidget *widget)
1501 GdkExtensionMode mode;
1502 GtkWidgetShapeInfo *shape_info;
1504 g_return_if_fail (widget != NULL);
1506 if (!GTK_WIDGET_REALIZED (widget))
1509 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1510 g_message ("gtk_widget_realize(%s)", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1513 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1514 gtk_widget_realize (widget->parent);
1516 gtk_widget_ensure_style (widget);
1518 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1520 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1522 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1524 gdk_window_shape_combine_mask (widget->window,
1525 shape_info->shape_mask,
1526 shape_info->offset_x,
1527 shape_info->offset_y);
1530 if (!GTK_WIDGET_NO_WINDOW (widget))
1532 mode = gtk_widget_get_extension_events (widget);
1533 if (mode != GDK_EXTENSION_EVENTS_NONE)
1535 events = gtk_widget_get_events (widget);
1536 gdk_input_set_extension_events (widget->window, events, mode);
1543 /*****************************************
1544 * gtk_widget_unrealize:
1549 *****************************************/
1552 gtk_widget_unrealize (GtkWidget *widget)
1554 g_return_if_fail (widget != NULL);
1556 if (GTK_WIDGET_REDRAW_PENDING (widget))
1558 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1559 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1562 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1563 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
1565 if (GTK_WIDGET_REALIZED (widget))
1567 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1568 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
1572 /*****************************************
1573 * gtk_widget_queue_draw:
1578 *****************************************/
1581 gtk_widget_idle_draw (gpointer data)
1583 while (gtk_widget_redraw_queue)
1584 gtk_widget_draw (gtk_widget_redraw_queue->data, NULL);
1590 gtk_widget_queue_draw (GtkWidget *widget)
1594 g_return_if_fail (widget != NULL);
1596 if (GTK_WIDGET_DRAWABLE (widget))
1598 /* We queue the redraw if:
1599 * a) the widget is not already queued for redraw and
1600 * b) non of the widgets ancestors are queued for redraw.
1605 if (GTK_WIDGET_REDRAW_PENDING (parent))
1607 parent = parent->parent;
1610 GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_PENDING);
1611 if (gtk_widget_redraw_queue == NULL)
1612 gtk_idle_add_priority (GTK_PRIORITY_INTERNAL,
1613 gtk_widget_idle_draw,
1616 gtk_widget_redraw_queue = g_slist_prepend (gtk_widget_redraw_queue, widget);
1621 gtk_widget_queue_resize (GtkWidget *widget)
1623 g_return_if_fail (widget != NULL);
1624 g_return_if_fail (GTK_IS_WIDGET (widget));
1626 if (GTK_IS_RESIZE_CONTAINER (widget))
1627 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1630 gtk_container_queue_resize (GTK_CONTAINER (widget->parent));
1631 else if (GTK_WIDGET_TOPLEVEL (widget))
1632 gtk_container_queue_resize (GTK_CONTAINER (widget));
1635 /*****************************************
1641 *****************************************/
1644 gtk_widget_draw (GtkWidget *widget,
1647 GdkRectangle temp_area;
1649 g_return_if_fail (widget != NULL);
1651 if (GTK_WIDGET_REDRAW_PENDING (widget))
1653 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1654 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1659 if (GTK_WIDGET_DRAWABLE (widget))
1663 if (GTK_WIDGET_NO_WINDOW (widget))
1665 temp_area.x = widget->allocation.x;
1666 temp_area.y = widget->allocation.y;
1674 temp_area.width = widget->allocation.width;
1675 temp_area.height = widget->allocation.height;
1679 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
1683 /*****************************************
1684 * gtk_widget_draw_focus:
1689 *****************************************/
1692 gtk_widget_draw_focus (GtkWidget *widget)
1694 g_return_if_fail (widget != NULL);
1696 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
1699 /*****************************************
1700 * gtk_widget_draw_default:
1705 *****************************************/
1708 gtk_widget_draw_default (GtkWidget *widget)
1710 g_return_if_fail (widget != NULL);
1712 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
1715 /*****************************************
1716 * gtk_widget_draw_children:
1721 *****************************************/
1724 gtk_widget_draw_children (GtkWidget *widget)
1726 g_return_if_fail (widget != NULL);
1728 if (GTK_IS_CONTAINER (widget))
1729 gtk_container_forall (GTK_CONTAINER (widget),
1730 gtk_widget_draw_children_recurse,
1734 /*****************************************
1735 * gtk_widget_size_request:
1740 *****************************************/
1743 gtk_widget_size_request (GtkWidget *widget,
1744 GtkRequisition *requisition)
1746 GtkWidgetAuxInfo *aux_info;
1748 g_return_if_fail (widget != NULL);
1750 gtk_widget_ref (widget);
1751 gtk_widget_ensure_style (widget);
1752 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
1754 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1757 if (aux_info->width > 0)
1758 requisition->width = aux_info->width;
1759 if (aux_info->height > 0)
1760 requisition->height = aux_info->height;
1762 gtk_widget_unref (widget);
1765 /*****************************************
1766 * gtk_widget_size_allocate:
1771 *****************************************/
1774 gtk_widget_size_allocate (GtkWidget *widget,
1775 GtkAllocation *allocation)
1777 GtkWidgetAuxInfo *aux_info;
1778 GtkAllocation real_allocation;
1780 g_return_if_fail (widget != NULL);
1782 real_allocation = *allocation;
1783 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1787 if (aux_info->x != -1)
1788 real_allocation.x = aux_info->x;
1789 if (aux_info->y != -1)
1790 real_allocation.y = aux_info->y;
1793 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
1797 gtk_widget_stop_add_accelerator (GtkWidget *widget)
1799 g_return_if_fail (widget != NULL);
1800 g_return_if_fail (GTK_IS_WIDGET (widget));
1802 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
1806 gtk_widget_stop_remove_accelerator (GtkWidget *widget)
1808 g_return_if_fail (widget != NULL);
1809 g_return_if_fail (GTK_IS_WIDGET (widget));
1811 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR]);
1815 gtk_widget_freeze_accelerators (GtkWidget *widget)
1817 g_return_if_fail (widget != NULL);
1818 g_return_if_fail (GTK_IS_WIDGET (widget));
1820 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
1821 widget_signals[ADD_ACCELERATOR],
1823 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1826 gtk_signal_connect (GTK_OBJECT (widget),
1828 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1830 gtk_signal_connect (GTK_OBJECT (widget),
1831 "remove_accelerator",
1832 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
1838 gtk_widget_thaw_accelerators (GtkWidget *widget)
1840 g_return_if_fail (widget != NULL);
1841 g_return_if_fail (GTK_IS_WIDGET (widget));
1843 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
1844 widget_signals[ADD_ACCELERATOR],
1846 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1849 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
1850 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1852 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
1853 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
1859 gtk_widget_add_accelerator (GtkWidget *widget,
1860 const gchar *accel_signal,
1861 GtkAccelGroup *accel_group,
1864 GtkAccelFlags accel_flags)
1866 g_return_if_fail (widget != NULL);
1867 g_return_if_fail (GTK_IS_WIDGET (widget));
1868 g_return_if_fail (accel_group != NULL);
1870 gtk_accel_group_add (accel_group,
1874 (GtkObject*) widget,
1879 gtk_widget_remove_accelerator (GtkWidget *widget,
1880 GtkAccelGroup *accel_group,
1884 g_return_if_fail (widget != NULL);
1885 g_return_if_fail (GTK_IS_WIDGET (widget));
1886 g_return_if_fail (accel_group != NULL);
1888 gtk_accel_group_remove (accel_group,
1891 (GtkObject*) widget);
1895 gtk_widget_remove_accelerators (GtkWidget *widget,
1896 const gchar *accel_signal,
1897 gboolean visible_only)
1902 g_return_if_fail (widget != NULL);
1903 g_return_if_fail (GTK_IS_WIDGET (widget));
1904 g_return_if_fail (accel_signal != NULL);
1906 signal_id = gtk_signal_lookup (accel_signal, GTK_OBJECT_TYPE (widget));
1907 g_return_if_fail (signal_id != 0);
1909 slist = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
1912 GtkAccelEntry *ac_entry;
1914 ac_entry = slist->data;
1915 slist = slist->next;
1916 if (ac_entry->accel_flags & GTK_ACCEL_VISIBLE &&
1917 ac_entry->signal_id == signal_id)
1918 gtk_widget_remove_accelerator (GTK_WIDGET (widget),
1919 ac_entry->accel_group,
1920 ac_entry->accelerator_key,
1921 ac_entry->accelerator_mods);
1926 gtk_widget_accelerator_signal (GtkWidget *widget,
1927 GtkAccelGroup *accel_group,
1931 GtkAccelEntry *ac_entry;
1933 g_return_val_if_fail (widget != NULL, 0);
1934 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
1935 g_return_val_if_fail (accel_group != NULL, 0);
1937 ac_entry = gtk_accel_group_get_entry (accel_group, accel_key, accel_mods);
1939 if (ac_entry && ac_entry->object == (GtkObject*) widget)
1940 return ac_entry->signal_id;
1945 gtk_widget_real_key_press_event (GtkWidget *widget,
1948 gboolean handled = FALSE;
1950 g_return_val_if_fail (widget != NULL, handled);
1951 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
1952 g_return_val_if_fail (event != NULL, handled);
1955 handled = gtk_bindings_activate (GTK_OBJECT (widget),
1963 gtk_widget_real_key_release_event (GtkWidget *widget,
1966 gboolean handled = FALSE;
1968 g_return_val_if_fail (widget != NULL, handled);
1969 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
1970 g_return_val_if_fail (event != NULL, handled);
1973 handled = gtk_bindings_activate (GTK_OBJECT (widget),
1975 event->state | GDK_RELEASE_MASK);
1980 /*****************************************
1986 *****************************************/
1989 gtk_widget_event (GtkWidget *widget,
1995 g_return_val_if_fail (widget != NULL, TRUE);
1997 gtk_widget_ref (widget);
1999 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
2001 if (return_val || GTK_OBJECT_DESTROYED (widget))
2003 gtk_widget_unref (widget);
2007 switch (event->type)
2012 case GDK_BUTTON_PRESS:
2013 case GDK_2BUTTON_PRESS:
2014 case GDK_3BUTTON_PRESS:
2015 signal_num = BUTTON_PRESS_EVENT;
2017 case GDK_BUTTON_RELEASE:
2018 signal_num = BUTTON_RELEASE_EVENT;
2020 case GDK_MOTION_NOTIFY:
2021 signal_num = MOTION_NOTIFY_EVENT;
2024 signal_num = DELETE_EVENT;
2027 signal_num = DESTROY_EVENT;
2030 signal_num = KEY_PRESS_EVENT;
2032 case GDK_KEY_RELEASE:
2033 signal_num = KEY_RELEASE_EVENT;
2035 case GDK_ENTER_NOTIFY:
2036 signal_num = ENTER_NOTIFY_EVENT;
2038 case GDK_LEAVE_NOTIFY:
2039 signal_num = LEAVE_NOTIFY_EVENT;
2041 case GDK_FOCUS_CHANGE:
2042 if (event->focus_change.in)
2043 signal_num = FOCUS_IN_EVENT;
2045 signal_num = FOCUS_OUT_EVENT;
2048 signal_num = CONFIGURE_EVENT;
2051 signal_num = MAP_EVENT;
2054 signal_num = UNMAP_EVENT;
2056 case GDK_PROPERTY_NOTIFY:
2057 signal_num = PROPERTY_NOTIFY_EVENT;
2059 case GDK_SELECTION_CLEAR:
2060 signal_num = SELECTION_CLEAR_EVENT;
2062 case GDK_SELECTION_REQUEST:
2063 signal_num = SELECTION_REQUEST_EVENT;
2065 case GDK_SELECTION_NOTIFY:
2066 signal_num = SELECTION_NOTIFY_EVENT;
2068 case GDK_PROXIMITY_IN:
2069 signal_num = PROXIMITY_IN_EVENT;
2071 case GDK_PROXIMITY_OUT:
2072 signal_num = PROXIMITY_OUT_EVENT;
2074 case GDK_DRAG_BEGIN:
2075 signal_num = DRAG_BEGIN_EVENT;
2077 case GDK_DRAG_REQUEST:
2078 signal_num = DRAG_REQUEST_EVENT;
2080 case GDK_DROP_ENTER:
2081 signal_num = DROP_ENTER_EVENT;
2083 case GDK_DROP_LEAVE:
2084 signal_num = DROP_LEAVE_EVENT;
2086 case GDK_DROP_DATA_AVAIL:
2087 signal_num = DROP_DATA_AVAILABLE_EVENT;
2089 case GDK_OTHER_EVENT:
2090 signal_num = OTHER_EVENT;
2093 signal_num = NO_EXPOSE_EVENT;
2095 case GDK_CLIENT_EVENT:
2096 signal_num = CLIENT_EVENT;
2099 /* there is no sense in providing a widget with bogus expose events
2101 if (!event->any.window)
2103 gtk_widget_unref (widget);
2106 signal_num = EXPOSE_EVENT;
2108 case GDK_VISIBILITY_NOTIFY:
2109 signal_num = VISIBILITY_NOTIFY_EVENT;
2112 g_warning ("could not determine signal number for event: %d", event->type);
2113 gtk_widget_unref (widget);
2117 if (signal_num != -1)
2118 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
2120 return_val |= GTK_OBJECT_DESTROYED (widget);
2122 gtk_widget_unref (widget);
2127 /*****************************************
2128 * gtk_widget_activate:
2133 *****************************************/
2136 gtk_widget_activate (GtkWidget *widget)
2138 g_return_if_fail (widget != NULL);
2139 g_return_if_fail (GTK_IS_WIDGET (widget));
2141 if (WIDGET_CLASS (widget)->activate_signal)
2142 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
2145 /*****************************************
2146 * gtk_widget_reparent_container_child:
2147 * assistent function to gtk_widget_reparent
2152 *****************************************/
2155 gtk_widget_reparent_container_child(GtkWidget *widget,
2156 gpointer client_data)
2158 g_return_if_fail (widget != NULL);
2159 g_return_if_fail (client_data != NULL);
2161 if (GTK_WIDGET_NO_WINDOW (widget))
2164 gdk_window_unref (widget->window);
2165 widget->window = (GdkWindow*) client_data;
2167 gdk_window_ref (widget->window);
2169 if (GTK_IS_CONTAINER (widget))
2170 gtk_container_forall (GTK_CONTAINER (widget),
2171 gtk_widget_reparent_container_child,
2175 gdk_window_reparent (widget->window,
2176 (GdkWindow*) client_data, 0, 0);
2179 /*****************************************
2180 * gtk_widget_reparent:
2185 *****************************************/
2188 gtk_widget_reparent (GtkWidget *widget,
2189 GtkWidget *new_parent)
2191 g_return_if_fail (widget != NULL);
2192 g_return_if_fail (GTK_IS_WIDGET (widget));
2193 g_return_if_fail (new_parent != NULL);
2194 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
2195 g_return_if_fail (widget->parent != NULL);
2197 if (widget->parent != new_parent)
2199 /* First try to see if we can get away without unrealizing
2200 * the widget as we reparent it. if so we set a flag so
2201 * that gtk_widget_unparent doesn't unrealize widget
2203 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
2204 GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
2206 gtk_widget_ref (widget);
2207 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
2208 gtk_container_add (GTK_CONTAINER (new_parent), widget);
2209 gtk_widget_unref (widget);
2211 if (GTK_WIDGET_IN_REPARENT (widget))
2213 GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
2215 /* OK, now fix up the widget's window. (And that for any
2216 * children, if the widget is NO_WINDOW and a container)
2218 if (GTK_WIDGET_NO_WINDOW (widget))
2220 if (GTK_IS_CONTAINER (widget))
2221 gtk_container_forall (GTK_CONTAINER (widget),
2222 gtk_widget_reparent_container_child,
2223 gtk_widget_get_parent_window (widget));
2226 GdkWindow *parent_window;
2228 parent_window = gtk_widget_get_parent_window (widget);
2229 if (parent_window != widget->window)
2232 gdk_window_unref (widget->window);
2233 widget->window = parent_window;
2235 gdk_window_ref (widget->window);
2240 gdk_window_reparent (widget->window, gtk_widget_get_parent_window (widget), 0, 0);
2245 /*****************************************
2251 *****************************************/
2254 gtk_widget_popup (GtkWidget *widget,
2258 g_return_if_fail (widget != NULL);
2260 if (!GTK_WIDGET_VISIBLE (widget))
2262 if (!GTK_WIDGET_REALIZED (widget))
2263 gtk_widget_realize (widget);
2264 if (!GTK_WIDGET_NO_WINDOW (widget))
2265 gdk_window_move (widget->window, x, y);
2266 gtk_widget_show (widget);
2270 /*****************************************
2271 * gtk_widget_intersect:
2276 *****************************************/
2279 gtk_widget_intersect (GtkWidget *widget,
2281 GdkRectangle *intersection)
2287 g_return_val_if_fail (widget != NULL, FALSE);
2288 g_return_val_if_fail (area != NULL, FALSE);
2291 dest = intersection;
2295 return_val = gdk_rectangle_intersect ((GdkRectangle*) &widget->allocation, area, dest);
2297 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2299 intersection->x -= widget->allocation.x;
2300 intersection->y -= widget->allocation.y;
2308 gtk_widget_basic (GtkWidget *widget)
2314 g_return_val_if_fail (widget != NULL, FALSE);
2316 if (!GTK_WIDGET_BASIC (widget))
2318 else if (GTK_IS_CONTAINER (widget))
2320 children = gtk_container_children (GTK_CONTAINER (widget));
2324 tmp_list = children;
2328 if (!gtk_widget_basic (GTK_WIDGET (tmp_list->data)))
2334 tmp_list = tmp_list->next;
2337 g_list_free (children);
2346 /*****************************************
2347 * gtk_widget_grab_focus:
2352 *****************************************/
2355 gtk_widget_grab_focus (GtkWidget *widget)
2357 g_return_if_fail (widget != NULL);
2358 g_return_if_fail (GTK_IS_WIDGET (widget));
2360 if (GTK_WIDGET_CAN_FOCUS (widget))
2364 GtkType window_type;
2366 window_type = gtk_window_get_type ();
2367 parent = widget->parent;
2370 while (parent && !gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2372 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2374 parent = parent->parent;
2377 if (parent && gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2379 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2380 gtk_window_set_focus (GTK_WINDOW (parent), widget);
2385 /*****************************************
2386 * gtk_widget_grab_default:
2391 *****************************************/
2394 gtk_widget_grab_default (GtkWidget *widget)
2397 GtkType window_type;
2399 g_return_if_fail (widget != NULL);
2400 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
2402 window_type = gtk_window_get_type ();
2403 window = widget->parent;
2405 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2406 window = window->parent;
2408 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2409 gtk_window_set_default (GTK_WINDOW (window), widget);
2412 /*****************************************
2413 * gtk_widget_set_name:
2418 *****************************************/
2421 gtk_widget_set_name (GtkWidget *widget,
2424 g_return_if_fail (widget != NULL);
2427 g_free (widget->name);
2428 widget->name = g_strdup (name);
2430 if (!GTK_WIDGET_USER_STYLE (widget))
2431 gtk_widget_set_rc_style (widget);
2434 /*****************************************
2435 * gtk_widget_get_name:
2440 *****************************************/
2443 gtk_widget_get_name (GtkWidget *widget)
2445 g_return_val_if_fail (widget != NULL, NULL);
2448 return widget->name;
2449 return gtk_type_name (GTK_WIDGET_TYPE (widget));
2452 /*****************************************
2453 * gtk_widget_set_state:
2460 *****************************************/
2463 gtk_widget_set_state (GtkWidget *widget,
2466 g_return_if_fail (widget != NULL);
2467 g_return_if_fail (GTK_IS_WIDGET (widget));
2469 if (state == GTK_WIDGET_STATE (widget))
2472 if (state == GTK_STATE_INSENSITIVE)
2473 gtk_widget_set_sensitive (widget, FALSE);
2479 data.state_restoration = FALSE;
2480 data.use_forall = FALSE;
2482 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2484 data.parent_sensitive = TRUE;
2486 gtk_widget_propagate_state (widget, &data);
2487 gtk_widget_queue_draw (widget);
2491 /*****************************************
2492 * gtk_widget_set_sensitive:
2496 * boolean value for sensitivity
2499 *****************************************/
2502 gtk_widget_set_sensitive (GtkWidget *widget,
2507 g_return_if_fail (widget != NULL);
2508 g_return_if_fail (GTK_IS_WIDGET (widget));
2510 sensitive = (sensitive != FALSE);
2512 if (sensitive == (GTK_WIDGET_SENSITIVE (widget) != FALSE))
2517 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
2518 data.state = GTK_WIDGET_SAVED_STATE (widget);
2522 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
2523 data.state = GTK_WIDGET_STATE (widget);
2525 data.state_restoration = TRUE;
2526 data.use_forall = TRUE;
2529 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2531 data.parent_sensitive = TRUE;
2533 gtk_widget_propagate_state (widget, &data);
2534 gtk_widget_queue_draw (widget);
2537 /*****************************************
2538 * gtk_widget_set_parent:
2543 *****************************************/
2546 gtk_widget_set_parent (GtkWidget *widget,
2551 g_return_if_fail (widget != NULL);
2552 g_return_if_fail (widget->parent == NULL);
2553 g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
2554 g_return_if_fail (parent != NULL);
2555 g_return_if_fail (widget != parent);
2557 /* keep this function in sync with gtk_menu_attach_to_widget()
2560 gtk_widget_ref (widget);
2561 gtk_object_sink (GTK_OBJECT (widget));
2562 widget->parent = parent;
2564 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
2565 data.state = GTK_WIDGET_STATE (parent);
2567 data.state = GTK_WIDGET_STATE (widget);
2568 data.state_restoration = FALSE;
2569 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (parent) != FALSE);
2570 data.use_forall = GTK_WIDGET_IS_SENSITIVE (parent) != GTK_WIDGET_IS_SENSITIVE (widget);
2572 gtk_widget_propagate_state (widget, &data);
2574 gtk_widget_set_style_recurse (widget, NULL);
2576 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
2579 /*****************************************
2581 * see docs/styles.txt
2582 *****************************************/
2584 gtk_widget_set_style (GtkWidget *widget,
2587 GtkStyle *default_style;
2588 gboolean initial_emission;
2590 g_return_if_fail (widget != NULL);
2591 g_return_if_fail (style != NULL);
2593 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2595 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
2596 GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
2598 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2601 gtk_style_ref (widget->style);
2602 if (!saved_default_style_key_id)
2603 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2604 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2607 gtk_widget_set_style_internal (widget, style, initial_emission);
2611 gtk_widget_ensure_style (GtkWidget *widget)
2613 if (!GTK_WIDGET_USER_STYLE (widget) &&
2614 !GTK_WIDGET_RC_STYLE (widget))
2615 gtk_widget_set_rc_style (widget);
2619 gtk_widget_set_rc_style (GtkWidget *widget)
2621 GtkStyle *saved_style;
2622 GtkStyle *new_style;
2623 gboolean initial_emission;
2625 g_return_if_fail (widget != NULL);
2627 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2629 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2630 GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
2632 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2633 new_style = gtk_rc_get_style (widget);
2638 gtk_style_ref (widget->style);
2639 if (!saved_default_style_key_id)
2640 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2641 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2643 gtk_widget_set_style_internal (widget, new_style, initial_emission);
2649 g_assert (initial_emission == FALSE); /* FIXME: remove this line */
2651 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2652 gtk_widget_set_style_internal (widget, saved_style, initial_emission);
2653 gtk_style_unref (saved_style);
2657 if (initial_emission)
2658 gtk_widget_set_style_internal (widget, widget->style, TRUE);
2664 gtk_widget_restore_default_style (GtkWidget *widget)
2666 GtkStyle *default_style;
2668 g_return_if_fail (widget != NULL);
2670 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2672 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2675 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2676 gtk_widget_set_style_internal (widget, default_style, FALSE);
2677 gtk_style_unref (default_style);
2682 gtk_widget_get_style (GtkWidget *widget)
2684 g_return_val_if_fail (widget != NULL, NULL);
2686 return widget->style;
2690 gtk_widget_style_set (GtkWidget *widget,
2691 GtkStyle *previous_style)
2693 if (GTK_WIDGET_REALIZED (widget) &&
2694 !GTK_WIDGET_NO_WINDOW (widget))
2696 gtk_style_set_background (widget->style, widget->window, widget->state);
2697 if (GTK_WIDGET_DRAWABLE (widget))
2698 gdk_window_clear (widget->window);
2703 gtk_widget_set_style_internal (GtkWidget *widget,
2705 gboolean initial_emission)
2707 g_return_if_fail (widget != NULL);
2708 g_return_if_fail (style != NULL);
2710 if (widget->style != style)
2712 GtkStyle *previous_style;
2714 if (GTK_WIDGET_REALIZED (widget))
2715 gtk_style_detach (widget->style);
2717 previous_style = widget->style;
2718 widget->style = style;
2719 gtk_style_ref (widget->style);
2721 if (GTK_WIDGET_REALIZED (widget))
2722 widget->style = gtk_style_attach (widget->style, widget->window);
2724 gtk_signal_emit (GTK_OBJECT (widget),
2725 widget_signals[STYLE_SET],
2726 initial_emission ? NULL : previous_style);
2727 gtk_style_unref (previous_style);
2729 if (widget->parent && !initial_emission)
2731 GtkRequisition old_requisition;
2733 old_requisition = widget->requisition;
2734 gtk_widget_size_request (widget, &widget->requisition);
2736 if ((old_requisition.width != widget->requisition.width) ||
2737 (old_requisition.height != widget->requisition.height))
2738 gtk_widget_queue_resize (widget);
2739 else if (GTK_WIDGET_DRAWABLE (widget))
2740 gtk_widget_queue_draw (widget);
2743 else if (initial_emission)
2745 gtk_signal_emit (GTK_OBJECT (widget),
2746 widget_signals[STYLE_SET],
2752 gtk_widget_set_style_recurse (GtkWidget *widget,
2753 gpointer client_data)
2755 if (GTK_WIDGET_RC_STYLE (widget))
2756 gtk_widget_set_rc_style (widget);
2758 if (GTK_IS_CONTAINER (widget))
2759 gtk_container_forall (GTK_CONTAINER (widget),
2760 gtk_widget_set_style_recurse,
2765 gtk_widget_reset_rc_styles (GtkWidget *widget)
2767 gtk_widget_set_style_recurse (widget, NULL);
2771 gtk_widget_set_default_style (GtkStyle *style)
2773 if (style != gtk_default_style)
2775 if (gtk_default_style)
2776 gtk_style_unref (gtk_default_style);
2777 gtk_default_style = style;
2778 if (gtk_default_style)
2779 gtk_style_ref (gtk_default_style);
2784 gtk_widget_get_default_style (void)
2786 if (!gtk_default_style)
2788 gtk_default_style = gtk_style_new ();
2789 gtk_style_ref (gtk_default_style);
2792 return gtk_default_style;
2796 gtk_widget_push_style (GtkStyle *style)
2798 g_return_if_fail (style != NULL);
2800 gtk_style_ref (style);
2801 style_stack = g_slist_prepend (style_stack, style);
2805 gtk_widget_peek_style (void)
2808 return (GtkStyle*) style_stack->data;
2810 return gtk_widget_get_default_style ();
2814 gtk_widget_pop_style (void)
2821 style_stack = style_stack->next;
2822 gtk_style_unref ((GtkStyle*) tmp->data);
2823 g_slist_free_1 (tmp);
2827 /*************************************************************
2828 * gtk_widget_set_parent_window:
2829 * Set a non default parent window for widget
2836 *************************************************************/
2839 gtk_widget_set_parent_window (GtkWidget *widget,
2840 GdkWindow *parent_window)
2842 GdkWindow *old_parent_window;
2844 g_return_if_fail (widget != NULL);
2846 old_parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2847 parent_window_key_id);
2849 if (parent_window != old_parent_window)
2851 if (!parent_window_key_id)
2852 parent_window_key_id = g_quark_from_static_string (parent_window_key);
2853 gtk_object_set_data_by_id (GTK_OBJECT (widget), parent_window_key_id,
2855 if (old_parent_window)
2856 gdk_window_unref (old_parent_window);
2858 gdk_window_ref (parent_window);
2862 /*************************************************************
2863 * gtk_widget_get_parent_window:
2864 * Get widget's parent window
2871 *************************************************************/
2874 gtk_widget_get_parent_window (GtkWidget *widget)
2876 GdkWindow *parent_window;
2878 g_return_val_if_fail (widget != NULL, NULL);
2879 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
2880 g_return_val_if_fail (widget->parent != NULL, NULL);
2882 parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2883 parent_window_key_id);
2885 return (parent_window != NULL) ? parent_window : widget->parent->window;
2888 /*****************************************
2889 * gtk_widget_set_uposition:
2894 *****************************************/
2897 gtk_widget_set_uposition (GtkWidget *widget,
2901 GtkWidgetAuxInfo *aux_info;
2903 g_return_if_fail (widget != NULL);
2905 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2908 if (!aux_info_key_id)
2909 aux_info_key_id = g_quark_from_static_string (aux_info_key);
2910 aux_info = gtk_widget_aux_info_new ();
2911 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2919 if (GTK_WIDGET_REALIZED (widget) && GTK_IS_WINDOW (widget) &&
2920 (aux_info->x != -1) && (aux_info->y != -1))
2922 gdk_window_set_hints (widget->window, aux_info->x, aux_info->y, 0, 0, 0, 0, GDK_HINT_POS);
2923 gdk_window_move (widget->window, aux_info->x, aux_info->y);
2926 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
2927 gtk_widget_size_allocate (widget, &widget->allocation);
2930 /*****************************************
2931 * gtk_widget_set_usize:
2936 *****************************************/
2939 gtk_widget_set_usize (GtkWidget *widget,
2943 GtkWidgetAuxInfo *aux_info;
2945 g_return_if_fail (widget != NULL);
2947 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2950 if (!aux_info_key_id)
2951 aux_info_key_id = g_quark_from_static_string (aux_info_key);
2952 aux_info = gtk_widget_aux_info_new ();
2953 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2957 aux_info->width = width;
2959 aux_info->height = height;
2961 if (GTK_WIDGET_VISIBLE (widget))
2962 gtk_widget_queue_resize (widget);
2965 /*****************************************
2966 * gtk_widget_set_events:
2971 *****************************************/
2974 gtk_widget_set_events (GtkWidget *widget,
2979 g_return_if_fail (widget != NULL);
2980 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
2981 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
2983 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
2988 eventp = g_new (gint, 1);
2992 event_key_id = g_quark_from_static_string (event_key);
2993 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
2998 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3002 /*****************************************
3003 * gtk_widget_set_extension_events:
3008 *****************************************/
3011 gtk_widget_set_extension_events (GtkWidget *widget,
3012 GdkExtensionMode mode)
3014 GdkExtensionMode *modep;
3016 g_return_if_fail (widget != NULL);
3018 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3021 modep = g_new (GdkExtensionMode, 1);
3024 if (!extension_event_key_id)
3025 extension_event_key_id = g_quark_from_static_string (extension_event_key);
3026 gtk_object_set_data_by_id (GTK_OBJECT (widget), extension_event_key_id, modep);
3029 /*****************************************
3030 * gtk_widget_get_toplevel:
3035 *****************************************/
3038 gtk_widget_get_toplevel (GtkWidget *widget)
3040 g_return_val_if_fail (widget != NULL, NULL);
3042 while (widget->parent)
3043 widget = widget->parent;
3048 /*****************************************
3049 * gtk_widget_get_ancestor:
3054 *****************************************/
3057 gtk_widget_get_ancestor (GtkWidget *widget,
3058 GtkType widget_type)
3060 g_return_val_if_fail (widget != NULL, NULL);
3062 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type))
3063 widget = widget->parent;
3065 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type)))
3071 /*****************************************
3072 * gtk_widget_get_colormap:
3077 *****************************************/
3080 gtk_widget_get_colormap (GtkWidget *widget)
3082 GdkColormap *colormap;
3084 g_return_val_if_fail (widget != NULL, NULL);
3088 colormap = gdk_window_get_colormap (widget->window);
3089 /* If window was destroyed previously, we'll get NULL here */
3094 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
3098 return gtk_widget_get_default_colormap ();
3101 /*****************************************
3102 * gtk_widget_get_visual:
3107 *****************************************/
3110 gtk_widget_get_visual (GtkWidget *widget)
3114 g_return_val_if_fail (widget != NULL, NULL);
3118 visual = gdk_window_get_visual (widget->window);
3119 /* If window was destroyed previously, we'll get NULL here */
3124 visual = gtk_object_get_data (GTK_OBJECT (widget), visual_key);
3128 return gtk_widget_get_default_visual ();
3131 /*****************************************
3132 * gtk_widget_get_events:
3137 *****************************************/
3140 gtk_widget_get_events (GtkWidget *widget)
3144 g_return_val_if_fail (widget != NULL, 0);
3146 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3153 /*****************************************
3154 * gtk_widget_get_extension_events:
3159 *****************************************/
3162 gtk_widget_get_extension_events (GtkWidget *widget)
3164 GdkExtensionMode *mode;
3166 g_return_val_if_fail (widget != NULL, 0);
3168 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3175 /*****************************************
3176 * gtk_widget_get_pointer:
3181 *****************************************/
3184 gtk_widget_get_pointer (GtkWidget *widget,
3188 g_return_if_fail (widget != NULL);
3195 if (GTK_WIDGET_REALIZED (widget))
3197 gdk_window_get_pointer (widget->window, x, y, NULL);
3199 if (GTK_WIDGET_NO_WINDOW (widget))
3202 *x -= widget->allocation.x;
3204 *y -= widget->allocation.y;
3209 /*****************************************
3210 * gtk_widget_is_ancestor:
3215 *****************************************/
3218 gtk_widget_is_ancestor (GtkWidget *widget,
3219 GtkWidget *ancestor)
3221 g_return_val_if_fail (widget != NULL, FALSE);
3222 g_return_val_if_fail (ancestor != NULL, FALSE);
3226 if (widget->parent == ancestor)
3228 widget = widget->parent;
3234 /*****************************************
3235 * gtk_widget_is_child:
3240 *****************************************/
3243 gtk_widget_is_child (GtkWidget *widget,
3246 g_return_val_if_fail (widget != NULL, FALSE);
3247 g_return_val_if_fail (child != NULL, FALSE);
3249 return (child->parent == widget);
3252 /*****************************************
3253 * gtk_widget_push_colormap:
3258 *****************************************/
3261 gtk_widget_push_colormap (GdkColormap *cmap)
3263 g_return_if_fail (cmap != NULL);
3265 colormap_stack = g_slist_prepend (colormap_stack, cmap);
3268 /*****************************************
3269 * gtk_widget_push_visual:
3274 *****************************************/
3277 gtk_widget_push_visual (GdkVisual *visual)
3279 g_return_if_fail (visual != NULL);
3281 visual_stack = g_slist_prepend (visual_stack, visual);
3285 gtk_widget_push_composite (void)
3287 composite_child_stack++;
3291 gtk_widget_pop_composite (void)
3293 if (composite_child_stack)
3294 composite_child_stack--;
3297 /*****************************************
3298 * gtk_widget_pop_colormap:
3303 *****************************************/
3306 gtk_widget_pop_colormap (void)
3312 tmp = colormap_stack;
3313 colormap_stack = colormap_stack->next;
3314 g_slist_free_1 (tmp);
3318 /*****************************************
3319 * gtk_widget_pop_visual:
3324 *****************************************/
3327 gtk_widget_pop_visual (void)
3334 visual_stack = visual_stack->next;
3335 g_slist_free_1 (tmp);
3339 /*****************************************
3340 * gtk_widget_set_default_colormap:
3345 *****************************************/
3348 gtk_widget_set_default_colormap (GdkColormap *colormap)
3350 if (default_colormap != colormap)
3352 if (default_colormap)
3353 gdk_colormap_unref (default_colormap);
3354 default_colormap = colormap;
3355 if (default_colormap)
3356 gdk_colormap_ref (default_colormap);
3360 /*****************************************
3361 * gtk_widget_set_default_visual:
3366 *****************************************/
3369 gtk_widget_set_default_visual (GdkVisual *visual)
3371 default_visual = visual;
3374 /*****************************************
3375 * gtk_widget_get_default_colormap:
3380 *****************************************/
3383 gtk_widget_get_default_colormap (void)
3385 if (!default_colormap)
3386 default_colormap = gdk_colormap_get_system ();
3388 return default_colormap;
3391 /*****************************************
3392 * gtk_widget_get_default_visual:
3397 *****************************************/
3400 gtk_widget_get_default_visual (void)
3402 if (!default_visual)
3403 default_visual = gdk_visual_get_system ();
3405 return default_visual;
3409 gtk_widget_shutdown (GtkObject *object)
3413 /* gtk_object_destroy() will already hold a refcount on object
3415 widget = GTK_WIDGET (object);
3418 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
3420 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3421 if (GTK_WIDGET_REALIZED (widget))
3422 gtk_widget_unrealize (widget);
3424 parent_class->shutdown (object);
3428 gtk_widget_real_destroy (GtkObject *object)
3431 GtkStyle *saved_style;
3433 /* gtk_object_destroy() will already hold a refcount on object
3435 widget = GTK_WIDGET (object);
3437 gtk_grab_remove (widget);
3438 gtk_selection_remove_all (widget);
3440 saved_style = gtk_object_get_data_by_id (object, saved_default_style_key_id);
3443 gtk_style_unref (saved_style);
3444 gtk_object_remove_data_by_id (object, saved_default_style_key_id);
3447 gtk_style_unref (widget->style);
3448 widget->style = NULL;
3450 parent_class->destroy (object);
3454 gtk_widget_finalize (GtkObject *object)
3457 GtkWidgetAuxInfo *aux_info;
3459 GdkExtensionMode *mode;
3461 widget = GTK_WIDGET (object);
3464 g_free (widget->name);
3466 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3468 gtk_widget_aux_info_destroy (aux_info);
3470 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3474 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3478 parent_class->finalize (object);
3481 /*****************************************
3482 * gtk_widget_real_show:
3487 *****************************************/
3490 gtk_widget_real_show (GtkWidget *widget)
3492 g_return_if_fail (widget != NULL);
3493 g_return_if_fail (GTK_IS_WIDGET (widget));
3495 if (!GTK_WIDGET_VISIBLE (widget))
3497 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
3501 gtk_widget_queue_resize (widget->parent);
3503 if (GTK_WIDGET_MAPPED (widget->parent))
3504 gtk_widget_map (widget);
3509 /*****************************************
3510 * gtk_widget_real_hide:
3515 *****************************************/
3518 gtk_widget_real_hide (GtkWidget *widget)
3520 g_return_if_fail (widget != NULL);
3521 g_return_if_fail (GTK_IS_WIDGET (widget));
3523 if (GTK_WIDGET_VISIBLE (widget))
3525 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3527 if (GTK_WIDGET_MAPPED (widget))
3528 gtk_widget_unmap (widget);
3531 gtk_widget_queue_resize (widget->parent);
3535 /*****************************************
3536 * gtk_widget_real_map:
3541 *****************************************/
3544 gtk_widget_real_map (GtkWidget *widget)
3546 g_return_if_fail (widget != NULL);
3547 g_return_if_fail (GTK_IS_WIDGET (widget));
3549 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget))
3551 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
3553 if (!GTK_WIDGET_NO_WINDOW (widget))
3554 gdk_window_show (widget->window);
3556 gtk_widget_queue_draw (widget);
3560 /*****************************************
3561 * gtk_widget_real_unmap:
3566 *****************************************/
3569 gtk_widget_real_unmap (GtkWidget *widget)
3571 g_return_if_fail (widget != NULL);
3572 g_return_if_fail (GTK_IS_WIDGET (widget));
3574 if (GTK_WIDGET_MAPPED (widget))
3576 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
3578 if (GTK_WIDGET_NO_WINDOW (widget))
3579 gdk_window_clear_area (widget->window,
3580 widget->allocation.x,
3581 widget->allocation.y,
3582 widget->allocation.width,
3583 widget->allocation.height);
3585 gdk_window_hide (widget->window);
3589 /*****************************************
3590 * gtk_widget_real_realize:
3595 *****************************************/
3598 gtk_widget_real_realize (GtkWidget *widget)
3600 g_return_if_fail (widget != NULL);
3601 g_return_if_fail (GTK_IS_WIDGET (widget));
3602 g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
3604 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
3607 widget->window = gtk_widget_get_parent_window (widget);
3608 gdk_window_ref (widget->window);
3610 widget->style = gtk_style_attach (widget->style, widget->window);
3613 /*****************************************
3614 * gtk_widget_real_unrealize:
3619 *****************************************/
3622 gtk_widget_real_unrealize (GtkWidget *widget)
3624 g_return_if_fail (widget != NULL);
3625 g_return_if_fail (GTK_IS_WIDGET (widget));
3627 if (GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_MAPPED (widget))
3628 gtk_widget_real_unmap (widget);
3630 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
3632 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT(widget)->klass->type));
3635 gtk_style_detach (widget->style);
3636 if (!GTK_WIDGET_NO_WINDOW (widget))
3638 gdk_window_set_user_data (widget->window, NULL);
3639 gdk_window_destroy (widget->window);
3640 widget->window = NULL;
3644 gdk_window_unref (widget->window);
3645 widget->window = NULL;
3648 /* Unrealize afterwards to improve visual effect */
3650 if (GTK_IS_CONTAINER (widget))
3651 gtk_container_forall (GTK_CONTAINER (widget),
3652 (GtkCallback) gtk_widget_unrealize,
3656 /*****************************************
3657 * gtk_widget_real_draw:
3662 *****************************************/
3665 gtk_widget_real_draw (GtkWidget *widget,
3668 GdkEventExpose event;
3670 g_return_if_fail (widget != NULL);
3671 g_return_if_fail (GTK_IS_WIDGET (widget));
3672 g_return_if_fail (area != NULL);
3674 if (GTK_WIDGET_DRAWABLE (widget))
3676 event.type = GDK_EXPOSE;
3677 event.send_event = TRUE;
3678 event.window = widget->window;
3682 gdk_window_ref (event.window);
3683 gtk_widget_event (widget, (GdkEvent*) &event);
3684 gdk_window_unref (event.window);
3689 gtk_widget_real_size_request (GtkWidget *widget,
3690 GtkRequisition *requisition)
3692 g_return_if_fail (widget != NULL);
3693 g_return_if_fail (GTK_IS_WIDGET (widget));
3695 requisition->width = widget->requisition.width;
3696 requisition->height = widget->requisition.height;
3700 gtk_widget_real_size_allocate (GtkWidget *widget,
3701 GtkAllocation *allocation)
3703 g_return_if_fail (widget != NULL);
3704 g_return_if_fail (GTK_IS_WIDGET (widget));
3706 if (GTK_WIDGET_NO_WINDOW (widget) &&
3707 GTK_WIDGET_MAPPED (widget) &&
3708 ((widget->allocation.x != allocation->x) ||
3709 (widget->allocation.y != allocation->y) ||
3710 (widget->allocation.width != allocation->width) ||
3711 (widget->allocation.height != allocation->height)) &&
3712 (widget->allocation.width != 0) &&
3713 (widget->allocation.height != 0))
3714 gdk_window_clear_area (widget->window,
3715 widget->allocation.x,
3716 widget->allocation.y,
3717 widget->allocation.width,
3718 widget->allocation.height);
3720 widget->allocation = *allocation;
3722 if (GTK_WIDGET_REALIZED (widget) &&
3723 !GTK_WIDGET_NO_WINDOW (widget))
3724 gdk_window_move_resize (widget->window,
3725 allocation->x, allocation->y,
3726 allocation->width, allocation->height);
3729 /*****************************************
3730 * gtk_widget_peek_colormap:
3735 *****************************************/
3738 gtk_widget_peek_colormap (void)
3741 return (GdkColormap*) colormap_stack->data;
3742 return gtk_widget_get_default_colormap ();
3745 /*****************************************
3746 * gtk_widget_peek_visual:
3751 *****************************************/
3754 gtk_widget_peek_visual (void)
3757 return (GdkVisual*) visual_stack->data;
3758 return gtk_widget_get_default_visual ();
3762 gtk_widget_propagate_state (GtkWidget *widget,
3767 /* don't call this function with state==GTK_STATE_INSENSITIVE,
3768 * parent_sensitive==TRUE on a sensitive widget
3771 old_state = GTK_WIDGET_STATE (widget);
3773 if (data->parent_sensitive)
3775 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3777 if (GTK_WIDGET_IS_SENSITIVE (widget))
3779 if (data->state_restoration)
3780 GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget);
3782 GTK_WIDGET_STATE (widget) = data->state;
3786 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3787 if (!data->state_restoration &&
3788 data->state != GTK_STATE_INSENSITIVE)
3789 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3794 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3795 if (!data->state_restoration)
3797 if (data->state != GTK_STATE_INSENSITIVE)
3798 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3800 else if (GTK_WIDGET_STATE (widget) != GTK_STATE_INSENSITIVE)
3801 GTK_WIDGET_SAVED_STATE (widget) = GTK_WIDGET_STATE (widget);
3802 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3805 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
3809 window = gtk_widget_get_ancestor (widget, gtk_window_get_type ());
3811 gtk_window_set_focus (GTK_WINDOW (window), NULL);
3814 if (old_state != GTK_WIDGET_STATE (widget))
3816 gtk_widget_ref (widget);
3817 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
3819 if (GTK_IS_CONTAINER (widget))
3821 data->parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget) != FALSE);
3822 data->state = GTK_WIDGET_STATE (widget);
3823 if (data->use_forall)
3824 gtk_container_forall (GTK_CONTAINER (widget),
3825 (GtkCallback) gtk_widget_propagate_state,
3828 gtk_container_foreach (GTK_CONTAINER (widget),
3829 (GtkCallback) gtk_widget_propagate_state,
3832 gtk_widget_unref (widget);
3836 /*****************************************
3837 * gtk_widget_draw_children_recurse:
3842 *****************************************/
3845 gtk_widget_draw_children_recurse (GtkWidget *widget,
3846 gpointer client_data)
3848 gtk_widget_draw (widget, NULL);
3849 gtk_widget_draw_children (widget);
3852 /*****************************************
3853 * gtk_widget_aux_info_new:
3858 *****************************************/
3860 static GtkWidgetAuxInfo*
3861 gtk_widget_aux_info_new (void)
3863 GtkWidgetAuxInfo *aux_info;
3865 if (!aux_info_mem_chunk)
3866 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
3867 sizeof (GtkWidgetAuxInfo),
3868 1024, G_ALLOC_AND_FREE);
3870 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
3874 aux_info->width = 0;
3875 aux_info->height = 0;
3880 /*****************************************
3881 * gtk_widget_aux_info_destroy:
3886 *****************************************/
3889 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
3891 g_return_if_fail (aux_info != NULL);
3893 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
3896 /*****************************************
3897 * gtk_widget_shape_combine_mask:
3898 * set a shape for this widgets' gdk window, this allows for
3899 * transparent windows etc., see gdk_window_shape_combine_mask
3900 * for more information
3905 *****************************************/
3907 gtk_widget_shape_combine_mask (GtkWidget *widget,
3908 GdkBitmap *shape_mask,
3912 GtkWidgetShapeInfo* shape_info;
3914 g_return_if_fail (widget != NULL);
3915 /* set_shape doesn't work on widgets without gdk window */
3916 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3920 GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
3923 gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
3925 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
3926 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
3927 g_free (shape_info);
3931 GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
3933 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
3936 shape_info = g_new (GtkWidgetShapeInfo, 1);
3937 gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
3939 shape_info->shape_mask = shape_mask;
3940 shape_info->offset_x = offset_x;
3941 shape_info->offset_y = offset_y;
3943 /* set shape if widget has a gdk window allready.
3944 * otherwise the shape is scheduled to be set by gtk_widget_realize.
3947 gdk_window_shape_combine_mask (widget->window, shape_mask,
3948 offset_x, offset_y);
3952 /*****************************************
3953 * gtk_widget_dnd_drag_add:
3954 * when you get a DRAG_ENTER event, you can use this
3955 * to tell Gtk ofother widgets that are to be dragged as well
3960 *****************************************/
3962 gtk_widget_dnd_drag_add (GtkWidget *widget)
3966 /*****************************************
3967 * gtk_widget_dnd_drag_set:
3968 * these two functions enable drag and/or drop on a
3969 * widget and also let Gtk know what data types will be accepted
3970 * use MIME type naming,plus tacking "URL:" on the front for link
3977 *****************************************/
3979 gtk_widget_dnd_drag_set (GtkWidget *widget,
3981 gchar **type_accept_list,
3984 g_return_if_fail(widget != NULL);
3986 if (!widget->window)
3987 gtk_widget_realize (widget);
3989 g_return_if_fail (widget->window != NULL);
3990 gdk_window_dnd_drag_set (widget->window,
3996 /*****************************************
3997 * gtk_widget_dnd_drop_set:
4002 *****************************************/
4004 gtk_widget_dnd_drop_set (GtkWidget *widget,
4006 gchar **type_accept_list,
4008 guint8 is_destructive_operation)
4010 g_return_if_fail(widget != NULL);
4012 if (!widget->window)
4013 gtk_widget_realize (widget);
4015 g_return_if_fail (widget->window != NULL);
4016 gdk_window_dnd_drop_set (widget->window,
4020 is_destructive_operation);
4023 /*****************************************
4024 * gtk_widget_dnd_data_set:
4029 *****************************************/
4031 gtk_widget_dnd_data_set (GtkWidget *widget,
4034 gulong data_numbytes)
4036 g_return_if_fail (widget != NULL);
4037 g_return_if_fail (widget->window != NULL);
4039 gdk_window_dnd_data_set (widget->window, event, data, data_numbytes);
4043 gtk_widget_ref (GtkWidget *widget)
4045 g_return_if_fail (widget != NULL);
4046 g_return_if_fail (GTK_IS_WIDGET (widget));
4048 gtk_object_ref ((GtkObject*) widget);
4052 gtk_widget_unref (GtkWidget *widget)
4054 g_return_if_fail (widget != NULL);
4055 g_return_if_fail (GTK_IS_WIDGET (widget));
4057 gtk_object_unref ((GtkObject*) widget);
4061 gtk_widget_path (GtkWidget *widget,
4062 guint *path_length_p,
4064 gchar **path_reversed_p)
4066 static gchar *rev_path = NULL;
4067 static guint path_len = 0;
4070 g_return_if_fail (widget != NULL);
4071 g_return_if_fail (GTK_IS_WIDGET (widget));
4080 string = gtk_widget_get_name (widget);
4081 l = strlen (string);
4082 while (path_len <= len + l + 1)
4084 path_len += INIT_PATH_SIZE;
4085 rev_path = g_realloc (rev_path, path_len);
4093 widget = widget->parent;
4096 rev_path[len++] = '.';
4098 rev_path[len++] = 0;
4103 *path_length_p = len - 1;
4104 if (path_reversed_p)
4105 *path_reversed_p = g_strdup (rev_path);
4108 *path_p = g_strdup (rev_path);
4109 g_strreverse (*path_p);
4114 gtk_widget_class_path (GtkWidget *widget,
4115 guint *path_length_p,
4117 gchar **path_reversed_p)
4119 static gchar *rev_path = NULL;
4120 static guint path_len = 0;
4123 g_return_if_fail (widget != NULL);
4124 g_return_if_fail (GTK_IS_WIDGET (widget));
4133 string = gtk_type_name (GTK_WIDGET_TYPE (widget));
4134 l = strlen (string);
4135 while (path_len <= len + l + 1)
4137 path_len += INIT_PATH_SIZE;
4138 rev_path = g_realloc (rev_path, path_len);
4146 widget = widget->parent;
4149 rev_path[len++] = '.';
4151 rev_path[len++] = 0;
4156 *path_length_p = len - 1;
4157 if (path_reversed_p)
4158 *path_reversed_p = g_strdup (rev_path);
4161 *path_p = g_strdup (rev_path);
4162 g_strreverse (*path_p);