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 Lesser 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 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser 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 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
30 #include "gtkcontainer.h"
31 #include "gtkiconfactory.h"
34 #include "gtkselection.h"
35 #include "gtksignal.h"
36 #include "gtkwidget.h"
37 #include "gtkwindow.h"
38 #include "gtkbindings.h"
39 #include "gtkprivate.h"
41 #include "gdk/gdkprivate.h" /* Used in gtk_reset_shapes_recurse to avoid copy */
44 #define WIDGET_CLASS(w) GTK_WIDGET_GET_CLASS (w)
45 #define INIT_PATH_SIZE (512)
84 PROPERTY_NOTIFY_EVENT,
85 SELECTION_CLEAR_EVENT,
86 SELECTION_REQUEST_EVENT,
87 SELECTION_NOTIFY_EVENT,
102 VISIBILITY_NOTIFY_EVENT,
122 ARG_RECEIVES_DEFAULT,
129 typedef struct _GtkStateData GtkStateData;
134 guint state_restoration : 1;
135 guint parent_sensitive : 1;
136 guint use_forall : 1;
139 static void gtk_widget_class_init (GtkWidgetClass *klass);
140 static void gtk_widget_init (GtkWidget *widget);
141 static void gtk_widget_set_arg (GtkObject *object,
144 static void gtk_widget_get_arg (GtkObject *object,
147 static void gtk_widget_shutdown (GObject *object);
148 static void gtk_widget_real_destroy (GtkObject *object);
149 static void gtk_widget_finalize (GObject *object);
150 static void gtk_widget_real_show (GtkWidget *widget);
151 static void gtk_widget_real_hide (GtkWidget *widget);
152 static void gtk_widget_real_map (GtkWidget *widget);
153 static void gtk_widget_real_unmap (GtkWidget *widget);
154 static void gtk_widget_real_realize (GtkWidget *widget);
155 static void gtk_widget_real_unrealize (GtkWidget *widget);
156 static void gtk_widget_real_draw (GtkWidget *widget,
158 static void gtk_widget_real_size_request (GtkWidget *widget,
159 GtkRequisition *requisition);
160 static void gtk_widget_real_size_allocate (GtkWidget *widget,
161 GtkAllocation *allocation);
162 static gint gtk_widget_real_key_press_event (GtkWidget *widget,
164 static gint gtk_widget_real_key_release_event (GtkWidget *widget,
166 static void gtk_widget_style_set (GtkWidget *widget,
167 GtkStyle *previous_style);
168 static void gtk_widget_direction_changed (GtkWidget *widget,
169 GtkTextDirection previous_direction);
170 static void gtk_widget_real_grab_focus (GtkWidget *focus_widget);
172 static GdkColormap* gtk_widget_peek_colormap (void);
173 static GtkStyle* gtk_widget_peek_style (void);
174 static PangoContext *gtk_widget_peek_pango_context (GtkWidget *widget);
176 static void gtk_widget_reparent_container_child (GtkWidget *widget,
177 gpointer client_data);
178 static void gtk_widget_propagate_state (GtkWidget *widget,
180 static void gtk_widget_set_style_internal (GtkWidget *widget,
182 gboolean initial_emission);
183 static void gtk_widget_set_style_recurse (GtkWidget *widget,
184 gpointer client_data);
186 static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
187 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
189 static gpointer parent_class = NULL;
190 static guint widget_signals[LAST_SIGNAL] = { 0 };
192 static GMemChunk *aux_info_mem_chunk = NULL;
194 static GdkColormap *default_colormap = NULL;
195 static GtkStyle *gtk_default_style = NULL;
197 static GSList *colormap_stack = NULL;
198 static GSList *style_stack = NULL;
199 static guint composite_child_stack = 0;
201 static const gchar *aux_info_key = "gtk-aux-info";
202 static guint aux_info_key_id = 0;
203 static const gchar *event_key = "gtk-event-mask";
204 static guint event_key_id = 0;
205 static const gchar *extension_event_key = "gtk-extension-event-mode";
206 static guint extension_event_key_id = 0;
207 static const gchar *parent_window_key = "gtk-parent-window";
208 static guint parent_window_key_id = 0;
209 static const gchar *saved_default_style_key = "gtk-saved-default-style";
210 static guint saved_default_style_key_id = 0;
211 static const gchar *shape_info_key = "gtk-shape-info";
212 static const gchar *colormap_key = "gtk-colormap";
213 static const gchar *pango_context_key = "gtk-pango-context";
214 static guint pango_context_key_id = 0;
216 static const gchar *rc_style_key = "gtk-rc-style";
217 static guint rc_style_key_id = 0;
219 static GtkTextDirection gtk_default_direction = GTK_TEXT_DIR_LTR;
221 /*****************************************
222 * gtk_widget_get_type:
227 *****************************************/
230 gtk_widget_get_type (void)
232 static GtkType widget_type = 0;
236 static const GtkTypeInfo widget_info =
240 sizeof (GtkWidgetClass),
241 (GtkClassInitFunc) gtk_widget_class_init,
242 (GtkObjectInitFunc) gtk_widget_init,
243 /* reserved_1 */ NULL,
244 /* reserved_2 */ NULL,
245 (GtkClassInitFunc) NULL,
248 widget_type = gtk_type_unique (GTK_TYPE_OBJECT, &widget_info);
254 /*****************************************
255 * gtk_widget_class_init:
260 *****************************************/
263 gtk_widget_debug_msg (GtkWidget *widget,
266 fprintf (stderr, "Gtk-DEBUG: %s\n", string);
270 gtk_widget_class_init (GtkWidgetClass *klass)
272 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
273 GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
275 parent_class = gtk_type_class (GTK_TYPE_OBJECT);
277 gobject_class->shutdown = gtk_widget_shutdown;
278 gobject_class->finalize = gtk_widget_finalize;
280 object_class->set_arg = gtk_widget_set_arg;
281 object_class->get_arg = gtk_widget_get_arg;
282 object_class->destroy = gtk_widget_real_destroy;
284 klass->activate_signal = 0;
285 klass->set_scroll_adjustments_signal = 0;
286 klass->show = gtk_widget_real_show;
287 klass->show_all = gtk_widget_show;
288 klass->hide = gtk_widget_real_hide;
289 klass->hide_all = gtk_widget_hide;
290 klass->map = gtk_widget_real_map;
291 klass->unmap = gtk_widget_real_unmap;
292 klass->realize = gtk_widget_real_realize;
293 klass->unrealize = gtk_widget_real_unrealize;
294 klass->draw = gtk_widget_real_draw;
295 klass->draw_focus = NULL;
296 klass->size_request = gtk_widget_real_size_request;
297 klass->size_allocate = gtk_widget_real_size_allocate;
298 klass->state_changed = NULL;
299 klass->parent_set = NULL;
300 klass->style_set = gtk_widget_style_set;
301 klass->direction_changed = gtk_widget_direction_changed;
302 klass->add_accelerator = (void*) gtk_accel_group_handle_add;
303 klass->remove_accelerator = (void*) gtk_accel_group_handle_remove;
304 klass->grab_focus = gtk_widget_real_grab_focus;
306 klass->button_press_event = NULL;
307 klass->button_release_event = NULL;
308 klass->motion_notify_event = NULL;
309 klass->delete_event = NULL;
310 klass->destroy_event = NULL;
311 klass->expose_event = NULL;
312 klass->key_press_event = gtk_widget_real_key_press_event;
313 klass->key_release_event = gtk_widget_real_key_release_event;
314 klass->enter_notify_event = NULL;
315 klass->leave_notify_event = NULL;
316 klass->configure_event = NULL;
317 klass->focus_in_event = NULL;
318 klass->focus_out_event = NULL;
319 klass->map_event = NULL;
320 klass->unmap_event = NULL;
321 klass->property_notify_event = gtk_selection_property_notify;
322 klass->selection_clear_event = gtk_selection_clear;
323 klass->selection_request_event = gtk_selection_request;
324 klass->selection_notify_event = gtk_selection_notify;
325 klass->selection_received = NULL;
326 klass->proximity_in_event = NULL;
327 klass->proximity_out_event = NULL;
328 klass->drag_begin = NULL;
329 klass->drag_end = NULL;
330 klass->drag_data_delete = NULL;
331 klass->drag_leave = NULL;
332 klass->drag_motion = NULL;
333 klass->drag_drop = NULL;
334 klass->drag_data_received = NULL;
336 klass->no_expose_event = NULL;
338 klass->debug_msg = gtk_widget_debug_msg;
340 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
341 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
342 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
343 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
344 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
345 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
346 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
347 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
348 gtk_object_add_arg_type ("GtkWidget::app_paintable", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_APP_PAINTABLE);
349 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
350 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
351 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
352 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
353 gtk_object_add_arg_type ("GtkWidget::receives_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_RECEIVES_DEFAULT);
354 gtk_object_add_arg_type ("GtkWidget::composite_child", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_COMPOSITE_CHILD);
355 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
356 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
357 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
359 widget_signals[SHOW] =
360 gtk_signal_new ("show",
362 GTK_CLASS_TYPE (object_class),
363 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
364 gtk_marshal_VOID__VOID,
366 widget_signals[HIDE] =
367 gtk_signal_new ("hide",
369 GTK_CLASS_TYPE (object_class),
370 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
371 gtk_marshal_VOID__VOID,
373 widget_signals[MAP] =
374 gtk_signal_new ("map",
376 GTK_CLASS_TYPE (object_class),
377 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
378 gtk_marshal_VOID__VOID,
380 widget_signals[UNMAP] =
381 gtk_signal_new ("unmap",
383 GTK_CLASS_TYPE (object_class),
384 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
385 gtk_marshal_VOID__VOID,
387 widget_signals[REALIZE] =
388 gtk_signal_new ("realize",
390 GTK_CLASS_TYPE (object_class),
391 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
392 gtk_marshal_VOID__VOID,
394 widget_signals[UNREALIZE] =
395 gtk_signal_new ("unrealize",
397 GTK_CLASS_TYPE (object_class),
398 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
399 gtk_marshal_VOID__VOID,
401 widget_signals[DRAW] =
402 gtk_signal_new ("draw",
404 GTK_CLASS_TYPE (object_class),
405 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
406 gtk_marshal_VOID__POINTER,
409 widget_signals[DRAW_FOCUS] =
410 gtk_signal_new ("draw_focus",
412 GTK_CLASS_TYPE (object_class),
413 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
414 gtk_marshal_VOID__VOID,
416 widget_signals[DRAW_DEFAULT] =
417 gtk_signal_new ("draw_default",
419 GTK_CLASS_TYPE (object_class),
420 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
421 gtk_marshal_VOID__VOID,
423 widget_signals[SIZE_REQUEST] =
424 gtk_signal_new ("size_request",
426 GTK_CLASS_TYPE (object_class),
427 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
428 gtk_marshal_VOID__POINTER,
431 widget_signals[SIZE_ALLOCATE] =
432 gtk_signal_new ("size_allocate",
434 GTK_CLASS_TYPE (object_class),
435 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
436 gtk_marshal_VOID__POINTER,
439 widget_signals[STATE_CHANGED] =
440 gtk_signal_new ("state_changed",
442 GTK_CLASS_TYPE (object_class),
443 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
444 gtk_marshal_VOID__ENUM,
446 GTK_TYPE_STATE_TYPE);
447 widget_signals[PARENT_SET] =
448 gtk_signal_new ("parent_set",
450 GTK_CLASS_TYPE (object_class),
451 GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
452 gtk_marshal_VOID__POINTER,
455 widget_signals[STYLE_SET] =
456 gtk_signal_new ("style_set",
458 GTK_CLASS_TYPE (object_class),
459 GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
460 gtk_marshal_VOID__POINTER,
463 widget_signals[DIRECTION_CHANGED] =
464 gtk_signal_new ("direction_changed",
466 GTK_CLASS_TYPE (object_class),
467 GTK_SIGNAL_OFFSET (GtkWidgetClass, direction_changed),
468 gtk_marshal_VOID__ENUM,
470 GTK_TYPE_TEXT_DIRECTION);
471 widget_signals[ADD_ACCELERATOR] =
472 gtk_accel_group_create_add (GTK_CLASS_TYPE (object_class), GTK_RUN_LAST,
473 GTK_SIGNAL_OFFSET (GtkWidgetClass, add_accelerator));
474 widget_signals[REMOVE_ACCELERATOR] =
475 gtk_accel_group_create_remove (GTK_CLASS_TYPE (object_class), GTK_RUN_LAST,
476 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));
477 widget_signals[GRAB_FOCUS] =
478 gtk_signal_new ("grab_focus",
479 GTK_RUN_LAST | GTK_RUN_ACTION,
480 GTK_CLASS_TYPE (object_class),
481 GTK_SIGNAL_OFFSET (GtkWidgetClass, grab_focus),
482 gtk_marshal_VOID__VOID,
484 widget_signals[EVENT] =
485 gtk_signal_new ("event",
487 GTK_CLASS_TYPE (object_class),
488 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
489 gtk_marshal_BOOLEAN__POINTER,
492 widget_signals[BUTTON_PRESS_EVENT] =
493 gtk_signal_new ("button_press_event",
495 GTK_CLASS_TYPE (object_class),
496 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
497 gtk_marshal_BOOLEAN__POINTER,
500 widget_signals[BUTTON_RELEASE_EVENT] =
501 gtk_signal_new ("button_release_event",
503 GTK_CLASS_TYPE (object_class),
504 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
505 gtk_marshal_BOOLEAN__POINTER,
508 widget_signals[SCROLL_EVENT] =
509 gtk_signal_new ("scroll_event",
511 GTK_CLASS_TYPE (object_class),
512 GTK_SIGNAL_OFFSET (GtkWidgetClass, scroll_event),
513 gtk_marshal_BOOLEAN__POINTER,
516 widget_signals[MOTION_NOTIFY_EVENT] =
517 gtk_signal_new ("motion_notify_event",
519 GTK_CLASS_TYPE (object_class),
520 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
521 gtk_marshal_BOOLEAN__POINTER,
524 widget_signals[DELETE_EVENT] =
525 gtk_signal_new ("delete_event",
527 GTK_CLASS_TYPE (object_class),
528 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
529 gtk_marshal_BOOLEAN__POINTER,
532 widget_signals[DESTROY_EVENT] =
533 gtk_signal_new ("destroy_event",
535 GTK_CLASS_TYPE (object_class),
536 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
537 gtk_marshal_BOOLEAN__POINTER,
540 widget_signals[EXPOSE_EVENT] =
541 gtk_signal_new ("expose_event",
543 GTK_CLASS_TYPE (object_class),
544 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
545 gtk_marshal_BOOLEAN__POINTER,
548 widget_signals[KEY_PRESS_EVENT] =
549 gtk_signal_new ("key_press_event",
551 GTK_CLASS_TYPE (object_class),
552 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
553 gtk_marshal_BOOLEAN__POINTER,
556 widget_signals[KEY_RELEASE_EVENT] =
557 gtk_signal_new ("key_release_event",
559 GTK_CLASS_TYPE (object_class),
560 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
561 gtk_marshal_BOOLEAN__POINTER,
564 widget_signals[ENTER_NOTIFY_EVENT] =
565 gtk_signal_new ("enter_notify_event",
567 GTK_CLASS_TYPE (object_class),
568 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
569 gtk_marshal_BOOLEAN__POINTER,
572 widget_signals[LEAVE_NOTIFY_EVENT] =
573 gtk_signal_new ("leave_notify_event",
575 GTK_CLASS_TYPE (object_class),
576 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
577 gtk_marshal_BOOLEAN__POINTER,
580 widget_signals[CONFIGURE_EVENT] =
581 gtk_signal_new ("configure_event",
583 GTK_CLASS_TYPE (object_class),
584 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
585 gtk_marshal_BOOLEAN__POINTER,
588 widget_signals[FOCUS_IN_EVENT] =
589 gtk_signal_new ("focus_in_event",
591 GTK_CLASS_TYPE (object_class),
592 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
593 gtk_marshal_BOOLEAN__POINTER,
596 widget_signals[FOCUS_OUT_EVENT] =
597 gtk_signal_new ("focus_out_event",
599 GTK_CLASS_TYPE (object_class),
600 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
601 gtk_marshal_BOOLEAN__POINTER,
604 widget_signals[MAP_EVENT] =
605 gtk_signal_new ("map_event",
607 GTK_CLASS_TYPE (object_class),
608 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
609 gtk_marshal_BOOLEAN__POINTER,
612 widget_signals[UNMAP_EVENT] =
613 gtk_signal_new ("unmap_event",
615 GTK_CLASS_TYPE (object_class),
616 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
617 gtk_marshal_BOOLEAN__POINTER,
620 widget_signals[PROPERTY_NOTIFY_EVENT] =
621 gtk_signal_new ("property_notify_event",
623 GTK_CLASS_TYPE (object_class),
624 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
625 gtk_marshal_BOOLEAN__POINTER,
628 widget_signals[SELECTION_CLEAR_EVENT] =
629 gtk_signal_new ("selection_clear_event",
631 GTK_CLASS_TYPE (object_class),
632 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
633 gtk_marshal_BOOLEAN__POINTER,
636 widget_signals[SELECTION_REQUEST_EVENT] =
637 gtk_signal_new ("selection_request_event",
639 GTK_CLASS_TYPE (object_class),
640 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
641 gtk_marshal_BOOLEAN__POINTER,
644 widget_signals[SELECTION_NOTIFY_EVENT] =
645 gtk_signal_new ("selection_notify_event",
647 GTK_CLASS_TYPE (object_class),
648 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
649 gtk_marshal_BOOLEAN__POINTER,
652 widget_signals[SELECTION_RECEIVED] =
653 gtk_signal_new ("selection_received",
655 GTK_CLASS_TYPE (object_class),
656 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
657 gtk_marshal_VOID__POINTER_UINT,
659 GTK_TYPE_SELECTION_DATA,
661 widget_signals[SELECTION_GET] =
662 gtk_signal_new ("selection_get",
664 GTK_CLASS_TYPE (object_class),
665 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_get),
666 gtk_marshal_VOID__POINTER_UINT_UINT,
668 GTK_TYPE_SELECTION_DATA,
671 widget_signals[PROXIMITY_IN_EVENT] =
672 gtk_signal_new ("proximity_in_event",
674 GTK_CLASS_TYPE (object_class),
675 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
676 gtk_marshal_BOOLEAN__POINTER,
679 widget_signals[PROXIMITY_OUT_EVENT] =
680 gtk_signal_new ("proximity_out_event",
682 GTK_CLASS_TYPE (object_class),
683 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
684 gtk_marshal_BOOLEAN__POINTER,
687 widget_signals[DRAG_LEAVE] =
688 gtk_signal_new ("drag_leave",
690 GTK_CLASS_TYPE (object_class),
691 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_leave),
692 gtk_marshal_VOID__POINTER_UINT,
694 GDK_TYPE_DRAG_CONTEXT,
696 widget_signals[DRAG_BEGIN] =
697 gtk_signal_new ("drag_begin",
699 GTK_CLASS_TYPE (object_class),
700 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin),
701 gtk_marshal_VOID__POINTER,
703 GDK_TYPE_DRAG_CONTEXT);
704 widget_signals[DRAG_END] =
705 gtk_signal_new ("drag_end",
707 GTK_CLASS_TYPE (object_class),
708 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end),
709 gtk_marshal_VOID__POINTER,
711 GDK_TYPE_DRAG_CONTEXT);
712 widget_signals[DRAG_DATA_DELETE] =
713 gtk_signal_new ("drag_data_delete",
715 GTK_CLASS_TYPE (object_class),
716 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_delete),
717 gtk_marshal_VOID__POINTER,
719 GDK_TYPE_DRAG_CONTEXT);
720 widget_signals[DRAG_MOTION] =
721 gtk_signal_new ("drag_motion",
723 GTK_CLASS_TYPE (object_class),
724 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_motion),
725 gtk_marshal_BOOLEAN__POINTER_INT_INT_UINT,
727 GDK_TYPE_DRAG_CONTEXT,
731 widget_signals[DRAG_DROP] =
732 gtk_signal_new ("drag_drop",
734 GTK_CLASS_TYPE (object_class),
735 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_drop),
736 gtk_marshal_BOOLEAN__POINTER_INT_INT_UINT,
738 GDK_TYPE_DRAG_CONTEXT,
742 widget_signals[DRAG_DATA_GET] =
743 gtk_signal_new ("drag_data_get",
745 GTK_CLASS_TYPE (object_class),
746 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_get),
747 gtk_marshal_VOID__POINTER_POINTER_UINT_UINT,
749 GDK_TYPE_DRAG_CONTEXT,
750 GTK_TYPE_SELECTION_DATA,
753 widget_signals[DRAG_DATA_RECEIVED] =
754 gtk_signal_new ("drag_data_received",
756 GTK_CLASS_TYPE (object_class),
757 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_received),
758 gtk_marshal_VOID__POINTER_INT_INT_POINTER_UINT_UINT,
760 GDK_TYPE_DRAG_CONTEXT,
763 GTK_TYPE_SELECTION_DATA,
766 widget_signals[VISIBILITY_NOTIFY_EVENT] =
767 gtk_signal_new ("visibility_notify_event",
769 GTK_CLASS_TYPE (object_class),
770 GTK_SIGNAL_OFFSET (GtkWidgetClass, visibility_notify_event),
771 gtk_marshal_BOOLEAN__POINTER,
774 widget_signals[CLIENT_EVENT] =
775 gtk_signal_new ("client_event",
777 GTK_CLASS_TYPE (object_class),
778 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
779 gtk_marshal_BOOLEAN__POINTER,
782 widget_signals[NO_EXPOSE_EVENT] =
783 gtk_signal_new ("no_expose_event",
785 GTK_CLASS_TYPE (object_class),
786 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
787 gtk_marshal_BOOLEAN__POINTER,
790 widget_signals[DEBUG_MSG] =
791 gtk_signal_new ("debug_msg",
792 GTK_RUN_LAST | GTK_RUN_ACTION,
793 GTK_CLASS_TYPE (object_class),
794 GTK_SIGNAL_OFFSET (GtkWidgetClass, debug_msg),
795 gtk_marshal_VOID__POINTER,
799 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
803 gtk_widget_set_arg (GtkObject *object,
809 widget = GTK_WIDGET (object);
816 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
819 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
822 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
825 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
828 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -2);
831 gtk_widget_set_usize (widget, -2, GTK_VALUE_INT (*arg));
834 if (GTK_VALUE_BOOL(*arg))
835 gtk_widget_show (widget);
837 gtk_widget_hide (widget);
840 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
842 case ARG_APP_PAINTABLE:
843 gtk_widget_set_app_paintable (widget, GTK_VALUE_BOOL (*arg));
846 saved_flags = GTK_WIDGET_FLAGS (widget);
847 if (GTK_VALUE_BOOL (*arg))
848 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
850 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
851 if (saved_flags != GTK_WIDGET_FLAGS (widget))
852 gtk_widget_queue_resize (widget);
855 if (GTK_VALUE_BOOL (*arg))
856 gtk_widget_grab_focus (widget);
858 case ARG_CAN_DEFAULT:
859 saved_flags = GTK_WIDGET_FLAGS (widget);
860 if (GTK_VALUE_BOOL (*arg))
861 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
863 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
864 if (saved_flags != GTK_WIDGET_FLAGS (widget))
865 gtk_widget_queue_resize (widget);
867 case ARG_HAS_DEFAULT:
868 if (GTK_VALUE_BOOL (*arg))
869 gtk_widget_grab_default (widget);
871 case ARG_RECEIVES_DEFAULT:
872 if (GTK_VALUE_BOOL (*arg))
873 GTK_WIDGET_SET_FLAGS (widget, GTK_RECEIVES_DEFAULT);
875 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RECEIVES_DEFAULT);
877 case ARG_COMPOSITE_CHILD:
878 if (GTK_VALUE_BOOL(*arg))
879 GTK_WIDGET_SET_FLAGS (widget, GTK_COMPOSITE_CHILD);
881 GTK_WIDGET_UNSET_FLAGS (widget, GTK_COMPOSITE_CHILD);
884 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
887 if (!GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_NO_WINDOW (widget))
888 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
890 case ARG_EXTENSION_EVENTS:
891 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
898 /*****************************************
899 * gtk_widget_get_arg:
904 *****************************************/
907 gtk_widget_get_arg (GtkObject *object,
913 widget = GTK_WIDGET (object);
917 GtkWidgetAuxInfo *aux_info;
919 GdkExtensionMode *modep;
923 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
925 GTK_VALUE_STRING (*arg) = g_strdup ("");
928 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
931 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
933 GTK_VALUE_INT (*arg) = -1;
935 GTK_VALUE_INT (*arg) = aux_info->x;
938 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
940 GTK_VALUE_INT (*arg) = -1;
942 GTK_VALUE_INT (*arg) = aux_info->y;
945 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
947 GTK_VALUE_INT (*arg) = -1;
949 GTK_VALUE_INT (*arg) = aux_info->width;
952 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
954 GTK_VALUE_INT (*arg) = -1;
956 GTK_VALUE_INT (*arg) = aux_info->height;
959 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_VISIBLE (widget) != FALSE);
962 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_SENSITIVE (widget) != FALSE);
964 case ARG_APP_PAINTABLE:
965 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_APP_PAINTABLE (widget) != FALSE);
968 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_FOCUS (widget) != FALSE);
971 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_FOCUS (widget) != FALSE);
973 case ARG_CAN_DEFAULT:
974 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_DEFAULT (widget) != FALSE);
976 case ARG_HAS_DEFAULT:
977 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
979 case ARG_RECEIVES_DEFAULT:
980 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_RECEIVES_DEFAULT (widget) != FALSE);
982 case ARG_COMPOSITE_CHILD:
983 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_COMPOSITE_CHILD (widget) != FALSE);
986 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
989 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
991 GTK_VALUE_FLAGS (*arg) = 0;
993 GTK_VALUE_FLAGS (*arg) = *eventp;
995 case ARG_EXTENSION_EVENTS:
996 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
998 GTK_VALUE_FLAGS (*arg) = 0;
1000 GTK_VALUE_FLAGS (*arg) = *modep;
1003 arg->type = GTK_TYPE_INVALID;
1008 /*****************************************
1014 *****************************************/
1017 gtk_widget_init (GtkWidget *widget)
1019 GdkColormap *colormap;
1021 GTK_PRIVATE_FLAGS (widget) = 0;
1022 widget->state = GTK_STATE_NORMAL;
1023 widget->saved_state = GTK_STATE_NORMAL;
1024 widget->name = NULL;
1025 widget->requisition.width = 0;
1026 widget->requisition.height = 0;
1027 widget->allocation.x = -1;
1028 widget->allocation.y = -1;
1029 widget->allocation.width = 1;
1030 widget->allocation.height = 1;
1031 widget->window = NULL;
1032 widget->parent = NULL;
1034 GTK_WIDGET_SET_FLAGS (widget,
1036 GTK_PARENT_SENSITIVE |
1037 (composite_child_stack ? GTK_COMPOSITE_CHILD : 0) |
1038 GTK_DOUBLE_BUFFERED);
1040 widget->style = gtk_widget_peek_style ();
1041 gtk_style_ref (widget->style);
1043 colormap = gtk_widget_peek_colormap ();
1045 if (colormap != gtk_widget_get_default_colormap ())
1046 gtk_widget_set_colormap (widget, colormap);
1049 /*****************************************
1055 *****************************************/
1058 gtk_widget_new (GtkType widget_type,
1059 const gchar *first_arg_name,
1064 GSList *arg_list = NULL;
1065 GSList *info_list = NULL;
1068 g_return_val_if_fail (gtk_type_is_a (widget_type, GTK_TYPE_WIDGET), NULL);
1070 object = gtk_type_new (widget_type);
1072 va_start (var_args, first_arg_name);
1073 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1082 g_warning ("gtk_widget_new(): %s", error);
1090 slist_arg = arg_list;
1091 slist_info = info_list;
1094 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1095 slist_arg = slist_arg->next;
1096 slist_info = slist_info->next;
1098 gtk_args_collect_cleanup (arg_list, info_list);
1101 if (!GTK_OBJECT_CONSTRUCTED (object))
1102 gtk_object_default_construct (object);
1104 return GTK_WIDGET (object);
1107 /*****************************************
1113 *****************************************/
1116 gtk_widget_newv (GtkType type,
1120 g_return_val_if_fail (gtk_type_is_a (type, GTK_TYPE_WIDGET), NULL);
1122 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1125 /*****************************************
1131 *****************************************/
1134 gtk_widget_get (GtkWidget *widget,
1137 g_return_if_fail (widget != NULL);
1138 g_return_if_fail (GTK_IS_WIDGET (widget));
1139 g_return_if_fail (arg != NULL);
1141 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1144 /*****************************************
1150 *****************************************/
1153 gtk_widget_getv (GtkWidget *widget,
1157 g_return_if_fail (widget != NULL);
1158 g_return_if_fail (GTK_IS_WIDGET (widget));
1160 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1163 /*****************************************
1169 *****************************************/
1172 gtk_widget_set (GtkWidget *widget,
1173 const gchar *first_arg_name,
1178 GSList *arg_list = NULL;
1179 GSList *info_list = NULL;
1182 g_return_if_fail (widget != NULL);
1183 g_return_if_fail (GTK_IS_WIDGET (widget));
1185 object = GTK_OBJECT (widget);
1187 va_start (var_args, first_arg_name);
1188 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1197 g_warning ("gtk_widget_set(): %s", error);
1205 slist_arg = arg_list;
1206 slist_info = info_list;
1209 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1210 slist_arg = slist_arg->next;
1211 slist_info = slist_info->next;
1213 gtk_args_collect_cleanup (arg_list, info_list);
1217 /*****************************************
1223 *****************************************/
1226 gtk_widget_setv (GtkWidget *widget,
1230 g_return_if_fail (widget != NULL);
1231 g_return_if_fail (GTK_IS_WIDGET (widget));
1233 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1237 gtk_widget_queue_clear_child (GtkWidget *widget)
1241 parent = widget->parent;
1242 if (parent && GTK_WIDGET_DRAWABLE (parent))
1243 gtk_widget_queue_clear_area (parent,
1244 widget->allocation.x,
1245 widget->allocation.y,
1246 widget->allocation.width,
1247 widget->allocation.height);
1251 gtk_widget_unparent (GtkWidget *widget)
1253 GtkWidget *toplevel;
1254 GtkWidget *old_parent;
1256 g_return_if_fail (widget != NULL);
1257 g_return_if_fail (GTK_IS_WIDGET (widget));
1258 if (widget->parent == NULL)
1261 /* keep this function in sync with gtk_menu_detach()
1264 /* unset focused and default children properly, this code
1265 * should eventually move into some gtk_window_unparent_branch() or
1269 toplevel = gtk_widget_get_toplevel (widget);
1270 if (GTK_CONTAINER (widget->parent)->focus_child == widget)
1272 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL);
1274 if (GTK_IS_WINDOW (toplevel))
1278 child = GTK_WINDOW (toplevel)->focus_widget;
1280 while (child && child != widget)
1281 child = child->parent;
1283 if (child == widget)
1284 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1287 if (GTK_IS_WINDOW (toplevel))
1291 child = GTK_WINDOW (toplevel)->default_widget;
1293 while (child && child != widget)
1294 child = child->parent;
1296 if (child == widget)
1297 gtk_window_set_default (GTK_WINDOW (toplevel), NULL);
1300 if (GTK_IS_RESIZE_CONTAINER (widget))
1301 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1303 /* Remove the widget and all its children from any ->resize_widgets list
1304 * of all the parents in our branch. This code should move into gtkcontainer.c
1305 * somwhen, since we mess around with ->resize_widgets, which is
1306 * actually not of our business.
1308 * Two ways to make this prettier:
1309 * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer))
1310 * Change resize_widgets to a GList
1312 toplevel = widget->parent;
1318 if (!GTK_CONTAINER (toplevel)->resize_widgets)
1320 toplevel = toplevel->parent;
1325 slist = GTK_CONTAINER (toplevel)->resize_widgets;
1337 while (parent && (parent != widget))
1338 parent = parent->parent;
1340 if (parent == widget)
1342 GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED);
1347 GTK_CONTAINER (toplevel)->resize_widgets = slist;
1349 g_slist_free_1 (last);
1355 toplevel = toplevel->parent;
1358 gtk_widget_queue_clear_child (widget);
1360 /* Reset the width and height here, to force reallocation if we
1361 * get added back to a new parent. This won't work if our new
1362 * allocation is smaller than 1x1 and we actually want a size of 1x1...
1363 * (would 0x0 be OK here?)
1365 widget->allocation.width = 1;
1366 widget->allocation.height = 1;
1368 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1369 gtk_widget_unrealize (widget);
1371 old_parent = widget->parent;
1372 widget->parent = NULL;
1373 gtk_widget_set_parent_window (widget, NULL);
1374 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1376 gtk_widget_unref (widget);
1379 /*****************************************
1380 * gtk_widget_destroy:
1385 *****************************************/
1388 gtk_widget_destroy (GtkWidget *widget)
1390 g_return_if_fail (widget != NULL);
1391 g_return_if_fail (GTK_IS_WIDGET (widget));
1392 g_return_if_fail (GTK_OBJECT_CONSTRUCTED (widget));
1394 gtk_object_destroy ((GtkObject*) widget);
1397 /*****************************************
1398 * gtk_widget_destroyed:
1399 * Utility function: sets widget_pointer
1400 * to NULL when widget is destroyed.
1405 *****************************************/
1408 gtk_widget_destroyed (GtkWidget *widget,
1409 GtkWidget **widget_pointer)
1411 /* Don't make any assumptions about the
1413 * Even check widget_pointer.
1416 *widget_pointer = NULL;
1419 /*****************************************
1425 *****************************************/
1428 gtk_widget_show (GtkWidget *widget)
1430 g_return_if_fail (widget != NULL);
1431 g_return_if_fail (GTK_IS_WIDGET (widget));
1433 if (!GTK_WIDGET_VISIBLE (widget))
1435 if (!GTK_WIDGET_TOPLEVEL (widget))
1436 gtk_widget_queue_resize (widget);
1437 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1442 gtk_widget_real_show (GtkWidget *widget)
1444 g_return_if_fail (widget != NULL);
1445 g_return_if_fail (GTK_IS_WIDGET (widget));
1447 if (!GTK_WIDGET_VISIBLE (widget))
1449 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
1451 if (widget->parent &&
1452 GTK_WIDGET_MAPPED (widget->parent) &&
1453 !GTK_WIDGET_MAPPED (widget))
1454 gtk_widget_map (widget);
1458 /*************************************************************
1459 * gtk_widget_show_now:
1460 * Show a widget, and if it is an unmapped toplevel widget
1461 * wait for the map_event before returning
1463 * Warning: This routine will call the main loop recursively.
1468 *************************************************************/
1471 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
1474 gtk_signal_disconnect_by_data (GTK_OBJECT (widget), flag);
1478 gtk_widget_show_now (GtkWidget *widget)
1482 g_return_if_fail (widget != NULL);
1483 g_return_if_fail (GTK_IS_WIDGET (widget));
1485 /* make sure we will get event */
1486 if (!GTK_WIDGET_MAPPED (widget) &&
1487 GTK_WIDGET_TOPLEVEL (widget))
1489 gtk_widget_show (widget);
1491 gtk_signal_connect (GTK_OBJECT (widget), "map_event",
1492 GTK_SIGNAL_FUNC (gtk_widget_show_map_callback),
1496 gtk_main_iteration();
1499 gtk_widget_show (widget);
1502 /*****************************************
1508 *****************************************/
1511 gtk_widget_hide (GtkWidget *widget)
1513 g_return_if_fail (widget != NULL);
1514 g_return_if_fail (GTK_IS_WIDGET (widget));
1516 if (GTK_WIDGET_VISIBLE (widget))
1518 gtk_widget_ref (widget);
1519 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1520 if (!GTK_WIDGET_TOPLEVEL (widget) && !GTK_OBJECT_DESTROYED (widget))
1521 gtk_widget_queue_resize (widget);
1522 gtk_widget_unref (widget);
1527 gtk_widget_real_hide (GtkWidget *widget)
1529 g_return_if_fail (widget != NULL);
1530 g_return_if_fail (GTK_IS_WIDGET (widget));
1532 if (GTK_WIDGET_VISIBLE (widget))
1534 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
1536 if (GTK_WIDGET_MAPPED (widget))
1537 gtk_widget_unmap (widget);
1542 gtk_widget_hide_on_delete (GtkWidget *widget)
1544 g_return_val_if_fail (widget != NULL, FALSE);
1545 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
1547 gtk_widget_hide (widget);
1553 gtk_widget_show_all (GtkWidget *widget)
1555 GtkWidgetClass *class;
1557 g_return_if_fail (widget != NULL);
1558 g_return_if_fail (GTK_IS_WIDGET (widget));
1560 class = GTK_WIDGET_GET_CLASS (widget);
1562 if (class->show_all)
1563 class->show_all (widget);
1567 gtk_widget_hide_all (GtkWidget *widget)
1569 GtkWidgetClass *class;
1571 g_return_if_fail (widget != NULL);
1572 g_return_if_fail (GTK_IS_WIDGET (widget));
1574 class = GTK_WIDGET_GET_CLASS (widget);
1576 if (class->hide_all)
1577 class->hide_all (widget);
1580 /*****************************************
1586 *****************************************/
1589 gtk_widget_map (GtkWidget *widget)
1591 g_return_if_fail (GTK_IS_WIDGET (widget));
1592 g_return_if_fail (GTK_WIDGET_VISIBLE (widget) == TRUE);
1594 if (!GTK_WIDGET_MAPPED (widget))
1596 if (!GTK_WIDGET_REALIZED (widget))
1597 gtk_widget_realize (widget);
1599 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1601 if (GTK_WIDGET_NO_WINDOW (widget))
1602 gtk_widget_queue_draw (widget);
1606 /*****************************************
1612 *****************************************/
1615 gtk_widget_unmap (GtkWidget *widget)
1617 g_return_if_fail (widget != NULL);
1618 g_return_if_fail (GTK_IS_WIDGET (widget));
1620 if (GTK_WIDGET_MAPPED (widget))
1622 if (GTK_WIDGET_NO_WINDOW (widget))
1623 gtk_widget_queue_clear_child (widget);
1624 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1628 /*****************************************
1629 * gtk_widget_realize:
1634 *****************************************/
1637 gtk_widget_realize (GtkWidget *widget)
1640 GdkExtensionMode mode;
1641 GtkWidgetShapeInfo *shape_info;
1643 g_return_if_fail (widget != NULL);
1644 g_return_if_fail (GTK_IS_WIDGET (widget));
1646 if (!GTK_WIDGET_REALIZED (widget))
1649 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1650 g_message ("gtk_widget_realize(%s)", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1653 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1654 gtk_widget_realize (widget->parent);
1656 gtk_widget_ensure_style (widget);
1658 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1660 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1662 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1664 gdk_window_shape_combine_mask (widget->window,
1665 shape_info->shape_mask,
1666 shape_info->offset_x,
1667 shape_info->offset_y);
1670 if (!GTK_WIDGET_NO_WINDOW (widget))
1672 mode = gtk_widget_get_extension_events (widget);
1673 if (mode != GDK_EXTENSION_EVENTS_NONE)
1675 events = gtk_widget_get_events (widget);
1676 gdk_input_set_extension_events (widget->window, events, mode);
1683 /*****************************************
1684 * gtk_widget_unrealize:
1689 *****************************************/
1692 gtk_widget_unrealize (GtkWidget *widget)
1694 g_return_if_fail (widget != NULL);
1695 g_return_if_fail (GTK_IS_WIDGET (widget));
1697 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1698 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
1700 if (GTK_WIDGET_REALIZED (widget))
1702 gtk_widget_ref (widget);
1703 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1704 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
1705 gtk_widget_unref (widget);
1709 /*****************************************
1711 *****************************************/
1714 gtk_widget_queue_draw_area (GtkWidget *widget,
1720 g_return_if_fail (widget != NULL);
1721 g_return_if_fail (GTK_IS_WIDGET (widget));
1723 gtk_widget_queue_clear_area (widget, x, y, width, height);
1727 gtk_widget_queue_draw (GtkWidget *widget)
1729 g_return_if_fail (widget != NULL);
1730 g_return_if_fail (GTK_IS_WIDGET (widget));
1732 gtk_widget_queue_clear (widget);
1735 /* Invalidates the given area (allocation-relative-coordinates)
1736 * in all of the widget's windows
1739 gtk_widget_queue_clear_area (GtkWidget *widget,
1745 GdkRectangle invalid_rect;
1747 g_return_if_fail (widget != NULL);
1748 g_return_if_fail (GTK_IS_WIDGET (widget));
1750 if (!(widget->window && gdk_window_is_viewable (widget->window)))
1753 /* Find the correct widget */
1755 if (!GTK_WIDGET_NO_WINDOW (widget))
1759 /* Translate widget relative to window-relative */
1761 gint wx, wy, wwidth, wheight;
1763 gdk_window_get_position (widget->window, &wx, &wy);
1764 x -= wx - widget->allocation.x;
1765 y -= wy - widget->allocation.y;
1767 gdk_window_get_size (widget->window, &wwidth, &wheight);
1769 if (x + width <= 0 || y + height <= 0 ||
1770 x >= wwidth || y >= wheight)
1781 if (x + width > wwidth)
1783 if (y + height > wheight)
1784 height = wheight - y;
1790 invalid_rect.width = width;
1791 invalid_rect.height = height;
1793 gdk_window_invalidate_rect (widget->window, &invalid_rect, TRUE);
1797 gtk_widget_queue_clear (GtkWidget *widget)
1799 g_return_if_fail (widget != NULL);
1800 g_return_if_fail (GTK_IS_WIDGET (widget));
1802 if (widget->allocation.width || widget->allocation.height)
1804 if (GTK_WIDGET_NO_WINDOW (widget))
1805 gtk_widget_queue_clear_area (widget, widget->allocation.x,
1806 widget->allocation.y,
1807 widget->allocation.width,
1808 widget->allocation.height);
1810 gtk_widget_queue_clear_area (widget, 0, 0,
1811 widget->allocation.width,
1812 widget->allocation.height);
1817 gtk_widget_queue_resize (GtkWidget *widget)
1819 g_return_if_fail (widget != NULL);
1820 g_return_if_fail (GTK_IS_WIDGET (widget));
1822 if (GTK_IS_RESIZE_CONTAINER (widget))
1823 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1825 gtk_widget_queue_clear (widget);
1828 gtk_container_queue_resize (GTK_CONTAINER (widget->parent));
1829 else if (GTK_WIDGET_TOPLEVEL (widget))
1830 gtk_container_queue_resize (GTK_CONTAINER (widget));
1833 /*****************************************
1839 *****************************************/
1842 gtk_widget_draw (GtkWidget *widget,
1845 GdkRectangle temp_area;
1847 g_return_if_fail (widget != NULL);
1848 g_return_if_fail (GTK_IS_WIDGET (widget));
1850 if (GTK_WIDGET_DRAWABLE (widget))
1854 if (area->width <= 0 || area->height <= 0)
1859 if (GTK_WIDGET_NO_WINDOW (widget))
1861 temp_area.x = widget->allocation.x;
1862 temp_area.y = widget->allocation.y;
1870 temp_area.width = widget->allocation.width;
1871 temp_area.height = widget->allocation.height;
1875 if (!GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_DOUBLE_BUFFERED (widget))
1877 GdkRectangle tmp_area = *area;
1880 if (!GTK_WIDGET_TOPLEVEL (widget))
1882 gdk_window_get_position (widget->window, &x, &y);
1883 tmp_area.x -= x - widget->allocation.x;
1884 tmp_area.y -= y - widget->allocation.y;
1887 gdk_window_begin_paint_rect (widget->window, &tmp_area);
1890 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
1892 if (!GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_DOUBLE_BUFFERED (widget))
1893 gdk_window_end_paint (widget->window);
1897 /*****************************************
1898 * gtk_widget_draw_focus:
1903 *****************************************/
1906 gtk_widget_draw_focus (GtkWidget *widget)
1908 g_return_if_fail (widget != NULL);
1909 g_return_if_fail (GTK_IS_WIDGET (widget));
1911 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
1914 /*****************************************
1915 * gtk_widget_draw_default:
1920 *****************************************/
1923 gtk_widget_draw_default (GtkWidget *widget)
1925 g_return_if_fail (widget != NULL);
1926 g_return_if_fail (GTK_IS_WIDGET (widget));
1928 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
1931 /*****************************************
1932 * gtk_widget_size_request:
1937 *****************************************/
1940 gtk_widget_size_request (GtkWidget *widget,
1941 GtkRequisition *requisition)
1943 g_return_if_fail (widget != NULL);
1944 g_return_if_fail (GTK_IS_WIDGET (widget));
1946 #ifdef G_ENABLE_DEBUG
1947 if (requisition == &widget->requisition)
1948 g_warning ("gtk_widget_size_request() called on child widget with request equal\n to widget->requisition. gtk_widget_set_usize() may not work properly.");
1949 #endif /* G_ENABLE_DEBUG */
1951 gtk_widget_ref (widget);
1952 gtk_widget_ensure_style (widget);
1953 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
1954 &widget->requisition);
1957 gtk_widget_get_child_requisition (widget, requisition);
1959 gtk_widget_unref (widget);
1962 /*****************************************
1963 * gtk_widget_get_requesition:
1968 *****************************************/
1971 gtk_widget_get_child_requisition (GtkWidget *widget,
1972 GtkRequisition *requisition)
1974 GtkWidgetAuxInfo *aux_info;
1976 g_return_if_fail (widget != NULL);
1977 g_return_if_fail (GTK_IS_WIDGET (widget));
1979 *requisition = widget->requisition;
1981 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1984 if (aux_info->width > 0)
1985 requisition->width = aux_info->width;
1986 if (aux_info->height > 0)
1987 requisition->height = aux_info->height;
1991 /*****************************************
1992 * gtk_widget_size_allocate:
1997 *****************************************/
2000 gtk_widget_size_allocate (GtkWidget *widget,
2001 GtkAllocation *allocation)
2003 GtkWidgetAuxInfo *aux_info;
2004 GtkAllocation real_allocation;
2005 gboolean needs_draw = FALSE;
2007 g_return_if_fail (widget != NULL);
2008 g_return_if_fail (GTK_IS_WIDGET (widget));
2010 real_allocation = *allocation;
2011 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2015 if (aux_info->x != -1)
2016 real_allocation.x = aux_info->x;
2017 if (aux_info->y != -1)
2018 real_allocation.y = aux_info->y;
2021 real_allocation.width = MAX (real_allocation.width, 1);
2022 real_allocation.height = MAX (real_allocation.height, 1);
2024 if (real_allocation.width < 0 || real_allocation.height < 0)
2026 g_warning ("gtk_widget_size_allocate(): attempt to allocate widget with width %d and height %d",
2027 real_allocation.width,
2028 real_allocation.height);
2029 real_allocation.width = 1;
2030 real_allocation.height = 1;
2033 if (GTK_WIDGET_NO_WINDOW (widget))
2035 if (widget->allocation.x != real_allocation.x ||
2036 widget->allocation.y != real_allocation.y ||
2037 widget->allocation.width != real_allocation.width ||
2038 widget->allocation.height != real_allocation.height)
2040 gtk_widget_queue_clear_child (widget);
2044 else if (widget->allocation.width != real_allocation.width ||
2045 widget->allocation.height != real_allocation.height)
2050 if (GTK_IS_RESIZE_CONTAINER (widget))
2051 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
2053 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
2057 gtk_widget_queue_draw (widget);
2058 if (widget->parent && GTK_CONTAINER (widget->parent)->reallocate_redraws)
2059 gtk_widget_queue_draw (widget->parent);
2064 gtk_widget_real_size_allocate (GtkWidget *widget,
2065 GtkAllocation *allocation)
2067 g_return_if_fail (widget != NULL);
2068 g_return_if_fail (GTK_IS_WIDGET (widget));
2070 widget->allocation = *allocation;
2072 if (GTK_WIDGET_REALIZED (widget) &&
2073 !GTK_WIDGET_NO_WINDOW (widget))
2075 gdk_window_move_resize (widget->window,
2076 allocation->x, allocation->y,
2077 allocation->width, allocation->height);
2082 gtk_widget_stop_add_accelerator (GtkWidget *widget)
2084 g_return_if_fail (widget != NULL);
2085 g_return_if_fail (GTK_IS_WIDGET (widget));
2087 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
2091 gtk_widget_stop_remove_accelerator (GtkWidget *widget)
2093 g_return_if_fail (widget != NULL);
2094 g_return_if_fail (GTK_IS_WIDGET (widget));
2096 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR]);
2100 gtk_widget_lock_accelerators (GtkWidget *widget)
2102 g_return_if_fail (widget != NULL);
2103 g_return_if_fail (GTK_IS_WIDGET (widget));
2105 if (!gtk_widget_accelerators_locked (widget))
2107 gtk_signal_connect (GTK_OBJECT (widget),
2109 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2111 gtk_signal_connect (GTK_OBJECT (widget),
2112 "remove_accelerator",
2113 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
2119 gtk_widget_unlock_accelerators (GtkWidget *widget)
2121 g_return_if_fail (widget != NULL);
2122 g_return_if_fail (GTK_IS_WIDGET (widget));
2124 if (gtk_widget_accelerators_locked (widget))
2126 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
2127 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2129 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
2130 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
2136 gtk_widget_accelerators_locked (GtkWidget *widget)
2138 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2140 return gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
2141 widget_signals[ADD_ACCELERATOR],
2143 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2148 gtk_widget_add_accelerator (GtkWidget *widget,
2149 const gchar *accel_signal,
2150 GtkAccelGroup *accel_group,
2153 GtkAccelFlags accel_flags)
2155 g_return_if_fail (widget != NULL);
2156 g_return_if_fail (GTK_IS_WIDGET (widget));
2157 g_return_if_fail (accel_group != NULL);
2159 gtk_accel_group_add (accel_group,
2163 (GtkObject*) widget,
2168 gtk_widget_remove_accelerator (GtkWidget *widget,
2169 GtkAccelGroup *accel_group,
2173 g_return_if_fail (widget != NULL);
2174 g_return_if_fail (GTK_IS_WIDGET (widget));
2175 g_return_if_fail (accel_group != NULL);
2177 gtk_accel_group_remove (accel_group,
2180 (GtkObject*) widget);
2184 gtk_widget_remove_accelerators (GtkWidget *widget,
2185 const gchar *accel_signal,
2186 gboolean visible_only)
2191 g_return_if_fail (widget != NULL);
2192 g_return_if_fail (GTK_IS_WIDGET (widget));
2193 g_return_if_fail (accel_signal != NULL);
2195 signal_id = gtk_signal_lookup (accel_signal, GTK_OBJECT_TYPE (widget));
2196 g_return_if_fail (signal_id != 0);
2198 slist = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
2201 GtkAccelEntry *ac_entry;
2203 ac_entry = slist->data;
2204 slist = slist->next;
2205 if (ac_entry->accel_flags & GTK_ACCEL_VISIBLE &&
2206 ac_entry->signal_id == signal_id)
2207 gtk_widget_remove_accelerator (GTK_WIDGET (widget),
2208 ac_entry->accel_group,
2209 ac_entry->accelerator_key,
2210 ac_entry->accelerator_mods);
2215 gtk_widget_accelerator_signal (GtkWidget *widget,
2216 GtkAccelGroup *accel_group,
2220 GtkAccelEntry *ac_entry;
2222 g_return_val_if_fail (widget != NULL, 0);
2223 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
2224 g_return_val_if_fail (accel_group != NULL, 0);
2226 ac_entry = gtk_accel_group_get_entry (accel_group, accel_key, accel_mods);
2228 if (ac_entry && ac_entry->object == (GtkObject*) widget)
2229 return ac_entry->signal_id;
2234 gtk_widget_real_key_press_event (GtkWidget *widget,
2237 gboolean handled = FALSE;
2239 g_return_val_if_fail (widget != NULL, handled);
2240 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
2241 g_return_val_if_fail (event != NULL, handled);
2244 handled = gtk_bindings_activate (GTK_OBJECT (widget),
2252 gtk_widget_real_key_release_event (GtkWidget *widget,
2255 gboolean handled = FALSE;
2257 g_return_val_if_fail (widget != NULL, handled);
2258 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
2259 g_return_val_if_fail (event != NULL, handled);
2262 handled = gtk_bindings_activate (GTK_OBJECT (widget),
2264 event->state | GDK_RELEASE_MASK);
2269 /*****************************************
2275 *****************************************/
2278 gtk_widget_event (GtkWidget *widget,
2281 gboolean return_val;
2284 g_return_val_if_fail (widget != NULL, TRUE);
2285 g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
2287 gtk_widget_ref (widget);
2289 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
2291 if (return_val || GTK_OBJECT_DESTROYED (widget))
2294 switch (event->type)
2299 case GDK_BUTTON_PRESS:
2300 case GDK_2BUTTON_PRESS:
2301 case GDK_3BUTTON_PRESS:
2302 signal_num = BUTTON_PRESS_EVENT;
2305 signal_num = SCROLL_EVENT;
2307 case GDK_BUTTON_RELEASE:
2308 signal_num = BUTTON_RELEASE_EVENT;
2310 case GDK_MOTION_NOTIFY:
2311 signal_num = MOTION_NOTIFY_EVENT;
2314 signal_num = DELETE_EVENT;
2317 signal_num = DESTROY_EVENT;
2320 signal_num = KEY_PRESS_EVENT;
2322 case GDK_KEY_RELEASE:
2323 signal_num = KEY_RELEASE_EVENT;
2325 case GDK_ENTER_NOTIFY:
2326 signal_num = ENTER_NOTIFY_EVENT;
2328 case GDK_LEAVE_NOTIFY:
2329 signal_num = LEAVE_NOTIFY_EVENT;
2331 case GDK_FOCUS_CHANGE:
2332 if (event->focus_change.in)
2333 signal_num = FOCUS_IN_EVENT;
2335 signal_num = FOCUS_OUT_EVENT;
2338 signal_num = CONFIGURE_EVENT;
2341 signal_num = MAP_EVENT;
2344 signal_num = UNMAP_EVENT;
2346 case GDK_PROPERTY_NOTIFY:
2347 signal_num = PROPERTY_NOTIFY_EVENT;
2349 case GDK_SELECTION_CLEAR:
2350 signal_num = SELECTION_CLEAR_EVENT;
2352 case GDK_SELECTION_REQUEST:
2353 signal_num = SELECTION_REQUEST_EVENT;
2355 case GDK_SELECTION_NOTIFY:
2356 signal_num = SELECTION_NOTIFY_EVENT;
2358 case GDK_PROXIMITY_IN:
2359 signal_num = PROXIMITY_IN_EVENT;
2361 case GDK_PROXIMITY_OUT:
2362 signal_num = PROXIMITY_OUT_EVENT;
2365 signal_num = NO_EXPOSE_EVENT;
2367 case GDK_CLIENT_EVENT:
2368 signal_num = CLIENT_EVENT;
2371 if (!event->any.window) /* Why is this necessary */
2374 signal_num = EXPOSE_EVENT;
2376 case GDK_VISIBILITY_NOTIFY:
2377 signal_num = VISIBILITY_NOTIFY_EVENT;
2380 g_warning ("could not determine signal number for event: %d", event->type);
2384 if (signal_num != -1)
2385 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
2387 return_val |= GTK_OBJECT_DESTROYED (widget);
2390 gtk_widget_unref (widget);
2395 /*****************************************
2396 * gtk_widget_activate:
2401 *****************************************/
2404 gtk_widget_activate (GtkWidget *widget)
2406 g_return_val_if_fail (widget != NULL, FALSE);
2407 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2409 if (WIDGET_CLASS (widget)->activate_signal)
2411 /* FIXME: we should eventually check the signals signature here */
2412 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
2421 gtk_widget_set_scroll_adjustments (GtkWidget *widget,
2422 GtkAdjustment *hadjustment,
2423 GtkAdjustment *vadjustment)
2425 g_return_val_if_fail (widget != NULL, FALSE);
2426 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2428 g_return_val_if_fail (GTK_IS_ADJUSTMENT (hadjustment), FALSE);
2430 g_return_val_if_fail (GTK_IS_ADJUSTMENT (vadjustment), FALSE);
2432 if (WIDGET_CLASS (widget)->set_scroll_adjustments_signal)
2434 /* FIXME: we should eventually check the signals signature here */
2435 gtk_signal_emit (GTK_OBJECT (widget),
2436 WIDGET_CLASS (widget)->set_scroll_adjustments_signal,
2437 hadjustment, vadjustment);
2444 /*****************************************
2445 * gtk_widget_reparent_container_child:
2446 * assistent function to gtk_widget_reparent
2451 *****************************************/
2454 gtk_widget_reparent_container_child (GtkWidget *widget,
2455 gpointer client_data)
2457 g_return_if_fail (widget != NULL);
2458 g_return_if_fail (GTK_IS_WIDGET (widget));
2459 g_return_if_fail (client_data != NULL);
2461 if (GTK_WIDGET_NO_WINDOW (widget))
2464 gdk_window_unref (widget->window);
2465 widget->window = (GdkWindow*) client_data;
2467 gdk_window_ref (widget->window);
2469 if (GTK_IS_CONTAINER (widget))
2470 gtk_container_forall (GTK_CONTAINER (widget),
2471 gtk_widget_reparent_container_child,
2475 gdk_window_reparent (widget->window,
2476 (GdkWindow*) client_data, 0, 0);
2479 /*****************************************
2480 * gtk_widget_reparent:
2485 *****************************************/
2488 gtk_widget_reparent (GtkWidget *widget,
2489 GtkWidget *new_parent)
2491 g_return_if_fail (widget != NULL);
2492 g_return_if_fail (GTK_IS_WIDGET (widget));
2493 g_return_if_fail (new_parent != NULL);
2494 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
2495 g_return_if_fail (widget->parent != NULL);
2497 if (widget->parent != new_parent)
2499 /* First try to see if we can get away without unrealizing
2500 * the widget as we reparent it. if so we set a flag so
2501 * that gtk_widget_unparent doesn't unrealize widget
2503 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
2504 GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
2506 gtk_widget_ref (widget);
2507 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
2508 gtk_container_add (GTK_CONTAINER (new_parent), widget);
2509 gtk_widget_unref (widget);
2511 if (GTK_WIDGET_IN_REPARENT (widget))
2513 GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
2515 gtk_widget_reparent_container_child (widget,
2516 gtk_widget_get_parent_window (widget));
2521 /*****************************************
2527 *****************************************/
2530 gtk_widget_popup (GtkWidget *widget,
2534 g_return_if_fail (widget != NULL);
2535 g_return_if_fail (GTK_IS_WIDGET (widget));
2537 if (!GTK_WIDGET_VISIBLE (widget))
2539 if (!GTK_WIDGET_REALIZED (widget))
2540 gtk_widget_realize (widget);
2541 if (!GTK_WIDGET_NO_WINDOW (widget))
2542 gdk_window_move (widget->window, x, y);
2543 gtk_widget_show (widget);
2547 /*****************************************
2548 * gtk_widget_intersect:
2553 *****************************************/
2556 gtk_widget_intersect (GtkWidget *widget,
2558 GdkRectangle *intersection)
2564 g_return_val_if_fail (widget != NULL, FALSE);
2565 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2566 g_return_val_if_fail (area != NULL, FALSE);
2569 dest = intersection;
2573 return_val = gdk_rectangle_intersect (&widget->allocation, area, dest);
2575 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2577 intersection->x -= widget->allocation.x;
2578 intersection->y -= widget->allocation.y;
2584 /*****************************************
2585 * gtk_widget_grab_focus:
2590 *****************************************/
2593 gtk_widget_grab_focus (GtkWidget *widget)
2595 g_return_if_fail (widget != NULL);
2596 g_return_if_fail (GTK_IS_WIDGET (widget));
2598 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[GRAB_FOCUS]);
2602 reset_focus_recurse (GtkWidget *widget,
2605 if (GTK_IS_CONTAINER (widget))
2607 GtkContainer *container;
2609 container = GTK_CONTAINER (widget);
2610 gtk_container_set_focus_child (container, NULL);
2612 gtk_container_foreach (container,
2613 reset_focus_recurse,
2619 gtk_widget_real_grab_focus (GtkWidget *focus_widget)
2621 g_return_if_fail (focus_widget != NULL);
2622 g_return_if_fail (GTK_IS_WIDGET (focus_widget));
2624 if (GTK_WIDGET_CAN_FOCUS (focus_widget))
2626 GtkWidget *toplevel;
2629 /* clear the current focus setting, break if the current widget
2630 * is the focus widget's parent, since containers above that will
2631 * be set by the next loop.
2633 toplevel = gtk_widget_get_toplevel (focus_widget);
2634 if (GTK_IS_WINDOW (toplevel))
2636 widget = GTK_WINDOW (toplevel)->focus_widget;
2638 if (widget == focus_widget)
2640 /* We call gtk_window_set_focus() here so that the
2641 * toplevel window can request the focus if necessary.
2642 * This is needed when the toplevel is a GtkPlug
2644 if (!GTK_WIDGET_HAS_FOCUS (widget))
2645 gtk_window_set_focus (GTK_WINDOW (toplevel), focus_widget);
2652 while (widget->parent && widget->parent != focus_widget->parent)
2654 widget = widget->parent;
2655 gtk_container_set_focus_child (GTK_CONTAINER (widget), NULL);
2659 else if (toplevel != focus_widget)
2661 /* gtk_widget_grab_focus() operates on a tree without window...
2662 * actually, this is very questionable behaviour.
2665 gtk_container_foreach (GTK_CONTAINER (toplevel),
2666 reset_focus_recurse,
2670 /* now propagate the new focus up the widget tree and finally
2671 * set it on the window
2673 widget = focus_widget;
2674 while (widget->parent)
2676 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), widget);
2677 widget = widget->parent;
2679 if (GTK_IS_WINDOW (widget))
2680 gtk_window_set_focus (GTK_WINDOW (widget), focus_widget);
2684 /*****************************************
2685 * gtk_widget_grab_default:
2690 *****************************************/
2693 gtk_widget_grab_default (GtkWidget *widget)
2696 GtkType window_type;
2698 g_return_if_fail (widget != NULL);
2699 g_return_if_fail (GTK_IS_WIDGET (widget));
2700 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
2702 window_type = GTK_TYPE_WINDOW;
2703 window = widget->parent;
2705 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2706 window = window->parent;
2708 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2709 gtk_window_set_default (GTK_WINDOW (window), widget);
2711 g_warning("gtk_widget_grab_default() called on a widget not within a GtkWindow");
2714 /*****************************************
2715 * gtk_widget_set_name:
2720 *****************************************/
2723 gtk_widget_set_name (GtkWidget *widget,
2726 g_return_if_fail (widget != NULL);
2727 g_return_if_fail (GTK_IS_WIDGET (widget));
2730 g_free (widget->name);
2731 widget->name = g_strdup (name);
2733 if (GTK_WIDGET_RC_STYLE (widget))
2734 gtk_widget_set_rc_style (widget);
2737 /*****************************************
2738 * gtk_widget_get_name:
2743 *****************************************/
2746 gtk_widget_get_name (GtkWidget *widget)
2748 g_return_val_if_fail (widget != NULL, NULL);
2749 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
2752 return widget->name;
2753 return gtk_type_name (GTK_WIDGET_TYPE (widget));
2756 /*****************************************
2757 * gtk_widget_set_state:
2764 *****************************************/
2767 gtk_widget_set_state (GtkWidget *widget,
2770 g_return_if_fail (widget != NULL);
2771 g_return_if_fail (GTK_IS_WIDGET (widget));
2773 if (state == GTK_WIDGET_STATE (widget))
2776 if (state == GTK_STATE_INSENSITIVE)
2777 gtk_widget_set_sensitive (widget, FALSE);
2783 data.state_restoration = FALSE;
2784 data.use_forall = FALSE;
2786 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2788 data.parent_sensitive = TRUE;
2790 gtk_widget_propagate_state (widget, &data);
2792 if (GTK_WIDGET_DRAWABLE (widget))
2793 gtk_widget_queue_clear (widget);
2798 gtk_widget_set_app_paintable (GtkWidget *widget,
2799 gboolean app_paintable)
2801 g_return_if_fail (widget != NULL);
2802 g_return_if_fail (GTK_IS_WIDGET (widget));
2804 app_paintable = (app_paintable != FALSE);
2806 if (GTK_WIDGET_APP_PAINTABLE (widget) != app_paintable)
2809 GTK_WIDGET_SET_FLAGS (widget, GTK_APP_PAINTABLE);
2811 GTK_WIDGET_UNSET_FLAGS (widget, GTK_APP_PAINTABLE);
2813 if (GTK_WIDGET_DRAWABLE (widget))
2814 gtk_widget_queue_clear (widget);
2819 gtk_widget_set_double_buffered (GtkWidget *widget,
2820 gboolean double_buffered)
2822 g_return_if_fail (widget != NULL);
2823 g_return_if_fail (GTK_IS_WIDGET (widget));
2825 if (double_buffered)
2826 GTK_WIDGET_SET_FLAGS (widget, GTK_DOUBLE_BUFFERED);
2828 GTK_WIDGET_UNSET_FLAGS (widget, GTK_DOUBLE_BUFFERED);
2831 /*****************************************
2832 * gtk_widget_set_sensitive:
2836 * boolean value for sensitivity
2839 *****************************************/
2842 gtk_widget_set_sensitive (GtkWidget *widget,
2847 g_return_if_fail (widget != NULL);
2848 g_return_if_fail (GTK_IS_WIDGET (widget));
2850 sensitive = (sensitive != FALSE);
2852 if (sensitive == (GTK_WIDGET_SENSITIVE (widget) != FALSE))
2857 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
2858 data.state = GTK_WIDGET_SAVED_STATE (widget);
2862 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
2863 data.state = GTK_WIDGET_STATE (widget);
2865 data.state_restoration = TRUE;
2866 data.use_forall = TRUE;
2869 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2871 data.parent_sensitive = TRUE;
2873 gtk_widget_propagate_state (widget, &data);
2874 if (GTK_WIDGET_DRAWABLE (widget))
2875 gtk_widget_queue_clear (widget);
2878 /*****************************************
2879 * gtk_widget_set_parent:
2884 *****************************************/
2887 gtk_widget_set_parent (GtkWidget *widget,
2892 g_return_if_fail (widget != NULL);
2893 g_return_if_fail (GTK_IS_WIDGET (widget));
2894 g_return_if_fail (widget->parent == NULL);
2895 g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
2896 g_return_if_fail (parent != NULL);
2897 g_return_if_fail (GTK_IS_WIDGET (parent));
2898 g_return_if_fail (widget != parent);
2900 /* keep this function in sync with gtk_menu_attach_to_widget()
2903 gtk_widget_ref (widget);
2904 gtk_object_sink (GTK_OBJECT (widget));
2905 widget->parent = parent;
2907 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
2908 data.state = GTK_WIDGET_STATE (parent);
2910 data.state = GTK_WIDGET_STATE (widget);
2911 data.state_restoration = FALSE;
2912 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (parent) != FALSE);
2913 data.use_forall = GTK_WIDGET_IS_SENSITIVE (parent) != GTK_WIDGET_IS_SENSITIVE (widget);
2915 gtk_widget_propagate_state (widget, &data);
2917 gtk_widget_set_style_recurse (widget, NULL);
2919 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
2922 /*****************************************
2924 * see docs/styles.txt
2925 *****************************************/
2927 gtk_widget_set_style (GtkWidget *widget,
2930 GtkStyle *default_style;
2931 gboolean initial_emission;
2933 g_return_if_fail (widget != NULL);
2934 g_return_if_fail (GTK_IS_WIDGET (widget));
2935 g_return_if_fail (style != NULL);
2937 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2939 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
2940 GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
2942 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2945 gtk_style_ref (widget->style);
2946 if (!saved_default_style_key_id)
2947 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2948 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2951 gtk_widget_set_style_internal (widget, style, initial_emission);
2955 gtk_widget_ensure_style (GtkWidget *widget)
2957 g_return_if_fail (widget != NULL);
2958 g_return_if_fail (GTK_IS_WIDGET (widget));
2960 if (!GTK_WIDGET_USER_STYLE (widget) &&
2961 !GTK_WIDGET_RC_STYLE (widget))
2962 gtk_widget_set_rc_style (widget);
2966 gtk_widget_set_rc_style (GtkWidget *widget)
2968 GtkStyle *saved_style;
2969 GtkStyle *new_style;
2970 gboolean initial_emission;
2972 g_return_if_fail (widget != NULL);
2973 g_return_if_fail (GTK_IS_WIDGET (widget));
2975 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2977 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2978 GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
2980 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2981 new_style = gtk_rc_get_style (widget);
2986 gtk_style_ref (widget->style);
2987 if (!saved_default_style_key_id)
2988 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2989 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2991 gtk_widget_set_style_internal (widget, new_style, initial_emission);
2997 g_assert (initial_emission == FALSE); /* FIXME: remove this line */
2999 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3000 gtk_widget_set_style_internal (widget, saved_style, initial_emission);
3001 gtk_style_unref (saved_style);
3005 if (initial_emission)
3006 gtk_widget_set_style_internal (widget, widget->style, TRUE);
3012 gtk_widget_restore_default_style (GtkWidget *widget)
3014 GtkStyle *default_style;
3016 g_return_if_fail (widget != NULL);
3017 g_return_if_fail (GTK_IS_WIDGET (widget));
3019 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
3021 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3024 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3025 gtk_widget_set_style_internal (widget, default_style, FALSE);
3026 gtk_style_unref (default_style);
3031 gtk_widget_get_style (GtkWidget *widget)
3033 g_return_val_if_fail (widget != NULL, NULL);
3034 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3036 return widget->style;
3040 * gtk_widget_modify_style:
3041 * @widget: a #GtkWidget
3042 * @style: the #GtkRcStyle holding the style modifications
3044 * Modify style values on the widget. Modifications made using this
3045 * technique take precendence over style values set via an RC file,
3046 * however, they will be overriden if a style is explicitely set on
3047 * the widget using gtk_widget_set_style(). The #GtkRcStyle structure
3048 * is designed so each field can either be set or unset, so it is
3049 * possible, using this function, to modify some style values and
3050 * leave the others unchanged.
3052 * Note that modifications made with this function are not cumulative
3053 * with previous calls to gtk_widget_modify_style() or with such
3054 * functions as gtk_widget_modify_fg(). If you wish to retain
3055 * previous values, you must first call gtk_widget_get_modifier_style(),
3056 * make your modifications to the returned style, then call
3057 * gtk_widget_modify_style() with that style. On the other hand,
3058 * if you first call gtk_widget_modify_style(), subsequent calls
3059 * to such functions gtk_widget_modify_fg() will be have a cumulative
3060 * effect with the inital modifications.
3063 gtk_widget_modify_style (GtkWidget *widget,
3066 GtkRcStyle *old_style;
3068 g_return_if_fail (GTK_IS_RC_STYLE (style));
3070 if (!rc_style_key_id)
3071 rc_style_key_id = g_quark_from_static_string (rc_style_key);
3073 old_style = gtk_object_get_data_by_id (GTK_OBJECT (widget),
3076 if (style != old_style)
3077 gtk_object_set_data_by_id_full (GTK_OBJECT (widget),
3079 gtk_rc_style_copy (style),
3080 (GtkDestroyNotify)gtk_rc_style_unref);
3082 if (GTK_WIDGET_RC_STYLE (widget))
3083 gtk_widget_set_rc_style (widget);
3087 * gtk_widget_get_modifier_style:
3088 * @widget: a #GtkWidget
3090 * Return the current modifier style for the widget. (As set by
3091 * gtk_widget_modify_style().) If no style has previously set, a new
3092 * #GtkRcStyle will be created with all values unset, and set as the
3093 * modifier style for the widget. If you make changes to this rc
3094 * style, you must call gtk_widget_modify_style(), passing in the
3095 * returned rc style, to make sure that your changes take effect.
3097 * Return value: the modifier style for the widget. This rc style is
3098 * owned by the widget. If you want to keep a pointer to value this
3099 * around, you must add a refcount using gtk_rc_style_ref().
3102 gtk_widget_get_modifier_style (GtkWidget *widget)
3104 GtkRcStyle *rc_style;
3106 if (!rc_style_key_id)
3107 rc_style_key_id = g_quark_from_static_string (rc_style_key);
3109 rc_style = gtk_object_get_data_by_id (GTK_OBJECT (widget),
3114 rc_style = gtk_rc_style_new();
3115 gtk_object_set_data_by_id_full (GTK_OBJECT (widget),
3118 (GtkDestroyNotify)gtk_rc_style_unref);
3125 gtk_widget_modify_color_component (GtkWidget *widget,
3126 GtkRcFlags component,
3130 GtkRcStyle *rc_style = gtk_widget_get_modifier_style (widget);
3135 rc_style->fg[state] = *color;
3138 rc_style->bg[state] = *color;
3141 rc_style->text[state] = *color;
3144 rc_style->base[state] = *color;
3147 g_assert_not_reached();
3150 rc_style->color_flags[state] |= component;
3152 if (GTK_WIDGET_RC_STYLE (widget))
3153 gtk_widget_set_rc_style (widget);
3157 * gtk_widget_modify_fg:
3158 * @widget: a #GtkWidget
3159 * @state: the state for which to set the foreground color.
3160 * @color: the color to assign (does not need to be allocated)
3162 * Set the foreground color for a widget in a particular state. All
3163 * other style values are left untouched. See also
3164 * gtk_widget_modify_style().
3167 gtk_widget_modify_fg (GtkWidget *widget,
3171 g_return_if_fail (GTK_IS_WIDGET (widget));
3172 g_return_if_fail (state >= GTK_STATE_NORMAL && state <= GTK_STATE_INSENSITIVE);
3173 g_return_if_fail (color != NULL);
3175 gtk_widget_modify_color_component (widget, GTK_RC_FG, state, color);
3179 * gtk_widget_modify_bg:
3180 * @widget: a #GtkWidget
3181 * @state: the state for which to set the foreground color.
3182 * @color: the color to assign (does not need to be allocated)
3184 * Set the background color for a widget in a particular state. All
3185 * other style values are left untouched. See also
3186 * gtk_widget_modify_style().
3189 gtk_widget_modify_bg (GtkWidget *widget,
3193 g_return_if_fail (GTK_IS_WIDGET (widget));
3194 g_return_if_fail (state >= GTK_STATE_NORMAL && state <= GTK_STATE_INSENSITIVE);
3195 g_return_if_fail (color != NULL);
3197 gtk_widget_modify_color_component (widget, GTK_RC_BG, state, color);
3201 * gtk_widget_modify_base:
3202 * @widget: a #GtkWidget
3203 * @state: the state for which to set the foreground color.
3204 * @color: the color to assign (does not need to be allocated)
3206 * Set the text color for a widget in a particular state. All other
3207 * style values are left untouched. The text color is the foreground
3208 * color used along with the base color (see gtk_widget_modify_base)
3209 * for widgets such as #GtkEntry and #GtkTextView. See also
3210 * gtk_widget_modify_style().
3213 gtk_widget_modify_text (GtkWidget *widget,
3217 g_return_if_fail (GTK_IS_WIDGET (widget));
3218 g_return_if_fail (state >= GTK_STATE_NORMAL && state <= GTK_STATE_INSENSITIVE);
3219 g_return_if_fail (color != NULL);
3221 gtk_widget_modify_color_component (widget, GTK_RC_TEXT, state, color);
3225 * gtk_widget_modify_base:
3226 * @widget: a #GtkWidget
3227 * @state: the state for which to set the foreground color.
3228 * @color: the color to assign (does not need to be allocated)
3230 * Set the text color for a widget in a particular state.
3231 * All other style values are left untouched. The base color
3232 * is the background color used along with the text color
3233 * (see gtk_widget_modify_text) for widgets such as #GtkEntry
3234 * and #GtkTextView. See also gtk_widget_modify_style().
3237 gtk_widget_modify_base (GtkWidget *widget,
3241 g_return_if_fail (GTK_IS_WIDGET (widget));
3242 g_return_if_fail (state >= GTK_STATE_NORMAL && state <= GTK_STATE_INSENSITIVE);
3243 g_return_if_fail (color != NULL);
3245 gtk_widget_modify_color_component (widget, GTK_RC_BASE, state, color);
3249 * gtk_widget_modify_font:
3250 * @widget: a #GtkWidget
3251 * @font_desc: the font description to use
3253 * Set the font to use for a widget. All other style values are left
3254 * untouched. See also gtk_widget_modify_style().
3257 gtk_widget_modify_font (GtkWidget *widget,
3258 PangoFontDescription *font_desc)
3260 GtkRcStyle *rc_style;
3262 g_return_if_fail (GTK_IS_WIDGET (widget));
3263 g_return_if_fail (font_desc != NULL);
3265 rc_style = gtk_widget_get_modifier_style (widget);
3267 if (rc_style->font_desc)
3268 pango_font_description_free (rc_style->font_desc);
3270 rc_style->font_desc = pango_font_description_copy (font_desc);
3272 if (GTK_WIDGET_RC_STYLE (widget))
3273 gtk_widget_set_rc_style (widget);
3277 gtk_widget_direction_changed (GtkWidget *widget,
3278 GtkTextDirection previous_direction)
3280 gtk_widget_queue_resize (widget);
3284 gtk_widget_style_set (GtkWidget *widget,
3285 GtkStyle *previous_style)
3287 if (GTK_WIDGET_REALIZED (widget) &&
3288 !GTK_WIDGET_NO_WINDOW (widget))
3289 gtk_style_set_background (widget->style, widget->window, widget->state);
3293 gtk_widget_set_style_internal (GtkWidget *widget,
3295 gboolean initial_emission)
3297 g_return_if_fail (widget != NULL);
3298 g_return_if_fail (GTK_IS_WIDGET (widget));
3299 g_return_if_fail (style != NULL);
3301 if (widget->style != style || initial_emission)
3303 PangoContext *context = gtk_widget_peek_pango_context (widget);
3305 pango_context_set_font_description (context, style->font_desc);
3308 if (widget->style != style)
3310 GtkStyle *previous_style;
3312 if (GTK_WIDGET_REALIZED (widget))
3314 gtk_widget_reset_shapes (widget);
3315 gtk_style_detach (widget->style);
3318 previous_style = widget->style;
3319 widget->style = style;
3320 gtk_style_ref (widget->style);
3322 if (GTK_WIDGET_REALIZED (widget))
3323 widget->style = gtk_style_attach (widget->style, widget->window);
3325 gtk_signal_emit (GTK_OBJECT (widget),
3326 widget_signals[STYLE_SET],
3327 initial_emission ? NULL : previous_style);
3328 gtk_style_unref (previous_style);
3330 if (widget->parent && !initial_emission)
3332 GtkRequisition old_requisition;
3334 old_requisition = widget->requisition;
3335 gtk_widget_size_request (widget, NULL);
3337 if ((old_requisition.width != widget->requisition.width) ||
3338 (old_requisition.height != widget->requisition.height))
3339 gtk_widget_queue_resize (widget);
3340 else if (GTK_WIDGET_DRAWABLE (widget))
3341 gtk_widget_queue_clear (widget);
3344 else if (initial_emission)
3346 gtk_signal_emit (GTK_OBJECT (widget),
3347 widget_signals[STYLE_SET],
3353 gtk_widget_set_style_recurse (GtkWidget *widget,
3354 gpointer client_data)
3356 if (GTK_WIDGET_RC_STYLE (widget))
3357 gtk_widget_set_rc_style (widget);
3359 if (GTK_IS_CONTAINER (widget))
3360 gtk_container_forall (GTK_CONTAINER (widget),
3361 gtk_widget_set_style_recurse,
3366 gtk_widget_reset_rc_styles (GtkWidget *widget)
3368 g_return_if_fail (widget != NULL);
3369 g_return_if_fail (GTK_IS_WIDGET (widget));
3371 gtk_widget_set_style_recurse (widget, NULL);
3375 gtk_widget_set_default_style (GtkStyle *style)
3377 if (style != gtk_default_style)
3379 if (gtk_default_style)
3380 gtk_style_unref (gtk_default_style);
3381 gtk_default_style = style;
3382 if (gtk_default_style)
3383 gtk_style_ref (gtk_default_style);
3388 gtk_widget_get_default_style (void)
3390 if (!gtk_default_style)
3392 gtk_default_style = gtk_style_new ();
3393 gtk_style_ref (gtk_default_style);
3396 return gtk_default_style;
3400 gtk_widget_push_style (GtkStyle *style)
3402 g_return_if_fail (style != NULL);
3404 gtk_style_ref (style);
3405 style_stack = g_slist_prepend (style_stack, style);
3409 gtk_widget_peek_style (void)
3412 return (GtkStyle*) style_stack->data;
3414 return gtk_widget_get_default_style ();
3418 gtk_widget_pop_style (void)
3425 style_stack = style_stack->next;
3426 gtk_style_unref ((GtkStyle*) tmp->data);
3427 g_slist_free_1 (tmp);
3431 static PangoContext *
3432 gtk_widget_peek_pango_context (GtkWidget *widget)
3434 if (!pango_context_key_id)
3435 pango_context_key_id = g_quark_from_static_string (pango_context_key);
3437 return gtk_object_get_data_by_id (GTK_OBJECT (widget), pango_context_key_id);
3441 * gtk_widget_get_pango_context:
3442 * @widget: a #GtkWidget
3444 * Get a #PangoContext with the appropriate colormap, font description
3445 * and base direction for this widget. Unlike the context returned
3446 * by gtk_widget_create_pango_context(), this context is owned by
3447 * the widget (it can be used as long as widget exists), and will
3448 * be updated to match any changes to the widget's attributes.
3450 * If you create and keep a #PangoLayout using this context, you must
3451 * deal with changes to the context by calling pango_layout_context_changed()
3452 * on the layout in response to the ::style_set and ::direction_set signals
3455 * Return value: the #PangoContext for the widget.
3458 gtk_widget_get_pango_context (GtkWidget *widget)
3460 PangoContext *context;
3462 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3464 if (!pango_context_key_id)
3465 pango_context_key_id = g_quark_from_static_string (pango_context_key);
3467 context = gtk_object_get_data_by_id (GTK_OBJECT (widget), pango_context_key_id);
3470 context = gtk_widget_create_pango_context (GTK_WIDGET (widget));
3471 gtk_object_set_data_by_id_full (GTK_OBJECT (widget), pango_context_key_id, context,
3472 (GDestroyNotify)g_object_unref);
3479 * gtk_widget_create_pango_context:
3480 * @widget: a #PangoWidget
3482 * Create a new pango context with the appropriate colormap,
3483 * font description, and base direction for drawing text for
3484 * this widget. See also gtk_widget_get_pango_context()
3486 * Return value: the new #PangoContext
3489 gtk_widget_create_pango_context (GtkWidget *widget)
3491 PangoContext *context;
3494 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3496 context = gdk_pango_context_get ();
3498 gdk_pango_context_set_colormap (context, gtk_widget_get_colormap (widget));
3499 pango_context_set_base_dir (context,
3500 gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ?
3501 PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL);
3502 pango_context_set_font_description (context, widget->style->font_desc);
3504 lang = gtk_get_default_language ();
3505 pango_context_set_lang (context, lang);
3512 * gtk_widget_create_pango_layout:
3513 * @widget: a #PangoWidget
3514 * @text: text to set on the layout (can be %NULL)
3516 * Create a new #PangoLayout with the appropriate colormap,
3517 * font description, and base direction for drawing text for
3520 * If you keep a #PangoLayout created in this way around, in order
3521 * notify the layout of changes to the base direction or font of this
3522 * widget, you must call pango_layout_context_changed() in response to
3523 * the ::style_set and ::direction_set signals for the widget.
3525 * Return value: the new #PangoLayout
3528 gtk_widget_create_pango_layout (GtkWidget *widget,
3531 PangoLayout *layout;
3532 PangoContext *context;
3534 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3536 context = gtk_widget_get_pango_context (widget);
3537 layout = pango_layout_new (context);
3540 pango_layout_set_text (layout, text, -1);
3546 gtk_widget_render_stock_icon (GtkWidget *widget,
3547 const gchar *stock_id,
3549 const gchar *detail)
3551 GtkIconSet *icon_set;
3554 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3555 g_return_val_if_fail (stock_id != NULL, NULL);
3556 g_return_val_if_fail (size != NULL, NULL);
3558 gtk_widget_ensure_style (widget);
3560 icon_set = gtk_style_lookup_icon_set (widget->style, stock_id);
3562 if (icon_set == NULL)
3565 retval = gtk_icon_set_render_icon (icon_set,
3567 gtk_widget_get_direction (widget),
3568 GTK_WIDGET_STATE (widget),
3576 /*************************************************************
3577 * gtk_widget_set_parent_window:
3578 * Set a non default parent window for widget
3585 *************************************************************/
3588 gtk_widget_set_parent_window (GtkWidget *widget,
3589 GdkWindow *parent_window)
3591 GdkWindow *old_parent_window;
3593 g_return_if_fail (widget != NULL);
3594 g_return_if_fail (GTK_IS_WIDGET (widget));
3596 old_parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
3597 parent_window_key_id);
3599 if (parent_window != old_parent_window)
3601 if (!parent_window_key_id)
3602 parent_window_key_id = g_quark_from_static_string (parent_window_key);
3603 gtk_object_set_data_by_id (GTK_OBJECT (widget), parent_window_key_id,
3605 if (old_parent_window)
3606 gdk_window_unref (old_parent_window);
3608 gdk_window_ref (parent_window);
3612 /*************************************************************
3613 * gtk_widget_get_parent_window:
3614 * Get widget's parent window
3621 *************************************************************/
3624 gtk_widget_get_parent_window (GtkWidget *widget)
3626 GdkWindow *parent_window;
3628 g_return_val_if_fail (widget != NULL, NULL);
3629 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3630 g_return_val_if_fail (widget->parent != NULL, NULL);
3632 parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
3633 parent_window_key_id);
3635 return (parent_window != NULL) ? parent_window : widget->parent->window;
3638 /*****************************************
3639 * gtk_widget_set_uposition:
3644 *****************************************/
3647 gtk_widget_set_uposition (GtkWidget *widget,
3651 GtkWidgetAuxInfo *aux_info;
3653 g_return_if_fail (widget != NULL);
3654 g_return_if_fail (GTK_IS_WIDGET (widget));
3656 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3659 if (!aux_info_key_id)
3660 aux_info_key_id = g_quark_from_static_string (aux_info_key);
3661 aux_info = gtk_widget_aux_info_new ();
3662 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
3665 /* keep this in sync with gtk_window_compute_reposition() */
3672 if (GTK_IS_WINDOW (widget) && (aux_info->x != -1) && (aux_info->y != -1))
3673 gtk_window_reposition (GTK_WINDOW (widget), x, y);
3675 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
3676 gtk_widget_size_allocate (widget, &widget->allocation);
3679 /*****************************************
3680 * gtk_widget_set_usize:
3685 *****************************************/
3688 gtk_widget_set_usize (GtkWidget *widget,
3692 GtkWidgetAuxInfo *aux_info;
3694 g_return_if_fail (widget != NULL);
3695 g_return_if_fail (GTK_IS_WIDGET (widget));
3697 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3700 if (!aux_info_key_id)
3701 aux_info_key_id = g_quark_from_static_string (aux_info_key);
3702 aux_info = gtk_widget_aux_info_new ();
3703 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
3707 aux_info->width = width;
3709 aux_info->height = height;
3711 if (GTK_WIDGET_VISIBLE (widget))
3712 gtk_widget_queue_resize (widget);
3715 /*****************************************
3716 * gtk_widget_set_events:
3721 *****************************************/
3724 gtk_widget_set_events (GtkWidget *widget,
3729 g_return_if_fail (widget != NULL);
3730 g_return_if_fail (GTK_IS_WIDGET (widget));
3731 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3732 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
3734 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3739 eventp = g_new (gint, 1);
3743 event_key_id = g_quark_from_static_string (event_key);
3744 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3749 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3753 /*****************************************
3754 * gtk_widget_add_events:
3759 *****************************************/
3762 gtk_widget_add_events (GtkWidget *widget,
3767 g_return_if_fail (widget != NULL);
3768 g_return_if_fail (GTK_IS_WIDGET (widget));
3769 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3771 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3777 eventp = g_new (gint, 1);
3783 event_key_id = g_quark_from_static_string (event_key);
3784 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3789 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3792 if (GTK_WIDGET_REALIZED (widget))
3794 gdk_window_set_events (widget->window,
3795 gdk_window_get_events (widget->window) | events);
3799 /*****************************************
3800 * gtk_widget_set_extension_events:
3805 *****************************************/
3808 gtk_widget_set_extension_events (GtkWidget *widget,
3809 GdkExtensionMode mode)
3811 GdkExtensionMode *modep;
3813 g_return_if_fail (widget != NULL);
3814 g_return_if_fail (GTK_IS_WIDGET (widget));
3816 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3819 modep = g_new (GdkExtensionMode, 1);
3822 if (!extension_event_key_id)
3823 extension_event_key_id = g_quark_from_static_string (extension_event_key);
3824 gtk_object_set_data_by_id (GTK_OBJECT (widget), extension_event_key_id, modep);
3827 /*****************************************
3828 * gtk_widget_get_toplevel:
3833 *****************************************/
3836 gtk_widget_get_toplevel (GtkWidget *widget)
3838 g_return_val_if_fail (widget != NULL, NULL);
3839 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3841 while (widget->parent)
3842 widget = widget->parent;
3847 /*****************************************
3848 * gtk_widget_get_ancestor:
3853 *****************************************/
3856 gtk_widget_get_ancestor (GtkWidget *widget,
3857 GtkType widget_type)
3859 g_return_val_if_fail (widget != NULL, NULL);
3860 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3862 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type))
3863 widget = widget->parent;
3865 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type)))
3871 /*****************************************
3872 * gtk_widget_get_colormap:
3877 *****************************************/
3880 gtk_widget_get_colormap (GtkWidget *widget)
3882 GdkColormap *colormap;
3884 g_return_val_if_fail (widget != NULL, NULL);
3885 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3889 colormap = gdk_window_get_colormap (widget->window);
3890 /* If window was destroyed previously, we'll get NULL here */
3895 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
3899 return gtk_widget_get_default_colormap ();
3902 /*****************************************
3903 * gtk_widget_get_visual:
3908 *****************************************/
3911 gtk_widget_get_visual (GtkWidget *widget)
3913 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3915 return gdk_colormap_get_visual (gtk_widget_get_colormap (widget));
3918 /*****************************************
3919 * gtk_widget_set_colormap:
3920 * Set the colormap for the widget to the given
3921 * value. Widget must not have been previously
3922 * realized. This probably should only be used
3923 * from an init() function.
3928 *****************************************/
3931 gtk_widget_set_colormap (GtkWidget *widget, GdkColormap *colormap)
3933 g_return_if_fail (widget != NULL);
3934 g_return_if_fail (GTK_IS_WIDGET (widget));
3935 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
3936 g_return_if_fail (colormap != NULL);
3938 /* FIXME: reference count the colormap.
3941 gtk_object_set_data (GTK_OBJECT (widget),
3946 /*****************************************
3947 * gtk_widget_get_events:
3952 *****************************************/
3955 gtk_widget_get_events (GtkWidget *widget)
3959 g_return_val_if_fail (widget != NULL, 0);
3960 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
3962 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3969 /*****************************************
3970 * gtk_widget_get_extension_events:
3975 *****************************************/
3978 gtk_widget_get_extension_events (GtkWidget *widget)
3980 GdkExtensionMode *mode;
3982 g_return_val_if_fail (widget != NULL, 0);
3983 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
3985 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3992 /*****************************************
3993 * gtk_widget_get_pointer:
3998 *****************************************/
4001 gtk_widget_get_pointer (GtkWidget *widget,
4005 g_return_if_fail (widget != NULL);
4006 g_return_if_fail (GTK_IS_WIDGET (widget));
4013 if (GTK_WIDGET_REALIZED (widget))
4015 gdk_window_get_pointer (widget->window, x, y, NULL);
4017 if (GTK_WIDGET_NO_WINDOW (widget))
4020 *x -= widget->allocation.x;
4022 *y -= widget->allocation.y;
4027 /*****************************************
4028 * gtk_widget_is_ancestor:
4033 *****************************************/
4036 gtk_widget_is_ancestor (GtkWidget *widget,
4037 GtkWidget *ancestor)
4039 g_return_val_if_fail (widget != NULL, FALSE);
4040 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
4041 g_return_val_if_fail (ancestor != NULL, FALSE);
4045 if (widget->parent == ancestor)
4047 widget = widget->parent;
4053 static GQuark quark_composite_name = 0;
4056 gtk_widget_set_composite_name (GtkWidget *widget,
4059 g_return_if_fail (widget != NULL);
4060 g_return_if_fail (GTK_IS_WIDGET (widget));
4061 g_return_if_fail (GTK_WIDGET_COMPOSITE_CHILD (widget));
4062 g_return_if_fail (name != NULL);
4064 if (!quark_composite_name)
4065 quark_composite_name = g_quark_from_static_string ("gtk-composite-name");
4067 gtk_object_set_data_by_id_full (GTK_OBJECT (widget),
4068 quark_composite_name,
4074 gtk_widget_get_composite_name (GtkWidget *widget)
4076 g_return_val_if_fail (widget != NULL, NULL);
4077 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
4079 if (GTK_WIDGET_COMPOSITE_CHILD (widget) && widget->parent)
4080 return gtk_container_child_composite_name (GTK_CONTAINER (widget->parent),
4087 gtk_widget_push_composite_child (void)
4089 composite_child_stack++;
4093 gtk_widget_pop_composite_child (void)
4095 if (composite_child_stack)
4096 composite_child_stack--;
4099 /*****************************************
4100 * gtk_widget_push_colormap:
4105 *****************************************/
4108 gtk_widget_push_colormap (GdkColormap *cmap)
4110 g_return_if_fail (cmap != NULL);
4112 colormap_stack = g_slist_prepend (colormap_stack, cmap);
4115 /*****************************************
4116 * gtk_widget_pop_colormap:
4121 *****************************************/
4124 gtk_widget_pop_colormap (void)
4130 tmp = colormap_stack;
4131 colormap_stack = colormap_stack->next;
4132 g_slist_free_1 (tmp);
4136 /*****************************************
4137 * gtk_widget_set_default_colormap:
4142 *****************************************/
4145 gtk_widget_set_default_colormap (GdkColormap *colormap)
4147 if (default_colormap != colormap)
4149 if (default_colormap)
4150 gdk_colormap_unref (default_colormap);
4151 default_colormap = colormap;
4152 if (default_colormap)
4153 gdk_colormap_ref (default_colormap);
4157 /*****************************************
4158 * gtk_widget_get_default_colormap:
4163 *****************************************/
4166 gtk_widget_get_default_colormap (void)
4168 if (!default_colormap)
4169 default_colormap = gdk_colormap_get_system ();
4171 return default_colormap;
4174 /*****************************************
4175 * gtk_widget_get_default_visual:
4180 *****************************************/
4183 gtk_widget_get_default_visual (void)
4185 return gdk_colormap_get_visual (gtk_widget_get_default_colormap ());
4189 gtk_widget_emit_direction_changed (GtkWidget *widget,
4190 GtkTextDirection old_dir)
4192 PangoContext *context = gtk_widget_peek_pango_context (widget);
4195 pango_context_set_base_dir (context,
4196 gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ?
4197 PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL);
4199 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DIRECTION_CHANGED], old_dir);
4203 * gtk_widget_set_direction:
4204 * @widget: a #GtkWidget
4205 * @dir: the new direction
4207 * Set the reading direction on a particular widget. This direction
4208 * controls the primary direction for widgets containing text,
4209 * and also the direction in which the children of a container are
4210 * packed. The ability to set the direction is present in order
4211 * so that correct localization into languages with right-to-left
4212 * reading directions can be done. Generally, applications will
4213 * let the default reading direction present, except for containers
4214 * where the containers are arranged in an order that is explicitely
4215 * visual rather than logical (such as buttons for text justificiation).
4217 * If the direction is set to %GTK_TEXT_DIR_NONE, then the value
4218 * set by gtk_widget_set_default_direction() will be used.
4221 gtk_widget_set_direction (GtkWidget *widget,
4222 GtkTextDirection dir)
4224 GtkTextDirection old_dir;
4226 g_return_if_fail (widget != NULL);
4227 g_return_if_fail (GTK_IS_WIDGET (widget));
4228 g_return_if_fail (dir >= GTK_TEXT_DIR_NONE && dir <= GTK_TEXT_DIR_RTL);
4230 old_dir = gtk_widget_get_direction (widget);
4232 if (dir == GTK_TEXT_DIR_NONE)
4233 GTK_PRIVATE_UNSET_FLAG (widget, GTK_DIRECTION_SET);
4236 GTK_PRIVATE_SET_FLAG (widget, GTK_DIRECTION_SET);
4237 if (dir == GTK_TEXT_DIR_LTR)
4238 GTK_PRIVATE_SET_FLAG (widget, GTK_DIRECTION_LTR);
4240 GTK_PRIVATE_UNSET_FLAG (widget, GTK_DIRECTION_LTR);
4243 if (old_dir != gtk_widget_get_direction (widget))
4244 gtk_widget_emit_direction_changed (widget, old_dir);
4248 * gtk_widget_get_direction:
4249 * @widget: a #GtkWidget
4251 * Get the reading direction for a particular widget. See
4252 * gtk_widget_set_direction().
4254 * Return value: the reading direction for the widget.
4257 gtk_widget_get_direction (GtkWidget *widget)
4259 g_return_val_if_fail (widget != NULL, GTK_TEXT_DIR_LTR);
4260 g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_TEXT_DIR_LTR);
4262 if (GTK_WIDGET_DIRECTION_SET (widget))
4263 return GTK_WIDGET_DIRECTION_LTR (widget) ? GTK_TEXT_DIR_LTR : GTK_TEXT_DIR_RTL;
4265 return gtk_default_direction;
4269 gtk_widget_set_default_direction_recurse (GtkWidget *widget, gpointer data)
4271 GtkTextDirection old_dir = GPOINTER_TO_UINT (data);
4273 g_object_ref (G_OBJECT (widget));
4275 if (!GTK_WIDGET_DIRECTION_SET (widget))
4276 gtk_widget_emit_direction_changed (widget, old_dir);
4278 if (GTK_IS_CONTAINER (widget))
4279 gtk_container_forall (GTK_CONTAINER (widget),
4280 gtk_widget_set_default_direction_recurse,
4283 g_object_unref (G_OBJECT (widget));
4287 * gtk_widget_set_default_direction:
4288 * @dir: the new default direction. This cannot be
4289 * %GTK_TEXT_DIR_NONE.
4291 * Set the default reading direction for widgets where the
4292 * direction has not been explicitly set by gtk_widget_set_direction().
4295 gtk_widget_set_default_direction (GtkTextDirection dir)
4297 g_return_if_fail (dir == GTK_TEXT_DIR_RTL || dir == GTK_TEXT_DIR_LTR);
4299 if (dir != gtk_default_direction)
4301 GList *toplevels, *tmp_list;
4302 GtkTextDirection old_dir = gtk_default_direction;
4304 gtk_default_direction = dir;
4306 tmp_list = toplevels = gtk_window_list_toplevels ();
4309 gtk_widget_set_default_direction_recurse (tmp_list->data,
4310 GUINT_TO_POINTER (old_dir));
4311 g_object_unref (tmp_list->data);
4312 tmp_list = tmp_list->next;
4315 g_list_free (toplevels);
4321 * gtk_widget_get_default_direction:
4323 * Return value: the current default direction. See
4324 * gtk_widget_set_direction().
4327 gtk_widget_get_default_direction (void)
4329 return gtk_default_direction;
4333 gtk_widget_shutdown (GObject *object)
4335 GtkWidget *widget = GTK_WIDGET (object);
4338 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
4340 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
4341 if (GTK_WIDGET_REALIZED (widget))
4342 gtk_widget_unrealize (widget);
4344 G_OBJECT_CLASS (parent_class)->shutdown (object);
4348 gtk_widget_real_destroy (GtkObject *object)
4351 GtkStyle *saved_style;
4353 /* gtk_object_destroy() will already hold a refcount on object
4355 widget = GTK_WIDGET (object);
4357 gtk_grab_remove (widget);
4358 gtk_selection_remove_all (widget);
4360 saved_style = gtk_object_get_data_by_id (object, saved_default_style_key_id);
4363 gtk_style_unref (saved_style);
4364 gtk_object_remove_data_by_id (object, saved_default_style_key_id);
4367 gtk_style_unref (widget->style);
4368 widget->style = gtk_widget_peek_style ();
4369 gtk_style_ref (widget->style);
4371 GTK_OBJECT_CLASS (parent_class)->destroy (object);
4375 gtk_widget_finalize (GObject *object)
4377 GtkWidget *widget = GTK_WIDGET (object);
4378 GtkWidgetAuxInfo *aux_info;
4380 GdkExtensionMode *mode;
4381 GtkStyle *saved_style;
4383 gtk_grab_remove (widget);
4384 gtk_selection_remove_all (widget);
4386 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
4389 gtk_style_unref (saved_style);
4390 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
4393 gtk_style_unref (widget->style);
4394 widget->style = NULL;
4397 g_free (widget->name);
4399 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
4401 gtk_widget_aux_info_destroy (aux_info);
4403 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
4407 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
4411 G_OBJECT_CLASS (parent_class)->finalize (object);
4414 /*****************************************
4415 * gtk_widget_real_map:
4420 *****************************************/
4423 gtk_widget_real_map (GtkWidget *widget)
4425 g_return_if_fail (GTK_IS_WIDGET (widget));
4426 g_return_if_fail (GTK_WIDGET_REALIZED (widget) == TRUE);
4428 if (!GTK_WIDGET_MAPPED (widget))
4430 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
4432 if (!GTK_WIDGET_NO_WINDOW (widget))
4433 gdk_window_show (widget->window);
4437 /*****************************************
4438 * gtk_widget_real_unmap:
4443 *****************************************/
4446 gtk_widget_real_unmap (GtkWidget *widget)
4448 g_return_if_fail (widget != NULL);
4449 g_return_if_fail (GTK_IS_WIDGET (widget));
4451 if (GTK_WIDGET_MAPPED (widget))
4453 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
4455 if (!GTK_WIDGET_NO_WINDOW (widget))
4456 gdk_window_hide (widget->window);
4460 /*****************************************
4461 * gtk_widget_real_realize:
4466 *****************************************/
4469 gtk_widget_real_realize (GtkWidget *widget)
4471 g_return_if_fail (widget != NULL);
4472 g_return_if_fail (GTK_IS_WIDGET (widget));
4473 g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
4475 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
4478 widget->window = gtk_widget_get_parent_window (widget);
4479 gdk_window_ref (widget->window);
4481 widget->style = gtk_style_attach (widget->style, widget->window);
4484 /*****************************************
4485 * gtk_widget_real_unrealize:
4490 *****************************************/
4493 gtk_widget_real_unrealize (GtkWidget *widget)
4495 g_return_if_fail (widget != NULL);
4496 g_return_if_fail (GTK_IS_WIDGET (widget));
4498 if (GTK_WIDGET_MAPPED (widget))
4499 gtk_widget_real_unmap (widget);
4501 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
4503 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT (widget)->klass->type));
4506 /* We must do unrealize child widget BEFORE container widget.
4507 * gdk_window_destroy() destroys specified xwindow and its sub-xwindows.
4508 * So, unrealizing container widget bofore its children causes the problem
4509 * (for example, gdk_ic_destroy () with destroyed window causes crash. )
4512 if (GTK_IS_CONTAINER (widget))
4513 gtk_container_forall (GTK_CONTAINER (widget),
4514 (GtkCallback) gtk_widget_unrealize,
4517 gtk_style_detach (widget->style);
4518 if (!GTK_WIDGET_NO_WINDOW (widget))
4520 gdk_window_set_user_data (widget->window, NULL);
4521 gdk_window_destroy (widget->window);
4522 widget->window = NULL;
4526 gdk_window_unref (widget->window);
4527 widget->window = NULL;
4530 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED);
4534 gtk_widget_real_draw (GtkWidget *widget,
4537 GdkEventExpose event;
4539 g_return_if_fail (widget != NULL);
4540 g_return_if_fail (GTK_IS_WIDGET (widget));
4541 g_return_if_fail (area != NULL);
4543 if (GTK_WIDGET_DRAWABLE (widget))
4545 event.type = GDK_EXPOSE;
4546 event.send_event = TRUE;
4547 event.window = widget->window;
4551 gdk_window_ref (event.window);
4552 gtk_widget_event (widget, (GdkEvent*) &event);
4553 gdk_window_unref (event.window);
4558 gtk_widget_real_size_request (GtkWidget *widget,
4559 GtkRequisition *requisition)
4561 g_return_if_fail (widget != NULL);
4562 g_return_if_fail (GTK_IS_WIDGET (widget));
4564 requisition->width = widget->requisition.width;
4565 requisition->height = widget->requisition.height;
4568 /*****************************************
4569 * gtk_widget_peek_colormap:
4574 *****************************************/
4577 gtk_widget_peek_colormap (void)
4580 return (GdkColormap*) colormap_stack->data;
4581 return gtk_widget_get_default_colormap ();
4585 gtk_widget_propagate_state (GtkWidget *widget,
4590 /* don't call this function with state==GTK_STATE_INSENSITIVE,
4591 * parent_sensitive==TRUE on a sensitive widget
4594 old_state = GTK_WIDGET_STATE (widget);
4596 if (data->parent_sensitive)
4598 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
4600 if (GTK_WIDGET_IS_SENSITIVE (widget))
4602 if (data->state_restoration)
4603 GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget);
4605 GTK_WIDGET_STATE (widget) = data->state;
4609 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
4610 if (!data->state_restoration &&
4611 data->state != GTK_STATE_INSENSITIVE)
4612 GTK_WIDGET_SAVED_STATE (widget) = data->state;
4617 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
4618 if (!data->state_restoration)
4620 if (data->state != GTK_STATE_INSENSITIVE)
4621 GTK_WIDGET_SAVED_STATE (widget) = data->state;
4623 else if (GTK_WIDGET_STATE (widget) != GTK_STATE_INSENSITIVE)
4624 GTK_WIDGET_SAVED_STATE (widget) = GTK_WIDGET_STATE (widget);
4625 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
4628 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
4632 window = gtk_widget_get_ancestor (widget, GTK_TYPE_WINDOW);
4634 gtk_window_set_focus (GTK_WINDOW (window), NULL);
4637 if (old_state != GTK_WIDGET_STATE (widget))
4639 gtk_widget_ref (widget);
4640 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
4642 if (GTK_IS_CONTAINER (widget))
4644 data->parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget) != FALSE);
4645 data->state = GTK_WIDGET_STATE (widget);
4646 if (data->use_forall)
4647 gtk_container_forall (GTK_CONTAINER (widget),
4648 (GtkCallback) gtk_widget_propagate_state,
4651 gtk_container_foreach (GTK_CONTAINER (widget),
4652 (GtkCallback) gtk_widget_propagate_state,
4655 gtk_widget_unref (widget);
4659 /*****************************************
4660 * gtk_widget_aux_info_new:
4665 *****************************************/
4667 static GtkWidgetAuxInfo*
4668 gtk_widget_aux_info_new (void)
4670 GtkWidgetAuxInfo *aux_info;
4672 if (!aux_info_mem_chunk)
4673 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
4674 sizeof (GtkWidgetAuxInfo),
4675 1024, G_ALLOC_AND_FREE);
4677 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
4681 aux_info->width = 0;
4682 aux_info->height = 0;
4687 /*****************************************
4688 * gtk_widget_aux_info_destroy:
4693 *****************************************/
4696 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
4698 g_return_if_fail (aux_info != NULL);
4700 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
4704 gtk_widget_shape_info_destroy (GtkWidgetShapeInfo *info)
4706 gdk_drawable_unref (info->shape_mask);
4710 /*****************************************
4711 * gtk_widget_shape_combine_mask:
4712 * set a shape for this widgets' gdk window, this allows for
4713 * transparent windows etc., see gdk_window_shape_combine_mask
4714 * for more information
4719 *****************************************/
4721 gtk_widget_shape_combine_mask (GtkWidget *widget,
4722 GdkBitmap *shape_mask,
4726 GtkWidgetShapeInfo* shape_info;
4728 g_return_if_fail (widget != NULL);
4729 g_return_if_fail (GTK_IS_WIDGET (widget));
4730 /* set_shape doesn't work on widgets without gdk window */
4731 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
4735 GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4738 gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
4740 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
4744 GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4746 shape_info = g_new (GtkWidgetShapeInfo, 1);
4747 gtk_object_set_data_full (GTK_OBJECT (widget), shape_info_key, shape_info,
4748 (GDestroyNotify)gtk_widget_shape_info_destroy);
4750 shape_info->shape_mask = gdk_drawable_ref (shape_mask);
4751 shape_info->offset_x = offset_x;
4752 shape_info->offset_y = offset_y;
4754 /* set shape if widget has a gdk window allready.
4755 * otherwise the shape is scheduled to be set by gtk_widget_realize.
4758 gdk_window_shape_combine_mask (widget->window, shape_mask,
4759 offset_x, offset_y);
4764 gtk_reset_shapes_recurse (GtkWidget *widget,
4770 gdk_window_get_user_data (window, &data);
4774 gdk_window_shape_combine_mask (window, NULL, 0, 0);
4775 for (list = gdk_window_peek_children (window); list; list = list->next)
4776 gtk_reset_shapes_recurse (widget, list->data);
4780 gtk_widget_reset_shapes (GtkWidget *widget)
4782 g_return_if_fail (widget != NULL);
4783 g_return_if_fail (GTK_IS_WIDGET (widget));
4784 g_return_if_fail (GTK_WIDGET_REALIZED (widget));
4786 if (!GTK_WIDGET_HAS_SHAPE_MASK (widget))
4787 gtk_reset_shapes_recurse (widget, widget->window);
4791 gtk_widget_ref (GtkWidget *widget)
4793 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
4795 return (GtkWidget*) g_object_ref ((GObject*) widget);
4799 gtk_widget_unref (GtkWidget *widget)
4801 g_return_if_fail (GTK_IS_WIDGET (widget));
4803 g_object_unref ((GObject*) widget);
4807 gtk_widget_path (GtkWidget *widget,
4808 guint *path_length_p,
4810 gchar **path_reversed_p)
4812 static gchar *rev_path = NULL;
4813 static guint path_len = 0;
4816 g_return_if_fail (widget != NULL);
4817 g_return_if_fail (GTK_IS_WIDGET (widget));
4826 string = gtk_widget_get_name (widget);
4827 l = strlen (string);
4828 while (path_len <= len + l + 1)
4830 path_len += INIT_PATH_SIZE;
4831 rev_path = g_realloc (rev_path, path_len);
4839 widget = widget->parent;
4842 rev_path[len++] = '.';
4844 rev_path[len++] = 0;
4849 *path_length_p = len - 1;
4850 if (path_reversed_p)
4851 *path_reversed_p = g_strdup (rev_path);
4854 *path_p = g_strdup (rev_path);
4855 g_strreverse (*path_p);
4860 gtk_widget_class_path (GtkWidget *widget,
4861 guint *path_length_p,
4863 gchar **path_reversed_p)
4865 static gchar *rev_path = NULL;
4866 static guint path_len = 0;
4869 g_return_if_fail (widget != NULL);
4870 g_return_if_fail (GTK_IS_WIDGET (widget));
4879 string = gtk_type_name (GTK_WIDGET_TYPE (widget));
4880 l = strlen (string);
4881 while (path_len <= len + l + 1)
4883 path_len += INIT_PATH_SIZE;
4884 rev_path = g_realloc (rev_path, path_len);
4892 widget = widget->parent;
4895 rev_path[len++] = '.';
4897 rev_path[len++] = 0;
4902 *path_length_p = len - 1;
4903 if (path_reversed_p)
4904 *path_reversed_p = g_strdup (rev_path);
4907 *path_p = g_strdup (rev_path);
4908 g_strreverse (*path_p);