1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 #include "gtkcontainer.h"
24 #include "gtkselection.h"
25 #include "gtksignal.h"
26 #include "gtkwidget.h"
27 #include "gtkwindow.h"
28 #include "gtkbindings.h"
29 #include "gtkprivate.h"
34 #define WIDGET_CLASS(w) GTK_WIDGET_CLASS (GTK_OBJECT (w)->klass)
35 #define INIT_PATH_SIZE (512)
71 PROPERTY_NOTIFY_EVENT,
72 SELECTION_CLEAR_EVENT,
73 SELECTION_REQUEST_EVENT,
74 SELECTION_NOTIFY_EVENT,
83 DROP_DATA_AVAILABLE_EVENT,
87 VISIBILITY_NOTIFY_EVENT,
112 typedef void (*GtkWidgetSignal1) (GtkObject *object,
115 typedef gint (*GtkWidgetSignal2) (GtkObject *object,
120 typedef void (*GtkWidgetSignal3) (GtkObject *object,
123 typedef gint (*GtkWidgetSignal4) (GtkObject *object,
126 typedef void (*GtkWidgetSignal5) (GtkObject *object,
129 typedef void (*GtkWidgetSignal6) (GtkObject *object,
132 typedef void (*GtkWidgetSignal7) (GtkObject *object,
136 typedef struct _GtkStateData GtkStateData;
141 guint state_restauration : 1;
142 guint parent_sensitive : 1;
146 static void gtk_widget_marshal_signal_1 (GtkObject *object,
150 static void gtk_widget_marshal_signal_4 (GtkObject *object,
154 static void gtk_widget_marshal_signal_5 (GtkObject *object,
158 static void gtk_widget_marshal_signal_6 (GtkObject *object,
162 static void gtk_widget_marshal_signal_7 (GtkObject *object,
167 static void gtk_widget_class_init (GtkWidgetClass *klass);
168 static void gtk_widget_init (GtkWidget *widget);
169 static void gtk_widget_set_arg (GtkObject *object,
172 static void gtk_widget_get_arg (GtkObject *object,
175 static void gtk_widget_shutdown (GtkObject *object);
176 static void gtk_widget_real_destroy (GtkObject *object);
177 static void gtk_widget_finalize (GtkObject *object);
178 static void gtk_widget_real_show (GtkWidget *widget);
179 static void gtk_widget_real_hide (GtkWidget *widget);
180 static void gtk_widget_real_map (GtkWidget *widget);
181 static void gtk_widget_real_unmap (GtkWidget *widget);
182 static void gtk_widget_real_realize (GtkWidget *widget);
183 static void gtk_widget_real_unrealize (GtkWidget *widget);
184 static void gtk_widget_real_draw (GtkWidget *widget,
186 static void gtk_widget_real_size_allocate (GtkWidget *widget,
187 GtkAllocation *allocation);
188 static gint gtk_widget_real_key_press_event (GtkWidget *widget,
190 static gint gtk_widget_real_key_release_event (GtkWidget *widget,
192 static void gtk_widget_style_set (GtkWidget *widget,
193 GtkStyle *previous_style);
195 static GdkColormap* gtk_widget_peek_colormap (void);
196 static GdkVisual* gtk_widget_peek_visual (void);
197 static GtkStyle* gtk_widget_peek_style (void);
199 static void gtk_widget_reparent_container_child (GtkWidget *widget,
200 gpointer client_data);
201 static void gtk_widget_propagate_state (GtkWidget *widget,
203 static void gtk_widget_draw_children_recurse (GtkWidget *widget,
204 gpointer client_data);
205 static void gtk_widget_set_style_internal (GtkWidget *widget,
207 gboolean initial_emission);
208 static void gtk_widget_set_style_recurse (GtkWidget *widget,
209 gpointer client_data);
211 extern GtkArg* gtk_object_collect_args (guint *nargs,
212 GtkType (*) (const gchar*),
216 static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
217 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
219 static GtkObjectClass *parent_class = NULL;
220 static guint widget_signals[LAST_SIGNAL] = { 0 };
222 static GMemChunk *aux_info_mem_chunk = NULL;
224 static GdkColormap *default_colormap = NULL;
225 static GdkVisual *default_visual = NULL;
226 static GtkStyle *default_style = NULL;
228 static GSList *colormap_stack = NULL;
229 static GSList *visual_stack = NULL;
230 static GSList *style_stack = NULL;
232 static GSList *gtk_widget_redraw_queue = NULL;
234 static const gchar *aux_info_key = "gtk-aux-info";
235 static guint aux_info_key_id = 0;
236 static const gchar *event_key = "gtk-event-mask";
237 static guint event_key_id = 0;
238 static const gchar *extension_event_key = "gtk-extension-event-mode";
239 static guint extension_event_key_id = 0;
240 static const gchar *parent_window_key = "gtk-parent-window";
241 static guint parent_window_key_id = 0;
242 static const gchar *saved_default_style_key = "gtk-saved-default-style";
243 static guint saved_default_style_key_id = 0;
244 static const gchar *shape_info_key = "gtk-shape-info";
245 static const gchar *colormap_key = "gtk-colormap";
246 static const gchar *visual_key = "gtk-visual";
250 /*****************************************
251 * gtk_widget_get_type:
256 *****************************************/
259 gtk_widget_get_type (void)
261 static GtkType widget_type = 0;
265 GtkTypeInfo widget_info =
269 sizeof (GtkWidgetClass),
270 (GtkClassInitFunc) gtk_widget_class_init,
271 (GtkObjectInitFunc) gtk_widget_init,
272 /* reserved_1 */ NULL,
273 /* reserved_2 */ NULL,
274 (GtkClassInitFunc) NULL,
277 widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);
283 /*****************************************
284 * gtk_widget_class_init:
289 *****************************************/
292 gtk_widget_debug_msg (GtkWidget *widget,
295 fprintf (stderr, "Gtk-DEBUG: %s\n", string);
299 gtk_widget_class_init (GtkWidgetClass *klass)
301 GtkObjectClass *object_class;
303 object_class = (GtkObjectClass*) klass;
305 parent_class = gtk_type_class (gtk_object_get_type ());
307 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
308 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
309 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
310 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
311 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
312 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
313 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
314 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
315 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
316 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
317 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
318 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
319 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
320 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
321 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
323 widget_signals[SHOW] =
324 gtk_signal_new ("show",
327 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
328 gtk_signal_default_marshaller,
330 widget_signals[HIDE] =
331 gtk_signal_new ("hide",
334 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
335 gtk_signal_default_marshaller,
337 widget_signals[MAP] =
338 gtk_signal_new ("map",
341 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
342 gtk_signal_default_marshaller,
344 widget_signals[UNMAP] =
345 gtk_signal_new ("unmap",
348 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
349 gtk_signal_default_marshaller,
351 widget_signals[REALIZE] =
352 gtk_signal_new ("realize",
355 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
356 gtk_signal_default_marshaller,
358 widget_signals[UNREALIZE] =
359 gtk_signal_new ("unrealize",
362 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
363 gtk_signal_default_marshaller,
365 widget_signals[DRAW] =
366 gtk_signal_new ("draw",
369 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
370 gtk_widget_marshal_signal_1,
373 widget_signals[DRAW_FOCUS] =
374 gtk_signal_new ("draw_focus",
377 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
378 gtk_signal_default_marshaller,
380 widget_signals[DRAW_DEFAULT] =
381 gtk_signal_new ("draw_default",
384 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
385 gtk_signal_default_marshaller,
387 widget_signals[SIZE_REQUEST] =
388 gtk_signal_new ("size_request",
391 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
392 gtk_widget_marshal_signal_1,
395 widget_signals[SIZE_ALLOCATE] =
396 gtk_signal_new ("size_allocate",
399 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
400 gtk_widget_marshal_signal_1,
403 widget_signals[STATE_CHANGED] =
404 gtk_signal_new ("state_changed",
407 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
408 gtk_widget_marshal_signal_5,
410 GTK_TYPE_STATE_TYPE);
411 widget_signals[PARENT_SET] =
412 gtk_signal_new ("parent_set",
415 GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
416 gtk_widget_marshal_signal_6,
419 widget_signals[STYLE_SET] =
420 gtk_signal_new ("style_set",
423 GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
424 gtk_widget_marshal_signal_7,
427 widget_signals[ADD_ACCELERATOR] =
428 gtk_accel_group_create_add (object_class->type, GTK_RUN_LAST,
429 GTK_SIGNAL_OFFSET (GtkWidgetClass, add_accelerator));
430 widget_signals[REMOVE_ACCELERATOR] =
431 gtk_accel_group_create_remove (object_class->type, GTK_RUN_LAST,
432 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));
433 widget_signals[EVENT] =
434 gtk_signal_new ("event",
437 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
438 gtk_widget_marshal_signal_4,
441 widget_signals[BUTTON_PRESS_EVENT] =
442 gtk_signal_new ("button_press_event",
445 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
446 gtk_widget_marshal_signal_4,
449 widget_signals[BUTTON_RELEASE_EVENT] =
450 gtk_signal_new ("button_release_event",
453 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
454 gtk_widget_marshal_signal_4,
457 widget_signals[MOTION_NOTIFY_EVENT] =
458 gtk_signal_new ("motion_notify_event",
461 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
462 gtk_widget_marshal_signal_4,
465 widget_signals[DELETE_EVENT] =
466 gtk_signal_new ("delete_event",
469 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
470 gtk_widget_marshal_signal_4,
473 widget_signals[DESTROY_EVENT] =
474 gtk_signal_new ("destroy_event",
477 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
478 gtk_widget_marshal_signal_4,
481 widget_signals[EXPOSE_EVENT] =
482 gtk_signal_new ("expose_event",
485 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
486 gtk_widget_marshal_signal_4,
489 widget_signals[KEY_PRESS_EVENT] =
490 gtk_signal_new ("key_press_event",
493 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
494 gtk_widget_marshal_signal_4,
497 widget_signals[KEY_RELEASE_EVENT] =
498 gtk_signal_new ("key_release_event",
501 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
502 gtk_widget_marshal_signal_4,
505 widget_signals[ENTER_NOTIFY_EVENT] =
506 gtk_signal_new ("enter_notify_event",
509 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
510 gtk_widget_marshal_signal_4,
513 widget_signals[LEAVE_NOTIFY_EVENT] =
514 gtk_signal_new ("leave_notify_event",
517 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
518 gtk_widget_marshal_signal_4,
521 widget_signals[CONFIGURE_EVENT] =
522 gtk_signal_new ("configure_event",
525 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
526 gtk_widget_marshal_signal_4,
529 widget_signals[FOCUS_IN_EVENT] =
530 gtk_signal_new ("focus_in_event",
533 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
534 gtk_widget_marshal_signal_4,
537 widget_signals[FOCUS_OUT_EVENT] =
538 gtk_signal_new ("focus_out_event",
541 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
542 gtk_widget_marshal_signal_4,
545 widget_signals[MAP_EVENT] =
546 gtk_signal_new ("map_event",
549 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
550 gtk_widget_marshal_signal_4,
553 widget_signals[UNMAP_EVENT] =
554 gtk_signal_new ("unmap_event",
557 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
558 gtk_widget_marshal_signal_4,
561 widget_signals[PROPERTY_NOTIFY_EVENT] =
562 gtk_signal_new ("property_notify_event",
565 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
566 gtk_widget_marshal_signal_4,
569 widget_signals[SELECTION_CLEAR_EVENT] =
570 gtk_signal_new ("selection_clear_event",
573 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
574 gtk_widget_marshal_signal_4,
577 widget_signals[SELECTION_REQUEST_EVENT] =
578 gtk_signal_new ("selection_request_event",
581 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
582 gtk_widget_marshal_signal_4,
585 widget_signals[SELECTION_NOTIFY_EVENT] =
586 gtk_signal_new ("selection_notify_event",
589 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
590 gtk_widget_marshal_signal_4,
593 widget_signals[SELECTION_RECEIVED] =
594 gtk_signal_new ("selection_received",
597 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
598 gtk_widget_marshal_signal_1,
600 GTK_TYPE_SELECTION_DATA);
601 widget_signals[PROXIMITY_IN_EVENT] =
602 gtk_signal_new ("proximity_in_event",
605 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
606 gtk_widget_marshal_signal_4,
609 widget_signals[PROXIMITY_OUT_EVENT] =
610 gtk_signal_new ("proximity_out_event",
613 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
614 gtk_widget_marshal_signal_4,
617 widget_signals[DRAG_BEGIN_EVENT] =
618 gtk_signal_new ("drag_begin_event",
621 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin_event),
622 gtk_widget_marshal_signal_4,
625 widget_signals[DRAG_REQUEST_EVENT] =
626 gtk_signal_new ("drag_request_event",
629 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_request_event),
630 gtk_widget_marshal_signal_4,
633 widget_signals[DRAG_END_EVENT] =
634 gtk_signal_new ("drag_end_event",
637 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end_event),
638 gtk_widget_marshal_signal_4,
641 widget_signals[DROP_ENTER_EVENT] =
642 gtk_signal_new ("drop_enter_event",
645 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_enter_event),
646 gtk_widget_marshal_signal_4,
649 widget_signals[DROP_LEAVE_EVENT] =
650 gtk_signal_new ("drop_leave_event",
653 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_leave_event),
654 gtk_widget_marshal_signal_4,
657 widget_signals[DROP_DATA_AVAILABLE_EVENT] =
658 gtk_signal_new ("drop_data_available_event",
661 GTK_SIGNAL_OFFSET (GtkWidgetClass,
662 drop_data_available_event),
663 gtk_widget_marshal_signal_4,
666 widget_signals[VISIBILITY_NOTIFY_EVENT] =
667 gtk_signal_new ("visibility_notify_event",
670 GTK_SIGNAL_OFFSET (GtkWidgetClass, visibility_notify_event),
671 gtk_widget_marshal_signal_4,
674 widget_signals[CLIENT_EVENT] =
675 gtk_signal_new ("client_event",
678 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
679 gtk_widget_marshal_signal_4,
682 widget_signals[NO_EXPOSE_EVENT] =
683 gtk_signal_new ("no_expose_event",
686 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
687 gtk_widget_marshal_signal_4,
690 widget_signals[OTHER_EVENT] =
691 gtk_signal_new ("other_event",
694 GTK_SIGNAL_OFFSET (GtkWidgetClass, other_event),
695 gtk_widget_marshal_signal_4,
698 widget_signals[DEBUG_MSG] =
699 gtk_signal_new ("debug_msg",
700 GTK_RUN_LAST | GTK_RUN_ACTION,
702 GTK_SIGNAL_OFFSET (GtkWidgetClass, debug_msg),
703 gtk_widget_marshal_signal_1,
707 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
709 object_class->set_arg = gtk_widget_set_arg;
710 object_class->get_arg = gtk_widget_get_arg;
711 object_class->shutdown = gtk_widget_shutdown;
712 object_class->destroy = gtk_widget_real_destroy;
713 object_class->finalize = gtk_widget_finalize;
715 klass->activate_signal = 0;
716 klass->show = gtk_widget_real_show;
717 klass->hide = gtk_widget_real_hide;
718 klass->show_all = gtk_widget_real_show;
719 klass->hide_all = gtk_widget_real_hide;
720 klass->map = gtk_widget_real_map;
721 klass->unmap = gtk_widget_real_unmap;
722 klass->realize = gtk_widget_real_realize;
723 klass->unrealize = gtk_widget_real_unrealize;
724 klass->draw = gtk_widget_real_draw;
725 klass->draw_focus = NULL;
726 klass->size_request = NULL;
727 klass->size_allocate = gtk_widget_real_size_allocate;
728 klass->state_changed = NULL;
729 klass->parent_set = NULL;
730 klass->style_set = gtk_widget_style_set;
731 klass->add_accelerator = (void*) gtk_accel_group_handle_add;
732 klass->remove_accelerator = (void*) gtk_accel_group_handle_remove;
734 klass->button_press_event = NULL;
735 klass->button_release_event = NULL;
736 klass->motion_notify_event = NULL;
737 klass->delete_event = NULL;
738 klass->destroy_event = NULL;
739 klass->expose_event = NULL;
740 klass->key_press_event = gtk_widget_real_key_press_event;
741 klass->key_release_event = gtk_widget_real_key_release_event;
742 klass->enter_notify_event = NULL;
743 klass->leave_notify_event = NULL;
744 klass->configure_event = NULL;
745 klass->focus_in_event = NULL;
746 klass->focus_out_event = NULL;
747 klass->map_event = NULL;
748 klass->unmap_event = NULL;
749 klass->property_notify_event = gtk_selection_property_notify;
750 klass->selection_clear_event = gtk_selection_clear;
751 klass->selection_request_event = gtk_selection_request;
752 klass->selection_notify_event = gtk_selection_notify;
753 klass->selection_received = NULL;
754 klass->proximity_in_event = NULL;
755 klass->proximity_out_event = NULL;
756 klass->drag_begin_event = NULL;
757 klass->drag_request_event = NULL;
758 klass->drop_enter_event = NULL;
759 klass->drop_leave_event = NULL;
760 klass->drop_data_available_event = NULL;
761 klass->no_expose_event = NULL;
762 klass->other_event = NULL;
764 klass->debug_msg = gtk_widget_debug_msg;
769 GtkBindingSet *binding_set;
771 binding_set = gtk_binding_set_by_class (klass);
772 gtk_binding_entry_add_signal (binding_set,
773 '9', GDK_CONTROL_MASK | GDK_RELEASE_MASK,
776 GTK_TYPE_STRING, "GtkWidgetClass test");
781 gtk_widget_set_arg (GtkObject *object,
787 widget = GTK_WIDGET (object);
794 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
797 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
800 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
803 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
806 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -1);
809 gtk_widget_set_usize (widget, -1, GTK_VALUE_INT (*arg));
812 if (GTK_VALUE_BOOL(*arg))
813 gtk_widget_show (widget);
815 gtk_widget_hide (widget);
818 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
821 saved_flags = GTK_WIDGET_FLAGS (widget);
822 if (GTK_VALUE_BOOL (*arg))
823 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
825 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
826 if (saved_flags != GTK_WIDGET_FLAGS (widget))
827 gtk_widget_queue_resize (widget);
830 if (GTK_VALUE_BOOL (*arg))
831 gtk_widget_grab_focus (widget);
833 case ARG_CAN_DEFAULT:
834 saved_flags = GTK_WIDGET_FLAGS (widget);
835 if (GTK_VALUE_BOOL (*arg))
836 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
838 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
839 if (saved_flags != GTK_WIDGET_FLAGS (widget))
840 gtk_widget_queue_resize (widget);
842 case ARG_HAS_DEFAULT:
843 if (GTK_VALUE_BOOL (*arg))
844 gtk_widget_grab_default (widget);
847 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
850 if (!GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_NO_WINDOW (widget))
851 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
853 case ARG_EXTENSION_EVENTS:
854 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
861 /*****************************************
862 * gtk_widget_get_arg:
867 *****************************************/
870 gtk_widget_get_arg (GtkObject *object,
876 widget = GTK_WIDGET (object);
880 GtkWidgetAuxInfo *aux_info;
882 GdkExtensionMode *modep;
886 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
888 GTK_VALUE_STRING (*arg) = g_strdup ("");
891 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
894 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
896 GTK_VALUE_INT (*arg) = -2;
898 GTK_VALUE_INT (*arg) = aux_info->x;
901 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
903 GTK_VALUE_INT (*arg) = -2;
905 GTK_VALUE_INT (*arg) = aux_info->y;
908 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
910 GTK_VALUE_INT (*arg) = -2;
912 GTK_VALUE_INT (*arg) = aux_info->width;
915 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
917 GTK_VALUE_INT (*arg) = -2;
919 GTK_VALUE_INT (*arg) = aux_info->height;
922 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_VISIBLE (widget) != FALSE);
925 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_SENSITIVE (widget) != FALSE);
928 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_FOCUS (widget) != FALSE);
931 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_FOCUS (widget) != FALSE);
933 case ARG_CAN_DEFAULT:
934 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_DEFAULT (widget) != FALSE);
936 case ARG_HAS_DEFAULT:
937 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
940 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
943 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
945 GTK_VALUE_FLAGS (*arg) = 0;
947 GTK_VALUE_FLAGS (*arg) = *eventp;
949 case ARG_EXTENSION_EVENTS:
950 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
952 GTK_VALUE_FLAGS (*arg) = 0;
954 GTK_VALUE_FLAGS (*arg) = *modep;
957 arg->type = GTK_TYPE_INVALID;
962 /*****************************************
968 *****************************************/
971 gtk_widget_init (GtkWidget *widget)
973 GdkColormap *colormap;
976 GTK_PRIVATE_FLAGS (widget) = 0;
977 widget->state = GTK_STATE_NORMAL;
978 widget->saved_state = GTK_STATE_NORMAL;
980 widget->requisition.width = 0;
981 widget->requisition.height = 0;
982 widget->allocation.x = -1;
983 widget->allocation.y = -1;
984 widget->allocation.width = 1;
985 widget->allocation.height = 1;
986 widget->window = NULL;
987 widget->parent = NULL;
989 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE | GTK_PARENT_SENSITIVE);
991 widget->style = gtk_widget_peek_style ();
992 gtk_style_ref (widget->style);
994 colormap = gtk_widget_peek_colormap ();
995 visual = gtk_widget_peek_visual ();
997 /* XXX - should we ref the colormap and visual, too? */
999 if (colormap != gtk_widget_get_default_colormap ())
1001 /* gdk_colormap_ref (colormap); */
1002 gtk_object_set_data (GTK_OBJECT (widget), colormap_key, colormap);
1005 if (visual != gtk_widget_get_default_visual ())
1007 /* gdk_visual_ref (visual); */
1008 gtk_object_set_data (GTK_OBJECT (widget), visual_key, visual);
1012 /*****************************************
1018 *****************************************/
1021 gtk_widget_new (guint type,
1030 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1032 obj = gtk_type_new (type);
1034 va_start (args1, type);
1035 va_start (args2, type);
1037 args = gtk_object_collect_args (&nargs, gtk_object_get_arg_type, args1, args2);
1038 gtk_object_setv (obj, nargs, args);
1044 return GTK_WIDGET (obj);
1047 /*****************************************
1053 *****************************************/
1056 gtk_widget_newv (guint type,
1060 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1062 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1065 /*****************************************
1071 *****************************************/
1074 gtk_widget_get (GtkWidget *widget,
1077 g_return_if_fail (widget != NULL);
1078 g_return_if_fail (arg != NULL);
1080 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1083 /*****************************************
1089 *****************************************/
1092 gtk_widget_getv (GtkWidget *widget,
1096 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1099 /*****************************************
1105 *****************************************/
1108 gtk_widget_set (GtkWidget *widget,
1116 g_return_if_fail (widget != NULL);
1118 va_start (args1, widget);
1119 va_start (args2, widget);
1121 args = gtk_object_collect_args (&nargs, gtk_object_get_arg_type, args1, args2);
1122 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1129 /*****************************************
1135 *****************************************/
1138 gtk_widget_setv (GtkWidget *widget,
1142 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1145 /*****************************************
1146 * gtk_widget_unparent:
1147 * do any cleanup necessary necessary
1148 * for setting parent = NULL.
1153 *****************************************/
1156 gtk_widget_unparent (GtkWidget *widget)
1158 GtkWidget *toplevel;
1159 GtkWidget *old_parent;
1161 g_return_if_fail (widget != NULL);
1162 if (widget->parent == NULL)
1165 /* keep this function in sync with gtk_menu_detach()
1168 /* unset focused and default children properly, this code
1169 * should eventually move into some gtk_window_unparent_branch() or
1172 toplevel = gtk_widget_get_toplevel (widget);
1173 if (GTK_CONTAINER (widget->parent)->focus_child == widget)
1175 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL);
1177 if (GTK_IS_WINDOW (toplevel))
1181 child = GTK_WINDOW (toplevel)->focus_widget;
1183 while (child && child != widget)
1184 child = child->parent;
1186 if (child == widget)
1187 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1190 if (GTK_IS_WINDOW (toplevel))
1194 child = GTK_WINDOW (toplevel)->default_widget;
1196 while (child && child != widget)
1197 child = child->parent;
1199 if (child == widget)
1200 gtk_window_set_default (GTK_WINDOW (toplevel), NULL);
1203 if (GTK_IS_RESIZE_CONTAINER (widget))
1204 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1206 /* Remove the widget and all its children from any ->resize_widgets list
1207 * of all the parents in our branch. This code should move into gtkcontainer.c
1208 * somwhen, since we mess around with ->resize_widgets, which is
1209 * actually not of our business.
1211 * Two ways to make this prettier:
1212 * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer))
1213 * Change resize_widgets to a GList
1215 toplevel = widget->parent;
1221 if (!GTK_CONTAINER (toplevel)->resize_widgets)
1223 toplevel = toplevel->parent;
1228 slist = GTK_CONTAINER (toplevel)->resize_widgets;
1240 while (parent && (parent != widget))
1241 parent = parent->parent;
1243 if (parent == widget)
1245 GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED);
1251 /* it is really messy to have this signal disconnection
1252 * in gtkwidget.c, the resize_widgets invariants should
1253 * all be taken care off by gtkcontainer.c exclusively.
1256 gtk_signal_disconnect_by_func (GTK_OBJECT (toplevel),
1257 GTK_SIGNAL_FUNC (gtk_container_clear_resize_widgets),
1259 GTK_CONTAINER (toplevel)->resize_widgets = slist;
1262 g_slist_free_1 (last);
1268 toplevel = toplevel->parent;
1271 if (widget->window &&
1272 GTK_WIDGET_NO_WINDOW (widget) &&
1273 GTK_WIDGET_DRAWABLE (widget))
1274 gdk_window_clear_area (widget->window,
1275 widget->allocation.x,
1276 widget->allocation.y,
1277 widget->allocation.width,
1278 widget->allocation.height);
1280 /* Reset the width and height here, to force reallocation if we
1281 * get added back to a new parent. This won't work if our new
1282 * allocation is smaller than 1x1 and we actually want a size of 1x1...
1283 * (would 0x0 be OK here?)
1285 widget->allocation.width = 1;
1286 widget->allocation.height = 1;
1288 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1289 gtk_widget_unrealize (widget);
1291 old_parent = widget->parent;
1292 widget->parent = NULL;
1293 gtk_widget_set_parent_window (widget, NULL);
1294 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1296 gtk_widget_unref (widget);
1299 /*****************************************
1300 * gtk_widget_destroy:
1305 *****************************************/
1308 gtk_widget_destroy (GtkWidget *widget)
1310 g_return_if_fail (widget != NULL);
1311 g_return_if_fail (GTK_IS_WIDGET (widget));
1313 gtk_object_destroy ((GtkObject*) widget);
1316 /*****************************************
1317 * gtk_widget_destroyed:
1318 * Utility function: sets widget_pointer
1319 * to NULL when widget is destroyed.
1324 *****************************************/
1327 gtk_widget_destroyed (GtkWidget *widget,
1328 GtkWidget **widget_pointer)
1330 /* Don't make any assumptions about the
1332 * Even check widget_pointer.
1335 *widget_pointer = NULL;
1338 /*****************************************
1344 *****************************************/
1347 gtk_widget_show (GtkWidget *widget)
1349 g_return_if_fail (widget != NULL);
1351 if (!GTK_WIDGET_VISIBLE (widget))
1352 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1356 /*************************************************************
1357 * gtk_widget_show_now:
1358 * Show a widget, and if it is an unmapped toplevel widget
1359 * wait for the map_event before returning
1361 * Warning: This routine will call the main loop recursively.
1366 *************************************************************/
1369 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
1372 gtk_signal_disconnect_by_data (GTK_OBJECT (widget), flag);
1376 gtk_widget_show_now (GtkWidget *widget)
1380 /* make sure we will get event */
1381 if (!GTK_WIDGET_MAPPED (widget) &&
1382 GTK_WIDGET_TOPLEVEL (widget))
1384 gtk_widget_show (widget);
1386 gtk_signal_connect (GTK_OBJECT (widget), "map_event",
1387 GTK_SIGNAL_FUNC (gtk_widget_show_map_callback),
1391 gtk_main_iteration();
1394 gtk_widget_show (widget);
1397 /*****************************************
1403 *****************************************/
1406 gtk_widget_hide (GtkWidget *widget)
1408 g_return_if_fail (widget != NULL);
1409 g_return_if_fail (GTK_IS_WIDGET (widget));
1411 if (GTK_WIDGET_VISIBLE (widget))
1412 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1416 gtk_widget_hide_on_delete (GtkWidget *widget)
1418 g_return_val_if_fail (widget != NULL, FALSE);
1419 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
1421 gtk_widget_hide (widget);
1426 /*****************************************
1427 * gtk_widget_show_all:
1429 * Shows the widget and all children.
1431 * Container classes overwrite
1432 * show_all and hide_all to call
1433 * show_all (hide_all) on both themselves
1434 * and on their child widgets.
1439 *****************************************/
1442 gtk_widget_show_all (GtkWidget *widget)
1444 GtkWidgetClass *widget_class;
1446 g_return_if_fail (widget != NULL);
1448 /* show_all shouldn't be invoked through a signal,
1449 because in this case it would be quite slow - there would
1450 be a show and show_all signal emitted for every child widget.
1452 widget_class = GTK_WIDGET_CLASS(GTK_OBJECT(widget)->klass);
1453 widget_class->show_all (widget);
1456 /*****************************************
1457 * gtk_widget_hide_all:
1459 * Hides the widget and all children.
1460 * See gtk_widget_show_all.
1465 *****************************************/
1468 gtk_widget_hide_all (GtkWidget *widget)
1470 g_return_if_fail (widget != NULL);
1471 g_assert (widget->parent);
1473 GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass)->hide_all (widget);
1476 /*****************************************
1482 *****************************************/
1485 gtk_widget_map (GtkWidget *widget)
1487 g_return_if_fail (widget != NULL);
1489 if (!GTK_WIDGET_MAPPED (widget))
1491 if (!GTK_WIDGET_REALIZED (widget))
1492 gtk_widget_realize (widget);
1494 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1498 /*****************************************
1504 *****************************************/
1507 gtk_widget_unmap (GtkWidget *widget)
1509 g_return_if_fail (widget != NULL);
1511 if (GTK_WIDGET_MAPPED (widget))
1512 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1515 /*****************************************
1516 * gtk_widget_realize:
1521 *****************************************/
1524 gtk_widget_realize (GtkWidget *widget)
1527 GdkExtensionMode mode;
1528 GtkWidgetShapeInfo *shape_info;
1530 g_return_if_fail (widget != NULL);
1532 if (!GTK_WIDGET_REALIZED (widget))
1535 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1536 g_print ("%s\n", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1539 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1540 gtk_widget_realize (widget->parent);
1542 gtk_widget_ensure_style (widget);
1544 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1546 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1548 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1550 gdk_window_shape_combine_mask (widget->window,
1551 shape_info->shape_mask,
1552 shape_info->offset_x,
1553 shape_info->offset_y);
1556 if (!GTK_WIDGET_NO_WINDOW (widget))
1558 mode = gtk_widget_get_extension_events (widget);
1559 if (mode != GDK_EXTENSION_EVENTS_NONE)
1561 events = gtk_widget_get_events (widget);
1562 gdk_input_set_extension_events (widget->window, events, mode);
1569 /*****************************************
1570 * gtk_widget_unrealize:
1575 *****************************************/
1578 gtk_widget_unrealize (GtkWidget *widget)
1580 g_return_if_fail (widget != NULL);
1582 if (GTK_WIDGET_REDRAW_PENDING (widget))
1584 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1585 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1588 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1589 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
1591 if (GTK_WIDGET_REALIZED (widget))
1593 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1594 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
1598 /*****************************************
1599 * gtk_widget_queue_draw:
1604 *****************************************/
1607 gtk_widget_idle_draw (gpointer data)
1609 while (gtk_widget_redraw_queue)
1610 gtk_widget_draw (gtk_widget_redraw_queue->data, NULL);
1616 gtk_widget_queue_draw (GtkWidget *widget)
1620 g_return_if_fail (widget != NULL);
1622 if (GTK_WIDGET_DRAWABLE (widget))
1624 /* We queue the redraw if:
1625 * a) the widget is not already queued for redraw and
1626 * b) non of the widgets ancestors are queued for redraw.
1631 if (GTK_WIDGET_REDRAW_PENDING (parent))
1633 parent = parent->parent;
1636 GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_PENDING);
1637 if (gtk_widget_redraw_queue == NULL)
1638 gtk_idle_add_priority (GTK_PRIORITY_INTERNAL,
1639 gtk_widget_idle_draw,
1642 gtk_widget_redraw_queue = g_slist_prepend (gtk_widget_redraw_queue, widget);
1647 gtk_widget_queue_resize (GtkWidget *widget)
1649 g_return_if_fail (widget != NULL);
1650 g_return_if_fail (GTK_IS_WIDGET (widget));
1652 if (GTK_IS_RESIZE_CONTAINER (widget))
1653 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1656 gtk_container_queue_resize (GTK_CONTAINER (widget->parent));
1657 else if (GTK_WIDGET_TOPLEVEL (widget))
1658 gtk_container_queue_resize (GTK_CONTAINER (widget));
1661 /*****************************************
1667 *****************************************/
1670 gtk_widget_draw (GtkWidget *widget,
1673 GdkRectangle temp_area;
1675 g_return_if_fail (widget != NULL);
1677 if (GTK_WIDGET_REDRAW_PENDING (widget))
1679 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1680 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1685 if (GTK_WIDGET_DRAWABLE (widget))
1689 if (GTK_WIDGET_NO_WINDOW (widget))
1691 temp_area.x = widget->allocation.x;
1692 temp_area.y = widget->allocation.y;
1700 temp_area.width = widget->allocation.width;
1701 temp_area.height = widget->allocation.height;
1705 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
1709 /*****************************************
1710 * gtk_widget_draw_focus:
1715 *****************************************/
1718 gtk_widget_draw_focus (GtkWidget *widget)
1720 g_return_if_fail (widget != NULL);
1722 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
1725 /*****************************************
1726 * gtk_widget_draw_default:
1731 *****************************************/
1734 gtk_widget_draw_default (GtkWidget *widget)
1736 g_return_if_fail (widget != NULL);
1738 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
1741 /*****************************************
1742 * gtk_widget_draw_children:
1747 *****************************************/
1750 gtk_widget_draw_children (GtkWidget *widget)
1752 g_return_if_fail (widget != NULL);
1754 if (GTK_IS_CONTAINER (widget))
1755 gtk_container_foreach (GTK_CONTAINER (widget),
1756 gtk_widget_draw_children_recurse,
1760 /*****************************************
1761 * gtk_widget_size_request:
1766 *****************************************/
1769 gtk_widget_size_request (GtkWidget *widget,
1770 GtkRequisition *requisition)
1772 GtkWidgetAuxInfo *aux_info;
1774 g_return_if_fail (widget != NULL);
1776 gtk_widget_ref (widget);
1777 gtk_widget_ensure_style (widget);
1778 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
1780 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1783 if (aux_info->width > 0)
1784 requisition->width = aux_info->width;
1785 if (aux_info->height > 0)
1786 requisition->height = aux_info->height;
1788 gtk_widget_unref (widget);
1791 /*****************************************
1792 * gtk_widget_size_allocate:
1797 *****************************************/
1800 gtk_widget_size_allocate (GtkWidget *widget,
1801 GtkAllocation *allocation)
1803 GtkWidgetAuxInfo *aux_info;
1804 GtkAllocation real_allocation;
1806 g_return_if_fail (widget != NULL);
1808 real_allocation = *allocation;
1809 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1813 if (aux_info->x != -1)
1814 real_allocation.x = aux_info->x;
1815 if (aux_info->y != -1)
1816 real_allocation.y = aux_info->y;
1819 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
1823 gtk_widget_stop_add_accelerator (GtkWidget *widget)
1825 g_return_if_fail (widget != NULL);
1826 g_return_if_fail (GTK_IS_WIDGET (widget));
1828 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
1832 gtk_widget_stop_remove_accelerator (GtkWidget *widget)
1834 g_return_if_fail (widget != NULL);
1835 g_return_if_fail (GTK_IS_WIDGET (widget));
1837 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR]);
1841 gtk_widget_freeze_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_connect (GTK_OBJECT (widget),
1854 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1856 gtk_signal_connect (GTK_OBJECT (widget),
1857 "remove_accelerator",
1858 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
1864 gtk_widget_thaw_accelerators (GtkWidget *widget)
1866 g_return_if_fail (widget != NULL);
1867 g_return_if_fail (GTK_IS_WIDGET (widget));
1869 if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
1870 widget_signals[ADD_ACCELERATOR],
1872 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1875 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
1876 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
1878 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
1879 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
1885 gtk_widget_add_accelerator (GtkWidget *widget,
1886 const gchar *accel_signal,
1887 GtkAccelGroup *accel_group,
1890 GtkAccelFlags accel_flags)
1892 g_return_if_fail (widget != NULL);
1893 g_return_if_fail (GTK_IS_WIDGET (widget));
1894 g_return_if_fail (accel_group != NULL);
1896 gtk_accel_group_add (accel_group,
1900 (GtkObject*) widget,
1905 gtk_widget_remove_accelerator (GtkWidget *widget,
1906 GtkAccelGroup *accel_group,
1910 g_return_if_fail (widget != NULL);
1911 g_return_if_fail (GTK_IS_WIDGET (widget));
1912 g_return_if_fail (accel_group != NULL);
1914 gtk_accel_group_remove (accel_group,
1917 (GtkObject*) widget);
1921 gtk_widget_remove_accelerators (GtkWidget *widget,
1922 const gchar *accel_signal,
1923 gboolean visible_only)
1928 g_return_if_fail (widget != NULL);
1929 g_return_if_fail (GTK_IS_WIDGET (widget));
1930 g_return_if_fail (accel_signal != NULL);
1932 signal_id = gtk_signal_lookup (accel_signal, GTK_OBJECT_TYPE (widget));
1933 g_return_if_fail (signal_id != 0);
1935 slist = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
1938 GtkAccelEntry *ac_entry;
1940 ac_entry = slist->data;
1941 slist = slist->next;
1942 if (ac_entry->accel_flags & GTK_ACCEL_VISIBLE &&
1943 ac_entry->signal_id == signal_id)
1944 gtk_widget_remove_accelerator (GTK_WIDGET (widget),
1945 ac_entry->accel_group,
1946 ac_entry->accelerator_key,
1947 ac_entry->accelerator_mods);
1952 gtk_widget_accelerator_signal (GtkWidget *widget,
1953 GtkAccelGroup *accel_group,
1957 GtkAccelEntry *ac_entry;
1959 g_return_val_if_fail (widget != NULL, 0);
1960 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
1961 g_return_val_if_fail (accel_group != NULL, 0);
1963 ac_entry = gtk_accel_group_get_entry (accel_group, accel_key, accel_mods);
1965 if (ac_entry && ac_entry->object == (GtkObject*) widget)
1966 return ac_entry->signal_id;
1971 gtk_widget_real_key_press_event (GtkWidget *widget,
1974 gboolean handled = FALSE;
1976 g_return_val_if_fail (widget != NULL, handled);
1977 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
1978 g_return_val_if_fail (event != NULL, handled);
1981 handled = gtk_bindings_activate (GTK_OBJECT (widget),
1989 gtk_widget_real_key_release_event (GtkWidget *widget,
1992 gboolean handled = FALSE;
1994 g_return_val_if_fail (widget != NULL, handled);
1995 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
1996 g_return_val_if_fail (event != NULL, handled);
1999 handled = gtk_bindings_activate (GTK_OBJECT (widget),
2001 event->state | GDK_RELEASE_MASK);
2006 /*****************************************
2012 *****************************************/
2015 gtk_widget_event (GtkWidget *widget,
2021 g_return_val_if_fail (widget != NULL, TRUE);
2023 gtk_widget_ref (widget);
2025 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
2027 if (return_val || GTK_OBJECT_DESTROYED (widget))
2029 gtk_widget_unref (widget);
2033 switch (event->type)
2038 case GDK_BUTTON_PRESS:
2039 case GDK_2BUTTON_PRESS:
2040 case GDK_3BUTTON_PRESS:
2041 signal_num = BUTTON_PRESS_EVENT;
2043 case GDK_BUTTON_RELEASE:
2044 signal_num = BUTTON_RELEASE_EVENT;
2046 case GDK_MOTION_NOTIFY:
2047 signal_num = MOTION_NOTIFY_EVENT;
2050 signal_num = DELETE_EVENT;
2053 signal_num = DESTROY_EVENT;
2056 signal_num = KEY_PRESS_EVENT;
2058 case GDK_KEY_RELEASE:
2059 signal_num = KEY_RELEASE_EVENT;
2061 case GDK_ENTER_NOTIFY:
2062 signal_num = ENTER_NOTIFY_EVENT;
2064 case GDK_LEAVE_NOTIFY:
2065 signal_num = LEAVE_NOTIFY_EVENT;
2067 case GDK_FOCUS_CHANGE:
2068 if (event->focus_change.in)
2069 signal_num = FOCUS_IN_EVENT;
2071 signal_num = FOCUS_OUT_EVENT;
2074 signal_num = CONFIGURE_EVENT;
2077 signal_num = MAP_EVENT;
2080 signal_num = UNMAP_EVENT;
2082 case GDK_PROPERTY_NOTIFY:
2083 signal_num = PROPERTY_NOTIFY_EVENT;
2085 case GDK_SELECTION_CLEAR:
2086 signal_num = SELECTION_CLEAR_EVENT;
2088 case GDK_SELECTION_REQUEST:
2089 signal_num = SELECTION_REQUEST_EVENT;
2091 case GDK_SELECTION_NOTIFY:
2092 signal_num = SELECTION_NOTIFY_EVENT;
2094 case GDK_PROXIMITY_IN:
2095 signal_num = PROXIMITY_IN_EVENT;
2097 case GDK_PROXIMITY_OUT:
2098 signal_num = PROXIMITY_OUT_EVENT;
2100 case GDK_DRAG_BEGIN:
2101 signal_num = DRAG_BEGIN_EVENT;
2103 case GDK_DRAG_REQUEST:
2104 signal_num = DRAG_REQUEST_EVENT;
2106 case GDK_DROP_ENTER:
2107 signal_num = DROP_ENTER_EVENT;
2109 case GDK_DROP_LEAVE:
2110 signal_num = DROP_LEAVE_EVENT;
2112 case GDK_DROP_DATA_AVAIL:
2113 signal_num = DROP_DATA_AVAILABLE_EVENT;
2115 case GDK_OTHER_EVENT:
2116 signal_num = OTHER_EVENT;
2119 signal_num = NO_EXPOSE_EVENT;
2121 case GDK_CLIENT_EVENT:
2122 signal_num = CLIENT_EVENT;
2125 /* there is no sense in providing a widget with bogus expose events
2127 if (!event->any.window)
2129 gtk_widget_unref (widget);
2132 signal_num = EXPOSE_EVENT;
2134 case GDK_VISIBILITY_NOTIFY:
2135 signal_num = VISIBILITY_NOTIFY_EVENT;
2138 g_warning ("could not determine signal number for event: %d", event->type);
2139 gtk_widget_unref (widget);
2143 if (signal_num != -1)
2144 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
2146 return_val |= GTK_OBJECT_DESTROYED (widget);
2148 gtk_widget_unref (widget);
2153 /*****************************************
2154 * gtk_widget_activate:
2159 *****************************************/
2162 gtk_widget_activate (GtkWidget *widget)
2164 g_return_if_fail (widget != NULL);
2165 g_return_if_fail (GTK_IS_WIDGET (widget));
2167 if (WIDGET_CLASS (widget)->activate_signal)
2168 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
2171 /*****************************************
2172 * gtk_widget_reparent_container_child:
2173 * assistent function to gtk_widget_reparent
2178 *****************************************/
2181 gtk_widget_reparent_container_child(GtkWidget *widget,
2182 gpointer client_data)
2184 g_return_if_fail (widget != NULL);
2185 g_return_if_fail (client_data != NULL);
2187 if (GTK_WIDGET_NO_WINDOW (widget))
2190 gdk_window_unref (widget->window);
2191 widget->window = (GdkWindow*) client_data;
2193 gdk_window_ref (widget->window);
2195 if (GTK_IS_CONTAINER (widget))
2196 gtk_container_foreach (GTK_CONTAINER (widget),
2197 gtk_widget_reparent_container_child,
2201 gdk_window_reparent (widget->window,
2202 (GdkWindow*) client_data, 0, 0);
2205 /*****************************************
2206 * gtk_widget_reparent:
2211 *****************************************/
2214 gtk_widget_reparent (GtkWidget *widget,
2215 GtkWidget *new_parent)
2217 g_return_if_fail (widget != NULL);
2218 g_return_if_fail (GTK_IS_WIDGET (widget));
2219 g_return_if_fail (new_parent != NULL);
2220 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
2221 g_return_if_fail (widget->parent != NULL);
2223 if (widget->parent != new_parent)
2225 /* First try to see if we can get away without unrealizing
2226 * the widget as we reparent it. if so we set a flag so
2227 * that gtk_widget_unparent doesn't unrealize widget
2229 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
2230 GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
2232 gtk_widget_ref (widget);
2233 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
2234 gtk_container_add (GTK_CONTAINER (new_parent), widget);
2235 gtk_widget_unref (widget);
2237 if (GTK_WIDGET_IN_REPARENT (widget))
2239 GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
2241 /* OK, now fix up the widget's window. (And that for any
2242 * children, if the widget is NO_WINDOW and a container)
2244 if (GTK_WIDGET_NO_WINDOW (widget))
2246 if (GTK_IS_CONTAINER (widget))
2247 gtk_container_foreach (GTK_CONTAINER (widget),
2248 gtk_widget_reparent_container_child,
2249 gtk_widget_get_parent_window (widget));
2252 GdkWindow *parent_window;
2254 parent_window = gtk_widget_get_parent_window (widget);
2255 if (parent_window != widget->window)
2258 gdk_window_unref (widget->window);
2259 widget->window = parent_window;
2261 gdk_window_ref (widget->window);
2266 gdk_window_reparent (widget->window, gtk_widget_get_parent_window (widget), 0, 0);
2271 /*****************************************
2277 *****************************************/
2280 gtk_widget_popup (GtkWidget *widget,
2284 g_return_if_fail (widget != NULL);
2286 if (!GTK_WIDGET_VISIBLE (widget))
2288 if (!GTK_WIDGET_REALIZED (widget))
2289 gtk_widget_realize (widget);
2290 if (!GTK_WIDGET_NO_WINDOW (widget))
2291 gdk_window_move (widget->window, x, y);
2292 gtk_widget_show (widget);
2296 /*****************************************
2297 * gtk_widget_intersect:
2302 *****************************************/
2305 gtk_widget_intersect (GtkWidget *widget,
2307 GdkRectangle *intersection)
2313 g_return_val_if_fail (widget != NULL, FALSE);
2314 g_return_val_if_fail (area != NULL, FALSE);
2317 dest = intersection;
2321 return_val = gdk_rectangle_intersect ((GdkRectangle*) &widget->allocation, area, dest);
2323 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2325 intersection->x -= widget->allocation.x;
2326 intersection->y -= widget->allocation.y;
2334 gtk_widget_basic (GtkWidget *widget)
2340 g_return_val_if_fail (widget != NULL, FALSE);
2342 if (!GTK_WIDGET_BASIC (widget))
2344 else if (GTK_IS_CONTAINER (widget))
2346 children = gtk_container_children (GTK_CONTAINER (widget));
2350 tmp_list = children;
2354 if (!gtk_widget_basic (GTK_WIDGET (tmp_list->data)))
2360 tmp_list = tmp_list->next;
2363 g_list_free (children);
2372 /*****************************************
2373 * gtk_widget_grab_focus:
2378 *****************************************/
2381 gtk_widget_grab_focus (GtkWidget *widget)
2383 g_return_if_fail (widget != NULL);
2384 g_return_if_fail (GTK_IS_WIDGET (widget));
2386 if (GTK_WIDGET_CAN_FOCUS (widget))
2390 GtkType window_type;
2392 window_type = gtk_window_get_type ();
2393 parent = widget->parent;
2396 while (parent && !gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2398 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2400 parent = parent->parent;
2403 if (parent && gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2405 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2406 gtk_window_set_focus (GTK_WINDOW (parent), widget);
2411 /*****************************************
2412 * gtk_widget_grab_default:
2417 *****************************************/
2420 gtk_widget_grab_default (GtkWidget *widget)
2423 GtkType window_type;
2425 g_return_if_fail (widget != NULL);
2426 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
2428 window_type = gtk_window_get_type ();
2429 window = widget->parent;
2431 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2432 window = window->parent;
2434 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2435 gtk_window_set_default (GTK_WINDOW (window), widget);
2438 /*****************************************
2439 * gtk_widget_set_name:
2444 *****************************************/
2447 gtk_widget_set_name (GtkWidget *widget,
2450 g_return_if_fail (widget != NULL);
2453 g_free (widget->name);
2454 widget->name = g_strdup (name);
2456 if (!GTK_WIDGET_USER_STYLE (widget))
2457 gtk_widget_set_rc_style (widget);
2460 /*****************************************
2461 * gtk_widget_get_name:
2466 *****************************************/
2469 gtk_widget_get_name (GtkWidget *widget)
2471 g_return_val_if_fail (widget != NULL, NULL);
2474 return widget->name;
2475 return gtk_type_name (GTK_WIDGET_TYPE (widget));
2478 /*****************************************
2479 * gtk_widget_set_state:
2486 *****************************************/
2489 gtk_widget_set_state (GtkWidget *widget,
2492 g_return_if_fail (widget != NULL);
2493 g_return_if_fail (GTK_IS_WIDGET (widget));
2495 if (state == GTK_WIDGET_STATE (widget))
2498 if (state == GTK_STATE_INSENSITIVE)
2499 gtk_widget_set_sensitive (widget, FALSE);
2505 data.state_restauration = FALSE;
2507 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2509 data.parent_sensitive = TRUE;
2511 gtk_widget_propagate_state (widget, &data);
2512 gtk_widget_queue_draw (widget);
2516 /*****************************************
2517 * gtk_widget_set_sensitive:
2521 * boolean value for sensitivity
2524 *****************************************/
2527 gtk_widget_set_sensitive (GtkWidget *widget,
2532 g_return_if_fail (widget != NULL);
2533 g_return_if_fail (GTK_IS_WIDGET (widget));
2535 sensitive = (sensitive != FALSE);
2537 if (sensitive == (GTK_WIDGET_SENSITIVE (widget) != FALSE))
2542 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
2543 data.state = GTK_WIDGET_SAVED_STATE (widget);
2547 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
2548 data.state = GTK_WIDGET_STATE (widget);
2550 data.state_restauration = TRUE;
2553 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2555 data.parent_sensitive = TRUE;
2557 gtk_widget_propagate_state (widget, &data);
2558 gtk_widget_queue_draw (widget);
2561 /*****************************************
2562 * gtk_widget_set_parent:
2567 *****************************************/
2570 gtk_widget_set_parent (GtkWidget *widget,
2575 g_return_if_fail (widget != NULL);
2576 g_return_if_fail (widget->parent == NULL);
2577 g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
2578 g_return_if_fail (parent != NULL);
2579 g_return_if_fail (widget != parent);
2581 /* keep this function in sync with gtk_menu_attach_to_widget()
2584 gtk_widget_ref (widget);
2585 gtk_object_sink (GTK_OBJECT (widget));
2586 widget->parent = parent;
2588 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
2589 data.state = GTK_WIDGET_STATE (parent);
2591 data.state = GTK_WIDGET_STATE (widget);
2592 data.state_restauration = FALSE;
2593 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (parent) != FALSE);
2595 gtk_widget_propagate_state (widget, &data);
2597 gtk_widget_set_style_recurse (widget, NULL);
2599 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
2602 /*****************************************
2604 * see docs/styles.txt
2605 *****************************************/
2607 gtk_widget_set_style (GtkWidget *widget,
2610 GtkStyle *default_style;
2611 gboolean initial_emission;
2613 g_return_if_fail (widget != NULL);
2614 g_return_if_fail (style != NULL);
2616 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2618 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
2619 GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
2621 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2624 gtk_style_ref (widget->style);
2625 if (!saved_default_style_key_id)
2626 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2627 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2630 gtk_widget_set_style_internal (widget, style, initial_emission);
2634 gtk_widget_ensure_style (GtkWidget *widget)
2636 if (!GTK_WIDGET_USER_STYLE (widget) &&
2637 !GTK_WIDGET_RC_STYLE (widget))
2638 gtk_widget_set_rc_style (widget);
2642 gtk_widget_set_rc_style (GtkWidget *widget)
2644 GtkStyle *saved_style;
2645 GtkStyle *new_style;
2646 gboolean initial_emission;
2648 g_return_if_fail (widget != NULL);
2650 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2652 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2653 GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
2655 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2656 new_style = gtk_rc_get_style (widget);
2661 gtk_style_ref (widget->style);
2662 if (!saved_default_style_key_id)
2663 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2664 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2666 gtk_widget_set_style_internal (widget, new_style, initial_emission);
2672 g_assert (initial_emission == FALSE); /* FIXME: remove this line */
2674 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2675 gtk_widget_set_style_internal (widget, saved_style, initial_emission);
2676 gtk_style_unref (saved_style);
2680 if (initial_emission)
2681 gtk_widget_set_style_internal (widget, widget->style, TRUE);
2687 gtk_widget_restore_default_style (GtkWidget *widget)
2689 GtkStyle *default_style;
2691 g_return_if_fail (widget != NULL);
2693 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2695 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2698 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2699 gtk_widget_set_style_internal (widget, default_style, FALSE);
2700 gtk_style_unref (default_style);
2705 gtk_widget_get_style (GtkWidget *widget)
2707 g_return_val_if_fail (widget != NULL, NULL);
2709 return widget->style;
2713 gtk_widget_style_set (GtkWidget *widget,
2714 GtkStyle *previous_style)
2716 if (GTK_WIDGET_REALIZED (widget) &&
2717 !GTK_WIDGET_NO_WINDOW (widget))
2719 gtk_style_set_background (widget->style, widget->window, widget->state);
2720 if (GTK_WIDGET_DRAWABLE (widget))
2721 gdk_window_clear (widget->window);
2726 gtk_widget_set_style_internal (GtkWidget *widget,
2728 gboolean initial_emission)
2730 g_return_if_fail (widget != NULL);
2731 g_return_if_fail (style != NULL);
2733 if (widget->style != style)
2735 GtkStyle *previous_style;
2737 if (GTK_WIDGET_REALIZED (widget))
2738 gtk_style_detach (widget->style);
2740 previous_style = widget->style;
2741 widget->style = style;
2742 gtk_style_ref (widget->style);
2744 if (GTK_WIDGET_REALIZED (widget))
2745 widget->style = gtk_style_attach (widget->style, widget->window);
2747 gtk_signal_emit (GTK_OBJECT (widget),
2748 widget_signals[STYLE_SET],
2749 initial_emission ? NULL : previous_style);
2750 gtk_style_unref (previous_style);
2752 if (widget->parent && !initial_emission)
2754 GtkRequisition old_requisition;
2756 old_requisition = widget->requisition;
2757 gtk_widget_size_request (widget, &widget->requisition);
2759 if ((old_requisition.width != widget->requisition.width) ||
2760 (old_requisition.height != widget->requisition.height))
2761 gtk_widget_queue_resize (widget);
2762 else if (GTK_WIDGET_DRAWABLE (widget))
2763 gtk_widget_queue_draw (widget);
2766 else if (initial_emission)
2768 gtk_signal_emit (GTK_OBJECT (widget),
2769 widget_signals[STYLE_SET],
2775 gtk_widget_set_style_recurse (GtkWidget *widget,
2776 gpointer client_data)
2778 if (GTK_WIDGET_RC_STYLE (widget))
2779 gtk_widget_set_rc_style (widget);
2781 if (GTK_IS_CONTAINER (widget))
2782 gtk_container_foreach (GTK_CONTAINER (widget),
2783 gtk_widget_set_style_recurse,
2788 gtk_widget_reset_rc_styles (GtkWidget *widget)
2790 gtk_widget_set_style_recurse (widget, NULL);
2794 gtk_widget_set_default_style (GtkStyle *style)
2796 if (style != default_style)
2799 gtk_style_unref (default_style);
2800 default_style = style;
2802 gtk_style_ref (default_style);
2807 gtk_widget_get_default_style (void)
2811 default_style = gtk_style_new ();
2812 gtk_style_ref (default_style);
2815 return default_style;
2819 gtk_widget_push_style (GtkStyle *style)
2821 g_return_if_fail (style != NULL);
2823 gtk_style_ref (style);
2824 style_stack = g_slist_prepend (style_stack, style);
2828 gtk_widget_peek_style (void)
2831 return (GtkStyle*) style_stack->data;
2833 return gtk_widget_get_default_style ();
2837 gtk_widget_pop_style (void)
2844 style_stack = style_stack->next;
2845 gtk_style_unref ((GtkStyle*) tmp->data);
2846 g_slist_free_1 (tmp);
2850 /*************************************************************
2851 * gtk_widget_set_parent_window:
2852 * Set a non default parent window for widget
2859 *************************************************************/
2862 gtk_widget_set_parent_window (GtkWidget *widget,
2863 GdkWindow *parent_window)
2865 GdkWindow *old_parent_window;
2867 g_return_if_fail (widget != NULL);
2869 old_parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2870 parent_window_key_id);
2872 if (parent_window != old_parent_window)
2874 if (!parent_window_key_id)
2875 parent_window_key_id = g_quark_from_static_string (parent_window_key);
2876 gtk_object_set_data_by_id (GTK_OBJECT (widget), parent_window_key_id,
2878 if (old_parent_window)
2879 gdk_window_unref (old_parent_window);
2881 gdk_window_ref (parent_window);
2885 /*************************************************************
2886 * gtk_widget_get_parent_window:
2887 * Get widget's parent window
2894 *************************************************************/
2897 gtk_widget_get_parent_window (GtkWidget *widget)
2899 GdkWindow *parent_window;
2901 g_return_val_if_fail (widget != NULL, NULL);
2902 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
2903 g_return_val_if_fail (widget->parent != NULL, NULL);
2905 parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2906 parent_window_key_id);
2908 return (parent_window != NULL) ? parent_window : widget->parent->window;
2911 /*****************************************
2912 * gtk_widget_set_uposition:
2917 *****************************************/
2920 gtk_widget_set_uposition (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);
2942 if (GTK_WIDGET_REALIZED (widget) && GTK_IS_WINDOW (widget) &&
2943 (aux_info->x != -1) && (aux_info->y != -1))
2945 gdk_window_set_hints (widget->window, aux_info->x, aux_info->y, 0, 0, 0, 0, GDK_HINT_POS);
2946 gdk_window_move (widget->window, aux_info->x, aux_info->y);
2949 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
2950 gtk_widget_size_allocate (widget, &widget->allocation);
2953 /*****************************************
2954 * gtk_widget_set_usize:
2959 *****************************************/
2962 gtk_widget_set_usize (GtkWidget *widget,
2966 GtkWidgetAuxInfo *aux_info;
2968 g_return_if_fail (widget != NULL);
2970 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2973 if (!aux_info_key_id)
2974 aux_info_key_id = g_quark_from_static_string (aux_info_key);
2975 aux_info = gtk_widget_aux_info_new ();
2976 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2980 aux_info->width = width;
2982 aux_info->height = height;
2984 if (GTK_WIDGET_VISIBLE (widget))
2985 gtk_widget_queue_resize (widget);
2988 /*****************************************
2989 * gtk_widget_set_events:
2994 *****************************************/
2997 gtk_widget_set_events (GtkWidget *widget,
3002 g_return_if_fail (widget != NULL);
3003 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3004 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
3006 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3011 eventp = g_new (gint, 1);
3015 event_key_id = g_quark_from_static_string (event_key);
3016 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3021 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3025 /*****************************************
3026 * gtk_widget_set_extension_events:
3031 *****************************************/
3034 gtk_widget_set_extension_events (GtkWidget *widget,
3035 GdkExtensionMode mode)
3037 GdkExtensionMode *modep;
3039 g_return_if_fail (widget != NULL);
3041 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3044 modep = g_new (GdkExtensionMode, 1);
3047 if (!extension_event_key_id)
3048 extension_event_key_id = g_quark_from_static_string (extension_event_key);
3049 gtk_object_set_data_by_id (GTK_OBJECT (widget), extension_event_key_id, modep);
3052 /*****************************************
3053 * gtk_widget_get_toplevel:
3058 *****************************************/
3061 gtk_widget_get_toplevel (GtkWidget *widget)
3063 g_return_val_if_fail (widget != NULL, NULL);
3065 while (widget->parent)
3066 widget = widget->parent;
3071 /*****************************************
3072 * gtk_widget_get_ancestor:
3077 *****************************************/
3080 gtk_widget_get_ancestor (GtkWidget *widget,
3081 GtkType widget_type)
3083 g_return_val_if_fail (widget != NULL, NULL);
3085 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type))
3086 widget = widget->parent;
3088 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type)))
3094 /*****************************************
3095 * gtk_widget_get_colormap:
3100 *****************************************/
3103 gtk_widget_get_colormap (GtkWidget *widget)
3105 GdkColormap *colormap;
3107 g_return_val_if_fail (widget != NULL, NULL);
3109 if (!widget->window)
3111 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
3114 return gtk_widget_get_default_colormap ();
3117 return gdk_window_get_colormap (widget->window);
3120 /*****************************************
3121 * gtk_widget_get_visual:
3126 *****************************************/
3129 gtk_widget_get_visual (GtkWidget *widget)
3133 g_return_val_if_fail (widget != NULL, NULL);
3135 if (!widget->window)
3137 visual = gtk_object_get_data (GTK_OBJECT (widget), visual_key);
3140 return gtk_widget_get_default_visual ();
3143 return gdk_window_get_visual (widget->window);
3146 /*****************************************
3147 * gtk_widget_get_events:
3152 *****************************************/
3155 gtk_widget_get_events (GtkWidget *widget)
3159 g_return_val_if_fail (widget != NULL, 0);
3161 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3168 /*****************************************
3169 * gtk_widget_get_extension_events:
3174 *****************************************/
3177 gtk_widget_get_extension_events (GtkWidget *widget)
3179 GdkExtensionMode *mode;
3181 g_return_val_if_fail (widget != NULL, 0);
3183 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3190 /*****************************************
3191 * gtk_widget_get_pointer:
3196 *****************************************/
3199 gtk_widget_get_pointer (GtkWidget *widget,
3203 g_return_if_fail (widget != NULL);
3210 if (GTK_WIDGET_REALIZED (widget))
3212 gdk_window_get_pointer (widget->window, x, y, NULL);
3214 if (GTK_WIDGET_NO_WINDOW (widget))
3217 *x -= widget->allocation.x;
3219 *y -= widget->allocation.y;
3224 /*****************************************
3225 * gtk_widget_is_ancestor:
3230 *****************************************/
3233 gtk_widget_is_ancestor (GtkWidget *widget,
3234 GtkWidget *ancestor)
3236 g_return_val_if_fail (widget != NULL, FALSE);
3237 g_return_val_if_fail (ancestor != NULL, FALSE);
3241 if (widget->parent == ancestor)
3243 widget = widget->parent;
3249 /*****************************************
3250 * gtk_widget_is_child:
3255 *****************************************/
3258 gtk_widget_is_child (GtkWidget *widget,
3261 g_return_val_if_fail (widget != NULL, FALSE);
3262 g_return_val_if_fail (child != NULL, FALSE);
3264 return (child->parent == widget);
3267 /*****************************************
3268 * gtk_widget_push_colormap:
3273 *****************************************/
3276 gtk_widget_push_colormap (GdkColormap *cmap)
3278 g_return_if_fail (cmap != NULL);
3280 colormap_stack = g_slist_prepend (colormap_stack, cmap);
3283 /*****************************************
3284 * gtk_widget_push_visual:
3289 *****************************************/
3292 gtk_widget_push_visual (GdkVisual *visual)
3294 g_return_if_fail (visual != NULL);
3296 visual_stack = g_slist_prepend (visual_stack, visual);
3299 /*****************************************
3300 * gtk_widget_pop_colormap:
3305 *****************************************/
3308 gtk_widget_pop_colormap (void)
3314 tmp = colormap_stack;
3315 colormap_stack = colormap_stack->next;
3316 g_slist_free_1 (tmp);
3320 /*****************************************
3321 * gtk_widget_pop_visual:
3326 *****************************************/
3329 gtk_widget_pop_visual (void)
3336 visual_stack = visual_stack->next;
3337 g_slist_free_1 (tmp);
3341 /*****************************************
3342 * gtk_widget_set_default_colormap:
3347 *****************************************/
3350 gtk_widget_set_default_colormap (GdkColormap *colormap)
3352 if (default_colormap != colormap)
3354 if (default_colormap)
3355 gdk_colormap_unref (default_colormap);
3356 default_colormap = colormap;
3357 if (default_colormap)
3358 gdk_colormap_ref (default_colormap);
3362 /*****************************************
3363 * gtk_widget_set_default_visual:
3368 *****************************************/
3371 gtk_widget_set_default_visual (GdkVisual *visual)
3373 default_visual = visual;
3376 /*****************************************
3377 * gtk_widget_get_default_colormap:
3382 *****************************************/
3385 gtk_widget_get_default_colormap (void)
3387 if (!default_colormap)
3388 default_colormap = gdk_colormap_get_system ();
3390 return default_colormap;
3393 /*****************************************
3394 * gtk_widget_get_default_visual:
3399 *****************************************/
3402 gtk_widget_get_default_visual (void)
3404 if (!default_visual)
3405 default_visual = gdk_visual_get_system ();
3407 return default_visual;
3410 /*****************************************
3411 * gtk_widget_marshal_signal_1:
3416 *****************************************/
3419 gtk_widget_marshal_signal_1 (GtkObject *object,
3424 GtkWidgetSignal1 rfunc;
3426 rfunc = (GtkWidgetSignal1) func;
3429 GTK_VALUE_POINTER (args[0]),
3433 /*****************************************
3434 * gtk_widget_marshal_signal_4:
3439 *****************************************/
3442 gtk_widget_marshal_signal_4 (GtkObject *object,
3447 GtkWidgetSignal4 rfunc;
3450 rfunc = (GtkWidgetSignal4) func;
3451 return_val = GTK_RETLOC_BOOL (args[1]);
3453 *return_val = (* rfunc) (object,
3454 GTK_VALUE_BOXED (args[0]),
3458 /*****************************************
3459 * gtk_widget_marshal_signal_5:
3464 *****************************************/
3467 gtk_widget_marshal_signal_5 (GtkObject *object,
3472 GtkWidgetSignal5 rfunc;
3474 rfunc = (GtkWidgetSignal5) func;
3477 GTK_VALUE_UINT (args[0]),
3481 /*****************************************
3482 * gtk_widget_marshal_signal_6:
3487 *****************************************/
3490 gtk_widget_marshal_signal_6 (GtkObject *object,
3495 GtkWidgetSignal6 rfunc;
3497 rfunc = (GtkWidgetSignal6) func;
3500 GTK_VALUE_OBJECT (args[0]),
3504 /*****************************************
3505 * gtk_widget_marshal_signal_7:
3510 *****************************************/
3513 gtk_widget_marshal_signal_7 (GtkObject *object,
3518 GtkWidgetSignal7 rfunc;
3520 rfunc = (GtkWidgetSignal7) func;
3523 GTK_VALUE_BOXED (args[0]),
3528 gtk_widget_shutdown (GtkObject *object)
3532 /* gtk_object_destroy() will already hold a refcount on object
3534 widget = GTK_WIDGET (object);
3537 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
3539 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3540 if (GTK_WIDGET_REALIZED (widget))
3541 gtk_widget_unrealize (widget);
3543 parent_class->shutdown (object);
3547 gtk_widget_real_destroy (GtkObject *object)
3550 GtkStyle *saved_style;
3552 /* gtk_object_destroy() will already hold a refcount on object
3554 widget = GTK_WIDGET (object);
3556 gtk_grab_remove (widget);
3557 gtk_selection_remove_all (widget);
3559 saved_style = gtk_object_get_data_by_id (object, saved_default_style_key_id);
3562 gtk_style_unref (saved_style);
3563 gtk_object_remove_data_by_id (object, saved_default_style_key_id);
3566 gtk_style_unref (widget->style);
3567 widget->style = NULL;
3569 parent_class->destroy (object);
3573 gtk_widget_finalize (GtkObject *object)
3576 GtkWidgetAuxInfo *aux_info;
3578 GdkExtensionMode *mode;
3580 widget = GTK_WIDGET (object);
3583 g_free (widget->name);
3585 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3587 gtk_widget_aux_info_destroy (aux_info);
3589 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3593 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3597 parent_class->finalize (object);
3600 /*****************************************
3601 * gtk_widget_real_show:
3606 *****************************************/
3609 gtk_widget_real_show (GtkWidget *widget)
3611 g_return_if_fail (widget != NULL);
3612 g_return_if_fail (GTK_IS_WIDGET (widget));
3614 if (!GTK_WIDGET_VISIBLE (widget))
3616 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
3620 gtk_widget_queue_resize (widget->parent);
3622 if (GTK_WIDGET_MAPPED (widget->parent))
3623 gtk_widget_map (widget);
3628 /*****************************************
3629 * gtk_widget_real_hide:
3634 *****************************************/
3637 gtk_widget_real_hide (GtkWidget *widget)
3639 g_return_if_fail (widget != NULL);
3640 g_return_if_fail (GTK_IS_WIDGET (widget));
3642 if (GTK_WIDGET_VISIBLE (widget))
3644 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3646 if (GTK_WIDGET_MAPPED (widget))
3647 gtk_widget_unmap (widget);
3650 gtk_widget_queue_resize (widget->parent);
3654 /*****************************************
3655 * gtk_widget_real_map:
3660 *****************************************/
3663 gtk_widget_real_map (GtkWidget *widget)
3665 g_return_if_fail (widget != NULL);
3666 g_return_if_fail (GTK_IS_WIDGET (widget));
3668 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget))
3670 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
3672 if (!GTK_WIDGET_NO_WINDOW (widget))
3673 gdk_window_show (widget->window);
3675 gtk_widget_queue_draw (widget);
3679 /*****************************************
3680 * gtk_widget_real_unmap:
3685 *****************************************/
3688 gtk_widget_real_unmap (GtkWidget *widget)
3690 g_return_if_fail (widget != NULL);
3691 g_return_if_fail (GTK_IS_WIDGET (widget));
3693 if (GTK_WIDGET_MAPPED (widget))
3695 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
3697 if (GTK_WIDGET_NO_WINDOW (widget))
3698 gdk_window_clear_area (widget->window,
3699 widget->allocation.x,
3700 widget->allocation.y,
3701 widget->allocation.width,
3702 widget->allocation.height);
3704 gdk_window_hide (widget->window);
3708 /*****************************************
3709 * gtk_widget_real_realize:
3714 *****************************************/
3717 gtk_widget_real_realize (GtkWidget *widget)
3719 g_return_if_fail (widget != NULL);
3720 g_return_if_fail (GTK_IS_WIDGET (widget));
3721 g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
3723 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
3726 widget->window = gtk_widget_get_parent_window (widget);
3727 gdk_window_ref (widget->window);
3729 widget->style = gtk_style_attach (widget->style, widget->window);
3732 /*****************************************
3733 * gtk_widget_real_unrealize:
3738 *****************************************/
3741 gtk_widget_real_unrealize (GtkWidget *widget)
3743 g_return_if_fail (widget != NULL);
3744 g_return_if_fail (GTK_IS_WIDGET (widget));
3746 if (GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_MAPPED (widget))
3747 gtk_widget_real_unmap (widget);
3749 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
3751 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT(widget)->klass->type));
3754 gtk_style_detach (widget->style);
3755 if (!GTK_WIDGET_NO_WINDOW (widget))
3757 gdk_window_set_user_data (widget->window, NULL);
3758 gdk_window_destroy (widget->window);
3759 widget->window = NULL;
3763 gdk_window_unref (widget->window);
3764 widget->window = NULL;
3767 /* Unrealize afterwards to improve visual effect */
3769 if (GTK_IS_CONTAINER (widget))
3770 gtk_container_foreach (GTK_CONTAINER (widget),
3771 (GtkCallback) gtk_widget_unrealize,
3775 /*****************************************
3776 * gtk_widget_real_draw:
3781 *****************************************/
3784 gtk_widget_real_draw (GtkWidget *widget,
3787 GdkEventExpose event;
3789 g_return_if_fail (widget != NULL);
3790 g_return_if_fail (GTK_IS_WIDGET (widget));
3791 g_return_if_fail (area != NULL);
3793 if (GTK_WIDGET_DRAWABLE (widget))
3795 event.type = GDK_EXPOSE;
3796 event.send_event = TRUE;
3797 event.window = widget->window;
3801 gdk_window_ref (event.window);
3802 gtk_widget_event (widget, (GdkEvent*) &event);
3803 gdk_window_unref (event.window);
3807 /*****************************************
3808 * gtk_widget_real_size_allocate:
3813 *****************************************/
3816 gtk_widget_real_size_allocate (GtkWidget *widget,
3817 GtkAllocation *allocation)
3819 g_return_if_fail (widget != NULL);
3820 g_return_if_fail (GTK_IS_WIDGET (widget));
3822 if (GTK_WIDGET_NO_WINDOW (widget) &&
3823 GTK_WIDGET_MAPPED (widget) &&
3824 ((widget->allocation.x != allocation->x) ||
3825 (widget->allocation.y != allocation->y) ||
3826 (widget->allocation.width != allocation->width) ||
3827 (widget->allocation.height != allocation->height)) &&
3828 (widget->allocation.width != 0) &&
3829 (widget->allocation.height != 0))
3830 gdk_window_clear_area (widget->window,
3831 widget->allocation.x,
3832 widget->allocation.y,
3833 widget->allocation.width,
3834 widget->allocation.height);
3836 widget->allocation = *allocation;
3838 if (GTK_WIDGET_REALIZED (widget) &&
3839 !GTK_WIDGET_NO_WINDOW (widget))
3840 gdk_window_move_resize (widget->window,
3841 allocation->x, allocation->y,
3842 allocation->width, allocation->height);
3845 /*****************************************
3846 * gtk_widget_peek_colormap:
3851 *****************************************/
3854 gtk_widget_peek_colormap (void)
3857 return (GdkColormap*) colormap_stack->data;
3858 return gtk_widget_get_default_colormap ();
3861 /*****************************************
3862 * gtk_widget_peek_visual:
3867 *****************************************/
3870 gtk_widget_peek_visual (void)
3873 return (GdkVisual*) visual_stack->data;
3874 return gtk_widget_get_default_visual ();
3877 /*************************************************************
3878 * gtk_widget_propagate_state:
3879 * Propagate a change in the widgets state down the tree
3883 * GtkStateData: state
3887 *************************************************************/
3890 gtk_widget_propagate_state (GtkWidget *widget,
3895 /* don't call this function with state==GTK_STATE_INSENSITIVE,
3896 * parent_sensitive==TRUE on a sensitive widget
3899 old_state = GTK_WIDGET_STATE (widget);
3901 if (data->parent_sensitive)
3903 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3905 if (GTK_WIDGET_IS_SENSITIVE (widget))
3907 if (data->state_restauration)
3908 GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget);
3910 GTK_WIDGET_STATE (widget) = data->state;
3914 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3915 if (!data->state_restauration &&
3916 data->state != GTK_STATE_INSENSITIVE)
3917 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3922 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3923 if (!data->state_restauration)
3925 if (data->state != GTK_STATE_INSENSITIVE)
3926 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3928 else if (GTK_WIDGET_STATE (widget) != GTK_STATE_INSENSITIVE)
3929 GTK_WIDGET_SAVED_STATE (widget) = GTK_WIDGET_STATE (widget);
3930 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3933 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
3937 window = gtk_widget_get_ancestor (widget, gtk_window_get_type ());
3939 gtk_window_set_focus (GTK_WINDOW (window), NULL);
3942 if (old_state != GTK_WIDGET_STATE (widget))
3944 gtk_widget_ref (widget);
3945 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
3947 if (GTK_IS_CONTAINER (widget))
3949 data->parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget) != FALSE);
3950 data->state = GTK_WIDGET_STATE (widget);
3951 gtk_container_foreach (GTK_CONTAINER (widget),
3952 (GtkCallback) gtk_widget_propagate_state,
3955 gtk_widget_unref (widget);
3959 /*****************************************
3960 * gtk_widget_draw_children_recurse:
3965 *****************************************/
3968 gtk_widget_draw_children_recurse (GtkWidget *widget,
3969 gpointer client_data)
3971 gtk_widget_draw (widget, NULL);
3972 gtk_widget_draw_children (widget);
3975 /*****************************************
3976 * gtk_widget_aux_info_new:
3981 *****************************************/
3983 static GtkWidgetAuxInfo*
3984 gtk_widget_aux_info_new (void)
3986 GtkWidgetAuxInfo *aux_info;
3988 if (!aux_info_mem_chunk)
3989 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
3990 sizeof (GtkWidgetAuxInfo),
3991 1024, G_ALLOC_AND_FREE);
3993 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
3997 aux_info->width = 0;
3998 aux_info->height = 0;
4003 /*****************************************
4004 * gtk_widget_aux_info_destroy:
4009 *****************************************/
4012 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
4014 g_return_if_fail (aux_info != NULL);
4016 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
4019 /*****************************************
4020 * gtk_widget_shape_combine_mask:
4021 * set a shape for this widgets' gdk window, this allows for
4022 * transparent windows etc., see gdk_window_shape_combine_mask
4023 * for more information
4028 *****************************************/
4030 gtk_widget_shape_combine_mask (GtkWidget *widget,
4031 GdkBitmap *shape_mask,
4035 GtkWidgetShapeInfo* shape_info;
4037 g_return_if_fail (widget != NULL);
4038 /* set_shape doesn't work on widgets without gdk window */
4039 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
4043 GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4046 gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
4048 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4049 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
4050 g_free (shape_info);
4054 GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4056 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4059 shape_info = g_new (GtkWidgetShapeInfo, 1);
4060 gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
4062 shape_info->shape_mask = shape_mask;
4063 shape_info->offset_x = offset_x;
4064 shape_info->offset_y = offset_y;
4066 /* set shape if widget has a gdk window allready.
4067 * otherwise the shape is scheduled to be set by gtk_widget_realize.
4070 gdk_window_shape_combine_mask (widget->window, shape_mask,
4071 offset_x, offset_y);
4075 /*****************************************
4076 * gtk_widget_dnd_drag_add:
4077 * when you get a DRAG_ENTER event, you can use this
4078 * to tell Gtk ofother widgets that are to be dragged as well
4083 *****************************************/
4085 gtk_widget_dnd_drag_add (GtkWidget *widget)
4089 /*****************************************
4090 * gtk_widget_dnd_drag_set:
4091 * these two functions enable drag and/or drop on a
4092 * widget and also let Gtk know what data types will be accepted
4093 * use MIME type naming,plus tacking "URL:" on the front for link
4100 *****************************************/
4102 gtk_widget_dnd_drag_set (GtkWidget *widget,
4104 gchar **type_accept_list,
4107 g_return_if_fail(widget != NULL);
4109 if (!widget->window)
4110 gtk_widget_realize (widget);
4112 g_return_if_fail (widget->window != NULL);
4113 gdk_window_dnd_drag_set (widget->window,
4119 /*****************************************
4120 * gtk_widget_dnd_drop_set:
4125 *****************************************/
4127 gtk_widget_dnd_drop_set (GtkWidget *widget,
4129 gchar **type_accept_list,
4131 guint8 is_destructive_operation)
4133 g_return_if_fail(widget != NULL);
4135 if (!widget->window)
4136 gtk_widget_realize (widget);
4138 g_return_if_fail (widget->window != NULL);
4139 gdk_window_dnd_drop_set (widget->window,
4143 is_destructive_operation);
4146 /*****************************************
4147 * gtk_widget_dnd_data_set:
4152 *****************************************/
4154 gtk_widget_dnd_data_set (GtkWidget *widget,
4157 gulong data_numbytes)
4159 g_return_if_fail (widget != NULL);
4160 g_return_if_fail (widget->window != NULL);
4162 gdk_window_dnd_data_set (widget->window, event, data, data_numbytes);
4166 gtk_widget_ref (GtkWidget *widget)
4168 g_return_if_fail (widget != NULL);
4169 g_return_if_fail (GTK_IS_WIDGET (widget));
4171 gtk_object_ref ((GtkObject*) widget);
4175 gtk_widget_unref (GtkWidget *widget)
4177 g_return_if_fail (widget != NULL);
4178 g_return_if_fail (GTK_IS_WIDGET (widget));
4180 gtk_object_unref ((GtkObject*) widget);
4184 gtk_widget_path (GtkWidget *widget,
4185 guint *path_length_p,
4187 gchar **path_reversed_p)
4189 static gchar *rev_path = NULL;
4190 static guint path_len = 0;
4193 g_return_if_fail (widget != NULL);
4194 g_return_if_fail (GTK_IS_WIDGET (widget));
4203 string = gtk_widget_get_name (widget);
4204 l = strlen (string);
4205 while (path_len <= len + l + 1)
4207 path_len += INIT_PATH_SIZE;
4208 rev_path = g_realloc (rev_path, path_len);
4216 widget = widget->parent;
4219 rev_path[len++] = '.';
4221 rev_path[len++] = 0;
4226 *path_length_p = len - 1;
4227 if (path_reversed_p)
4228 *path_reversed_p = g_strdup (rev_path);
4231 *path_p = g_strdup (rev_path);
4232 g_strreverse (*path_p);
4237 gtk_widget_class_path (GtkWidget *widget,
4238 guint *path_length_p,
4240 gchar **path_reversed_p)
4242 static gchar *rev_path = NULL;
4243 static guint path_len = 0;
4246 g_return_if_fail (widget != NULL);
4247 g_return_if_fail (GTK_IS_WIDGET (widget));
4256 string = gtk_type_name (GTK_WIDGET_TYPE (widget));
4257 l = strlen (string);
4258 while (path_len <= len + l + 1)
4260 path_len += INIT_PATH_SIZE;
4261 rev_path = g_realloc (rev_path, path_len);
4269 widget = widget->parent;
4272 rev_path[len++] = '.';
4274 rev_path[len++] = 0;
4279 *path_length_p = len - 1;
4280 if (path_reversed_p)
4281 *path_reversed_p = g_strdup (rev_path);
4284 *path_p = g_strdup (rev_path);
4285 g_strreverse (*path_p);