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"
33 #include "gtkselection.h"
34 #include "gtksignal.h"
35 #include "gtkwidget.h"
36 #include "gtkwindow.h"
37 #include "gtkbindings.h"
38 #include "gtkprivate.h"
40 #include "gdk/gdkprivate.h" /* Used in gtk_reset_shapes_recurse to avoid copy */
43 #define WIDGET_CLASS(w) GTK_WIDGET_GET_CLASS (w)
44 #define INIT_PATH_SIZE (512)
83 PROPERTY_NOTIFY_EVENT,
84 SELECTION_CLEAR_EVENT,
85 SELECTION_REQUEST_EVENT,
86 SELECTION_NOTIFY_EVENT,
101 VISIBILITY_NOTIFY_EVENT,
121 ARG_RECEIVES_DEFAULT,
128 typedef struct _GtkStateData GtkStateData;
133 guint state_restoration : 1;
134 guint parent_sensitive : 1;
135 guint use_forall : 1;
138 static void gtk_widget_class_init (GtkWidgetClass *klass);
139 static void gtk_widget_init (GtkWidget *widget);
140 static void gtk_widget_set_arg (GtkObject *object,
143 static void gtk_widget_get_arg (GtkObject *object,
146 static void gtk_widget_shutdown (GObject *object);
147 static void gtk_widget_real_destroy (GtkObject *object);
148 static void gtk_widget_finalize (GObject *object);
149 static void gtk_widget_real_show (GtkWidget *widget);
150 static void gtk_widget_real_hide (GtkWidget *widget);
151 static void gtk_widget_real_map (GtkWidget *widget);
152 static void gtk_widget_real_unmap (GtkWidget *widget);
153 static void gtk_widget_real_realize (GtkWidget *widget);
154 static void gtk_widget_real_unrealize (GtkWidget *widget);
155 static void gtk_widget_real_draw (GtkWidget *widget,
157 static void gtk_widget_real_size_request (GtkWidget *widget,
158 GtkRequisition *requisition);
159 static void gtk_widget_real_size_allocate (GtkWidget *widget,
160 GtkAllocation *allocation);
161 static gint gtk_widget_real_key_press_event (GtkWidget *widget,
163 static gint gtk_widget_real_key_release_event (GtkWidget *widget,
165 static void gtk_widget_style_set (GtkWidget *widget,
166 GtkStyle *previous_style);
167 static void gtk_widget_direction_changed (GtkWidget *widget,
168 GtkTextDirection previous_direction);
169 static void gtk_widget_real_grab_focus (GtkWidget *focus_widget);
171 static GdkColormap* gtk_widget_peek_colormap (void);
172 static GtkStyle* gtk_widget_peek_style (void);
173 static PangoContext *gtk_widget_peek_pango_context (GtkWidget *widget);
175 static void gtk_widget_reparent_container_child (GtkWidget *widget,
176 gpointer client_data);
177 static void gtk_widget_propagate_state (GtkWidget *widget,
179 static void gtk_widget_set_style_internal (GtkWidget *widget,
181 gboolean initial_emission);
182 static void gtk_widget_set_style_recurse (GtkWidget *widget,
183 gpointer client_data);
185 static GtkWidgetAuxInfo* gtk_widget_aux_info_new (void);
186 static void gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
188 static gpointer parent_class = NULL;
189 static guint widget_signals[LAST_SIGNAL] = { 0 };
191 static GMemChunk *aux_info_mem_chunk = NULL;
193 static GdkColormap *default_colormap = NULL;
194 static GtkStyle *gtk_default_style = NULL;
196 static GSList *colormap_stack = NULL;
197 static GSList *style_stack = NULL;
198 static guint composite_child_stack = 0;
200 static const gchar *aux_info_key = "gtk-aux-info";
201 static guint aux_info_key_id = 0;
202 static const gchar *event_key = "gtk-event-mask";
203 static guint event_key_id = 0;
204 static const gchar *extension_event_key = "gtk-extension-event-mode";
205 static guint extension_event_key_id = 0;
206 static const gchar *parent_window_key = "gtk-parent-window";
207 static guint parent_window_key_id = 0;
208 static const gchar *saved_default_style_key = "gtk-saved-default-style";
209 static guint saved_default_style_key_id = 0;
210 static const gchar *shape_info_key = "gtk-shape-info";
211 static const gchar *colormap_key = "gtk-colormap";
212 static const gchar *pango_context_key = "gtk-pango-context";
213 static guint pango_context_key_id = 0;
215 static const gchar *rc_style_key = "gtk-rc-style";
216 static guint rc_style_key_id = 0;
218 static GtkTextDirection gtk_default_direction = GTK_TEXT_DIR_LTR;
220 /*****************************************
221 * gtk_widget_get_type:
226 *****************************************/
229 gtk_widget_get_type (void)
231 static GtkType widget_type = 0;
235 static const GtkTypeInfo widget_info =
239 sizeof (GtkWidgetClass),
240 (GtkClassInitFunc) gtk_widget_class_init,
241 (GtkObjectInitFunc) gtk_widget_init,
242 /* reserved_1 */ NULL,
243 /* reserved_2 */ NULL,
244 (GtkClassInitFunc) NULL,
247 widget_type = gtk_type_unique (GTK_TYPE_OBJECT, &widget_info);
253 /*****************************************
254 * gtk_widget_class_init:
259 *****************************************/
262 gtk_widget_debug_msg (GtkWidget *widget,
265 fprintf (stderr, "Gtk-DEBUG: %s\n", string);
269 gtk_widget_class_init (GtkWidgetClass *klass)
271 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
272 GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
274 parent_class = gtk_type_class (GTK_TYPE_OBJECT);
276 gobject_class->shutdown = gtk_widget_shutdown;
277 gobject_class->finalize = gtk_widget_finalize;
279 object_class->set_arg = gtk_widget_set_arg;
280 object_class->get_arg = gtk_widget_get_arg;
281 object_class->destroy = gtk_widget_real_destroy;
283 klass->activate_signal = 0;
284 klass->set_scroll_adjustments_signal = 0;
285 klass->show = gtk_widget_real_show;
286 klass->show_all = gtk_widget_show;
287 klass->hide = gtk_widget_real_hide;
288 klass->hide_all = gtk_widget_hide;
289 klass->map = gtk_widget_real_map;
290 klass->unmap = gtk_widget_real_unmap;
291 klass->realize = gtk_widget_real_realize;
292 klass->unrealize = gtk_widget_real_unrealize;
293 klass->draw = gtk_widget_real_draw;
294 klass->draw_focus = NULL;
295 klass->size_request = gtk_widget_real_size_request;
296 klass->size_allocate = gtk_widget_real_size_allocate;
297 klass->state_changed = NULL;
298 klass->parent_set = NULL;
299 klass->style_set = gtk_widget_style_set;
300 klass->direction_changed = gtk_widget_direction_changed;
301 klass->add_accelerator = (void*) gtk_accel_group_handle_add;
302 klass->remove_accelerator = (void*) gtk_accel_group_handle_remove;
303 klass->grab_focus = gtk_widget_real_grab_focus;
305 klass->button_press_event = NULL;
306 klass->button_release_event = NULL;
307 klass->motion_notify_event = NULL;
308 klass->delete_event = NULL;
309 klass->destroy_event = NULL;
310 klass->expose_event = NULL;
311 klass->key_press_event = gtk_widget_real_key_press_event;
312 klass->key_release_event = gtk_widget_real_key_release_event;
313 klass->enter_notify_event = NULL;
314 klass->leave_notify_event = NULL;
315 klass->configure_event = NULL;
316 klass->focus_in_event = NULL;
317 klass->focus_out_event = NULL;
318 klass->map_event = NULL;
319 klass->unmap_event = NULL;
320 klass->property_notify_event = gtk_selection_property_notify;
321 klass->selection_clear_event = gtk_selection_clear;
322 klass->selection_request_event = gtk_selection_request;
323 klass->selection_notify_event = gtk_selection_notify;
324 klass->selection_received = NULL;
325 klass->proximity_in_event = NULL;
326 klass->proximity_out_event = NULL;
327 klass->drag_begin = NULL;
328 klass->drag_end = NULL;
329 klass->drag_data_delete = NULL;
330 klass->drag_leave = NULL;
331 klass->drag_motion = NULL;
332 klass->drag_drop = NULL;
333 klass->drag_data_received = NULL;
335 klass->no_expose_event = NULL;
337 klass->debug_msg = gtk_widget_debug_msg;
339 gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
340 gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
341 gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
342 gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
343 gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
344 gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
345 gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
346 gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
347 gtk_object_add_arg_type ("GtkWidget::app_paintable", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_APP_PAINTABLE);
348 gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
349 gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
350 gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
351 gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
352 gtk_object_add_arg_type ("GtkWidget::receives_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_RECEIVES_DEFAULT);
353 gtk_object_add_arg_type ("GtkWidget::composite_child", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_COMPOSITE_CHILD);
354 gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
355 gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
356 gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
358 widget_signals[SHOW] =
359 gtk_signal_new ("show",
361 GTK_CLASS_TYPE (object_class),
362 GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
363 gtk_marshal_NONE__NONE,
365 widget_signals[HIDE] =
366 gtk_signal_new ("hide",
368 GTK_CLASS_TYPE (object_class),
369 GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
370 gtk_marshal_NONE__NONE,
372 widget_signals[MAP] =
373 gtk_signal_new ("map",
375 GTK_CLASS_TYPE (object_class),
376 GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
377 gtk_marshal_NONE__NONE,
379 widget_signals[UNMAP] =
380 gtk_signal_new ("unmap",
382 GTK_CLASS_TYPE (object_class),
383 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
384 gtk_marshal_NONE__NONE,
386 widget_signals[REALIZE] =
387 gtk_signal_new ("realize",
389 GTK_CLASS_TYPE (object_class),
390 GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
391 gtk_marshal_NONE__NONE,
393 widget_signals[UNREALIZE] =
394 gtk_signal_new ("unrealize",
396 GTK_CLASS_TYPE (object_class),
397 GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
398 gtk_marshal_NONE__NONE,
400 widget_signals[DRAW] =
401 gtk_signal_new ("draw",
403 GTK_CLASS_TYPE (object_class),
404 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
405 gtk_marshal_NONE__POINTER,
408 widget_signals[DRAW_FOCUS] =
409 gtk_signal_new ("draw_focus",
411 GTK_CLASS_TYPE (object_class),
412 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
413 gtk_marshal_NONE__NONE,
415 widget_signals[DRAW_DEFAULT] =
416 gtk_signal_new ("draw_default",
418 GTK_CLASS_TYPE (object_class),
419 GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
420 gtk_marshal_NONE__NONE,
422 widget_signals[SIZE_REQUEST] =
423 gtk_signal_new ("size_request",
425 GTK_CLASS_TYPE (object_class),
426 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
427 gtk_marshal_NONE__POINTER,
430 widget_signals[SIZE_ALLOCATE] =
431 gtk_signal_new ("size_allocate",
433 GTK_CLASS_TYPE (object_class),
434 GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
435 gtk_marshal_NONE__POINTER,
438 widget_signals[STATE_CHANGED] =
439 gtk_signal_new ("state_changed",
441 GTK_CLASS_TYPE (object_class),
442 GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
443 gtk_marshal_NONE__UINT,
445 GTK_TYPE_STATE_TYPE);
446 widget_signals[PARENT_SET] =
447 gtk_signal_new ("parent_set",
449 GTK_CLASS_TYPE (object_class),
450 GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
451 gtk_marshal_NONE__OBJECT,
454 widget_signals[STYLE_SET] =
455 gtk_signal_new ("style_set",
457 GTK_CLASS_TYPE (object_class),
458 GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
459 gtk_marshal_NONE__POINTER,
462 widget_signals[DIRECTION_CHANGED] =
463 gtk_signal_new ("direction_changed",
465 GTK_CLASS_TYPE (object_class),
466 GTK_SIGNAL_OFFSET (GtkWidgetClass, direction_changed),
467 gtk_marshal_NONE__UINT,
469 GTK_TYPE_TEXT_DIRECTION);
470 widget_signals[ADD_ACCELERATOR] =
471 gtk_accel_group_create_add (GTK_CLASS_TYPE (object_class), GTK_RUN_LAST,
472 GTK_SIGNAL_OFFSET (GtkWidgetClass, add_accelerator));
473 widget_signals[REMOVE_ACCELERATOR] =
474 gtk_accel_group_create_remove (GTK_CLASS_TYPE (object_class), GTK_RUN_LAST,
475 GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));
476 widget_signals[GRAB_FOCUS] =
477 gtk_signal_new ("grab_focus",
478 GTK_RUN_LAST | GTK_RUN_ACTION,
479 GTK_CLASS_TYPE (object_class),
480 GTK_SIGNAL_OFFSET (GtkWidgetClass, grab_focus),
481 gtk_marshal_NONE__NONE,
483 widget_signals[EVENT] =
484 gtk_signal_new ("event",
486 GTK_CLASS_TYPE (object_class),
487 GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
488 gtk_marshal_BOOL__POINTER,
491 widget_signals[BUTTON_PRESS_EVENT] =
492 gtk_signal_new ("button_press_event",
494 GTK_CLASS_TYPE (object_class),
495 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
496 gtk_marshal_BOOL__POINTER,
499 widget_signals[BUTTON_RELEASE_EVENT] =
500 gtk_signal_new ("button_release_event",
502 GTK_CLASS_TYPE (object_class),
503 GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
504 gtk_marshal_BOOL__POINTER,
507 widget_signals[SCROLL_EVENT] =
508 gtk_signal_new ("scroll_event",
510 GTK_CLASS_TYPE (object_class),
511 GTK_SIGNAL_OFFSET (GtkWidgetClass, scroll_event),
512 gtk_marshal_BOOL__POINTER,
515 widget_signals[MOTION_NOTIFY_EVENT] =
516 gtk_signal_new ("motion_notify_event",
518 GTK_CLASS_TYPE (object_class),
519 GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
520 gtk_marshal_BOOL__POINTER,
523 widget_signals[DELETE_EVENT] =
524 gtk_signal_new ("delete_event",
526 GTK_CLASS_TYPE (object_class),
527 GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
528 gtk_marshal_BOOL__POINTER,
531 widget_signals[DESTROY_EVENT] =
532 gtk_signal_new ("destroy_event",
534 GTK_CLASS_TYPE (object_class),
535 GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
536 gtk_marshal_BOOL__POINTER,
539 widget_signals[EXPOSE_EVENT] =
540 gtk_signal_new ("expose_event",
542 GTK_CLASS_TYPE (object_class),
543 GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
544 gtk_marshal_BOOL__POINTER,
547 widget_signals[KEY_PRESS_EVENT] =
548 gtk_signal_new ("key_press_event",
550 GTK_CLASS_TYPE (object_class),
551 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
552 gtk_marshal_BOOL__POINTER,
555 widget_signals[KEY_RELEASE_EVENT] =
556 gtk_signal_new ("key_release_event",
558 GTK_CLASS_TYPE (object_class),
559 GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
560 gtk_marshal_BOOL__POINTER,
563 widget_signals[ENTER_NOTIFY_EVENT] =
564 gtk_signal_new ("enter_notify_event",
566 GTK_CLASS_TYPE (object_class),
567 GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
568 gtk_marshal_BOOL__POINTER,
571 widget_signals[LEAVE_NOTIFY_EVENT] =
572 gtk_signal_new ("leave_notify_event",
574 GTK_CLASS_TYPE (object_class),
575 GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
576 gtk_marshal_BOOL__POINTER,
579 widget_signals[CONFIGURE_EVENT] =
580 gtk_signal_new ("configure_event",
582 GTK_CLASS_TYPE (object_class),
583 GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
584 gtk_marshal_BOOL__POINTER,
587 widget_signals[FOCUS_IN_EVENT] =
588 gtk_signal_new ("focus_in_event",
590 GTK_CLASS_TYPE (object_class),
591 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
592 gtk_marshal_BOOL__POINTER,
595 widget_signals[FOCUS_OUT_EVENT] =
596 gtk_signal_new ("focus_out_event",
598 GTK_CLASS_TYPE (object_class),
599 GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
600 gtk_marshal_BOOL__POINTER,
603 widget_signals[MAP_EVENT] =
604 gtk_signal_new ("map_event",
606 GTK_CLASS_TYPE (object_class),
607 GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
608 gtk_marshal_BOOL__POINTER,
611 widget_signals[UNMAP_EVENT] =
612 gtk_signal_new ("unmap_event",
614 GTK_CLASS_TYPE (object_class),
615 GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
616 gtk_marshal_BOOL__POINTER,
619 widget_signals[PROPERTY_NOTIFY_EVENT] =
620 gtk_signal_new ("property_notify_event",
622 GTK_CLASS_TYPE (object_class),
623 GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
624 gtk_marshal_BOOL__POINTER,
627 widget_signals[SELECTION_CLEAR_EVENT] =
628 gtk_signal_new ("selection_clear_event",
630 GTK_CLASS_TYPE (object_class),
631 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
632 gtk_marshal_BOOL__POINTER,
635 widget_signals[SELECTION_REQUEST_EVENT] =
636 gtk_signal_new ("selection_request_event",
638 GTK_CLASS_TYPE (object_class),
639 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
640 gtk_marshal_BOOL__POINTER,
643 widget_signals[SELECTION_NOTIFY_EVENT] =
644 gtk_signal_new ("selection_notify_event",
646 GTK_CLASS_TYPE (object_class),
647 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
648 gtk_marshal_BOOL__POINTER,
651 widget_signals[SELECTION_RECEIVED] =
652 gtk_signal_new ("selection_received",
654 GTK_CLASS_TYPE (object_class),
655 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
656 gtk_marshal_NONE__POINTER_UINT,
658 GTK_TYPE_SELECTION_DATA,
660 widget_signals[SELECTION_GET] =
661 gtk_signal_new ("selection_get",
663 GTK_CLASS_TYPE (object_class),
664 GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_get),
665 gtk_marshal_NONE__POINTER_UINT_UINT,
667 GTK_TYPE_SELECTION_DATA,
670 widget_signals[PROXIMITY_IN_EVENT] =
671 gtk_signal_new ("proximity_in_event",
673 GTK_CLASS_TYPE (object_class),
674 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
675 gtk_marshal_BOOL__POINTER,
678 widget_signals[PROXIMITY_OUT_EVENT] =
679 gtk_signal_new ("proximity_out_event",
681 GTK_CLASS_TYPE (object_class),
682 GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
683 gtk_marshal_BOOL__POINTER,
686 widget_signals[DRAG_LEAVE] =
687 gtk_signal_new ("drag_leave",
689 GTK_CLASS_TYPE (object_class),
690 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_leave),
691 gtk_marshal_NONE__POINTER_UINT,
693 GDK_TYPE_DRAG_CONTEXT,
695 widget_signals[DRAG_BEGIN] =
696 gtk_signal_new ("drag_begin",
698 GTK_CLASS_TYPE (object_class),
699 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin),
700 gtk_marshal_NONE__POINTER,
702 GDK_TYPE_DRAG_CONTEXT);
703 widget_signals[DRAG_END] =
704 gtk_signal_new ("drag_end",
706 GTK_CLASS_TYPE (object_class),
707 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end),
708 gtk_marshal_NONE__POINTER,
710 GDK_TYPE_DRAG_CONTEXT);
711 widget_signals[DRAG_DATA_DELETE] =
712 gtk_signal_new ("drag_data_delete",
714 GTK_CLASS_TYPE (object_class),
715 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_delete),
716 gtk_marshal_NONE__POINTER,
718 GDK_TYPE_DRAG_CONTEXT);
719 widget_signals[DRAG_MOTION] =
720 gtk_signal_new ("drag_motion",
722 GTK_CLASS_TYPE (object_class),
723 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_motion),
724 gtk_marshal_BOOL__POINTER_INT_INT_UINT,
726 GDK_TYPE_DRAG_CONTEXT,
730 widget_signals[DRAG_DROP] =
731 gtk_signal_new ("drag_drop",
733 GTK_CLASS_TYPE (object_class),
734 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_drop),
735 gtk_marshal_BOOL__POINTER_INT_INT_UINT,
737 GDK_TYPE_DRAG_CONTEXT,
741 widget_signals[DRAG_DATA_GET] =
742 gtk_signal_new ("drag_data_get",
744 GTK_CLASS_TYPE (object_class),
745 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_get),
746 gtk_marshal_NONE__POINTER_POINTER_UINT_UINT,
748 GDK_TYPE_DRAG_CONTEXT,
749 GTK_TYPE_SELECTION_DATA,
752 widget_signals[DRAG_DATA_RECEIVED] =
753 gtk_signal_new ("drag_data_received",
755 GTK_CLASS_TYPE (object_class),
756 GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_data_received),
757 gtk_marshal_NONE__POINTER_INT_INT_POINTER_UINT_UINT,
759 GDK_TYPE_DRAG_CONTEXT,
762 GTK_TYPE_SELECTION_DATA,
765 widget_signals[VISIBILITY_NOTIFY_EVENT] =
766 gtk_signal_new ("visibility_notify_event",
768 GTK_CLASS_TYPE (object_class),
769 GTK_SIGNAL_OFFSET (GtkWidgetClass, visibility_notify_event),
770 gtk_marshal_BOOL__POINTER,
773 widget_signals[CLIENT_EVENT] =
774 gtk_signal_new ("client_event",
776 GTK_CLASS_TYPE (object_class),
777 GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
778 gtk_marshal_BOOL__POINTER,
781 widget_signals[NO_EXPOSE_EVENT] =
782 gtk_signal_new ("no_expose_event",
784 GTK_CLASS_TYPE (object_class),
785 GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
786 gtk_marshal_BOOL__POINTER,
789 widget_signals[DEBUG_MSG] =
790 gtk_signal_new ("debug_msg",
791 GTK_RUN_LAST | GTK_RUN_ACTION,
792 GTK_CLASS_TYPE (object_class),
793 GTK_SIGNAL_OFFSET (GtkWidgetClass, debug_msg),
794 gtk_marshal_NONE__STRING,
798 gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
802 gtk_widget_set_arg (GtkObject *object,
808 widget = GTK_WIDGET (object);
815 gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
818 gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
821 gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
824 gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
827 gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -2);
830 gtk_widget_set_usize (widget, -2, GTK_VALUE_INT (*arg));
833 if (GTK_VALUE_BOOL(*arg))
834 gtk_widget_show (widget);
836 gtk_widget_hide (widget);
839 gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
841 case ARG_APP_PAINTABLE:
842 gtk_widget_set_app_paintable (widget, GTK_VALUE_BOOL (*arg));
845 saved_flags = GTK_WIDGET_FLAGS (widget);
846 if (GTK_VALUE_BOOL (*arg))
847 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
849 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
850 if (saved_flags != GTK_WIDGET_FLAGS (widget))
851 gtk_widget_queue_resize (widget);
854 if (GTK_VALUE_BOOL (*arg))
855 gtk_widget_grab_focus (widget);
857 case ARG_CAN_DEFAULT:
858 saved_flags = GTK_WIDGET_FLAGS (widget);
859 if (GTK_VALUE_BOOL (*arg))
860 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
862 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
863 if (saved_flags != GTK_WIDGET_FLAGS (widget))
864 gtk_widget_queue_resize (widget);
866 case ARG_HAS_DEFAULT:
867 if (GTK_VALUE_BOOL (*arg))
868 gtk_widget_grab_default (widget);
870 case ARG_RECEIVES_DEFAULT:
871 if (GTK_VALUE_BOOL (*arg))
872 GTK_WIDGET_SET_FLAGS (widget, GTK_RECEIVES_DEFAULT);
874 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RECEIVES_DEFAULT);
876 case ARG_COMPOSITE_CHILD:
877 if (GTK_VALUE_BOOL(*arg))
878 GTK_WIDGET_SET_FLAGS (widget, GTK_COMPOSITE_CHILD);
880 GTK_WIDGET_UNSET_FLAGS (widget, GTK_COMPOSITE_CHILD);
883 gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
886 if (!GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_NO_WINDOW (widget))
887 gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
889 case ARG_EXTENSION_EVENTS:
890 gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
897 /*****************************************
898 * gtk_widget_get_arg:
903 *****************************************/
906 gtk_widget_get_arg (GtkObject *object,
912 widget = GTK_WIDGET (object);
916 GtkWidgetAuxInfo *aux_info;
918 GdkExtensionMode *modep;
922 GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
924 GTK_VALUE_STRING (*arg) = g_strdup ("");
927 GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
930 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
932 GTK_VALUE_INT (*arg) = -1;
934 GTK_VALUE_INT (*arg) = aux_info->x;
937 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
939 GTK_VALUE_INT (*arg) = -1;
941 GTK_VALUE_INT (*arg) = aux_info->y;
944 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
946 GTK_VALUE_INT (*arg) = -1;
948 GTK_VALUE_INT (*arg) = aux_info->width;
951 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
953 GTK_VALUE_INT (*arg) = -1;
955 GTK_VALUE_INT (*arg) = aux_info->height;
958 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_VISIBLE (widget) != FALSE);
961 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_SENSITIVE (widget) != FALSE);
963 case ARG_APP_PAINTABLE:
964 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_APP_PAINTABLE (widget) != FALSE);
967 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_FOCUS (widget) != FALSE);
970 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_FOCUS (widget) != FALSE);
972 case ARG_CAN_DEFAULT:
973 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_DEFAULT (widget) != FALSE);
975 case ARG_HAS_DEFAULT:
976 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
978 case ARG_RECEIVES_DEFAULT:
979 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_RECEIVES_DEFAULT (widget) != FALSE);
981 case ARG_COMPOSITE_CHILD:
982 GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_COMPOSITE_CHILD (widget) != FALSE);
985 GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
988 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
990 GTK_VALUE_FLAGS (*arg) = 0;
992 GTK_VALUE_FLAGS (*arg) = *eventp;
994 case ARG_EXTENSION_EVENTS:
995 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
997 GTK_VALUE_FLAGS (*arg) = 0;
999 GTK_VALUE_FLAGS (*arg) = *modep;
1002 arg->type = GTK_TYPE_INVALID;
1007 /*****************************************
1013 *****************************************/
1016 gtk_widget_init (GtkWidget *widget)
1018 GdkColormap *colormap;
1020 GTK_PRIVATE_FLAGS (widget) = 0;
1021 widget->state = GTK_STATE_NORMAL;
1022 widget->saved_state = GTK_STATE_NORMAL;
1023 widget->name = NULL;
1024 widget->requisition.width = 0;
1025 widget->requisition.height = 0;
1026 widget->allocation.x = -1;
1027 widget->allocation.y = -1;
1028 widget->allocation.width = 1;
1029 widget->allocation.height = 1;
1030 widget->window = NULL;
1031 widget->parent = NULL;
1033 GTK_WIDGET_SET_FLAGS (widget,
1035 GTK_PARENT_SENSITIVE |
1036 (composite_child_stack ? GTK_COMPOSITE_CHILD : 0) |
1037 GTK_DOUBLE_BUFFERED);
1039 widget->style = gtk_widget_peek_style ();
1040 gtk_style_ref (widget->style);
1042 colormap = gtk_widget_peek_colormap ();
1044 if (colormap != gtk_widget_get_default_colormap ())
1045 gtk_widget_set_colormap (widget, colormap);
1048 /*****************************************
1054 *****************************************/
1057 gtk_widget_new (GtkType widget_type,
1058 const gchar *first_arg_name,
1063 GSList *arg_list = NULL;
1064 GSList *info_list = NULL;
1067 g_return_val_if_fail (gtk_type_is_a (widget_type, GTK_TYPE_WIDGET), NULL);
1069 object = gtk_type_new (widget_type);
1071 va_start (var_args, first_arg_name);
1072 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1081 g_warning ("gtk_widget_new(): %s", error);
1089 slist_arg = arg_list;
1090 slist_info = info_list;
1093 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1094 slist_arg = slist_arg->next;
1095 slist_info = slist_info->next;
1097 gtk_args_collect_cleanup (arg_list, info_list);
1100 if (!GTK_OBJECT_CONSTRUCTED (object))
1101 gtk_object_default_construct (object);
1103 return GTK_WIDGET (object);
1106 /*****************************************
1112 *****************************************/
1115 gtk_widget_newv (GtkType type,
1119 g_return_val_if_fail (gtk_type_is_a (type, GTK_TYPE_WIDGET), NULL);
1121 return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1124 /*****************************************
1130 *****************************************/
1133 gtk_widget_get (GtkWidget *widget,
1136 g_return_if_fail (widget != NULL);
1137 g_return_if_fail (GTK_IS_WIDGET (widget));
1138 g_return_if_fail (arg != NULL);
1140 gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1143 /*****************************************
1149 *****************************************/
1152 gtk_widget_getv (GtkWidget *widget,
1156 g_return_if_fail (widget != NULL);
1157 g_return_if_fail (GTK_IS_WIDGET (widget));
1159 gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1162 /*****************************************
1168 *****************************************/
1171 gtk_widget_set (GtkWidget *widget,
1172 const gchar *first_arg_name,
1177 GSList *arg_list = NULL;
1178 GSList *info_list = NULL;
1181 g_return_if_fail (widget != NULL);
1182 g_return_if_fail (GTK_IS_WIDGET (widget));
1184 object = GTK_OBJECT (widget);
1186 va_start (var_args, first_arg_name);
1187 error = gtk_object_args_collect (GTK_OBJECT_TYPE (object),
1196 g_warning ("gtk_widget_set(): %s", error);
1204 slist_arg = arg_list;
1205 slist_info = info_list;
1208 gtk_object_arg_set (object, slist_arg->data, slist_info->data);
1209 slist_arg = slist_arg->next;
1210 slist_info = slist_info->next;
1212 gtk_args_collect_cleanup (arg_list, info_list);
1216 /*****************************************
1222 *****************************************/
1225 gtk_widget_setv (GtkWidget *widget,
1229 g_return_if_fail (widget != NULL);
1230 g_return_if_fail (GTK_IS_WIDGET (widget));
1232 gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1236 gtk_widget_queue_clear_child (GtkWidget *widget)
1240 parent = widget->parent;
1241 if (parent && GTK_WIDGET_DRAWABLE (parent))
1242 gtk_widget_queue_clear_area (parent,
1243 widget->allocation.x,
1244 widget->allocation.y,
1245 widget->allocation.width,
1246 widget->allocation.height);
1250 gtk_widget_unparent (GtkWidget *widget)
1252 GtkWidget *toplevel;
1253 GtkWidget *old_parent;
1255 g_return_if_fail (widget != NULL);
1256 g_return_if_fail (GTK_IS_WIDGET (widget));
1257 if (widget->parent == NULL)
1260 /* keep this function in sync with gtk_menu_detach()
1263 /* unset focused and default children properly, this code
1264 * should eventually move into some gtk_window_unparent_branch() or
1268 toplevel = gtk_widget_get_toplevel (widget);
1269 if (GTK_CONTAINER (widget->parent)->focus_child == widget)
1271 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL);
1273 if (GTK_IS_WINDOW (toplevel))
1277 child = GTK_WINDOW (toplevel)->focus_widget;
1279 while (child && child != widget)
1280 child = child->parent;
1282 if (child == widget)
1283 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1286 if (GTK_IS_WINDOW (toplevel))
1290 child = GTK_WINDOW (toplevel)->default_widget;
1292 while (child && child != widget)
1293 child = child->parent;
1295 if (child == widget)
1296 gtk_window_set_default (GTK_WINDOW (toplevel), NULL);
1299 if (GTK_IS_RESIZE_CONTAINER (widget))
1300 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1302 /* Remove the widget and all its children from any ->resize_widgets list
1303 * of all the parents in our branch. This code should move into gtkcontainer.c
1304 * somwhen, since we mess around with ->resize_widgets, which is
1305 * actually not of our business.
1307 * Two ways to make this prettier:
1308 * Write a g_slist_conditional_remove (GSList, gboolean (*)(gpointer))
1309 * Change resize_widgets to a GList
1311 toplevel = widget->parent;
1317 if (!GTK_CONTAINER (toplevel)->resize_widgets)
1319 toplevel = toplevel->parent;
1324 slist = GTK_CONTAINER (toplevel)->resize_widgets;
1336 while (parent && (parent != widget))
1337 parent = parent->parent;
1339 if (parent == widget)
1341 GTK_PRIVATE_UNSET_FLAG (child, GTK_RESIZE_NEEDED);
1346 GTK_CONTAINER (toplevel)->resize_widgets = slist;
1348 g_slist_free_1 (last);
1354 toplevel = toplevel->parent;
1357 gtk_widget_queue_clear_child (widget);
1359 /* Reset the width and height here, to force reallocation if we
1360 * get added back to a new parent. This won't work if our new
1361 * allocation is smaller than 1x1 and we actually want a size of 1x1...
1362 * (would 0x0 be OK here?)
1364 widget->allocation.width = 1;
1365 widget->allocation.height = 1;
1367 if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1368 gtk_widget_unrealize (widget);
1370 old_parent = widget->parent;
1371 widget->parent = NULL;
1372 gtk_widget_set_parent_window (widget, NULL);
1373 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1375 gtk_widget_unref (widget);
1378 /*****************************************
1379 * gtk_widget_destroy:
1384 *****************************************/
1387 gtk_widget_destroy (GtkWidget *widget)
1389 g_return_if_fail (widget != NULL);
1390 g_return_if_fail (GTK_IS_WIDGET (widget));
1391 g_return_if_fail (GTK_OBJECT_CONSTRUCTED (widget));
1393 gtk_object_destroy ((GtkObject*) widget);
1396 /*****************************************
1397 * gtk_widget_destroyed:
1398 * Utility function: sets widget_pointer
1399 * to NULL when widget is destroyed.
1404 *****************************************/
1407 gtk_widget_destroyed (GtkWidget *widget,
1408 GtkWidget **widget_pointer)
1410 /* Don't make any assumptions about the
1412 * Even check widget_pointer.
1415 *widget_pointer = NULL;
1418 /*****************************************
1424 *****************************************/
1427 gtk_widget_show (GtkWidget *widget)
1429 g_return_if_fail (widget != NULL);
1430 g_return_if_fail (GTK_IS_WIDGET (widget));
1432 if (!GTK_WIDGET_VISIBLE (widget))
1434 if (!GTK_WIDGET_TOPLEVEL (widget))
1435 gtk_widget_queue_resize (widget);
1436 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1441 gtk_widget_real_show (GtkWidget *widget)
1443 g_return_if_fail (widget != NULL);
1444 g_return_if_fail (GTK_IS_WIDGET (widget));
1446 if (!GTK_WIDGET_VISIBLE (widget))
1448 GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
1450 if (widget->parent &&
1451 GTK_WIDGET_MAPPED (widget->parent) &&
1452 !GTK_WIDGET_MAPPED (widget))
1453 gtk_widget_map (widget);
1457 /*************************************************************
1458 * gtk_widget_show_now:
1459 * Show a widget, and if it is an unmapped toplevel widget
1460 * wait for the map_event before returning
1462 * Warning: This routine will call the main loop recursively.
1467 *************************************************************/
1470 gtk_widget_show_map_callback (GtkWidget *widget, GdkEvent *event, gint *flag)
1473 gtk_signal_disconnect_by_data (GTK_OBJECT (widget), flag);
1477 gtk_widget_show_now (GtkWidget *widget)
1481 g_return_if_fail (widget != NULL);
1482 g_return_if_fail (GTK_IS_WIDGET (widget));
1484 /* make sure we will get event */
1485 if (!GTK_WIDGET_MAPPED (widget) &&
1486 GTK_WIDGET_TOPLEVEL (widget))
1488 gtk_widget_show (widget);
1490 gtk_signal_connect (GTK_OBJECT (widget), "map_event",
1491 GTK_SIGNAL_FUNC (gtk_widget_show_map_callback),
1495 gtk_main_iteration();
1498 gtk_widget_show (widget);
1501 /*****************************************
1507 *****************************************/
1510 gtk_widget_hide (GtkWidget *widget)
1512 g_return_if_fail (widget != NULL);
1513 g_return_if_fail (GTK_IS_WIDGET (widget));
1515 if (GTK_WIDGET_VISIBLE (widget))
1517 gtk_widget_ref (widget);
1518 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1519 if (!GTK_WIDGET_TOPLEVEL (widget) && !GTK_OBJECT_DESTROYED (widget))
1520 gtk_widget_queue_resize (widget);
1521 gtk_widget_unref (widget);
1526 gtk_widget_real_hide (GtkWidget *widget)
1528 g_return_if_fail (widget != NULL);
1529 g_return_if_fail (GTK_IS_WIDGET (widget));
1531 if (GTK_WIDGET_VISIBLE (widget))
1533 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
1535 if (GTK_WIDGET_MAPPED (widget))
1536 gtk_widget_unmap (widget);
1541 gtk_widget_hide_on_delete (GtkWidget *widget)
1543 g_return_val_if_fail (widget != NULL, FALSE);
1544 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
1546 gtk_widget_hide (widget);
1552 gtk_widget_show_all (GtkWidget *widget)
1554 GtkWidgetClass *class;
1556 g_return_if_fail (widget != NULL);
1557 g_return_if_fail (GTK_IS_WIDGET (widget));
1559 class = GTK_WIDGET_GET_CLASS (widget);
1561 if (class->show_all)
1562 class->show_all (widget);
1566 gtk_widget_hide_all (GtkWidget *widget)
1568 GtkWidgetClass *class;
1570 g_return_if_fail (widget != NULL);
1571 g_return_if_fail (GTK_IS_WIDGET (widget));
1573 class = GTK_WIDGET_GET_CLASS (widget);
1575 if (class->hide_all)
1576 class->hide_all (widget);
1579 /*****************************************
1585 *****************************************/
1588 gtk_widget_map (GtkWidget *widget)
1590 g_return_if_fail (GTK_IS_WIDGET (widget));
1591 g_return_if_fail (GTK_WIDGET_VISIBLE (widget) == TRUE);
1593 if (!GTK_WIDGET_MAPPED (widget))
1595 if (!GTK_WIDGET_REALIZED (widget))
1596 gtk_widget_realize (widget);
1598 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1600 if (GTK_WIDGET_NO_WINDOW (widget))
1601 gtk_widget_queue_draw (widget);
1605 /*****************************************
1611 *****************************************/
1614 gtk_widget_unmap (GtkWidget *widget)
1616 g_return_if_fail (widget != NULL);
1617 g_return_if_fail (GTK_IS_WIDGET (widget));
1619 if (GTK_WIDGET_MAPPED (widget))
1621 if (GTK_WIDGET_NO_WINDOW (widget))
1622 gtk_widget_queue_clear_child (widget);
1623 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1627 /*****************************************
1628 * gtk_widget_realize:
1633 *****************************************/
1636 gtk_widget_realize (GtkWidget *widget)
1639 GdkExtensionMode mode;
1640 GtkWidgetShapeInfo *shape_info;
1642 g_return_if_fail (widget != NULL);
1643 g_return_if_fail (GTK_IS_WIDGET (widget));
1645 if (!GTK_WIDGET_REALIZED (widget))
1648 if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1649 g_message ("gtk_widget_realize(%s)", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1652 if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1653 gtk_widget_realize (widget->parent);
1655 gtk_widget_ensure_style (widget);
1657 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1659 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1661 shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1663 gdk_window_shape_combine_mask (widget->window,
1664 shape_info->shape_mask,
1665 shape_info->offset_x,
1666 shape_info->offset_y);
1669 if (!GTK_WIDGET_NO_WINDOW (widget))
1671 mode = gtk_widget_get_extension_events (widget);
1672 if (mode != GDK_EXTENSION_EVENTS_NONE)
1674 events = gtk_widget_get_events (widget);
1675 gdk_input_set_extension_events (widget->window, events, mode);
1682 /*****************************************
1683 * gtk_widget_unrealize:
1688 *****************************************/
1691 gtk_widget_unrealize (GtkWidget *widget)
1693 g_return_if_fail (widget != NULL);
1694 g_return_if_fail (GTK_IS_WIDGET (widget));
1696 if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1697 gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
1699 if (GTK_WIDGET_REALIZED (widget))
1701 gtk_widget_ref (widget);
1702 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1703 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
1704 gtk_widget_unref (widget);
1708 /*****************************************
1710 *****************************************/
1713 gtk_widget_queue_draw_area (GtkWidget *widget,
1719 g_return_if_fail (widget != NULL);
1720 g_return_if_fail (GTK_IS_WIDGET (widget));
1722 gtk_widget_queue_clear_area (widget, x, y, width, height);
1726 gtk_widget_queue_draw (GtkWidget *widget)
1728 g_return_if_fail (widget != NULL);
1729 g_return_if_fail (GTK_IS_WIDGET (widget));
1731 gtk_widget_queue_clear (widget);
1734 /* Invalidates the given area (allocation-relative-coordinates)
1735 * in all of the widget's windows
1738 gtk_widget_queue_clear_area (GtkWidget *widget,
1744 GdkRectangle invalid_rect;
1746 g_return_if_fail (widget != NULL);
1747 g_return_if_fail (GTK_IS_WIDGET (widget));
1749 if (!(widget->window && gdk_window_is_viewable (widget->window)))
1752 /* Find the correct widget */
1754 if (!GTK_WIDGET_NO_WINDOW (widget))
1758 /* Translate widget relative to window-relative */
1760 gint wx, wy, wwidth, wheight;
1762 gdk_window_get_position (widget->window, &wx, &wy);
1763 x -= wx - widget->allocation.x;
1764 y -= wy - widget->allocation.y;
1766 gdk_window_get_size (widget->window, &wwidth, &wheight);
1768 if (x + width <= 0 || y + height <= 0 ||
1769 x >= wwidth || y >= wheight)
1780 if (x + width > wwidth)
1782 if (y + height > wheight)
1783 height = wheight - y;
1789 invalid_rect.width = width;
1790 invalid_rect.height = height;
1792 gdk_window_invalidate_rect (widget->window, &invalid_rect, TRUE);
1796 gtk_widget_queue_clear (GtkWidget *widget)
1798 g_return_if_fail (widget != NULL);
1799 g_return_if_fail (GTK_IS_WIDGET (widget));
1801 if (widget->allocation.width || widget->allocation.height)
1803 if (GTK_WIDGET_NO_WINDOW (widget))
1804 gtk_widget_queue_clear_area (widget, widget->allocation.x,
1805 widget->allocation.y,
1806 widget->allocation.width,
1807 widget->allocation.height);
1809 gtk_widget_queue_clear_area (widget, 0, 0,
1810 widget->allocation.width,
1811 widget->allocation.height);
1816 gtk_widget_queue_resize (GtkWidget *widget)
1818 g_return_if_fail (widget != NULL);
1819 g_return_if_fail (GTK_IS_WIDGET (widget));
1821 if (GTK_IS_RESIZE_CONTAINER (widget))
1822 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
1824 gtk_widget_queue_clear (widget);
1827 gtk_container_queue_resize (GTK_CONTAINER (widget->parent));
1828 else if (GTK_WIDGET_TOPLEVEL (widget))
1829 gtk_container_queue_resize (GTK_CONTAINER (widget));
1832 /*****************************************
1838 *****************************************/
1841 gtk_widget_draw (GtkWidget *widget,
1844 GdkRectangle temp_area;
1846 g_return_if_fail (widget != NULL);
1847 g_return_if_fail (GTK_IS_WIDGET (widget));
1849 if (GTK_WIDGET_DRAWABLE (widget))
1853 if (area->width <= 0 || area->height <= 0)
1858 if (GTK_WIDGET_NO_WINDOW (widget))
1860 temp_area.x = widget->allocation.x;
1861 temp_area.y = widget->allocation.y;
1869 temp_area.width = widget->allocation.width;
1870 temp_area.height = widget->allocation.height;
1874 if (!GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_DOUBLE_BUFFERED (widget))
1876 GdkRectangle tmp_area = *area;
1879 if (!GTK_WIDGET_TOPLEVEL (widget))
1881 gdk_window_get_position (widget->window, &x, &y);
1882 tmp_area.x -= x - widget->allocation.x;
1883 tmp_area.y -= y - widget->allocation.y;
1886 gdk_window_begin_paint_rect (widget->window, &tmp_area);
1889 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
1891 if (!GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_DOUBLE_BUFFERED (widget))
1892 gdk_window_end_paint (widget->window);
1896 /*****************************************
1897 * gtk_widget_draw_focus:
1902 *****************************************/
1905 gtk_widget_draw_focus (GtkWidget *widget)
1907 g_return_if_fail (widget != NULL);
1908 g_return_if_fail (GTK_IS_WIDGET (widget));
1910 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
1913 /*****************************************
1914 * gtk_widget_draw_default:
1919 *****************************************/
1922 gtk_widget_draw_default (GtkWidget *widget)
1924 g_return_if_fail (widget != NULL);
1925 g_return_if_fail (GTK_IS_WIDGET (widget));
1927 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
1930 /*****************************************
1931 * gtk_widget_size_request:
1936 *****************************************/
1939 gtk_widget_size_request (GtkWidget *widget,
1940 GtkRequisition *requisition)
1942 g_return_if_fail (widget != NULL);
1943 g_return_if_fail (GTK_IS_WIDGET (widget));
1945 #ifdef G_ENABLE_DEBUG
1946 if (requisition == &widget->requisition)
1947 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.");
1948 #endif /* G_ENABLE_DEBUG */
1950 gtk_widget_ref (widget);
1951 gtk_widget_ensure_style (widget);
1952 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
1953 &widget->requisition);
1956 gtk_widget_get_child_requisition (widget, requisition);
1958 gtk_widget_unref (widget);
1961 /*****************************************
1962 * gtk_widget_get_requesition:
1967 *****************************************/
1970 gtk_widget_get_child_requisition (GtkWidget *widget,
1971 GtkRequisition *requisition)
1973 GtkWidgetAuxInfo *aux_info;
1975 g_return_if_fail (widget != NULL);
1976 g_return_if_fail (GTK_IS_WIDGET (widget));
1978 *requisition = widget->requisition;
1980 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1983 if (aux_info->width > 0)
1984 requisition->width = aux_info->width;
1985 if (aux_info->height > 0)
1986 requisition->height = aux_info->height;
1990 /*****************************************
1991 * gtk_widget_size_allocate:
1996 *****************************************/
1999 gtk_widget_size_allocate (GtkWidget *widget,
2000 GtkAllocation *allocation)
2002 GtkWidgetAuxInfo *aux_info;
2003 GtkAllocation real_allocation;
2004 gboolean needs_draw = FALSE;
2006 g_return_if_fail (widget != NULL);
2007 g_return_if_fail (GTK_IS_WIDGET (widget));
2009 real_allocation = *allocation;
2010 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2014 if (aux_info->x != -1)
2015 real_allocation.x = aux_info->x;
2016 if (aux_info->y != -1)
2017 real_allocation.y = aux_info->y;
2020 real_allocation.width = MAX (real_allocation.width, 1);
2021 real_allocation.height = MAX (real_allocation.height, 1);
2023 if (real_allocation.width < 0 || real_allocation.height < 0)
2025 g_warning ("gtk_widget_size_allocate(): attempt to allocate widget with width %d and height %d",
2026 real_allocation.width,
2027 real_allocation.height);
2028 real_allocation.width = 1;
2029 real_allocation.height = 1;
2032 if (GTK_WIDGET_NO_WINDOW (widget))
2034 if (widget->allocation.x != real_allocation.x ||
2035 widget->allocation.y != real_allocation.y ||
2036 widget->allocation.width != real_allocation.width ||
2037 widget->allocation.height != real_allocation.height)
2039 gtk_widget_queue_clear_child (widget);
2043 else if (widget->allocation.width != real_allocation.width ||
2044 widget->allocation.height != real_allocation.height)
2049 if (GTK_IS_RESIZE_CONTAINER (widget))
2050 gtk_container_clear_resize_widgets (GTK_CONTAINER (widget));
2052 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
2056 gtk_widget_queue_draw (widget);
2057 if (widget->parent && GTK_CONTAINER (widget->parent)->reallocate_redraws)
2058 gtk_widget_queue_draw (widget->parent);
2063 gtk_widget_real_size_allocate (GtkWidget *widget,
2064 GtkAllocation *allocation)
2066 g_return_if_fail (widget != NULL);
2067 g_return_if_fail (GTK_IS_WIDGET (widget));
2069 widget->allocation = *allocation;
2071 if (GTK_WIDGET_REALIZED (widget) &&
2072 !GTK_WIDGET_NO_WINDOW (widget))
2074 gdk_window_move_resize (widget->window,
2075 allocation->x, allocation->y,
2076 allocation->width, allocation->height);
2081 gtk_widget_stop_add_accelerator (GtkWidget *widget)
2083 g_return_if_fail (widget != NULL);
2084 g_return_if_fail (GTK_IS_WIDGET (widget));
2086 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
2090 gtk_widget_stop_remove_accelerator (GtkWidget *widget)
2092 g_return_if_fail (widget != NULL);
2093 g_return_if_fail (GTK_IS_WIDGET (widget));
2095 gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR]);
2099 gtk_widget_lock_accelerators (GtkWidget *widget)
2101 g_return_if_fail (widget != NULL);
2102 g_return_if_fail (GTK_IS_WIDGET (widget));
2104 if (!gtk_widget_accelerators_locked (widget))
2106 gtk_signal_connect (GTK_OBJECT (widget),
2108 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2110 gtk_signal_connect (GTK_OBJECT (widget),
2111 "remove_accelerator",
2112 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
2118 gtk_widget_unlock_accelerators (GtkWidget *widget)
2120 g_return_if_fail (widget != NULL);
2121 g_return_if_fail (GTK_IS_WIDGET (widget));
2123 if (gtk_widget_accelerators_locked (widget))
2125 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
2126 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2128 gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
2129 GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
2135 gtk_widget_accelerators_locked (GtkWidget *widget)
2137 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2139 return gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
2140 widget_signals[ADD_ACCELERATOR],
2142 GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
2147 gtk_widget_add_accelerator (GtkWidget *widget,
2148 const gchar *accel_signal,
2149 GtkAccelGroup *accel_group,
2152 GtkAccelFlags accel_flags)
2154 g_return_if_fail (widget != NULL);
2155 g_return_if_fail (GTK_IS_WIDGET (widget));
2156 g_return_if_fail (accel_group != NULL);
2158 gtk_accel_group_add (accel_group,
2162 (GtkObject*) widget,
2167 gtk_widget_remove_accelerator (GtkWidget *widget,
2168 GtkAccelGroup *accel_group,
2172 g_return_if_fail (widget != NULL);
2173 g_return_if_fail (GTK_IS_WIDGET (widget));
2174 g_return_if_fail (accel_group != NULL);
2176 gtk_accel_group_remove (accel_group,
2179 (GtkObject*) widget);
2183 gtk_widget_remove_accelerators (GtkWidget *widget,
2184 const gchar *accel_signal,
2185 gboolean visible_only)
2190 g_return_if_fail (widget != NULL);
2191 g_return_if_fail (GTK_IS_WIDGET (widget));
2192 g_return_if_fail (accel_signal != NULL);
2194 signal_id = gtk_signal_lookup (accel_signal, GTK_OBJECT_TYPE (widget));
2195 g_return_if_fail (signal_id != 0);
2197 slist = gtk_accel_group_entries_from_object (GTK_OBJECT (widget));
2200 GtkAccelEntry *ac_entry;
2202 ac_entry = slist->data;
2203 slist = slist->next;
2204 if (ac_entry->accel_flags & GTK_ACCEL_VISIBLE &&
2205 ac_entry->signal_id == signal_id)
2206 gtk_widget_remove_accelerator (GTK_WIDGET (widget),
2207 ac_entry->accel_group,
2208 ac_entry->accelerator_key,
2209 ac_entry->accelerator_mods);
2214 gtk_widget_accelerator_signal (GtkWidget *widget,
2215 GtkAccelGroup *accel_group,
2219 GtkAccelEntry *ac_entry;
2221 g_return_val_if_fail (widget != NULL, 0);
2222 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
2223 g_return_val_if_fail (accel_group != NULL, 0);
2225 ac_entry = gtk_accel_group_get_entry (accel_group, accel_key, accel_mods);
2227 if (ac_entry && ac_entry->object == (GtkObject*) widget)
2228 return ac_entry->signal_id;
2233 gtk_widget_real_key_press_event (GtkWidget *widget,
2236 gboolean handled = FALSE;
2238 g_return_val_if_fail (widget != NULL, handled);
2239 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
2240 g_return_val_if_fail (event != NULL, handled);
2243 handled = gtk_bindings_activate (GTK_OBJECT (widget),
2251 gtk_widget_real_key_release_event (GtkWidget *widget,
2254 gboolean handled = FALSE;
2256 g_return_val_if_fail (widget != NULL, handled);
2257 g_return_val_if_fail (GTK_IS_WIDGET (widget), handled);
2258 g_return_val_if_fail (event != NULL, handled);
2261 handled = gtk_bindings_activate (GTK_OBJECT (widget),
2263 event->state | GDK_RELEASE_MASK);
2268 /*****************************************
2274 *****************************************/
2277 gtk_widget_event (GtkWidget *widget,
2280 gboolean return_val;
2283 g_return_val_if_fail (widget != NULL, TRUE);
2284 g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
2286 gtk_widget_ref (widget);
2288 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
2290 if (return_val || GTK_OBJECT_DESTROYED (widget))
2293 switch (event->type)
2298 case GDK_BUTTON_PRESS:
2299 case GDK_2BUTTON_PRESS:
2300 case GDK_3BUTTON_PRESS:
2301 signal_num = BUTTON_PRESS_EVENT;
2304 signal_num = SCROLL_EVENT;
2306 case GDK_BUTTON_RELEASE:
2307 signal_num = BUTTON_RELEASE_EVENT;
2309 case GDK_MOTION_NOTIFY:
2310 signal_num = MOTION_NOTIFY_EVENT;
2313 signal_num = DELETE_EVENT;
2316 signal_num = DESTROY_EVENT;
2319 signal_num = KEY_PRESS_EVENT;
2321 case GDK_KEY_RELEASE:
2322 signal_num = KEY_RELEASE_EVENT;
2324 case GDK_ENTER_NOTIFY:
2325 signal_num = ENTER_NOTIFY_EVENT;
2327 case GDK_LEAVE_NOTIFY:
2328 signal_num = LEAVE_NOTIFY_EVENT;
2330 case GDK_FOCUS_CHANGE:
2331 if (event->focus_change.in)
2332 signal_num = FOCUS_IN_EVENT;
2334 signal_num = FOCUS_OUT_EVENT;
2337 signal_num = CONFIGURE_EVENT;
2340 signal_num = MAP_EVENT;
2343 signal_num = UNMAP_EVENT;
2345 case GDK_PROPERTY_NOTIFY:
2346 signal_num = PROPERTY_NOTIFY_EVENT;
2348 case GDK_SELECTION_CLEAR:
2349 signal_num = SELECTION_CLEAR_EVENT;
2351 case GDK_SELECTION_REQUEST:
2352 signal_num = SELECTION_REQUEST_EVENT;
2354 case GDK_SELECTION_NOTIFY:
2355 signal_num = SELECTION_NOTIFY_EVENT;
2357 case GDK_PROXIMITY_IN:
2358 signal_num = PROXIMITY_IN_EVENT;
2360 case GDK_PROXIMITY_OUT:
2361 signal_num = PROXIMITY_OUT_EVENT;
2364 signal_num = NO_EXPOSE_EVENT;
2366 case GDK_CLIENT_EVENT:
2367 signal_num = CLIENT_EVENT;
2370 if (!event->any.window) /* Why is this necessary */
2373 signal_num = EXPOSE_EVENT;
2375 case GDK_VISIBILITY_NOTIFY:
2376 signal_num = VISIBILITY_NOTIFY_EVENT;
2379 g_warning ("could not determine signal number for event: %d", event->type);
2383 if (signal_num != -1)
2384 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
2386 return_val |= GTK_OBJECT_DESTROYED (widget);
2389 gtk_widget_unref (widget);
2394 /*****************************************
2395 * gtk_widget_activate:
2400 *****************************************/
2403 gtk_widget_activate (GtkWidget *widget)
2405 g_return_val_if_fail (widget != NULL, FALSE);
2406 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2408 if (WIDGET_CLASS (widget)->activate_signal)
2410 /* FIXME: we should eventually check the signals signature here */
2411 gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
2420 gtk_widget_set_scroll_adjustments (GtkWidget *widget,
2421 GtkAdjustment *hadjustment,
2422 GtkAdjustment *vadjustment)
2424 g_return_val_if_fail (widget != NULL, FALSE);
2425 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2427 g_return_val_if_fail (GTK_IS_ADJUSTMENT (hadjustment), FALSE);
2429 g_return_val_if_fail (GTK_IS_ADJUSTMENT (vadjustment), FALSE);
2431 if (WIDGET_CLASS (widget)->set_scroll_adjustments_signal)
2433 /* FIXME: we should eventually check the signals signature here */
2434 gtk_signal_emit (GTK_OBJECT (widget),
2435 WIDGET_CLASS (widget)->set_scroll_adjustments_signal,
2436 hadjustment, vadjustment);
2443 /*****************************************
2444 * gtk_widget_reparent_container_child:
2445 * assistent function to gtk_widget_reparent
2450 *****************************************/
2453 gtk_widget_reparent_container_child (GtkWidget *widget,
2454 gpointer client_data)
2456 g_return_if_fail (widget != NULL);
2457 g_return_if_fail (GTK_IS_WIDGET (widget));
2458 g_return_if_fail (client_data != NULL);
2460 if (GTK_WIDGET_NO_WINDOW (widget))
2463 gdk_window_unref (widget->window);
2464 widget->window = (GdkWindow*) client_data;
2466 gdk_window_ref (widget->window);
2468 if (GTK_IS_CONTAINER (widget))
2469 gtk_container_forall (GTK_CONTAINER (widget),
2470 gtk_widget_reparent_container_child,
2474 gdk_window_reparent (widget->window,
2475 (GdkWindow*) client_data, 0, 0);
2478 /*****************************************
2479 * gtk_widget_reparent:
2484 *****************************************/
2487 gtk_widget_reparent (GtkWidget *widget,
2488 GtkWidget *new_parent)
2490 g_return_if_fail (widget != NULL);
2491 g_return_if_fail (GTK_IS_WIDGET (widget));
2492 g_return_if_fail (new_parent != NULL);
2493 g_return_if_fail (GTK_IS_CONTAINER (new_parent));
2494 g_return_if_fail (widget->parent != NULL);
2496 if (widget->parent != new_parent)
2498 /* First try to see if we can get away without unrealizing
2499 * the widget as we reparent it. if so we set a flag so
2500 * that gtk_widget_unparent doesn't unrealize widget
2502 if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
2503 GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
2505 gtk_widget_ref (widget);
2506 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
2507 gtk_container_add (GTK_CONTAINER (new_parent), widget);
2508 gtk_widget_unref (widget);
2510 if (GTK_WIDGET_IN_REPARENT (widget))
2512 GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
2514 gtk_widget_reparent_container_child (widget,
2515 gtk_widget_get_parent_window (widget));
2520 /*****************************************
2526 *****************************************/
2529 gtk_widget_popup (GtkWidget *widget,
2533 g_return_if_fail (widget != NULL);
2534 g_return_if_fail (GTK_IS_WIDGET (widget));
2536 if (!GTK_WIDGET_VISIBLE (widget))
2538 if (!GTK_WIDGET_REALIZED (widget))
2539 gtk_widget_realize (widget);
2540 if (!GTK_WIDGET_NO_WINDOW (widget))
2541 gdk_window_move (widget->window, x, y);
2542 gtk_widget_show (widget);
2546 /*****************************************
2547 * gtk_widget_intersect:
2552 *****************************************/
2555 gtk_widget_intersect (GtkWidget *widget,
2557 GdkRectangle *intersection)
2563 g_return_val_if_fail (widget != NULL, FALSE);
2564 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
2565 g_return_val_if_fail (area != NULL, FALSE);
2568 dest = intersection;
2572 return_val = gdk_rectangle_intersect (&widget->allocation, area, dest);
2574 if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2576 intersection->x -= widget->allocation.x;
2577 intersection->y -= widget->allocation.y;
2583 /*****************************************
2584 * gtk_widget_grab_focus:
2589 *****************************************/
2592 gtk_widget_grab_focus (GtkWidget *widget)
2594 g_return_if_fail (widget != NULL);
2595 g_return_if_fail (GTK_IS_WIDGET (widget));
2597 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[GRAB_FOCUS]);
2601 reset_focus_recurse (GtkWidget *widget,
2604 if (GTK_IS_CONTAINER (widget))
2606 GtkContainer *container;
2608 container = GTK_CONTAINER (widget);
2609 gtk_container_set_focus_child (container, NULL);
2611 gtk_container_foreach (container,
2612 reset_focus_recurse,
2618 gtk_widget_real_grab_focus (GtkWidget *focus_widget)
2620 g_return_if_fail (focus_widget != NULL);
2621 g_return_if_fail (GTK_IS_WIDGET (focus_widget));
2623 if (GTK_WIDGET_CAN_FOCUS (focus_widget))
2625 GtkWidget *toplevel;
2628 /* clear the current focus setting, break if the current widget
2629 * is the focus widget's parent, since containers above that will
2630 * be set by the next loop.
2632 toplevel = gtk_widget_get_toplevel (focus_widget);
2633 if (GTK_IS_WINDOW (toplevel))
2635 widget = GTK_WINDOW (toplevel)->focus_widget;
2637 if (widget == focus_widget)
2639 /* We call gtk_window_set_focus() here so that the
2640 * toplevel window can request the focus if necessary.
2641 * This is needed when the toplevel is a GtkPlug
2643 if (!GTK_WIDGET_HAS_FOCUS (widget))
2644 gtk_window_set_focus (GTK_WINDOW (toplevel), focus_widget);
2651 while (widget->parent && widget->parent != focus_widget->parent)
2653 widget = widget->parent;
2654 gtk_container_set_focus_child (GTK_CONTAINER (widget), NULL);
2658 else if (toplevel != focus_widget)
2660 /* gtk_widget_grab_focus() operates on a tree without window...
2661 * actually, this is very questionable behaviour.
2664 gtk_container_foreach (GTK_CONTAINER (toplevel),
2665 reset_focus_recurse,
2669 /* now propagate the new focus up the widget tree and finally
2670 * set it on the window
2672 widget = focus_widget;
2673 while (widget->parent)
2675 gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), widget);
2676 widget = widget->parent;
2678 if (GTK_IS_WINDOW (widget))
2679 gtk_window_set_focus (GTK_WINDOW (widget), focus_widget);
2683 /*****************************************
2684 * gtk_widget_grab_default:
2689 *****************************************/
2692 gtk_widget_grab_default (GtkWidget *widget)
2695 GtkType window_type;
2697 g_return_if_fail (widget != NULL);
2698 g_return_if_fail (GTK_IS_WIDGET (widget));
2699 g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
2701 window_type = GTK_TYPE_WINDOW;
2702 window = widget->parent;
2704 while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2705 window = window->parent;
2707 if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2708 gtk_window_set_default (GTK_WINDOW (window), widget);
2710 g_warning("gtk_widget_grab_default() called on a widget not within a GtkWindow");
2713 /*****************************************
2714 * gtk_widget_set_name:
2719 *****************************************/
2722 gtk_widget_set_name (GtkWidget *widget,
2725 g_return_if_fail (widget != NULL);
2726 g_return_if_fail (GTK_IS_WIDGET (widget));
2729 g_free (widget->name);
2730 widget->name = g_strdup (name);
2732 if (GTK_WIDGET_RC_STYLE (widget))
2733 gtk_widget_set_rc_style (widget);
2736 /*****************************************
2737 * gtk_widget_get_name:
2742 *****************************************/
2745 gtk_widget_get_name (GtkWidget *widget)
2747 g_return_val_if_fail (widget != NULL, NULL);
2748 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
2751 return widget->name;
2752 return gtk_type_name (GTK_WIDGET_TYPE (widget));
2755 /*****************************************
2756 * gtk_widget_set_state:
2763 *****************************************/
2766 gtk_widget_set_state (GtkWidget *widget,
2769 g_return_if_fail (widget != NULL);
2770 g_return_if_fail (GTK_IS_WIDGET (widget));
2772 if (state == GTK_WIDGET_STATE (widget))
2775 if (state == GTK_STATE_INSENSITIVE)
2776 gtk_widget_set_sensitive (widget, FALSE);
2782 data.state_restoration = FALSE;
2783 data.use_forall = FALSE;
2785 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2787 data.parent_sensitive = TRUE;
2789 gtk_widget_propagate_state (widget, &data);
2791 if (GTK_WIDGET_DRAWABLE (widget))
2792 gtk_widget_queue_clear (widget);
2797 gtk_widget_set_app_paintable (GtkWidget *widget,
2798 gboolean app_paintable)
2800 g_return_if_fail (widget != NULL);
2801 g_return_if_fail (GTK_IS_WIDGET (widget));
2803 app_paintable = (app_paintable != FALSE);
2805 if (GTK_WIDGET_APP_PAINTABLE (widget) != app_paintable)
2808 GTK_WIDGET_SET_FLAGS (widget, GTK_APP_PAINTABLE);
2810 GTK_WIDGET_UNSET_FLAGS (widget, GTK_APP_PAINTABLE);
2812 if (GTK_WIDGET_DRAWABLE (widget))
2813 gtk_widget_queue_clear (widget);
2818 gtk_widget_set_double_buffered (GtkWidget *widget,
2819 gboolean double_buffered)
2821 g_return_if_fail (widget != NULL);
2822 g_return_if_fail (GTK_IS_WIDGET (widget));
2824 if (double_buffered)
2825 GTK_WIDGET_SET_FLAGS (widget, GTK_DOUBLE_BUFFERED);
2827 GTK_WIDGET_UNSET_FLAGS (widget, GTK_DOUBLE_BUFFERED);
2830 /*****************************************
2831 * gtk_widget_set_sensitive:
2835 * boolean value for sensitivity
2838 *****************************************/
2841 gtk_widget_set_sensitive (GtkWidget *widget,
2846 g_return_if_fail (widget != NULL);
2847 g_return_if_fail (GTK_IS_WIDGET (widget));
2849 sensitive = (sensitive != FALSE);
2851 if (sensitive == (GTK_WIDGET_SENSITIVE (widget) != FALSE))
2856 GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
2857 data.state = GTK_WIDGET_SAVED_STATE (widget);
2861 GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
2862 data.state = GTK_WIDGET_STATE (widget);
2864 data.state_restoration = TRUE;
2865 data.use_forall = TRUE;
2868 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget->parent) != FALSE);
2870 data.parent_sensitive = TRUE;
2872 gtk_widget_propagate_state (widget, &data);
2873 if (GTK_WIDGET_DRAWABLE (widget))
2874 gtk_widget_queue_clear (widget);
2877 /*****************************************
2878 * gtk_widget_set_parent:
2883 *****************************************/
2886 gtk_widget_set_parent (GtkWidget *widget,
2891 g_return_if_fail (widget != NULL);
2892 g_return_if_fail (GTK_IS_WIDGET (widget));
2893 g_return_if_fail (widget->parent == NULL);
2894 g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
2895 g_return_if_fail (parent != NULL);
2896 g_return_if_fail (GTK_IS_WIDGET (parent));
2897 g_return_if_fail (widget != parent);
2899 /* keep this function in sync with gtk_menu_attach_to_widget()
2902 gtk_widget_ref (widget);
2903 gtk_object_sink (GTK_OBJECT (widget));
2904 widget->parent = parent;
2906 if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
2907 data.state = GTK_WIDGET_STATE (parent);
2909 data.state = GTK_WIDGET_STATE (widget);
2910 data.state_restoration = FALSE;
2911 data.parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (parent) != FALSE);
2912 data.use_forall = GTK_WIDGET_IS_SENSITIVE (parent) != GTK_WIDGET_IS_SENSITIVE (widget);
2914 gtk_widget_propagate_state (widget, &data);
2916 gtk_widget_set_style_recurse (widget, NULL);
2918 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
2921 /*****************************************
2923 * see docs/styles.txt
2924 *****************************************/
2926 gtk_widget_set_style (GtkWidget *widget,
2929 GtkStyle *default_style;
2930 gboolean initial_emission;
2932 g_return_if_fail (widget != NULL);
2933 g_return_if_fail (GTK_IS_WIDGET (widget));
2934 g_return_if_fail (style != NULL);
2936 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2938 GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
2939 GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
2941 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2944 gtk_style_ref (widget->style);
2945 if (!saved_default_style_key_id)
2946 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2947 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2950 gtk_widget_set_style_internal (widget, style, initial_emission);
2954 gtk_widget_ensure_style (GtkWidget *widget)
2956 g_return_if_fail (widget != NULL);
2957 g_return_if_fail (GTK_IS_WIDGET (widget));
2959 if (!GTK_WIDGET_USER_STYLE (widget) &&
2960 !GTK_WIDGET_RC_STYLE (widget))
2961 gtk_widget_set_rc_style (widget);
2965 gtk_widget_set_rc_style (GtkWidget *widget)
2967 GtkStyle *saved_style;
2968 GtkStyle *new_style;
2969 gboolean initial_emission;
2971 g_return_if_fail (widget != NULL);
2972 g_return_if_fail (GTK_IS_WIDGET (widget));
2974 initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2976 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2977 GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
2979 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2980 new_style = gtk_rc_get_style (widget);
2985 gtk_style_ref (widget->style);
2986 if (!saved_default_style_key_id)
2987 saved_default_style_key_id = g_quark_from_static_string (saved_default_style_key);
2988 gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2990 gtk_widget_set_style_internal (widget, new_style, initial_emission);
2996 g_assert (initial_emission == FALSE); /* FIXME: remove this line */
2998 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2999 gtk_widget_set_style_internal (widget, saved_style, initial_emission);
3000 gtk_style_unref (saved_style);
3004 if (initial_emission)
3005 gtk_widget_set_style_internal (widget, widget->style, TRUE);
3011 gtk_widget_restore_default_style (GtkWidget *widget)
3013 GtkStyle *default_style;
3015 g_return_if_fail (widget != NULL);
3016 g_return_if_fail (GTK_IS_WIDGET (widget));
3018 GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
3020 default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3023 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3024 gtk_widget_set_style_internal (widget, default_style, FALSE);
3025 gtk_style_unref (default_style);
3030 gtk_widget_get_style (GtkWidget *widget)
3032 g_return_val_if_fail (widget != NULL, NULL);
3033 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3035 return widget->style;
3039 gtk_widget_modify_style (GtkWidget *widget,
3042 GtkRcStyle *old_style;
3044 if (!rc_style_key_id)
3045 rc_style_key_id = g_quark_from_static_string (rc_style_key);
3047 old_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), rc_style_key_id);
3049 if (style != old_style)
3051 gtk_rc_style_ref (style);
3053 gtk_object_set_data_by_id_full (GTK_OBJECT (widget),
3056 (GtkDestroyNotify)gtk_rc_style_unref);
3059 if (GTK_WIDGET_RC_STYLE (widget))
3060 gtk_widget_set_rc_style (widget);
3064 gtk_widget_direction_changed (GtkWidget *widget,
3065 GtkTextDirection previous_direction)
3067 gtk_widget_queue_resize (widget);
3071 gtk_widget_style_set (GtkWidget *widget,
3072 GtkStyle *previous_style)
3074 if (GTK_WIDGET_REALIZED (widget) &&
3075 !GTK_WIDGET_NO_WINDOW (widget))
3076 gtk_style_set_background (widget->style, widget->window, widget->state);
3080 gtk_widget_set_style_internal (GtkWidget *widget,
3082 gboolean initial_emission)
3084 g_return_if_fail (widget != NULL);
3085 g_return_if_fail (GTK_IS_WIDGET (widget));
3086 g_return_if_fail (style != NULL);
3088 if (widget->style != style || initial_emission)
3090 PangoContext *context = gtk_widget_peek_pango_context (widget);
3092 pango_context_set_font_description (context, widget->style->font_desc);
3095 if (widget->style != style)
3097 GtkStyle *previous_style;
3099 if (GTK_WIDGET_REALIZED (widget))
3101 gtk_widget_reset_shapes (widget);
3102 gtk_style_detach (widget->style);
3105 previous_style = widget->style;
3106 widget->style = style;
3107 gtk_style_ref (widget->style);
3109 if (GTK_WIDGET_REALIZED (widget))
3110 widget->style = gtk_style_attach (widget->style, widget->window);
3112 gtk_signal_emit (GTK_OBJECT (widget),
3113 widget_signals[STYLE_SET],
3114 initial_emission ? NULL : previous_style);
3115 gtk_style_unref (previous_style);
3117 if (widget->parent && !initial_emission)
3119 GtkRequisition old_requisition;
3121 old_requisition = widget->requisition;
3122 gtk_widget_size_request (widget, NULL);
3124 if ((old_requisition.width != widget->requisition.width) ||
3125 (old_requisition.height != widget->requisition.height))
3126 gtk_widget_queue_resize (widget);
3127 else if (GTK_WIDGET_DRAWABLE (widget))
3128 gtk_widget_queue_clear (widget);
3131 else if (initial_emission)
3133 gtk_signal_emit (GTK_OBJECT (widget),
3134 widget_signals[STYLE_SET],
3140 gtk_widget_set_style_recurse (GtkWidget *widget,
3141 gpointer client_data)
3143 if (GTK_WIDGET_RC_STYLE (widget))
3144 gtk_widget_set_rc_style (widget);
3146 if (GTK_IS_CONTAINER (widget))
3147 gtk_container_forall (GTK_CONTAINER (widget),
3148 gtk_widget_set_style_recurse,
3153 gtk_widget_reset_rc_styles (GtkWidget *widget)
3155 g_return_if_fail (widget != NULL);
3156 g_return_if_fail (GTK_IS_WIDGET (widget));
3158 gtk_widget_set_style_recurse (widget, NULL);
3162 gtk_widget_set_default_style (GtkStyle *style)
3164 if (style != gtk_default_style)
3166 if (gtk_default_style)
3167 gtk_style_unref (gtk_default_style);
3168 gtk_default_style = style;
3169 if (gtk_default_style)
3170 gtk_style_ref (gtk_default_style);
3175 gtk_widget_get_default_style (void)
3177 if (!gtk_default_style)
3179 gtk_default_style = gtk_style_new ();
3180 gtk_style_ref (gtk_default_style);
3183 return gtk_default_style;
3187 gtk_widget_push_style (GtkStyle *style)
3189 g_return_if_fail (style != NULL);
3191 gtk_style_ref (style);
3192 style_stack = g_slist_prepend (style_stack, style);
3196 gtk_widget_peek_style (void)
3199 return (GtkStyle*) style_stack->data;
3201 return gtk_widget_get_default_style ();
3205 gtk_widget_pop_style (void)
3212 style_stack = style_stack->next;
3213 gtk_style_unref ((GtkStyle*) tmp->data);
3214 g_slist_free_1 (tmp);
3218 static PangoContext *
3219 gtk_widget_peek_pango_context (GtkWidget *widget)
3221 if (!pango_context_key_id)
3222 pango_context_key_id = g_quark_from_static_string (pango_context_key);
3224 return gtk_object_get_data_by_id (GTK_OBJECT (widget), pango_context_key_id);
3228 * gtk_widget_get_pango_context:
3229 * @widget: a #GtkWidget
3231 * Get a #PangoContext with the appropriate colormap, font description
3232 * and base direction for this widget. Unlike the context returned
3233 * by gtk_widget_create_pango_context(), this context is owned by
3234 * the widget (it can be used as long as widget exists), and will
3235 * be updated to match any changes to the widget's attributes.
3237 * If you create and keep a #PangoLayout using this context, you must
3238 * deal with changes to the context by calling pango_layout_context_changed()
3239 * on the layout in response to the ::style_set and ::direction_set signals
3242 * Return value: the #PangoContext for the widget.
3245 gtk_widget_get_pango_context (GtkWidget *widget)
3247 PangoContext *context;
3249 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3251 if (!pango_context_key_id)
3252 pango_context_key_id = g_quark_from_static_string (pango_context_key);
3254 context = gtk_object_get_data_by_id (GTK_OBJECT (widget), pango_context_key_id);
3257 context = gtk_widget_create_pango_context (GTK_WIDGET (widget));
3258 gtk_object_set_data_by_id_full (GTK_OBJECT (widget), pango_context_key_id, context,
3259 (GDestroyNotify)g_object_unref);
3266 * gtk_widget_create_pango_context:
3267 * @widget: a #PangoWidget
3269 * Create a new pango context with the appropriate colormap,
3270 * font description, and base direction for drawing text for
3271 * this widget. See also gtk_widget_get_pango_context()
3273 * Return value: the new #PangoContext
3276 gtk_widget_create_pango_context (GtkWidget *widget)
3278 PangoContext *context;
3281 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3283 context = gdk_pango_context_get ();
3285 gdk_pango_context_set_colormap (context, gtk_widget_get_colormap (widget));
3286 pango_context_set_base_dir (context,
3287 gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ?
3288 PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL);
3289 pango_context_set_font_description (context, widget->style->font_desc);
3291 lang = gtk_get_default_language ();
3292 pango_context_set_lang (context, lang);
3299 * gtk_widget_create_pango_layout:
3300 * @widget: a #PangoWidget
3301 * @text: text to set on the layout (can be %NULL)
3303 * Create a new #PangoLayout with the appropriate colormap,
3304 * font description, and base direction for drawing text for
3307 * If you keep a #PangoLayout created in this way around, in order
3308 * notify the layout of changes to the base direction or font of this
3309 * widget, you must call pango_layout_context_changed() in response to
3310 * the ::style_set and ::direction_set signals for the widget.
3312 * Return value: the new #PangoLayout
3315 gtk_widget_create_pango_layout (GtkWidget *widget,
3318 PangoLayout *layout;
3319 PangoContext *context;
3321 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3323 context = gtk_widget_get_pango_context (widget);
3324 layout = pango_layout_new (context);
3327 pango_layout_set_text (layout, text, -1);
3332 /*************************************************************
3333 * gtk_widget_set_parent_window:
3334 * Set a non default parent window for widget
3341 *************************************************************/
3344 gtk_widget_set_parent_window (GtkWidget *widget,
3345 GdkWindow *parent_window)
3347 GdkWindow *old_parent_window;
3349 g_return_if_fail (widget != NULL);
3350 g_return_if_fail (GTK_IS_WIDGET (widget));
3352 old_parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
3353 parent_window_key_id);
3355 if (parent_window != old_parent_window)
3357 if (!parent_window_key_id)
3358 parent_window_key_id = g_quark_from_static_string (parent_window_key);
3359 gtk_object_set_data_by_id (GTK_OBJECT (widget), parent_window_key_id,
3361 if (old_parent_window)
3362 gdk_window_unref (old_parent_window);
3364 gdk_window_ref (parent_window);
3368 /*************************************************************
3369 * gtk_widget_get_parent_window:
3370 * Get widget's parent window
3377 *************************************************************/
3380 gtk_widget_get_parent_window (GtkWidget *widget)
3382 GdkWindow *parent_window;
3384 g_return_val_if_fail (widget != NULL, NULL);
3385 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3386 g_return_val_if_fail (widget->parent != NULL, NULL);
3388 parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
3389 parent_window_key_id);
3391 return (parent_window != NULL) ? parent_window : widget->parent->window;
3394 /*****************************************
3395 * gtk_widget_set_uposition:
3400 *****************************************/
3403 gtk_widget_set_uposition (GtkWidget *widget,
3407 GtkWidgetAuxInfo *aux_info;
3409 g_return_if_fail (widget != NULL);
3410 g_return_if_fail (GTK_IS_WIDGET (widget));
3412 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3415 if (!aux_info_key_id)
3416 aux_info_key_id = g_quark_from_static_string (aux_info_key);
3417 aux_info = gtk_widget_aux_info_new ();
3418 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
3421 /* keep this in sync with gtk_window_compute_reposition() */
3428 if (GTK_IS_WINDOW (widget) && (aux_info->x != -1) && (aux_info->y != -1))
3429 gtk_window_reposition (GTK_WINDOW (widget), x, y);
3431 if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
3432 gtk_widget_size_allocate (widget, &widget->allocation);
3435 /*****************************************
3436 * gtk_widget_set_usize:
3441 *****************************************/
3444 gtk_widget_set_usize (GtkWidget *widget,
3448 GtkWidgetAuxInfo *aux_info;
3450 g_return_if_fail (widget != NULL);
3451 g_return_if_fail (GTK_IS_WIDGET (widget));
3453 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3456 if (!aux_info_key_id)
3457 aux_info_key_id = g_quark_from_static_string (aux_info_key);
3458 aux_info = gtk_widget_aux_info_new ();
3459 gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
3463 aux_info->width = width;
3465 aux_info->height = height;
3467 if (GTK_WIDGET_VISIBLE (widget))
3468 gtk_widget_queue_resize (widget);
3471 /*****************************************
3472 * gtk_widget_set_events:
3477 *****************************************/
3480 gtk_widget_set_events (GtkWidget *widget,
3485 g_return_if_fail (widget != NULL);
3486 g_return_if_fail (GTK_IS_WIDGET (widget));
3487 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3488 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
3490 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3495 eventp = g_new (gint, 1);
3499 event_key_id = g_quark_from_static_string (event_key);
3500 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3505 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3509 /*****************************************
3510 * gtk_widget_add_events:
3515 *****************************************/
3518 gtk_widget_add_events (GtkWidget *widget,
3523 g_return_if_fail (widget != NULL);
3524 g_return_if_fail (GTK_IS_WIDGET (widget));
3525 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3527 eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3533 eventp = g_new (gint, 1);
3539 event_key_id = g_quark_from_static_string (event_key);
3540 gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
3545 gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
3548 if (GTK_WIDGET_REALIZED (widget))
3550 gdk_window_set_events (widget->window,
3551 gdk_window_get_events (widget->window) | events);
3555 /*****************************************
3556 * gtk_widget_set_extension_events:
3561 *****************************************/
3564 gtk_widget_set_extension_events (GtkWidget *widget,
3565 GdkExtensionMode mode)
3567 GdkExtensionMode *modep;
3569 g_return_if_fail (widget != NULL);
3570 g_return_if_fail (GTK_IS_WIDGET (widget));
3572 modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3575 modep = g_new (GdkExtensionMode, 1);
3578 if (!extension_event_key_id)
3579 extension_event_key_id = g_quark_from_static_string (extension_event_key);
3580 gtk_object_set_data_by_id (GTK_OBJECT (widget), extension_event_key_id, modep);
3583 /*****************************************
3584 * gtk_widget_get_toplevel:
3589 *****************************************/
3592 gtk_widget_get_toplevel (GtkWidget *widget)
3594 g_return_val_if_fail (widget != NULL, NULL);
3595 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3597 while (widget->parent)
3598 widget = widget->parent;
3603 /*****************************************
3604 * gtk_widget_get_ancestor:
3609 *****************************************/
3612 gtk_widget_get_ancestor (GtkWidget *widget,
3613 GtkType widget_type)
3615 g_return_val_if_fail (widget != NULL, NULL);
3616 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3618 while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type))
3619 widget = widget->parent;
3621 if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type)))
3627 /*****************************************
3628 * gtk_widget_get_colormap:
3633 *****************************************/
3636 gtk_widget_get_colormap (GtkWidget *widget)
3638 GdkColormap *colormap;
3640 g_return_val_if_fail (widget != NULL, NULL);
3641 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3645 colormap = gdk_window_get_colormap (widget->window);
3646 /* If window was destroyed previously, we'll get NULL here */
3651 colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
3655 return gtk_widget_get_default_colormap ();
3658 /*****************************************
3659 * gtk_widget_get_visual:
3664 *****************************************/
3667 gtk_widget_get_visual (GtkWidget *widget)
3669 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3671 return gdk_colormap_get_visual (gtk_widget_get_colormap (widget));
3674 /*****************************************
3675 * gtk_widget_set_colormap:
3676 * Set the colormap for the widget to the given
3677 * value. Widget must not have been previously
3678 * realized. This probably should only be used
3679 * from an init() function.
3684 *****************************************/
3687 gtk_widget_set_colormap (GtkWidget *widget, GdkColormap *colormap)
3689 g_return_if_fail (widget != NULL);
3690 g_return_if_fail (GTK_IS_WIDGET (widget));
3691 g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
3692 g_return_if_fail (colormap != NULL);
3694 /* FIXME: reference count the colormap.
3697 gtk_object_set_data (GTK_OBJECT (widget),
3702 /*****************************************
3703 * gtk_widget_get_events:
3708 *****************************************/
3711 gtk_widget_get_events (GtkWidget *widget)
3715 g_return_val_if_fail (widget != NULL, 0);
3716 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
3718 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3725 /*****************************************
3726 * gtk_widget_get_extension_events:
3731 *****************************************/
3734 gtk_widget_get_extension_events (GtkWidget *widget)
3736 GdkExtensionMode *mode;
3738 g_return_val_if_fail (widget != NULL, 0);
3739 g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
3741 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3748 /*****************************************
3749 * gtk_widget_get_pointer:
3754 *****************************************/
3757 gtk_widget_get_pointer (GtkWidget *widget,
3761 g_return_if_fail (widget != NULL);
3762 g_return_if_fail (GTK_IS_WIDGET (widget));
3769 if (GTK_WIDGET_REALIZED (widget))
3771 gdk_window_get_pointer (widget->window, x, y, NULL);
3773 if (GTK_WIDGET_NO_WINDOW (widget))
3776 *x -= widget->allocation.x;
3778 *y -= widget->allocation.y;
3783 /*****************************************
3784 * gtk_widget_is_ancestor:
3789 *****************************************/
3792 gtk_widget_is_ancestor (GtkWidget *widget,
3793 GtkWidget *ancestor)
3795 g_return_val_if_fail (widget != NULL, FALSE);
3796 g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
3797 g_return_val_if_fail (ancestor != NULL, FALSE);
3801 if (widget->parent == ancestor)
3803 widget = widget->parent;
3809 static GQuark quark_composite_name = 0;
3812 gtk_widget_set_composite_name (GtkWidget *widget,
3815 g_return_if_fail (widget != NULL);
3816 g_return_if_fail (GTK_IS_WIDGET (widget));
3817 g_return_if_fail (GTK_WIDGET_COMPOSITE_CHILD (widget));
3818 g_return_if_fail (name != NULL);
3820 if (!quark_composite_name)
3821 quark_composite_name = g_quark_from_static_string ("gtk-composite-name");
3823 gtk_object_set_data_by_id_full (GTK_OBJECT (widget),
3824 quark_composite_name,
3830 gtk_widget_get_composite_name (GtkWidget *widget)
3832 g_return_val_if_fail (widget != NULL, NULL);
3833 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
3835 if (GTK_WIDGET_COMPOSITE_CHILD (widget) && widget->parent)
3836 return gtk_container_child_composite_name (GTK_CONTAINER (widget->parent),
3843 gtk_widget_push_composite_child (void)
3845 composite_child_stack++;
3849 gtk_widget_pop_composite_child (void)
3851 if (composite_child_stack)
3852 composite_child_stack--;
3855 /*****************************************
3856 * gtk_widget_push_colormap:
3861 *****************************************/
3864 gtk_widget_push_colormap (GdkColormap *cmap)
3866 g_return_if_fail (cmap != NULL);
3868 colormap_stack = g_slist_prepend (colormap_stack, cmap);
3871 /*****************************************
3872 * gtk_widget_pop_colormap:
3877 *****************************************/
3880 gtk_widget_pop_colormap (void)
3886 tmp = colormap_stack;
3887 colormap_stack = colormap_stack->next;
3888 g_slist_free_1 (tmp);
3892 /*****************************************
3893 * gtk_widget_set_default_colormap:
3898 *****************************************/
3901 gtk_widget_set_default_colormap (GdkColormap *colormap)
3903 if (default_colormap != colormap)
3905 if (default_colormap)
3906 gdk_colormap_unref (default_colormap);
3907 default_colormap = colormap;
3908 if (default_colormap)
3909 gdk_colormap_ref (default_colormap);
3913 /*****************************************
3914 * gtk_widget_get_default_colormap:
3919 *****************************************/
3922 gtk_widget_get_default_colormap (void)
3924 if (!default_colormap)
3925 default_colormap = gdk_colormap_get_system ();
3927 return default_colormap;
3930 /*****************************************
3931 * gtk_widget_get_default_visual:
3936 *****************************************/
3939 gtk_widget_get_default_visual (void)
3941 return gdk_colormap_get_visual (gtk_widget_get_default_colormap ());
3945 gtk_widget_emit_direction_changed (GtkWidget *widget,
3946 GtkTextDirection old_dir)
3948 PangoContext *context = gtk_widget_peek_pango_context (widget);
3951 pango_context_set_base_dir (context,
3952 gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ?
3953 PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL);
3955 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DIRECTION_CHANGED], old_dir);
3959 * gtk_widget_set_direction:
3960 * @widget: a #GtkWidget
3961 * @dir: the new direction
3963 * Set the reading direction on a particular widget. This direction
3964 * controls the primary direction for widgets containing text,
3965 * and also the direction in which the children of a container are
3966 * packed. The ability to set the direction is present in order
3967 * so that correct localization into languages with right-to-left
3968 * reading directions can be done. Generally, applications will
3969 * let the default reading direction present, except for containers
3970 * where the containers are arranged in an order that is explicitely
3971 * visual rather than logical (such as buttons for text justificiation).
3973 * If the direction is set to %GTK_TEXT_DIR_NONE, then the value
3974 * set by gtk_widget_set_default_direction() will be used.
3977 gtk_widget_set_direction (GtkWidget *widget,
3978 GtkTextDirection dir)
3980 GtkTextDirection old_dir;
3982 g_return_if_fail (widget != NULL);
3983 g_return_if_fail (GTK_IS_WIDGET (widget));
3984 g_return_if_fail (dir >= GTK_TEXT_DIR_NONE && dir <= GTK_TEXT_DIR_RTL);
3986 old_dir = gtk_widget_get_direction (widget);
3988 if (dir == GTK_TEXT_DIR_NONE)
3989 GTK_PRIVATE_UNSET_FLAG (widget, GTK_DIRECTION_SET);
3992 GTK_PRIVATE_SET_FLAG (widget, GTK_DIRECTION_SET);
3993 if (dir == GTK_TEXT_DIR_LTR)
3994 GTK_PRIVATE_SET_FLAG (widget, GTK_DIRECTION_LTR);
3996 GTK_PRIVATE_UNSET_FLAG (widget, GTK_DIRECTION_LTR);
3999 if (old_dir != gtk_widget_get_direction (widget))
4000 gtk_widget_emit_direction_changed (widget, old_dir);
4004 * gtk_widget_get_direction:
4005 * @widget: a #GtkWidget
4007 * Get the reading direction for a particular widget. See
4008 * gtk_widget_set_direction().
4010 * Return value: the reading direction for the widget.
4013 gtk_widget_get_direction (GtkWidget *widget)
4015 g_return_val_if_fail (widget != NULL, GTK_TEXT_DIR_LTR);
4016 g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_TEXT_DIR_LTR);
4018 if (GTK_WIDGET_DIRECTION_SET (widget))
4019 return GTK_WIDGET_DIRECTION_LTR (widget) ? GTK_TEXT_DIR_LTR : GTK_TEXT_DIR_RTL;
4021 return gtk_default_direction;
4025 gtk_widget_set_default_direction_recurse (GtkWidget *widget, gpointer data)
4027 GtkTextDirection old_dir = GPOINTER_TO_UINT (data);
4029 g_object_ref (G_OBJECT (widget));
4031 if (!GTK_WIDGET_DIRECTION_SET (widget))
4032 gtk_widget_emit_direction_changed (widget, old_dir);
4034 if (GTK_IS_CONTAINER (widget))
4035 gtk_container_forall (GTK_CONTAINER (widget),
4036 gtk_widget_set_default_direction_recurse,
4039 g_object_unref (G_OBJECT (widget));
4043 * gtk_widget_set_default_direction:
4044 * @dir: the new default direction. This cannot be
4045 * %GTK_TEXT_DIR_NONE.
4047 * Set the default reading direction for widgets where the
4048 * direction has not been explicitly set by gtk_widget_set_direction().
4051 gtk_widget_set_default_direction (GtkTextDirection dir)
4053 g_return_if_fail (dir == GTK_TEXT_DIR_RTL || dir == GTK_TEXT_DIR_LTR);
4055 if (dir != gtk_default_direction)
4057 GList *toplevels, *tmp_list;
4058 GtkTextDirection old_dir = gtk_default_direction;
4060 gtk_default_direction = dir;
4062 tmp_list = toplevels = gtk_window_list_toplevels ();
4065 gtk_widget_set_default_direction_recurse (tmp_list->data,
4066 GUINT_TO_POINTER (old_dir));
4067 g_object_unref (tmp_list->data);
4068 tmp_list = tmp_list->next;
4071 g_list_free (toplevels);
4077 * gtk_widget_get_default_direction:
4079 * Return value: the current default direction. See
4080 * gtk_widget_set_direction().
4083 gtk_widget_get_default_direction (void)
4085 return gtk_default_direction;
4089 gtk_widget_shutdown (GObject *object)
4091 GtkWidget *widget = GTK_WIDGET (object);
4094 gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
4096 GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
4097 if (GTK_WIDGET_REALIZED (widget))
4098 gtk_widget_unrealize (widget);
4100 G_OBJECT_CLASS (parent_class)->shutdown (object);
4104 gtk_widget_real_destroy (GtkObject *object)
4107 GtkStyle *saved_style;
4109 /* gtk_object_destroy() will already hold a refcount on object
4111 widget = GTK_WIDGET (object);
4113 gtk_grab_remove (widget);
4114 gtk_selection_remove_all (widget);
4116 saved_style = gtk_object_get_data_by_id (object, saved_default_style_key_id);
4119 gtk_style_unref (saved_style);
4120 gtk_object_remove_data_by_id (object, saved_default_style_key_id);
4123 gtk_style_unref (widget->style);
4124 widget->style = gtk_widget_peek_style ();
4125 gtk_style_ref (widget->style);
4127 GTK_OBJECT_CLASS (parent_class)->destroy (object);
4131 gtk_widget_finalize (GObject *object)
4133 GtkWidget *widget = GTK_WIDGET (object);
4134 GtkWidgetAuxInfo *aux_info;
4136 GdkExtensionMode *mode;
4137 GtkStyle *saved_style;
4139 gtk_grab_remove (widget);
4140 gtk_selection_remove_all (widget);
4142 saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
4145 gtk_style_unref (saved_style);
4146 gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
4149 gtk_style_unref (widget->style);
4150 widget->style = NULL;
4153 g_free (widget->name);
4155 aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
4157 gtk_widget_aux_info_destroy (aux_info);
4159 events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
4163 mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
4167 G_OBJECT_CLASS (parent_class)->finalize (object);
4170 /*****************************************
4171 * gtk_widget_real_map:
4176 *****************************************/
4179 gtk_widget_real_map (GtkWidget *widget)
4181 g_return_if_fail (GTK_IS_WIDGET (widget));
4182 g_return_if_fail (GTK_WIDGET_REALIZED (widget) == TRUE);
4184 if (!GTK_WIDGET_MAPPED (widget))
4186 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
4188 if (!GTK_WIDGET_NO_WINDOW (widget))
4189 gdk_window_show (widget->window);
4193 /*****************************************
4194 * gtk_widget_real_unmap:
4199 *****************************************/
4202 gtk_widget_real_unmap (GtkWidget *widget)
4204 g_return_if_fail (widget != NULL);
4205 g_return_if_fail (GTK_IS_WIDGET (widget));
4207 if (GTK_WIDGET_MAPPED (widget))
4209 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
4211 if (!GTK_WIDGET_NO_WINDOW (widget))
4212 gdk_window_hide (widget->window);
4216 /*****************************************
4217 * gtk_widget_real_realize:
4222 *****************************************/
4225 gtk_widget_real_realize (GtkWidget *widget)
4227 g_return_if_fail (widget != NULL);
4228 g_return_if_fail (GTK_IS_WIDGET (widget));
4229 g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
4231 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
4234 widget->window = gtk_widget_get_parent_window (widget);
4235 gdk_window_ref (widget->window);
4237 widget->style = gtk_style_attach (widget->style, widget->window);
4240 /*****************************************
4241 * gtk_widget_real_unrealize:
4246 *****************************************/
4249 gtk_widget_real_unrealize (GtkWidget *widget)
4251 g_return_if_fail (widget != NULL);
4252 g_return_if_fail (GTK_IS_WIDGET (widget));
4254 if (GTK_WIDGET_MAPPED (widget))
4255 gtk_widget_real_unmap (widget);
4257 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
4259 /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT (widget)->klass->type));
4262 /* We must do unrealize child widget BEFORE container widget.
4263 * gdk_window_destroy() destroys specified xwindow and its sub-xwindows.
4264 * So, unrealizing container widget bofore its children causes the problem
4265 * (for example, gdk_ic_destroy () with destroyed window causes crash. )
4268 if (GTK_IS_CONTAINER (widget))
4269 gtk_container_forall (GTK_CONTAINER (widget),
4270 (GtkCallback) gtk_widget_unrealize,
4273 gtk_style_detach (widget->style);
4274 if (!GTK_WIDGET_NO_WINDOW (widget))
4276 gdk_window_set_user_data (widget->window, NULL);
4277 gdk_window_destroy (widget->window);
4278 widget->window = NULL;
4282 gdk_window_unref (widget->window);
4283 widget->window = NULL;
4286 GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED);
4290 gtk_widget_real_draw (GtkWidget *widget,
4293 GdkEventExpose event;
4295 g_return_if_fail (widget != NULL);
4296 g_return_if_fail (GTK_IS_WIDGET (widget));
4297 g_return_if_fail (area != NULL);
4299 if (GTK_WIDGET_DRAWABLE (widget))
4301 event.type = GDK_EXPOSE;
4302 event.send_event = TRUE;
4303 event.window = widget->window;
4307 gdk_window_ref (event.window);
4308 gtk_widget_event (widget, (GdkEvent*) &event);
4309 gdk_window_unref (event.window);
4314 gtk_widget_real_size_request (GtkWidget *widget,
4315 GtkRequisition *requisition)
4317 g_return_if_fail (widget != NULL);
4318 g_return_if_fail (GTK_IS_WIDGET (widget));
4320 requisition->width = widget->requisition.width;
4321 requisition->height = widget->requisition.height;
4324 /*****************************************
4325 * gtk_widget_peek_colormap:
4330 *****************************************/
4333 gtk_widget_peek_colormap (void)
4336 return (GdkColormap*) colormap_stack->data;
4337 return gtk_widget_get_default_colormap ();
4341 gtk_widget_propagate_state (GtkWidget *widget,
4346 /* don't call this function with state==GTK_STATE_INSENSITIVE,
4347 * parent_sensitive==TRUE on a sensitive widget
4350 old_state = GTK_WIDGET_STATE (widget);
4352 if (data->parent_sensitive)
4354 GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
4356 if (GTK_WIDGET_IS_SENSITIVE (widget))
4358 if (data->state_restoration)
4359 GTK_WIDGET_STATE (widget) = GTK_WIDGET_SAVED_STATE (widget);
4361 GTK_WIDGET_STATE (widget) = data->state;
4365 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
4366 if (!data->state_restoration &&
4367 data->state != GTK_STATE_INSENSITIVE)
4368 GTK_WIDGET_SAVED_STATE (widget) = data->state;
4373 GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
4374 if (!data->state_restoration)
4376 if (data->state != GTK_STATE_INSENSITIVE)
4377 GTK_WIDGET_SAVED_STATE (widget) = data->state;
4379 else if (GTK_WIDGET_STATE (widget) != GTK_STATE_INSENSITIVE)
4380 GTK_WIDGET_SAVED_STATE (widget) = GTK_WIDGET_STATE (widget);
4381 GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
4384 if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
4388 window = gtk_widget_get_ancestor (widget, GTK_TYPE_WINDOW);
4390 gtk_window_set_focus (GTK_WINDOW (window), NULL);
4393 if (old_state != GTK_WIDGET_STATE (widget))
4395 gtk_widget_ref (widget);
4396 gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
4398 if (GTK_IS_CONTAINER (widget))
4400 data->parent_sensitive = (GTK_WIDGET_IS_SENSITIVE (widget) != FALSE);
4401 data->state = GTK_WIDGET_STATE (widget);
4402 if (data->use_forall)
4403 gtk_container_forall (GTK_CONTAINER (widget),
4404 (GtkCallback) gtk_widget_propagate_state,
4407 gtk_container_foreach (GTK_CONTAINER (widget),
4408 (GtkCallback) gtk_widget_propagate_state,
4411 gtk_widget_unref (widget);
4415 /*****************************************
4416 * gtk_widget_aux_info_new:
4421 *****************************************/
4423 static GtkWidgetAuxInfo*
4424 gtk_widget_aux_info_new (void)
4426 GtkWidgetAuxInfo *aux_info;
4428 if (!aux_info_mem_chunk)
4429 aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
4430 sizeof (GtkWidgetAuxInfo),
4431 1024, G_ALLOC_AND_FREE);
4433 aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
4437 aux_info->width = 0;
4438 aux_info->height = 0;
4443 /*****************************************
4444 * gtk_widget_aux_info_destroy:
4449 *****************************************/
4452 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
4454 g_return_if_fail (aux_info != NULL);
4456 g_mem_chunk_free (aux_info_mem_chunk, aux_info);
4460 gtk_widget_shape_info_destroy (GtkWidgetShapeInfo *info)
4462 gdk_drawable_unref (info->shape_mask);
4466 /*****************************************
4467 * gtk_widget_shape_combine_mask:
4468 * set a shape for this widgets' gdk window, this allows for
4469 * transparent windows etc., see gdk_window_shape_combine_mask
4470 * for more information
4475 *****************************************/
4477 gtk_widget_shape_combine_mask (GtkWidget *widget,
4478 GdkBitmap *shape_mask,
4482 GtkWidgetShapeInfo* shape_info;
4484 g_return_if_fail (widget != NULL);
4485 g_return_if_fail (GTK_IS_WIDGET (widget));
4486 /* set_shape doesn't work on widgets without gdk window */
4487 g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
4491 GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4494 gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
4496 gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
4500 GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
4502 shape_info = g_new (GtkWidgetShapeInfo, 1);
4503 gtk_object_set_data_full (GTK_OBJECT (widget), shape_info_key, shape_info,
4504 (GDestroyNotify)gtk_widget_shape_info_destroy);
4506 shape_info->shape_mask = gdk_drawable_ref (shape_mask);
4507 shape_info->offset_x = offset_x;
4508 shape_info->offset_y = offset_y;
4510 /* set shape if widget has a gdk window allready.
4511 * otherwise the shape is scheduled to be set by gtk_widget_realize.
4514 gdk_window_shape_combine_mask (widget->window, shape_mask,
4515 offset_x, offset_y);
4520 gtk_reset_shapes_recurse (GtkWidget *widget,
4526 gdk_window_get_user_data (window, &data);
4530 gdk_window_shape_combine_mask (window, NULL, 0, 0);
4531 for (list = gdk_window_peek_children (window); list; list = list->next)
4532 gtk_reset_shapes_recurse (widget, list->data);
4536 gtk_widget_reset_shapes (GtkWidget *widget)
4538 g_return_if_fail (widget != NULL);
4539 g_return_if_fail (GTK_IS_WIDGET (widget));
4540 g_return_if_fail (GTK_WIDGET_REALIZED (widget));
4542 if (!GTK_WIDGET_HAS_SHAPE_MASK (widget))
4543 gtk_reset_shapes_recurse (widget, widget->window);
4547 gtk_widget_ref (GtkWidget *widget)
4549 g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
4551 return (GtkWidget*) g_object_ref ((GObject*) widget);
4555 gtk_widget_unref (GtkWidget *widget)
4557 g_return_if_fail (GTK_IS_WIDGET (widget));
4559 g_object_unref ((GObject*) widget);
4563 gtk_widget_path (GtkWidget *widget,
4564 guint *path_length_p,
4566 gchar **path_reversed_p)
4568 static gchar *rev_path = NULL;
4569 static guint path_len = 0;
4572 g_return_if_fail (widget != NULL);
4573 g_return_if_fail (GTK_IS_WIDGET (widget));
4582 string = gtk_widget_get_name (widget);
4583 l = strlen (string);
4584 while (path_len <= len + l + 1)
4586 path_len += INIT_PATH_SIZE;
4587 rev_path = g_realloc (rev_path, path_len);
4595 widget = widget->parent;
4598 rev_path[len++] = '.';
4600 rev_path[len++] = 0;
4605 *path_length_p = len - 1;
4606 if (path_reversed_p)
4607 *path_reversed_p = g_strdup (rev_path);
4610 *path_p = g_strdup (rev_path);
4611 g_strreverse (*path_p);
4616 gtk_widget_class_path (GtkWidget *widget,
4617 guint *path_length_p,
4619 gchar **path_reversed_p)
4621 static gchar *rev_path = NULL;
4622 static guint path_len = 0;
4625 g_return_if_fail (widget != NULL);
4626 g_return_if_fail (GTK_IS_WIDGET (widget));
4635 string = gtk_type_name (GTK_WIDGET_TYPE (widget));
4636 l = strlen (string);
4637 while (path_len <= len + l + 1)
4639 path_len += INIT_PATH_SIZE;
4640 rev_path = g_realloc (rev_path, path_len);
4648 widget = widget->parent;
4651 rev_path[len++] = '.';
4653 rev_path[len++] = 0;
4658 *path_length_p = len - 1;
4659 if (path_reversed_p)
4660 *path_reversed_p = g_strdup (rev_path);
4663 *path_p = g_strdup (rev_path);
4664 g_strreverse (*path_p);