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