1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 #include "gtkcontainer.h"
24 #include "gtkselection.h"
25 #include "gtksignal.h"
26 #include "gtkwidget.h"
27 #include "gtkwindow.h"
28 #include "gtkbindings.h"
29 #include "gtkprivate.h"
34 #define WIDGET_CLASS(w) GTK_WIDGET_CLASS (GTK_OBJECT (w)->klass)
35 #define INIT_PATH_SIZE (512)
71 PROPERTY_NOTIFY_EVENT,
72 SELECTION_CLEAR_EVENT,
73 SELECTION_REQUEST_EVENT,
74 SELECTION_NOTIFY_EVENT,
83 DROP_DATA_AVAILABLE_EVENT,
87 VISIBILITY_NOTIFY_EVENT,
111 typedef void (*GtkWidgetSignal1) (GtkObject *object,
114 typedef gint (*GtkWidgetSignal2) (GtkObject *object,
119 typedef void (*GtkWidgetSignal3) (GtkObject *object,
122 typedef gint (*GtkWidgetSignal4) (GtkObject *object,
125 typedef void (*GtkWidgetSignal5) (GtkObject *object,
128 typedef void (*GtkWidgetSignal6) (GtkObject *object,
131 typedef void (*GtkWidgetSignal7) (GtkObject *object,
135 typedef struct _GtkStateData GtkStateData;
140 guint state_restauration : 1;
141 guint parent_sensitive : 1;
145 static void gtk_widget_marshal_signal_1 (GtkObject *object,
149 static void gtk_widget_marshal_signal_4 (GtkObject *object,
153 static void gtk_widget_marshal_signal_5 (GtkObject *object,
157 static void gtk_widget_marshal_signal_6 (GtkObject *object,
161 static void gtk_widget_marshal_signal_7 (GtkObject *object,
166 static void gtk_widget_class_init (GtkWidgetClass *klass);
167 static void gtk_widget_init (GtkWidget *widget);
168 static void gtk_widget_set_arg (GtkWidget *widget,
171 static void gtk_widget_get_arg (GtkWidget *widget,
174 static void gtk_widget_shutdown (GtkObject *object);
175 static void gtk_widget_real_destroy (GtkObject *object);
176 static void gtk_widget_finalize (GtkObject *object);
177 static void gtk_widget_real_show (GtkWidget *widget);
178 static void gtk_widget_real_hide (GtkWidget *widget);
179 static void gtk_widget_real_map (GtkWidget *widget);
180 static void gtk_widget_real_unmap (GtkWidget *widget);
181 static void gtk_widget_real_realize (GtkWidget *widget);
182 static void gtk_widget_real_unrealize (GtkWidget *widget);
183 static void gtk_widget_real_draw (GtkWidget *widget,
185 static void gtk_widget_real_size_allocate (GtkWidget *widget,
186 GtkAllocation *allocation);
187 static gint gtk_widget_real_key_press_event (GtkWidget *widget,
189 static void gtk_widget_style_set (GtkWidget *widget,
190 GtkStyle *previous_style);
192 static GdkColormap* gtk_widget_peek_colormap (void);
193 static GdkVisual* gtk_widget_peek_visual (void);
194 static GtkStyle* gtk_widget_peek_style (void);
196 static void gtk_widget_reparent_container_child (GtkWidget *widget,
197 gpointer client_data);
198 static void gtk_widget_propagate_state (GtkWidget *widget,
200 static void gtk_widget_draw_children_recurse (GtkWidget *widget,
201 gpointer client_data);
202 static void gtk_widget_set_style_internal (GtkWidget *widget,
204 gboolean initial_emission);
205 static void gtk_widget_set_style_recurse (GtkWidget *widget,
206 gpointer client_data);
208 extern GtkArg* gtk_object_collect_args (guint *nargs,
212 static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
213 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
215 static GtkObjectClass *parent_class = NULL;
216 static guint widget_signals[LAST_SIGNAL] = { 0 };
218 static GMemChunk *aux_info_mem_chunk = NULL;
220 static GdkColormap *default_colormap = NULL;
221 static GdkVisual *default_visual = NULL;
222 static GtkStyle *default_style = NULL;
224 static GSList *colormap_stack = NULL;
225 static GSList *visual_stack = NULL;
226 static GSList *style_stack = NULL;
228 static GSList *gtk_widget_redraw_queue = NULL;
229 static GSList *gtk_widget_resize_queue = NULL;
231 static const gchar *aux_info_key = "gtk-aux-info";
232 static guint aux_info_key_id = 0;
233 static const gchar *event_key = "gtk-event-mask";
234 static guint event_key_id = 0;
235 static const gchar *extension_event_key = "gtk-extension-event-mode";
236 static guint extension_event_key_id = 0;
237 static const gchar *parent_window_key = "gtk-parent-window";
238 static guint parent_window_key_id = 0;
239 static const gchar *saved_default_style_key = "gtk-saved-default-style";
240 static guint saved_default_style_key_id = 0;
241 static const gchar *shape_info_key = "gtk-shape-info";
242 static const gchar *colormap_key = "gtk-colormap";
243 static const gchar *visual_key = "gtk-visual";
247 /*****************************************
248 * gtk_widget_get_type:
253 *****************************************/
256 gtk_widget_get_type (void)
258 static GtkType widget_type = 0;
262 GtkTypeInfo widget_info =
266 sizeof (GtkWidgetClass),
267 (GtkClassInitFunc) gtk_widget_class_init,
268 (GtkObjectInitFunc) gtk_widget_init,
269 (GtkArgSetFunc) gtk_widget_set_arg,
270 (GtkArgGetFunc) gtk_widget_get_arg,
273 widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);
279 /*****************************************
280 * gtk_widget_class_init:
285 *****************************************/
288 gtk_widget_class_init (GtkWidgetClass *klass)
290 GtkObjectClass *object_class;
292 object_class = (GtkObjectClass*) klass;
294 parent_class = gtk_type_class (gtk_object_get_type ());
296 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
297 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
298 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
299 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
300 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
301 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
302 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
303 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
304 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
305 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
306 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
307 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
308 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
309 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
310 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
312 widget_signals[SHOW] =
313 gtk_signal_new ("show",
316 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
317 gtk_signal_default_marshaller,
319 widget_signals[HIDE] =
320 gtk_signal_new ("hide",
323 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
324 gtk_signal_default_marshaller,
326 widget_signals[MAP] =
327 gtk_signal_new ("map",
330 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
331 gtk_signal_default_marshaller,
333 widget_signals[UNMAP] =
334 gtk_signal_new ("unmap",
337 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
338 gtk_signal_default_marshaller,
340 widget_signals[REALIZE] =
341 gtk_signal_new ("realize",
344 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
345 gtk_signal_default_marshaller,
347 widget_signals[UNREALIZE] =
348 gtk_signal_new ("unrealize",
351 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
352 gtk_signal_default_marshaller,
354 widget_signals[DRAW] =
355 gtk_signal_new ("draw",
358 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
359 gtk_widget_marshal_signal_1,
362 widget_signals[DRAW_FOCUS] =
363 gtk_signal_new ("draw_focus",
366 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
367 gtk_signal_default_marshaller,
369 widget_signals[DRAW_DEFAULT] =
370 gtk_signal_new ("draw_default",
373 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
374 gtk_signal_default_marshaller,
376 widget_signals[SIZE_REQUEST] =
377 gtk_signal_new ("size_request",
380 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
381 gtk_widget_marshal_signal_1,
384 widget_signals[SIZE_ALLOCATE] =
385 gtk_signal_new ("size_allocate",
388 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
389 gtk_widget_marshal_signal_1,
392 widget_signals[STATE_CHANGED] =
393 gtk_signal_new ("state_changed",
396 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
397 gtk_widget_marshal_signal_5,
399 GTK_TYPE_STATE_TYPE);
400 widget_signals[PARENT_SET] =
401 gtk_signal_new ("parent_set",
404 GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
405 gtk_widget_marshal_signal_6,
408 widget_signals[STYLE_SET] =
409 gtk_signal_new ("style_set",
412 GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
413 gtk_widget_marshal_signal_7,
416 widget_signals[ADD_ACCELERATOR] =
417 gtk_accel_group_create_add (object_class->type, GTK_RUN_LAST,
418 GTK_SIGNAL_OFFSET (GtkWidgetClass, add_accelerator));
419 widget_signals[REMOVE_ACCELERATOR] =
420 gtk_accel_group_create_remove (object_class->type, GTK_RUN_LAST,
421 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));
422 widget_signals[EVENT] =
423 gtk_signal_new ("event",
426 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
427 gtk_widget_marshal_signal_4,
430 widget_signals[BUTTON_PRESS_EVENT] =
431 gtk_signal_new ("button_press_event",
434 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
435 gtk_widget_marshal_signal_4,
438 widget_signals[BUTTON_RELEASE_EVENT] =
439 gtk_signal_new ("button_release_event",
442 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
443 gtk_widget_marshal_signal_4,
446 widget_signals[MOTION_NOTIFY_EVENT] =
447 gtk_signal_new ("motion_notify_event",
450 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
451 gtk_widget_marshal_signal_4,
454 widget_signals[DELETE_EVENT] =
455 gtk_signal_new ("delete_event",
458 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
459 gtk_widget_marshal_signal_4,
462 widget_signals[DESTROY_EVENT] =
463 gtk_signal_new ("destroy_event",
466 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
467 gtk_widget_marshal_signal_4,
470 widget_signals[EXPOSE_EVENT] =
471 gtk_signal_new ("expose_event",
474 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
475 gtk_widget_marshal_signal_4,
478 widget_signals[KEY_PRESS_EVENT] =
479 gtk_signal_new ("key_press_event",
482 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
483 gtk_widget_marshal_signal_4,
486 widget_signals[KEY_RELEASE_EVENT] =
487 gtk_signal_new ("key_release_event",
490 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
491 gtk_widget_marshal_signal_4,
494 widget_signals[ENTER_NOTIFY_EVENT] =
495 gtk_signal_new ("enter_notify_event",
498 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
499 gtk_widget_marshal_signal_4,
502 widget_signals[LEAVE_NOTIFY_EVENT] =
503 gtk_signal_new ("leave_notify_event",
506 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
507 gtk_widget_marshal_signal_4,
510 widget_signals[CONFIGURE_EVENT] =
511 gtk_signal_new ("configure_event",
514 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
515 gtk_widget_marshal_signal_4,
518 widget_signals[FOCUS_IN_EVENT] =
519 gtk_signal_new ("focus_in_event",
522 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
523 gtk_widget_marshal_signal_4,
526 widget_signals[FOCUS_OUT_EVENT] =
527 gtk_signal_new ("focus_out_event",
530 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
531 gtk_widget_marshal_signal_4,
534 widget_signals[MAP_EVENT] =
535 gtk_signal_new ("map_event",
538 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
539 gtk_widget_marshal_signal_4,
542 widget_signals[UNMAP_EVENT] =
543 gtk_signal_new ("unmap_event",
546 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
547 gtk_widget_marshal_signal_4,
550 widget_signals[PROPERTY_NOTIFY_EVENT] =
551 gtk_signal_new ("property_notify_event",
554 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
555 gtk_widget_marshal_signal_4,
558 widget_signals[SELECTION_CLEAR_EVENT] =
559 gtk_signal_new ("selection_clear_event",
562 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
563 gtk_widget_marshal_signal_4,
566 widget_signals[SELECTION_REQUEST_EVENT] =
567 gtk_signal_new ("selection_request_event",
570 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
571 gtk_widget_marshal_signal_4,
574 widget_signals[SELECTION_NOTIFY_EVENT] =
575 gtk_signal_new ("selection_notify_event",
578 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
579 gtk_widget_marshal_signal_4,
582 widget_signals[SELECTION_RECEIVED] =
583 gtk_signal_new ("selection_received",
586 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
587 gtk_widget_marshal_signal_1,
589 GTK_TYPE_SELECTION_DATA);
590 widget_signals[PROXIMITY_IN_EVENT] =
591 gtk_signal_new ("proximity_in_event",
594 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
595 gtk_widget_marshal_signal_4,
598 widget_signals[PROXIMITY_OUT_EVENT] =
599 gtk_signal_new ("proximity_out_event",
602 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
603 gtk_widget_marshal_signal_4,
606 widget_signals[DRAG_BEGIN_EVENT] =
607 gtk_signal_new ("drag_begin_event",
610 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin_event),
611 gtk_widget_marshal_signal_4,
614 widget_signals[DRAG_REQUEST_EVENT] =
615 gtk_signal_new ("drag_request_event",
618 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_request_event),
619 gtk_widget_marshal_signal_4,
622 widget_signals[DRAG_END_EVENT] =
623 gtk_signal_new ("drag_end_event",
626 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end_event),
627 gtk_widget_marshal_signal_4,
630 widget_signals[DROP_ENTER_EVENT] =
631 gtk_signal_new ("drop_enter_event",
634 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_enter_event),
635 gtk_widget_marshal_signal_4,
638 widget_signals[DROP_LEAVE_EVENT] =
639 gtk_signal_new ("drop_leave_event",
642 GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_leave_event),
643 gtk_widget_marshal_signal_4,
646 widget_signals[DROP_DATA_AVAILABLE_EVENT] =
647 gtk_signal_new ("drop_data_available_event",
650 GTK_SIGNAL_OFFSET (GtkWidgetClass,
651 drop_data_available_event),
652 gtk_widget_marshal_signal_4,
655 widget_signals[VISIBILITY_NOTIFY_EVENT] =
656 gtk_signal_new ("visibility_notify_event",
659 GTK_SIGNAL_OFFSET (GtkWidgetClass, visibility_notify_event),
660 gtk_widget_marshal_signal_4,
663 widget_signals[CLIENT_EVENT] =
664 gtk_signal_new ("client_event",
667 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
668 gtk_widget_marshal_signal_4,
671 widget_signals[NO_EXPOSE_EVENT] =
672 gtk_signal_new ("no_expose_event",
675 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
676 gtk_widget_marshal_signal_4,
679 widget_signals[OTHER_EVENT] =
680 gtk_signal_new ("other_event",
683 GTK_SIGNAL_OFFSET (GtkWidgetClass, other_event),
684 gtk_widget_marshal_signal_4,
688 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
690 object_class->shutdown = gtk_widget_shutdown;
691 object_class->destroy = gtk_widget_real_destroy;
692 object_class->finalize = gtk_widget_finalize;
694 klass->activate_signal = 0;
695 klass->show = gtk_widget_real_show;
696 klass->hide = gtk_widget_real_hide;
697 klass->show_all = gtk_widget_real_show;
698 klass->hide_all = gtk_widget_real_hide;
699 klass->map = gtk_widget_real_map;
700 klass->unmap = gtk_widget_real_unmap;
701 klass->realize = gtk_widget_real_realize;
702 klass->unrealize = gtk_widget_real_unrealize;
703 klass->draw = gtk_widget_real_draw;
704 klass->draw_focus = NULL;
705 klass->size_request = NULL;
706 klass->size_allocate = gtk_widget_real_size_allocate;
707 klass->state_changed = NULL;
708 klass->parent_set = NULL;
709 klass->style_set = gtk_widget_style_set;
710 klass->add_accelerator = (void*) gtk_accel_group_handle_add;
711 klass->remove_accelerator = (void*) gtk_accel_group_handle_remove;
713 klass->button_press_event = NULL;
714 klass->button_release_event = NULL;
715 klass->motion_notify_event = NULL;
716 klass->delete_event = NULL;
717 klass->destroy_event = NULL;
718 klass->expose_event = NULL;
719 klass->key_press_event = gtk_widget_real_key_press_event;
720 klass->key_release_event = NULL;
721 klass->enter_notify_event = NULL;
722 klass->leave_notify_event = NULL;
723 klass->configure_event = NULL;
724 klass->focus_in_event = NULL;
725 klass->focus_out_event = NULL;
726 klass->map_event = NULL;
727 klass->unmap_event = NULL;
728 klass->property_notify_event = gtk_selection_property_notify;
729 klass->selection_clear_event = gtk_selection_clear;
730 klass->selection_request_event = gtk_selection_request;
731 klass->selection_notify_event = gtk_selection_notify;
732 klass->selection_received = NULL;
733 klass->proximity_in_event = NULL;
734 klass->proximity_out_event = NULL;
735 klass->drag_begin_event = NULL;
736 klass->drag_request_event = NULL;
737 klass->drop_enter_event = NULL;
738 klass->drop_leave_event = NULL;
739 klass->drop_data_available_event = NULL;
740 klass->other_event = NULL;
741 klass->no_expose_event = NULL;
746 GtkBindingSet *binding_set;
748 binding_set = gtk_binding_set_by_class (klass);
749 gtk_binding_entry_add_signal (binding_set, '9', GDK_CONTROL_MASK, "hide", 0);
750 gtk_binding_entry_add_signal (binding_set, '9', GDK_CONTROL_MASK, "show", 0);
754 /*****************************************
755 * gtk_widget_set_arg:
760 *****************************************/
763 gtk_widget_set_arg (GtkWidget *widget,
772 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
775 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
778 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
781 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
784 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -1);
787 gtk_widget_set_usize (widget, -1, GTK_VALUE_INT (*arg));
790 if (GTK_VALUE_BOOL(*arg))
791 gtk_widget_show (widget);
793 gtk_widget_hide (widget);
796 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
799 saved_flags = GTK_WIDGET_FLAGS (widget);
800 if (GTK_VALUE_BOOL (*arg))
801 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
803 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
804 if (saved_flags != GTK_WIDGET_FLAGS (widget))
805 gtk_widget_queue_resize (widget);
808 if (GTK_VALUE_BOOL (*arg))
809 gtk_widget_grab_focus (widget);
811 case ARG_CAN_DEFAULT:
812 saved_flags = GTK_WIDGET_FLAGS (widget);
813 if (GTK_VALUE_BOOL (*arg))
814 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
816 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
817 if (saved_flags != GTK_WIDGET_FLAGS (widget))
818 gtk_widget_queue_resize (widget);
820 case ARG_HAS_DEFAULT:
821 if (GTK_VALUE_BOOL (*arg))
822 gtk_widget_grab_default (widget);
825 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
828 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
830 case ARG_EXTENSION_EVENTS:
831 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
834 arg->type = GTK_TYPE_INVALID;
839 /*****************************************
840 * gtk_widget_get_arg:
845 *****************************************/
848 gtk_widget_get_arg (GtkWidget *widget,
852 GtkWidgetAuxInfo *aux_info;
854 GdkExtensionMode *modep;
860 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
862 GTK_VALUE_STRING (*arg) = g_strdup ("");
865 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
868 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
870 GTK_VALUE_INT (*arg) = -2;
872 GTK_VALUE_INT (*arg) = aux_info->x;
875 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
877 GTK_VALUE_INT (*arg) = -2;
879 GTK_VALUE_INT (*arg) = aux_info->y;
882 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
884 GTK_VALUE_INT (*arg) = -2;
886 GTK_VALUE_INT (*arg) = aux_info->width;
889 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
891 GTK_VALUE_INT (*arg) = -2;
893 GTK_VALUE_INT (*arg) = aux_info->height;
896 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_VISIBLE (widget) != FALSE);
899 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_SENSITIVE (widget) != FALSE);
902 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_FOCUS (widget) != FALSE);
905 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_FOCUS (widget) != FALSE);
907 case ARG_CAN_DEFAULT:
908 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_DEFAULT (widget) != FALSE);
910 case ARG_HAS_DEFAULT:
911 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
914 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
917 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
919 GTK_VALUE_FLAGS (*arg) = 0;
921 GTK_VALUE_FLAGS (*arg) = *eventp;
923 case ARG_EXTENSION_EVENTS:
924 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
926 GTK_VALUE_FLAGS (*arg) = 0;
928 GTK_VALUE_FLAGS (*arg) = *modep;
931 arg->type = GTK_TYPE_INVALID;
936 /*****************************************
942 *****************************************/
945 gtk_widget_init (GtkWidget *widget)
947 GdkColormap *colormap;
950 GTK_PRIVATE_FLAGS (widget) = 0;
951 widget->state = GTK_STATE_NORMAL;
952 widget->saved_state = GTK_STATE_NORMAL;
954 widget->requisition.width = 0;
955 widget->requisition.height = 0;
956 widget->allocation.x = -1;
957 widget->allocation.y = -1;
958 widget->allocation.width = 1;
959 widget->allocation.height = 1;
960 widget->window = NULL;
961 widget->parent = NULL;
963 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE | GTK_PARENT_SENSITIVE);
965 widget->style = gtk_widget_peek_style ();
966 gtk_style_ref (widget->style);
968 colormap = gtk_widget_peek_colormap ();
969 visual = gtk_widget_peek_visual ();
971 /* XXX - should we ref the colormap and visual, too? */
973 if (colormap != gtk_widget_get_default_colormap ())
975 /* gdk_colormap_ref (colormap); */
976 gtk_object_set_data (GTK_OBJECT (widget), colormap_key, colormap);
979 if (visual != gtk_widget_get_default_visual ())
981 /* gdk_visual_ref (visual); */
982 gtk_object_set_data (GTK_OBJECT (widget), visual_key, visual);
986 /*****************************************
992 *****************************************/
995 gtk_widget_new (guint type,
1004 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1006 obj = gtk_type_new (type);
1008 va_start (args1, type);
1009 va_start (args2, type);
1011 args = gtk_object_collect_args (&nargs, args1, args2);
1012 gtk_object_setv (obj, nargs, args);
1018 return GTK_WIDGET (obj);
1021 /*****************************************
1027 *****************************************/
1030 gtk_widget_newv (guint type,
1034 g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1036 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1039 /*****************************************
1045 *****************************************/
1048 gtk_widget_get (GtkWidget *widget,
1051 g_return_if_fail (widget != NULL);
1052 g_return_if_fail (arg != NULL);
1054 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1057 /*****************************************
1063 *****************************************/
1066 gtk_widget_getv (GtkWidget *widget,
1070 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1073 /*****************************************
1079 *****************************************/
1082 gtk_widget_set (GtkWidget *widget,
1090 g_return_if_fail (widget != NULL);
1092 va_start (args1, widget);
1093 va_start (args2, widget);
1095 args = gtk_object_collect_args (&nargs, args1, args2);
1096 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1103 /*****************************************
1109 *****************************************/
1112 gtk_widget_setv (GtkWidget *widget,
1116 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1119 /*****************************************
1120 * gtk_widget_unparent:
1121 * do any cleanup necessary necessary
1122 * for setting parent = NULL.
1127 *****************************************/
1130 gtk_widget_unparent (GtkWidget *widget)
1132 GtkWidget *toplevel;
1133 GtkWidget *old_parent;
1134 GSList *tmp_list, *prev_list;
1136 g_return_if_fail (widget != NULL);
1137 if (widget->parent == NULL)
1140 /* keep this function in sync with gtk_menu_detach()
1143 /* unset focused and default children properly
1145 toplevel = gtk_widget_get_toplevel (widget);
1146 if (GTK_CONTAINER (widget->parent)->focus_child == widget)
1148 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL);
1150 if (GTK_IS_WINDOW (toplevel))
1154 child = GTK_WINDOW (toplevel)->focus_widget;
1156 while (child && child != widget)
1157 child = child->parent;
1159 if (child == widget)
1160 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1163 if (GTK_IS_WINDOW (toplevel))
1167 child = GTK_WINDOW (toplevel)->default_widget;
1169 while (child && child != widget)
1170 child = child->parent;
1172 if (child == widget)
1173 gtk_window_set_default (GTK_WINDOW (toplevel), NULL);
1176 /* Remove the widget and all its children from toplevel->resize_widgets
1179 /* Three ways to make this prettier:
1180 * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer))
1181 * Change resize_widgets to a GList
1182 * Just bite the bullet and use g_slist_remove
1184 tmp_list = GTK_CONTAINER (toplevel)->resize_widgets;
1188 GSList *tmp = tmp_list;
1189 GtkWidget *child = (GtkWidget *)tmp->data;
1190 GtkWidget *parent = child;
1192 tmp_list = tmp_list->next;
1194 while (parent && (parent != widget))
1195 parent = parent->parent;
1197 if (parent == widget)
1199 GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED);
1202 prev_list->next = tmp_list;
1204 GTK_CONTAINER (toplevel)->resize_widgets = tmp_list;
1208 g_slist_free_1 (tmp);
1214 if (widget->window &&
1215 GTK_WIDGET_NO_WINDOW (widget) &&
1216 GTK_WIDGET_DRAWABLE (widget))
1217 gdk_window_clear_area (widget->window,
1218 widget->allocation.x,
1219 widget->allocation.y,
1220 widget->allocation.width,
1221 widget->allocation.height);
1223 /* Reset the width and height here, to force reallocation if we
1224 * get added back to a new parent. This won't work if our new
1225 * allocation is smaller than 1x1 and we actually want a size of 1x1...
1226 * (would 0x0 be OK here?)
1228 widget->allocation.width = 1;
1229 widget->allocation.height = 1;
1231 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1232 gtk_widget_unrealize (widget);
1234 old_parent = widget->parent;
1235 widget->parent = NULL;
1236 gtk_widget_set_parent_window (widget, NULL);
1237 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1239 gtk_widget_unref (widget);
1242 /*****************************************
1243 * gtk_widget_destroy:
1248 *****************************************/
1251 gtk_widget_destroy (GtkWidget *widget)
1253 g_return_if_fail (widget != NULL);
1254 g_return_if_fail (GTK_IS_WIDGET (widget));
1256 gtk_object_destroy ((GtkObject*) widget);
1259 /*****************************************
1260 * gtk_widget_destroyed:
1261 * Utility function: sets widget_pointer
1262 * to NULL when widget is destroyed.
1267 *****************************************/
1270 gtk_widget_destroyed (GtkWidget *widget,
1271 GtkWidget **widget_pointer)
1273 /* Don't make any assumptions about the
1275 * Even check widget_pointer.
1278 *widget_pointer = NULL;
1281 /*****************************************
1287 *****************************************/
1290 gtk_widget_show (GtkWidget *widget)
1292 g_return_if_fail (widget != NULL);
1294 if (!GTK_WIDGET_VISIBLE (widget))
1295 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1299 /*************************************************************
1300 * gtk_widget_show_now:
1301 * Show a widget, and if it is an unmapped toplevel widget
1302 * wait for the map_event before returning
1304 * Warning: This routine will call the main loop recursively.
1309 *************************************************************/
1312 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
1315 gtk_signal_disconnect_by_data (GTK_OBJECT (widget), flag);
1319 gtk_widget_show_now (GtkWidget *widget)
1323 /* make sure we will get event */
1324 if (!GTK_WIDGET_MAPPED (widget) &&
1325 GTK_WIDGET_TOPLEVEL (widget))
1327 gtk_widget_show (widget);
1329 gtk_signal_connect (GTK_OBJECT (widget), "map_event",
1330 GTK_SIGNAL_FUNC (gtk_widget_show_map_callback),
1334 gtk_main_iteration();
1337 gtk_widget_show (widget);
1340 /*****************************************
1346 *****************************************/
1349 gtk_widget_hide (GtkWidget *widget)
1351 g_return_if_fail (widget != NULL);
1352 g_return_if_fail (GTK_IS_WIDGET (widget));
1354 if (GTK_WIDGET_VISIBLE (widget))
1355 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1359 gtk_widget_hide_on_delete (GtkWidget *widget)
1361 g_return_val_if_fail (widget != NULL, FALSE);
1362 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
1364 gtk_widget_hide (widget);
1369 /*****************************************
1370 * gtk_widget_show_all:
1372 * Shows the widget and all children.
1374 * Container classes overwrite
1375 * show_all and hide_all to call
1376 * show_all (hide_all) on both themselves
1377 * and on their child widgets.
1382 *****************************************/
1385 gtk_widget_show_all (GtkWidget *widget)
1387 GtkWidgetClass *widget_class;
1389 g_return_if_fail (widget != NULL);
1391 /* show_all shouldn't be invoked through a signal,
1392 because in this case it would be quite slow - there would
1393 be a show and show_all signal emitted for every child widget.
1395 widget_class = GTK_WIDGET_CLASS(GTK_OBJECT(widget)->klass);
1396 widget_class->show_all (widget);
1399 /*****************************************
1400 * gtk_widget_hide_all:
1402 * Hides the widget and all children.
1403 * See gtk_widget_show_all.
1408 *****************************************/
1411 gtk_widget_hide_all (GtkWidget *widget)
1413 g_return_if_fail (widget != NULL);
1414 g_assert (widget->parent);
1416 if (GTK_WIDGET_RESIZE_NEEDED (widget))
1418 GtkWidget *toplevel;
1420 toplevel = gtk_widget_get_toplevel (widget);
1421 GTK_CONTAINER (toplevel)->resize_widgets =
1422 g_slist_remove (GTK_CONTAINER (toplevel)->resize_widgets, widget);
1423 GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_NEEDED);
1426 GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass)->hide_all (widget);
1429 /*****************************************
1435 *****************************************/
1438 gtk_widget_map (GtkWidget *widget)
1440 g_return_if_fail (widget != NULL);
1442 if (!GTK_WIDGET_MAPPED (widget))
1444 if (!GTK_WIDGET_REALIZED (widget))
1445 gtk_widget_realize (widget);
1447 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1451 /*****************************************
1457 *****************************************/
1460 gtk_widget_unmap (GtkWidget *widget)
1462 g_return_if_fail (widget != NULL);
1464 if (GTK_WIDGET_MAPPED (widget))
1465 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1468 /*****************************************
1469 * gtk_widget_realize:
1474 *****************************************/
1477 gtk_widget_realize (GtkWidget *widget)
1480 GdkExtensionMode mode;
1481 GtkWidgetShapeInfo *shape_info;
1483 g_return_if_fail (widget != NULL);
1485 if (!GTK_WIDGET_REALIZED (widget))
1488 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1489 g_print ("%s\n", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1492 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1493 gtk_widget_realize (widget->parent);
1495 gtk_widget_ensure_style (widget);
1497 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1499 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1501 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1503 gdk_window_shape_combine_mask (widget->window,
1504 shape_info->shape_mask,
1505 shape_info->offset_x,
1506 shape_info->offset_y);
1509 if (!GTK_WIDGET_NO_WINDOW (widget))
1511 mode = gtk_widget_get_extension_events (widget);
1512 if (mode != GDK_EXTENSION_EVENTS_NONE)
1514 events = gtk_widget_get_events (widget);
1515 gdk_input_set_extension_events (widget->window, events, mode);
1522 /*****************************************
1523 * gtk_widget_unrealize:
1528 *****************************************/
1531 gtk_widget_unrealize (GtkWidget *widget)
1533 g_return_if_fail (widget != NULL);
1535 if (GTK_WIDGET_REDRAW_PENDING (widget))
1537 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1538 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1541 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1542 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
1544 if (GTK_WIDGET_REALIZED (widget))
1546 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1547 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
1551 /*****************************************
1552 * gtk_widget_queue_draw:
1557 *****************************************/
1560 gtk_widget_idle_draw (gpointer data)
1562 while (gtk_widget_redraw_queue)
1563 gtk_widget_draw (gtk_widget_redraw_queue->data, NULL);
1569 gtk_widget_queue_draw (GtkWidget *widget)
1573 g_return_if_fail (widget != NULL);
1575 if (GTK_WIDGET_DRAWABLE (widget))
1577 /* We queue the redraw if:
1578 * a) the widget is not already queued for redraw and
1579 * b) non of the widgets ancestors are queued for redraw.
1584 if (GTK_WIDGET_REDRAW_PENDING (parent))
1586 parent = parent->parent;
1589 GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_PENDING);
1590 if (gtk_widget_redraw_queue == NULL)
1591 gtk_idle_add_priority (GTK_PRIORITY_INTERNAL,
1592 gtk_widget_idle_draw,
1595 gtk_widget_redraw_queue = g_slist_prepend (gtk_widget_redraw_queue, widget);
1599 /*****************************************
1600 * gtk_widget_queue_resize:
1605 *****************************************/
1608 gtk_widget_idle_sizer (void *data)
1614 while (gtk_widget_resize_queue)
1618 slist = gtk_widget_resize_queue;
1619 gtk_widget_resize_queue = slist->next;
1620 widget = slist->data;
1622 GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_PENDING);
1624 gtk_widget_ref (widget);
1625 if (gtk_container_need_resize (GTK_CONTAINER (widget)))
1627 slist->next = re_queue;
1632 g_slist_free_1 (slist);
1633 gtk_widget_unref (widget);
1637 for (slist = re_queue; slist; slist = slist->next)
1641 widget = slist->data;
1642 if (GTK_OBJECT (widget)->ref_count > 1 &&
1643 !GTK_OBJECT_DESTROYED (widget))
1644 gtk_widget_queue_resize (widget);
1645 gtk_widget_unref (widget);
1647 g_slist_free (re_queue);
1653 gtk_widget_queue_resize (GtkWidget *widget)
1655 GtkWidget *toplevel;
1657 g_return_if_fail (widget != NULL);
1658 if (GTK_OBJECT_DESTROYED (widget))
1661 toplevel = gtk_widget_get_toplevel (widget);
1662 if (GTK_WIDGET_TOPLEVEL (toplevel))
1664 if (GTK_WIDGET_VISIBLE (toplevel))
1666 if (!GTK_CONTAINER_RESIZE_PENDING (toplevel))
1668 GTK_PRIVATE_SET_FLAG (toplevel, GTK_RESIZE_PENDING);
1669 if (gtk_widget_resize_queue == NULL)
1670 gtk_idle_add_priority (GTK_PRIORITY_INTERNAL - 1,
1671 gtk_widget_idle_sizer,
1673 gtk_widget_resize_queue = g_slist_prepend (gtk_widget_resize_queue, toplevel);
1676 if (!GTK_WIDGET_RESIZE_NEEDED (widget))
1678 GTK_PRIVATE_SET_FLAG (widget, GTK_RESIZE_NEEDED);
1679 GTK_CONTAINER (toplevel)->resize_widgets =
1680 g_slist_prepend (GTK_CONTAINER (toplevel)->resize_widgets, widget);
1683 g_assert (g_slist_find (GTK_CONTAINER (toplevel)->resize_widgets, widget)); /* paranoid */
1686 gtk_container_need_resize (GTK_CONTAINER (toplevel));
1690 /*****************************************
1696 *****************************************/
1699 gtk_widget_draw (GtkWidget *widget,
1702 GdkRectangle temp_area;
1704 g_return_if_fail (widget != NULL);
1706 if (GTK_WIDGET_REDRAW_PENDING (widget))
1708 gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1709 GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1714 if (GTK_WIDGET_DRAWABLE (widget))
1718 if (GTK_WIDGET_NO_WINDOW (widget))
1720 temp_area.x = widget->allocation.x;
1721 temp_area.y = widget->allocation.y;
1729 temp_area.width = widget->allocation.width;
1730 temp_area.height = widget->allocation.height;
1734 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
1738 /*****************************************
1739 * gtk_widget_draw_focus:
1744 *****************************************/
1747 gtk_widget_draw_focus (GtkWidget *widget)
1749 g_return_if_fail (widget != NULL);
1751 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
1754 /*****************************************
1755 * gtk_widget_draw_default:
1760 *****************************************/
1763 gtk_widget_draw_default (GtkWidget *widget)
1765 g_return_if_fail (widget != NULL);
1767 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
1770 /*****************************************
1771 * gtk_widget_draw_children:
1776 *****************************************/
1779 gtk_widget_draw_children (GtkWidget *widget)
1781 g_return_if_fail (widget != NULL);
1783 if (GTK_IS_CONTAINER (widget))
1784 gtk_container_foreach (GTK_CONTAINER (widget),
1785 gtk_widget_draw_children_recurse,
1789 /*****************************************
1790 * gtk_widget_size_request:
1795 *****************************************/
1798 gtk_widget_size_request (GtkWidget *widget,
1799 GtkRequisition *requisition)
1801 GtkWidgetAuxInfo *aux_info;
1803 g_return_if_fail (widget != NULL);
1805 gtk_widget_ref (widget);
1806 gtk_widget_ensure_style (widget);
1807 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
1809 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1812 if (aux_info->width > 0)
1813 requisition->width = aux_info->width;
1814 if (aux_info->height > 0)
1815 requisition->height = aux_info->height;
1817 gtk_widget_unref (widget);
1820 /*****************************************
1821 * gtk_widget_size_allocate:
1826 *****************************************/
1829 gtk_widget_size_allocate (GtkWidget *widget,
1830 GtkAllocation *allocation)
1832 GtkWidgetAuxInfo *aux_info;
1833 GtkAllocation real_allocation;
1835 g_return_if_fail (widget != NULL);
1837 real_allocation = *allocation;
1838 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1842 if (aux_info->x != -1)
1843 real_allocation.x = aux_info->x;
1844 if (aux_info->y != -1)
1845 real_allocation.y = aux_info->y;
1848 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
1852 gtk_widget_add_accelerator (GtkWidget *widget,
1853 const gchar *accel_signal,
1854 GtkAccelGroup *accel_group,
1857 GtkAccelFlags accel_flags)
1859 g_return_if_fail (widget != NULL);
1860 g_return_if_fail (GTK_IS_WIDGET (widget));
1861 g_return_if_fail (accel_group != NULL);
1863 gtk_accel_group_add (accel_group,
1867 (GtkObject*) widget,
1872 gtk_widget_stop_accelerator (GtkWidget *widget)
1874 g_return_if_fail (widget != NULL);
1875 g_return_if_fail (GTK_IS_WIDGET (widget));
1877 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
1881 gtk_widget_remove_accelerator (GtkWidget *widget,
1882 GtkAccelGroup *accel_group,
1886 g_return_if_fail (widget != NULL);
1887 g_return_if_fail (GTK_IS_WIDGET (widget));
1888 g_return_if_fail (accel_group != NULL);
1890 gtk_accel_group_remove (accel_group,
1893 (GtkObject*) widget);
1897 gtk_widget_remove_accelerators (GtkWidget *widget,
1898 const gchar *accel_signal,
1899 gboolean visible_only)
1904 g_return_if_fail (widget != NULL);
1905 g_return_if_fail (GTK_IS_WIDGET (widget));
1906 g_return_if_fail (accel_signal != NULL);
1908 signal_id = gtk_signal_lookup (accel_signal, GTK_OBJECT_TYPE (widget));
1909 g_return_if_fail (signal_id != 0);
1911 slist = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
1914 GtkAccelEntry *ac_entry;
1916 ac_entry = slist->data;
1917 slist = slist->next;
1918 if (ac_entry->accel_flags & GTK_ACCEL_VISIBLE &&
1919 ac_entry->signal_id == signal_id)
1920 gtk_widget_remove_accelerator (GTK_WIDGET (widget),
1921 ac_entry->accel_group,
1922 ac_entry->accelerator_key,
1923 ac_entry->accelerator_mods);
1928 gtk_widget_accelerator_signal (GtkWidget *widget,
1929 GtkAccelGroup *accel_group,
1933 GtkAccelEntry *ac_entry;
1935 g_return_val_if_fail (widget != NULL, 0);
1936 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
1937 g_return_val_if_fail (accel_group != NULL, 0);
1939 ac_entry = gtk_accel_group_get_entry (accel_group, accel_key, accel_mods);
1941 if (ac_entry && ac_entry->object == (GtkObject*) widget)
1942 return ac_entry->signal_id;
1947 gtk_widget_real_key_press_event (GtkWidget *widget,
1950 gboolean handled = FALSE;
1952 g_return_val_if_fail (widget != NULL, handled);
1953 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
1954 g_return_val_if_fail (event != NULL, handled);
1957 handled = gtk_bindings_activate (GTK_OBJECT (widget),
1958 event->keyval, event->state);
1963 /*****************************************
1969 *****************************************/
1972 gtk_widget_event (GtkWidget *widget,
1978 g_return_val_if_fail (widget != NULL, TRUE);
1980 gtk_widget_ref (widget);
1982 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
1984 if (return_val || GTK_OBJECT_DESTROYED (widget))
1986 gtk_widget_unref (widget);
1990 switch (event->type)
1995 case GDK_BUTTON_PRESS:
1996 case GDK_2BUTTON_PRESS:
1997 case GDK_3BUTTON_PRESS:
1998 signal_num = BUTTON_PRESS_EVENT;
2000 case GDK_BUTTON_RELEASE:
2001 signal_num = BUTTON_RELEASE_EVENT;
2003 case GDK_MOTION_NOTIFY:
2004 signal_num = MOTION_NOTIFY_EVENT;
2007 signal_num = DELETE_EVENT;
2010 signal_num = DESTROY_EVENT;
2013 signal_num = KEY_PRESS_EVENT;
2015 case GDK_KEY_RELEASE:
2016 signal_num = KEY_RELEASE_EVENT;
2018 case GDK_ENTER_NOTIFY:
2019 signal_num = ENTER_NOTIFY_EVENT;
2021 case GDK_LEAVE_NOTIFY:
2022 signal_num = LEAVE_NOTIFY_EVENT;
2024 case GDK_FOCUS_CHANGE:
2025 if (event->focus_change.in)
2026 signal_num = FOCUS_IN_EVENT;
2028 signal_num = FOCUS_OUT_EVENT;
2031 signal_num = CONFIGURE_EVENT;
2034 signal_num = MAP_EVENT;
2037 signal_num = UNMAP_EVENT;
2039 case GDK_PROPERTY_NOTIFY:
2040 signal_num = PROPERTY_NOTIFY_EVENT;
2042 case GDK_SELECTION_CLEAR:
2043 signal_num = SELECTION_CLEAR_EVENT;
2045 case GDK_SELECTION_REQUEST:
2046 signal_num = SELECTION_REQUEST_EVENT;
2048 case GDK_SELECTION_NOTIFY:
2049 signal_num = SELECTION_NOTIFY_EVENT;
2051 case GDK_PROXIMITY_IN:
2052 signal_num = PROXIMITY_IN_EVENT;
2054 case GDK_PROXIMITY_OUT:
2055 signal_num = PROXIMITY_OUT_EVENT;
2057 case GDK_DRAG_BEGIN:
2058 signal_num = DRAG_BEGIN_EVENT;
2060 case GDK_DRAG_REQUEST:
2061 signal_num = DRAG_REQUEST_EVENT;
2063 case GDK_DROP_ENTER:
2064 signal_num = DROP_ENTER_EVENT;
2066 case GDK_DROP_LEAVE:
2067 signal_num = DROP_LEAVE_EVENT;
2069 case GDK_DROP_DATA_AVAIL:
2070 signal_num = DROP_DATA_AVAILABLE_EVENT;
2072 case GDK_OTHER_EVENT:
2073 signal_num = OTHER_EVENT;
2076 signal_num = NO_EXPOSE_EVENT;
2078 case GDK_CLIENT_EVENT:
2079 signal_num = CLIENT_EVENT;
2082 /* there is no sense in providing a widget with bogus expose events
2084 if (!event->any.window)
2086 gtk_widget_unref (widget);
2089 signal_num = EXPOSE_EVENT;
2091 case GDK_VISIBILITY_NOTIFY:
2092 signal_num = VISIBILITY_NOTIFY_EVENT;
2095 g_warning ("could not determine signal number for event: %d", event->type);
2096 gtk_widget_unref (widget);
2100 if (signal_num != -1)
2101 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
2103 return_val |= GTK_OBJECT_DESTROYED (widget);
2105 gtk_widget_unref (widget);
2110 /*****************************************
2111 * gtk_widget_activate:
2116 *****************************************/
2119 gtk_widget_activate (GtkWidget *widget)
2121 g_return_if_fail (widget != NULL);
2122 g_return_if_fail (GTK_IS_WIDGET (widget));
2124 if (WIDGET_CLASS (widget)->activate_signal)
2125 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
2128 /*****************************************
2129 * gtk_widget_reparent_container_child:
2130 * assistent function to gtk_widget_reparent
2135 *****************************************/
2138 gtk_widget_reparent_container_child(GtkWidget *widget,
2139 gpointer client_data)
2141 g_return_if_fail (widget != NULL);
2142 g_return_if_fail (client_data != NULL);
2144 if (GTK_WIDGET_NO_WINDOW (widget))
2147 gdk_window_unref (widget->window);
2148 widget->window = (GdkWindow*) client_data;
2150 gdk_window_ref (widget->window);
2152 if (GTK_IS_CONTAINER (widget))
2153 gtk_container_foreach (GTK_CONTAINER (widget),
2154 gtk_widget_reparent_container_child,
2158 gdk_window_reparent (widget->window,
2159 (GdkWindow*) client_data, 0, 0);
2162 /*****************************************
2163 * gtk_widget_reparent:
2168 *****************************************/
2171 gtk_widget_reparent (GtkWidget *widget,
2172 GtkWidget *new_parent)
2174 g_return_if_fail (widget != NULL);
2175 g_return_if_fail (GTK_IS_WIDGET (widget));
2176 g_return_if_fail (new_parent != NULL);
2177 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
2178 g_return_if_fail (widget->parent != NULL);
2180 if (widget->parent != new_parent)
2182 /* First try to see if we can get away without unrealizing
2183 * the widget as we reparent it. if so we set a flag so
2184 * that gtk_widget_unparent doesn't unrealize widget
2186 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
2187 GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
2189 gtk_widget_ref (widget);
2190 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
2191 gtk_container_add (GTK_CONTAINER (new_parent), widget);
2192 gtk_widget_unref (widget);
2194 if (GTK_WIDGET_IN_REPARENT (widget))
2196 GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
2198 /* OK, now fix up the widget's window. (And that for any
2199 * children, if the widget is NO_WINDOW and a container)
2201 if (GTK_WIDGET_NO_WINDOW (widget))
2203 if (GTK_IS_CONTAINER (widget))
2204 gtk_container_foreach (GTK_CONTAINER (widget),
2205 gtk_widget_reparent_container_child,
2206 gtk_widget_get_parent_window (widget));
2209 GdkWindow *parent_window;
2211 parent_window = gtk_widget_get_parent_window (widget);
2212 if (parent_window != widget->window)
2215 gdk_window_unref (widget->window);
2216 widget->window = parent_window;
2218 gdk_window_ref (widget->window);
2223 gdk_window_reparent (widget->window, gtk_widget_get_parent_window (widget), 0, 0);
2228 /*****************************************
2234 *****************************************/
2237 gtk_widget_popup (GtkWidget *widget,
2241 g_return_if_fail (widget != NULL);
2243 if (!GTK_WIDGET_VISIBLE (widget))
2245 if (!GTK_WIDGET_REALIZED (widget))
2246 gtk_widget_realize (widget);
2247 if (!GTK_WIDGET_NO_WINDOW (widget))
2248 gdk_window_move (widget->window, x, y);
2249 gtk_widget_show (widget);
2253 /*****************************************
2254 * gtk_widget_intersect:
2259 *****************************************/
2262 gtk_widget_intersect (GtkWidget *widget,
2264 GdkRectangle *intersection)
2270 g_return_val_if_fail (widget != NULL, FALSE);
2271 g_return_val_if_fail (area != NULL, FALSE);
2274 dest = intersection;
2278 return_val = gdk_rectangle_intersect ((GdkRectangle*) &widget->allocation, area, dest);
2280 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2282 intersection->x -= widget->allocation.x;
2283 intersection->y -= widget->allocation.y;
2291 gtk_widget_basic (GtkWidget *widget)
2297 g_return_val_if_fail (widget != NULL, FALSE);
2299 if (!GTK_WIDGET_BASIC (widget))
2301 else if (GTK_IS_CONTAINER (widget))
2303 children = gtk_container_children (GTK_CONTAINER (widget));
2307 tmp_list = children;
2311 if (!gtk_widget_basic (GTK_WIDGET (tmp_list->data)))
2317 tmp_list = tmp_list->next;
2320 g_list_free (children);
2329 /*****************************************
2330 * gtk_widget_grab_focus:
2335 *****************************************/
2338 gtk_widget_grab_focus (GtkWidget *widget)
2340 g_return_if_fail (widget != NULL);
2341 g_return_if_fail (GTK_IS_WIDGET (widget));
2343 if (GTK_WIDGET_CAN_FOCUS (widget))
2347 GtkType window_type;
2349 window_type = gtk_window_get_type ();
2350 parent = widget->parent;
2353 while (parent && !gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2355 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2357 parent = parent->parent;
2360 if (parent && gtk_type_is_a (GTK_WIDGET_TYPE (parent), window_type))
2362 gtk_container_set_focus_child (GTK_CONTAINER (parent), child);
2363 gtk_window_set_focus (GTK_WINDOW (parent), widget);
2368 /*****************************************
2369 * gtk_widget_grab_default:
2374 *****************************************/
2377 gtk_widget_grab_default (GtkWidget *widget)
2380 GtkType window_type;
2382 g_return_if_fail (widget != NULL);
2383 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
2385 window_type = gtk_window_get_type ();
2386 window = widget->parent;
2388 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2389 window = window->parent;
2391 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2392 gtk_window_set_default (GTK_WINDOW (window), widget);
2395 /*****************************************
2396 * gtk_widget_set_name:
2401 *****************************************/
2404 gtk_widget_set_name (GtkWidget *widget,
2407 g_return_if_fail (widget != NULL);
2410 g_free (widget->name);
2411 widget->name = g_strdup (name);
2413 if (!GTK_WIDGET_USER_STYLE (widget))
2414 gtk_widget_set_rc_style (widget);
2417 /*****************************************
2418 * gtk_widget_get_name:
2423 *****************************************/
2426 gtk_widget_get_name (GtkWidget *widget)
2428 g_return_val_if_fail (widget != NULL, NULL);
2431 return widget->name;
2432 return gtk_type_name (GTK_WIDGET_TYPE (widget));
2435 /*****************************************
2436 * gtk_widget_set_state:
2443 *****************************************/
2446 gtk_widget_set_state (GtkWidget *widget,
2449 g_return_if_fail (widget != NULL);
2450 g_return_if_fail (GTK_IS_WIDGET (widget));
2452 if (state == GTK_WIDGET_STATE (widget))
2455 if (state == GTK_STATE_INSENSITIVE)
2456 gtk_widget_set_sensitive (widget, FALSE);
2462 data.state_restauration = FALSE;
2464 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2466 data.parent_sensitive = TRUE;
2468 gtk_widget_propagate_state (widget, &data);
2469 gtk_widget_queue_draw (widget);
2473 /*****************************************
2474 * gtk_widget_set_sensitive:
2478 * boolean value for sensitivity
2481 *****************************************/
2484 gtk_widget_set_sensitive (GtkWidget *widget,
2489 g_return_if_fail (widget != NULL);
2490 g_return_if_fail (GTK_IS_WIDGET (widget));
2492 sensitive = (sensitive != FALSE);
2494 if (sensitive == (GTK_WIDGET_SENSITIVE (widget) != FALSE))
2499 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
2500 data.state = GTK_WIDGET_SAVED_STATE (widget);
2504 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
2505 data.state = GTK_WIDGET_STATE (widget);
2507 data.state_restauration = TRUE;
2510 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2512 data.parent_sensitive = TRUE;
2514 gtk_widget_propagate_state (widget, &data);
2515 gtk_widget_queue_draw (widget);
2518 /*****************************************
2519 * gtk_widget_set_parent:
2524 *****************************************/
2527 gtk_widget_set_parent (GtkWidget *widget,
2532 g_return_if_fail (widget != NULL);
2533 g_return_if_fail (widget->parent == NULL);
2534 g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
2535 g_return_if_fail (parent != NULL);
2537 /* keep this function in sync with gtk_menu_attach_to_widget()
2540 gtk_widget_ref (widget);
2541 gtk_object_sink (GTK_OBJECT (widget));
2542 widget->parent = parent;
2544 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
2545 data.state = GTK_WIDGET_STATE (parent);
2547 data.state = GTK_WIDGET_STATE (widget);
2548 data.state_restauration = FALSE;
2549 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (parent) != FALSE);
2551 gtk_widget_propagate_state (widget, &data);
2553 while (parent->parent != NULL)
2554 parent = parent->parent;
2556 gtk_widget_set_style_recurse (widget, NULL);
2558 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
2561 /*****************************************
2563 * see docs/styles.txt
2564 *****************************************/
2566 gtk_widget_set_style (GtkWidget *widget,
2569 GtkStyle *default_style;
2570 gboolean initial_emission;
2572 g_return_if_fail (widget != NULL);
2573 g_return_if_fail (style != NULL);
2575 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2577 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
2578 GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
2580 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2583 gtk_style_ref (widget->style);
2584 if (!saved_default_style_key_id)
2585 saved_default_style_key_id = gtk_object_data_force_id (saved_default_style_key);
2586 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2589 gtk_widget_set_style_internal (widget, style, initial_emission);
2593 gtk_widget_ensure_style (GtkWidget *widget)
2595 if (!GTK_WIDGET_USER_STYLE (widget) &&
2596 !GTK_WIDGET_RC_STYLE (widget))
2597 gtk_widget_set_rc_style (widget);
2601 gtk_widget_set_rc_style (GtkWidget *widget)
2603 GtkStyle *saved_style;
2604 GtkStyle *new_style;
2605 gboolean initial_emission;
2607 g_return_if_fail (widget != NULL);
2609 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2611 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2612 GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
2614 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2615 new_style = gtk_rc_get_style (widget);
2620 gtk_style_ref (widget->style);
2621 if (!saved_default_style_key_id)
2622 saved_default_style_key_id = gtk_object_data_force_id (saved_default_style_key);
2623 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2625 gtk_widget_set_style_internal (widget, new_style, initial_emission);
2631 g_assert (initial_emission == FALSE); /* FIXME: remove this line */
2633 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2634 gtk_widget_set_style_internal (widget, saved_style, initial_emission);
2635 gtk_style_unref (saved_style);
2639 if (initial_emission)
2640 gtk_widget_set_style_internal (widget, widget->style, TRUE);
2646 gtk_widget_restore_default_style (GtkWidget *widget)
2648 GtkStyle *default_style;
2650 g_return_if_fail (widget != NULL);
2652 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2654 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2657 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2658 gtk_widget_set_style_internal (widget, default_style, FALSE);
2659 gtk_style_unref (default_style);
2664 gtk_widget_get_style (GtkWidget *widget)
2666 g_return_val_if_fail (widget != NULL, NULL);
2668 return widget->style;
2672 gtk_widget_style_set (GtkWidget *widget,
2673 GtkStyle *previous_style)
2675 if (GTK_WIDGET_REALIZED (widget) &&
2676 !GTK_WIDGET_NO_WINDOW (widget))
2678 gtk_style_set_background (widget->style, widget->window, widget->state);
2679 if (GTK_WIDGET_DRAWABLE (widget))
2680 gdk_window_clear (widget->window);
2685 gtk_widget_set_style_internal (GtkWidget *widget,
2687 gboolean initial_emission)
2689 g_return_if_fail (widget != NULL);
2690 g_return_if_fail (style != NULL);
2692 if (widget->style != style)
2694 GtkStyle *previous_style;
2696 if (GTK_WIDGET_REALIZED (widget))
2697 gtk_style_detach (widget->style);
2699 previous_style = widget->style;
2700 widget->style = style;
2701 gtk_style_ref (widget->style);
2703 if (GTK_WIDGET_REALIZED (widget))
2704 widget->style = gtk_style_attach (widget->style, widget->window);
2706 gtk_signal_emit (GTK_OBJECT (widget),
2707 widget_signals[STYLE_SET],
2708 initial_emission ? NULL : previous_style);
2709 gtk_style_unref (previous_style);
2711 if (widget->parent && !initial_emission)
2713 GtkRequisition old_requisition;
2715 old_requisition = widget->requisition;
2716 gtk_widget_size_request (widget, &widget->requisition);
2718 if ((old_requisition.width != widget->requisition.width) ||
2719 (old_requisition.height != widget->requisition.height))
2720 gtk_widget_queue_resize (widget);
2721 else if (GTK_WIDGET_DRAWABLE (widget))
2722 gtk_widget_queue_draw (widget);
2725 else if (initial_emission)
2727 gtk_signal_emit (GTK_OBJECT (widget),
2728 widget_signals[STYLE_SET],
2734 gtk_widget_set_style_recurse (GtkWidget *widget,
2735 gpointer client_data)
2737 if (GTK_WIDGET_RC_STYLE (widget))
2738 gtk_widget_set_rc_style (widget);
2740 if (GTK_IS_CONTAINER (widget))
2741 gtk_container_foreach (GTK_CONTAINER (widget),
2742 gtk_widget_set_style_recurse,
2747 gtk_widget_reset_rc_styles (GtkWidget *widget)
2749 gtk_widget_set_style_recurse (widget, NULL);
2753 gtk_widget_set_default_style (GtkStyle *style)
2755 if (style != default_style)
2758 gtk_style_unref (default_style);
2759 default_style = style;
2761 gtk_style_ref (default_style);
2766 gtk_widget_get_default_style (void)
2770 default_style = gtk_style_new ();
2771 gtk_style_ref (default_style);
2774 return default_style;
2778 gtk_widget_push_style (GtkStyle *style)
2780 g_return_if_fail (style != NULL);
2782 gtk_style_ref (style);
2783 style_stack = g_slist_prepend (style_stack, style);
2787 gtk_widget_peek_style (void)
2790 return (GtkStyle*) style_stack->data;
2792 return gtk_widget_get_default_style ();
2796 gtk_widget_pop_style (void)
2803 style_stack = style_stack->next;
2804 gtk_style_unref ((GtkStyle*) tmp->data);
2805 g_slist_free_1 (tmp);
2809 /*************************************************************
2810 * gtk_widget_set_parent_window:
2811 * Set a non default parent window for widget
2818 *************************************************************/
2821 gtk_widget_set_parent_window (GtkWidget *widget,
2822 GdkWindow *parent_window)
2824 GdkWindow *old_parent_window;
2826 g_return_if_fail (widget != NULL);
2828 old_parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2829 parent_window_key_id);
2831 if (parent_window != old_parent_window)
2833 if (!parent_window_key_id)
2834 parent_window_key_id = gtk_object_data_force_id (parent_window_key);
2835 gtk_object_set_data_by_id (GTK_OBJECT (widget), parent_window_key_id,
2837 if (old_parent_window)
2838 gdk_window_unref (old_parent_window);
2840 gdk_window_ref (parent_window);
2844 /*************************************************************
2845 * gtk_widget_get_parent_window:
2846 * Get widget's parent window
2853 *************************************************************/
2856 gtk_widget_get_parent_window (GtkWidget *widget)
2858 GdkWindow *parent_window;
2860 g_return_val_if_fail (widget != NULL, NULL);
2861 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
2862 g_return_val_if_fail (widget->parent != NULL, NULL);
2864 parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2865 parent_window_key_id);
2867 return (parent_window != NULL) ? parent_window : widget->parent->window;
2870 /*****************************************
2871 * gtk_widget_set_uposition:
2876 *****************************************/
2879 gtk_widget_set_uposition (GtkWidget *widget,
2883 GtkWidgetAuxInfo *aux_info;
2885 g_return_if_fail (widget != NULL);
2887 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2890 if (!aux_info_key_id)
2891 aux_info_key_id = gtk_object_data_force_id (aux_info_key);
2892 aux_info = gtk_widget_aux_info_new ();
2893 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2901 if (GTK_WIDGET_REALIZED (widget) && GTK_IS_WINDOW (widget) &&
2902 (aux_info->x != -1) && (aux_info->y != -1))
2904 gdk_window_set_hints (widget->window, aux_info->x, aux_info->y, 0, 0, 0, 0, GDK_HINT_POS);
2905 gdk_window_move (widget->window, aux_info->x, aux_info->y);
2908 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
2909 gtk_widget_size_allocate (widget, &widget->allocation);
2912 /*****************************************
2913 * gtk_widget_set_usize:
2918 *****************************************/
2921 gtk_widget_set_usize (GtkWidget *widget,
2925 GtkWidgetAuxInfo *aux_info;
2927 g_return_if_fail (widget != NULL);
2929 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2932 if (!aux_info_key_id)
2933 aux_info_key_id = gtk_object_data_force_id (aux_info_key);
2934 aux_info = gtk_widget_aux_info_new ();
2935 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2939 aux_info->width = width;
2941 aux_info->height = height;
2943 if (GTK_WIDGET_VISIBLE (widget))
2944 gtk_widget_queue_resize (widget);
2947 /*****************************************
2948 * gtk_widget_set_events:
2953 *****************************************/
2956 gtk_widget_set_events (GtkWidget *widget,
2961 g_return_if_fail (widget != NULL);
2962 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
2963 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
2965 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
2970 eventp = g_new (gint, 1);
2974 event_key_id = gtk_object_data_force_id (event_key);
2975 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
2980 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
2984 /*****************************************
2985 * gtk_widget_set_extension_events:
2990 *****************************************/
2993 gtk_widget_set_extension_events (GtkWidget *widget,
2994 GdkExtensionMode mode)
2996 GdkExtensionMode *modep;
2998 g_return_if_fail (widget != NULL);
3000 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3003 modep = g_new (GdkExtensionMode, 1);
3006 if (!extension_event_key_id)
3007 extension_event_key_id = gtk_object_data_force_id (extension_event_key);
3008 gtk_object_set_data_by_id (GTK_OBJECT (widget), extension_event_key_id, modep);
3012 /*****************************************
3013 * gtk_widget_get_toplevel:
3018 *****************************************/
3021 gtk_widget_get_toplevel (GtkWidget *widget)
3023 g_return_val_if_fail (widget != NULL, NULL);
3025 while (widget->parent)
3026 widget = widget->parent;
3031 /*****************************************
3032 * gtk_widget_get_ancestor:
3037 *****************************************/
3040 gtk_widget_get_ancestor (GtkWidget *widget,
3041 GtkType widget_type)
3043 g_return_val_if_fail (widget != NULL, NULL);
3045 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type))
3046 widget = widget->parent;
3048 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type)))
3054 /*****************************************
3055 * gtk_widget_get_colormap:
3060 *****************************************/
3063 gtk_widget_get_colormap (GtkWidget *widget)
3065 GdkColormap *colormap;
3067 g_return_val_if_fail (widget != NULL, NULL);
3069 if (!widget->window)
3071 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
3074 return gtk_widget_get_default_colormap ();
3077 return gdk_window_get_colormap (widget->window);
3080 /*****************************************
3081 * gtk_widget_get_visual:
3086 *****************************************/
3089 gtk_widget_get_visual (GtkWidget *widget)
3093 g_return_val_if_fail (widget != NULL, NULL);
3095 if (!widget->window)
3097 visual = gtk_object_get_data (GTK_OBJECT (widget), visual_key);
3100 return gtk_widget_get_default_visual ();
3103 return gdk_window_get_visual (widget->window);
3106 /*****************************************
3107 * gtk_widget_get_events:
3112 *****************************************/
3115 gtk_widget_get_events (GtkWidget *widget)
3119 g_return_val_if_fail (widget != NULL, 0);
3121 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3128 /*****************************************
3129 * gtk_widget_get_extension_events:
3134 *****************************************/
3137 gtk_widget_get_extension_events (GtkWidget *widget)
3139 GdkExtensionMode *mode;
3141 g_return_val_if_fail (widget != NULL, 0);
3143 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3150 /*****************************************
3151 * gtk_widget_get_pointer:
3156 *****************************************/
3159 gtk_widget_get_pointer (GtkWidget *widget,
3163 g_return_if_fail (widget != NULL);
3170 if (GTK_WIDGET_REALIZED (widget))
3172 gdk_window_get_pointer (widget->window, x, y, NULL);
3174 if (GTK_WIDGET_NO_WINDOW (widget))
3177 *x -= widget->allocation.x;
3179 *y -= widget->allocation.y;
3184 /*****************************************
3185 * gtk_widget_is_ancestor:
3190 *****************************************/
3193 gtk_widget_is_ancestor (GtkWidget *widget,
3194 GtkWidget *ancestor)
3196 g_return_val_if_fail (widget != NULL, FALSE);
3197 g_return_val_if_fail (ancestor != NULL, FALSE);
3201 if (widget->parent == ancestor)
3203 widget = widget->parent;
3209 /*****************************************
3210 * gtk_widget_is_child:
3215 *****************************************/
3218 gtk_widget_is_child (GtkWidget *widget,
3221 g_return_val_if_fail (widget != NULL, FALSE);
3222 g_return_val_if_fail (child != NULL, FALSE);
3224 return (child->parent == widget);
3227 /*****************************************
3228 * gtk_widget_push_colormap:
3233 *****************************************/
3236 gtk_widget_push_colormap (GdkColormap *cmap)
3238 g_return_if_fail (cmap != NULL);
3240 colormap_stack = g_slist_prepend (colormap_stack, cmap);
3243 /*****************************************
3244 * gtk_widget_push_visual:
3249 *****************************************/
3252 gtk_widget_push_visual (GdkVisual *visual)
3254 g_return_if_fail (visual != NULL);
3256 visual_stack = g_slist_prepend (visual_stack, visual);
3259 /*****************************************
3260 * gtk_widget_pop_colormap:
3265 *****************************************/
3268 gtk_widget_pop_colormap (void)
3274 tmp = colormap_stack;
3275 colormap_stack = colormap_stack->next;
3276 g_slist_free_1 (tmp);
3280 /*****************************************
3281 * gtk_widget_pop_visual:
3286 *****************************************/
3289 gtk_widget_pop_visual (void)
3296 visual_stack = visual_stack->next;
3297 g_slist_free_1 (tmp);
3301 /*****************************************
3302 * gtk_widget_set_default_colormap:
3307 *****************************************/
3310 gtk_widget_set_default_colormap (GdkColormap *colormap)
3312 if (default_colormap != colormap)
3314 if (default_colormap)
3315 gdk_colormap_unref (default_colormap);
3316 default_colormap = colormap;
3317 if (default_colormap)
3318 gdk_colormap_ref (default_colormap);
3322 /*****************************************
3323 * gtk_widget_set_default_visual:
3328 *****************************************/
3331 gtk_widget_set_default_visual (GdkVisual *visual)
3333 default_visual = visual;
3336 /*****************************************
3337 * gtk_widget_get_default_colormap:
3342 *****************************************/
3345 gtk_widget_get_default_colormap (void)
3347 if (!default_colormap)
3348 default_colormap = gdk_colormap_get_system ();
3350 return default_colormap;
3353 /*****************************************
3354 * gtk_widget_get_default_visual:
3359 *****************************************/
3362 gtk_widget_get_default_visual (void)
3364 if (!default_visual)
3365 default_visual = gdk_visual_get_system ();
3367 return default_visual;
3370 /*****************************************
3371 * gtk_widget_marshal_signal_1:
3376 *****************************************/
3379 gtk_widget_marshal_signal_1 (GtkObject *object,
3384 GtkWidgetSignal1 rfunc;
3386 rfunc = (GtkWidgetSignal1) func;
3389 GTK_VALUE_POINTER (args[0]),
3393 /*****************************************
3394 * gtk_widget_marshal_signal_4:
3399 *****************************************/
3402 gtk_widget_marshal_signal_4 (GtkObject *object,
3407 GtkWidgetSignal4 rfunc;
3410 rfunc = (GtkWidgetSignal4) func;
3411 return_val = GTK_RETLOC_BOOL (args[1]);
3413 *return_val = (* rfunc) (object,
3414 GTK_VALUE_BOXED (args[0]),
3418 /*****************************************
3419 * gtk_widget_marshal_signal_5:
3424 *****************************************/
3427 gtk_widget_marshal_signal_5 (GtkObject *object,
3432 GtkWidgetSignal5 rfunc;
3434 rfunc = (GtkWidgetSignal5) func;
3437 GTK_VALUE_UINT (args[0]),
3441 /*****************************************
3442 * gtk_widget_marshal_signal_6:
3447 *****************************************/
3450 gtk_widget_marshal_signal_6 (GtkObject *object,
3455 GtkWidgetSignal6 rfunc;
3457 rfunc = (GtkWidgetSignal6) func;
3460 GTK_VALUE_OBJECT (args[0]),
3464 /*****************************************
3465 * gtk_widget_marshal_signal_7:
3470 *****************************************/
3473 gtk_widget_marshal_signal_7 (GtkObject *object,
3478 GtkWidgetSignal7 rfunc;
3480 rfunc = (GtkWidgetSignal7) func;
3483 GTK_VALUE_BOXED (args[0]),
3488 gtk_widget_shutdown (GtkObject *object)
3492 /* gtk_object_destroy() will already hold a refcount on object
3494 widget = GTK_WIDGET (object);
3497 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
3499 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3500 if (GTK_WIDGET_REALIZED (widget))
3501 gtk_widget_unrealize (widget);
3503 parent_class->shutdown (object);
3507 gtk_widget_real_destroy (GtkObject *object)
3510 GtkStyle *saved_style;
3512 /* gtk_object_destroy() will already hold a refcount on object
3514 widget = GTK_WIDGET (object);
3516 if (GTK_CONTAINER_RESIZE_PENDING (widget))
3518 gtk_widget_resize_queue = g_slist_remove (gtk_widget_resize_queue, widget);
3519 GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_PENDING);
3522 gtk_grab_remove (widget);
3523 gtk_selection_remove_all (widget);
3525 saved_style = gtk_object_get_data_by_id (object, saved_default_style_key_id);
3528 gtk_style_unref (saved_style);
3529 gtk_object_remove_data_by_id (object, saved_default_style_key_id);
3532 gtk_style_unref (widget->style);
3533 widget->style = NULL;
3535 parent_class->destroy (object);
3539 gtk_widget_finalize (GtkObject *object)
3542 GtkWidgetAuxInfo *aux_info;
3544 GdkExtensionMode *mode;
3546 widget = GTK_WIDGET (object);
3549 g_free (widget->name);
3551 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3553 gtk_widget_aux_info_destroy (aux_info);
3555 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3559 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3563 parent_class->finalize (object);
3566 /*****************************************
3567 * gtk_widget_real_show:
3572 *****************************************/
3575 gtk_widget_real_show (GtkWidget *widget)
3577 g_return_if_fail (widget != NULL);
3578 g_return_if_fail (GTK_IS_WIDGET (widget));
3580 if (!GTK_WIDGET_VISIBLE (widget))
3582 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
3586 gtk_widget_queue_resize (widget->parent);
3588 if (GTK_WIDGET_MAPPED (widget->parent))
3589 gtk_widget_map (widget);
3594 /*****************************************
3595 * gtk_widget_real_hide:
3600 *****************************************/
3603 gtk_widget_real_hide (GtkWidget *widget)
3605 g_return_if_fail (widget != NULL);
3606 g_return_if_fail (GTK_IS_WIDGET (widget));
3608 if (GTK_WIDGET_VISIBLE (widget))
3610 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3612 if (GTK_WIDGET_MAPPED (widget))
3613 gtk_widget_unmap (widget);
3616 gtk_widget_queue_resize (widget);
3620 /*****************************************
3621 * gtk_widget_real_map:
3626 *****************************************/
3629 gtk_widget_real_map (GtkWidget *widget)
3631 g_return_if_fail (widget != NULL);
3632 g_return_if_fail (GTK_IS_WIDGET (widget));
3634 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget))
3636 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
3638 if (!GTK_WIDGET_NO_WINDOW (widget))
3639 gdk_window_show (widget->window);
3641 gtk_widget_queue_draw (widget);
3645 /*****************************************
3646 * gtk_widget_real_unmap:
3651 *****************************************/
3654 gtk_widget_real_unmap (GtkWidget *widget)
3656 g_return_if_fail (widget != NULL);
3657 g_return_if_fail (GTK_IS_WIDGET (widget));
3659 if (GTK_WIDGET_MAPPED (widget))
3661 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
3663 if (GTK_WIDGET_NO_WINDOW (widget))
3664 gdk_window_clear_area (widget->window,
3665 widget->allocation.x,
3666 widget->allocation.y,
3667 widget->allocation.width,
3668 widget->allocation.height);
3670 gdk_window_hide (widget->window);
3674 /*****************************************
3675 * gtk_widget_real_realize:
3680 *****************************************/
3683 gtk_widget_real_realize (GtkWidget *widget)
3685 g_return_if_fail (widget != NULL);
3686 g_return_if_fail (GTK_IS_WIDGET (widget));
3687 g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
3689 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
3692 widget->window = gtk_widget_get_parent_window (widget);
3693 gdk_window_ref (widget->window);
3695 widget->style = gtk_style_attach (widget->style, widget->window);
3698 /*****************************************
3699 * gtk_widget_real_unrealize:
3704 *****************************************/
3707 gtk_widget_real_unrealize (GtkWidget *widget)
3709 g_return_if_fail (widget != NULL);
3710 g_return_if_fail (GTK_IS_WIDGET (widget));
3712 if (GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_MAPPED (widget))
3713 gtk_widget_real_unmap (widget);
3715 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
3717 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT(widget)->klass->type));
3720 gtk_style_detach (widget->style);
3721 if (!GTK_WIDGET_NO_WINDOW (widget))
3723 gdk_window_set_user_data (widget->window, NULL);
3724 gdk_window_destroy (widget->window);
3728 gdk_window_unref (widget->window);
3731 /* Unrealize afterwards to improve visual effect */
3733 if (GTK_IS_CONTAINER (widget))
3734 gtk_container_foreach (GTK_CONTAINER (widget),
3735 (GtkCallback)gtk_widget_unrealize,
3738 widget->window = NULL;
3741 /*****************************************
3742 * gtk_widget_real_draw:
3747 *****************************************/
3750 gtk_widget_real_draw (GtkWidget *widget,
3753 GdkEventExpose event;
3755 g_return_if_fail (widget != NULL);
3756 g_return_if_fail (GTK_IS_WIDGET (widget));
3757 g_return_if_fail (area != NULL);
3759 if (GTK_WIDGET_DRAWABLE (widget))
3761 event.type = GDK_EXPOSE;
3762 event.send_event = TRUE;
3763 event.window = widget->window;
3767 gdk_window_ref (event.window);
3768 gtk_widget_event (widget, (GdkEvent*) &event);
3769 gdk_window_unref (event.window);
3773 /*****************************************
3774 * gtk_widget_real_size_allocate:
3779 *****************************************/
3782 gtk_widget_real_size_allocate (GtkWidget *widget,
3783 GtkAllocation *allocation)
3785 g_return_if_fail (widget != NULL);
3786 g_return_if_fail (GTK_IS_WIDGET (widget));
3788 if (GTK_WIDGET_NO_WINDOW (widget) &&
3789 GTK_WIDGET_MAPPED (widget) &&
3790 ((widget->allocation.x != allocation->x) ||
3791 (widget->allocation.y != allocation->y) ||
3792 (widget->allocation.width != allocation->width) ||
3793 (widget->allocation.height != allocation->height)) &&
3794 (widget->allocation.width != 0) &&
3795 (widget->allocation.height != 0))
3796 gdk_window_clear_area (widget->window,
3797 widget->allocation.x,
3798 widget->allocation.y,
3799 widget->allocation.width,
3800 widget->allocation.height);
3802 widget->allocation = *allocation;
3804 if (GTK_WIDGET_REALIZED (widget) &&
3805 !GTK_WIDGET_NO_WINDOW (widget))
3806 gdk_window_move_resize (widget->window,
3807 allocation->x, allocation->y,
3808 allocation->width, allocation->height);
3811 /*****************************************
3812 * gtk_widget_peek_colormap:
3817 *****************************************/
3820 gtk_widget_peek_colormap (void)
3823 return (GdkColormap*) colormap_stack->data;
3824 return gtk_widget_get_default_colormap ();
3827 /*****************************************
3828 * gtk_widget_peek_visual:
3833 *****************************************/
3836 gtk_widget_peek_visual (void)
3839 return (GdkVisual*) visual_stack->data;
3840 return gtk_widget_get_default_visual ();
3843 /*************************************************************
3844 * gtk_widget_propagate_state:
3845 * Propagate a change in the widgets state down the tree
3849 * GtkStateData: state
3853 *************************************************************/
3856 gtk_widget_propagate_state (GtkWidget *widget,
3861 /* don't call this function with state==GTK_STATE_INSENSITIVE,
3862 * parent_sensitive==TRUE on a sensitive widget
3865 old_state = GTK_WIDGET_STATE (widget);
3867 if (data->parent_sensitive)
3869 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3871 if (GTK_WIDGET_IS_SENSITIVE (widget))
3873 if (data->state_restauration)
3874 GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget);
3876 GTK_WIDGET_STATE (widget) = data->state;
3880 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3881 if (!data->state_restauration &&
3882 data->state != GTK_STATE_INSENSITIVE)
3883 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3888 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3889 if (!data->state_restauration)
3891 if (data->state != GTK_STATE_INSENSITIVE)
3892 GTK_WIDGET_SAVED_STATE (widget) = data->state;
3894 else if (GTK_WIDGET_STATE (widget) != GTK_STATE_INSENSITIVE)
3895 GTK_WIDGET_SAVED_STATE (widget) = GTK_WIDGET_STATE (widget);
3896 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3899 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
3903 window = gtk_widget_get_ancestor (widget, gtk_window_get_type ());
3905 gtk_window_set_focus (GTK_WINDOW (window), NULL);
3908 if (old_state != GTK_WIDGET_STATE (widget))
3910 gtk_widget_ref (widget);
3911 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
3913 if (GTK_IS_CONTAINER (widget))
3915 data->parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget) != FALSE);
3916 data->state = GTK_WIDGET_STATE (widget);
3917 gtk_container_foreach (GTK_CONTAINER (widget),
3918 (GtkCallback) gtk_widget_propagate_state,
3921 gtk_widget_unref (widget);
3925 /*****************************************
3926 * gtk_widget_draw_children_recurse:
3931 *****************************************/
3934 gtk_widget_draw_children_recurse (GtkWidget *widget,
3935 gpointer client_data)
3937 gtk_widget_draw (widget, NULL);
3938 gtk_widget_draw_children (widget);
3941 /*****************************************
3942 * gtk_widget_aux_info_new:
3947 *****************************************/
3949 static GtkWidgetAuxInfo*
3950 gtk_widget_aux_info_new (void)
3952 GtkWidgetAuxInfo *aux_info;
3954 if (!aux_info_mem_chunk)
3955 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
3956 sizeof (GtkWidgetAuxInfo),
3957 1024, G_ALLOC_AND_FREE);
3959 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
3963 aux_info->width = 0;
3964 aux_info->height = 0;
3969 /*****************************************
3970 * gtk_widget_aux_info_destroy:
3975 *****************************************/
3978 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
3980 g_return_if_fail (aux_info != NULL);
3982 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
3985 /*****************************************
3986 * gtk_widget_shape_combine_mask:
3987 * set a shape for this widgets' gdk window, this allows for
3988 * transparent windows etc., see gdk_window_shape_combine_mask
3989 * for more information
3994 *****************************************/
3996 gtk_widget_shape_combine_mask (GtkWidget *widget,
3997 GdkBitmap *shape_mask,
4001 GtkWidgetShapeInfo* shape_info;
4003 g_return_if_fail (widget != NULL);
4004 /* set_shape doesn't work on widgets without gdk window */
4005 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
4009 GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4012 gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
4014 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4015 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
4016 g_free (shape_info);
4020 GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4022 shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
4025 shape_info = g_new (GtkWidgetShapeInfo, 1);
4026 gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
4028 shape_info->shape_mask = shape_mask;
4029 shape_info->offset_x = offset_x;
4030 shape_info->offset_y = offset_y;
4032 /* set shape if widget has a gdk window allready.
4033 * otherwise the shape is scheduled to be set by gtk_widget_realize.
4036 gdk_window_shape_combine_mask (widget->window, shape_mask,
4037 offset_x, offset_y);
4041 /*****************************************
4042 * gtk_widget_dnd_drag_add:
4043 * when you get a DRAG_ENTER event, you can use this
4044 * to tell Gtk ofother widgets that are to be dragged as well
4049 *****************************************/
4051 gtk_widget_dnd_drag_add (GtkWidget *widget)
4055 /*****************************************
4056 * gtk_widget_dnd_drag_set:
4057 * these two functions enable drag and/or drop on a
4058 * widget and also let Gtk know what data types will be accepted
4059 * use MIME type naming,plus tacking "URL:" on the front for link
4066 *****************************************/
4068 gtk_widget_dnd_drag_set (GtkWidget *widget,
4070 gchar **type_accept_list,
4073 g_return_if_fail(widget != NULL);
4075 if (!widget->window)
4076 gtk_widget_realize (widget);
4078 g_return_if_fail (widget->window != NULL);
4079 gdk_window_dnd_drag_set (widget->window,
4085 /*****************************************
4086 * gtk_widget_dnd_drop_set:
4091 *****************************************/
4093 gtk_widget_dnd_drop_set (GtkWidget *widget,
4095 gchar **type_accept_list,
4097 guint8 is_destructive_operation)
4099 g_return_if_fail(widget != NULL);
4101 if (!widget->window)
4102 gtk_widget_realize (widget);
4104 g_return_if_fail (widget->window != NULL);
4105 gdk_window_dnd_drop_set (widget->window,
4109 is_destructive_operation);
4112 /*****************************************
4113 * gtk_widget_dnd_data_set:
4118 *****************************************/
4120 gtk_widget_dnd_data_set (GtkWidget *widget,
4123 gulong data_numbytes)
4125 g_return_if_fail (widget != NULL);
4126 g_return_if_fail (widget->window != NULL);
4128 gdk_window_dnd_data_set (widget->window, event, data, data_numbytes);
4132 gtk_widget_ref (GtkWidget *widget)
4134 g_return_if_fail (widget != NULL);
4135 g_return_if_fail (GTK_IS_WIDGET (widget));
4137 gtk_object_ref ((GtkObject*) widget);
4141 gtk_widget_unref (GtkWidget *widget)
4143 g_return_if_fail (widget != NULL);
4144 g_return_if_fail (GTK_IS_WIDGET (widget));
4146 gtk_object_unref ((GtkObject*) widget);
4150 gtk_widget_path (GtkWidget *widget,
4151 guint *path_length_p,
4153 gchar **path_reversed_p)
4155 static gchar *rev_path = NULL;
4156 static guint path_len = 0;
4159 g_return_if_fail (widget != NULL);
4160 g_return_if_fail (GTK_IS_WIDGET (widget));
4169 string = gtk_widget_get_name (widget);
4170 l = strlen (string);
4171 while (path_len <= len + l + 1)
4173 path_len += INIT_PATH_SIZE;
4174 rev_path = g_realloc (rev_path, path_len);
4182 widget = widget->parent;
4185 rev_path[len++] = '.';
4187 rev_path[len++] = 0;
4192 *path_length_p = len - 1;
4193 if (path_reversed_p)
4194 *path_reversed_p = g_strdup (rev_path);
4197 *path_p = g_strdup (rev_path);
4198 g_strreverse (*path_p);
4203 gtk_widget_class_path (GtkWidget *widget,
4204 guint *path_length_p,
4206 gchar **path_reversed_p)
4208 static gchar *rev_path = NULL;
4209 static guint path_len = 0;
4212 g_return_if_fail (widget != NULL);
4213 g_return_if_fail (GTK_IS_WIDGET (widget));
4222 string = gtk_type_name (GTK_WIDGET_TYPE (widget));
4223 l = strlen (string);
4224 while (path_len <= len + l + 1)
4226 path_len += INIT_PATH_SIZE;
4227 rev_path = g_realloc (rev_path, path_len);
4235 widget = widget->parent;
4238 rev_path[len++] = '.';
4240 rev_path[len++] = 0;
4245 *path_length_p = len - 1;
4246 if (path_reversed_p)
4247 *path_reversed_p = g_strdup (rev_path);
4250 *path_p = g_strdup (rev_path);
4251 g_strreverse (*path_p);