]> Pileus Git - ~andy/gtk/blob - gtk/gtkwidget.c
When gtk_widget_draw() is called on a REDRAW_PENDING widget, draw it and
[~andy/gtk] / gtk / gtkwidget.c
1 /* GTK - The GIMP Toolkit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the Free
16  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18 #include <stdarg.h>
19 #include <string.h>
20 #include "gtkcontainer.h"
21 #include "gtkmain.h"
22 #include "gtkrc.h"
23 #include "gtkselection.h"
24 #include "gtksignal.h"
25 #include "gtkwidget.h"
26 #include "gtkwindow.h"
27 #include "gtkprivate.h"
28 #include "gdk/gdk.h"
29 #include "gdk/gdkx.h"
30
31
32 #define WIDGET_CLASS(w)  GTK_WIDGET_CLASS (GTK_OBJECT (w)->klass)
33
34
35 enum {
36   SHOW,
37   HIDE,
38   MAP,
39   UNMAP,
40   REALIZE,
41   UNREALIZE,
42   DRAW,
43   DRAW_FOCUS,
44   DRAW_DEFAULT,
45   SIZE_REQUEST,
46   SIZE_ALLOCATE,
47   STATE_CHANGED,
48   PARENT_SET,
49   STYLE_SET,
50   INSTALL_ACCELERATOR,
51   REMOVE_ACCELERATOR,
52   EVENT,
53   BUTTON_PRESS_EVENT,
54   BUTTON_RELEASE_EVENT,
55   MOTION_NOTIFY_EVENT,
56   DELETE_EVENT,
57   DESTROY_EVENT,
58   EXPOSE_EVENT,
59   KEY_PRESS_EVENT,
60   KEY_RELEASE_EVENT,
61   ENTER_NOTIFY_EVENT,
62   LEAVE_NOTIFY_EVENT,
63   CONFIGURE_EVENT,
64   FOCUS_IN_EVENT,
65   FOCUS_OUT_EVENT,
66   MAP_EVENT,
67   UNMAP_EVENT,
68   PROPERTY_NOTIFY_EVENT,
69   SELECTION_CLEAR_EVENT,
70   SELECTION_REQUEST_EVENT,
71   SELECTION_NOTIFY_EVENT,
72   SELECTION_RECEIVED,
73   PROXIMITY_IN_EVENT,
74   PROXIMITY_OUT_EVENT,
75   DRAG_BEGIN_EVENT,
76   DRAG_REQUEST_EVENT,
77   DRAG_END_EVENT,
78   DROP_ENTER_EVENT,
79   DROP_LEAVE_EVENT,
80   DROP_DATA_AVAILABLE_EVENT,
81   OTHER_EVENT,
82   CLIENT_EVENT,
83   NO_EXPOSE_EVENT,
84   LAST_SIGNAL
85 };
86
87 enum {
88   ARG_0,
89   ARG_NAME,
90   ARG_PARENT,
91   ARG_X,
92   ARG_Y,
93   ARG_WIDTH,
94   ARG_HEIGHT,
95   ARG_VISIBLE,
96   ARG_SENSITIVE,
97   ARG_CAN_FOCUS,
98   ARG_HAS_FOCUS,
99   ARG_CAN_DEFAULT,
100   ARG_HAS_DEFAULT,
101   ARG_STYLE,
102   ARG_EVENTS,
103   ARG_EXTENSION_EVENTS
104 };
105
106
107 typedef void (*GtkWidgetSignal1) (GtkObject *object,
108                                   gpointer   arg1,
109                                   gpointer   data);
110 typedef gint (*GtkWidgetSignal2) (GtkObject *object,
111                                   gpointer   arg1,
112                                   gchar      arg2,
113                                   gchar      arg3,
114                                   gpointer   data);
115 typedef void (*GtkWidgetSignal3) (GtkObject *object,
116                                   gpointer   arg1,
117                                   gpointer   data);
118 typedef gint (*GtkWidgetSignal4) (GtkObject *object,
119                                   gpointer   arg1,
120                                   gpointer   data);
121 typedef void (*GtkWidgetSignal5) (GtkObject *object,
122                                   guint      arg1,
123                                   gpointer   data);
124 typedef void (*GtkWidgetSignal6) (GtkObject *object,
125                                   GtkObject *arg1,
126                                   gpointer   data);
127 typedef void (*GtkWidgetSignal7) (GtkObject *object,
128                                   gpointer   arg1,
129                                   gpointer   data);
130
131 typedef struct  _GtkStateData    GtkStateData;
132
133 struct _GtkStateData
134 {
135   GtkStateType  state;
136   gint          parent_sensitive;
137 };
138
139
140 static void gtk_widget_marshal_signal_1 (GtkObject      *object,
141                                          GtkSignalFunc   func,
142                                          gpointer        func_data,
143                                          GtkArg         *args);
144 static void gtk_widget_marshal_signal_2 (GtkObject      *object,
145                                          GtkSignalFunc   func,
146                                          gpointer        func_data,
147                                          GtkArg         *args);
148 static void gtk_widget_marshal_signal_3 (GtkObject      *object,
149                                          GtkSignalFunc   func,
150                                          gpointer        func_data,
151                                          GtkArg         *args);
152 static void gtk_widget_marshal_signal_4 (GtkObject      *object,
153                                          GtkSignalFunc   func,
154                                          gpointer        func_data,
155                                          GtkArg         *args);
156 static void gtk_widget_marshal_signal_5 (GtkObject      *object,
157                                          GtkSignalFunc   func,
158                                          gpointer        func_data,
159                                          GtkArg         *args);
160 static void gtk_widget_marshal_signal_6 (GtkObject      *object,
161                                          GtkSignalFunc   func,
162                                          gpointer        func_data,
163                                          GtkArg         *args);
164 static void gtk_widget_marshal_signal_7 (GtkObject      *object,
165                                          GtkSignalFunc   func,
166                                          gpointer        func_data,
167                                          GtkArg         *args);
168
169 static void gtk_widget_class_init                (GtkWidgetClass    *klass);
170 static void gtk_widget_init                      (GtkWidget         *widget);
171 static void gtk_widget_set_arg                   (GtkWidget         *widget,
172                                                   GtkArg            *arg,
173                                                   guint              arg_id);
174 static void gtk_widget_get_arg                   (GtkWidget         *widget,
175                                                   GtkArg            *arg,
176                                                   guint              arg_id);
177 static void gtk_widget_shutdown                  (GtkObject         *object);
178 static void gtk_widget_real_destroy              (GtkObject         *object);
179 static void gtk_widget_finalize                  (GtkObject         *object);
180 static void gtk_widget_real_show                 (GtkWidget         *widget);
181 static void gtk_widget_real_hide                 (GtkWidget         *widget);
182 static void gtk_widget_real_map                  (GtkWidget         *widget);
183 static void gtk_widget_real_unmap                (GtkWidget         *widget);
184 static void gtk_widget_real_realize              (GtkWidget         *widget);
185 static void gtk_widget_real_unrealize            (GtkWidget         *widget);
186 static void gtk_widget_real_draw                 (GtkWidget         *widget,
187                                                   GdkRectangle      *area);
188 static gint gtk_widget_real_queue_draw           (GtkWidget         *widget);
189 static void gtk_widget_real_size_allocate        (GtkWidget         *widget,
190                                                   GtkAllocation     *allocation);
191 static void gtk_widget_style_set                 (GtkWidget         *widget,
192                                                   GtkStyle          *previous_style);
193      
194 static GdkColormap* gtk_widget_peek_colormap (void);
195 static GdkVisual*   gtk_widget_peek_visual   (void);
196 static GtkStyle*    gtk_widget_peek_style    (void);
197
198 static void gtk_widget_reparent_container_child  (GtkWidget     *widget,
199                                                   gpointer       client_data);
200 static void gtk_widget_propagate_state           (GtkWidget     *widget,
201                                                   GtkStateData  *data);
202 static void gtk_widget_draw_children_recurse     (GtkWidget     *widget,
203                                                   gpointer       client_data);
204 static void gtk_widget_set_style_internal        (GtkWidget     *widget,
205                                                   GtkStyle      *style,
206                                                   gboolean       initial_emission);
207 static void gtk_widget_set_style_recurse         (GtkWidget     *widget,
208                                                   gpointer       client_data);
209
210 extern GtkArg* gtk_object_collect_args (guint   *nargs,
211                                         va_list  args1,
212                                         va_list  args2);
213
214 static GtkWidgetAuxInfo* gtk_widget_aux_info_new     (void);
215 static void              gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info);
216
217 static GtkObjectClass *parent_class = NULL;
218 static guint widget_signals[LAST_SIGNAL] = { 0 };
219
220 static GMemChunk *aux_info_mem_chunk = NULL;
221
222 static GdkColormap *default_colormap = NULL;
223 static GdkVisual *default_visual = NULL;
224 static GtkStyle *default_style = NULL;
225
226 static GSList *colormap_stack = NULL;
227 static GSList *visual_stack = NULL;
228 static GSList *style_stack = NULL;
229
230 static GSList *gtk_widget_redraw_queue = NULL;
231 static GSList *gtk_widget_resize_queue = NULL;
232
233 static const gchar *aux_info_key = "gtk-aux-info";
234 static guint        aux_info_key_id = 0;
235 static const gchar *event_key = "gtk-event-mask";
236 static guint        event_key_id = 0;
237 static const gchar *extension_event_key = "gtk-extension-event-mode";
238 static guint        extension_event_key_id = 0;
239 static const gchar *parent_window_key = "gtk-parent-window";
240 static guint        parent_window_key_id = 0;
241 static const gchar *saved_default_style_key = "gtk-saved-default-style";
242 static guint        saved_default_style_key_id = 0;
243 static const gchar *shape_info_key = "gtk-shape-info";
244 static const gchar *colormap_key = "gtk-colormap";
245 static const gchar *visual_key = "gtk-visual";
246
247
248
249 /*****************************************
250  * gtk_widget_get_type:
251  *
252  *   arguments:
253  *
254  *   results:
255  *****************************************/
256
257 guint
258 gtk_widget_get_type ()
259 {
260   static guint widget_type = 0;
261   
262   if (!widget_type)
263     {
264       GtkTypeInfo widget_info =
265       {
266         "GtkWidget",
267         sizeof (GtkWidget),
268         sizeof (GtkWidgetClass),
269         (GtkClassInitFunc) gtk_widget_class_init,
270         (GtkObjectInitFunc) gtk_widget_init,
271         (GtkArgSetFunc) gtk_widget_set_arg,
272         (GtkArgGetFunc) gtk_widget_get_arg,
273       };
274       
275       widget_type = gtk_type_unique (gtk_object_get_type (), &widget_info);
276     }
277   
278   return widget_type;
279 }
280
281 /*****************************************
282  * gtk_widget_class_init:
283  *
284  *   arguments:
285  *
286  *   results:
287  *****************************************/
288
289 static void
290 gtk_widget_class_init (GtkWidgetClass *klass)
291 {
292   GtkObjectClass *object_class;
293   
294   object_class = (GtkObjectClass*) klass;
295   
296   parent_class = gtk_type_class (gtk_object_get_type ());
297   
298   gtk_object_add_arg_type ("GtkWidget::name", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_NAME);
299   gtk_object_add_arg_type ("GtkWidget::parent", GTK_TYPE_CONTAINER, GTK_ARG_READWRITE, ARG_PARENT);
300   gtk_object_add_arg_type ("GtkWidget::x", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_X);
301   gtk_object_add_arg_type ("GtkWidget::y", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_Y);
302   gtk_object_add_arg_type ("GtkWidget::width", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_WIDTH);
303   gtk_object_add_arg_type ("GtkWidget::height", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_HEIGHT);
304   gtk_object_add_arg_type ("GtkWidget::visible", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_VISIBLE);
305   gtk_object_add_arg_type ("GtkWidget::sensitive", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_SENSITIVE);
306   gtk_object_add_arg_type ("GtkWidget::can_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_FOCUS);
307   gtk_object_add_arg_type ("GtkWidget::has_focus", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_FOCUS);
308   gtk_object_add_arg_type ("GtkWidget::can_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_CAN_DEFAULT);
309   gtk_object_add_arg_type ("GtkWidget::has_default", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_HAS_DEFAULT);
310   gtk_object_add_arg_type ("GtkWidget::style", GTK_TYPE_STYLE, GTK_ARG_READWRITE, ARG_STYLE);
311   gtk_object_add_arg_type ("GtkWidget::events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EVENTS);
312   gtk_object_add_arg_type ("GtkWidget::extension_events", GTK_TYPE_GDK_EVENT_MASK, GTK_ARG_READWRITE, ARG_EXTENSION_EVENTS);
313   
314   widget_signals[SHOW] =
315     gtk_signal_new ("show",
316                     GTK_RUN_FIRST,
317                     object_class->type,
318                     GTK_SIGNAL_OFFSET (GtkWidgetClass, show),
319                     gtk_signal_default_marshaller,
320                     GTK_TYPE_NONE, 0);
321   widget_signals[HIDE] =
322     gtk_signal_new ("hide",
323                     GTK_RUN_FIRST,
324                     object_class->type,
325                     GTK_SIGNAL_OFFSET (GtkWidgetClass, hide),
326                     gtk_signal_default_marshaller,
327                     GTK_TYPE_NONE, 0);
328   widget_signals[MAP] =
329     gtk_signal_new ("map",
330                     GTK_RUN_FIRST,
331                     object_class->type,
332                     GTK_SIGNAL_OFFSET (GtkWidgetClass, map),
333                     gtk_signal_default_marshaller,
334                     GTK_TYPE_NONE, 0);
335   widget_signals[UNMAP] =
336     gtk_signal_new ("unmap",
337                     GTK_RUN_FIRST,
338                     object_class->type,
339                     GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap),
340                     gtk_signal_default_marshaller,
341                     GTK_TYPE_NONE, 0);
342   widget_signals[REALIZE] =
343     gtk_signal_new ("realize",
344                     GTK_RUN_FIRST,
345                     object_class->type,
346                     GTK_SIGNAL_OFFSET (GtkWidgetClass, realize),
347                     gtk_signal_default_marshaller,
348                     GTK_TYPE_NONE, 0);
349   widget_signals[UNREALIZE] =
350     gtk_signal_new ("unrealize",
351                     GTK_RUN_FIRST,
352                     object_class->type,
353                     GTK_SIGNAL_OFFSET (GtkWidgetClass, unrealize),
354                     gtk_signal_default_marshaller,
355                     GTK_TYPE_NONE, 0);
356   widget_signals[DRAW] =
357     gtk_signal_new ("draw",
358                     GTK_RUN_FIRST,
359                     object_class->type,
360                     GTK_SIGNAL_OFFSET (GtkWidgetClass, draw),
361                     gtk_widget_marshal_signal_1,
362                     GTK_TYPE_NONE, 1,
363                     GTK_TYPE_POINTER);
364   widget_signals[DRAW_FOCUS] =
365     gtk_signal_new ("draw_focus",
366                     GTK_RUN_FIRST,
367                     object_class->type,
368                     GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_focus),
369                     gtk_signal_default_marshaller,
370                     GTK_TYPE_NONE, 0);
371   widget_signals[DRAW_DEFAULT] =
372     gtk_signal_new ("draw_default",
373                     GTK_RUN_FIRST,
374                     object_class->type,
375                     GTK_SIGNAL_OFFSET (GtkWidgetClass, draw_default),
376                     gtk_signal_default_marshaller,
377                     GTK_TYPE_NONE, 0);
378   widget_signals[SIZE_REQUEST] =
379     gtk_signal_new ("size_request",
380                     GTK_RUN_FIRST,
381                     object_class->type,
382                     GTK_SIGNAL_OFFSET (GtkWidgetClass, size_request),
383                     gtk_widget_marshal_signal_1,
384                     GTK_TYPE_NONE, 1,
385                     GTK_TYPE_POINTER);
386   widget_signals[SIZE_ALLOCATE] =
387     gtk_signal_new ("size_allocate",
388                     GTK_RUN_FIRST,
389                     object_class->type,
390                     GTK_SIGNAL_OFFSET (GtkWidgetClass, size_allocate),
391                     gtk_widget_marshal_signal_1,
392                     GTK_TYPE_NONE, 1,
393                     GTK_TYPE_POINTER);
394   widget_signals[STATE_CHANGED] =
395     gtk_signal_new ("state_changed",
396                     GTK_RUN_FIRST,
397                     object_class->type,
398                     GTK_SIGNAL_OFFSET (GtkWidgetClass, state_changed),
399                     gtk_widget_marshal_signal_5,
400                     GTK_TYPE_NONE, 1,
401                     GTK_TYPE_UINT);
402   widget_signals[PARENT_SET] =
403     gtk_signal_new ("parent_set",
404                     GTK_RUN_FIRST,
405                     object_class->type,
406                     GTK_SIGNAL_OFFSET (GtkWidgetClass, parent_set),
407                     gtk_widget_marshal_signal_6,
408                     GTK_TYPE_NONE, 1,
409                     GTK_TYPE_OBJECT);
410   widget_signals[STYLE_SET] =
411     gtk_signal_new ("style_set",
412                     GTK_RUN_FIRST,
413                     object_class->type,
414                     GTK_SIGNAL_OFFSET (GtkWidgetClass, style_set),
415                     gtk_widget_marshal_signal_7,
416                     GTK_TYPE_NONE, 1,
417                     GTK_TYPE_BOXED);
418   widget_signals[INSTALL_ACCELERATOR] =
419     gtk_signal_new ("install_accelerator",
420                     GTK_RUN_FIRST,
421                     object_class->type,
422                     GTK_SIGNAL_OFFSET (GtkWidgetClass, install_accelerator),
423                     gtk_widget_marshal_signal_2,
424                     GTK_TYPE_BOOL, 3,
425                     GTK_TYPE_STRING,
426                     GTK_TYPE_CHAR,
427                     GTK_TYPE_INT);
428   widget_signals[REMOVE_ACCELERATOR] =
429     gtk_signal_new ("remove_accelerator",
430                     GTK_RUN_FIRST,
431                     object_class->type,
432                     GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator),
433                     gtk_widget_marshal_signal_3,
434                     GTK_TYPE_NONE, 1,
435                     GTK_TYPE_STRING);
436   widget_signals[EVENT] =
437     gtk_signal_new ("event",
438                     GTK_RUN_LAST,
439                     object_class->type,
440                     GTK_SIGNAL_OFFSET (GtkWidgetClass, event),
441                     gtk_widget_marshal_signal_4,
442                     GTK_TYPE_BOOL, 1,
443                     GTK_TYPE_GDK_EVENT);
444   widget_signals[BUTTON_PRESS_EVENT] =
445     gtk_signal_new ("button_press_event",
446                     GTK_RUN_LAST,
447                     object_class->type,
448                     GTK_SIGNAL_OFFSET (GtkWidgetClass, button_press_event),
449                     gtk_widget_marshal_signal_4,
450                     GTK_TYPE_BOOL, 1,
451                     GTK_TYPE_GDK_EVENT);
452   widget_signals[BUTTON_RELEASE_EVENT] =
453     gtk_signal_new ("button_release_event",
454                     GTK_RUN_LAST,
455                     object_class->type,
456                     GTK_SIGNAL_OFFSET (GtkWidgetClass, button_release_event),
457                     gtk_widget_marshal_signal_4,
458                     GTK_TYPE_BOOL, 1,
459                     GTK_TYPE_GDK_EVENT);
460   widget_signals[MOTION_NOTIFY_EVENT] =
461     gtk_signal_new ("motion_notify_event",
462                     GTK_RUN_LAST,
463                     object_class->type,
464                     GTK_SIGNAL_OFFSET (GtkWidgetClass, motion_notify_event),
465                     gtk_widget_marshal_signal_4,
466                     GTK_TYPE_BOOL, 1,
467                     GTK_TYPE_GDK_EVENT);
468   widget_signals[DELETE_EVENT] =
469     gtk_signal_new ("delete_event",
470                     GTK_RUN_LAST,
471                     object_class->type,
472                     GTK_SIGNAL_OFFSET (GtkWidgetClass, delete_event),
473                     gtk_widget_marshal_signal_4,
474                     GTK_TYPE_BOOL, 1,
475                     GTK_TYPE_GDK_EVENT);
476   widget_signals[DESTROY_EVENT] =
477     gtk_signal_new ("destroy_event",
478                     GTK_RUN_LAST,
479                     object_class->type,
480                     GTK_SIGNAL_OFFSET (GtkWidgetClass, destroy_event),
481                     gtk_widget_marshal_signal_4,
482                     GTK_TYPE_BOOL, 1,
483                     GTK_TYPE_GDK_EVENT);
484   widget_signals[EXPOSE_EVENT] =
485     gtk_signal_new ("expose_event",
486                     GTK_RUN_LAST,
487                     object_class->type,
488                     GTK_SIGNAL_OFFSET (GtkWidgetClass, expose_event),
489                     gtk_widget_marshal_signal_4,
490                     GTK_TYPE_BOOL, 1,
491                     GTK_TYPE_GDK_EVENT);
492   widget_signals[KEY_PRESS_EVENT] =
493     gtk_signal_new ("key_press_event",
494                     GTK_RUN_LAST,
495                     object_class->type,
496                     GTK_SIGNAL_OFFSET (GtkWidgetClass, key_press_event),
497                     gtk_widget_marshal_signal_4,
498                     GTK_TYPE_BOOL, 1,
499                     GTK_TYPE_GDK_EVENT);
500   widget_signals[KEY_RELEASE_EVENT] =
501     gtk_signal_new ("key_release_event",
502                     GTK_RUN_LAST,
503                     object_class->type,
504                     GTK_SIGNAL_OFFSET (GtkWidgetClass, key_release_event),
505                     gtk_widget_marshal_signal_4,
506                     GTK_TYPE_BOOL, 1,
507                     GTK_TYPE_GDK_EVENT);
508   widget_signals[ENTER_NOTIFY_EVENT] =
509     gtk_signal_new ("enter_notify_event",
510                     GTK_RUN_LAST,
511                     object_class->type,
512                     GTK_SIGNAL_OFFSET (GtkWidgetClass, enter_notify_event),
513                     gtk_widget_marshal_signal_4,
514                     GTK_TYPE_BOOL, 1,
515                     GTK_TYPE_GDK_EVENT);
516   widget_signals[LEAVE_NOTIFY_EVENT] =
517     gtk_signal_new ("leave_notify_event",
518                     GTK_RUN_LAST,
519                     object_class->type,
520                     GTK_SIGNAL_OFFSET (GtkWidgetClass, leave_notify_event),
521                     gtk_widget_marshal_signal_4,
522                     GTK_TYPE_BOOL, 1,
523                     GTK_TYPE_GDK_EVENT);
524   widget_signals[CONFIGURE_EVENT] =
525     gtk_signal_new ("configure_event",
526                     GTK_RUN_LAST,
527                     object_class->type,
528                     GTK_SIGNAL_OFFSET (GtkWidgetClass, configure_event),
529                     gtk_widget_marshal_signal_4,
530                     GTK_TYPE_BOOL, 1,
531                     GTK_TYPE_GDK_EVENT);
532   widget_signals[FOCUS_IN_EVENT] =
533     gtk_signal_new ("focus_in_event",
534                     GTK_RUN_LAST,
535                     object_class->type,
536                     GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_in_event),
537                     gtk_widget_marshal_signal_4,
538                     GTK_TYPE_BOOL, 1,
539                     GTK_TYPE_GDK_EVENT);
540   widget_signals[FOCUS_OUT_EVENT] =
541     gtk_signal_new ("focus_out_event",
542                     GTK_RUN_LAST,
543                     object_class->type,
544                     GTK_SIGNAL_OFFSET (GtkWidgetClass, focus_out_event),
545                     gtk_widget_marshal_signal_4,
546                     GTK_TYPE_BOOL, 1,
547                     GTK_TYPE_GDK_EVENT);
548   widget_signals[MAP_EVENT] =
549     gtk_signal_new ("map_event",
550                     GTK_RUN_LAST,
551                     object_class->type,
552                     GTK_SIGNAL_OFFSET (GtkWidgetClass, map_event),
553                     gtk_widget_marshal_signal_4,
554                     GTK_TYPE_BOOL, 1,
555                     GTK_TYPE_GDK_EVENT);
556   widget_signals[UNMAP_EVENT] =
557     gtk_signal_new ("unmap_event",
558                     GTK_RUN_LAST,
559                     object_class->type,
560                     GTK_SIGNAL_OFFSET (GtkWidgetClass, unmap_event),
561                     gtk_widget_marshal_signal_4,
562                     GTK_TYPE_BOOL, 1,
563                     GTK_TYPE_GDK_EVENT);
564   widget_signals[PROPERTY_NOTIFY_EVENT] =
565     gtk_signal_new ("property_notify_event",
566                     GTK_RUN_LAST,
567                     object_class->type,
568                     GTK_SIGNAL_OFFSET (GtkWidgetClass, property_notify_event),
569                     gtk_widget_marshal_signal_4,
570                     GTK_TYPE_BOOL, 1,
571                     GTK_TYPE_GDK_EVENT);
572   widget_signals[SELECTION_CLEAR_EVENT] =
573     gtk_signal_new ("selection_clear_event",
574                     GTK_RUN_LAST,
575                     object_class->type,
576                     GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_clear_event),
577                     gtk_widget_marshal_signal_4,
578                     GTK_TYPE_BOOL, 1,
579                     GTK_TYPE_GDK_EVENT);
580   widget_signals[SELECTION_REQUEST_EVENT] =
581     gtk_signal_new ("selection_request_event",
582                     GTK_RUN_LAST,
583                     object_class->type,
584                     GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_request_event),
585                     gtk_widget_marshal_signal_4,
586                     GTK_TYPE_BOOL, 1,
587                     GTK_TYPE_GDK_EVENT);
588   widget_signals[SELECTION_NOTIFY_EVENT] =
589     gtk_signal_new ("selection_notify_event",
590                     GTK_RUN_LAST,
591                     object_class->type,
592                     GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_notify_event),
593                     gtk_widget_marshal_signal_4,
594                     GTK_TYPE_BOOL, 1,
595                     GTK_TYPE_GDK_EVENT);
596   widget_signals[SELECTION_RECEIVED] =
597     gtk_signal_new ("selection_received",
598                     GTK_RUN_LAST,
599                     object_class->type,
600                     GTK_SIGNAL_OFFSET (GtkWidgetClass, selection_received),
601                     gtk_widget_marshal_signal_1,
602                     GTK_TYPE_BOOL, 1,
603                     GTK_TYPE_GDK_EVENT);
604   widget_signals[PROXIMITY_IN_EVENT] =
605     gtk_signal_new ("proximity_in_event",
606                     GTK_RUN_FIRST,
607                     object_class->type,
608                     GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_in_event),
609                     gtk_widget_marshal_signal_4,
610                     GTK_TYPE_BOOL, 1,
611                     GTK_TYPE_GDK_EVENT);
612   widget_signals[PROXIMITY_OUT_EVENT] =
613     gtk_signal_new ("proximity_out_event",
614                     GTK_RUN_LAST,
615                     object_class->type,
616                     GTK_SIGNAL_OFFSET (GtkWidgetClass, proximity_out_event),
617                     gtk_widget_marshal_signal_4,
618                     GTK_TYPE_BOOL, 1,
619                     GTK_TYPE_GDK_EVENT);
620   widget_signals[DRAG_BEGIN_EVENT] =
621     gtk_signal_new ("drag_begin_event",
622                     GTK_RUN_LAST,
623                     object_class->type,
624                     GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_begin_event),
625                     gtk_widget_marshal_signal_4,
626                     GTK_TYPE_BOOL, 1,
627                     GTK_TYPE_GDK_EVENT);
628   widget_signals[DRAG_REQUEST_EVENT] =
629     gtk_signal_new ("drag_request_event",
630                     GTK_RUN_LAST,
631                     object_class->type,
632                     GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_request_event),
633                     gtk_widget_marshal_signal_4,
634                     GTK_TYPE_BOOL, 1,
635                     GTK_TYPE_GDK_EVENT);
636   widget_signals[DRAG_END_EVENT] =
637     gtk_signal_new ("drag_end_event",
638                     GTK_RUN_LAST,
639                     object_class->type,
640                     GTK_SIGNAL_OFFSET (GtkWidgetClass, drag_end_event),
641                     gtk_widget_marshal_signal_4,
642                     GTK_TYPE_BOOL, 1,
643                     GTK_TYPE_GDK_EVENT);
644   widget_signals[DROP_ENTER_EVENT] =
645     gtk_signal_new ("drop_enter_event",
646                     GTK_RUN_FIRST,
647                     object_class->type,
648                     GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_enter_event),
649                     gtk_widget_marshal_signal_4,
650                     GTK_TYPE_BOOL, 1,
651                     GTK_TYPE_GDK_EVENT);
652   widget_signals[DROP_LEAVE_EVENT] =
653     gtk_signal_new ("drop_leave_event",
654                     GTK_RUN_FIRST,
655                     object_class->type,
656                     GTK_SIGNAL_OFFSET (GtkWidgetClass, drop_leave_event),
657                     gtk_widget_marshal_signal_4,
658                     GTK_TYPE_BOOL, 1,
659                     GTK_TYPE_GDK_EVENT);
660   widget_signals[DROP_DATA_AVAILABLE_EVENT] =
661     gtk_signal_new ("drop_data_available_event",
662                     GTK_RUN_FIRST,
663                     object_class->type,
664                     GTK_SIGNAL_OFFSET (GtkWidgetClass,
665                                        drop_data_available_event),
666                     gtk_widget_marshal_signal_4,
667                     GTK_TYPE_BOOL, 1,
668                     GTK_TYPE_GDK_EVENT);
669   widget_signals[OTHER_EVENT] =
670     gtk_signal_new ("other_event",
671                     GTK_RUN_LAST,
672                     object_class->type,
673                     GTK_SIGNAL_OFFSET (GtkWidgetClass, other_event),
674                     gtk_widget_marshal_signal_4,
675                     GTK_TYPE_BOOL, 1,
676                     GTK_TYPE_GDK_EVENT);
677   widget_signals[CLIENT_EVENT] =
678     gtk_signal_new ("client_event",
679                     GTK_RUN_LAST,
680                     object_class->type,
681                     GTK_SIGNAL_OFFSET (GtkWidgetClass, client_event),
682                     gtk_widget_marshal_signal_4,
683                     GTK_TYPE_BOOL, 1,
684                     GTK_TYPE_GDK_EVENT);
685   widget_signals[NO_EXPOSE_EVENT] =
686     gtk_signal_new ("no_expose_event",
687                     GTK_RUN_LAST,
688                     object_class->type,
689                     GTK_SIGNAL_OFFSET (GtkWidgetClass, no_expose_event),
690                     gtk_widget_marshal_signal_4,
691                     GTK_TYPE_BOOL, 1,
692                     GTK_TYPE_GDK_EVENT);
693
694   gtk_object_class_add_signals (object_class, widget_signals, LAST_SIGNAL);
695   
696   object_class->shutdown = gtk_widget_shutdown;
697   object_class->destroy = gtk_widget_real_destroy;
698   object_class->finalize = gtk_widget_finalize;
699   
700   klass->activate_signal = 0;
701   klass->show = gtk_widget_real_show;
702   klass->hide = gtk_widget_real_hide;
703   klass->show_all = gtk_widget_real_show;
704   klass->hide_all = gtk_widget_real_hide;
705   klass->map = gtk_widget_real_map;
706   klass->unmap = gtk_widget_real_unmap;
707   klass->realize = gtk_widget_real_realize;
708   klass->unrealize = gtk_widget_real_unrealize;
709   klass->draw = gtk_widget_real_draw;
710   klass->draw_focus = NULL;
711   klass->size_request = NULL;
712   klass->size_allocate = gtk_widget_real_size_allocate;
713   klass->state_changed = NULL;
714   klass->parent_set = NULL;
715   klass->style_set = gtk_widget_style_set;
716   klass->install_accelerator = NULL;
717   klass->remove_accelerator = NULL;
718   klass->event = NULL;
719   klass->button_press_event = NULL;
720   klass->button_release_event = NULL;
721   klass->motion_notify_event = NULL;
722   klass->delete_event = NULL;
723   klass->destroy_event = NULL;
724   klass->expose_event = NULL;
725   klass->key_press_event = NULL;
726   klass->key_release_event = NULL;
727   klass->enter_notify_event = NULL;
728   klass->leave_notify_event = NULL;
729   klass->configure_event = NULL;
730   klass->focus_in_event = NULL;
731   klass->focus_out_event = NULL;
732   klass->map_event = NULL;
733   klass->unmap_event = NULL;
734   klass->property_notify_event = gtk_selection_property_notify;
735   klass->selection_clear_event = gtk_selection_clear;
736   klass->selection_request_event = gtk_selection_request;
737   klass->selection_notify_event = gtk_selection_notify;
738   klass->selection_received = NULL;
739   klass->proximity_in_event = NULL;
740   klass->proximity_out_event = NULL;
741   klass->drag_begin_event = NULL;
742   klass->drag_request_event = NULL;
743   klass->drop_enter_event = NULL;
744   klass->drop_leave_event = NULL;
745   klass->drop_data_available_event = NULL;
746   klass->other_event = NULL;
747   klass->no_expose_event = NULL;
748 }
749
750 /*****************************************
751  * gtk_widget_set_arg:
752  *
753  *   arguments:
754  *
755  *   results:
756  *****************************************/
757
758 static void
759 gtk_widget_set_arg (GtkWidget   *widget,
760                     GtkArg      *arg,
761                     guint        arg_id)
762 {
763   switch (arg_id)
764     {
765     case ARG_NAME:
766       gtk_widget_set_name (widget, GTK_VALUE_STRING (*arg));
767       break;
768     case ARG_PARENT:
769       gtk_container_add (GTK_CONTAINER (GTK_VALUE_OBJECT (*arg)), widget);
770       break;
771     case ARG_X:
772       gtk_widget_set_uposition (widget, GTK_VALUE_INT (*arg), -2);
773       break;
774     case ARG_Y:
775       gtk_widget_set_uposition (widget, -2, GTK_VALUE_INT (*arg));
776       break;
777     case ARG_WIDTH:
778       gtk_widget_set_usize (widget, GTK_VALUE_INT (*arg), -1);
779       break;
780     case ARG_HEIGHT:
781       gtk_widget_set_usize (widget, -1, GTK_VALUE_INT (*arg));
782       break;
783     case ARG_VISIBLE:
784       if (GTK_VALUE_BOOL(*arg))
785         gtk_widget_show (widget);
786       else
787         gtk_widget_hide (widget);
788       break;
789     case ARG_SENSITIVE:
790       gtk_widget_set_sensitive (widget, GTK_VALUE_BOOL (*arg));
791       break;
792     case ARG_CAN_FOCUS:
793       if (GTK_VALUE_BOOL (*arg))
794         GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
795       else
796         GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
797       break;
798     case ARG_HAS_FOCUS:
799       if (GTK_VALUE_BOOL (*arg))
800         gtk_widget_grab_focus (widget);
801       break;
802     case ARG_CAN_DEFAULT:
803       if (GTK_VALUE_BOOL (*arg))
804         GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_DEFAULT);
805       else
806         GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_DEFAULT);
807       break;
808     case ARG_HAS_DEFAULT:
809       if (GTK_VALUE_BOOL (*arg))
810         gtk_widget_grab_default (widget);
811       break;
812     case ARG_STYLE:
813       gtk_widget_set_style (widget, (GtkStyle*) GTK_VALUE_BOXED (*arg));
814       break;
815     case ARG_EVENTS:
816       gtk_widget_set_events (widget, GTK_VALUE_FLAGS (*arg));
817       break;
818     case ARG_EXTENSION_EVENTS:
819       gtk_widget_set_extension_events (widget, GTK_VALUE_FLAGS (*arg));
820       break;
821     default:
822       arg->type = GTK_TYPE_INVALID;
823       break;
824     }
825 }
826
827 /*****************************************
828  * gtk_widget_get_arg:
829  *
830  *   arguments:
831  *
832  *   results:
833  *****************************************/
834
835 static void
836 gtk_widget_get_arg (GtkWidget   *widget,
837                     GtkArg      *arg,
838                     guint        arg_id)
839 {
840   GtkWidgetAuxInfo *aux_info;
841   gint *eventp;
842   GdkExtensionMode *modep;
843   
844   switch (arg_id)
845     {
846     case ARG_NAME:
847       if (widget->name)
848         GTK_VALUE_STRING (*arg) = g_strdup (widget->name);
849       else
850         GTK_VALUE_STRING (*arg) = g_strdup ("");
851       break;
852     case ARG_PARENT:
853       GTK_VALUE_OBJECT (*arg) = (GtkObject*) widget->parent;
854       break;
855     case ARG_X:
856       aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
857       if (!aux_info)
858         GTK_VALUE_INT (*arg) = -2;
859       else
860         GTK_VALUE_INT (*arg) = aux_info->x;
861       break;
862     case ARG_Y:
863       aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
864       if (!aux_info)
865         GTK_VALUE_INT (*arg) = -2;
866       else
867         GTK_VALUE_INT (*arg) = aux_info->y;
868       break;
869     case ARG_WIDTH:
870       aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
871       if (!aux_info)
872         GTK_VALUE_INT (*arg) = -2;
873       else
874         GTK_VALUE_INT (*arg) = aux_info->width;
875       break;
876     case ARG_HEIGHT:
877       aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
878       if (!aux_info)
879         GTK_VALUE_INT (*arg) = -2;
880       else
881         GTK_VALUE_INT (*arg) = aux_info->height;
882       break;
883     case ARG_VISIBLE:
884       GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_VISIBLE (widget) != FALSE);
885       break;
886     case ARG_SENSITIVE:
887       GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_SENSITIVE (widget) != FALSE);
888       break;
889     case ARG_CAN_FOCUS:
890       GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_FOCUS (widget) != FALSE);
891       break;
892     case ARG_HAS_FOCUS:
893       GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_FOCUS (widget) != FALSE);
894       break;
895     case ARG_CAN_DEFAULT:
896       GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_CAN_DEFAULT (widget) != FALSE);
897       break;
898     case ARG_HAS_DEFAULT:
899       GTK_VALUE_BOOL (*arg) = (GTK_WIDGET_HAS_DEFAULT (widget) != FALSE);
900       break;
901     case ARG_STYLE:
902       GTK_VALUE_BOXED (*arg) = (gpointer) gtk_widget_get_style (widget);
903       break;
904     case ARG_EVENTS:
905       eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
906       if (!eventp)
907         GTK_VALUE_FLAGS (*arg) = 0;
908       else
909         GTK_VALUE_FLAGS (*arg) = *eventp;
910       break;
911     case ARG_EXTENSION_EVENTS:
912       modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
913       if (!modep)
914         GTK_VALUE_FLAGS (*arg) = 0;
915       else
916         GTK_VALUE_FLAGS (*arg) = *modep;
917       break;
918     default:
919       arg->type = GTK_TYPE_INVALID;
920       break;
921     }
922 }
923
924 /*****************************************
925  * gtk_widget_init:
926  *
927  *   arguments:
928  *
929  *   results:
930  *****************************************/
931
932 static void
933 gtk_widget_init (GtkWidget *widget)
934 {
935   GdkColormap *colormap;
936   GdkVisual *visual;
937   
938   GTK_PRIVATE_FLAGS (widget) = 0;
939   widget->state = GTK_STATE_NORMAL;
940   widget->saved_state = GTK_STATE_NORMAL;
941   widget->name = NULL;
942   widget->requisition.width = 0;
943   widget->requisition.height = 0;
944   widget->allocation.x = -1;
945   widget->allocation.y = -1;
946   widget->allocation.width = 1;
947   widget->allocation.height = 1;
948   widget->window = NULL;
949   widget->parent = NULL;
950
951   GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE | GTK_PARENT_SENSITIVE);
952
953   widget->style = gtk_widget_peek_style ();
954   gtk_style_ref (widget->style);
955   
956   colormap = gtk_widget_peek_colormap ();
957   visual = gtk_widget_peek_visual ();
958   
959   /* XXX - should we ref the colormap and visual, too? */
960
961   if (colormap != gtk_widget_get_default_colormap ())
962     {
963       /* gdk_colormap_ref (colormap); */
964       gtk_object_set_data (GTK_OBJECT (widget), colormap_key, colormap);
965     }
966
967   if (visual != gtk_widget_get_default_visual ())
968     {
969       /* gdk_visual_ref (visual); */
970       gtk_object_set_data (GTK_OBJECT (widget), visual_key, visual);
971     }
972 }
973
974 /*****************************************
975  * gtk_widget_new:
976  *
977  *   arguments:
978  *
979  *   results:
980  *****************************************/
981
982 GtkWidget*
983 gtk_widget_new (guint type,
984                 ...)
985 {
986   GtkObject *obj;
987   GtkArg *args;
988   guint nargs;
989   va_list args1;
990   va_list args2;
991   
992   g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
993   
994   obj = gtk_type_new (type);
995   
996   va_start (args1, type);
997   va_start (args2, type);
998   
999   args = gtk_object_collect_args (&nargs, args1, args2);
1000   gtk_object_setv (obj, nargs, args);
1001   g_free (args);
1002   
1003   va_end (args1);
1004   va_end (args2);
1005   
1006   return GTK_WIDGET (obj);
1007 }
1008
1009 /*****************************************
1010  * gtk_widget_newv:
1011  *
1012  *   arguments:
1013  *
1014  *   results:
1015  *****************************************/
1016
1017 GtkWidget*
1018 gtk_widget_newv (guint   type,
1019                  guint   nargs,
1020                  GtkArg *args)
1021 {
1022   g_return_val_if_fail (gtk_type_is_a (type, gtk_widget_get_type ()), NULL);
1023   
1024   return GTK_WIDGET (gtk_object_newv (type, nargs, args));
1025 }
1026
1027 /*****************************************
1028  * gtk_widget_get:
1029  *
1030  *   arguments:
1031  *
1032  *   results:
1033  *****************************************/
1034
1035 void
1036 gtk_widget_get (GtkWidget       *widget,
1037                 GtkArg          *arg)
1038 {
1039   g_return_if_fail (widget != NULL);
1040   g_return_if_fail (arg != NULL);
1041   
1042   gtk_object_getv (GTK_OBJECT (widget), 1, arg);
1043 }
1044
1045 /*****************************************
1046  * gtk_widget_getv:
1047  *
1048  *   arguments:
1049  *
1050  *   results:
1051  *****************************************/
1052
1053 void
1054 gtk_widget_getv (GtkWidget      *widget,
1055                  guint           nargs,
1056                  GtkArg         *args)
1057 {
1058   gtk_object_getv (GTK_OBJECT (widget), nargs, args);
1059 }
1060
1061 /*****************************************
1062  * gtk_widget_set:
1063  *
1064  *   arguments:
1065  *
1066  *   results:
1067  *****************************************/
1068
1069 void
1070 gtk_widget_set (GtkWidget *widget,
1071                 ...)
1072 {
1073   GtkArg *args;
1074   guint nargs;
1075   va_list args1;
1076   va_list args2;
1077   
1078   g_return_if_fail (widget != NULL);
1079   
1080   va_start (args1, widget);
1081   va_start (args2, widget);
1082   
1083   args = gtk_object_collect_args (&nargs, args1, args2);
1084   gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1085   g_free (args);
1086   
1087   va_end (args1);
1088   va_end (args2);
1089 }
1090
1091 /*****************************************
1092  * gtk_widget_setv:
1093  *
1094  *   arguments:
1095  *
1096  *   results:
1097  *****************************************/
1098
1099 void
1100 gtk_widget_setv (GtkWidget *widget,
1101                  guint      nargs,
1102                  GtkArg    *args)
1103 {
1104   gtk_object_setv (GTK_OBJECT (widget), nargs, args);
1105 }
1106
1107 /*****************************************
1108  * gtk_widget_unparent:
1109  *   do any cleanup necessary necessary
1110  *   for setting parent = NULL.
1111  *
1112  *   arguments:
1113  *
1114  *   results:
1115  *****************************************/
1116
1117 void
1118 gtk_widget_unparent (GtkWidget *widget)
1119 {
1120   GtkWidget *toplevel;
1121   GtkWidget *child;
1122   GtkWidget *old_parent;
1123   
1124   g_return_if_fail (widget != NULL);
1125   if (widget->parent == NULL)
1126     return;
1127   
1128   /* keep this function in sync with gtk_menu_detach()
1129    */
1130
1131   toplevel = gtk_widget_get_toplevel (widget);
1132   if (GTK_IS_WINDOW (toplevel))
1133     {
1134       child = GTK_WINDOW (toplevel)->focus_widget;
1135       
1136       while (child && child != widget)
1137         child = child->parent;
1138       
1139       if (child == widget)
1140         gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1141     }
1142
1143   if (GTK_WIDGET_RESIZE_NEEDED (widget))
1144     {
1145       GTK_CONTAINER (toplevel)->resize_widgets =
1146         g_slist_remove (GTK_CONTAINER (toplevel)->resize_widgets, widget);
1147       GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_NEEDED);
1148     }
1149   
1150   /* Reset the width and height here, to force reallocation if we
1151    * get added back to a new parent. This won't work if our new
1152    * allocation is smaller than 1x1 and we actually want a size of 1x1...
1153    * (would 0x0 be OK here?)
1154    */
1155   widget->allocation.width = 1;
1156   widget->allocation.height = 1;
1157   
1158   if (widget->window &&
1159       GTK_WIDGET_NO_WINDOW (widget) &&
1160       GTK_WIDGET_DRAWABLE (widget))
1161     gdk_window_clear_area (widget->window,
1162                            widget->allocation.x,
1163                            widget->allocation.y,
1164                            widget->allocation.width,
1165                            widget->allocation.height);
1166
1167   if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_IN_REPARENT (widget))
1168     gtk_widget_unrealize (widget);
1169
1170   old_parent = widget->parent;
1171   widget->parent = NULL;
1172   gtk_widget_set_parent_window (widget, NULL);
1173   gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], old_parent);
1174   
1175   gtk_widget_unref (widget);
1176 }
1177
1178 /*****************************************
1179  * gtk_widget_destroy:
1180  *
1181  *   arguments:
1182  *
1183  *   results:
1184  *****************************************/
1185
1186 void
1187 gtk_widget_destroy (GtkWidget *widget)
1188 {
1189   g_return_if_fail (widget != NULL);
1190   g_return_if_fail (GTK_IS_WIDGET (widget));
1191   
1192   gtk_object_destroy (GTK_OBJECT (widget));
1193 }
1194
1195 /*****************************************
1196  * gtk_widget_destroyed:
1197  *   Utility function: sets widget_pointer 
1198  *   to NULL when widget is destroyed.
1199  *
1200  *   arguments:
1201  *
1202  *   results:
1203  *****************************************/
1204
1205 void
1206 gtk_widget_destroyed (GtkWidget      *widget,
1207                       GtkWidget      **widget_pointer)
1208 {
1209   /* Don't make any assumptions about the
1210    *  value of widget!
1211    *  Even check widget_pointer.
1212    */
1213   if (widget_pointer)
1214     *widget_pointer = NULL;
1215 }
1216
1217 /*****************************************
1218  * gtk_widget_show:
1219  *
1220  *   arguments:
1221  *
1222  *   results:
1223  *****************************************/
1224
1225 void
1226 gtk_widget_show (GtkWidget *widget)
1227 {
1228   g_return_if_fail (widget != NULL);
1229   
1230   if (!GTK_WIDGET_VISIBLE (widget))
1231     gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SHOW]);
1232 }
1233
1234 /*****************************************
1235  * gtk_widget_hide:
1236  *
1237  *   arguments:
1238  *
1239  *   results:
1240  *****************************************/
1241
1242 void
1243 gtk_widget_hide (GtkWidget *widget)
1244 {
1245   g_return_if_fail (widget != NULL);
1246   g_return_if_fail (GTK_IS_WIDGET (widget));
1247   
1248   if (GTK_WIDGET_VISIBLE (widget))
1249     gtk_signal_emit (GTK_OBJECT (widget), widget_signals[HIDE]);
1250 }
1251
1252 gint
1253 gtk_widget_hide_on_delete (GtkWidget      *widget)
1254 {
1255   g_return_val_if_fail (widget != NULL, FALSE);
1256   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
1257   
1258   gtk_widget_hide (widget);
1259   
1260   return TRUE;
1261 }
1262
1263 /*****************************************
1264  * gtk_widget_show_all:
1265  *
1266  *   Shows the widget and all children.
1267  *
1268  *   Container classes overwrite
1269  *   show_all and hide_all to call
1270  *   show_all (hide_all) on both themselves
1271  *   and on their child widgets.
1272  *
1273  *   arguments:
1274  *
1275  *   results:
1276  *****************************************/
1277
1278 void
1279 gtk_widget_show_all (GtkWidget *widget)
1280 {
1281   GtkWidgetClass *widget_class;
1282   
1283   g_return_if_fail (widget != NULL);
1284   
1285   /* show_all shouldn't be invoked through a signal,
1286      because in this case it would be quite slow - there would
1287      be a show and show_all signal emitted for every child widget.
1288    */
1289   widget_class = GTK_WIDGET_CLASS(GTK_OBJECT(widget)->klass);
1290   widget_class->show_all (widget);
1291 }
1292
1293 /*****************************************
1294  * gtk_widget_hide_all:
1295  *
1296  *   Hides the widget and all children.
1297  *   See gtk_widget_show_all.
1298  *
1299  *   arguments:
1300  *
1301  *   results:
1302  *****************************************/
1303
1304 void
1305 gtk_widget_hide_all (GtkWidget *widget)
1306 {
1307   g_return_if_fail (widget != NULL);
1308   g_assert (widget->parent);
1309
1310   if (GTK_WIDGET_RESIZE_NEEDED (widget))
1311     {
1312       GtkWidget *toplevel;
1313
1314       toplevel = gtk_widget_get_toplevel (widget);
1315       GTK_CONTAINER (toplevel)->resize_widgets =
1316         g_slist_remove (GTK_CONTAINER (toplevel)->resize_widgets, widget);
1317       GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_NEEDED);
1318     }
1319   
1320   GTK_WIDGET_CLASS (GTK_OBJECT (widget)->klass)->hide_all (widget);
1321 }
1322
1323 /*****************************************
1324  * gtk_widget_map:
1325  *
1326  *   arguments:
1327  *
1328  *   results:
1329  *****************************************/
1330
1331 void
1332 gtk_widget_map (GtkWidget *widget)
1333 {
1334   g_return_if_fail (widget != NULL);
1335   
1336   if (!GTK_WIDGET_MAPPED (widget))
1337     {
1338       if (!GTK_WIDGET_REALIZED (widget))
1339         gtk_widget_realize (widget);
1340       
1341       gtk_signal_emit (GTK_OBJECT (widget), widget_signals[MAP]);
1342     }
1343 }
1344
1345 /*****************************************
1346  * gtk_widget_unmap:
1347  *
1348  *   arguments:
1349  *
1350  *   results:
1351  *****************************************/
1352
1353 void
1354 gtk_widget_unmap (GtkWidget *widget)
1355 {
1356   g_return_if_fail (widget != NULL);
1357   
1358   if (GTK_WIDGET_MAPPED (widget))
1359     gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNMAP]);
1360 }
1361
1362 /*****************************************
1363  * gtk_widget_realize:
1364  *
1365  *   arguments:
1366  *
1367  *   results:
1368  *****************************************/
1369
1370 void
1371 gtk_widget_realize (GtkWidget *widget)
1372 {
1373   gint events;
1374   GdkExtensionMode mode;
1375   GtkWidgetShapeInfo *shape_info;
1376   
1377   g_return_if_fail (widget != NULL);
1378   
1379   if (!GTK_WIDGET_REALIZED (widget))
1380     {
1381       /*
1382         if (GTK_IS_CONTAINER (widget) && !GTK_WIDGET_NO_WINDOW (widget))
1383           g_print ("%s\n", gtk_type_name (GTK_WIDGET_TYPE (widget)));
1384       */
1385       
1386       if (widget->parent && !GTK_WIDGET_REALIZED (widget->parent))
1387         gtk_widget_realize (widget->parent);
1388
1389       gtk_widget_ensure_style (widget);
1390       
1391       gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REALIZE]);
1392       
1393       if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1394         {
1395           shape_info = gtk_object_get_data (GTK_OBJECT (widget),
1396                                             shape_info_key);
1397           gdk_window_shape_combine_mask (widget->window,
1398                                          shape_info->shape_mask,
1399                                          shape_info->offset_x,
1400                                          shape_info->offset_y);
1401         }
1402       
1403       if (!GTK_WIDGET_NO_WINDOW (widget))
1404         {
1405           mode = gtk_widget_get_extension_events (widget);
1406           if (mode != GDK_EXTENSION_EVENTS_NONE)
1407             {
1408               events = gtk_widget_get_events (widget);
1409               gdk_input_set_extension_events (widget->window, events, mode);
1410             }
1411         }
1412       
1413     }
1414 }
1415
1416 /*****************************************
1417  * gtk_widget_unrealize:
1418  *
1419  *   arguments:
1420  *
1421  *   results:
1422  *****************************************/
1423
1424 void
1425 gtk_widget_unrealize (GtkWidget *widget)
1426 {
1427   g_return_if_fail (widget != NULL);
1428   
1429   if (GTK_WIDGET_REDRAW_PENDING (widget))
1430     {
1431       gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1432       GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1433     }
1434   
1435   if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
1436     gtk_widget_shape_combine_mask (widget, NULL, -1, -1);
1437
1438   if (GTK_WIDGET_REALIZED (widget))
1439     {
1440       gtk_signal_emit (GTK_OBJECT (widget), widget_signals[UNREALIZE]);
1441       GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
1442     }
1443 }
1444
1445 /*****************************************
1446  * gtk_widget_queue_draw:
1447  *
1448  *   arguments:
1449  *
1450  *   results:
1451  *****************************************/
1452
1453 static gint
1454 gtk_widget_idle_draw (void *data)
1455 {
1456   GSList *node;
1457
1458   node = gtk_widget_redraw_queue;
1459   gtk_widget_redraw_queue = NULL;
1460   while (node)
1461     {
1462       gtk_widget_real_queue_draw ((GtkWidget*) node->data);
1463       node = node->next;
1464     }
1465
1466   return gtk_widget_redraw_queue != NULL;
1467 }
1468
1469 void
1470 gtk_widget_queue_draw (GtkWidget *widget)
1471 {
1472   GtkWidget *parent;
1473   
1474   g_return_if_fail (widget != NULL);
1475   
1476   if (GTK_WIDGET_DRAWABLE (widget))
1477     {
1478       /* We queue the redraw if:
1479        *  a) the widget is not already queued for redraw and
1480        *  b) non of the widgets ancestors are queued for redraw.
1481        */
1482       parent = widget;
1483       while (parent)
1484         {
1485           if (GTK_WIDGET_REDRAW_PENDING (parent))
1486             return;
1487           parent = parent->parent;
1488         }
1489       
1490       GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_PENDING);
1491       if (gtk_widget_redraw_queue == NULL)
1492         gtk_idle_add_priority (GTK_PRIORITY_INTERNAL,
1493                                (GtkFunction) gtk_widget_idle_draw, NULL);
1494
1495       gtk_widget_redraw_queue = g_slist_prepend (gtk_widget_redraw_queue, widget);
1496     }
1497 }
1498
1499 /*****************************************
1500  * gtk_widget_queue_resize:
1501  *
1502  *   arguments:
1503  *
1504  *   results:
1505  *****************************************/
1506
1507 static gint
1508 gtk_widget_idle_sizer (void *data)
1509 {
1510   GSList *slist, *free_slist;
1511
1512   free_slist = gtk_widget_resize_queue;
1513   gtk_widget_resize_queue = NULL;
1514
1515   for (slist = free_slist; slist; slist = slist->next)
1516     {
1517       GtkWidget *widget;
1518       
1519       widget = slist->data;
1520       
1521       GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_PENDING);
1522       if (gtk_container_need_resize (GTK_CONTAINER (widget)))
1523         gtk_widget_queue_resize (widget);
1524     }
1525   g_slist_free (free_slist);
1526
1527   return gtk_widget_resize_queue != NULL;
1528 }
1529
1530 void
1531 gtk_widget_queue_resize (GtkWidget *widget)
1532 {
1533   GtkWidget *toplevel;
1534   
1535   g_return_if_fail (widget != NULL);
1536   
1537   toplevel = gtk_widget_get_toplevel (widget);
1538   if (GTK_WIDGET_TOPLEVEL (toplevel))
1539     {
1540       if (GTK_WIDGET_VISIBLE (toplevel))
1541         {
1542           if (!GTK_CONTAINER_RESIZE_PENDING (toplevel))
1543             {
1544               GTK_PRIVATE_SET_FLAG (toplevel, GTK_RESIZE_PENDING);
1545               if (gtk_widget_resize_queue == NULL)
1546                 gtk_idle_add_priority (GTK_PRIORITY_INTERNAL,
1547                                        (GtkFunction) gtk_widget_idle_sizer, NULL);
1548               gtk_widget_resize_queue = g_slist_prepend (gtk_widget_resize_queue, toplevel);
1549             }
1550           
1551           if (!GTK_WIDGET_RESIZE_NEEDED (widget))
1552             {
1553               GTK_PRIVATE_SET_FLAG (widget, GTK_RESIZE_NEEDED);
1554               GTK_CONTAINER (toplevel)->resize_widgets =
1555                 g_slist_prepend (GTK_CONTAINER (toplevel)->resize_widgets, widget);
1556             }
1557           else
1558             g_assert (g_slist_find (GTK_CONTAINER (toplevel)->resize_widgets, widget)); /* paranoid */
1559         }
1560       else
1561         gtk_container_need_resize (GTK_CONTAINER (toplevel));
1562     }
1563 }
1564
1565 /*****************************************
1566  * gtk_widget_draw:
1567  *
1568  *   arguments:
1569  *
1570  *   results:
1571  *****************************************/
1572
1573 void
1574 gtk_widget_draw (GtkWidget    *widget,
1575                  GdkRectangle *area)
1576 {
1577   GdkRectangle temp_area;
1578
1579   g_return_if_fail (widget != NULL);
1580
1581   if (GTK_WIDGET_REDRAW_PENDING (widget))
1582     {
1583       gtk_widget_redraw_queue = g_slist_remove (gtk_widget_redraw_queue, widget);
1584       GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
1585     }
1586
1587   if (GTK_WIDGET_DRAWABLE (widget))
1588     {
1589       if (!area)
1590         {
1591           if (GTK_WIDGET_NO_WINDOW (widget))
1592             {
1593               temp_area.x = widget->allocation.x;
1594               temp_area.y = widget->allocation.y;
1595             }
1596           else
1597             {
1598               temp_area.x = 0;
1599               temp_area.y = 0;
1600             }
1601
1602           temp_area.width = widget->allocation.width;
1603           temp_area.height = widget->allocation.height;
1604           area = &temp_area;
1605         }
1606
1607       gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW], area);
1608     }
1609 }
1610
1611 /*****************************************
1612  * gtk_widget_draw_focus:
1613  *
1614  *   arguments:
1615  *
1616  *   results:
1617  *****************************************/
1618
1619 void
1620 gtk_widget_draw_focus (GtkWidget *widget)
1621 {
1622   g_return_if_fail (widget != NULL);
1623   
1624   gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_FOCUS]);
1625 }
1626
1627 /*****************************************
1628  * gtk_widget_draw_default:
1629  *
1630  *   arguments:
1631  *
1632  *   results:
1633  *****************************************/
1634
1635 void
1636 gtk_widget_draw_default (GtkWidget *widget)
1637 {
1638   g_return_if_fail (widget != NULL);
1639   
1640   gtk_signal_emit (GTK_OBJECT (widget), widget_signals[DRAW_DEFAULT]);
1641 }
1642
1643 /*****************************************
1644  * gtk_widget_draw_children:
1645  *
1646  *   arguments:
1647  *
1648  *   results:
1649  *****************************************/
1650
1651 void
1652 gtk_widget_draw_children (GtkWidget *widget)
1653 {
1654   g_return_if_fail (widget != NULL);
1655   
1656   if (GTK_IS_CONTAINER (widget))
1657     gtk_container_foreach (GTK_CONTAINER (widget),
1658                            gtk_widget_draw_children_recurse,
1659                            NULL);
1660 }
1661
1662 /*****************************************
1663  * gtk_widget_size_request:
1664  *
1665  *   arguments:
1666  *
1667  *   results:
1668  *****************************************/
1669
1670 void
1671 gtk_widget_size_request (GtkWidget      *widget,
1672                          GtkRequisition *requisition)
1673 {
1674   GtkWidgetAuxInfo *aux_info;
1675
1676   g_return_if_fail (widget != NULL);
1677
1678   gtk_widget_ref (widget);
1679   gtk_widget_ensure_style (widget);
1680   gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_REQUEST],
1681                    requisition);
1682   aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1683   if (aux_info)
1684     {
1685       if (aux_info->width > 0)
1686         requisition->width = aux_info->width;
1687       if (aux_info->height > 0)
1688         requisition->height = aux_info->height;
1689     }
1690   gtk_widget_unref (widget);
1691 }
1692
1693 /*****************************************
1694  * gtk_widget_size_allocate:
1695  *
1696  *   arguments:
1697  *
1698  *   results:
1699  *****************************************/
1700
1701 void
1702 gtk_widget_size_allocate (GtkWidget     *widget,
1703                           GtkAllocation *allocation)
1704 {
1705   GtkWidgetAuxInfo *aux_info;
1706   GtkAllocation real_allocation;
1707   
1708   g_return_if_fail (widget != NULL);
1709   
1710   real_allocation = *allocation;
1711   aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
1712   
1713   if (aux_info)
1714     {
1715       if (aux_info->x != -1)
1716         real_allocation.x = aux_info->x;
1717       if (aux_info->y != -1)
1718         real_allocation.y = aux_info->y;
1719     }
1720   
1721   gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
1722 }
1723
1724 /*****************************************
1725  * gtk_widget_install_accelerator:
1726  *
1727  *   arguments:
1728  *
1729  *   results:
1730  *****************************************/
1731
1732 void
1733 gtk_widget_install_accelerator (GtkWidget           *widget,
1734                                 GtkAcceleratorTable *table,
1735                                 const gchar         *signal_name,
1736                                 gchar                key,
1737                                 guint8               modifiers)
1738 {
1739   gint return_val;
1740
1741   g_return_if_fail (widget != NULL);
1742
1743   gtk_widget_ref (widget);
1744   return_val = TRUE;
1745   gtk_signal_emit (GTK_OBJECT (widget), widget_signals[INSTALL_ACCELERATOR],
1746                    signal_name, key, modifiers, &return_val);
1747   if (return_val)
1748     gtk_accelerator_table_install (table,
1749                                    GTK_OBJECT (widget),
1750                                    signal_name,
1751                                    key,
1752                                    modifiers);
1753   gtk_widget_unref (widget);
1754 }
1755
1756 /*****************************************
1757  * gtk_widget_remove_accelerator:
1758  *
1759  *   arguments:
1760  *
1761  *   results:
1762  *****************************************/
1763
1764 void
1765 gtk_widget_remove_accelerator (GtkWidget           *widget,
1766                                GtkAcceleratorTable *table,
1767                                const gchar         *signal_name)
1768 {
1769   g_return_if_fail (widget != NULL);
1770
1771   gtk_widget_ref (widget);
1772   gtk_signal_emit (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR],
1773                    signal_name);
1774   gtk_accelerator_table_remove (table, GTK_OBJECT (widget), signal_name);
1775   gtk_widget_unref (widget);
1776 }
1777
1778 /*****************************************
1779  * gtk_widget_event:
1780  *
1781  *   arguments:
1782  *
1783  *   results:
1784  *****************************************/
1785
1786 gint
1787 gtk_widget_event (GtkWidget *widget,
1788                   GdkEvent  *event)
1789 {
1790   gint return_val;
1791   gint signal_num;
1792
1793   g_return_val_if_fail (widget != NULL, TRUE);
1794
1795   gtk_widget_ref (widget);
1796   return_val = FALSE;
1797   gtk_signal_emit (GTK_OBJECT (widget), widget_signals[EVENT], event,
1798                    &return_val);
1799   if (return_val || GTK_OBJECT_DESTROYED (widget))
1800     {
1801       gtk_widget_unref (widget);
1802       return TRUE;
1803     }
1804
1805   switch (event->type)
1806     {
1807     case GDK_NOTHING:
1808       signal_num = -1;
1809       break;
1810     case GDK_BUTTON_PRESS:
1811     case GDK_2BUTTON_PRESS:
1812     case GDK_3BUTTON_PRESS:
1813       signal_num = BUTTON_PRESS_EVENT;
1814       break;
1815     case GDK_BUTTON_RELEASE:
1816       signal_num = BUTTON_RELEASE_EVENT;
1817       break;
1818     case GDK_MOTION_NOTIFY:
1819       signal_num = MOTION_NOTIFY_EVENT;
1820       break;
1821     case GDK_DELETE:
1822       signal_num = DELETE_EVENT;
1823       break;
1824     case GDK_DESTROY:
1825       signal_num = DESTROY_EVENT;
1826       break;
1827     case GDK_KEY_PRESS:
1828       signal_num = KEY_PRESS_EVENT;
1829       break;
1830     case GDK_KEY_RELEASE:
1831       signal_num = KEY_RELEASE_EVENT;
1832       break;
1833     case GDK_ENTER_NOTIFY:
1834       signal_num = ENTER_NOTIFY_EVENT;
1835       break;
1836     case GDK_LEAVE_NOTIFY:
1837       signal_num = LEAVE_NOTIFY_EVENT;
1838       break;
1839     case GDK_FOCUS_CHANGE:
1840       if (event->focus_change.in)
1841         signal_num = FOCUS_IN_EVENT;
1842       else
1843         signal_num = FOCUS_OUT_EVENT;
1844       break;
1845     case GDK_CONFIGURE:
1846       signal_num = CONFIGURE_EVENT;
1847       break;
1848     case GDK_MAP:
1849       signal_num = MAP_EVENT;
1850       break;
1851     case GDK_UNMAP:
1852       signal_num = UNMAP_EVENT;
1853       break;
1854     case GDK_PROPERTY_NOTIFY:
1855       signal_num = PROPERTY_NOTIFY_EVENT;
1856       break;
1857     case GDK_SELECTION_CLEAR:
1858       signal_num = SELECTION_CLEAR_EVENT;
1859       break;
1860     case GDK_SELECTION_REQUEST:
1861       signal_num = SELECTION_REQUEST_EVENT;
1862       break;
1863     case GDK_SELECTION_NOTIFY:
1864       signal_num = SELECTION_NOTIFY_EVENT;
1865       break;
1866     case GDK_PROXIMITY_IN:
1867       signal_num = PROXIMITY_IN_EVENT;
1868       break;
1869     case GDK_PROXIMITY_OUT:
1870       signal_num = PROXIMITY_OUT_EVENT;
1871       break;
1872     case GDK_DRAG_BEGIN:
1873       signal_num = DRAG_BEGIN_EVENT;
1874       break;
1875     case GDK_DRAG_REQUEST:
1876       signal_num = DRAG_REQUEST_EVENT;
1877       break;
1878     case GDK_DROP_ENTER:
1879       signal_num = DROP_ENTER_EVENT;
1880       break;
1881     case GDK_DROP_LEAVE:
1882       signal_num = DROP_LEAVE_EVENT;
1883       break;
1884     case GDK_DROP_DATA_AVAIL:
1885       signal_num = DROP_DATA_AVAILABLE_EVENT;
1886       break;
1887     case GDK_OTHER_EVENT:
1888       signal_num = OTHER_EVENT;
1889       break;
1890     case GDK_NO_EXPOSE:
1891       signal_num = NO_EXPOSE_EVENT;
1892       break;
1893     case GDK_CLIENT_EVENT:
1894       signal_num = CLIENT_EVENT;
1895       break;
1896     case GDK_EXPOSE:
1897       /* there is no sense in providing a widget with bogus expose events
1898        */
1899       if (!event->any.window)
1900         {
1901           gtk_widget_unref (widget);
1902           return TRUE;
1903         }
1904       signal_num = EXPOSE_EVENT;
1905       break;
1906     default:
1907       g_warning ("could not determine signal number for event: %d", event->type);
1908       gtk_widget_unref (widget);
1909       return TRUE;
1910     }
1911   
1912   if (signal_num != -1)
1913     gtk_signal_emit (GTK_OBJECT (widget), widget_signals[signal_num], event, &return_val);
1914
1915   return_val |= GTK_OBJECT_DESTROYED (widget);
1916
1917   gtk_widget_unref (widget);
1918
1919   return return_val;
1920 }
1921
1922 /*****************************************
1923  * gtk_widget_activate:
1924  *
1925  *   arguments:
1926  *
1927  *   results:
1928  *****************************************/
1929
1930 void
1931 gtk_widget_activate (GtkWidget *widget)
1932 {
1933   g_return_if_fail (widget != NULL);
1934   g_return_if_fail (GTK_IS_WIDGET (widget));
1935   
1936   if (WIDGET_CLASS (widget)->activate_signal)
1937     gtk_signal_emit (GTK_OBJECT (widget), WIDGET_CLASS (widget)->activate_signal);
1938 }
1939
1940 /*****************************************
1941  * gtk_widget_reparent_container_child:
1942  *   assistent function to gtk_widget_reparent
1943  *
1944  *   arguments:
1945  *
1946  *   results:
1947  *****************************************/
1948
1949 static void
1950 gtk_widget_reparent_container_child(GtkWidget *widget,
1951                                    gpointer   client_data)
1952 {
1953   g_return_if_fail (widget != NULL);
1954   g_return_if_fail (client_data != NULL);
1955   
1956   if (GTK_WIDGET_NO_WINDOW (widget))
1957     {
1958       if (widget->window)
1959         gdk_window_unref (widget->window);
1960       widget->window = (GdkWindow*) client_data;
1961       if (widget->window)
1962         gdk_window_ref (widget->window);
1963
1964       if (GTK_IS_CONTAINER (widget))
1965         gtk_container_foreach (GTK_CONTAINER (widget),
1966                                gtk_widget_reparent_container_child,
1967                                client_data);
1968     }
1969   else
1970     gdk_window_reparent (widget->window, 
1971                          (GdkWindow*) client_data, 0, 0);
1972 }
1973
1974 /*****************************************
1975  * gtk_widget_reparent:
1976  *
1977  *   arguments:
1978  *
1979  *   results:
1980  *****************************************/
1981
1982 void
1983 gtk_widget_reparent (GtkWidget *widget,
1984                      GtkWidget *new_parent)
1985 {
1986   g_return_if_fail (widget != NULL);
1987   g_return_if_fail (GTK_IS_WIDGET (widget));
1988   g_return_if_fail (new_parent != NULL);
1989   g_return_if_fail (GTK_IS_CONTAINER (new_parent));
1990   g_return_if_fail (widget->parent != NULL);
1991   
1992   if (widget->parent != new_parent)
1993     {
1994       /* First try to see if we can get away without unrealizing
1995        * the widget as we reparent it. if so we set a flag so
1996        * that gtk_widget_unparent doesn't unrealize widget
1997        */
1998       if (GTK_WIDGET_REALIZED (widget) && GTK_WIDGET_REALIZED (new_parent))
1999         GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
2000       
2001       gtk_widget_ref (widget);
2002       gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
2003       gtk_container_add (GTK_CONTAINER (new_parent), widget);
2004       gtk_widget_unref (widget);
2005       
2006       if (GTK_WIDGET_IN_REPARENT (widget))
2007         {
2008           GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
2009           
2010           /* OK, now fix up the widget's window. (And that for any
2011            * children, if the widget is NO_WINDOW and a container) 
2012            */
2013           if (GTK_WIDGET_NO_WINDOW (widget))
2014             {
2015               if (GTK_IS_CONTAINER (widget))
2016                 gtk_container_foreach (GTK_CONTAINER (widget),
2017                                        gtk_widget_reparent_container_child,
2018                                        gtk_widget_get_parent_window (widget));
2019               else
2020                 {
2021                   GdkWindow *parent_window;
2022                   
2023                   parent_window = gtk_widget_get_parent_window (widget);
2024                   if (parent_window != widget->window)
2025                     {
2026                       if (widget->window)
2027                         gdk_window_unref (widget->window);
2028                       widget->window = parent_window;
2029                       if (widget->window)
2030                         gdk_window_ref (widget->window);
2031                     }
2032                 }
2033             }
2034           else
2035             gdk_window_reparent (widget->window, gtk_widget_get_parent_window (widget), 0, 0);
2036         }
2037     }
2038 }
2039
2040 /*****************************************
2041  * gtk_widget_popup:
2042  *
2043  *   arguments:
2044  *
2045  *   results:
2046  *****************************************/
2047
2048 void
2049 gtk_widget_popup (GtkWidget *widget,
2050                   gint       x,
2051                   gint       y)
2052 {
2053   g_return_if_fail (widget != NULL);
2054   
2055   if (!GTK_WIDGET_VISIBLE (widget))
2056     {
2057       if (!GTK_WIDGET_REALIZED (widget))
2058         gtk_widget_realize (widget);
2059       if (!GTK_WIDGET_NO_WINDOW (widget))
2060         gdk_window_move (widget->window, x, y);
2061       gtk_widget_show (widget);
2062     }
2063 }
2064
2065 /*****************************************
2066  * gtk_widget_intersect:
2067  *
2068  *   arguments:
2069  *
2070  *   results:
2071  *****************************************/
2072
2073 gint
2074 gtk_widget_intersect (GtkWidget    *widget,
2075                       GdkRectangle *area,
2076                       GdkRectangle *intersection)
2077 {
2078   GdkRectangle *dest;
2079   GdkRectangle tmp;
2080   gint return_val;
2081   
2082   g_return_val_if_fail (widget != NULL, FALSE);
2083   g_return_val_if_fail (area != NULL, FALSE);
2084   
2085   if (intersection)
2086     dest = intersection;
2087   else
2088     dest = &tmp;
2089   
2090   return_val = gdk_rectangle_intersect ((GdkRectangle*) &widget->allocation, area, dest);
2091   
2092   if (return_val && intersection && !GTK_WIDGET_NO_WINDOW (widget))
2093     {
2094       intersection->x -= widget->allocation.x;
2095       intersection->y -= widget->allocation.y;
2096     }
2097   
2098   return return_val;
2099 }
2100
2101
2102 gint
2103 gtk_widget_basic (GtkWidget *widget)
2104 {
2105   GList *children;
2106   GList *tmp_list;
2107   gint return_val;
2108   
2109   g_return_val_if_fail (widget != NULL, FALSE);
2110   
2111   if (!GTK_WIDGET_BASIC (widget))
2112     return FALSE;
2113   else if (GTK_IS_CONTAINER (widget))
2114     {
2115       children = gtk_container_children (GTK_CONTAINER (widget));
2116       if (children)
2117         {
2118           return_val = TRUE;
2119           tmp_list = children;
2120           
2121           while (tmp_list)
2122             {
2123               if (!gtk_widget_basic (GTK_WIDGET (tmp_list->data)))
2124                 {
2125                   return_val = FALSE;
2126                   break;
2127                 }
2128               
2129               tmp_list = tmp_list->next;
2130             }
2131           
2132           g_list_free (children);
2133           return return_val;
2134         }
2135     }
2136   
2137   return TRUE;
2138 }
2139
2140
2141 /*****************************************
2142  * gtk_widget_grab_focus:
2143  *
2144  *   arguments:
2145  *
2146  *   results:
2147  *****************************************/
2148
2149 void
2150 gtk_widget_grab_focus (GtkWidget *widget)
2151 {
2152   GtkWidget *window;
2153   GtkWidget *child;
2154   GtkType window_type;
2155   
2156   g_return_if_fail (widget != NULL);
2157   
2158   window_type = gtk_window_get_type ();
2159   window = widget->parent;
2160   child = widget;
2161   
2162   while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2163     {
2164       GTK_CONTAINER (window)->focus_child = child;
2165       child = window;
2166       window = window->parent;
2167     }
2168   
2169   if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2170     {
2171       GTK_CONTAINER (window)->focus_child = child;
2172       gtk_window_set_focus (GTK_WINDOW (window), widget);
2173     }
2174 }
2175
2176 /*****************************************
2177  * gtk_widget_grab_default:
2178  *
2179  *   arguments:
2180  *
2181  *   results:
2182  *****************************************/
2183
2184 void
2185 gtk_widget_grab_default (GtkWidget *widget)
2186 {
2187   GtkWidget *window;
2188   GtkType window_type;
2189   
2190   g_return_if_fail (widget != NULL);
2191   g_return_if_fail (GTK_WIDGET_CAN_DEFAULT (widget));
2192   
2193   window_type = gtk_window_get_type ();
2194   window = widget->parent;
2195   
2196   while (window && !gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2197     window = window->parent;
2198   
2199   if (window && gtk_type_is_a (GTK_WIDGET_TYPE (window), window_type))
2200     gtk_window_set_default (GTK_WINDOW (window), widget);
2201 }
2202
2203 /*****************************************
2204  * gtk_widget_set_name:
2205  *
2206  *   arguments:
2207  *
2208  *   results:
2209  *****************************************/
2210
2211 void
2212 gtk_widget_set_name (GtkWidget   *widget,
2213                      const gchar *name)
2214 {
2215   g_return_if_fail (widget != NULL);
2216   
2217   if (widget->name)
2218     g_free (widget->name);
2219   widget->name = g_strdup (name);
2220
2221   if (!GTK_WIDGET_USER_STYLE (widget))
2222     gtk_widget_set_rc_style (widget);
2223 }
2224
2225 /*****************************************
2226  * gtk_widget_get_name:
2227  *
2228  *   arguments:
2229  *
2230  *   results:
2231  *****************************************/
2232
2233 gchar*
2234 gtk_widget_get_name (GtkWidget *widget)
2235 {
2236   g_return_val_if_fail (widget != NULL, NULL);
2237   
2238   if (widget->name)
2239     return widget->name;
2240   return gtk_type_name (GTK_WIDGET_TYPE (widget));
2241 }
2242
2243 /*****************************************
2244  * gtk_widget_set_state:
2245  *
2246  *   arguments:
2247  *     widget
2248  *     state
2249  *
2250  *   results:
2251  *****************************************/
2252
2253 void
2254 gtk_widget_set_state (GtkWidget           *widget,
2255                       GtkStateType         state)
2256 {
2257   g_return_if_fail (widget != NULL);
2258
2259   if (state == GTK_WIDGET_STATE (widget))
2260     return;
2261
2262   if (state == GTK_STATE_INSENSITIVE)
2263     gtk_widget_set_sensitive (widget, FALSE);
2264   else
2265     {
2266       GtkStateData data;
2267       GtkStateType old_state;
2268
2269       data.state = state;
2270       if (widget->parent)
2271         data.parent_sensitive = GTK_WIDGET_IS_SENSITIVE (widget->parent);
2272       else
2273         data.parent_sensitive = GTK_PARENT_SENSITIVE;
2274
2275       old_state = GTK_WIDGET_STATE (widget);
2276
2277       gtk_widget_propagate_state (widget, &data);
2278       if (old_state != GTK_WIDGET_STATE (widget))
2279         gtk_widget_queue_draw (widget);
2280     }
2281 }
2282
2283 /*****************************************
2284  * gtk_widget_set_sensitive:
2285  *
2286  *   arguments:
2287  *     widget
2288  *     boolean value for sensitivity
2289  *
2290  *   results:
2291  *****************************************/
2292
2293 void
2294 gtk_widget_set_sensitive (GtkWidget *widget,
2295                           gint       sensitive)
2296 {
2297   GtkStateData data;
2298   GtkStateType old_state;
2299
2300   g_return_if_fail (widget != NULL);
2301
2302   if (sensitive)
2303     {
2304       GTK_WIDGET_SET_FLAGS (widget, GTK_SENSITIVE);
2305       if (GTK_WIDGET_STATE (widget) == GTK_STATE_INSENSITIVE)
2306         data.state = GTK_WIDGET_SAVED_STATE (widget);
2307       else
2308         data.state = GTK_WIDGET_STATE (widget);
2309     }
2310   else
2311     {
2312       GTK_WIDGET_UNSET_FLAGS (widget, GTK_SENSITIVE);
2313       data.state = GTK_WIDGET_STATE (widget);
2314     }
2315
2316   if (widget->parent)
2317     data.parent_sensitive = GTK_WIDGET_IS_SENSITIVE (widget->parent);
2318   else
2319     data.parent_sensitive = GTK_PARENT_SENSITIVE;
2320
2321   old_state = GTK_WIDGET_STATE (widget);
2322   gtk_widget_propagate_state (widget, &data);
2323   if (old_state != GTK_WIDGET_STATE (widget))
2324     gtk_widget_queue_draw (widget);
2325 }
2326
2327 /*****************************************
2328  * gtk_widget_set_parent:
2329  *
2330  *   arguments:
2331  *
2332  *   results:
2333  *****************************************/
2334
2335 void
2336 gtk_widget_set_parent (GtkWidget *widget,
2337                        GtkWidget *parent)
2338 {
2339   GtkStateData data;
2340   
2341   g_return_if_fail (widget != NULL);
2342   g_return_if_fail (widget->parent == NULL);
2343   g_return_if_fail (!GTK_WIDGET_TOPLEVEL (widget));
2344   g_return_if_fail (parent != NULL);
2345
2346   /* keep this function in sync with gtk_menu_attach_to_widget()
2347    */
2348
2349   gtk_widget_ref (widget);
2350   gtk_object_sink (GTK_OBJECT (widget));
2351   widget->parent = parent;
2352
2353   if (GTK_WIDGET_STATE (parent) != GTK_STATE_NORMAL)
2354     data.state = GTK_WIDGET_STATE (parent);
2355   else
2356     data.state = GTK_WIDGET_STATE (widget);
2357   data.parent_sensitive = GTK_WIDGET_IS_SENSITIVE (parent);
2358
2359   gtk_widget_propagate_state (widget, &data);
2360   
2361   while (parent->parent != NULL)
2362     parent = parent->parent;
2363   
2364   gtk_widget_set_style_recurse (widget, NULL);
2365
2366   gtk_signal_emit (GTK_OBJECT (widget), widget_signals[PARENT_SET], NULL);
2367 }
2368
2369 /*****************************************
2370  * Widget styles
2371  * see docs/styles.txt
2372  *****************************************/
2373 void
2374 gtk_widget_set_style (GtkWidget *widget,
2375                       GtkStyle  *style)
2376 {
2377   GtkStyle *default_style;
2378   gboolean initial_emission;
2379
2380   g_return_if_fail (widget != NULL);
2381   g_return_if_fail (style != NULL);
2382
2383   initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2384
2385   GTK_WIDGET_UNSET_FLAGS (widget, GTK_RC_STYLE);
2386   GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
2387
2388   default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2389   if (!default_style)
2390     {
2391       gtk_style_ref (widget->style);
2392       if (!saved_default_style_key_id)
2393         saved_default_style_key_id = gtk_object_data_force_id (saved_default_style_key);
2394       gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2395     }
2396
2397   gtk_widget_set_style_internal (widget, style, initial_emission);
2398 }
2399
2400 void
2401 gtk_widget_ensure_style (GtkWidget *widget)
2402 {
2403   if (!GTK_WIDGET_USER_STYLE (widget) &&
2404       !GTK_WIDGET_RC_STYLE (widget))
2405     gtk_widget_set_rc_style (widget);
2406 }
2407
2408 void
2409 gtk_widget_set_rc_style (GtkWidget *widget)
2410 {
2411   GtkStyle *saved_style;
2412   GtkStyle *new_style;
2413   gboolean initial_emission;
2414   
2415   g_return_if_fail (widget != NULL);
2416
2417   initial_emission = !GTK_WIDGET_RC_STYLE (widget) && !GTK_WIDGET_USER_STYLE (widget);
2418
2419   GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2420   GTK_WIDGET_SET_FLAGS (widget, GTK_RC_STYLE);
2421
2422   saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2423   new_style = gtk_rc_get_style (widget);
2424   if (new_style)
2425     {
2426       if (!saved_style)
2427         {
2428           gtk_style_ref (widget->style);
2429           if (!saved_default_style_key_id)
2430             saved_default_style_key_id = gtk_object_data_force_id (saved_default_style_key);
2431           gtk_object_set_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id, widget->style);
2432         }
2433       gtk_widget_set_style_internal (widget, new_style, initial_emission);
2434     }
2435   else
2436     {
2437       if (saved_style)
2438         {
2439           g_assert (initial_emission == FALSE); /* FIXME: remove this line */
2440
2441           gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2442           gtk_widget_set_style_internal (widget, saved_style, initial_emission);
2443           gtk_style_unref (saved_style);
2444         }
2445       else
2446         {
2447           if (initial_emission)
2448             gtk_widget_set_style_internal (widget, widget->style, TRUE);
2449         }
2450     }
2451 }
2452
2453 void
2454 gtk_widget_restore_default_style (GtkWidget *widget)
2455 {
2456   GtkStyle *default_style;
2457
2458   g_return_if_fail (widget != NULL);
2459
2460   GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
2461
2462   default_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2463   if (default_style)
2464     {
2465       gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
2466       gtk_widget_set_style_internal (widget, default_style, FALSE);
2467       gtk_style_unref (default_style);
2468     }
2469 }
2470
2471 GtkStyle*
2472 gtk_widget_get_style (GtkWidget *widget)
2473 {
2474   g_return_val_if_fail (widget != NULL, NULL);
2475   
2476   return widget->style;
2477 }
2478
2479 static void
2480 gtk_widget_style_set (GtkWidget *widget,
2481                       GtkStyle  *previous_style)
2482 {
2483   if (GTK_WIDGET_REALIZED (widget) &&
2484       !GTK_WIDGET_NO_WINDOW (widget))
2485     gtk_style_set_background (widget->style, widget->window, widget->state);
2486 }
2487
2488 static void
2489 gtk_widget_set_style_internal (GtkWidget *widget,
2490                                GtkStyle  *style,
2491                                gboolean   initial_emission)
2492 {
2493   g_return_if_fail (widget != NULL);
2494   g_return_if_fail (style != NULL);
2495   
2496   if (widget->style != style)
2497     {
2498       GtkStyle *previous_style;
2499
2500       if (GTK_WIDGET_REALIZED (widget))
2501         gtk_style_detach (widget->style);
2502       
2503       previous_style = widget->style;
2504       widget->style = style;
2505       gtk_style_ref (widget->style);
2506       
2507       if (GTK_WIDGET_REALIZED (widget))
2508         widget->style = gtk_style_attach (widget->style, widget->window);
2509
2510       gtk_signal_emit (GTK_OBJECT (widget),
2511                        widget_signals[STYLE_SET],
2512                        initial_emission ? NULL : previous_style);
2513       gtk_style_unref (previous_style);
2514
2515       if (widget->parent && !initial_emission)
2516         {
2517           GtkRequisition old_requisition;
2518           
2519           old_requisition = widget->requisition;
2520           gtk_widget_size_request (widget, &widget->requisition);
2521           
2522           if ((old_requisition.width != widget->requisition.width) ||
2523               (old_requisition.height != widget->requisition.height))
2524             gtk_widget_queue_resize (widget);
2525           else if (GTK_WIDGET_DRAWABLE (widget))
2526             gtk_widget_queue_draw (widget);
2527         }
2528     }
2529   else if (initial_emission)
2530     {
2531       gtk_signal_emit (GTK_OBJECT (widget),
2532                        widget_signals[STYLE_SET],
2533                        NULL);
2534     }
2535 }
2536
2537 static void
2538 gtk_widget_set_style_recurse (GtkWidget *widget,
2539                               gpointer   client_data)
2540 {
2541   if (GTK_WIDGET_RC_STYLE (widget))
2542     gtk_widget_set_rc_style (widget);
2543   
2544   if (GTK_IS_CONTAINER (widget))
2545     gtk_container_foreach (GTK_CONTAINER (widget),
2546                            gtk_widget_set_style_recurse,
2547                            NULL);
2548 }
2549
2550 void
2551 gtk_widget_set_default_style (GtkStyle *style)
2552 {
2553    if (style != default_style)
2554      {
2555        if (default_style)
2556          gtk_style_unref (default_style);
2557        default_style = style;
2558        if (default_style)
2559          gtk_style_ref (default_style);
2560      }
2561 }
2562
2563 GtkStyle*
2564 gtk_widget_get_default_style ()
2565 {
2566   if (!default_style)
2567     {
2568       default_style = gtk_style_new ();
2569       gtk_style_ref (default_style);
2570     }
2571   
2572   return default_style;
2573 }
2574
2575 void
2576 gtk_widget_push_style (GtkStyle *style)
2577 {
2578   g_return_if_fail (style != NULL);
2579
2580   gtk_style_ref (style);
2581   style_stack = g_slist_prepend (style_stack, style);
2582 }
2583
2584 static GtkStyle*
2585 gtk_widget_peek_style ()
2586 {
2587   if (style_stack)
2588     return (GtkStyle*) style_stack->data;
2589   else
2590     return gtk_widget_get_default_style ();
2591 }
2592
2593 void
2594 gtk_widget_pop_style ()
2595 {
2596   GSList *tmp;
2597   
2598   if (style_stack)
2599     {
2600       tmp = style_stack;
2601       style_stack = style_stack->next;
2602       gtk_style_unref ((GtkStyle*) tmp->data);
2603       g_slist_free_1 (tmp);
2604     }
2605 }
2606
2607 /* Basically, send a message to all toplevel windows telling them
2608  * that a new _GTK_STYLE_COLORS property is available on the root
2609  * window
2610  */
2611 void
2612 gtk_widget_propagate_default_style (void)
2613 {
2614   GdkEventClient sev;
2615   int i;
2616   
2617   /* Set the property on the root window */
2618   gdk_property_change(GDK_ROOT_PARENT(),
2619                       gdk_atom_intern("_GTK_DEFAULT_COLORS", FALSE),
2620                       gdk_atom_intern("STRING", FALSE),
2621                       8*sizeof(gushort),
2622                       GDK_PROP_MODE_REPLACE,
2623                       (guchar *)gtk_widget_get_default_style(),
2624                       GTK_STYLE_NUM_STYLECOLORS() * sizeof(GdkColor));
2625
2626   for(i = 0; i < 5; i++)
2627     sev.data.l[i] = 0;
2628   sev.data_format = 32;
2629   sev.message_type = gdk_atom_intern ("_GTK_STYLE_CHANGED", FALSE);
2630   gdk_event_send_clientmessage_toall ((GdkEvent *) &sev);
2631 }
2632
2633 /*************************************************************
2634  * gtk_widget_set_parent_window:
2635  *     Set a non default parent window for widget
2636  *
2637  *   arguments:
2638  *     widget:
2639  *     parent_window 
2640  *     
2641  *   results:
2642  *************************************************************/
2643
2644 void
2645 gtk_widget_set_parent_window   (GtkWidget           *widget,
2646                                 GdkWindow           *parent_window)
2647 {
2648   GdkWindow *old_parent_window;
2649
2650   g_return_if_fail (widget != NULL);
2651   
2652   old_parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2653                                                  parent_window_key_id);
2654
2655   if (parent_window != old_parent_window)
2656     {
2657       if (!parent_window_key_id)
2658         parent_window_key_id = gtk_object_data_force_id (parent_window_key);
2659       gtk_object_set_data_by_id (GTK_OBJECT (widget), parent_window_key_id, 
2660                                  parent_window);
2661       if (old_parent_window)
2662         gdk_window_unref (old_parent_window);
2663       if (parent_window)
2664         gdk_window_ref (parent_window);
2665     }
2666 }
2667
2668 /*************************************************************
2669  * gtk_widget_get_parent_window:
2670  *     Get widget's parent window
2671  *
2672  *   arguments:
2673  *     widget:
2674  *     
2675  *   results:
2676  *     parent window
2677  *************************************************************/
2678
2679 GdkWindow *
2680 gtk_widget_get_parent_window   (GtkWidget           *widget)
2681 {
2682   GdkWindow *parent_window;
2683
2684   g_return_val_if_fail (widget != NULL, NULL);
2685   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
2686   g_return_val_if_fail (widget->parent != NULL, NULL);
2687   
2688   parent_window = gtk_object_get_data_by_id (GTK_OBJECT (widget),
2689                                              parent_window_key_id);
2690
2691   return (parent_window != NULL) ? parent_window : widget->parent->window;
2692 }
2693
2694 /*****************************************
2695  * gtk_widget_set_uposition:
2696  *
2697  *   arguments:
2698  *
2699  *   results:
2700  *****************************************/
2701
2702 void
2703 gtk_widget_set_uposition (GtkWidget *widget,
2704                           gint       x,
2705                           gint       y)
2706 {
2707   GtkWidgetAuxInfo *aux_info;
2708   
2709   g_return_if_fail (widget != NULL);
2710   
2711   aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2712   if (!aux_info)
2713     {
2714       if (!aux_info_key_id)
2715         aux_info_key_id = gtk_object_data_force_id (aux_info_key);
2716       aux_info = gtk_widget_aux_info_new ();
2717       gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2718     }
2719   
2720   if (x > -2)
2721     aux_info->x = x;
2722   if (y > -2)
2723     aux_info->y = y;
2724   
2725   if (GTK_WIDGET_REALIZED (widget) && GTK_IS_WINDOW (widget) &&
2726       (aux_info->x != -1) && (aux_info->y != -1))
2727     {
2728       gdk_window_set_hints (widget->window, aux_info->x, aux_info->y, 0, 0, 0, 0, GDK_HINT_POS);
2729       gdk_window_move (widget->window, aux_info->x, aux_info->y);
2730     }
2731   
2732   if (GTK_WIDGET_VISIBLE (widget) && widget->parent)
2733     gtk_widget_size_allocate (widget, &widget->allocation);
2734 }
2735
2736 /*****************************************
2737  * gtk_widget_set_usize:
2738  *
2739  *   arguments:
2740  *
2741  *   results:
2742  *****************************************/
2743
2744 void
2745 gtk_widget_set_usize (GtkWidget *widget,
2746                       gint       width,
2747                       gint       height)
2748 {
2749   GtkWidgetAuxInfo *aux_info;
2750   
2751   g_return_if_fail (widget != NULL);
2752   
2753   aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
2754   if (!aux_info)
2755     {
2756       if (!aux_info_key_id)
2757         aux_info_key_id = gtk_object_data_force_id (aux_info_key);
2758       aux_info = gtk_widget_aux_info_new ();
2759       gtk_object_set_data_by_id (GTK_OBJECT (widget), aux_info_key_id, aux_info);
2760     }
2761   
2762   if (width > -1)
2763     aux_info->width = width;
2764   if (height > -1)
2765     aux_info->height = height;
2766   
2767   if (GTK_WIDGET_VISIBLE (widget))
2768     gtk_widget_queue_resize (widget);
2769 }
2770
2771 /*****************************************
2772  * gtk_widget_set_events:
2773  *
2774  *   arguments:
2775  *
2776  *   results:
2777  *****************************************/
2778
2779 void
2780 gtk_widget_set_events (GtkWidget *widget,
2781                        gint       events)
2782 {
2783   gint *eventp;
2784   
2785   g_return_if_fail (widget != NULL);
2786   g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
2787   g_return_if_fail (!GTK_WIDGET_REALIZED (widget));
2788   
2789   eventp = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
2790   
2791   if (events)
2792     {
2793       if (!eventp)
2794         eventp = g_new (gint, 1);
2795       
2796       *eventp = events;
2797       if (!event_key_id)
2798         event_key_id = gtk_object_data_force_id (event_key);
2799       gtk_object_set_data_by_id (GTK_OBJECT (widget), event_key_id, eventp);
2800     }
2801   else if (eventp)
2802     {
2803       g_free (eventp);
2804       gtk_object_remove_data_by_id (GTK_OBJECT (widget), event_key_id);
2805     }
2806 }
2807
2808 /*****************************************
2809  * gtk_widget_set_extension_events:
2810  *
2811  *   arguments:
2812  *
2813  *   results:
2814  *****************************************/
2815
2816 void
2817 gtk_widget_set_extension_events (GtkWidget *widget,
2818                                  GdkExtensionMode mode)
2819 {
2820   GdkExtensionMode *modep;
2821   
2822   g_return_if_fail (widget != NULL);
2823   
2824   modep = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
2825   
2826   if (!modep)
2827     modep = g_new (GdkExtensionMode, 1);
2828   
2829   *modep = mode;
2830   if (!extension_event_key_id)
2831     extension_event_key_id = gtk_object_data_force_id (extension_event_key);
2832   gtk_object_set_data_by_id (GTK_OBJECT (widget), extension_event_key_id, modep);
2833 }
2834
2835
2836 /*****************************************
2837  * gtk_widget_get_toplevel:
2838  *
2839  *   arguments:
2840  *
2841  *   results:
2842  *****************************************/
2843
2844 GtkWidget*
2845 gtk_widget_get_toplevel (GtkWidget *widget)
2846 {
2847   g_return_val_if_fail (widget != NULL, NULL);
2848   
2849   while (widget->parent)
2850     widget = widget->parent;
2851   
2852   return widget;
2853 }
2854
2855 /*****************************************
2856  * gtk_widget_get_ancestor:
2857  *
2858  *   arguments:
2859  *
2860  *   results:
2861  *****************************************/
2862
2863 GtkWidget*
2864 gtk_widget_get_ancestor (GtkWidget *widget,
2865                          GtkType    widget_type)
2866 {
2867   g_return_val_if_fail (widget != NULL, NULL);
2868   
2869   while (widget && !gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type))
2870     widget = widget->parent;
2871   
2872   if (!(widget && gtk_type_is_a (GTK_WIDGET_TYPE (widget), widget_type)))
2873     return NULL;
2874   
2875   return widget;
2876 }
2877
2878 /*****************************************
2879  * gtk_widget_get_colormap:
2880  *
2881  *   arguments:
2882  *
2883  *   results:
2884  *****************************************/
2885
2886 GdkColormap*
2887 gtk_widget_get_colormap (GtkWidget *widget)
2888 {
2889   GdkColormap *colormap;
2890   
2891   g_return_val_if_fail (widget != NULL, NULL);
2892   
2893   if (!widget->window)
2894     {
2895       colormap = gtk_object_get_data (GTK_OBJECT (widget), colormap_key);
2896       if (colormap)
2897         return colormap;
2898       return gtk_widget_get_default_colormap ();
2899     }
2900   
2901   return gdk_window_get_colormap (widget->window);
2902 }
2903
2904 /*****************************************
2905  * gtk_widget_get_visual:
2906  *
2907  *   arguments:
2908  *
2909  *   results:
2910  *****************************************/
2911
2912 GdkVisual*
2913 gtk_widget_get_visual (GtkWidget *widget)
2914 {
2915   GdkVisual *visual;
2916   
2917   g_return_val_if_fail (widget != NULL, NULL);
2918   
2919   if (!widget->window)
2920     {
2921       visual = gtk_object_get_data (GTK_OBJECT (widget), visual_key);
2922       if (visual)
2923         return visual;
2924       return gtk_widget_get_default_visual ();
2925     }
2926   
2927   return gdk_window_get_visual (widget->window);
2928 }
2929
2930 /*****************************************
2931  * gtk_widget_get_events:
2932  *
2933  *   arguments:
2934  *
2935  *   results:
2936  *****************************************/
2937
2938 gint
2939 gtk_widget_get_events (GtkWidget *widget)
2940 {
2941   gint *events;
2942   
2943   g_return_val_if_fail (widget != NULL, 0);
2944   
2945   events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
2946   if (events)
2947     return *events;
2948   
2949   return 0;
2950 }
2951
2952 /*****************************************
2953  * gtk_widget_get_extension_events:
2954  *
2955  *   arguments:
2956  *
2957  *   results:
2958  *****************************************/
2959
2960 GdkExtensionMode
2961 gtk_widget_get_extension_events (GtkWidget *widget)
2962 {
2963   GdkExtensionMode *mode;
2964   
2965   g_return_val_if_fail (widget != NULL, 0);
2966   
2967   mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
2968   if (mode)
2969     return *mode;
2970   
2971   return 0;
2972 }
2973
2974 /*****************************************
2975  * gtk_widget_get_pointer:
2976  *
2977  *   arguments:
2978  *
2979  *   results:
2980  *****************************************/
2981
2982 void
2983 gtk_widget_get_pointer (GtkWidget *widget,
2984                         gint      *x,
2985                         gint      *y)
2986 {
2987   g_return_if_fail (widget != NULL);
2988   
2989   if (x)
2990     *x = -1;
2991   if (y)
2992     *y = -1;
2993   
2994   if (GTK_WIDGET_REALIZED (widget))
2995     {
2996       gdk_window_get_pointer (widget->window, x, y, NULL);
2997       
2998       if (GTK_WIDGET_NO_WINDOW (widget))
2999         {
3000           if (x)
3001             *x -= widget->allocation.x;
3002           if (y)
3003             *y -= widget->allocation.y;
3004         }
3005     }
3006 }
3007
3008 /*****************************************
3009  * gtk_widget_is_ancestor:
3010  *
3011  *   arguments:
3012  *
3013  *   results:
3014  *****************************************/
3015
3016 gint
3017 gtk_widget_is_ancestor (GtkWidget *widget,
3018                         GtkWidget *ancestor)
3019 {
3020   g_return_val_if_fail (widget != NULL, FALSE);
3021   g_return_val_if_fail (ancestor != NULL, FALSE);
3022   
3023   while (widget)
3024     {
3025       if (widget->parent == ancestor)
3026         return TRUE;
3027       widget = widget->parent;
3028     }
3029   
3030   return FALSE;
3031 }
3032
3033 /*****************************************
3034  * gtk_widget_is_child:
3035  *
3036  *   arguments:
3037  *
3038  *   results:
3039  *****************************************/
3040
3041 gint
3042 gtk_widget_is_child (GtkWidget *widget,
3043                      GtkWidget *child)
3044 {
3045   g_return_val_if_fail (widget != NULL, FALSE);
3046   g_return_val_if_fail (child != NULL, FALSE);
3047   
3048   return (child->parent == widget);
3049 }
3050
3051 /*****************************************
3052  * gtk_widget_push_colormap:
3053  *
3054  *   arguments:
3055  *
3056  *   results:
3057  *****************************************/
3058
3059 void
3060 gtk_widget_push_colormap (GdkColormap *cmap)
3061 {
3062   g_return_if_fail (cmap != NULL);
3063
3064   colormap_stack = g_slist_prepend (colormap_stack, cmap);
3065 }
3066
3067 /*****************************************
3068  * gtk_widget_push_visual:
3069  *
3070  *   arguments:
3071  *
3072  *   results:
3073  *****************************************/
3074
3075 void
3076 gtk_widget_push_visual (GdkVisual *visual)
3077 {
3078   g_return_if_fail (visual != NULL);
3079
3080   visual_stack = g_slist_prepend (visual_stack, visual);
3081 }
3082
3083 /*****************************************
3084  * gtk_widget_pop_colormap:
3085  *
3086  *   arguments:
3087  *
3088  *   results:
3089  *****************************************/
3090
3091 void
3092 gtk_widget_pop_colormap ()
3093 {
3094   GSList *tmp;
3095   
3096   if (colormap_stack)
3097     {
3098       tmp = colormap_stack;
3099       colormap_stack = colormap_stack->next;
3100       g_slist_free_1 (tmp);
3101     }
3102 }
3103
3104 /*****************************************
3105  * gtk_widget_pop_visual:
3106  *
3107  *   arguments:
3108  *
3109  *   results:
3110  *****************************************/
3111
3112 void
3113 gtk_widget_pop_visual ()
3114 {
3115   GSList *tmp;
3116   
3117   if (visual_stack)
3118     {
3119       tmp = visual_stack;
3120       visual_stack = visual_stack->next;
3121       g_slist_free_1 (tmp);
3122     }
3123 }
3124
3125 /*****************************************
3126  * gtk_widget_set_default_colormap:
3127  *
3128  *   arguments:
3129  *
3130  *   results:
3131  *****************************************/
3132
3133 void
3134 gtk_widget_set_default_colormap (GdkColormap *colormap)
3135 {
3136   if (default_colormap != colormap)
3137     {
3138       if (default_colormap)
3139         gdk_colormap_unref (default_colormap);
3140       default_colormap = colormap;
3141       if (default_colormap)
3142         gdk_colormap_ref (default_colormap);
3143     }
3144 }
3145
3146 /*****************************************
3147  * gtk_widget_set_default_visual:
3148  *
3149  *   arguments:
3150  *
3151  *   results:
3152  *****************************************/
3153
3154 void
3155 gtk_widget_set_default_visual (GdkVisual *visual)
3156 {
3157   default_visual = visual;
3158 }
3159
3160 /*****************************************
3161  * gtk_widget_get_default_colormap:
3162  *
3163  *   arguments:
3164  *
3165  *   results:
3166  *****************************************/
3167
3168 GdkColormap*
3169 gtk_widget_get_default_colormap ()
3170 {
3171   if (!default_colormap)
3172     default_colormap = gdk_colormap_get_system ();
3173   
3174   return default_colormap;
3175 }
3176
3177 /*****************************************
3178  * gtk_widget_get_default_visual:
3179  *
3180  *   arguments:
3181  *
3182  *   results:
3183  *****************************************/
3184
3185 GdkVisual*
3186 gtk_widget_get_default_visual ()
3187 {
3188   if (!default_visual)
3189     default_visual = gdk_visual_get_system ();
3190   
3191   return default_visual;
3192 }
3193
3194 /*****************************************
3195  * gtk_widget_marshal_signal_1:
3196  *
3197  *   arguments:
3198  *
3199  *   results:
3200  *****************************************/
3201
3202 static void
3203 gtk_widget_marshal_signal_1 (GtkObject      *object,
3204                              GtkSignalFunc   func,
3205                              gpointer        func_data,
3206                              GtkArg         *args)
3207 {
3208   GtkWidgetSignal1 rfunc;
3209   
3210   rfunc = (GtkWidgetSignal1) func;
3211   
3212   (* rfunc) (object,
3213              GTK_VALUE_POINTER (args[0]),
3214              func_data);
3215 }
3216
3217 /*****************************************
3218  * gtk_widget_marshal_signal_2:
3219  *
3220  *   arguments:
3221  *
3222  *   results:
3223  *****************************************/
3224
3225 static void
3226 gtk_widget_marshal_signal_2 (GtkObject      *object,
3227                              GtkSignalFunc   func,
3228                              gpointer        func_data,
3229                              GtkArg         *args)
3230 {
3231   GtkWidgetSignal2 rfunc;
3232   gint *return_val;
3233   
3234   rfunc = (GtkWidgetSignal2) func;
3235   return_val = GTK_RETLOC_BOOL (args[3]);
3236   
3237   *return_val = (* rfunc) (object,
3238                            GTK_VALUE_STRING (args[0]),
3239                            GTK_VALUE_CHAR (args[1]),
3240                            GTK_VALUE_INT (args[2]),
3241                            func_data);
3242 }
3243
3244 /*****************************************
3245  * gtk_widget_marshal_signal_3:
3246  *
3247  *   arguments:
3248  *
3249  *   results:
3250  *****************************************/
3251
3252 static void
3253 gtk_widget_marshal_signal_3 (GtkObject      *object,
3254                              GtkSignalFunc   func,
3255                              gpointer        func_data,
3256                              GtkArg         *args)
3257 {
3258   GtkWidgetSignal3 rfunc;
3259   
3260   rfunc = (GtkWidgetSignal3) func;
3261   
3262   (* rfunc) (object,
3263              GTK_VALUE_STRING (args[0]),
3264              func_data);
3265 }
3266
3267 /*****************************************
3268  * gtk_widget_marshal_signal_4:
3269  *
3270  *   arguments:
3271  *
3272  *   results:
3273  *****************************************/
3274
3275 static void
3276 gtk_widget_marshal_signal_4 (GtkObject      *object,
3277                              GtkSignalFunc   func,
3278                              gpointer        func_data,
3279                              GtkArg         *args)
3280 {
3281   GtkWidgetSignal4 rfunc;
3282   gint *return_val;
3283   
3284   rfunc = (GtkWidgetSignal4) func;
3285   return_val = GTK_RETLOC_BOOL (args[1]);
3286   
3287   *return_val = (* rfunc) (object,
3288                            GTK_VALUE_BOXED (args[0]),
3289                            func_data);
3290 }
3291
3292 /*****************************************
3293  * gtk_widget_marshal_signal_5:
3294  *
3295  *   arguments:
3296  *
3297  *   results:
3298  *****************************************/
3299
3300 static void
3301 gtk_widget_marshal_signal_5 (GtkObject      *object,
3302                              GtkSignalFunc   func,
3303                              gpointer        func_data,
3304                              GtkArg         *args)
3305 {
3306   GtkWidgetSignal5 rfunc;
3307   
3308   rfunc = (GtkWidgetSignal5) func;
3309   
3310   (* rfunc) (object,
3311              GTK_VALUE_UINT (args[0]),
3312              func_data);
3313 }
3314
3315 /*****************************************
3316  * gtk_widget_marshal_signal_6:
3317  *
3318  *   arguments:
3319  *
3320  *   results:
3321  *****************************************/
3322
3323 static void
3324 gtk_widget_marshal_signal_6 (GtkObject      *object,
3325                              GtkSignalFunc   func,
3326                              gpointer        func_data,
3327                              GtkArg         *args)
3328 {
3329   GtkWidgetSignal6 rfunc;
3330   
3331   rfunc = (GtkWidgetSignal6) func;
3332   
3333   (* rfunc) (object,
3334              GTK_VALUE_OBJECT (args[0]),
3335              func_data);
3336 }
3337
3338 /*****************************************
3339  * gtk_widget_marshal_signal_7:
3340  *
3341  *   arguments:
3342  *
3343  *   results:
3344  *****************************************/
3345
3346 static void
3347 gtk_widget_marshal_signal_7 (GtkObject      *object,
3348                              GtkSignalFunc   func,
3349                              gpointer        func_data,
3350                              GtkArg         *args)
3351 {
3352   GtkWidgetSignal7 rfunc;
3353   
3354   rfunc = (GtkWidgetSignal7) func;
3355   
3356   (* rfunc) (object,
3357              GTK_VALUE_BOXED (args[0]),
3358              func_data);
3359 }
3360
3361 static void
3362 gtk_widget_shutdown (GtkObject *object)
3363 {
3364   GtkWidget *widget;
3365   
3366   /* gtk_object_destroy() will already hold a refcount on object
3367    */
3368   widget = GTK_WIDGET (object);
3369
3370   if (widget->parent)
3371     gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
3372
3373   GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3374   if (GTK_WIDGET_REALIZED (widget))
3375     gtk_widget_unrealize (widget);
3376   
3377   parent_class->shutdown (object);
3378 }
3379
3380 static void
3381 gtk_widget_real_destroy (GtkObject *object)
3382 {
3383   GtkWidget *widget;
3384   GtkStyle *saved_style;
3385
3386   /* gtk_object_destroy() will already hold a refcount on object
3387    */
3388   widget = GTK_WIDGET (object);
3389
3390   if (GTK_CONTAINER_RESIZE_PENDING (widget))
3391     {
3392       gtk_widget_resize_queue = g_slist_remove (gtk_widget_resize_queue, widget);
3393       GTK_PRIVATE_UNSET_FLAG (widget, GTK_RESIZE_PENDING);
3394     }
3395
3396   gtk_grab_remove (widget);
3397   gtk_selection_remove_all (widget);
3398
3399   saved_style = gtk_object_get_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3400   if (saved_style)
3401     {
3402       gtk_style_unref (saved_style);
3403       gtk_object_remove_data_by_id (GTK_OBJECT (widget), saved_default_style_key_id);
3404     }
3405
3406   gtk_style_unref (widget->style);
3407   widget->style = NULL;
3408
3409   parent_class->destroy (object);
3410 }
3411
3412 static void
3413 gtk_widget_finalize (GtkObject *object)
3414 {
3415   GtkWidget *widget;
3416   GtkWidgetAuxInfo *aux_info;
3417   gint *events;
3418   GdkExtensionMode *mode;
3419   
3420   widget = GTK_WIDGET (object);
3421   
3422   if (widget->name)
3423     g_free (widget->name);
3424   
3425   aux_info = gtk_object_get_data_by_id (GTK_OBJECT (widget), aux_info_key_id);
3426   if (aux_info)
3427     gtk_widget_aux_info_destroy (aux_info);
3428   
3429   events = gtk_object_get_data_by_id (GTK_OBJECT (widget), event_key_id);
3430   if (events)
3431     g_free (events);
3432   
3433   mode = gtk_object_get_data_by_id (GTK_OBJECT (widget), extension_event_key_id);
3434   if (mode)
3435     g_free (mode);
3436
3437   parent_class->finalize (object);
3438 }
3439
3440 /*****************************************
3441  * gtk_widget_real_show:
3442  *
3443  *   arguments:
3444  *
3445  *   results:
3446  *****************************************/
3447
3448 static void
3449 gtk_widget_real_show (GtkWidget *widget)
3450 {
3451   g_return_if_fail (widget != NULL);
3452   g_return_if_fail (GTK_IS_WIDGET (widget));
3453   
3454   if (!GTK_WIDGET_VISIBLE (widget))
3455     {
3456       GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
3457       
3458       if (widget->parent)
3459         {
3460           gtk_widget_queue_resize (widget->parent);
3461           
3462           if (GTK_WIDGET_MAPPED (widget->parent))
3463             gtk_widget_map (widget);
3464         }
3465     }
3466 }
3467
3468 /*****************************************
3469  * gtk_widget_real_hide:
3470  *
3471  *   arguments:
3472  *
3473  *   results:
3474  *****************************************/
3475
3476 static void
3477 gtk_widget_real_hide (GtkWidget *widget)
3478 {
3479   g_return_if_fail (widget != NULL);
3480   g_return_if_fail (GTK_IS_WIDGET (widget));
3481   
3482   if (GTK_WIDGET_VISIBLE (widget))
3483     {
3484       GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
3485       
3486       if (GTK_WIDGET_MAPPED (widget))
3487         gtk_widget_unmap (widget);
3488       
3489       if (widget->parent)
3490         gtk_widget_queue_resize (widget);
3491     }
3492 }
3493
3494 /*****************************************
3495  * gtk_widget_real_map:
3496  *
3497  *   arguments:
3498  *
3499  *   results:
3500  *****************************************/
3501
3502 static void
3503 gtk_widget_real_map (GtkWidget *widget)
3504 {
3505   g_return_if_fail (widget != NULL);
3506   g_return_if_fail (GTK_IS_WIDGET (widget));
3507   
3508   if (GTK_WIDGET_REALIZED (widget) && !GTK_WIDGET_MAPPED (widget))
3509     {
3510       GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
3511       
3512       if (!GTK_WIDGET_NO_WINDOW (widget))
3513         gdk_window_show (widget->window);
3514       else
3515         gtk_widget_queue_draw (widget);
3516     }
3517 }
3518
3519 /*****************************************
3520  * gtk_widget_real_unmap:
3521  *
3522  *   arguments:
3523  *
3524  *   results:
3525  *****************************************/
3526
3527 static void
3528 gtk_widget_real_unmap (GtkWidget *widget)
3529 {
3530   g_return_if_fail (widget != NULL);
3531   g_return_if_fail (GTK_IS_WIDGET (widget));
3532   
3533   if (GTK_WIDGET_MAPPED (widget))
3534     {
3535       GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
3536       
3537       if (GTK_WIDGET_NO_WINDOW (widget))
3538         gdk_window_clear_area (widget->window,
3539                                widget->allocation.x,
3540                                widget->allocation.y,
3541                                widget->allocation.width,
3542                                widget->allocation.height);
3543       else
3544         gdk_window_hide (widget->window);
3545     }
3546 }
3547
3548 /*****************************************
3549  * gtk_widget_real_realize:
3550  *
3551  *   arguments:
3552  *
3553  *   results:
3554  *****************************************/
3555
3556 static void
3557 gtk_widget_real_realize (GtkWidget *widget)
3558 {
3559   g_return_if_fail (widget != NULL);
3560   g_return_if_fail (GTK_IS_WIDGET (widget));
3561   g_return_if_fail (GTK_WIDGET_NO_WINDOW (widget));
3562   
3563   GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
3564   if (widget->parent)
3565     {
3566       widget->window = gtk_widget_get_parent_window (widget);
3567       gdk_window_ref (widget->window);
3568     }
3569   widget->style = gtk_style_attach (widget->style, widget->window);
3570 }
3571
3572 /*****************************************
3573  * gtk_widget_real_unrealize:
3574  *
3575  *   arguments:
3576  *
3577  *   results:
3578  *****************************************/
3579
3580 static void
3581 gtk_widget_real_unrealize (GtkWidget *widget)
3582 {
3583   g_return_if_fail (widget != NULL);
3584   g_return_if_fail (GTK_IS_WIDGET (widget));
3585
3586   if (GTK_WIDGET_NO_WINDOW (widget) && GTK_WIDGET_MAPPED (widget))
3587     gtk_widget_real_unmap (widget);
3588
3589   GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED | GTK_MAPPED);
3590
3591   /* printf ("unrealizing %s\n", gtk_type_name (GTK_OBJECT(widget)->klass->type));
3592    */
3593
3594   gtk_style_detach (widget->style);
3595   if (!GTK_WIDGET_NO_WINDOW (widget))
3596     {
3597       gdk_window_set_user_data (widget->window, NULL);
3598       gdk_window_destroy (widget->window);
3599     }
3600   else
3601     {
3602       gdk_window_unref (widget->window);
3603     }
3604
3605   /* Unrealize afterwards to improve visual effect */
3606
3607   if (GTK_IS_CONTAINER (widget))
3608     gtk_container_foreach (GTK_CONTAINER (widget),
3609                            (GtkCallback)gtk_widget_unrealize,
3610                            NULL);
3611
3612   widget->window = NULL;
3613 }
3614
3615 /*****************************************
3616  * gtk_widget_real_draw:
3617  *
3618  *   arguments:
3619  *
3620  *   results:
3621  *****************************************/
3622
3623 static void
3624 gtk_widget_real_draw (GtkWidget    *widget,
3625                       GdkRectangle *area)
3626 {
3627   GdkEventExpose event;
3628   
3629   g_return_if_fail (widget != NULL);
3630   g_return_if_fail (GTK_IS_WIDGET (widget));
3631   g_return_if_fail (area != NULL);
3632   
3633   if (GTK_WIDGET_DRAWABLE (widget))
3634     {
3635       event.type = GDK_EXPOSE;
3636       event.send_event = TRUE;
3637       event.window = widget->window;
3638       event.area = *area;
3639       event.count = 0;
3640       
3641       gdk_window_ref (event.window);
3642       gtk_widget_event (widget, (GdkEvent*) &event);
3643       gdk_window_unref (event.window);
3644     }
3645 }
3646
3647 /*****************************************
3648  * gtk_widget_real_queue_draw:
3649  *
3650  *   arguments:
3651  *
3652  *   results:
3653  *****************************************/
3654
3655 static gint
3656 gtk_widget_real_queue_draw (GtkWidget *widget)
3657 {
3658   g_return_val_if_fail (widget != NULL, FALSE);
3659   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
3660   
3661   GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_PENDING);
3662   gtk_widget_draw (widget, NULL);
3663   
3664   return FALSE;
3665 }
3666
3667 /*****************************************
3668  * gtk_widget_real_size_allocate:
3669  *
3670  *   arguments:
3671  *
3672  *   results:
3673  *****************************************/
3674
3675 static void
3676 gtk_widget_real_size_allocate (GtkWidget     *widget,
3677                                GtkAllocation *allocation)
3678 {
3679   g_return_if_fail (widget != NULL);
3680   g_return_if_fail (GTK_IS_WIDGET (widget));
3681   
3682   if (GTK_WIDGET_NO_WINDOW (widget) &&
3683       GTK_WIDGET_MAPPED (widget) &&
3684       ((widget->allocation.x != allocation->x) ||
3685        (widget->allocation.y != allocation->y) ||
3686        (widget->allocation.width != allocation->width) ||
3687        (widget->allocation.height != allocation->height)) &&
3688       (widget->allocation.width != 0) &&
3689       (widget->allocation.height != 0))
3690     gdk_window_clear_area (widget->window,
3691                            widget->allocation.x,
3692                            widget->allocation.y,
3693                            widget->allocation.width,
3694                            widget->allocation.height);
3695   
3696   widget->allocation = *allocation;
3697   
3698   if (GTK_WIDGET_REALIZED (widget) &&
3699       !GTK_WIDGET_NO_WINDOW (widget))
3700     gdk_window_move_resize (widget->window,
3701                             allocation->x, allocation->y,
3702                             allocation->width, allocation->height);
3703 }
3704
3705 /*****************************************
3706  * gtk_widget_peek_colormap:
3707  *
3708  *   arguments:
3709  *
3710  *   results:
3711  *****************************************/
3712
3713 static GdkColormap*
3714 gtk_widget_peek_colormap ()
3715 {
3716   if (colormap_stack)
3717     return (GdkColormap*) colormap_stack->data;
3718   return gtk_widget_get_default_colormap ();
3719 }
3720
3721 /*****************************************
3722  * gtk_widget_peek_visual:
3723  *
3724  *   arguments:
3725  *
3726  *   results:
3727  *****************************************/
3728
3729 static GdkVisual*
3730 gtk_widget_peek_visual ()
3731 {
3732   if (visual_stack)
3733     return (GdkVisual*) visual_stack->data;
3734   return gtk_widget_get_default_visual ();
3735 }
3736
3737 /*************************************************************
3738  * gtk_widget_propagate_state:
3739  *     Propagate a change in the widgets state down the tree
3740  *
3741  *   arguments:
3742  *     widget
3743  *     GtkStateData: state
3744  *                   parent_sensitive
3745  *
3746  *   results:
3747  *************************************************************/
3748
3749 static void
3750 gtk_widget_propagate_state (GtkWidget           *widget,
3751                             GtkStateData        *data)
3752 {
3753   guint8 old_state;
3754
3755   /* don't call this function with state=GTK_STATE_INSENSITIVE,
3756    * parent_sensitive=TRUE and a sensitive widget
3757    */
3758
3759   old_state = GTK_WIDGET_STATE (widget);
3760
3761   if (data->parent_sensitive)
3762     {
3763       GTK_WIDGET_SET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3764
3765       if (GTK_WIDGET_IS_SENSITIVE (widget))
3766         GTK_WIDGET_STATE (widget) = data->state;
3767       else
3768         {
3769           GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3770           if (data->state != GTK_STATE_INSENSITIVE)
3771             GTK_WIDGET_SAVED_STATE (widget) = data->state;
3772         }
3773     }
3774   else
3775     {
3776       GTK_WIDGET_UNSET_FLAGS (widget, GTK_PARENT_SENSITIVE);
3777       GTK_WIDGET_STATE (widget) = GTK_STATE_INSENSITIVE;
3778       if (data->state != GTK_STATE_INSENSITIVE)
3779         GTK_WIDGET_SAVED_STATE (widget) = data->state;
3780     }
3781
3782   if (GTK_WIDGET_HAS_FOCUS (widget) && !GTK_WIDGET_IS_SENSITIVE (widget))
3783     {
3784       GtkWidget *window;
3785
3786       window = gtk_widget_get_ancestor (widget, gtk_window_get_type ());
3787       if (window)
3788         gtk_window_set_focus (GTK_WINDOW (window), NULL);
3789     }
3790
3791   if (old_state != GTK_WIDGET_STATE (widget))
3792     {
3793       gtk_widget_ref (widget);
3794       gtk_signal_emit (GTK_OBJECT (widget), widget_signals[STATE_CHANGED], old_state);
3795       
3796       if (GTK_IS_CONTAINER (widget))
3797         {
3798           data->parent_sensitive = GTK_WIDGET_IS_SENSITIVE (widget);
3799           data->state = GTK_WIDGET_STATE (widget);
3800           gtk_container_foreach (GTK_CONTAINER (widget),
3801                                  (GtkCallback) gtk_widget_propagate_state,
3802                                  data);
3803         }
3804       gtk_widget_unref (widget);
3805     }
3806 }
3807
3808 /*****************************************
3809  * gtk_widget_draw_children_recurse:
3810  *
3811  *   arguments:
3812  *
3813  *   results:
3814  *****************************************/
3815
3816 static void
3817 gtk_widget_draw_children_recurse (GtkWidget *widget,
3818                                   gpointer   client_data)
3819 {
3820   gtk_widget_draw (widget, NULL);
3821   gtk_widget_draw_children (widget);
3822 }
3823
3824 /*****************************************
3825  * gtk_widget_aux_info_new:
3826  *
3827  *   arguments:
3828  *
3829  *   results:
3830  *****************************************/
3831
3832 static GtkWidgetAuxInfo*
3833 gtk_widget_aux_info_new ()
3834 {
3835   GtkWidgetAuxInfo *aux_info;
3836   
3837   if (!aux_info_mem_chunk)
3838     aux_info_mem_chunk = g_mem_chunk_new ("widget aux info mem chunk",
3839                                           sizeof (GtkWidgetAuxInfo),
3840                                           1024, G_ALLOC_AND_FREE);
3841   
3842   aux_info = g_chunk_new (GtkWidgetAuxInfo, aux_info_mem_chunk);
3843   
3844   aux_info->x = -1;
3845   aux_info->y = -1;
3846   aux_info->width = 0;
3847   aux_info->height = 0;
3848   
3849   return aux_info;
3850 }
3851
3852 /*****************************************
3853  * gtk_widget_aux_info_destroy:
3854  *
3855  *   arguments:
3856  *
3857  *   results:
3858  *****************************************/
3859
3860 static void
3861 gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
3862 {
3863   g_return_if_fail (aux_info != NULL);
3864   
3865   g_mem_chunk_free (aux_info_mem_chunk, aux_info);
3866 }
3867
3868 /*****************************************
3869  * gtk_widget_shape_combine_mask: 
3870  *   set a shape for this widgets' gdk window, this allows for
3871  *   transparent windows etc., see gdk_window_shape_combine_mask
3872  *   for more information
3873  *
3874  *   arguments:
3875  *
3876  *   results:
3877  *****************************************/
3878 void
3879 gtk_widget_shape_combine_mask (GtkWidget *widget,
3880                                GdkBitmap *shape_mask,
3881                                gint       offset_x,
3882                                gint       offset_y)
3883 {
3884   GtkWidgetShapeInfo* shape_info;
3885   
3886   g_return_if_fail (widget != NULL);
3887   /*  set_shape doesn't work on widgets without gdk window */
3888   g_return_if_fail (!GTK_WIDGET_NO_WINDOW (widget));
3889
3890   if (!shape_mask)
3891     {
3892       GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
3893       
3894       if (widget->window)
3895         gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
3896       
3897       shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
3898       gtk_object_remove_data (GTK_OBJECT (widget), shape_info_key);
3899       g_free (shape_info);
3900     }
3901   else
3902     {
3903       GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
3904       
3905       shape_info = gtk_object_get_data (GTK_OBJECT (widget), shape_info_key);
3906       if (!shape_info)
3907         {
3908           shape_info = g_new (GtkWidgetShapeInfo, 1);
3909           gtk_object_set_data (GTK_OBJECT (widget), shape_info_key, shape_info);
3910         }
3911       shape_info->shape_mask = shape_mask;
3912       shape_info->offset_x = offset_x;
3913       shape_info->offset_y = offset_y;
3914       
3915       /* set shape if widget has a gdk window allready.
3916        * otherwise the shape is scheduled to be set by gtk_widget_realize.
3917        */
3918       if (widget->window)
3919         gdk_window_shape_combine_mask (widget->window, shape_mask,
3920                                        offset_x, offset_y);
3921     }
3922 }
3923
3924 /*****************************************
3925  * gtk_widget_dnd_drag_add:
3926  *   when you get a DRAG_ENTER event, you can use this           
3927  *   to tell Gtk ofother widgets that are to be dragged as well
3928  *
3929  *   arguments:
3930  *
3931  *   results:
3932  *****************************************/
3933 void
3934 gtk_widget_dnd_drag_add (GtkWidget *widget)
3935 {
3936 }
3937
3938 /*****************************************
3939  * gtk_widget_dnd_drag_set:
3940  *   these two functions enable drag and/or drop on a
3941  *   widget and also let Gtk know what data types will be accepted
3942  *   use MIME type naming,plus tacking "URL:" on the front for link 
3943  *   dragging
3944  *             
3945  *
3946  *   arguments:
3947  *
3948  *   results:
3949  *****************************************/
3950 void
3951 gtk_widget_dnd_drag_set (GtkWidget   *widget,
3952                          guint8       drag_enable,
3953                          gchar      **type_accept_list,
3954                          guint        numtypes)
3955 {
3956   g_return_if_fail(widget != NULL);
3957   
3958   if (!widget->window)
3959     gtk_widget_realize (widget);
3960   
3961   g_return_if_fail (widget->window != NULL);
3962   gdk_window_dnd_drag_set (widget->window,
3963                            drag_enable,
3964                            type_accept_list,
3965                            numtypes);
3966 }
3967
3968 /*****************************************
3969  * gtk_widget_dnd_drop_set:
3970  *
3971  *   arguments:
3972  *
3973  *   results:
3974  *****************************************/
3975 void
3976 gtk_widget_dnd_drop_set (GtkWidget   *widget,
3977                          guint8       drop_enable,
3978                          gchar      **type_accept_list,
3979                          guint        numtypes,
3980                          guint8       is_destructive_operation)
3981 {
3982   g_return_if_fail(widget != NULL);
3983   
3984   if (!widget->window)
3985     gtk_widget_realize (widget);
3986   
3987   g_return_if_fail (widget->window != NULL);
3988   gdk_window_dnd_drop_set (widget->window,
3989                            drop_enable,
3990                            type_accept_list,
3991                            numtypes,
3992                            is_destructive_operation);
3993 }
3994
3995 /*****************************************
3996  * gtk_widget_dnd_data_set:
3997  *
3998  *   arguments:
3999  *
4000  *   results:
4001  *****************************************/
4002 void
4003 gtk_widget_dnd_data_set (GtkWidget   *widget,
4004                          GdkEvent    *event,
4005                          gpointer     data,
4006                          gulong       data_numbytes)
4007 {
4008   g_return_if_fail (widget != NULL);
4009   g_return_if_fail (widget->window != NULL);
4010   
4011   gdk_window_dnd_data_set (widget->window, event, data, data_numbytes);
4012 }
4013
4014
4015 #undef  gtk_widget_ref
4016 #undef  gtk_widget_unref
4017
4018
4019 void
4020 gtk_widget_ref (GtkWidget *widget)
4021 {
4022   volatile GtkObject *object;
4023
4024   object = GTK_OBJECT (widget);
4025   gtk_object_ref (object);
4026 }
4027
4028 void
4029 gtk_widget_unref (GtkWidget *widget)
4030 {
4031   volatile GtkObject *object;
4032
4033   object = GTK_OBJECT (widget);
4034   gtk_object_unref (object);
4035 }
4036