]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkwidget.c
Remove GtkObject completely
[~andy/gtk] / gtk / gtkwidget.c
index 982c85ba667a560b7bfc9753d9a39984fe084419..9472578cc1dcc5c7808d7c1a3308a9c7be480e44 100644 (file)
@@ -24,6 +24,8 @@
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
  */
 
+#undef GDK_DISABLE_DEPRECATED /* gdk_input_set_extension_events() */
+
 #include "config.h"
 #include <stdarg.h>
 #include <string.h>
 #include "gdk/gdkprivate.h" /* Used in gtk_reset_shapes_recurse to avoid copy */
 #include <gobject/gvaluecollector.h>
 #include <gobject/gobjectnotifyqueue.c>
+#include <cairo-gobject.h>
 #include "gdk/gdkkeysyms.h"
 #include "gtkaccessible.h"
 #include "gtktooltip.h"
 #include "gtkinvisible.h"
 #include "gtkbuildable.h"
 #include "gtkbuilderprivate.h"
-#include "gtkextendedlayout.h"
-#include "gtkalias.h"
+#include "gtksizerequest.h"
+#include "gtkdebug.h"
+
 
 /**
  * SECTION:gtkwidget
 #define WIDGET_CLASS(w)         GTK_WIDGET_GET_CLASS (w)
 #define        INIT_PATH_SIZE  (512)
 
+struct _GtkWidgetPrivate
+{
+  /* The state of the widget. There are actually only
+   * 5 widget states (defined in "gtkenums.h")
+   * so 3 bits.
+   */
+  guint state : 3;
+
+  /* The saved state of the widget. When a widget's state
+   *  is changed to GTK_STATE_INSENSITIVE via
+   *  "gtk_widget_set_state" or "gtk_widget_set_sensitive"
+   *  the old state is kept around in this field. The state
+   *  will be restored once the widget gets sensitive again.
+   */
+  guint saved_state : 3;
+
+  guint direction             : 2;
+
+  guint in_destruction        : 1;
+  guint toplevel              : 1;
+  guint anchored              : 1;
+  guint composite_child       : 1;
+  guint no_window             : 1;
+  guint realized              : 1;
+  guint mapped                : 1;
+  guint visible               : 1;
+  guint sensitive             : 1;
+  guint parent_sensitive      : 1;
+  guint can_focus             : 1;
+  guint has_focus             : 1;
+  guint can_default           : 1;
+  guint has_default           : 1;
+  guint receives_default      : 1;
+  guint has_grab              : 1;
+  guint shadowed              : 1;
+  guint rc_style              : 1;
+  guint user_style            : 1;
+  guint app_paintable         : 1;
+  guint double_buffered       : 1;
+  guint redraw_on_alloc       : 1;
+  guint no_show_all           : 1;
+  guint child_visible         : 1;
+  guint multidevice           : 1;
+  guint has_shape_mask        : 1;
+  guint in_reparent           : 1;
+  guint resize_pending        : 1;
+  guint alloc_needed          : 1;
+  guint width_request_needed  : 1;
+  guint height_request_needed : 1;
+
+  /* The widget's name. If the widget does not have a name
+   *  (the name is NULL), then its name (as returned by
+   *  "gtk_widget_get_name") is its class's name.
+   * Among other things, the widget name is used to determine
+   *  the style to use for a widget.
+   */
+  gchar *name;
+
+  /* The style for the widget. The style contains the
+   *  colors the widget should be drawn in for each state
+   *  along with graphics contexts used to draw with and
+   *  the font to use for text.
+   */
+  GtkStyle *style;
+
+  /* The widget's allocated size.
+   */
+  GtkAllocation allocation;
+
+  /* The widget's requested sizes */
+  SizeRequestCache requests;
+
+  /* The widget's window or its parent window if it does
+   *  not have a window. (Which will be indicated by the
+   *  GTK_NO_WINDOW flag being set).
+   */
+  GdkWindow *window;
+
+  /* The widget's parent.
+   */
+  GtkWidget *parent;
+};
 
 enum {
+  DESTROY,
   SHOW,
   HIDE,
   MAP,
@@ -145,6 +232,7 @@ enum {
   DIRECTION_CHANGED,
   GRAB_NOTIFY,
   CHILD_NOTIFY,
+  DRAW,
   MNEMONIC_ACTIVATE,
   GRAB_FOCUS,
   FOCUS,
@@ -225,7 +313,14 @@ enum {
   PROP_TOOLTIP_MARKUP,
   PROP_TOOLTIP_TEXT,
   PROP_WINDOW,
-  PROP_DOUBLE_BUFFERED
+  PROP_DOUBLE_BUFFERED,
+  PROP_HALIGN,
+  PROP_VALIGN,
+  PROP_MARGIN_LEFT,
+  PROP_MARGIN_RIGHT,
+  PROP_MARGIN_TOP,
+  PROP_MARGIN_BOTTOM,
+  PROP_MARGIN
 };
 
 typedef        struct  _GtkStateData    GtkStateData;
@@ -251,7 +346,7 @@ static void gtk_widget_get_property          (GObject           *object,
                                                  GValue            *value,
                                                  GParamSpec        *pspec);
 static void    gtk_widget_dispose               (GObject           *object);
-static void    gtk_widget_real_destroy          (GtkObject         *object);
+static void    gtk_widget_real_destroy          (GtkWidget         *object);
 static void    gtk_widget_finalize              (GObject           *object);
 static void    gtk_widget_real_show             (GtkWidget         *widget);
 static void    gtk_widget_real_hide             (GtkWidget         *widget);
@@ -262,7 +357,7 @@ static void gtk_widget_real_unrealize        (GtkWidget         *widget);
 static void    gtk_widget_real_size_request     (GtkWidget         *widget,
                                                  GtkRequisition    *requisition);
 static void    gtk_widget_real_size_allocate    (GtkWidget         *widget,
-                                                 GtkAllocation     *allocation);
+                                                  GtkAllocation            *allocation);
 static void    gtk_widget_real_style_set        (GtkWidget         *widget,
                                                   GtkStyle          *previous_style);
 static void    gtk_widget_real_direction_changed(GtkWidget         *widget,
@@ -306,12 +401,27 @@ static gint               gtk_widget_event_internal               (GtkWidget        *widget,
                                                                 GdkEvent         *event);
 static gboolean                gtk_widget_real_mnemonic_activate       (GtkWidget        *widget,
                                                                 gboolean          group_cycling);
+static void             gtk_widget_real_get_width               (GtkWidget        *widget,
+                                                                 gint             *minimum_size,
+                                                                 gint             *natural_size);
+static void             gtk_widget_real_get_height              (GtkWidget        *widget,
+                                                                 gint             *minimum_size,
+                                                                 gint             *natural_size);
+static void             gtk_widget_real_get_height_for_width    (GtkWidget        *widget,
+                                                                 gint              width,
+                                                                 gint             *minimum_height,
+                                                                 gint             *natural_height);
+static void             gtk_widget_real_get_width_for_height    (GtkWidget        *widget,
+                                                                 gint              height,
+                                                                 gint             *minimum_width,
+                                                                 gint             *natural_width);
+static const GtkWidgetAuxInfo* _gtk_widget_get_aux_info_or_defaults (GtkWidget *widget);
 static void            gtk_widget_aux_info_destroy             (GtkWidgetAuxInfo *aux_info);
 static AtkObject*      gtk_widget_real_get_accessible          (GtkWidget        *widget);
 static void            gtk_widget_accessible_interface_init    (AtkImplementorIface *iface);
 static AtkObject*      gtk_widget_ref_accessible               (AtkImplementor *implementor);
 static void             gtk_widget_invalidate_widget_windows    (GtkWidget        *widget,
-                                                                GdkRegion        *region);
+                                                                cairo_region_t        *region);
 static GdkScreen *      gtk_widget_get_screen_unchecked         (GtkWidget        *widget);
 static void            gtk_widget_queue_shallow_draw           (GtkWidget        *widget);
 static gboolean         gtk_widget_real_can_activate_accel      (GtkWidget *widget,
@@ -345,28 +455,36 @@ static void             gtk_widget_buildable_custom_finished    (GtkBuildable
 static void             gtk_widget_buildable_parser_finished    (GtkBuildable     *buildable,
                                                                  GtkBuilder       *builder);
 
-static void             gtk_widget_extended_layout_init         (GtkExtendedLayoutIface *iface);
-static void             gtk_widget_real_get_desired_width       (GtkExtendedLayout *layout,
+static void             gtk_widget_real_get_width               (GtkWidget         *widget,
                                                                  gint              *minimum_size,
                                                                  gint              *natural_size);
-static void             gtk_widget_real_get_desired_height      (GtkExtendedLayout *layout,
+static void             gtk_widget_real_get_height              (GtkWidget         *widget,
                                                                  gint              *minimum_size,
                                                                  gint              *natural_size);
 
 static void             gtk_widget_queue_tooltip_query          (GtkWidget *widget);
-     
+
+
+static void             gtk_widget_real_adjust_size_request     (GtkWidget         *widget,
+                                                                 GtkOrientation     orientation,
+                                                                 gint               for_size,
+                                                                 gint              *minimum_size,
+                                                                 gint              *natural_size);
+static void             gtk_widget_real_adjust_size_allocation  (GtkWidget         *widget,
+                                                                 GtkAllocation     *allocation);
+
 static void gtk_widget_set_usize_internal (GtkWidget *widget,
                                           gint       width,
                                           gint       height);
-static void gtk_widget_get_draw_rectangle (GtkWidget    *widget,
-                                          GdkRectangle *rect);
 
+static void gtk_widget_add_events_internal (GtkWidget *widget,
+                                            GdkDevice *device,
+                                            gint       events);
 
 /* --- variables --- */
 static gpointer         gtk_widget_parent_class = NULL;
 static guint            widget_signals[LAST_SIGNAL] = { 0 };
 static GtkStyle        *gtk_default_style = NULL;
-static GSList          *colormap_stack = NULL;
 static guint            composite_child_stack = 0;
 static GtkTextDirection gtk_default_direction = GTK_TEXT_DIR_LTR;
 static GParamSpecPool  *style_property_spec_pool = NULL;
@@ -376,12 +494,12 @@ static GQuark             quark_aux_info = 0;
 static GQuark          quark_accel_path = 0;
 static GQuark          quark_accel_closures = 0;
 static GQuark          quark_event_mask = 0;
+static GQuark           quark_device_event_mask = 0;
 static GQuark          quark_extension_event_mode = 0;
 static GQuark          quark_parent_window = 0;
 static GQuark          quark_pointer_window = 0;
 static GQuark          quark_shape_info = 0;
 static GQuark          quark_input_shape_info = 0;
-static GQuark          quark_colormap = 0;
 static GQuark          quark_pango_context = 0;
 static GQuark          quark_rc_style = 0;
 static GQuark          quark_accessible_object = 0;
@@ -428,22 +546,13 @@ gtk_widget_get_type (void)
        NULL /* interface data */
       };
 
-      const GInterfaceInfo layout_info =
-      {
-       (GInterfaceInitFunc) gtk_widget_extended_layout_init,
-       (GInterfaceFinalizeFunc) NULL,
-       NULL /* interface data */
-      };
-
-      widget_type = g_type_register_static (GTK_TYPE_OBJECT, "GtkWidget",
-                                           &widget_info, G_TYPE_FLAG_ABSTRACT);
+      widget_type = g_type_register_static (G_TYPE_INITIALLY_UNOWNED, "GtkWidget",
+                                            &widget_info, G_TYPE_FLAG_ABSTRACT);
 
       g_type_add_interface_static (widget_type, ATK_TYPE_IMPLEMENTOR,
                                    &accessibility_info) ;
       g_type_add_interface_static (widget_type, GTK_TYPE_BUILDABLE,
                                    &buildable_info) ;
-      g_type_add_interface_static (widget_type, GTK_TYPE_EXTENDED_LAYOUT,
-                                   &layout_info) ;
     }
 
   return widget_type;
@@ -457,12 +566,37 @@ child_property_notify_dispatcher (GObject     *object,
   GTK_WIDGET_GET_CLASS (object)->dispatch_child_properties_changed (GTK_WIDGET (object), n_pspecs, pspecs);
 }
 
+/* We guard against the draw signal callbacks modifying the state of the
+ * cairo context by surounding it with save/restore.
+ * Maybe we should also cairo_new_path() just to be sure?
+ */
+static void
+gtk_widget_draw_marshaller (GClosure     *closure,
+                            GValue       *return_value,
+                            guint         n_param_values,
+                            const GValue *param_values,
+                            gpointer      invocation_hint,
+                            gpointer      marshal_data)
+{
+  cairo_t *cr = g_value_get_boxed (&param_values[1]);
+
+  cairo_save (cr);
+
+  _gtk_marshal_BOOLEAN__BOXED (closure,
+                               return_value,
+                               n_param_values,
+                               param_values,
+                               invocation_hint,
+                               marshal_data);
+
+  cairo_restore (cr);
+}
+
 static void
 gtk_widget_class_init (GtkWidgetClass *klass)
 {
   static GObjectNotifyContext cpn_context = { 0, NULL, NULL };
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-  GtkObjectClass *object_class = GTK_OBJECT_CLASS (klass);
   GtkBindingSet *binding_set;
 
   gtk_widget_parent_class = g_type_class_peek_parent (klass);
@@ -472,12 +606,12 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   quark_accel_path = g_quark_from_static_string ("gtk-accel-path");
   quark_accel_closures = g_quark_from_static_string ("gtk-accel-closures");
   quark_event_mask = g_quark_from_static_string ("gtk-event-mask");
+  quark_device_event_mask = g_quark_from_static_string ("gtk-device-event-mask");
   quark_extension_event_mode = g_quark_from_static_string ("gtk-extension-event-mode");
   quark_parent_window = g_quark_from_static_string ("gtk-parent-window");
   quark_pointer_window = g_quark_from_static_string ("gtk-pointer-window");
   quark_shape_info = g_quark_from_static_string ("gtk-shape-info");
   quark_input_shape_info = g_quark_from_static_string ("gtk-input-shape-info");
-  quark_colormap = g_quark_from_static_string ("gtk-colormap");
   quark_pango_context = g_quark_from_static_string ("gtk-pango-context");
   quark_rc_style = g_quark_from_static_string ("gtk-rc-style");
   quark_accessible_object = g_quark_from_static_string ("gtk-accessible-object");
@@ -497,8 +631,8 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   gobject_class->set_property = gtk_widget_set_property;
   gobject_class->get_property = gtk_widget_get_property;
 
-  object_class->destroy = gtk_widget_real_destroy;
-  
+  klass->destroy = gtk_widget_real_destroy;
+
   klass->activate_signal = 0;
   klass->set_scroll_adjustments_signal = 0;
   klass->dispatch_child_properties_changed = gtk_widget_dispatch_child_properties_changed;
@@ -512,6 +646,10 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   klass->unrealize = gtk_widget_real_unrealize;
   klass->size_request = gtk_widget_real_size_request;
   klass->size_allocate = gtk_widget_real_size_allocate;
+  klass->get_preferred_width = gtk_widget_real_get_width;
+  klass->get_preferred_height = gtk_widget_real_get_height;
+  klass->get_preferred_width_for_height = gtk_widget_real_get_width_for_height;
+  klass->get_preferred_height_for_width = gtk_widget_real_get_height_for_width;  
   klass->state_changed = NULL;
   klass->parent_set = NULL;
   klass->hierarchy_changed = NULL;
@@ -519,6 +657,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   klass->direction_changed = gtk_widget_real_direction_changed;
   klass->grab_notify = NULL;
   klass->child_notify = NULL;
+  klass->draw = NULL;
   klass->mnemonic_activate = gtk_widget_real_mnemonic_activate;
   klass->grab_focus = gtk_widget_real_grab_focus;
   klass->focus = gtk_widget_real_focus;
@@ -528,7 +667,6 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   klass->motion_notify_event = NULL;
   klass->delete_event = NULL;
   klass->destroy_event = NULL;
-  klass->expose_event = NULL;
   klass->key_press_event = gtk_widget_real_key_press_event;
   klass->key_release_event = gtk_widget_real_key_release_event;
   klass->enter_notify_event = NULL;
@@ -540,7 +678,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   klass->unmap_event = NULL;
   klass->window_state_event = NULL;
   klass->property_notify_event = _gtk_selection_property_notify;
-  klass->selection_clear_event = gtk_selection_clear;
+  klass->selection_clear_event = _gtk_selection_clear;
   klass->selection_request_event = _gtk_selection_request;
   klass->selection_notify_event = _gtk_selection_notify;
   klass->selection_received = NULL;
@@ -565,6 +703,9 @@ gtk_widget_class_init (GtkWidgetClass *klass)
 
   klass->no_expose_event = NULL;
 
+  klass->adjust_size_request = gtk_widget_real_adjust_size_request;
+  klass->adjust_size_allocation = gtk_widget_real_adjust_size_allocation;
+
   g_object_class_install_property (gobject_class,
                                   PROP_NAME,
                                   g_param_spec_string ("name",
@@ -782,7 +923,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   /**
    * GtkWidget:double-buffered
    *
-   * Whether or not the widget is double buffered.
+   * Whether the widget is double buffered.
    *
    * Since: 2.18
    */
@@ -790,10 +931,161 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                                    PROP_DOUBLE_BUFFERED,
                                    g_param_spec_boolean ("double-buffered",
                                                          P_("Double Buffered"),
-                                                         P_("Whether or not the widget is double buffered"),
+                                                         P_("Whether the widget is double buffered"),
                                                          TRUE,
                                                          GTK_PARAM_READWRITE));
 
+  /**
+   * GtkWidget:halign:
+   *
+   * How to distribute horizontal space if widget gets extra space, see #GtkAlign
+   *
+   * Since: 3.0
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_HALIGN,
+                                   g_param_spec_enum ("halign",
+                                                      P_("Horizontal Alignment"),
+                                                      P_("How to position in extra horizontal space"),
+                                                      GTK_TYPE_ALIGN,
+                                                      GTK_ALIGN_FILL,
+                                                      GTK_PARAM_READWRITE));
+
+  /**
+   * GtkWidget:valign:
+   *
+   * How to distribute vertical space if widget gets extra space, see #GtkAlign
+   *
+   * Since: 3.0
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_VALIGN,
+                                   g_param_spec_enum ("valign",
+                                                      P_("Vertical Alignment"),
+                                                      P_("How to position in extra vertical space"),
+                                                      GTK_TYPE_ALIGN,
+                                                      GTK_ALIGN_FILL,
+                                                      GTK_PARAM_READWRITE));
+
+  /**
+   * GtkWidget:margin-left
+   *
+   * Margin on left side of widget.
+   *
+   * This property adds margin outside of the widget's normal size
+   * request, the margin will be added in addition to the size from
+   * gtk_widget_set_size_request() for example.
+   *
+   * Since: 3.0
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_MARGIN_LEFT,
+                                   g_param_spec_int ("margin-left",
+                                                     P_("Margin on Left"),
+                                                     P_("Pixels of extra space on the left side"),
+                                                     0,
+                                                     G_MAXINT16,
+                                                     0,
+                                                     GTK_PARAM_READWRITE));
+
+  /**
+   * GtkWidget:margin-right
+   *
+   * Margin on right side of widget.
+   *
+   * This property adds margin outside of the widget's normal size
+   * request, the margin will be added in addition to the size from
+   * gtk_widget_set_size_request() for example.
+   *
+   * Since: 3.0
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_MARGIN_RIGHT,
+                                   g_param_spec_int ("margin-right",
+                                                     P_("Margin on Right"),
+                                                     P_("Pixels of extra space on the right side"),
+                                                     0,
+                                                     G_MAXINT16,
+                                                     0,
+                                                     GTK_PARAM_READWRITE));
+
+  /**
+   * GtkWidget:margin-top
+   *
+   * Margin on top side of widget.
+   *
+   * This property adds margin outside of the widget's normal size
+   * request, the margin will be added in addition to the size from
+   * gtk_widget_set_size_request() for example.
+   *
+   * Since: 3.0
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_MARGIN_TOP,
+                                   g_param_spec_int ("margin-top",
+                                                     P_("Margin on Top"),
+                                                     P_("Pixels of extra space on the top side"),
+                                                     0,
+                                                     G_MAXINT16,
+                                                     0,
+                                                     GTK_PARAM_READWRITE));
+
+  /**
+   * GtkWidget:margin-bottom
+   *
+   * Margin on bottom side of widget.
+   *
+   * This property adds margin outside of the widget's normal size
+   * request, the margin will be added in addition to the size from
+   * gtk_widget_set_size_request() for example.
+   *
+   * Since: 3.0
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_MARGIN_BOTTOM,
+                                   g_param_spec_int ("margin-bottom",
+                                                     P_("Margin on Bottom"),
+                                                     P_("Pixels of extra space on the bottom side"),
+                                                     0,
+                                                     G_MAXINT16,
+                                                     0,
+                                                     GTK_PARAM_READWRITE));
+
+  /**
+   * GtkWidget:margin
+   *
+   * Sets all four sides' margin at once. If read, returns max
+   * margin on any side.
+   *
+   * Since: 3.0
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_MARGIN,
+                                   g_param_spec_int ("margin",
+                                                     P_("All Margins"),
+                                                     P_("Pixels of extra space on all four sides"),
+                                                     0,
+                                                     G_MAXINT16,
+                                                     0,
+                                                     GTK_PARAM_READWRITE));
+
+  /**
+   * GtkWidget::destroy:
+   * @object: the object which received the signal
+   *
+   * Signals that all holders of a reference to the widget should release
+   * the reference that they hold. May result in finalization of the widget
+   * if all references are released.
+   */
+  widget_signals[DESTROY] =
+    g_signal_new (I_("destroy"),
+                  G_TYPE_FROM_CLASS (gobject_class),
+                  G_SIGNAL_RUN_CLEANUP | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
+                  G_STRUCT_OFFSET (GtkWidgetClass, destroy),
+                  NULL, NULL,
+                  _gtk_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
   /**
    * GtkWidget::show:
    * @widget: the object which received the signal.
@@ -980,14 +1272,15 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  _gtk_marshal_VOID__OBJECT,
                  G_TYPE_NONE, 1,
                  GTK_TYPE_STYLE);
-/**
- * GtkWidget::direction-changed:
- * @widget: the object on which the signal is emitted
- * @previous_direction: the previous text direction of @widget
- *
- * The ::direction-changed signal is emitted when the text direction
- * of a widget changes.
- */
+
+  /**
+   * GtkWidget::direction-changed:
+   * @widget: the object on which the signal is emitted
+   * @previous_direction: the previous text direction of @widget
+   *
+   * The ::direction-changed signal is emitted when the text direction
+   * of a widget changes.
+   */
   widget_signals[DIRECTION_CHANGED] =
     g_signal_new (I_("direction-changed"),
                  G_TYPE_FROM_CLASS (gobject_class),
@@ -1023,15 +1316,15 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  G_TYPE_NONE, 1,
                  G_TYPE_BOOLEAN);
 
-/**
- * GtkWidget::child-notify:
- * @widget: the object which received the signal
- * @pspec: the #GParamSpec of the changed child property
- *
- * The ::child-notify signal is emitted for each 
- * <link linkend="child-properties">child property</link>  that has
- * changed on an object. The signal's detail holds the property name. 
- */
+  /**
  * GtkWidget::child-notify:
  * @widget: the object which received the signal
  * @pspec: the #GParamSpec of the changed child property
  *
  * The ::child-notify signal is emitted for each 
  * <link linkend="child-properties">child property</link>  that has
  * changed on an object. The signal's detail holds the property name. 
  */
   widget_signals[CHILD_NOTIFY] =
     g_signal_new (I_("child-notify"),
                   G_TYPE_FROM_CLASS (gobject_class),
@@ -1042,6 +1335,32 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                   G_TYPE_NONE, 1,
                   G_TYPE_PARAM);
 
+  /**
+   * GtkWidget::draw:
+   * @widget: the object which received the signal
+   * @cr: the cairo context to draw to
+   * @width: width of the widget
+   * @height: height of the widget
+   *
+   * This signal is emitted when a widget is supposed to render itself.
+   * The @widget's top left corner must be painted at the origin of
+   * the passed in context and be sized in the given @width and @height.
+   *
+   * Signal handlers connected to this signal can modify the cairo
+   * context passed as @cr in any way they like and don't need to
+   * restore it. The signal emission takes care of calling cairo_save()
+   * before and cairo_restore() after invoking the handler.
+   */
+  widget_signals[DRAW] =
+    g_signal_new (I_("draw"),
+                  G_TYPE_FROM_CLASS (gobject_class),
+                  G_SIGNAL_RUN_LAST,
+                  G_STRUCT_OFFSET (GtkWidgetClass, draw),
+                   _gtk_boolean_handled_accumulator, NULL,
+                   gtk_widget_draw_marshaller,
+                  G_TYPE_BOOLEAN, 1,
+                  CAIRO_GOBJECT_TYPE_CONTEXT);
+
   /**
    * GtkWidget::mnemonic-activate:
    * @widget: the object which received the signal.
@@ -1079,7 +1398,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[FOCUS] =
     g_signal_new (I_("focus"),
-                 G_TYPE_FROM_CLASS (object_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, focus),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1094,7 +1413,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[MOVE_FOCUS] =
     g_signal_new_class_handler (I_("move-focus"),
-                                G_TYPE_FROM_CLASS (object_class),
+                                G_TYPE_FROM_CLASS (klass),
                                 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                                 G_CALLBACK (gtk_widget_real_move_focus),
                                 NULL, NULL,
@@ -1102,6 +1421,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                                 G_TYPE_NONE,
                                 1,
                                 GTK_TYPE_DIRECTION_TYPE);
+
   /**
    * GtkWidget::event:
    * @widget: the object which received the signal.
@@ -1121,7 +1441,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[EVENT] =
     g_signal_new (I_("event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1141,7 +1461,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[EVENT_AFTER] =
     g_signal_new (I_("event-after"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  0,
                  0,
                  NULL, NULL,
@@ -1152,7 +1472,8 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   /**
    * GtkWidget::button-press-event:
    * @widget: the object which received the signal.
-   * @event: the #GdkEventButton which triggered this signal
+   * @event: (type Gdk.EventButton): the #GdkEventButton which triggered
+   *   this signal.
    *
    * The ::button-press-event signal will be emitted when a button
    * (typically from a mouse) is pressed.
@@ -1167,7 +1488,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[BUTTON_PRESS_EVENT] =
     g_signal_new (I_("button-press-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, button_press_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1178,7 +1499,8 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   /**
    * GtkWidget::button-release-event:
    * @widget: the object which received the signal.
-   * @event: the #GdkEventButton which triggered this signal
+   * @event: (type Gdk.EventButton): the #GdkEventButton which triggered
+   *   this signal.
    *
    * The ::button-release-event signal will be emitted when a button
    * (typically from a mouse) is released.
@@ -1193,7 +1515,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[BUTTON_RELEASE_EVENT] =
     g_signal_new (I_("button-release-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, button_release_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1204,7 +1526,8 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   /**
    * GtkWidget::scroll-event:
    * @widget: the object which received the signal.
-   * @event: the #GdkEventScroll which triggered this signal
+   * @event: (type Gdk.EventScroll): the #GdkEventScroll which triggered
+   *   this signal.
    *
    * The ::scroll-event signal is emitted when a button in the 4 to 7
    * range is pressed. Wheel mice are usually configured to generate 
@@ -1220,17 +1543,19 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[SCROLL_EVENT] =
     g_signal_new (I_("scroll-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, scroll_event),
                  _gtk_boolean_handled_accumulator, NULL,
                  _gtk_marshal_BOOLEAN__BOXED,
                  G_TYPE_BOOLEAN, 1,
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
+
   /**
    * GtkWidget::motion-notify-event:
    * @widget: the object which received the signal.
-   * @event: the #GdkEventMotion which triggered this signal
+   * @event: (type Gdk.EventMotion): the #GdkEventMotion which triggered
+   *   this signal.
    *
    * The ::motion-notify-event signal is emitted when the pointer moves 
    * over the widget's #GdkWindow.
@@ -1245,7 +1570,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[MOTION_NOTIFY_EVENT] =
     g_signal_new (I_("motion-notify-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, motion_notify_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1263,7 +1588,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[COMPOSITED_CHANGED] =
     g_signal_new (I_("composited-changed"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (GtkWidgetClass, composited_changed),
                  NULL, NULL,
@@ -1286,7 +1611,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    **/
   widget_signals[KEYNAV_FAILED] =
     g_signal_new_class_handler (I_("keynav-failed"),
-                                G_TYPE_FROM_CLASS (gobject_class),
+                                G_TYPE_FROM_CLASS (klass),
                                 G_SIGNAL_RUN_LAST,
                                 G_CALLBACK (gtk_widget_real_keynav_failed),
                                 _gtk_boolean_handled_accumulator, NULL,
@@ -1310,7 +1635,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[DELETE_EVENT] =
     g_signal_new (I_("delete-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, delete_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1337,7 +1662,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[DESTROY_EVENT] =
     g_signal_new (I_("destroy-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, destroy_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1345,36 +1670,10 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  G_TYPE_BOOLEAN, 1,
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
 
-  /**
-   * GtkWidget::expose-event:
-   * @widget: the object which received the signal.
-   * @event: the #GdkEventExpose which triggered this signal
-   *
-   * The ::expose-event signal is emitted when an area of a previously
-   * obscured #GdkWindow is made visible and needs to be redrawn.
-   * #GTK_NO_WINDOW widgets will get a synthesized event from their parent 
-   * widget.
-   *
-   * To receive this signal, the #GdkWindow associated to the widget needs
-   * to enable the #GDK_EXPOSURE_MASK mask.
-   * 
-   * Returns: %TRUE to stop other handlers from being invoked for the event. 
-   *   %FALSE to propagate the event further.
-   */
-  widget_signals[EXPOSE_EVENT] =
-    g_signal_new (I_("expose-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
-                 G_SIGNAL_RUN_LAST,
-                 G_STRUCT_OFFSET (GtkWidgetClass, expose_event),
-                 _gtk_boolean_handled_accumulator, NULL,
-                 _gtk_marshal_BOOLEAN__BOXED,
-                 G_TYPE_BOOLEAN, 1,
-                 GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
-
   /**
    * GtkWidget::key-press-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventKey which triggered this signal
+   * @event: (type Gdk.EventKey): the #GdkEventKey which triggered this signal.
    *
    * The ::key-press-event signal is emitted when a key is pressed.
    *
@@ -1388,7 +1687,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[KEY_PRESS_EVENT] =
     g_signal_new (I_("key-press-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, key_press_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1399,7 +1698,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   /**
    * GtkWidget::key-release-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventKey which triggered this signal
+   * @event: (type Gdk.EventKey): the #GdkEventKey which triggered this signal.
    *
    * The ::key-release-event signal is emitted when a key is pressed.
    *
@@ -1413,7 +1712,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[KEY_RELEASE_EVENT] =
     g_signal_new (I_("key-release-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, key_release_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1424,7 +1723,8 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   /**
    * GtkWidget::enter-notify-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventCrossing which triggered this signal
+   * @event: (type Gdk.EventCrossing): the #GdkEventCrossing which triggered
+   *   this signal.
    *
    * The ::enter-notify-event will be emitted when the pointer enters
    * the @widget's window.
@@ -1439,7 +1739,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[ENTER_NOTIFY_EVENT] =
     g_signal_new (I_("enter-notify-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, enter_notify_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1450,7 +1750,8 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   /**
    * GtkWidget::leave-notify-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventCrossing which triggered this signal
+   * @event: (type Gdk.EventCrossing): the #GdkEventCrossing which triggered
+   *   this signal.
    *
    * The ::leave-notify-event will be emitted when the pointer leaves
    * the @widget's window.
@@ -1465,7 +1766,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[LEAVE_NOTIFY_EVENT] =
     g_signal_new (I_("leave-notify-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, leave_notify_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1474,9 +1775,10 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
 
   /**
-   * GtkWidget::configure-event
+   * GtkWidget::configure-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventConfigure which triggered this signal
+   * @event: (type Gdk.EventConfigure): the #GdkEventConfigure which triggered
+   *   this signal.
    *
    * The ::configure-event signal will be emitted when the size, position or
    * stacking of the @widget's window has changed.
@@ -1490,7 +1792,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[CONFIGURE_EVENT] =
     g_signal_new (I_("configure-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, configure_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1499,9 +1801,10 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
 
   /**
-   * GtkWidget::focus-in-event
+   * GtkWidget::focus-in-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventFocus which triggered this signal
+   * @event: (type Gdk.EventFocus): the #GdkEventFocus which triggered
+   *   this signal.
    *
    * The ::focus-in-event signal will be emitted when the keyboard focus
    * enters the @widget's window.
@@ -1514,7 +1817,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[FOCUS_IN_EVENT] =
     g_signal_new (I_("focus-in-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, focus_in_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1523,9 +1826,10 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
 
   /**
-   * GtkWidget::focus-out-event
+   * GtkWidget::focus-out-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventFocus which triggered this signal
+   * @event: (type Gdk.EventFocus): the #GdkEventFocus which triggered this
+   *   signal.
    *
    * The ::focus-out-event signal will be emitted when the keyboard focus
    * leaves the @widget's window.
@@ -1538,7 +1842,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[FOCUS_OUT_EVENT] =
     g_signal_new (I_("focus-out-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, focus_out_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1547,9 +1851,9 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
 
   /**
-   * GtkWidget::map-event
+   * GtkWidget::map-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventAny which triggered this signal
+   * @event: (type Gdk.EventAny): the #GdkEventAny which triggered this signal.
    *
    * The ::map-event signal will be emitted when the @widget's window is
    * mapped. A window is mapped when it becomes visible on the screen.
@@ -1563,7 +1867,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[MAP_EVENT] =
     g_signal_new (I_("map-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, map_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1572,13 +1876,17 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
 
   /**
-   * GtkWidget::unmap-event
+   * GtkWidget::unmap-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventAny which triggered this signal
+   * @event: (type Gdk.EventAny): the #GdkEventAny which triggered this signal
    *
-   * The ::unmap-event signal will be emitted when the @widget's window is
+   * The ::unmap-event signal may be emitted when the @widget's window is
    * unmapped. A window is unmapped when it becomes invisible on the screen.
    *
+   * For performance reasons GTK+ may not emit ::unmap-event, so one
+   * should always also implement ::unrealize in order to release
+   * resources and disconnect signal handlers.
+   *
    * To receive this signal, the #GdkWindow associated to the widget needs
    * to enable the #GDK_STRUCTURE_MASK mask. GDK will enable this mask
    * automatically for all new windows.
@@ -1588,7 +1896,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[UNMAP_EVENT] =
     g_signal_new (I_("unmap-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, unmap_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1597,9 +1905,10 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
 
   /**
-   * GtkWidget::property-notify-event
+   * GtkWidget::property-notify-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventProperty which triggered this signal
+   * @event: (type Gdk.EventProperty): the #GdkEventProperty which triggered
+   *   this signal.
    *
    * The ::property-notify-event signal will be emitted when a property on
    * the @widget's window has been changed or deleted.
@@ -1612,7 +1921,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[PROPERTY_NOTIFY_EVENT] =
     g_signal_new (I_("property-notify-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, property_notify_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1621,9 +1930,10 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
 
   /**
-   * GtkWidget::selection-clear-event
+   * GtkWidget::selection-clear-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventSelection which triggered this signal
+   * @event: (type Gdk.EventSelection): the #GdkEventSelection which triggered
+   *   this signal.
    *
    * The ::selection-clear-event signal will be emitted when the
    * the @widget's window has lost ownership of a selection.
@@ -1633,7 +1943,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[SELECTION_CLEAR_EVENT] =
     g_signal_new (I_("selection-clear-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, selection_clear_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1642,9 +1952,10 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
 
   /**
-   * GtkWidget::selection-request-event
+   * GtkWidget::selection-request-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventSelection which triggered this signal
+   * @event: (type Gdk.EventSelection): the #GdkEventSelection which triggered
+   *   this signal.
    *
    * The ::selection-request-event signal will be emitted when
    * another client requests ownership of the selection owned by
@@ -1655,7 +1966,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[SELECTION_REQUEST_EVENT] =
     g_signal_new (I_("selection-request-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, selection_request_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1672,7 +1983,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[SELECTION_NOTIFY_EVENT] =
     g_signal_new (I_("selection-notify-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, selection_notify_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1688,7 +1999,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[SELECTION_RECEIVED] =
     g_signal_new (I_("selection-received"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, selection_received),
                  NULL, NULL,
@@ -1706,7 +2017,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[SELECTION_GET] =
     g_signal_new (I_("selection-get"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, selection_get),
                  NULL, NULL,
@@ -1717,9 +2028,10 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  G_TYPE_UINT);
 
   /**
-   * GtkWidget::proximity-in-event
+   * GtkWidget::proximity-in-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventProximity which triggered this signal
+   * @event: (type Gdk.EventProximity): the #GdkEventProximity which triggered
+   *   this signal.
    *
    * To receive this signal the #GdkWindow associated to the widget needs
    * to enable the #GDK_PROXIMITY_IN_MASK mask.
@@ -1731,7 +2043,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[PROXIMITY_IN_EVENT] =
     g_signal_new (I_("proximity-in-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, proximity_in_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1740,9 +2052,10 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
 
   /**
-   * GtkWidget::proximity-out-event
+   * GtkWidget::proximity-out-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventProximity which triggered this signal
+   * @event: (type Gdk.EventProximity): the #GdkEventProximity which triggered
+   *   this signal.
    *
    * To receive this signal the #GdkWindow associated to the widget needs
    * to enable the #GDK_PROXIMITY_OUT_MASK mask.
@@ -1754,7 +2067,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[PROXIMITY_OUT_EVENT] =
     g_signal_new (I_("proximity-out-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, proximity_out_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -1775,7 +2088,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[DRAG_LEAVE] =
     g_signal_new (I_("drag-leave"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, drag_leave),
                  NULL, NULL,
@@ -1799,7 +2112,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[DRAG_BEGIN] =
     g_signal_new (I_("drag-begin"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, drag_begin),
                  NULL, NULL,
@@ -1818,7 +2131,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[DRAG_END] =
     g_signal_new (I_("drag-end"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, drag_end),
                  NULL, NULL,
@@ -1838,7 +2151,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[DRAG_DATA_DELETE] =
     g_signal_new (I_("drag-data-delete"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, drag_data_delete),
                  NULL, NULL,
@@ -1864,7 +2177,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[DRAG_FAILED] =
     g_signal_new (I_("drag-failed"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  0, _gtk_boolean_handled_accumulator, NULL,
                  _gtk_marshal_BOOLEAN__OBJECT_ENUM,
@@ -1967,7 +2280,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[DRAG_MOTION] =
     g_signal_new (I_("drag-motion"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, drag_motion),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -2000,7 +2313,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[DRAG_DROP] =
     g_signal_new (I_("drag-drop"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, drag_drop),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -2028,7 +2341,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[DRAG_DATA_GET] =
     g_signal_new (I_("drag-data-get"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, drag_data_get),
                  NULL, NULL,
@@ -2105,7 +2418,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[DRAG_DATA_RECEIVED] =
     g_signal_new (I_("drag-data-received"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, drag_data_received),
                  NULL, NULL,
@@ -2121,7 +2434,8 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   /**
    * GtkWidget::visibility-notify-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventVisibility which triggered this signal
+   * @event: (type Gdk.EventVisibility): the #GdkEventVisibility which
+   *   triggered this signal.
    *
    * The ::visibility-notify-event will be emitted when the @widget's window
    * is obscured or unobscured.
@@ -2134,7 +2448,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[VISIBILITY_NOTIFY_EVENT] =
     g_signal_new (I_("visibility-notify-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, visibility_notify_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -2145,7 +2459,8 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   /**
    * GtkWidget::client-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventClient which triggered this signal
+   * @event: (type Gdk.EventClient): the #GdkEventClient which triggered
+   *   this signal.
    *
    * The ::client-event will be emitted when the @widget's window
    * receives a message (via a ClientMessage event) from another
@@ -2156,7 +2471,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[CLIENT_EVENT] =
     g_signal_new (I_("client-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, client_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -2167,20 +2482,20 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   /**
    * GtkWidget::no-expose-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventNoExpose which triggered this signal
+   * @event: (type Gdk.EventNoExpose): the #GdkEventNoExpose which triggered
+   *   this signal.
    *
    * The ::no-expose-event will be emitted when the @widget's window is 
-   * drawn as a copy of another #GdkDrawable (with gdk_draw_drawable() or
-   * gdk_window_copy_area()) which was completely unobscured. If the source
-   * window was partially obscured #GdkEventExpose events will be generated
-   * for those areas.
+   * drawn as a copy of another #GdkDrawable which was completely unobscured.
+   * If the source window was partially obscured #GdkEventExpose events will
+   * be generated for those areas.
    *
    * Returns: %TRUE to stop other handlers from being invoked for the event. 
    *   %FALSE to propagate the event further.
    */
   widget_signals[NO_EXPOSE_EVENT] =
     g_signal_new (I_("no-expose-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, no_expose_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -2191,7 +2506,8 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   /**
    * GtkWidget::window-state-event:
    * @widget: the object which received the signal
-   * @event: the #GdkEventWindowState which triggered this signal
+   * @event: (type Gdk.EventWindowState): the #GdkEventWindowState which
+   *   triggered this signal.
    *
    * The ::window-state-event will be emitted when the state of the 
    * toplevel window associated to the @widget changes.
@@ -2205,7 +2521,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[WINDOW_STATE_EVENT] =
     g_signal_new (I_("window-state-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, window_state_event),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -2229,13 +2545,14 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[DAMAGE_EVENT] =
     g_signal_new (I_("damage-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                   0,
                  _gtk_boolean_handled_accumulator, NULL,
                  _gtk_marshal_BOOLEAN__BOXED,
                  G_TYPE_BOOLEAN, 1,
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
+
 /**
    * GtkWidget::grab-broken-event:
    * @widget: the object which received the signal
@@ -2255,13 +2572,14 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[GRAB_BROKEN] =
     g_signal_new (I_("grab-broken-event"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, grab_broken_event),
                  _gtk_boolean_handled_accumulator, NULL,
                  _gtk_marshal_BOOLEAN__BOXED,
                  G_TYPE_BOOLEAN, 1,
                  GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
+
   /**
    * GtkWidget::query-tooltip:
    * @widget: the object which received the signal
@@ -2291,7 +2609,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[QUERY_TOOLTIP] =
     g_signal_new (I_("query-tooltip"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, query_tooltip),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -2317,7 +2635,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[POPUP_MENU] =
     g_signal_new (I_("popup-menu"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (GtkWidgetClass, popup_menu),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -2331,7 +2649,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[SHOW_HELP] =
     g_signal_new (I_("show-help"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                  G_STRUCT_OFFSET (GtkWidgetClass, show_help),
                  _gtk_boolean_handled_accumulator, NULL,
@@ -2345,7 +2663,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[ACCEL_CLOSURES_CHANGED] =
     g_signal_new (I_("accel-closures-changed"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  0,
                  0,
                  NULL, NULL,
@@ -2363,7 +2681,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[SCREEN_CHANGED] =
     g_signal_new (I_("screen-changed"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, screen_changed),
                  NULL, NULL,
@@ -2386,7 +2704,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
    */
   widget_signals[CAN_ACTIVATE_ACCEL] =
      g_signal_new (I_("can-activate-accel"),
-                 G_TYPE_FROM_CLASS (gobject_class),
+                 G_TYPE_FROM_CLASS (klass),
                  G_SIGNAL_RUN_LAST,
                  G_STRUCT_OFFSET (GtkWidgetClass, can_activate_accel),
                   _gtk_boolean_handled_accumulator, NULL,
@@ -2394,24 +2712,24 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                   G_TYPE_BOOLEAN, 1, G_TYPE_UINT);
 
   binding_set = gtk_binding_set_by_class (klass);
-  gtk_binding_entry_add_signal (binding_set, GDK_F10, GDK_SHIFT_MASK,
+  gtk_binding_entry_add_signal (binding_set, GDK_KEY_F10, GDK_SHIFT_MASK,
                                 "popup-menu", 0);
-  gtk_binding_entry_add_signal (binding_set, GDK_Menu, 0,
+  gtk_binding_entry_add_signal (binding_set, GDK_KEY_Menu, 0,
                                 "popup-menu", 0);  
 
-  gtk_binding_entry_add_signal (binding_set, GDK_F1, GDK_CONTROL_MASK,
+  gtk_binding_entry_add_signal (binding_set, GDK_KEY_F1, GDK_CONTROL_MASK,
                                 "show-help", 1,
                                 GTK_TYPE_WIDGET_HELP_TYPE,
                                 GTK_WIDGET_HELP_TOOLTIP);
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_F1, GDK_CONTROL_MASK,
+  gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_F1, GDK_CONTROL_MASK,
                                 "show-help", 1,
                                 GTK_TYPE_WIDGET_HELP_TYPE,
                                 GTK_WIDGET_HELP_TOOLTIP);
-  gtk_binding_entry_add_signal (binding_set, GDK_F1, GDK_SHIFT_MASK,
+  gtk_binding_entry_add_signal (binding_set, GDK_KEY_F1, GDK_SHIFT_MASK,
                                 "show-help", 1,
                                 GTK_TYPE_WIDGET_HELP_TYPE,
                                 GTK_WIDGET_HELP_WHATS_THIS);  
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_F1, GDK_SHIFT_MASK,
+  gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_F1, GDK_SHIFT_MASK,
                                 "show-help", 1,
                                 GTK_TYPE_WIDGET_HELP_TYPE,
                                 GTK_WIDGET_HELP_WHATS_THIS);
@@ -2461,20 +2779,12 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                                                               0.0, 1.0, 0.04,
                                                               GTK_PARAM_READABLE));
 
-  /**
-   * GtkWidget:draw-border:
-   *
-   * The "draw-border" style property defines the size of areas outside 
-   * the widget's allocation to draw.
-   *
-   * Since: 2.8
-   */
   gtk_widget_class_install_style_property (klass,
-                                          g_param_spec_boxed ("draw-border",
-                                                              P_("Draw Border"),
-                                                              P_("Size of areas outside the widget's allocation to draw"),
-                                                              GTK_TYPE_BORDER,
-                                                              GTK_PARAM_READABLE));
+                                           g_param_spec_boolean ("window-dragging",
+                                                                 P_("Window dragging"),
+                                                                 P_("Whether windows can be dragged by clicking on empty areas"),
+                                                                 FALSE,
+                                                                 GTK_PARAM_READABLE));
 
   /**
    * GtkWidget:link-color:
@@ -2578,6 +2888,8 @@ gtk_widget_class_init (GtkWidgetClass *klass)
                                                              P_("The length of vertical scroll arrows"),
                                                              1, G_MAXINT, 16,
                                                              GTK_PARAM_READABLE));
+
+  g_type_class_add_private (klass, sizeof (GtkWidgetPrivate));
 }
 
 static void
@@ -2715,6 +3027,32 @@ gtk_widget_set_property (GObject         *object,
     case PROP_DOUBLE_BUFFERED:
       gtk_widget_set_double_buffered (widget, g_value_get_boolean (value));
       break;
+    case PROP_HALIGN:
+      gtk_widget_set_halign (widget, g_value_get_enum (value));
+      break;
+    case PROP_VALIGN:
+      gtk_widget_set_valign (widget, g_value_get_enum (value));
+      break;
+    case PROP_MARGIN_LEFT:
+      gtk_widget_set_margin_left (widget, g_value_get_int (value));
+      break;
+    case PROP_MARGIN_RIGHT:
+      gtk_widget_set_margin_right (widget, g_value_get_int (value));
+      break;
+    case PROP_MARGIN_TOP:
+      gtk_widget_set_margin_top (widget, g_value_get_int (value));
+      break;
+    case PROP_MARGIN_BOTTOM:
+      gtk_widget_set_margin_bottom (widget, g_value_get_int (value));
+      break;
+    case PROP_MARGIN:
+      g_object_freeze_notify (G_OBJECT (widget));
+      gtk_widget_set_margin_left (widget, g_value_get_int (value));
+      gtk_widget_set_margin_right (widget, g_value_get_int (value));
+      gtk_widget_set_margin_top (widget, g_value_get_int (value));
+      gtk_widget_set_margin_bottom (widget, g_value_get_int (value));
+      g_object_thaw_notify (G_OBJECT (widget));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -2728,20 +3066,21 @@ gtk_widget_get_property (GObject         *object,
                         GParamSpec      *pspec)
 {
   GtkWidget *widget = GTK_WIDGET (object);
-  
+  GtkWidgetPrivate *priv = widget->priv;
+
   switch (prop_id)
     {
       gpointer *eventp;
       gpointer *modep;
 
     case PROP_NAME:
-      if (widget->name)
-       g_value_set_string (value, widget->name);
+      if (priv->name)
+       g_value_set_string (value, priv->name);
       else
        g_value_set_static_string (value, "");
       break;
     case PROP_PARENT:
-      g_value_set_object (value, widget->parent);
+      g_value_set_object (value, priv->parent);
       break;
     case PROP_WIDTH_REQUEST:
       {
@@ -2785,7 +3124,7 @@ gtk_widget_get_property (GObject         *object,
       g_value_set_boolean (value, (gtk_widget_get_receives_default (widget) != FALSE));
       break;
     case PROP_COMPOSITE_CHILD:
-      g_value_set_boolean (value, (GTK_OBJECT_FLAGS (widget) & GTK_COMPOSITE_CHILD) != 0 );
+      g_value_set_boolean (value, widget->priv->composite_child);
       break;
     case PROP_STYLE:
       g_value_set_object (value, gtk_widget_get_style (widget));
@@ -2824,6 +3163,40 @@ gtk_widget_get_property (GObject         *object,
     case PROP_DOUBLE_BUFFERED:
       g_value_set_boolean (value, gtk_widget_get_double_buffered (widget));
       break;
+    case PROP_HALIGN:
+      g_value_set_enum (value, gtk_widget_get_halign (widget));
+      break;
+    case PROP_VALIGN:
+      g_value_set_enum (value, gtk_widget_get_valign (widget));
+      break;
+    case PROP_MARGIN_LEFT:
+      g_value_set_int (value, gtk_widget_get_margin_left (widget));
+      break;
+    case PROP_MARGIN_RIGHT:
+      g_value_set_int (value, gtk_widget_get_margin_right (widget));
+      break;
+    case PROP_MARGIN_TOP:
+      g_value_set_int (value, gtk_widget_get_margin_top (widget));
+      break;
+    case PROP_MARGIN_BOTTOM:
+      g_value_set_int (value, gtk_widget_get_margin_bottom (widget));
+      break;
+    case PROP_MARGIN:
+      {
+        GtkWidgetAuxInfo *aux_info = _gtk_widget_get_aux_info (widget, FALSE);
+        if (aux_info == NULL)
+          {
+            g_value_set_int (value, 0);
+          }
+        else
+          {
+            g_value_set_int (value, MAX (MAX (aux_info->margin.left,
+                                              aux_info->margin.right),
+                                         MAX (aux_info->margin.top,
+                                              aux_info->margin.bottom)));
+          }
+      }
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -2833,32 +3206,35 @@ gtk_widget_get_property (GObject         *object,
 static void
 gtk_widget_init (GtkWidget *widget)
 {
-  GTK_PRIVATE_FLAGS (widget) = PRIVATE_GTK_CHILD_VISIBLE;
-  widget->state = GTK_STATE_NORMAL;
-  widget->saved_state = GTK_STATE_NORMAL;
-  widget->name = NULL;
-  widget->requisition.width = 0;
-  widget->requisition.height = 0;
-  widget->allocation.x = -1;
-  widget->allocation.y = -1;
-  widget->allocation.width = 1;
-  widget->allocation.height = 1;
-  widget->window = NULL;
-  widget->parent = NULL;
+  GtkWidgetPrivate *priv;
+
+  widget->priv = G_TYPE_INSTANCE_GET_PRIVATE (widget,
+                                              GTK_TYPE_WIDGET,
+                                              GtkWidgetPrivate);
+  priv = widget->priv;
 
-  GTK_OBJECT_FLAGS (widget) |= GTK_SENSITIVE;
-  GTK_OBJECT_FLAGS (widget) |= GTK_PARENT_SENSITIVE;
-  GTK_OBJECT_FLAGS (widget) |= composite_child_stack ? GTK_COMPOSITE_CHILD : 0;
-  gtk_widget_set_double_buffered (widget, TRUE);
+  priv->child_visible = TRUE;
+  priv->state = GTK_STATE_NORMAL;
+  priv->saved_state = GTK_STATE_NORMAL;
+  priv->name = NULL;
+  priv->allocation.x = -1;
+  priv->allocation.y = -1;
+  priv->allocation.width = 1;
+  priv->allocation.height = 1;
+  priv->window = NULL;
+  priv->parent = NULL;
 
-  GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_ON_ALLOC);
-  GTK_PRIVATE_SET_FLAG (widget, GTK_REQUEST_NEEDED);
-  GTK_PRIVATE_SET_FLAG (widget, GTK_WIDTH_REQUEST_NEEDED);
-  GTK_PRIVATE_SET_FLAG (widget, GTK_HEIGHT_REQUEST_NEEDED);
-  GTK_PRIVATE_SET_FLAG (widget, GTK_ALLOC_NEEDED);
+  priv->sensitive = TRUE;
+  priv->parent_sensitive = TRUE;
+  priv->composite_child = composite_child_stack != 0;
+  priv->double_buffered = TRUE;
+  priv->redraw_on_alloc = TRUE;
+  priv->width_request_needed = TRUE;
+  priv->height_request_needed = TRUE;
+  priv->alloc_needed = TRUE;
 
-  widget->style = gtk_widget_get_default_style ();
-  g_object_ref (widget->style);
+  priv->style = gtk_widget_get_default_style ();
+  g_object_ref (priv->style);
 }
 
 
@@ -2867,10 +3243,11 @@ gtk_widget_dispatch_child_properties_changed (GtkWidget   *widget,
                                              guint        n_pspecs,
                                              GParamSpec **pspecs)
 {
-  GtkWidget *container = widget->parent;
+  GtkWidgetPrivate *priv = widget->priv;
+  GtkWidget *container = priv->parent;
   guint i;
 
-  for (i = 0; widget->parent == container && i < n_pspecs; i++)
+  for (i = 0; widget->priv->parent == container && i < n_pspecs; i++)
     g_signal_emit (widget, widget_signals[CHILD_NOTIFY], g_quark_from_string (pspecs[i]->name), pspecs[i]);
 }
 
@@ -2913,22 +3290,23 @@ void
 gtk_widget_child_notify (GtkWidget    *widget,
                         const gchar  *child_property)
 {
+  GtkWidgetPrivate *priv = widget->priv;
   GParamSpec *pspec;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (child_property != NULL);
-  if (!G_OBJECT (widget)->ref_count || !widget->parent)
+  if (!G_OBJECT (widget)->ref_count || !priv->parent)
     return;
 
   g_object_ref (widget);
   pspec = g_param_spec_pool_lookup (_gtk_widget_child_property_pool,
                                    child_property,
-                                   G_OBJECT_TYPE (widget->parent),
+                                   G_OBJECT_TYPE (priv->parent),
                                    TRUE);
   if (!pspec)
     g_warning ("%s: container class `%s' has no child property named `%s'",
               G_STRLOC,
-              G_OBJECT_TYPE_NAME (widget->parent),
+              G_OBJECT_TYPE_NAME (priv->parent),
               child_property);
   else
     {
@@ -3002,43 +3380,19 @@ gtk_widget_new (GType        type,
   return widget;
 }
 
-/**
- * gtk_widget_set:
- * @widget: a #GtkWidget
- * @first_property_name: name of first property to set
- * @Varargs: value of first property, followed by more properties, 
- *           %NULL-terminated
- * 
- * Precursor of g_object_set().
- *
- * Deprecated: 2.0: Use g_object_set() instead.
- **/
-void
-gtk_widget_set (GtkWidget   *widget,
-               const gchar *first_property_name,
-               ...)
-{
-  va_list var_args;
-
-  g_return_if_fail (GTK_IS_WIDGET (widget));
-
-  va_start (var_args, first_property_name);
-  g_object_set_valist (G_OBJECT (widget), first_property_name, var_args);
-  va_end (var_args);
-}
-
 static inline void        
 gtk_widget_queue_draw_child (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv = widget->priv;
   GtkWidget *parent;
 
-  parent = widget->parent;
+  parent = priv->parent;
   if (parent && gtk_widget_is_drawable (parent))
     gtk_widget_queue_draw_area (parent,
-                               widget->allocation.x,
-                               widget->allocation.y,
-                               widget->allocation.width,
-                               widget->allocation.height);
+                               priv->allocation.x,
+                               priv->allocation.y,
+                               priv->allocation.width,
+                               priv->allocation.height);
 }
 
 /**
@@ -3052,12 +3406,16 @@ gtk_widget_queue_draw_child (GtkWidget *widget)
 void
 gtk_widget_unparent (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv;
   GObjectNotifyQueue *nqueue;
   GtkWidget *toplevel;
   GtkWidget *old_parent;
   
   g_return_if_fail (GTK_IS_WIDGET (widget));
-  if (widget->parent == NULL)
+
+  priv = widget->priv;
+
+  if (priv->parent == NULL)
     return;
   
   /* keep this function in sync with gtk_menu_detach()
@@ -3070,13 +3428,13 @@ gtk_widget_unparent (GtkWidget *widget)
   if (gtk_widget_is_toplevel (toplevel))
     _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
 
-  if (GTK_CONTAINER (widget->parent)->focus_child == widget)
-    gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), NULL);
+  if (gtk_container_get_focus_child (GTK_CONTAINER (priv->parent)) == widget)
+    gtk_container_set_focus_child (GTK_CONTAINER (priv->parent), NULL);
 
   /* If we are unanchoring the child, we save around the toplevel
    * to emit hierarchy changed
    */
-  if (GTK_WIDGET_ANCHORED (widget->parent))
+  if (priv->parent->priv->anchored)
     g_object_ref (toplevel);
   else
     toplevel = NULL;
@@ -3088,12 +3446,12 @@ gtk_widget_unparent (GtkWidget *widget)
    * allocation is smaller than 1x1 and we actually want a size of 1x1...
    * (would 0x0 be OK here?)
    */
-  widget->allocation.width = 1;
-  widget->allocation.height = 1;
+  priv->allocation.width = 1;
+  priv->allocation.height = 1;
   
   if (gtk_widget_get_realized (widget))
     {
-      if (GTK_WIDGET_IN_REPARENT (widget))
+      if (priv->in_reparent)
        gtk_widget_unmap (widget);
       else
        gtk_widget_unrealize (widget);
@@ -3103,10 +3461,10 @@ gtk_widget_unparent (GtkWidget *widget)
    * flag to the default state, so it doesn't affect the child
    * in the next parent.
    */
-  GTK_PRIVATE_SET_FLAG (widget, GTK_CHILD_VISIBLE);
+  priv->child_visible = TRUE;
     
-  old_parent = widget->parent;
-  widget->parent = NULL;
+  old_parent = priv->parent;
+  priv->parent = NULL;
   gtk_widget_set_parent_window (widget, NULL);
   g_signal_emit (widget, widget_signals[PARENT_SET], 0, old_parent);
   if (toplevel)
@@ -3117,7 +3475,7 @@ gtk_widget_unparent (GtkWidget *widget)
       
   g_object_notify (G_OBJECT (widget), "parent");
   g_object_thaw_notify (G_OBJECT (widget));
-  if (!widget->parent)
+  if (!priv->parent)
     g_object_notify_queue_clear (G_OBJECT (widget), nqueue);
   g_object_notify_queue_thaw (G_OBJECT (widget), nqueue);
   g_object_unref (widget);
@@ -3127,8 +3485,9 @@ gtk_widget_unparent (GtkWidget *widget)
  * gtk_widget_destroy:
  * @widget: a #GtkWidget
  *
- * Destroys a widget. Equivalent to gtk_object_destroy(), except that
- * you don't have to cast the widget to #GtkObject. When a widget is
+ * Destroys a widget.
+ *
+ * When a widget is
  * destroyed, it will break any references it holds to other objects.
  * If the widget is inside a container, the widget will be removed
  * from the container. If the widget is a toplevel (derived from
@@ -3147,7 +3506,8 @@ gtk_widget_destroy (GtkWidget *widget)
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  gtk_object_destroy ((GtkObject*) widget);
+  if (!widget->priv->in_destruction)
+    g_object_run_dispose (G_OBJECT (widget));
 }
 
 /**
@@ -3210,13 +3570,15 @@ gtk_widget_show (GtkWidget *widget)
 static void
 gtk_widget_real_show (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv = widget->priv;
+
   if (!gtk_widget_get_visible (widget))
     {
-      GTK_WIDGET_SET_FLAGS (widget, GTK_VISIBLE);
+      priv->visible = TRUE;
 
-      if (widget->parent &&
-         gtk_widget_get_mapped (widget->parent) &&
-         GTK_WIDGET_CHILD_VISIBLE (widget) &&
+      if (priv->parent &&
+         gtk_widget_get_mapped (priv->parent) &&
+          gtk_widget_get_child_visible (widget) &&
          !gtk_widget_get_mapped (widget))
        gtk_widget_map (widget);
     }
@@ -3298,7 +3660,7 @@ gtk_widget_real_hide (GtkWidget *widget)
 {
   if (gtk_widget_get_visible (widget))
     {
-      GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
+      widget->priv->visible = FALSE;
       
       if (gtk_widget_get_mapped (widget))
        gtk_widget_unmap (widget);
@@ -3384,10 +3746,14 @@ gtk_widget_hide_all (GtkWidget *widget)
 void
 gtk_widget_map (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (gtk_widget_get_visible (widget));
-  g_return_if_fail (GTK_WIDGET_CHILD_VISIBLE (widget));
-  
+  g_return_if_fail (gtk_widget_get_child_visible (widget));
+
+  priv = widget->priv;
+
   if (!gtk_widget_get_mapped (widget))
     {
       if (!gtk_widget_get_realized (widget))
@@ -3396,7 +3762,7 @@ gtk_widget_map (GtkWidget *widget)
       g_signal_emit (widget, widget_signals[MAP], 0);
 
       if (!gtk_widget_get_has_window (widget))
-       gdk_window_invalidate_rect (widget->window, &widget->allocation, FALSE);
+       gdk_window_invalidate_rect (priv->window, &priv->allocation, FALSE);
     }
 }
 
@@ -3410,12 +3776,16 @@ gtk_widget_map (GtkWidget *widget)
 void
 gtk_widget_unmap (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
-  
+
+  priv = widget->priv;
+
   if (gtk_widget_get_mapped (widget))
     {
       if (!gtk_widget_get_has_window (widget))
-       gdk_window_invalidate_rect (widget->window, &widget->allocation, FALSE);
+       gdk_window_invalidate_rect (priv->window, &priv->allocation, FALSE);
       _gtk_tooltip_hide (widget);
       g_signal_emit (widget, widget_signals[UNMAP], 0);
     }
@@ -3426,15 +3796,16 @@ gtk_widget_set_extension_events_internal (GtkWidget        *widget,
                                           GdkExtensionMode  mode,
                                           GList            *window_list)
 {
+  GtkWidgetPrivate *priv = widget->priv;
   GList *free_list = NULL;
   GList *l;
 
   if (window_list == NULL)
     {
       if (gtk_widget_get_has_window (widget))
-        window_list = g_list_prepend (NULL, widget->window);
+        window_list = g_list_prepend (NULL, priv->window);
       else
-        window_list = gdk_window_get_children (widget->window);
+        window_list = gdk_window_get_children (priv->window);
 
       free_list = window_list;
     }
@@ -3466,6 +3837,31 @@ gtk_widget_set_extension_events_internal (GtkWidget        *widget,
     g_list_free (free_list);
 }
 
+static void
+_gtk_widget_enable_device_events (GtkWidget *widget)
+{
+  GHashTable *device_events;
+  GHashTableIter iter;
+  gpointer key, value;
+
+  device_events = g_object_get_qdata (G_OBJECT (widget), quark_device_event_mask);
+
+  if (!device_events)
+    return;
+
+  g_hash_table_iter_init (&iter, device_events);
+
+  while (g_hash_table_iter_next (&iter, &key, &value))
+    {
+      GdkDevice *device;
+      GdkEventMask event_mask;
+
+      device = key;
+      event_mask = GPOINTER_TO_UINT (value);
+      gtk_widget_add_events_internal (widget, device, event_mask);
+    }
+}
+
 /**
  * gtk_widget_realize:
  * @widget: a #GtkWidget
@@ -3492,13 +3888,16 @@ gtk_widget_set_extension_events_internal (GtkWidget        *widget,
 void
 gtk_widget_realize (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv;
   GdkExtensionMode mode;
-  GtkWidgetShapeInfo *shape_info;
+  cairo_region_t *region;
   
   g_return_if_fail (GTK_IS_WIDGET (widget));
-  g_return_if_fail (GTK_WIDGET_ANCHORED (widget) ||
+  g_return_if_fail (widget->priv->anchored ||
                    GTK_IS_INVISIBLE (widget));
-  
+
+  priv = widget->priv;
+
   if (!gtk_widget_get_realized (widget))
     {
       /*
@@ -3506,14 +3905,14 @@ gtk_widget_realize (GtkWidget *widget)
          g_message ("gtk_widget_realize(%s)", G_OBJECT_TYPE_NAME (widget));
       */
 
-      if (widget->parent == NULL &&
+      if (priv->parent == NULL &&
           !gtk_widget_is_toplevel (widget))
         g_warning ("Calling gtk_widget_realize() on a widget that isn't "
                    "inside a toplevel window is not going to work very well. "
                    "Widgets must be inside a toplevel container before realizing them.");
       
-      if (widget->parent && !gtk_widget_get_realized (widget->parent))
-       gtk_widget_realize (widget->parent);
+      if (priv->parent && !gtk_widget_get_realized (priv->parent))
+       gtk_widget_realize (priv->parent);
 
       gtk_widget_ensure_style (widget);
       
@@ -3523,25 +3922,24 @@ gtk_widget_realize (GtkWidget *widget)
                                       GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (widget), quark_has_tooltip)),
                                       TRUE);
 
-      if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
+      if (priv->has_shape_mask)
        {
-         shape_info = g_object_get_qdata (G_OBJECT (widget), quark_shape_info);
-         gdk_window_shape_combine_mask (widget->window,
-                                        shape_info->shape_mask,
-                                        shape_info->offset_x,
-                                        shape_info->offset_y);
+         region = g_object_get_qdata (G_OBJECT (widget), quark_shape_info);
+         gdk_window_shape_combine_region (priv->window, region, 0, 0);
        }
       
-      shape_info = g_object_get_qdata (G_OBJECT (widget), quark_input_shape_info);
-      if (shape_info)
-       gdk_window_input_shape_combine_mask (widget->window,
-                                            shape_info->shape_mask,
-                                            shape_info->offset_x,
-                                            shape_info->offset_y);
+      region = g_object_get_qdata (G_OBJECT (widget), quark_input_shape_info);
+      if (region)
+       gdk_window_input_shape_combine_region (priv->window, region, 0, 0);
 
       mode = gtk_widget_get_extension_events (widget);
       if (mode != GDK_EXTENSION_EVENTS_NONE)
         gtk_widget_set_extension_events_internal (widget, mode, NULL);
+
+      if (priv->multidevice)
+        gdk_window_set_support_multidevice (priv->window, TRUE);
+
+      _gtk_widget_enable_device_events (widget);
     }
 }
 
@@ -3558,11 +3956,11 @@ gtk_widget_unrealize (GtkWidget *widget)
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  if (GTK_WIDGET_HAS_SHAPE_MASK (widget))
-    gtk_widget_shape_combine_mask (widget, NULL, 0, 0);
+  if (widget->priv->has_shape_mask)
+    gtk_widget_shape_combine_region (widget, NULL);
 
   if (g_object_get_qdata (G_OBJECT (widget), quark_input_shape_info))
-    gtk_widget_input_shape_combine_mask (widget, NULL, 0, 0);
+    gtk_widget_input_shape_combine_region (widget, NULL);
 
   if (gtk_widget_get_realized (widget))
     {
@@ -3615,16 +4013,19 @@ gtk_widget_queue_draw_area (GtkWidget *widget,
                            gint       width,
                            gint       height)
 {
+  GtkWidgetPrivate *priv;
   GdkRectangle invalid_rect;
   GtkWidget *w;
   
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
+  priv = widget->priv;
+
   if (!gtk_widget_get_realized (widget))
     return;
   
   /* Just return if the widget or one of its ancestors isn't mapped */
-  for (w = widget; w != NULL; w = w->parent)
+  for (w = widget; w != NULL; w = w->priv->parent)
     if (!gtk_widget_get_mapped (w))
       return;
 
@@ -3632,17 +4033,18 @@ gtk_widget_queue_draw_area (GtkWidget *widget,
 
   if (gtk_widget_get_has_window (widget))
     {
-      if (widget->parent)
+      if (priv->parent)
        {
          /* Translate widget relative to window-relative */
 
          gint wx, wy, wwidth, wheight;
-         
-         gdk_window_get_position (widget->window, &wx, &wy);
-         x -= wx - widget->allocation.x;
-         y -= wy - widget->allocation.y;
-         
-         gdk_drawable_get_size (widget->window, &wwidth, &wheight);
+
+         gdk_window_get_position (priv->window, &wx, &wy);
+         x -= wx - priv->allocation.x;
+         y -= wy - priv->allocation.y;
+
+          wwidth = gdk_window_get_width (priv->window);
+          wheight = gdk_window_get_height (priv->window);
 
          if (x + width <= 0 || y + height <= 0 ||
              x >= wwidth || y >= wheight)
@@ -3668,58 +4070,7 @@ gtk_widget_queue_draw_area (GtkWidget *widget,
   invalid_rect.width = width;
   invalid_rect.height = height;
   
-  gdk_window_invalidate_rect (widget->window, &invalid_rect, TRUE);
-}
-
-static void
-widget_add_child_draw_rectangle (GtkWidget    *widget,
-                                GdkRectangle *rect)
-{
-  GdkRectangle child_rect;
-  
-  if (!gtk_widget_get_mapped (widget) ||
-      widget->window != widget->parent->window)
-    return;
-
-  gtk_widget_get_draw_rectangle (widget, &child_rect);
-  gdk_rectangle_union (rect, &child_rect, rect);
-}
-
-static void
-gtk_widget_get_draw_rectangle (GtkWidget    *widget,
-                              GdkRectangle *rect)
-{
-  if (!gtk_widget_get_has_window (widget))
-    {
-      GtkBorder *draw_border = NULL;
-
-      *rect = widget->allocation;
-
-      gtk_widget_style_get (widget,
-                           "draw-border", &draw_border,
-                           NULL);
-      if (draw_border)
-       {
-         rect->x -= draw_border->left;
-         rect->y -= draw_border->top;
-         rect->width += draw_border->left + draw_border->right;
-         rect->height += draw_border->top + draw_border->bottom;
-
-          gtk_border_free (draw_border);
-       }
-
-      if (GTK_IS_CONTAINER (widget))
-       gtk_container_forall (GTK_CONTAINER (widget),
-                             (GtkCallback)widget_add_child_draw_rectangle,
-                             rect);
-    }
-  else
-    {
-      rect->x = 0;
-      rect->y = 0;
-      rect->width = widget->allocation.width;
-      rect->height = widget->allocation.height;
-    }
+  gdk_window_invalidate_rect (priv->window, &invalid_rect, TRUE);
 }
 
 /**
@@ -3736,60 +4087,14 @@ gtk_widget_queue_draw (GtkWidget *widget)
   
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  gtk_widget_get_draw_rectangle (widget, &rect);
-
-  gtk_widget_queue_draw_area (widget,
-                             rect.x, rect.y,
-                             rect.width, rect.height);
-}
-
-/* Invalidates the given area (allocation-relative-coordinates)
- * in all of the widget's windows
- */
-/**
- * gtk_widget_queue_clear_area:
- * @widget: a #GtkWidget
- * @x: x coordinate of upper-left corner of rectangle to redraw
- * @y: y coordinate of upper-left corner of rectangle to redraw
- * @width: width of region to draw
- * @height: height of region to draw
- * 
- * This function is no longer different from
- * gtk_widget_queue_draw_area(), though it once was. Now it just calls
- * gtk_widget_queue_draw_area(). Originally
- * gtk_widget_queue_clear_area() would force a redraw of the
- * background for %GTK_NO_WINDOW widgets, and
- * gtk_widget_queue_draw_area() would not. Now both functions ensure
- * the background will be redrawn.
- * 
- * Deprecated: 2.2: Use gtk_widget_queue_draw_area() instead.
- **/
-void      
-gtk_widget_queue_clear_area (GtkWidget *widget,
-                            gint       x,
-                            gint       y,
-                            gint       width,
-                            gint       height)
-{
-  g_return_if_fail (GTK_IS_WIDGET (widget));
-
-  gtk_widget_queue_draw_area (widget, x, y, width, height);
-}
-
-/**
- * gtk_widget_queue_clear:
- * @widget: a #GtkWidget
- * 
- * This function does the same as gtk_widget_queue_draw().
- *
- * Deprecated: 2.2: Use gtk_widget_queue_draw() instead.
- **/
-void      
-gtk_widget_queue_clear (GtkWidget *widget)
-{
-  g_return_if_fail (GTK_IS_WIDGET (widget));
+  gtk_widget_get_allocation (widget, &rect);
 
-  gtk_widget_queue_draw (widget);
+  if (!gtk_widget_get_has_window (widget))
+    gtk_widget_queue_draw_area (widget,
+                                rect.x, rect.y, rect.width, rect.height);
+  else
+    gtk_widget_queue_draw_area (widget,
+                                0, 0, rect.width, rect.height);
 }
 
 /**
@@ -3830,43 +4135,10 @@ gtk_widget_queue_resize_no_redraw (GtkWidget *widget)
   _gtk_size_group_queue_resize (widget);
 }
 
-/**
- * gtk_widget_draw:
- * @widget: a #GtkWidget
- * @area: area to draw
- *
- * In GTK+ 1.2, this function would immediately render the
- * region @area of a widget, by invoking the virtual draw method of a
- * widget. In GTK+ 2.0, the draw method is gone, and instead
- * gtk_widget_draw() simply invalidates the specified region of the
- * widget, then updates the invalid region of the widget immediately.
- * Usually you don't want to update the region immediately for
- * performance reasons, so in general gtk_widget_queue_draw_area() is
- * a better choice if you want to draw a region of a widget.
- **/
-void
-gtk_widget_draw (GtkWidget          *widget,
-                const GdkRectangle *area)
-{
-  g_return_if_fail (GTK_IS_WIDGET (widget));
-
-  if (gtk_widget_is_drawable (widget))
-    {
-      if (area)
-        gtk_widget_queue_draw_area (widget,
-                                    area->x, area->y,
-                                    area->width, area->height);
-      else
-        gtk_widget_queue_draw (widget);
-
-      gdk_window_process_updates (widget->window, TRUE);
-    }
-}
-
 /**
  * gtk_widget_size_request:
  * @widget: a #GtkWidget
- * @requisition: a #GtkRequisition to be filled in
+ * @requisition: (out): a #GtkRequisition to be filled in
  * 
  * This function is typically used when implementing a #GtkContainer
  * subclass.  Obtains the preferred size of a widget. The container
@@ -3881,7 +4153,7 @@ gtk_widget_draw (GtkWidget          *widget,
  * Also remember that the size request is not necessarily the size
  * a widget will actually be allocated.
  *
- * Deprecated: 3.0: Use gtk_extended_layout_get_desired_size() instead.
+ * Deprecated: 3.0: Use gtk_widget_get_preferred_size() instead.
  **/
 void
 gtk_widget_size_request (GtkWidget     *widget,
@@ -3889,19 +4161,13 @@ gtk_widget_size_request (GtkWidget      *widget,
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-#ifdef G_ENABLE_DEBUG
-  if (requisition == &widget->requisition)
-    g_warning ("gtk_widget_size_request() called on child widget with request equal\n"
-               "to widget->requisition. gtk_widget_set_usize() may not work properly.");
-#endif /* G_ENABLE_DEBUG */
-
-  gtk_extended_layout_get_desired_size (GTK_EXTENDED_LAYOUT (widget), FALSE, requisition, NULL);
+  gtk_widget_get_preferred_size (widget, requisition, NULL);
 }
 
 /**
  * gtk_widget_get_child_requisition:
  * @widget: a #GtkWidget
- * @requisition: a #GtkRequisition to be filled in
+ * @requisition: (out): a #GtkRequisition to be filled in
  * 
  * This function is only for use in widget implementations. Obtains
  * @widget->requisition, unless someone has forced a particular
@@ -3923,13 +4189,13 @@ gtk_widget_size_request (GtkWidget      *widget,
  * gtk_widget_size_request().
  *
  *
- * Deprecated: 3.0: Use gtk_extended_layout_get_desired_size() instead.
+ * Deprecated: 3.0: Use gtk_widget_get_preferred_size() instead.
  **/
 void
 gtk_widget_get_child_requisition (GtkWidget     *widget,
                                  GtkRequisition *requisition)
 {
-  gtk_extended_layout_get_desired_size (GTK_EXTENDED_LAYOUT (widget), FALSE, requisition, NULL);
+  gtk_widget_get_preferred_size (widget, requisition, NULL);
 }
 
 static gboolean
@@ -3950,20 +4216,22 @@ invalidate_predicate (GdkWindow *window,
  */
 static void
 gtk_widget_invalidate_widget_windows (GtkWidget *widget,
-                                     GdkRegion *region)
+                                     cairo_region_t *region)
 {
+  GtkWidgetPrivate *priv = widget->priv;
+
   if (!gtk_widget_get_realized (widget))
     return;
   
-  if (gtk_widget_get_has_window (widget) && widget->parent)
+  if (gtk_widget_get_has_window (widget) && priv->parent)
     {
       int x, y;
-      
-      gdk_window_get_position (widget->window, &x, &y);
-      gdk_region_offset (region, -x, -y);
+
+      gdk_window_get_position (priv->window, &x, &y);
+      cairo_region_translate (region, -x, -y);
     }
 
-  gdk_window_invalidate_maybe_recurse (widget->window, region,
+  gdk_window_invalidate_maybe_recurse (priv->window, region,
                                       invalidate_predicate, widget);
 }
 
@@ -3978,55 +4246,50 @@ static void
 gtk_widget_queue_shallow_draw (GtkWidget *widget)
 {
   GdkRectangle rect;
-  GdkRegion *region;
-  
+  cairo_region_t *region;
+
   if (!gtk_widget_get_realized (widget))
     return;
 
-  gtk_widget_get_draw_rectangle (widget, &rect);
+  gtk_widget_get_allocation (widget, &rect);
 
-  /* get_draw_rectangle() gives us window coordinates, we
-   * need to convert to the coordinates that widget->allocation
-   * is in.
-   */
-  if (gtk_widget_get_has_window (widget) && widget->parent)
-    {
-      int wx, wy;
-      
-      gdk_window_get_position (widget->window, &wx, &wy);
-      
-      rect.x += wx;
-      rect.y += wy;
-    }
-  
-  region = gdk_region_rectangle (&rect);
+  region = cairo_region_create_rectangle (&rect);
   gtk_widget_invalidate_widget_windows (widget, region);
-  gdk_region_destroy (region);
+  cairo_region_destroy (region);
 }
 
 /**
  * gtk_widget_size_allocate:
  * @widget: a #GtkWidget
- * @allocation: position and size to be allocated to @widget
+ * @allocation: (inout): position and size to be allocated to @widget
  *
  * This function is only used by #GtkContainer subclasses, to assign a size
- * and position to their child widgets. 
+ * and position to their child widgets.
+ *
+ * In this function, the allocation may be adjusted. It will be forced
+ * to a 1x1 minimum size, and the adjust_size_allocation virtual
+ * method on the child will be used to adjust the allocation. Standard
+ * adjustments include removing the widget's margins, and applying the
+ * widget's #GtkWidget:halign and #GtkWidget:valign properties.
  **/
 void
 gtk_widget_size_allocate (GtkWidget    *widget,
                          GtkAllocation *allocation)
 {
-  GtkWidgetAuxInfo *aux_info;
+  GtkWidgetPrivate *priv;
   GdkRectangle real_allocation;
   GdkRectangle old_allocation;
+  GdkRectangle adjusted_allocation;
   gboolean alloc_needed;
   gboolean size_changed;
   gboolean position_changed;
-  
+
+  priv = widget->priv;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
  
 #ifdef G_ENABLE_DEBUG
-  if (gtk_debug_flags & GTK_DEBUG_GEOMETRY)
+  if (gtk_get_debug_flags () & GTK_DEBUG_GEOMETRY)
     {
       gint depth;
       GtkWidget *parent;
@@ -4047,20 +4310,33 @@ gtk_widget_size_allocate (GtkWidget     *widget,
     }
 #endif /* G_ENABLE_DEBUG */
  
-  alloc_needed = GTK_WIDGET_ALLOC_NEEDED (widget);
-  if (!GTK_WIDGET_REQUEST_NEEDED (widget))      /* Preserve request/allocate ordering */
-    GTK_PRIVATE_UNSET_FLAG (widget, GTK_ALLOC_NEEDED);
+  alloc_needed = priv->alloc_needed;
+  if (!priv->width_request_needed && !priv->height_request_needed)
+    /* Preserve request/allocate ordering */
+    priv->alloc_needed = FALSE;
 
-  old_allocation = widget->allocation;
+  old_allocation = priv->allocation;
   real_allocation = *allocation;
-  aux_info =_gtk_widget_get_aux_info (widget, FALSE);
-  
-  if (aux_info)
+
+  adjusted_allocation = real_allocation;
+  GTK_WIDGET_GET_CLASS (widget)->adjust_size_allocation (widget, &adjusted_allocation);
+
+  if (adjusted_allocation.x < real_allocation.x ||
+      adjusted_allocation.y < real_allocation.y ||
+      (adjusted_allocation.x + adjusted_allocation.width) >
+      (real_allocation.x + real_allocation.width) ||
+      (adjusted_allocation.y + adjusted_allocation.height >
+       real_allocation.y + real_allocation.height))
     {
-      if (aux_info->x_set)
-       real_allocation.x = aux_info->x;
-      if (aux_info->y_set)
-       real_allocation.y = aux_info->y;
+      g_warning ("%s %p attempted to adjust its size allocation from %d,%d %dx%d to %d,%d %dx%d. adjust_size_allocation must keep allocation inside original bounds",
+                 G_OBJECT_TYPE_NAME (widget), widget,
+                 real_allocation.x, real_allocation.y, real_allocation.width, real_allocation.height,
+                 adjusted_allocation.x, adjusted_allocation.y, adjusted_allocation.width, adjusted_allocation.height);
+      adjusted_allocation = real_allocation; /* veto it */
+    }
+  else
+    {
+      real_allocation = adjusted_allocation;
     }
 
   if (real_allocation.width < 0 || real_allocation.height < 0)
@@ -4085,38 +4361,38 @@ gtk_widget_size_allocate (GtkWidget     *widget,
 
   if (gtk_widget_get_mapped (widget))
     {
-      if (!gtk_widget_get_has_window (widget) && GTK_WIDGET_REDRAW_ON_ALLOC (widget) && position_changed)
+      if (!gtk_widget_get_has_window (widget) && priv->redraw_on_alloc && position_changed)
        {
-         /* Invalidate union(old_allaction,widget->allocation) in widget->window
+         /* Invalidate union(old_allaction,priv->allocation) in priv->window
           */
-         GdkRegion *invalidate = gdk_region_rectangle (&widget->allocation);
-         gdk_region_union_with_rect (invalidate, &old_allocation);
+         cairo_region_t *invalidate = cairo_region_create_rectangle (&priv->allocation);
+         cairo_region_union_rectangle (invalidate, &old_allocation);
 
-         gdk_window_invalidate_region (widget->window, invalidate, FALSE);
-         gdk_region_destroy (invalidate);
+         gdk_window_invalidate_region (priv->window, invalidate, FALSE);
+         cairo_region_destroy (invalidate);
        }
       
       if (size_changed)
        {
-         if (GTK_WIDGET_REDRAW_ON_ALLOC (widget))
+         if (priv->redraw_on_alloc)
            {
-             /* Invalidate union(old_allaction,widget->allocation) in widget->window and descendents owned by widget
+             /* Invalidate union(old_allaction,priv->allocation) in priv->window and descendents owned by widget
               */
-             GdkRegion *invalidate = gdk_region_rectangle (&widget->allocation);
-             gdk_region_union_with_rect (invalidate, &old_allocation);
+             cairo_region_t *invalidate = cairo_region_create_rectangle (&priv->allocation);
+             cairo_region_union_rectangle (invalidate, &old_allocation);
 
              gtk_widget_invalidate_widget_windows (widget, invalidate);
-             gdk_region_destroy (invalidate);
+             cairo_region_destroy (invalidate);
            }
        }
     }
 
-  if ((size_changed || position_changed) && widget->parent &&
-      gtk_widget_get_realized (widget->parent) && GTK_CONTAINER (widget->parent)->reallocate_redraws)
+  if ((size_changed || position_changed) && priv->parent &&
+      gtk_widget_get_realized (priv->parent) && _gtk_container_get_reallocate_redraws (GTK_CONTAINER (priv->parent)))
     {
-      GdkRegion *invalidate = gdk_region_rectangle (&widget->parent->allocation);
-      gtk_widget_invalidate_widget_windows (widget->parent, invalidate);
-      gdk_region_destroy (invalidate);
+      cairo_region_t *invalidate = cairo_region_create_rectangle (&priv->parent->priv->allocation);
+      gtk_widget_invalidate_widget_windows (priv->parent, invalidate);
+      cairo_region_destroy (invalidate);
     }
 }
 
@@ -4142,16 +4418,16 @@ gtk_widget_common_ancestor (GtkWidget *widget_a,
   gint depth_b = 0;
 
   parent_a = widget_a;
-  while (parent_a->parent)
+  while (parent_a->priv->parent)
     {
-      parent_a = parent_a->parent;
+      parent_a = parent_a->priv->parent;
       depth_a++;
     }
 
   parent_b = widget_b;
-  while (parent_b->parent)
+  while (parent_b->priv->parent)
     {
-      parent_b = parent_b->parent;
+      parent_b = parent_b->priv->parent;
       depth_b++;
     }
 
@@ -4160,20 +4436,20 @@ gtk_widget_common_ancestor (GtkWidget *widget_a,
 
   while (depth_a > depth_b)
     {
-      widget_a = widget_a->parent;
+      widget_a = widget_a->priv->parent;
       depth_a--;
     }
 
   while (depth_b > depth_a)
     {
-      widget_b = widget_b->parent;
+      widget_b = widget_b->priv->parent;
       depth_b--;
     }
 
   while (widget_a != widget_b)
     {
-      widget_a = widget_a->parent;
-      widget_b = widget_b->parent;
+      widget_a = widget_a->priv->parent;
+      widget_b = widget_b->priv->parent;
     }
 
   return widget_a;
@@ -4205,6 +4481,8 @@ gtk_widget_translate_coordinates (GtkWidget  *src_widget,
                                  gint       *dest_x,
                                  gint       *dest_y)
 {
+  GtkWidgetPrivate *src_priv = src_widget->priv;
+  GtkWidgetPrivate *dest_priv = dest_widget->priv;
   GtkWidget *ancestor;
   GdkWindow *window;
   GList *dest_list = NULL;
@@ -4217,23 +4495,23 @@ gtk_widget_translate_coordinates (GtkWidget  *src_widget,
     return FALSE;
 
   /* Translate from allocation relative to window relative */
-  if (gtk_widget_get_has_window (src_widget) && src_widget->parent)
+  if (gtk_widget_get_has_window (src_widget) && src_priv->parent)
     {
       gint wx, wy;
-      gdk_window_get_position (src_widget->window, &wx, &wy);
+      gdk_window_get_position (src_priv->window, &wx, &wy);
 
-      src_x -= wx - src_widget->allocation.x;
-      src_y -= wy - src_widget->allocation.y;
+      src_x -= wx - src_priv->allocation.x;
+      src_y -= wy - src_priv->allocation.y;
     }
   else
     {
-      src_x += src_widget->allocation.x;
-      src_y += src_widget->allocation.y;
+      src_x += src_priv->allocation.x;
+      src_y += src_priv->allocation.y;
     }
 
   /* Translate to the common ancestor */
-  window = src_widget->window;
-  while (window != ancestor->window)
+  window = src_priv->window;
+  while (window != ancestor->priv->window)
     {
       gdouble dx, dy;
 
@@ -4249,8 +4527,8 @@ gtk_widget_translate_coordinates (GtkWidget  *src_widget,
     }
 
   /* And back */
-  window = dest_widget->window;
-  while (window != ancestor->window)
+  window = dest_priv->window;
+  while (window != ancestor->priv->window)
     {
       dest_list = g_list_prepend (dest_list, window);
 
@@ -4276,18 +4554,18 @@ gtk_widget_translate_coordinates (GtkWidget  *src_widget,
     }
 
   /* Translate from window relative to allocation relative */
-  if (gtk_widget_get_has_window (dest_widget) && dest_widget->parent)
+  if (gtk_widget_get_has_window (dest_widget) && dest_priv->parent)
     {
       gint wx, wy;
-      gdk_window_get_position (dest_widget->window, &wx, &wy);
+      gdk_window_get_position (dest_priv->window, &wx, &wy);
 
-      src_x += wx - dest_widget->allocation.x;
-      src_y += wy - dest_widget->allocation.y;
+      src_x += wx - dest_priv->allocation.x;
+      src_y += wy - dest_priv->allocation.y;
     }
   else
     {
-      src_x -= dest_widget->allocation.x;
-      src_y -= dest_widget->allocation.y;
+      src_x -= dest_priv->allocation.x;
+      src_y -= dest_priv->allocation.y;
     }
 
   if (dest_x)
@@ -4302,25 +4580,145 @@ static void
 gtk_widget_real_size_allocate (GtkWidget     *widget,
                               GtkAllocation *allocation)
 {
-  widget->allocation = *allocation;
-  
+  GtkWidgetPrivate *priv = widget->priv;
+
+  priv->allocation = *allocation;
+
   if (gtk_widget_get_realized (widget) &&
       gtk_widget_get_has_window (widget))
      {
-       gdk_window_move_resize (widget->window,
+       gdk_window_move_resize (priv->window,
                                allocation->x, allocation->y,
                                allocation->width, allocation->height);
      }
 }
 
+static void
+get_span_inside_border (GtkWidget              *widget,
+                        GtkAlign                align,
+                        int                     start_pad,
+                        int                     end_pad,
+                        int                     allocated_outside_size,
+                        int                     natural_inside_size,
+                        int                    *coord_inside_p,
+                        int                    *size_inside_p)
+{
+  int inside_allocated;
+  int content_size;
+  int coord, size;
+
+  inside_allocated = allocated_outside_size - start_pad - end_pad;
+
+  content_size = natural_inside_size;
+  if (content_size > inside_allocated)
+    {
+      /* didn't get full natural size */
+      content_size = inside_allocated;
+    }
+
+  coord = size = 0; /* silence compiler */
+  switch (align)
+    {
+    case GTK_ALIGN_FILL:
+      coord = start_pad;
+      size = inside_allocated;
+      break;
+    case GTK_ALIGN_START:
+      coord = start_pad;
+      size = content_size;
+      break;
+    case GTK_ALIGN_END:
+      coord = allocated_outside_size - end_pad - content_size;
+      size = content_size;
+      break;
+    case GTK_ALIGN_CENTER:
+      coord = start_pad + (inside_allocated - content_size) / 2;
+      size = content_size;
+      break;
+    }
+
+  if (coord_inside_p)
+    *coord_inside_p = coord;
+
+  if (size_inside_p)
+    *size_inside_p = size;
+}
+
+static void
+get_span_inside_border_horizontal (GtkWidget              *widget,
+                                   const GtkWidgetAuxInfo *aux_info,
+                                   int                     allocated_outside_width,
+                                   int                     natural_inside_width,
+                                   int                    *x_inside_p,
+                                   int                    *width_inside_p)
+{
+  get_span_inside_border (widget,
+                          aux_info->halign,
+                          aux_info->margin.left,
+                          aux_info->margin.right,
+                          allocated_outside_width,
+                          natural_inside_width,
+                          x_inside_p,
+                          width_inside_p);
+}
+
+static void
+get_span_inside_border_vertical (GtkWidget              *widget,
+                                 const GtkWidgetAuxInfo *aux_info,
+                                 int                     allocated_outside_height,
+                                 int                     natural_inside_height,
+                                 int                    *y_inside_p,
+                                 int                    *height_inside_p)
+{
+  get_span_inside_border (widget,
+                          aux_info->valign,
+                          aux_info->margin.top,
+                          aux_info->margin.bottom,
+                          allocated_outside_height,
+                          natural_inside_height,
+                          y_inside_p,
+                          height_inside_p);
+}
+
+static void
+gtk_widget_real_adjust_size_allocation (GtkWidget         *widget,
+                                        GtkAllocation     *allocation)
+{
+  const GtkWidgetAuxInfo *aux_info;
+  GtkRequisition min, natural;
+  int x, y, w, h;
+
+  aux_info = _gtk_widget_get_aux_info_or_defaults (widget);
+
+  gtk_widget_get_preferred_size (widget, &min, &natural);
+
+  get_span_inside_border_horizontal (widget,
+                                     aux_info,
+                                     allocation->width,
+                                     natural.width,
+                                     &x, &w);
+  get_span_inside_border_vertical (widget,
+                                   aux_info,
+                                   allocation->height,
+                                   natural.height,
+                                   &y, &h);
+
+  allocation->x += x;
+  allocation->y += y;
+  allocation->width = w;
+  allocation->height = h;
+}
+
 static gboolean
 gtk_widget_real_can_activate_accel (GtkWidget *widget,
                                     guint      signal_id)
 {
+  GtkWidgetPrivate *priv = widget->priv;
+
   /* widgets must be onscreen for accels to take effect */
   return gtk_widget_is_sensitive (widget) &&
          gtk_widget_is_drawable (widget) &&
-         gdk_window_is_viewable (widget->window);
+         gdk_window_is_viewable (priv->window);
 }
 
 /**
@@ -4534,16 +4932,18 @@ gtk_widget_remove_accelerator (GtkWidget      *widget,
 }
 
 /**
- * gtk_widget_list_accel_closures
+ * gtk_widget_list_accel_closures:
  * @widget:  widget to list accelerator closures for
- * @returns: a newly allocated #GList of closures
  *
  * Lists the closures used by @widget for accelerator group connections
  * with gtk_accel_group_connect_by_path() or gtk_accel_group_connect().
  * The closures can be used to monitor accelerator changes on @widget,
- * by connecting to the @GtkAccelGroup::accel-changed signal of the 
- * #GtkAccelGroup of a closure which can be found out with 
+ * by connecting to the @GtkAccelGroup::accel-changed signal of the
+ * #GtkAccelGroup of a closure which can be found out with
  * gtk_accel_group_from_accel_closure().
+ *
+ * Return value: (transfer container) (element-type GClosure):
+ *     a newly allocated #GList of closures
  */
 GList*
 gtk_widget_list_accel_closures (GtkWidget *widget)
@@ -4650,7 +5050,7 @@ _gtk_widget_get_accel_path (GtkWidget *widget,
 
   apath = g_object_get_qdata (G_OBJECT (widget), quark_accel_path);
   if (locked)
-    *locked = apath ? apath->accel_group->lock_count > 0 : TRUE;
+    *locked = apath ? gtk_accel_group_get_is_locked (apath->accel_group) : TRUE;
   return apath ? g_quark_to_string (apath->path_quark) : NULL;
 }
 
@@ -4704,18 +5104,145 @@ gtk_widget_real_mnemonic_activate (GtkWidget *widget,
   return TRUE;
 }
 
+static const cairo_user_data_key_t event_key;
+
+GdkEventExpose *
+_gtk_cairo_get_event (cairo_t *cr)
+{
+  g_return_val_if_fail (cr != NULL, NULL);
+
+  return cairo_get_user_data (cr, &event_key);
+}
+
+static void
+gtk_cairo_set_event (cairo_t        *cr,
+                     GdkEventExpose *event)
+{
+  cairo_set_user_data (cr, &event_key, event, NULL);
+}
+
+/**
+ * gtk_cairo_should_draw_window:
+ * @cr: a cairo context
+ * @window: the window to check
+ *
+ * This function is supposed to be called in GtkWidget::draw
+ * implementations for widgets that support multiple windows.
+ * @cr must be untransformed from invoking of the draw function.
+ * This function will return %TRUE if the contents of the given
+ * @window are supposed to be drawn and %FALSE otherwise. Note
+ * that when the drawing was not initiated by the windowing
+ * system this function will return %TRUE for all windows, so
+ * you need to draw the bottommost window first. Also, do not
+ * use "else if" statements to check which window should be drawn.
+ *
+ * Returns: %TRUE if @window should be drawn
+ **/
+gboolean
+gtk_cairo_should_draw_window (cairo_t *cr,
+                              GdkWindow *window)
+{
+  GdkEventExpose *event;
+
+  g_return_val_if_fail (cr != NULL, FALSE);
+  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
+
+  event = _gtk_cairo_get_event (cr);
+  
+  return event == NULL ||
+         event->window == window;
+}
+
+/* code shared by gtk_container_propagate_draw() and
+ * gtk_widget_draw()
+ */
+void
+_gtk_widget_draw_internal (GtkWidget *widget,
+                           cairo_t   *cr,
+                           gboolean   clip_to_size)
+{
+  if (!gtk_widget_is_drawable (widget))
+    return;
+
+  if (clip_to_size)
+    {
+      cairo_rectangle (cr, 
+                       0, 0,
+                       widget->priv->allocation.width,
+                       widget->priv->allocation.height);
+      cairo_clip (cr);
+    }
+
+  if (gdk_cairo_get_clip_rectangle (cr, NULL))
+    {
+      gboolean result;
+
+      g_signal_emit (widget, widget_signals[DRAW], 
+                     0, cr,
+                     &result);
+    }
+}
+
+/**
+ * gtk_widget_draw:
+ * @widget: the widget to draw. It must be drawable (see 
+ *   gtk_widget_is_drawable()) and a size must have been allocated.
+ * @cr: a cairo context to draw to
+ *
+ * Draws @widget to @cr. The top left corner of the widget will be
+ * drawn to the currently set origin point of @cr.
+ *
+ * You should pass a cairo context as @cr argument that is in an
+ * original state. Otherwise the resulting drawing is undefined. For
+ * example changing the operator using cairo_set_operator() or the
+ * line width using cairo_set_line_width() might have unwanted side
+ * effects.
+ * You may however change the context's transform matrix - like with
+ * cairo_scale(), cairo_translate() or cairo_set_matrix() and clip
+ * region with cairo_clip() prior to calling this function. Also, it
+ * is fine to modify the context with cairo_save() and
+ * cairo_push_group() prior to calling this function.
+ *
+ * <note><para>Special purpose widgets may contain special code for
+ * rendering to the screen and might appear differently on screen
+ * and when rendered using gtk_widget_draw().</para></note>
+ **/
+void
+gtk_widget_draw (GtkWidget *widget,
+                 cairo_t   *cr)
+{
+  GdkEventExpose *tmp_event;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (!widget->priv->alloc_needed);
+  g_return_if_fail (cr != NULL);
+
+  cairo_save (cr);
+  /* We have to reset the event here so that draw functions can call
+   * gtk_widget_draw() on random other widgets and get the desired
+   * effect: Drawing all contents, not just the current window.
+   */
+  tmp_event = _gtk_cairo_get_event (cr);
+  gtk_cairo_set_event (cr, NULL);
+
+  _gtk_widget_draw_internal (widget, cr, TRUE);
+
+  gtk_cairo_set_event (cr, tmp_event);
+  cairo_restore (cr);
+}
+
 static gboolean
 gtk_widget_real_key_press_event (GtkWidget         *widget,
                                 GdkEventKey       *event)
 {
-  return gtk_bindings_activate_event (GTK_OBJECT (widget), event);
+  return gtk_bindings_activate_event (G_OBJECT (widget), event);
 }
 
 static gboolean
 gtk_widget_real_key_release_event (GtkWidget         *widget,
                                   GdkEventKey       *event)
 {
-  return gtk_bindings_activate_event (GTK_OBJECT (widget), event);
+  return gtk_bindings_activate_event (G_OBJECT (widget), event);
 }
 
 static gboolean
@@ -4774,6 +5301,77 @@ gtk_widget_event (GtkWidget *widget,
   return gtk_widget_event_internal (widget, event);
 }
 
+/* Returns TRUE if a translation should be done */
+static gboolean
+gtk_widget_get_translation_to_window (GtkWidget      *widget,
+                                      GdkWindow      *window,
+                                      int            *x,
+                                      int            *y)
+{
+  GdkWindow *w, *widget_window;
+
+  if (!gtk_widget_get_has_window (widget))
+    {
+      *x = -widget->priv->allocation.x;
+      *y = -widget->priv->allocation.y;
+    }
+  else
+    {
+      *x = 0;
+      *y = 0;
+    }
+
+  widget_window = gtk_widget_get_window (widget);
+
+  for (w = window; w && w != widget_window; w = gdk_window_get_parent (w))
+    {
+      int wx, wy;
+      gdk_window_get_position (w, &wx, &wy);
+      *x += wx;
+      *y += wy;
+    }
+
+  if (w == NULL) 
+    { 
+      *x = 0;
+      *y = 0;
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+
+/**
+ * gtk_cairo_transform_to_window:
+ * @cr: the cairo context to transform
+ * @widget: the widget the context is currently centered for
+ * @window: the window to transform the context to
+ *
+ * Transforms the given cairo context @cr that from @widget-relative
+ * coordinates to @window-relative coordinates.
+ * If the @widget's window is not an ancestor of @window, no
+ * modification will be applied.
+ *
+ * This is the inverse to the transformation GTK applies when
+ * preparing an expose event to be emitted with the GtkWidget::draw
+ * signal. It is intended to help porting multiwindow widgets from
+ * GTK 2 to the rendering architecture of GTK 3.
+ **/
+void
+gtk_cairo_transform_to_window (cairo_t   *cr,
+                               GtkWidget *widget,
+                               GdkWindow *window)
+{
+  int x, y;
+
+  g_return_if_fail (cr != NULL);
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (GDK_IS_WINDOW (window));
+
+  if (gtk_widget_get_translation_to_window (widget, window, &x, &y))
+    cairo_translate (cr, x, y);
+}
 
 /**
  * gtk_widget_send_expose:
@@ -4798,24 +5396,40 @@ gint
 gtk_widget_send_expose (GtkWidget *widget,
                        GdkEvent  *event)
 {
+  gboolean result = FALSE;
+  cairo_t *cr;
+  int x, y;
+  gboolean do_clip;
+
   g_return_val_if_fail (GTK_IS_WIDGET (widget), TRUE);
   g_return_val_if_fail (gtk_widget_get_realized (widget), TRUE);
   g_return_val_if_fail (event != NULL, TRUE);
   g_return_val_if_fail (event->type == GDK_EXPOSE, TRUE);
 
-  return gtk_widget_event_internal (widget, event);
+  cr = gdk_cairo_create (event->expose.window);
+  gtk_cairo_set_event (cr, &event->expose);
+
+  gdk_cairo_region (cr, event->expose.region);
+  cairo_clip (cr);
+
+  do_clip = gtk_widget_get_translation_to_window (widget,
+                                                  event->expose.window,
+                                                  &x, &y);
+  cairo_translate (cr, -x, -y);
+
+  _gtk_widget_draw_internal (widget, cr, do_clip);
+
+  /* unset here, so if someone keeps a reference to cr we
+   * don't leak the window. */
+  gtk_cairo_set_event (cr, NULL);
+  cairo_destroy (cr);
+
+  return result;
 }
 
 static gboolean
 event_window_is_still_viewable (GdkEvent *event)
 {
-  /* Some programs, such as gnome-theme-manager, fake widgets
-   * into exposing onto a pixmap by sending expose events with
-   * event->window pointing to a pixmap
-   */
-  if (GDK_IS_PIXMAP (event->any.window))
-    return event->type == GDK_EXPOSE;
-  
   /* Check that we think the event's window is viewable before
    * delivering the event, to prevent suprises. We do this here
    * at the last moment, since the event may have been queued
@@ -5067,9 +5681,11 @@ static void
 gtk_widget_reparent_subwindows (GtkWidget *widget,
                                GdkWindow *new_window)
 {
+  GtkWidgetPrivate *priv = widget->priv;
+
   if (!gtk_widget_get_has_window (widget))
     {
-      GList *children = gdk_window_get_children (widget->window);
+      GList *children = gdk_window_get_children (priv->window);
       GList *tmp_list;
 
       for (tmp_list = children; tmp_list; tmp_list = tmp_list->next)
@@ -5079,7 +5695,7 @@ gtk_widget_reparent_subwindows (GtkWidget *widget,
 
          gdk_window_get_user_data (window, &child);
          while (child && child != widget)
-           child = ((GtkWidget*) child)->parent;
+           child = ((GtkWidget*) child)->priv->parent;
 
          if (child)
            gdk_window_reparent (window, new_window, 0, 0);
@@ -5092,10 +5708,10 @@ gtk_widget_reparent_subwindows (GtkWidget *widget,
      GdkWindow *parent;
      GList *tmp_list, *children;
 
-     parent = gdk_window_get_parent (widget->window);
+     parent = gdk_window_get_parent (priv->window);
 
      if (parent == NULL)
-       gdk_window_reparent (widget->window, new_window, 0, 0);
+       gdk_window_reparent (priv->window, new_window, 0, 0);
      else
        {
         children = gdk_window_get_children (parent);
@@ -5120,15 +5736,17 @@ static void
 gtk_widget_reparent_fixup_child (GtkWidget *widget,
                                 gpointer   client_data)
 {
+  GtkWidgetPrivate *priv = widget->priv;
+
   g_assert (client_data != NULL);
   
   if (!gtk_widget_get_has_window (widget))
     {
-      if (widget->window)
-       g_object_unref (widget->window);
-      widget->window = (GdkWindow*) client_data;
-      if (widget->window)
-       g_object_ref (widget->window);
+      if (priv->window)
+       g_object_unref (priv->window);
+      priv->window = (GdkWindow*) client_data;
+      if (priv->window)
+       g_object_ref (priv->window);
 
       if (GTK_IS_CONTAINER (widget))
         gtk_container_forall (GTK_CONTAINER (widget),
@@ -5149,27 +5767,30 @@ void
 gtk_widget_reparent (GtkWidget *widget,
                     GtkWidget *new_parent)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (GTK_IS_CONTAINER (new_parent));
-  g_return_if_fail (widget->parent != NULL);
-  
-  if (widget->parent != new_parent)
+  priv = widget->priv;
+  g_return_if_fail (priv->parent != NULL);
+
+  if (priv->parent != new_parent)
     {
       /* First try to see if we can get away without unrealizing
        * the widget as we reparent it. if so we set a flag so
        * that gtk_widget_unparent doesn't unrealize widget
        */
       if (gtk_widget_get_realized (widget) && gtk_widget_get_realized (new_parent))
-       GTK_PRIVATE_SET_FLAG (widget, GTK_IN_REPARENT);
+       priv->in_reparent = TRUE;
       
       g_object_ref (widget);
-      gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
+      gtk_container_remove (GTK_CONTAINER (priv->parent), widget);
       gtk_container_add (GTK_CONTAINER (new_parent), widget);
       g_object_unref (widget);
       
-      if (GTK_WIDGET_IN_REPARENT (widget))
+      if (priv->in_reparent)
        {
-         GTK_PRIVATE_UNSET_FLAG (widget, GTK_IN_REPARENT);
+          priv->in_reparent = FALSE;
 
          gtk_widget_reparent_subwindows (widget, gtk_widget_get_parent_window (widget));
          gtk_widget_reparent_fixup_child (widget,
@@ -5198,24 +5819,27 @@ gtk_widget_intersect (GtkWidget          *widget,
                      const GdkRectangle *area,
                      GdkRectangle       *intersection)
 {
+  GtkWidgetPrivate *priv;
   GdkRectangle *dest;
   GdkRectangle tmp;
   gint return_val;
   
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
   g_return_val_if_fail (area != NULL, FALSE);
-  
+
+  priv = widget->priv;
+
   if (intersection)
     dest = intersection;
   else
     dest = &tmp;
   
-  return_val = gdk_rectangle_intersect (&widget->allocation, area, dest);
+  return_val = gdk_rectangle_intersect (&priv->allocation, area, dest);
   
   if (return_val && intersection && gtk_widget_get_has_window (widget))
     {
-      intersection->x -= widget->allocation.x;
-      intersection->y -= widget->allocation.y;
+      intersection->x -= priv->allocation.x;
+      intersection->y -= priv->allocation.y;
     }
   
   return return_val;
@@ -5224,7 +5848,7 @@ gtk_widget_intersect (GtkWidget            *widget,
 /**
  * gtk_widget_region_intersect:
  * @widget: a #GtkWidget
- * @region: a #GdkRegion, in the same coordinate system as 
+ * @region: a #cairo_region_t, in the same coordinate system as 
  *          @widget->allocation. That is, relative to @widget->window
  *          for %NO_WINDOW widgets; relative to the parent window
  *          of @widget->window for widgets with their own window.
@@ -5235,24 +5859,24 @@ gtk_widget_intersect (GtkWidget          *widget,
  *           widgets with their own window.
  * 
  * Computes the intersection of a @widget's area and @region, returning
- * the intersection. The result may be empty, use gdk_region_empty() to
+ * the intersection. The result may be empty, use cairo_region_is_empty() to
  * check.
  **/
-GdkRegion *
+cairo_region_t *
 gtk_widget_region_intersect (GtkWidget       *widget,
-                            const GdkRegion *region)
+                            const cairo_region_t *region)
 {
   GdkRectangle rect;
-  GdkRegion *dest;
+  cairo_region_t *dest;
   
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
   g_return_val_if_fail (region != NULL, NULL);
 
-  gtk_widget_get_draw_rectangle (widget, &rect);
+  gtk_widget_get_allocation (widget, &rect);
   
-  dest = gdk_region_rectangle (&rect);
+  dest = cairo_region_create_rectangle (&rect);
  
-  gdk_region_intersect (dest, region);
+  cairo_region_intersect (dest, region);
 
   return dest;
 }
@@ -5283,6 +5907,10 @@ _gtk_widget_grab_notify (GtkWidget *widget,
  *
  * More precisely, it must have the %GTK_CAN_FOCUS flag set. Use
  * gtk_widget_set_can_focus() to modify that flag.
+ *
+ * The widget also needs to be realized and mapped. This is indicated by the
+ * related signals. Grabbing the focus immediately after creating the widget
+ * will likely fail and cause critical warnings.
  **/
 void
 gtk_widget_grab_focus (GtkWidget *widget)
@@ -5330,8 +5958,8 @@ gtk_widget_real_grab_focus (GtkWidget *focus_widget)
       toplevel = gtk_widget_get_toplevel (focus_widget);
       if (gtk_widget_is_toplevel (toplevel) && GTK_IS_WINDOW (toplevel))
        {
-         widget = GTK_WINDOW (toplevel)->focus_widget;
-         
+          widget = gtk_window_get_focus (GTK_WINDOW (toplevel));
+
          if (widget == focus_widget)
            {
              /* We call _gtk_window_internal_set_focus() here so that the
@@ -5346,9 +5974,9 @@ gtk_widget_real_grab_focus (GtkWidget *focus_widget)
          
          if (widget)
            {
-             while (widget->parent && widget->parent != focus_widget->parent)
+             while (widget->priv->parent && widget->priv->parent != focus_widget->priv->parent)
                {
-                 widget = widget->parent;
+                 widget = widget->priv->parent;
                  gtk_container_set_focus_child (GTK_CONTAINER (widget), NULL);
                }
            }
@@ -5368,10 +5996,10 @@ gtk_widget_real_grab_focus (GtkWidget *focus_widget)
        * set it on the window
        */
       widget = focus_widget;
-      while (widget->parent)
+      while (widget->priv->parent)
        {
-         gtk_container_set_focus_child (GTK_CONTAINER (widget->parent), widget);
-         widget = widget->parent;
+         gtk_container_set_focus_child (GTK_CONTAINER (widget->priv->parent), widget);
+         widget = widget->priv->parent;
        }
       if (GTK_IS_WINDOW (widget))
        _gtk_window_internal_set_focus (GTK_WINDOW (widget), focus_widget);
@@ -5490,12 +6118,9 @@ gtk_widget_set_can_focus (GtkWidget *widget,
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  if (can_focus != gtk_widget_get_can_focus (widget))
+  if (widget->priv->can_focus != can_focus)
     {
-      if (can_focus)
-        GTK_OBJECT_FLAGS (widget) |= GTK_CAN_FOCUS;
-      else
-        GTK_OBJECT_FLAGS (widget) &= ~(GTK_CAN_FOCUS);
+      widget->priv->can_focus = can_focus;
 
       gtk_widget_queue_resize (widget);
       g_object_notify (G_OBJECT (widget), "can-focus");
@@ -5518,7 +6143,7 @@ gtk_widget_get_can_focus (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_CAN_FOCUS) != 0;
+  return widget->priv->can_focus;
 }
 
 /**
@@ -5538,7 +6163,7 @@ gtk_widget_has_focus (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_HAS_FOCUS) != 0;
+  return widget->priv->has_focus;
 }
 
 /**
@@ -5562,7 +6187,7 @@ gtk_widget_is_focus (GtkWidget *widget)
   toplevel = gtk_widget_get_toplevel (widget);
   
   if (GTK_IS_WINDOW (toplevel))
-    return widget == GTK_WINDOW (toplevel)->focus_widget;
+    return widget == gtk_window_get_focus (GTK_WINDOW (toplevel));
   else
     return FALSE;
 }
@@ -5584,12 +6209,9 @@ gtk_widget_set_can_default (GtkWidget *widget,
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  if (can_default != gtk_widget_get_can_default (widget))
+  if (widget->priv->can_default != can_default)
     {
-      if (can_default)
-        GTK_OBJECT_FLAGS (widget) |= GTK_CAN_DEFAULT;
-      else
-        GTK_OBJECT_FLAGS (widget) &= ~(GTK_CAN_DEFAULT);
+      widget->priv->can_default = can_default;
 
       gtk_widget_queue_resize (widget);
       g_object_notify (G_OBJECT (widget), "can-default");
@@ -5612,7 +6234,7 @@ gtk_widget_get_can_default (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_CAN_DEFAULT) != 0;
+  return widget->priv->can_default;
 }
 
 /**
@@ -5632,17 +6254,14 @@ gtk_widget_has_default (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_HAS_DEFAULT) != 0;
+  return widget->priv->has_default;
 }
 
 void
 _gtk_widget_set_has_default (GtkWidget *widget,
                              gboolean   has_default)
 {
-  if (has_default)
-    GTK_OBJECT_FLAGS (widget) |= GTK_HAS_DEFAULT;
-  else
-    GTK_OBJECT_FLAGS (widget) &= ~(GTK_HAS_DEFAULT);
+  widget->priv->has_default = has_default;
 }
 
 /**
@@ -5654,7 +6273,10 @@ _gtk_widget_set_has_default (GtkWidget *widget,
  * yourself by calling <literal>gtk_widget_set_can_default (@widget,
  * %TRUE)</literal>. The default widget is activated when 
  * the user presses Enter in a window. Default widgets must be 
- * activatable, that is, gtk_widget_activate() should affect them.
+ * activatable, that is, gtk_widget_activate() should affect them. Note
+ * that #GtkEntry widgets require the "activates-default" property
+ * set to %TRUE before they activate the default widget when Enter
+ * is pressed and the #GtkEntry is focused.
  **/
 void
 gtk_widget_grab_default (GtkWidget *widget)
@@ -5692,12 +6314,9 @@ gtk_widget_set_receives_default (GtkWidget *widget,
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  if (receives_default != gtk_widget_get_receives_default (widget))
+  if (widget->priv->receives_default != receives_default)
     {
-      if (receives_default)
-        GTK_OBJECT_FLAGS (widget) |= GTK_RECEIVES_DEFAULT;
-      else
-        GTK_OBJECT_FLAGS (widget) &= ~(GTK_RECEIVES_DEFAULT);
+      widget->priv->receives_default = receives_default;
 
       g_object_notify (G_OBJECT (widget), "receives-default");
     }
@@ -5723,7 +6342,7 @@ gtk_widget_get_receives_default (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_RECEIVES_DEFAULT) != 0;
+  return widget->priv->receives_default;
 }
 
 /**
@@ -5744,45 +6363,97 @@ gtk_widget_has_grab (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_HAS_GRAB) != 0;
+  return widget->priv->has_grab;
 }
 
 void
 _gtk_widget_set_has_grab (GtkWidget *widget,
                           gboolean   has_grab)
 {
-  if (has_grab)
-    GTK_OBJECT_FLAGS (widget) |= GTK_HAS_GRAB;
-  else
-    GTK_OBJECT_FLAGS (widget) &= ~(GTK_HAS_GRAB);
+  widget->priv->has_grab = has_grab;
 }
 
 /**
- * gtk_widget_set_name:
+ * gtk_widget_device_is_shadowed:
  * @widget: a #GtkWidget
- * @name: name for the widget
+ * @device: a #GdkDevice
  *
- * Widgets can be named, which allows you to refer to them from a
- * gtkrc file. You can apply a style to widgets with a particular name
- * in the gtkrc file. See the documentation for gtkrc files (on the
- * same page as the docs for #GtkRcStyle).
- * 
- * Note that widget names are separated by periods in paths (see 
- * gtk_widget_path()), so names with embedded periods may cause confusion.
+ * Returns %TRUE if @device has been shadowed by a GTK+
+ * device grab on another widget, so it would stop sending
+ * events to @widget. This may be used in the
+ * #GtkWidget::grab-notify signal to check for specific
+ * devices. See gtk_device_grab_add().
+ *
+ * Returns: %TRUE if there is an ongoing grab on @device
+ *          by another #GtkWidget than @widget.
+ *
+ * Since: 3.0
  **/
-void
-gtk_widget_set_name (GtkWidget  *widget,
-                    const gchar *name)
+gboolean
+gtk_widget_device_is_shadowed (GtkWidget *widget,
+                               GdkDevice *device)
+{
+  GtkWindowGroup *group;
+  GtkWidget *grab_widget, *toplevel;
+
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+  g_return_val_if_fail (GDK_IS_DEVICE (device), FALSE);
+
+  if (!gtk_widget_get_realized (widget))
+    return TRUE;
+
+  toplevel = gtk_widget_get_toplevel (widget);
+
+  if (GTK_IS_WINDOW (toplevel))
+    group = gtk_window_get_group (GTK_WINDOW (toplevel));
+  else
+    group = gtk_window_get_group (NULL);
+
+  grab_widget = gtk_window_group_get_current_device_grab (group, device);
+
+  /* Widget not inside the hierarchy of grab_widget */
+  if (grab_widget &&
+      widget != grab_widget &&
+      !gtk_widget_is_ancestor (widget, grab_widget))
+    return TRUE;
+
+  grab_widget = gtk_window_group_get_current_grab (group);
+  if (grab_widget && widget != grab_widget &&
+      !gtk_widget_is_ancestor (widget, grab_widget))
+    return TRUE;
+
+  return FALSE;
+}
+
+/**
+ * gtk_widget_set_name:
+ * @widget: a #GtkWidget
+ * @name: name for the widget
+ *
+ * Widgets can be named, which allows you to refer to them from a
+ * gtkrc file. You can apply a style to widgets with a particular name
+ * in the gtkrc file. See the documentation for gtkrc files (on the
+ * same page as the docs for #GtkRcStyle).
+ * 
+ * Note that widget names are separated by periods in paths (see 
+ * gtk_widget_path()), so names with embedded periods may cause confusion.
+ **/
+void
+gtk_widget_set_name (GtkWidget  *widget,
+                    const gchar *name)
 {
+  GtkWidgetPrivate *priv;
   gchar *new_name;
   
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
+  priv = widget->priv;
+
   new_name = g_strdup (name);
-  g_free (widget->name);
-  widget->name = new_name;
+  g_free (priv->name);
+  priv->name = new_name;
 
-  if (gtk_widget_has_rc_style (widget))
+  if (priv->rc_style)
     gtk_widget_reset_rc_style (widget);
 
   g_object_notify (G_OBJECT (widget), "name");
@@ -5801,10 +6472,14 @@ gtk_widget_set_name (GtkWidget   *widget,
 G_CONST_RETURN gchar*
 gtk_widget_get_name (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
-  
-  if (widget->name)
-    return widget->name;
+
+  priv = widget->priv;
+
+  if (priv->name)
+    return priv->name;
   return G_OBJECT_TYPE_NAME (widget);
 }
 
@@ -5821,8 +6496,12 @@ void
 gtk_widget_set_state (GtkWidget           *widget,
                      GtkStateType         state)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
+  priv = widget->priv;
+
   if (state == gtk_widget_get_state (widget))
     return;
 
@@ -5835,8 +6514,8 @@ gtk_widget_set_state (GtkWidget           *widget,
       data.state = state;
       data.state_restoration = FALSE;
       data.use_forall = FALSE;
-      if (widget->parent)
-       data.parent_sensitive = (gtk_widget_is_sensitive (widget->parent) != FALSE);
+      if (priv->parent)
+       data.parent_sensitive = (gtk_widget_is_sensitive (priv->parent) != FALSE);
       else
        data.parent_sensitive = TRUE;
 
@@ -5862,7 +6541,7 @@ gtk_widget_get_state (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_STATE_NORMAL);
 
-  return widget->state;
+  return widget->priv->state;
 }
 
 /**
@@ -5895,6 +6574,13 @@ gtk_widget_set_visible (GtkWidget *widget,
     }
 }
 
+void
+_gtk_widget_set_visible_flag (GtkWidget *widget,
+                              gboolean   visible)
+{
+  widget->priv->visible = visible;
+}
+
 /**
  * gtk_widget_get_visible:
  * @widget: a #GtkWidget
@@ -5914,7 +6600,7 @@ gtk_widget_get_visible (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_VISIBLE) != 0;
+  return widget->priv->visible;
 }
 
 /**
@@ -5926,9 +6612,9 @@ gtk_widget_get_visible (GtkWidget *widget)
  * all realized widgets have a non-%NULL "window" pointer
  * (gtk_widget_get_window() never returns a %NULL window when a widget
  * is realized), but for many of them it's actually the #GdkWindow of
- * one of its parent widgets. Widgets that create a %window for
- * themselves in GtkWidget::realize() however must announce this by
- * calling this function with @has_window = %TRUE.
+ * one of its parent widgets. Widgets that do not create a %window for
+ * themselves in GtkWidget::realize() must announce this by
+ * calling this function with @has_window = %FALSE.
  *
  * This function should only be called by widget implementations,
  * and they should call it in their init() function.
@@ -5941,10 +6627,7 @@ gtk_widget_set_has_window (GtkWidget *widget,
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  if (has_window)
-    GTK_OBJECT_FLAGS (widget) &= ~(GTK_NO_WINDOW);
-  else
-    GTK_OBJECT_FLAGS (widget) |= GTK_NO_WINDOW;
+  widget->priv->no_window = !has_window;
 }
 
 /**
@@ -5963,7 +6646,7 @@ gtk_widget_get_has_window (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return !((GTK_OBJECT_FLAGS (widget) & GTK_NO_WINDOW) != 0);
+  return ! widget->priv->no_window;
 }
 
 /**
@@ -5983,17 +6666,14 @@ gtk_widget_is_toplevel (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_TOPLEVEL) != 0;
+  return widget->priv->toplevel;
 }
 
 void
 _gtk_widget_set_is_toplevel (GtkWidget *widget,
                              gboolean   is_toplevel)
 {
-  if (is_toplevel)
-    GTK_OBJECT_FLAGS (widget) |= GTK_TOPLEVEL;
-  else
-    GTK_OBJECT_FLAGS (widget) &= ~(GTK_TOPLEVEL);
+  widget->priv->toplevel = is_toplevel;
 }
 
 /**
@@ -6031,7 +6711,7 @@ gtk_widget_get_realized (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_REALIZED) != 0;
+  return widget->priv->realized;
 }
 
 /**
@@ -6052,10 +6732,7 @@ gtk_widget_set_realized (GtkWidget *widget,
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  if (realized)
-    GTK_OBJECT_FLAGS (widget) |= GTK_REALIZED;
-  else
-    GTK_OBJECT_FLAGS (widget) &= ~(GTK_REALIZED);
+  widget->priv->realized = realized;
 }
 
 /**
@@ -6073,7 +6750,7 @@ gtk_widget_get_mapped (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_MAPPED) != 0;
+  return widget->priv->mapped;
 }
 
 /**
@@ -6094,10 +6771,7 @@ gtk_widget_set_mapped (GtkWidget *widget,
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  if (mapped)
-    GTK_OBJECT_FLAGS (widget) |= GTK_MAPPED;
-  else
-    GTK_OBJECT_FLAGS (widget) &= ~(GTK_MAPPED);
+  widget->priv->mapped = mapped;
 }
 
 /**
@@ -6106,7 +6780,7 @@ gtk_widget_set_mapped (GtkWidget *widget,
  * @app_paintable: %TRUE if the application will paint on the widget
  *
  * Sets whether the application intends to draw on the widget in
- * an #GtkWidget::expose-event handler. 
+ * an #GtkWidget::draw handler. 
  *
  * This is a hint to the widget and does not affect the behavior of 
  * the GTK+ core; many widgets ignore this flag entirely. For widgets 
@@ -6116,13 +6790,6 @@ gtk_widget_set_mapped (GtkWidget *widget,
  * is then entirely responsible for drawing the widget background.
  *
  * Note that the background is still drawn when the widget is mapped.
- * If this is not suitable (e.g. because you want to make a transparent
- * window using an RGBA visual), you can work around this by doing:
- * |[
- *  gtk_widget_realize (window);
- *  gdk_window_set_back_pixmap (window->window, NULL, FALSE);
- *  gtk_widget_show (window);
- * ]|
  **/
 void
 gtk_widget_set_app_paintable (GtkWidget *widget,
@@ -6132,12 +6799,9 @@ gtk_widget_set_app_paintable (GtkWidget *widget,
 
   app_paintable = (app_paintable != FALSE);
 
-  if (gtk_widget_get_app_paintable (widget) != app_paintable)
+  if (widget->priv->app_paintable != app_paintable)
     {
-      if (app_paintable)
-        GTK_OBJECT_FLAGS (widget) |= GTK_APP_PAINTABLE;
-      else
-        GTK_OBJECT_FLAGS (widget) &= ~(GTK_APP_PAINTABLE);
+      widget->priv->app_paintable = app_paintable;
 
       if (gtk_widget_is_drawable (widget))
        gtk_widget_queue_draw (widget);
@@ -6151,7 +6815,7 @@ gtk_widget_set_app_paintable (GtkWidget *widget,
  * @widget: a #GtkWidget
  *
  * Determines whether the application intends to draw on the widget in
- * an #GtkWidget::expose-event handler.
+ * an #GtkWidget::draw handler.
  *
  * See gtk_widget_set_app_paintable()
  *
@@ -6164,7 +6828,7 @@ gtk_widget_get_app_paintable (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_APP_PAINTABLE) != 0;
+  return widget->priv->app_paintable;
 }
 
 /**
@@ -6199,12 +6863,9 @@ gtk_widget_set_double_buffered (GtkWidget *widget,
 
   double_buffered = (double_buffered != FALSE);
 
-  if (double_buffered != gtk_widget_get_double_buffered (widget))
+  if (widget->priv->double_buffered != double_buffered)
     {
-      if (double_buffered)
-        GTK_OBJECT_FLAGS (widget) |= GTK_DOUBLE_BUFFERED;
-      else
-        GTK_OBJECT_FLAGS (widget) &= ~(GTK_DOUBLE_BUFFERED);
+      widget->priv->double_buffered = double_buffered;
 
       g_object_notify (G_OBJECT (widget), "double-buffered");
     }
@@ -6227,7 +6888,7 @@ gtk_widget_get_double_buffered (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_DOUBLE_BUFFERED) != 0;
+  return widget->priv->double_buffered;
 }
 
 /**
@@ -6258,10 +6919,7 @@ gtk_widget_set_redraw_on_allocate (GtkWidget *widget,
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  if (redraw_on_allocate)
-    GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_ON_ALLOC);
-  else
-    GTK_PRIVATE_UNSET_FLAG (widget, GTK_REDRAW_ON_ALLOC);
+  widget->priv->redraw_on_alloc = redraw_on_allocate;
 }
 
 /**
@@ -6278,30 +6936,33 @@ void
 gtk_widget_set_sensitive (GtkWidget *widget,
                          gboolean   sensitive)
 {
+  GtkWidgetPrivate *priv;
   GtkStateData data;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
+  priv = widget->priv;
+
   sensitive = (sensitive != FALSE);
 
-  if (sensitive == (gtk_widget_get_sensitive (widget) != FALSE))
+  if (widget->priv->sensitive == sensitive)
     return;
 
   if (sensitive)
     {
-      GTK_OBJECT_FLAGS (widget) |= GTK_SENSITIVE;
-      data.state = widget->saved_state;
+      widget->priv->sensitive = TRUE;
+      data.state = priv->saved_state;
     }
   else
     {
-      GTK_OBJECT_FLAGS (widget) &= ~(GTK_SENSITIVE);
+      widget->priv->sensitive = FALSE;
       data.state = gtk_widget_get_state (widget);
     }
   data.state_restoration = TRUE;
   data.use_forall = TRUE;
 
-  if (widget->parent)
-    data.parent_sensitive = (gtk_widget_is_sensitive (widget->parent) != FALSE);
+  if (priv->parent)
+    data.parent_sensitive = gtk_widget_is_sensitive (priv->parent);
   else
     data.parent_sensitive = TRUE;
 
@@ -6331,7 +6992,7 @@ gtk_widget_get_sensitive (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_SENSITIVE) != 0;
+  return widget->priv->sensitive;
 }
 
 /**
@@ -6350,8 +7011,7 @@ gtk_widget_is_sensitive (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (gtk_widget_get_sensitive (widget) &&
-          (GTK_OBJECT_FLAGS (widget) & GTK_PARENT_SENSITIVE) != 0);
+  return widget->priv->sensitive && widget->priv->parent_sensitive;
 }
 
 /**
@@ -6370,12 +7030,16 @@ void
 gtk_widget_set_parent (GtkWidget *widget,
                       GtkWidget *parent)
 {
+  GtkWidgetPrivate *priv;
   GtkStateData data;
   
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (GTK_IS_WIDGET (parent));
   g_return_if_fail (widget != parent);
-  if (widget->parent != NULL)
+
+  priv = widget->priv;
+
+  if (priv->parent != NULL)
     {
       g_warning ("Can't set a parent on widget which has a parent\n");
       return;
@@ -6390,7 +7054,7 @@ gtk_widget_set_parent (GtkWidget *widget,
    */
 
   g_object_ref_sink (widget);
-  widget->parent = parent;
+  priv->parent = parent;
 
   if (gtk_widget_get_state (parent) != GTK_STATE_NORMAL)
     data.state = gtk_widget_get_state (parent);
@@ -6405,20 +7069,20 @@ gtk_widget_set_parent (GtkWidget *widget,
   gtk_widget_reset_rc_styles (widget);
 
   g_signal_emit (widget, widget_signals[PARENT_SET], 0, NULL);
-  if (GTK_WIDGET_ANCHORED (widget->parent))
+  if (priv->parent->priv->anchored)
     _gtk_widget_propagate_hierarchy_changed (widget, NULL);
   g_object_notify (G_OBJECT (widget), "parent");
 
   /* Enforce realized/mapped invariants
    */
-  if (gtk_widget_get_realized (widget->parent))
+  if (gtk_widget_get_realized (priv->parent))
     gtk_widget_realize (widget);
 
-  if (gtk_widget_get_visible (widget->parent) &&
+  if (gtk_widget_get_visible (priv->parent) &&
       gtk_widget_get_visible (widget))
     {
-      if (GTK_WIDGET_CHILD_VISIBLE (widget) &&
-         gtk_widget_get_mapped (widget->parent))
+      if (gtk_widget_get_child_visible (widget) &&
+         gtk_widget_get_mapped (priv->parent))
        gtk_widget_map (widget);
 
       gtk_widget_queue_resize (widget);
@@ -6438,7 +7102,7 @@ gtk_widget_get_parent (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
 
-  return widget->parent;
+  return widget->priv->parent;
 }
 
 /*****************************************
@@ -6467,10 +7131,14 @@ gtk_widget_get_parent (GtkWidget *widget)
 void
 gtk_widget_style_attach (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (gtk_widget_get_realized (widget));
 
-  widget->style = gtk_style_attach (widget->style, widget->window);
+  priv = widget->priv;
+
+  priv->style = gtk_style_attach (priv->style, priv->window);
 }
 
 /**
@@ -6489,7 +7157,7 @@ gtk_widget_has_rc_style (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
 
-  return (GTK_OBJECT_FLAGS (widget) & GTK_RC_STYLE) != 0;
+  return widget->priv->rc_style;
 }
 
 /**
@@ -6513,16 +7181,16 @@ gtk_widget_set_style (GtkWidget *widget,
     {
       gboolean initial_emission;
 
-      initial_emission = !gtk_widget_has_rc_style (widget) && !GTK_WIDGET_USER_STYLE (widget);
+      initial_emission = !widget->priv->rc_style && !widget->priv->user_style;
       
-      GTK_OBJECT_FLAGS (widget) &= ~(GTK_RC_STYLE);
-      GTK_PRIVATE_SET_FLAG (widget, GTK_USER_STYLE);
+      widget->priv->rc_style = FALSE;
+      widget->priv->user_style = TRUE;
       
       gtk_widget_set_style_internal (widget, style, initial_emission);
     }
   else
     {
-      if (GTK_WIDGET_USER_STYLE (widget))
+      if (widget->priv->user_style)
        gtk_widget_reset_rc_style (widget);
     }
 }
@@ -6541,8 +7209,7 @@ gtk_widget_ensure_style (GtkWidget *widget)
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  if (!GTK_WIDGET_USER_STYLE (widget) &&
-      !gtk_widget_has_rc_style (widget))
+  if (!widget->priv->rc_style && !widget->priv->user_style)
     gtk_widget_reset_rc_style (widget);
 }
 
@@ -6552,20 +7219,21 @@ gtk_widget_ensure_style (GtkWidget *widget)
 static void
 gtk_widget_reset_rc_style (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv = widget->priv;
   GtkStyle *new_style = NULL;
   gboolean initial_emission;
-  
-  initial_emission = !gtk_widget_has_rc_style (widget) && !GTK_WIDGET_USER_STYLE (widget);
 
-  GTK_PRIVATE_UNSET_FLAG (widget, GTK_USER_STYLE);
-  GTK_OBJECT_FLAGS (widget) |= GTK_RC_STYLE;
-  
+  initial_emission = !priv->rc_style && !priv->user_style;
+
+  priv->user_style = FALSE;
+  priv->rc_style = TRUE;
+
   if (gtk_widget_has_screen (widget))
     new_style = gtk_rc_get_style (widget);
   if (!new_style)
     new_style = gtk_widget_get_default_style ();
 
-  if (initial_emission || new_style != widget->style)
+  if (initial_emission || new_style != priv->style)
     gtk_widget_set_style_internal (widget, new_style, initial_emission);
 }
 
@@ -6581,8 +7249,8 @@ GtkStyle*
 gtk_widget_get_style (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
-  
-  return widget->style;
+
+  return widget->priv->style;
 }
 
 /**
@@ -6624,7 +7292,7 @@ gtk_widget_modify_style (GtkWidget      *widget,
    * modifier style and the only reference was our own.
    */
   
-  if (gtk_widget_has_rc_style (widget))
+  if (widget->priv->rc_style)
     gtk_widget_reset_rc_style (widget);
 }
 
@@ -6718,7 +7386,7 @@ gtk_widget_modify_color_component (GtkWidget      *widget,
  * All other style values are left untouched. See also
  * gtk_widget_modify_style().
  *
- * Since: 2.22
+ * Since: 3.0
  **/
 void
 gtk_widget_modify_symbolic_color (GtkWidget      *widget,
@@ -6949,9 +7617,11 @@ static void
 gtk_widget_real_style_set (GtkWidget *widget,
                            GtkStyle  *previous_style)
 {
+  GtkWidgetPrivate *priv = widget->priv;
+
   if (gtk_widget_get_realized (widget) &&
       gtk_widget_get_has_window (widget))
-    gtk_style_set_background (widget->style, widget->window, widget->state);
+    gtk_style_set_background (priv->style, priv->window, priv->state);
 }
 
 static void
@@ -6959,25 +7629,27 @@ gtk_widget_set_style_internal (GtkWidget *widget,
                               GtkStyle  *style,
                               gboolean   initial_emission)
 {
+  GtkWidgetPrivate *priv = widget->priv;
+
   g_object_ref (widget);
   g_object_freeze_notify (G_OBJECT (widget));
 
-  if (widget->style != style)
+  if (priv->style != style)
     {
       GtkStyle *previous_style;
 
       if (gtk_widget_get_realized (widget))
        {
          gtk_widget_reset_shapes (widget);
-         gtk_style_detach (widget->style);
+         gtk_style_detach (priv->style);
        }
-      
-      previous_style = widget->style;
-      widget->style = style;
-      g_object_ref (widget->style);
-      
+
+      previous_style = priv->style;
+      priv->style = style;
+      g_object_ref (priv->style);
+
       if (gtk_widget_get_realized (widget))
-       widget->style = gtk_style_attach (widget->style, widget->window);
+       priv->style = gtk_style_attach (priv->style, priv->window);
 
       gtk_widget_update_pango_context (widget);
       g_signal_emit (widget,
@@ -6986,7 +7658,7 @@ gtk_widget_set_style_internal (GtkWidget *widget,
                     initial_emission ? NULL : previous_style);
       g_object_unref (previous_style);
 
-      if (GTK_WIDGET_ANCHORED (widget) && !initial_emission)
+      if (priv->anchored && !initial_emission)
        gtk_widget_queue_resize (widget);
     }
   else if (initial_emission)
@@ -7031,18 +7703,16 @@ static void
 gtk_widget_propagate_hierarchy_changed_recurse (GtkWidget *widget,
                                                gpointer   client_data)
 {
+  GtkWidgetPrivate *priv = widget->priv;
   HierarchyChangedInfo *info = client_data;
   gboolean new_anchored = gtk_widget_is_toplevel (widget) ||
-                 (widget->parent && GTK_WIDGET_ANCHORED (widget->parent));
+                 (priv->parent && priv->parent->priv->anchored);
 
-  if (GTK_WIDGET_ANCHORED (widget) != new_anchored)
+  if (priv->anchored != new_anchored)
     {
       g_object_ref (widget);
-      
-      if (new_anchored)
-       GTK_PRIVATE_SET_FLAG (widget, GTK_ANCHORED);
-      else
-       GTK_PRIVATE_UNSET_FLAG (widget, GTK_ANCHORED);
+
+      priv->anchored = new_anchored;
       
       g_signal_emit (widget, widget_signals[HIERARCHY_CHANGED], 0, info->previous_toplevel);
       do_screen_change (widget, info->previous_screen, info->new_screen);
@@ -7066,16 +7736,17 @@ gtk_widget_propagate_hierarchy_changed_recurse (GtkWidget *widget,
  * emitting #GtkWidget::hierarchy-changed.
  **/
 void
-_gtk_widget_propagate_hierarchy_changed (GtkWidget    *widget,
-                                        GtkWidget    *previous_toplevel)
+_gtk_widget_propagate_hierarchy_changed (GtkWidget *widget,
+                                        GtkWidget *previous_toplevel)
 {
+  GtkWidgetPrivate *priv = widget->priv;
   HierarchyChangedInfo info;
 
   info.previous_toplevel = previous_toplevel;
   info.previous_screen = previous_toplevel ? gtk_widget_get_screen (previous_toplevel) : NULL;
 
   if (gtk_widget_is_toplevel (widget) ||
-      (widget->parent && GTK_WIDGET_ANCHORED (widget->parent)))
+      (priv->parent && priv->parent->priv->anchored))
     info.new_screen = gtk_widget_get_screen (widget);
   else
     info.new_screen = NULL;
@@ -7189,7 +7860,7 @@ _gtk_widget_propagate_screen_changed (GtkWidget    *widget,
 static void
 reset_rc_styles_recurse (GtkWidget *widget, gpointer data)
 {
-  if (gtk_widget_has_rc_style (widget))
+  if (widget->priv->rc_style)
     gtk_widget_reset_rc_style (widget);
   
   if (GTK_IS_CONTAINER (widget))
@@ -7285,7 +7956,9 @@ static void
 update_pango_context (GtkWidget    *widget,
                      PangoContext *context)
 {
-  pango_context_set_font_description (context, widget->style->font_desc);
+  GtkWidgetPrivate *priv = widget->priv;
+
+  pango_context_set_font_description (context, priv->style->font_desc);
   pango_context_set_base_dir (context,
                              gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ?
                              PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL);
@@ -7316,12 +7989,12 @@ gtk_widget_update_pango_context (GtkWidget *widget)
 /**
  * gtk_widget_create_pango_context:
  * @widget: a #GtkWidget
- * 
+ *
  * Creates a new #PangoContext with the appropriate font map,
  * font description, and base direction for drawing text for
  * this widget. See also gtk_widget_get_pango_context().
- * 
- * Return value: the new #PangoContext
+ *
+ * Return value: (transfer full): the new #PangoContext
  **/
 PangoContext *
 gtk_widget_create_pango_context (GtkWidget *widget)
@@ -7352,7 +8025,7 @@ gtk_widget_create_pango_context (GtkWidget *widget)
  * gtk_widget_create_pango_layout:
  * @widget: a #GtkWidget
  * @text: text to set on the layout (can be %NULL)
- * 
+ *
  * Creates a new #PangoLayout with the appropriate font map,
  * font description, and base direction for drawing text for
  * this widget.
@@ -7360,10 +8033,10 @@ gtk_widget_create_pango_context (GtkWidget *widget)
  * If you keep a #PangoLayout created in this way around, in order to
  * notify the layout of changes to the base direction or font of this
  * widget, you must call pango_layout_context_changed() in response to
- * the #GtkWidget::style-set and #GtkWidget::direction-changed signals 
+ * the #GtkWidget::style-set and #GtkWidget::direction-changed signals
  * for the widget.
- * 
- * Return value: the new #PangoLayout
+ *
+ * Return value: (transfer full): the new #PangoLayout
  **/
 PangoLayout *
 gtk_widget_create_pango_layout (GtkWidget   *widget,
@@ -7387,7 +8060,7 @@ gtk_widget_create_pango_layout (GtkWidget   *widget,
  * gtk_widget_render_icon:
  * @widget: a #GtkWidget
  * @stock_id: a stock ID
- * @size: (type int) a stock size. A size of (GtkIconSize)-1 means
+ * @size: (type int): a stock size. A size of (GtkIconSize)-1 means
  *     render at the size of the source and don't scale (if there are
  *     multiple source sizes, GTK+ picks one of the available sizes).
  * @detail: (allow-none): render detail to pass to theme engine
@@ -7404,7 +8077,8 @@ gtk_widget_create_pango_layout (GtkWidget   *widget,
  * the application and should not be modified. The pixbuf should be freed
  * after use with g_object_unref().
  *
- * Return value: a new pixbuf, or %NULL if the stock ID wasn't known
+ * Return value: (transfer full): a new pixbuf, or %NULL if the
+ *     stock ID wasn't known
  **/
 GdkPixbuf*
 gtk_widget_render_icon (GtkWidget      *widget,
@@ -7412,22 +8086,25 @@ gtk_widget_render_icon (GtkWidget      *widget,
                         GtkIconSize     size,
                         const gchar    *detail)
 {
+  GtkWidgetPrivate *priv;
   GtkIconSet *icon_set;
   GdkPixbuf *retval;
   
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
   g_return_val_if_fail (stock_id != NULL, NULL);
   g_return_val_if_fail (size > GTK_ICON_SIZE_INVALID || size == -1, NULL);
-  
+
+  priv = widget->priv;
+
   gtk_widget_ensure_style (widget);
   
-  icon_set = gtk_style_lookup_icon_set (widget->style, stock_id);
+  icon_set = gtk_style_lookup_icon_set (priv->style, stock_id);
 
   if (icon_set == NULL)
     return NULL;
 
   retval = gtk_icon_set_render_icon (icon_set,
-                                     widget->style,
+                                     priv->style,
                                      gtk_widget_get_direction (widget),
                                      gtk_widget_get_state (widget),
                                      size,
@@ -7477,14 +8154,17 @@ gtk_widget_set_parent_window   (GtkWidget           *widget,
 GdkWindow *
 gtk_widget_get_parent_window (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv;
   GdkWindow *parent_window;
 
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
 
+  priv = widget->priv;
+
   parent_window = g_object_get_qdata (G_OBJECT (widget), quark_parent_window);
 
   return (parent_window != NULL) ? parent_window :
-        (widget->parent != NULL) ? widget->parent->window : NULL;
+        (priv->parent != NULL) ? priv->parent->priv->window : NULL;
 }
 
 
@@ -7515,28 +8195,32 @@ void
 gtk_widget_set_child_visible (GtkWidget *widget,
                              gboolean   is_visible)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (!gtk_widget_is_toplevel (widget));
 
+  priv = widget->priv;
+
   g_object_ref (widget);
 
   if (is_visible)
-    GTK_PRIVATE_SET_FLAG (widget, GTK_CHILD_VISIBLE);
+    priv->child_visible = TRUE;
   else
     {
       GtkWidget *toplevel;
-      
-      GTK_PRIVATE_UNSET_FLAG (widget, GTK_CHILD_VISIBLE);
+
+      priv->child_visible = FALSE;
 
       toplevel = gtk_widget_get_toplevel (widget);
       if (toplevel != widget && gtk_widget_is_toplevel (toplevel))
        _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
     }
 
-  if (widget->parent && gtk_widget_get_realized (widget->parent))
+  if (priv->parent && gtk_widget_get_realized (priv->parent))
     {
-      if (gtk_widget_get_mapped (widget->parent) &&
-         GTK_WIDGET_CHILD_VISIBLE (widget) &&
+      if (gtk_widget_get_mapped (priv->parent) &&
+         priv->child_visible &&
          gtk_widget_get_visible (widget))
        gtk_widget_map (widget);
       else
@@ -7564,7 +8248,7 @@ gtk_widget_get_child_visible (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
   
-  return GTK_WIDGET_CHILD_VISIBLE (widget);
+  return widget->priv->child_visible;
 }
 
 static GdkScreen *
@@ -7577,9 +8261,9 @@ gtk_widget_get_screen_unchecked (GtkWidget *widget)
   if (gtk_widget_is_toplevel (toplevel))
     {
       if (GTK_IS_WINDOW (toplevel))
-       return GTK_WINDOW (toplevel)->screen;
+       return gtk_window_get_screen (GTK_WINDOW (toplevel));
       else if (GTK_IS_INVISIBLE (toplevel))
-       return GTK_INVISIBLE (widget)->screen;
+       return gtk_invisible_get_screen (GTK_INVISIBLE (widget));
     }
 
   return NULL;
@@ -7721,13 +8405,7 @@ gtk_widget_get_root_window (GtkWidget *widget)
  * outside the widget. If returning %TRUE, widgets normally
  * call gtk_widget_grab_focus() to place the focus accordingly;
  * if returning %FALSE, they don't modify the current focus location.
- * 
- * This function replaces gtk_container_focus() from GTK+ 1.2.  
- * It was necessary to check that the child was visible, sensitive, 
- * and focusable before calling gtk_container_focus(). 
- * gtk_widget_child_focus() returns %FALSE if the widget is not 
- * currently in a focusable state, so there's no need for those checks.
- * 
+ *
  * Return value: %TRUE if focus ended up inside @widget
  **/
 gboolean
@@ -7831,11 +8509,14 @@ gtk_widget_keynav_failed (GtkWidget        *widget,
 void
 gtk_widget_error_bell (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv;
   GtkSettings* settings;
   gboolean beep;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
+  priv = widget->priv;
+
   settings = gtk_widget_get_settings (widget);
   if (!settings)
     return;
@@ -7844,78 +8525,8 @@ gtk_widget_error_bell (GtkWidget *widget)
                 "gtk-error-bell", &beep,
                 NULL);
 
-  if (beep && widget->window)
-    gdk_window_beep (widget->window);
-}
-
-/**
- * gtk_widget_set_uposition:
- * @widget: a #GtkWidget
- * @x: x position; -1 to unset x; -2 to leave x unchanged
- * @y: y position; -1 to unset y; -2 to leave y unchanged
- * 
- *
- * Sets the position of a widget. The funny "u" in the name comes from
- * the "user position" hint specified by the X Window System, and
- * exists for legacy reasons. This function doesn't work if a widget
- * is inside a container; it's only really useful on #GtkWindow.
- *
- * Don't use this function to center dialogs over the main application
- * window; most window managers will do the centering on your behalf
- * if you call gtk_window_set_transient_for(), and it's really not
- * possible to get the centering to work correctly in all cases from
- * application code. But if you insist, use gtk_window_set_position()
- * to set #GTK_WIN_POS_CENTER_ON_PARENT, don't do the centering
- * manually.
- *
- * Note that although @x and @y can be individually unset, the position
- * is not honoured unless both @x and @y are set.
- **/
-void
-gtk_widget_set_uposition (GtkWidget *widget,
-                         gint       x,
-                         gint       y)
-{
-  /* FIXME this function is the only place that aux_info->x and
-   * aux_info->y are even used I believe, and this function is
-   * deprecated. Should be cleaned up.
-   *
-   * (Actually, size_allocate uses them) -Yosh
-   */
-  
-  GtkWidgetAuxInfo *aux_info;
-  
-  g_return_if_fail (GTK_IS_WIDGET (widget));
-  
-  aux_info =_gtk_widget_get_aux_info (widget, TRUE);
-  
-  if (x > -2)
-    {
-      if (x == -1)
-       aux_info->x_set = FALSE;
-      else
-       {
-         aux_info->x_set = TRUE;
-         aux_info->x = x;
-       }
-    }
-
-  if (y > -2)
-    {
-      if (y == -1)
-       aux_info->y_set = FALSE;
-      else
-       {
-         aux_info->y_set = TRUE;
-         aux_info->y = y;
-       }
-    }
-
-  if (GTK_IS_WINDOW (widget) && aux_info->x_set && aux_info->y_set)
-    _gtk_window_reposition (GTK_WINDOW (widget), aux_info->x, aux_info->y);
-  
-  if (gtk_widget_get_visible (widget) && widget->parent)
-    gtk_widget_size_allocate (widget, &widget->allocation);
+  if (beep && priv->window)
+    gdk_window_beep (priv->window);
 }
 
 static void
@@ -7949,42 +8560,6 @@ gtk_widget_set_usize_internal (GtkWidget *widget,
   g_object_thaw_notify (G_OBJECT (widget));
 }
 
-/**
- * gtk_widget_set_usize:
- * @widget: a #GtkWidget
- * @width: minimum width, or -1 to unset
- * @height: minimum height, or -1 to unset
- *
- * Sets the minimum size of a widget; that is, the widget's size
- * request will be @width by @height. You can use this function to
- * force a widget to be either larger or smaller than it is. The
- * strange "usize" name dates from the early days of GTK+, and derives
- * from X Window System terminology. In many cases,
- * gtk_window_set_default_size() is a better choice for toplevel
- * windows than this function; setting the default size will still
- * allow users to shrink the window. Setting the usize will force them
- * to leave the window at least as large as the usize. When dealing
- * with window sizes, gtk_window_set_geometry_hints() can be a useful
- * function as well.
- * 
- * Note the inherent danger of setting any fixed size - themes,
- * translations into other languages, different fonts, and user action
- * can all change the appropriate size for a given widget. So, it's
- * basically impossible to hardcode a size that will always be
- * correct.
- * 
- * Deprecated: 2.2: Use gtk_widget_set_size_request() instead.
- **/
-void
-gtk_widget_set_usize (GtkWidget *widget,
-                     gint       width,
-                     gint       height)
-{
-  g_return_if_fail (GTK_IS_WIDGET (widget));
-  
-  gtk_widget_set_usize_internal (widget, width, height);
-}
-
 /**
  * gtk_widget_set_size_request:
  * @widget: a #GtkWidget
@@ -8020,6 +8595,11 @@ gtk_widget_set_usize (GtkWidget *widget,
  *
  * Widgets can't actually be allocated a size less than 1 by 1, but
  * you can pass 0,0 to this function to mean "as small as possible."
+ *
+ * The size request set here does not include any margin from the
+ * #GtkWidget properties margin-left, margin-right, margin-top, and
+ * margin-bottom, but it does include pretty much all other padding
+ * or border properties set by any subclass of #GtkWidget.
  **/
 void
 gtk_widget_set_size_request (GtkWidget *widget,
@@ -8042,15 +8622,15 @@ gtk_widget_set_size_request (GtkWidget *widget,
 /**
  * gtk_widget_get_size_request:
  * @widget: a #GtkWidget
- * @width: (allow-none): (out): return location for width, or %NULL
- * @height: (allow-none): (out): return location for height, or %NULL
+ * @width: (out) (allow-none): return location for width, or %NULL
+ * @height: (out) (allow-none): return location for height, or %NULL
  *
  * Gets the size request that was explicitly set for the widget using
  * gtk_widget_set_size_request(). A value of -1 stored in @width or
  * @height indicates that that dimension has not been set explicitly
  * and the natural requisition of the widget will be used intead. See
  * gtk_widget_set_size_request(). To get the size a widget will
- * actually use, call gtk_widget_size_request() instead of
+ * actually request, call gtk_size_request_get_preferred_size() instead of
  * this function.
  **/
 void
@@ -8058,17 +8638,17 @@ gtk_widget_get_size_request (GtkWidget *widget,
                              gint      *width,
                              gint      *height)
 {
-  GtkWidgetAuxInfo *aux_info;
+  const GtkWidgetAuxInfo *aux_info;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  aux_info = _gtk_widget_get_aux_info (widget, FALSE);
+  aux_info = _gtk_widget_get_aux_info_or_defaults (widget);
 
   if (width)
-    *width = aux_info ? aux_info->width : -1;
+    *width = aux_info->width;
 
   if (height)
-    *height = aux_info ? aux_info->height : -1;
+    *height = aux_info->height;
 }
 
 /**
@@ -8099,10 +8679,53 @@ gtk_widget_set_events (GtkWidget *widget,
   g_object_notify (G_OBJECT (widget), "events");
 }
 
+/**
+ * gtk_widget_set_device_events:
+ * @widget: a #GtkWidget
+ * @device: a #GdkDevice
+ * @events: event mask
+ *
+ * Sets the device event mask (see #GdkEventMask) for a widget. The event
+ * mask determines which events a widget will receive from @device. Keep
+ * in mind that different widgets have different default event masks, and by
+ * changing the event mask you may disrupt a widget's functionality,
+ * so be careful. This function must be called while a widget is
+ * unrealized. Consider gtk_widget_add_device_events() for widgets that are
+ * already realized, or if you want to preserve the existing event
+ * mask. This function can't be used with #GTK_NO_WINDOW widgets;
+ * to get events on those widgets, place them inside a #GtkEventBox
+ * and receive events on the event box.
+ *
+ * Since: 3.0
+ **/
+void
+gtk_widget_set_device_events (GtkWidget    *widget,
+                              GdkDevice    *device,
+                              GdkEventMask  events)
+{
+  GHashTable *device_events;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (GDK_IS_DEVICE (device));
+  g_return_if_fail (!gtk_widget_get_realized (widget));
+
+  device_events = g_object_get_qdata (G_OBJECT (widget), quark_device_event_mask);
+
+  if (G_UNLIKELY (!device_events))
+    {
+      device_events = g_hash_table_new (NULL, NULL);
+      g_object_set_qdata_full (G_OBJECT (widget), quark_device_event_mask, device_events,
+                               (GDestroyNotify) g_hash_table_unref);
+    }
+
+  g_hash_table_insert (device_events, device, GUINT_TO_POINTER (events));
+}
+
 static void
-gtk_widget_add_events_internal (GtkWidget *widget,
-                               gint       events,
-                               GList     *window_list)
+gtk_widget_add_events_internal_list (GtkWidget *widget,
+                                     GdkDevice *device,
+                                     gint       events,
+                                     GList     *window_list)
 {
   GList *l;
 
@@ -8113,18 +8736,39 @@ gtk_widget_add_events_internal (GtkWidget *widget,
 
       gdk_window_get_user_data (window, &user_data);
       if (user_data == widget)
-       {
-         GList *children;
+        {
+          GList *children;
 
-         gdk_window_set_events (window, gdk_window_get_events (window) | events);
+          if (device)
+            gdk_window_set_device_events (window, device, gdk_window_get_events (window) | events);
+          else
+            gdk_window_set_events (window, gdk_window_get_events (window) | events);
 
-         children = gdk_window_get_children (window);
-         gtk_widget_add_events_internal (widget, events, children);
-         g_list_free (children);
-       }
+          children = gdk_window_get_children (window);
+          gtk_widget_add_events_internal_list (widget, device, events, children);
+          g_list_free (children);
+        }
     }
 }
 
+static void
+gtk_widget_add_events_internal (GtkWidget *widget,
+                                GdkDevice *device,
+                                gint       events)
+{
+  GtkWidgetPrivate *priv = widget->priv;
+  GList *window_list;
+
+  if (!gtk_widget_get_has_window (widget))
+    window_list = gdk_window_get_children (priv->window);
+  else
+    window_list = g_list_prepend (NULL, priv->window);
+
+  gtk_widget_add_events_internal_list (widget, device, events, window_list);
+
+  g_list_free (window_list);
+}
+
 /**
  * gtk_widget_add_events:
  * @widget: a #GtkWidget
@@ -8146,19 +8790,50 @@ gtk_widget_add_events (GtkWidget *widget,
                       GINT_TO_POINTER (old_events | events));
 
   if (gtk_widget_get_realized (widget))
-    {
-      GList *window_list;
+    gtk_widget_add_events_internal (widget, NULL, events);
 
-      if (!gtk_widget_get_has_window (widget))
-       window_list = gdk_window_get_children (widget->window);
-      else
-       window_list = g_list_prepend (NULL, widget->window);
+  g_object_notify (G_OBJECT (widget), "events");
+}
+
+/**
+ * gtk_widget_add_device_events:
+ * @widget: a #GtkWidget
+ * @device: a #GdkDevice
+ * @events: an event mask, see #GdkEventMask
+ *
+ * Adds the device events in the bitfield @events to the event mask for
+ * @widget. See gtk_widget_set_device_events() for details.
+ *
+ * Since: 3.0
+ **/
+void
+gtk_widget_add_device_events (GtkWidget    *widget,
+                              GdkDevice    *device,
+                              GdkEventMask  events)
+{
+  GdkEventMask old_events;
+  GHashTable *device_events;
 
-      gtk_widget_add_events_internal (widget, events, window_list);
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (GDK_IS_DEVICE (device));
+
+  old_events = gtk_widget_get_device_events (widget, device);
 
-      g_list_free (window_list);
+  device_events = g_object_get_qdata (G_OBJECT (widget), quark_device_event_mask);
+
+  if (G_UNLIKELY (!device_events))
+    {
+      device_events = g_hash_table_new (NULL, NULL);
+      g_object_set_qdata_full (G_OBJECT (widget), quark_device_event_mask, device_events,
+                               (GDestroyNotify) g_hash_table_unref);
     }
 
+  g_hash_table_insert (device_events, device,
+                       GUINT_TO_POINTER (old_events | events));
+
+  if (gtk_widget_get_realized (widget))
+    gtk_widget_add_events_internal (widget, device, events);
+
   g_object_notify (G_OBJECT (widget), "events");
 }
 
@@ -8220,10 +8895,10 @@ GtkWidget*
 gtk_widget_get_toplevel (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
-  
-  while (widget->parent)
-    widget = widget->parent;
-  
+
+  while (widget->priv->parent)
+    widget = widget->priv->parent;
+
   return widget;
 }
 
@@ -8249,54 +8924,16 @@ gtk_widget_get_ancestor (GtkWidget *widget,
                         GType      widget_type)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
-  
+
   while (widget && !g_type_is_a (G_OBJECT_TYPE (widget), widget_type))
-    widget = widget->parent;
-  
+    widget = widget->priv->parent;
+
   if (!(widget && g_type_is_a (G_OBJECT_TYPE (widget), widget_type)))
     return NULL;
   
   return widget;
 }
 
-/**
- * gtk_widget_get_colormap:
- * @widget: a #GtkWidget
- * 
- * Gets the colormap that will be used to render @widget. No reference will
- * be added to the returned colormap; it should not be unreferenced.
- *
- * Return value: (transfer none): the colormap used by @widget
- **/
-GdkColormap*
-gtk_widget_get_colormap (GtkWidget *widget)
-{
-  GdkColormap *colormap;
-  GtkWidget *tmp_widget;
-  
-  g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
-  
-  if (widget->window)
-    {
-      colormap = gdk_drawable_get_colormap (widget->window);
-      /* If window was destroyed previously, we'll get NULL here */
-      if (colormap)
-       return colormap;
-    }
-
-  tmp_widget = widget;
-  while (tmp_widget)
-    {
-      colormap = g_object_get_qdata (G_OBJECT (tmp_widget), quark_colormap);
-      if (colormap)
-       return colormap;
-
-      tmp_widget= tmp_widget->parent;
-    }
-
-  return gdk_screen_get_default_colormap (gtk_widget_get_screen (widget));
-}
-
 /**
  * gtk_widget_get_visual:
  * @widget: a #GtkWidget
@@ -8308,9 +8945,21 @@ gtk_widget_get_colormap (GtkWidget *widget)
 GdkVisual*
 gtk_widget_get_visual (GtkWidget *widget)
 {
+  GtkWidget *w;
+
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
 
-  return gdk_colormap_get_visual (gtk_widget_get_colormap (widget));
+  for (w = widget; w != NULL; w = w->priv->parent)
+    {
+      if (gtk_widget_get_has_window (w) &&
+          w->priv->window)
+        return gdk_window_get_visual (w->priv->window);
+
+      if (GTK_IS_WINDOW (w))
+        return _gtk_window_get_visual (GTK_WINDOW (w));
+    }
+
+  return gdk_screen_get_system_visual (gdk_screen_get_default ());
 }
 
 /**
@@ -8335,47 +8984,50 @@ gtk_widget_get_settings (GtkWidget *widget)
 }
 
 /**
- * gtk_widget_set_colormap:
+ * gtk_widget_get_events:
  * @widget: a #GtkWidget
- * @colormap: a colormap
- *
- * Sets the colormap for the widget to the given value. Widget must not
- * have been previously realized. This probably should only be used
- * from an <function>init()</function> function (i.e. from the constructor 
- * for the widget).
+ * 
+ * Returns the event mask for the widget (a bitfield containing flags
+ * from the #GdkEventMask enumeration). These are the events that the widget
+ * will receive.
+ * 
+ * Return value: event mask for @widget
  **/
-void
-gtk_widget_set_colormap (GtkWidget   *widget,
-                         GdkColormap *colormap)
+gint
+gtk_widget_get_events (GtkWidget *widget)
 {
-  g_return_if_fail (GTK_IS_WIDGET (widget));
-  g_return_if_fail (!gtk_widget_get_realized (widget));
-  g_return_if_fail (GDK_IS_COLORMAP (colormap));
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
 
-  g_object_ref (colormap);
-  
-  g_object_set_qdata_full (G_OBJECT (widget), 
-                          quark_colormap,
-                          colormap,
-                          g_object_unref);
+  return GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (widget), quark_event_mask));
 }
 
 /**
- * gtk_widget_get_events:
+ * gtk_widget_get_device_events:
  * @widget: a #GtkWidget
- * 
- * Returns the event mask for the widget (a bitfield containing flags
- * from the #GdkEventMask enumeration). These are the events that the widget
- * will receive.
- * 
- * Return value: event mask for @widget
+ * @device: a #GdkDevice
+ *
+ * Returns the events mask for the widget corresponding to an specific device. These
+ * are the events that the widget will receive when @device operates on it.
+ *
+ * Returns: device event mask for @widget
+ *
+ * Since: 3.0
  **/
-gint
-gtk_widget_get_events (GtkWidget *widget)
+GdkEventMask
+gtk_widget_get_device_events (GtkWidget *widget,
+                              GdkDevice *device)
 {
+  GHashTable *device_events;
+
   g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
+  g_return_val_if_fail (GDK_IS_DEVICE (device), 0);
 
-  return GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (widget), quark_event_mask));
+  device_events = g_object_get_qdata (G_OBJECT (widget), quark_device_event_mask);
+
+  if (!device_events)
+    return 0;
+
+  return GPOINTER_TO_UINT (g_hash_table_lookup (device_events, device));
 }
 
 /**
@@ -8412,8 +9064,12 @@ gtk_widget_get_pointer (GtkWidget *widget,
                        gint      *x,
                        gint      *y)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
-  
+
+  priv = widget->priv;
+
   if (x)
     *x = -1;
   if (y)
@@ -8421,14 +9077,14 @@ gtk_widget_get_pointer (GtkWidget *widget,
   
   if (gtk_widget_get_realized (widget))
     {
-      gdk_window_get_pointer (widget->window, x, y, NULL);
-      
+      gdk_window_get_pointer (priv->window, x, y, NULL);
+
       if (!gtk_widget_get_has_window (widget))
        {
          if (x)
-           *x -= widget->allocation.x;
+           *x -= priv->allocation.x;
          if (y)
-           *y -= widget->allocation.y;
+           *y -= priv->allocation.y;
        }
     }
 }
@@ -8450,12 +9106,12 @@ gtk_widget_is_ancestor (GtkWidget *widget,
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
   g_return_val_if_fail (ancestor != NULL, FALSE);
-  
+
   while (widget)
     {
-      if (widget->parent == ancestor)
+      if (widget->priv->parent == ancestor)
        return TRUE;
-      widget = widget->parent;
+      widget = widget->priv->parent;
     }
   
   return FALSE;
@@ -8476,7 +9132,7 @@ gtk_widget_set_composite_name (GtkWidget   *widget,
                               const gchar *name)
 {
   g_return_if_fail (GTK_IS_WIDGET (widget));
-  g_return_if_fail ((GTK_OBJECT_FLAGS (widget) & GTK_COMPOSITE_CHILD) != 0);
+  g_return_if_fail (widget->priv->composite_child);
   g_return_if_fail (name != NULL);
 
   if (!quark_composite_name)
@@ -8501,10 +9157,14 @@ gtk_widget_set_composite_name (GtkWidget   *widget,
 gchar*
 gtk_widget_get_composite_name (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
 
-  if (((GTK_OBJECT_FLAGS (widget) & GTK_COMPOSITE_CHILD) != 0) && widget->parent)
-    return _gtk_container_child_composite_name (GTK_CONTAINER (widget->parent),
+  priv = widget->priv;
+
+  if (widget->priv->composite_child && priv->parent)
+    return _gtk_container_child_composite_name (GTK_CONTAINER (priv->parent),
                                               widget);
   else
     return NULL;
@@ -8551,79 +9211,6 @@ gtk_widget_pop_composite_child (void)
     composite_child_stack--;
 }
 
-/**
- * gtk_widget_push_colormap:
- * @cmap: a #GdkColormap
- *
- * Pushes @cmap onto a global stack of colormaps; the topmost
- * colormap on the stack will be used to create all widgets.
- * Remove @cmap with gtk_widget_pop_colormap(). There's little
- * reason to use this function.
- **/
-void
-gtk_widget_push_colormap (GdkColormap *cmap)
-{
-  g_return_if_fail (!cmap || GDK_IS_COLORMAP (cmap));
-
-  colormap_stack = g_slist_prepend (colormap_stack, cmap);
-}
-
-/**
- * gtk_widget_pop_colormap:
- *
- * Removes a colormap pushed with gtk_widget_push_colormap().
- **/
-void
-gtk_widget_pop_colormap (void)
-{
-  if (colormap_stack)
-    colormap_stack = g_slist_delete_link (colormap_stack, colormap_stack);
-}
-
-/**
- * gtk_widget_set_default_colormap:
- * @colormap: a #GdkColormap
- * 
- * Sets the default colormap to use when creating widgets.
- * gtk_widget_push_colormap() is a better function to use if
- * you only want to affect a few widgets, rather than all widgets.
- **/
-void
-gtk_widget_set_default_colormap (GdkColormap *colormap)
-{
-  g_return_if_fail (GDK_IS_COLORMAP (colormap));
-  
-  gdk_screen_set_default_colormap (gdk_colormap_get_screen (colormap),
-                                  colormap);
-}
-
-/**
- * gtk_widget_get_default_colormap:
- * 
- * Obtains the default colormap used to create widgets.
- *
- * Return value: (transfer none): default widget colormap
- **/
-GdkColormap*
-gtk_widget_get_default_colormap (void)
-{
-  return gdk_screen_get_default_colormap (gdk_screen_get_default ());
-}
-
-/**
- * gtk_widget_get_default_visual:
- * 
- * Obtains the visual of the default colormap. Not really useful;
- * used to be useful before gdk_colormap_get_visual() existed.
- *
- * Return value: (transfer none): visual of the default colormap
- **/
-GdkVisual*
-gtk_widget_get_default_visual (void)
-{
-  return gdk_colormap_get_visual (gtk_widget_get_default_colormap ());
-}
-
 static void
 gtk_widget_emit_direction_changed (GtkWidget        *widget,
                                   GtkTextDirection  old_dir)
@@ -8661,17 +9248,8 @@ gtk_widget_set_direction (GtkWidget        *widget,
   g_return_if_fail (dir >= GTK_TEXT_DIR_NONE && dir <= GTK_TEXT_DIR_RTL);
 
   old_dir = gtk_widget_get_direction (widget);
-  
-  if (dir == GTK_TEXT_DIR_NONE)
-    GTK_PRIVATE_UNSET_FLAG (widget, GTK_DIRECTION_SET);
-  else
-    {
-      GTK_PRIVATE_SET_FLAG (widget, GTK_DIRECTION_SET);
-      if (dir == GTK_TEXT_DIR_LTR)
-       GTK_PRIVATE_SET_FLAG (widget, GTK_DIRECTION_LTR);
-      else
-       GTK_PRIVATE_UNSET_FLAG (widget, GTK_DIRECTION_LTR);
-    }
+
+  widget->priv->direction = dir;
 
   if (old_dir != gtk_widget_get_direction (widget))
     gtk_widget_emit_direction_changed (widget, old_dir);
@@ -8691,10 +9269,10 @@ gtk_widget_get_direction (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_TEXT_DIR_LTR);
   
-  if (GTK_WIDGET_DIRECTION_SET (widget))
-    return GTK_WIDGET_DIRECTION_LTR (widget) ? GTK_TEXT_DIR_LTR : GTK_TEXT_DIR_RTL;
-  else
+  if (widget->priv->direction == GTK_TEXT_DIR_NONE)
     return gtk_default_direction;
+  else
+    return widget->priv->direction;
 }
 
 static void
@@ -8704,7 +9282,7 @@ gtk_widget_set_default_direction_recurse (GtkWidget *widget, gpointer data)
 
   g_object_ref (widget);
   
-  if (!GTK_WIDGET_DIRECTION_SET (widget))
+  if (widget->priv->direction == GTK_TEXT_DIR_NONE)
     gtk_widget_emit_direction_changed (widget, old_dir);
   
   if (GTK_IS_CONTAINER (widget))
@@ -8768,24 +9346,33 @@ static void
 gtk_widget_dispose (GObject *object)
 {
   GtkWidget *widget = GTK_WIDGET (object);
+  GtkWidgetPrivate *priv = widget->priv;
 
-  if (widget->parent)
-    gtk_container_remove (GTK_CONTAINER (widget->parent), widget);
+  if (priv->parent)
+    gtk_container_remove (GTK_CONTAINER (priv->parent), widget);
   else if (gtk_widget_get_visible (widget))
     gtk_widget_hide (widget);
 
-  GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
+  priv->visible = FALSE;
   if (gtk_widget_get_realized (widget))
     gtk_widget_unrealize (widget);
-  
+
+  if (!priv->in_destruction)
+    {
+      priv->in_destruction = TRUE;
+      g_signal_emit (object, widget_signals[DESTROY], 0);
+      priv->in_destruction = FALSE;
+    }
+
   G_OBJECT_CLASS (gtk_widget_parent_class)->dispose (object);
 }
 
 static void
-gtk_widget_real_destroy (GtkObject *object)
+gtk_widget_real_destroy (GtkWidget *object)
 {
   /* gtk_object_destroy() will already hold a refcount on object */
   GtkWidget *widget = GTK_WIDGET (object);
+  GtkWidgetPrivate *priv = widget->priv;
 
   /* wipe accelerator closures (keep order) */
   g_object_set_qdata (G_OBJECT (widget), quark_accel_path, NULL);
@@ -8793,29 +9380,28 @@ gtk_widget_real_destroy (GtkObject *object)
 
   /* Callers of add_mnemonic_label() should disconnect on ::destroy */
   g_object_set_qdata (G_OBJECT (widget), quark_mnemonic_labels, NULL);
-  
+
   gtk_grab_remove (widget);
-  
-  g_object_unref (widget->style);
-  widget->style = gtk_widget_get_default_style ();
-  g_object_ref (widget->style);
 
-  GTK_OBJECT_CLASS (gtk_widget_parent_class)->destroy (object);
+  g_object_unref (priv->style);
+  priv->style = gtk_widget_get_default_style ();
+  g_object_ref (priv->style);
 }
 
 static void
 gtk_widget_finalize (GObject *object)
 {
   GtkWidget *widget = GTK_WIDGET (object);
+  GtkWidgetPrivate *priv = widget->priv;
   GtkWidgetAuxInfo *aux_info;
   GtkAccessible *accessible;
   
   gtk_grab_remove (widget);
 
-  g_object_unref (widget->style);
-  widget->style = NULL;
+  g_object_unref (priv->style);
+  priv->style = NULL;
 
-  g_free (widget->name);
+  g_free (priv->name);
   
   aux_info =_gtk_widget_get_aux_info (widget, FALSE);
   if (aux_info)
@@ -8825,6 +9411,12 @@ gtk_widget_finalize (GObject *object)
   if (accessible)
     g_object_unref (accessible);
 
+  if (g_object_is_floating (object))
+    g_warning ("A floating object was finalized. This means that someone\n"
+               "called g_object_unref() on an object that had only a floating\n"
+               "reference; the initial floating reference is not owned by anyone\n"
+               "and must be removed with g_object_ref_sink().");
+
   G_OBJECT_CLASS (gtk_widget_parent_class)->finalize (object);
 }
 
@@ -8839,6 +9431,8 @@ gtk_widget_finalize (GObject *object)
 static void
 gtk_widget_real_map (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv = widget->priv;
+
   g_assert (gtk_widget_get_realized (widget));
   
   if (!gtk_widget_get_mapped (widget))
@@ -8846,7 +9440,7 @@ gtk_widget_real_map (GtkWidget *widget)
       gtk_widget_set_mapped (widget, TRUE);
       
       if (gtk_widget_get_has_window (widget))
-       gdk_window_show (widget->window);
+       gdk_window_show (priv->window);
     }
 }
 
@@ -8861,12 +9455,14 @@ gtk_widget_real_map (GtkWidget *widget)
 static void
 gtk_widget_real_unmap (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv = widget->priv;
+
   if (gtk_widget_get_mapped (widget))
     {
       gtk_widget_set_mapped (widget, FALSE);
 
       if (gtk_widget_get_has_window (widget))
-       gdk_window_hide (widget->window);
+       gdk_window_hide (priv->window);
     }
 }
 
@@ -8881,15 +9477,17 @@ gtk_widget_real_unmap (GtkWidget *widget)
 static void
 gtk_widget_real_realize (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv = widget->priv;
+
   g_assert (!gtk_widget_get_has_window (widget));
   
   gtk_widget_set_realized (widget, TRUE);
-  if (widget->parent)
+  if (priv->parent)
     {
-      widget->window = gtk_widget_get_parent_window (widget);
-      g_object_ref (widget->window);
+      priv->window = gtk_widget_get_parent_window (widget);
+      g_object_ref (priv->window);
     }
-  widget->style = gtk_style_attach (widget->style, widget->window);
+  priv->style = gtk_style_attach (priv->style, priv->window);
 }
 
 /*****************************************
@@ -8903,6 +9501,8 @@ gtk_widget_real_realize (GtkWidget *widget)
 static void
 gtk_widget_real_unrealize (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv = widget->priv;
+
   if (gtk_widget_get_mapped (widget))
     gtk_widget_real_unmap (widget);
 
@@ -8922,17 +9522,17 @@ gtk_widget_real_unrealize (GtkWidget *widget)
                          (GtkCallback) gtk_widget_unrealize,
                          NULL);
 
-  gtk_style_detach (widget->style);
+  gtk_style_detach (priv->style);
   if (gtk_widget_get_has_window (widget))
     {
-      gdk_window_set_user_data (widget->window, NULL);
-      gdk_window_destroy (widget->window);
-      widget->window = NULL;
+      gdk_window_set_user_data (priv->window, NULL);
+      gdk_window_destroy (priv->window);
+      priv->window = NULL;
     }
   else
     {
-      g_object_unref (widget->window);
-      widget->window = NULL;
+      g_object_unref (priv->window);
+      priv->window = NULL;
     }
 
   gtk_selection_remove_all (widget);
@@ -8944,79 +9544,216 @@ static void
 gtk_widget_real_size_request (GtkWidget         *widget,
                              GtkRequisition    *requisition)
 {
-  requisition->width = widget->requisition.width;
-  requisition->height = widget->requisition.height;
+  requisition->width  = 0;
+  requisition->height = 0;
+}
+
+static void
+gtk_widget_real_adjust_size_request (GtkWidget         *widget,
+                                     GtkOrientation     orientation,
+                                     gint               for_size,
+                                     gint              *minimum_size,
+                                     gint              *natural_size)
+{
+  const GtkWidgetAuxInfo *aux_info;
+
+  aux_info =_gtk_widget_get_aux_info_or_defaults (widget);
+
+  if (orientation == GTK_ORIENTATION_HORIZONTAL &&
+      aux_info->width > 0)
+    {
+      *minimum_size = MAX (*minimum_size, aux_info->width);
+    }
+  else if (orientation == GTK_ORIENTATION_VERTICAL &&
+           aux_info->height > 0)
+    {
+      *minimum_size = MAX (*minimum_size, aux_info->height);
+    }
+
+  /* Fix it if set_size_request made natural size smaller than min size.
+   * This would also silently fix broken widgets, but we warn about them
+   * in gtksizerequest.c when calling their size request vfuncs.
+   */
+  *natural_size = MAX (*natural_size, *minimum_size);
+
+  if (orientation == GTK_ORIENTATION_HORIZONTAL)
+    {
+      *minimum_size += (aux_info->margin.left + aux_info->margin.right);
+      *natural_size += (aux_info->margin.left + aux_info->margin.right);
+    }
+  else
+    {
+      *minimum_size += (aux_info->margin.top + aux_info->margin.bottom);
+      *natural_size += (aux_info->margin.top + aux_info->margin.bottom);
+    }
 }
 
 /**
- * _gtk_widget_peek_colormap:
+ * _gtk_widget_peek_request_cache:
  * 
- * Returns colormap currently pushed by gtk_widget_push_colormap, if any.
+ * Returns the address of the widget's request cache (strictly for
+ * internal use in gtksizerequest.c)
  * 
- * Return value: the currently pushed colormap, or %NULL if there is none.
+ * Return value: the address of @widget's size request cache.
  **/
-GdkColormap*
-_gtk_widget_peek_colormap (void)
+gpointer
+_gtk_widget_peek_request_cache (GtkWidget *widget)
 {
-  if (colormap_stack)
-    return (GdkColormap*) colormap_stack->data;
-  return NULL;
+  /* Don't bother slowing things down with the return_if_fail guards here */
+  return &widget->priv->requests;
 }
 
 /*
- * _gtk_widget_set_pointer_window:
+ * _gtk_widget_set_device_window:
  * @widget: a #GtkWidget.
- * @pointer_window: the new pointer window.
+ * @device: a #GdkDevice.
+ * @window: the new device window.
  *
- * Sets pointer window for @widget.  Does not ref @pointer_window.
+ * Sets pointer window for @widget and @device.  Does not ref @window.
  * Actually stores it on the #GdkScreen, but you don't need to know that.
  */
 void
-_gtk_widget_set_pointer_window (GtkWidget *widget,
-                                GdkWindow *pointer_window)
+_gtk_widget_set_device_window (GtkWidget *widget,
+                               GdkDevice *device,
+                               GdkWindow *window)
 {
+  GtkWidgetPrivate *priv;
+  GdkScreen *screen;
+  GHashTable *device_window;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (GDK_IS_DEVICE (device));
+  g_return_if_fail (!window || GDK_IS_WINDOW (window));
 
-  if (gtk_widget_get_realized (widget))
-    {
-      GdkScreen *screen = gdk_drawable_get_screen (widget->window);
+  priv = widget->priv;
+
+  if (!gtk_widget_get_realized (widget))
+    return;
 
-      g_object_set_qdata (G_OBJECT (screen), quark_pointer_window,
-                          pointer_window);
+  screen = gdk_window_get_screen (priv->window);
+  device_window = g_object_get_qdata (G_OBJECT (screen), quark_pointer_window);
+
+  if (G_UNLIKELY (!device_window))
+    {
+      device_window = g_hash_table_new (NULL, NULL);
+      g_object_set_qdata_full (G_OBJECT (screen),
+                               quark_pointer_window,
+                               device_window,
+                               (GDestroyNotify) g_hash_table_destroy);
     }
+
+  if (window)
+    g_hash_table_insert (device_window, device, window);
+  else
+    g_hash_table_remove (device_window, device);
 }
 
 /*
- * _gtk_widget_get_pointer_window:
+ * _gtk_widget_get_device_window:
  * @widget: a #GtkWidget.
+ * @device: a #GdkDevice.
  *
- * Return value: the pointer window set on the #GdkScreen @widget is attached
+ * Return value: the device window set on the #GdkScreen @widget is attached
  * to, or %NULL.
  */
 GdkWindow *
-_gtk_widget_get_pointer_window (GtkWidget *widget)
+_gtk_widget_get_device_window (GtkWidget *widget,
+                               GdkDevice *device)
 {
+  GtkWidgetPrivate *priv;
+  GdkScreen *screen;
+  GHashTable *device_window;
+  GdkWindow *window;
+  GtkWidget *w;
+
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+  g_return_val_if_fail (GDK_IS_DEVICE (device), NULL);
 
-  if (gtk_widget_get_realized (widget))
+  priv = widget->priv;
+
+  if (!gtk_widget_get_realized (widget))
+    return NULL;
+
+  screen = gdk_window_get_screen (priv->window);
+  device_window = g_object_get_qdata (G_OBJECT (screen), quark_pointer_window);
+
+  if (G_UNLIKELY (!device_window))
+    return NULL;
+
+  window = g_hash_table_lookup (device_window, device);
+
+  if (!window)
+    return NULL;
+
+  gdk_window_get_user_data (window, (gpointer *) &w);
+
+  if (widget != w)
+    return NULL;
+
+  return window;
+}
+
+/*
+ * _gtk_widget_list_devices:
+ * @widget: a #GtkWidget.
+ *
+ * Returns the list of #GdkDevices that is currently on top of any widget #GdkWindow.
+ * Free the list with g_list_free(), the elements are owned by GTK+ and must not
+ * be freed.
+ */
+GList *
+_gtk_widget_list_devices (GtkWidget *widget)
+{
+  GtkWidgetPrivate *priv;
+  GdkScreen *screen;
+  GHashTableIter iter;
+  GHashTable *device_window;
+  GList *devices = NULL;
+  gpointer key, value;
+
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+
+  priv = widget->priv;
+
+  if (!gtk_widget_get_realized (widget))
+    return NULL;
+
+  screen = gdk_window_get_screen (priv->window);
+  device_window = g_object_get_qdata (G_OBJECT (screen), quark_pointer_window);
+
+  if (G_UNLIKELY (!device_window))
+    return NULL;
+
+  g_hash_table_iter_init (&iter, device_window);
+
+  while (g_hash_table_iter_next (&iter, &key, &value))
     {
-      GdkScreen *screen = gdk_drawable_get_screen (widget->window);
+      GdkDevice *device = key;
+      GdkWindow *window = value;
+      GtkWidget *w;
 
-      return g_object_get_qdata (G_OBJECT (screen), quark_pointer_window);
+      if (window)
+        {
+          gdk_window_get_user_data (window, (gpointer *) &w);
+
+          if (widget == w)
+            devices = g_list_prepend (devices, device);
+        }
     }
 
-  return NULL;
+  return devices;
 }
 
 static void
-synth_crossing (GtkWidget      *widget,
-               GdkEventType    type,
-               GdkWindow      *window,
-               GdkCrossingMode mode,
-               GdkNotifyType   detail)
+synth_crossing (GtkWidget       *widget,
+                GdkEventType     type,
+                GdkWindow       *window,
+                GdkDevice       *device,
+                GdkCrossingMode  mode,
+                GdkNotifyType    detail)
 {
   GdkEvent *event;
-  
+
   event = gdk_event_new (type);
 
   event->crossing.window = g_object_ref (window);
@@ -9029,6 +9766,7 @@ synth_crossing (GtkWidget      *widget,
   event->crossing.detail = detail;
   event->crossing.focus = FALSE;
   event->crossing.state = 0;
+  gdk_event_set_device (event, device);
 
   if (!widget)
     widget = gtk_get_event_widget (event);
@@ -9039,32 +9777,6 @@ synth_crossing (GtkWidget      *widget,
   gdk_event_free (event);
 }
 
-/*
- * _gtk_widget_is_pointer_widget:
- * @widget: a #GtkWidget
- *
- * Returns %TRUE if the pointer window belongs to @widget.
- */
-gboolean
-_gtk_widget_is_pointer_widget (GtkWidget *widget)
-{
-  if (GTK_WIDGET_HAS_POINTER (widget))
-    {
-      GdkWindow *win;
-      GtkWidget *wid;
-
-      win = _gtk_widget_get_pointer_window (widget);
-      if (win)
-        {
-          gdk_window_get_user_data (win, (gpointer *)&wid);
-          if (wid == widget)
-            return TRUE;
-        }
-    }
-
-  return FALSE;
-}
-
 /*
  * _gtk_widget_synthesize_crossing:
  * @from: the #GtkWidget the virtual pointer is leaving.
@@ -9097,20 +9809,30 @@ _gtk_widget_is_pointer_widget (GtkWidget *widget)
  *   - enter notify on real pointer window, detail Ancestor
  */
 void
-_gtk_widget_synthesize_crossing (GtkWidget      *from,
-                                GtkWidget      *to,
-                                GdkCrossingMode mode)
+_gtk_widget_synthesize_crossing (GtkWidget       *from,
+                                GtkWidget       *to,
+                                 GdkDevice       *device,
+                                GdkCrossingMode  mode)
 {
   GdkWindow *from_window = NULL, *to_window = NULL;
 
   g_return_if_fail (from != NULL || to != NULL);
 
   if (from != NULL)
-    from_window = GTK_WIDGET_HAS_POINTER (from)
-      ? _gtk_widget_get_pointer_window (from) : from->window;
+    {
+      from_window = _gtk_widget_get_device_window (from, device);
+
+      if (!from_window)
+        from_window = from->priv->window;
+    }
+
   if (to != NULL)
-    to_window = GTK_WIDGET_HAS_POINTER (to)
-      ? _gtk_widget_get_pointer_window (to) : to->window;
+    {
+      to_window = _gtk_widget_get_device_window (to, device);
+
+      if (!to_window)
+        to_window = to->priv->window;
+    }
 
   if (from_window == NULL && to_window == NULL)
     ;
@@ -9128,11 +9850,11 @@ _gtk_widget_synthesize_crossing (GtkWidget      *from,
        }
 
       synth_crossing (from, GDK_LEAVE_NOTIFY, from_window,
-                     mode, GDK_NOTIFY_ANCESTOR);
+                     device, mode, GDK_NOTIFY_ANCESTOR);
       for (list = g_list_last (from_ancestors); list; list = list->prev)
        {
          synth_crossing (NULL, GDK_LEAVE_NOTIFY, (GdkWindow *) list->data,
-                         mode, GDK_NOTIFY_VIRTUAL);
+                         device, mode, GDK_NOTIFY_VIRTUAL);
        }
 
       /* XXX: enter/inferior on root window? */
@@ -9157,10 +9879,10 @@ _gtk_widget_synthesize_crossing (GtkWidget      *from,
       for (list = to_ancestors; list; list = list->next)
        {
          synth_crossing (NULL, GDK_ENTER_NOTIFY, (GdkWindow *) list->data,
-                         mode, GDK_NOTIFY_VIRTUAL);
+                         device, mode, GDK_NOTIFY_VIRTUAL);
        }
       synth_crossing (to, GDK_ENTER_NOTIFY, to_window,
-                     mode, GDK_NOTIFY_ANCESTOR);
+                     device, mode, GDK_NOTIFY_ANCESTOR);
 
       g_list_free (to_ancestors);
     }
@@ -9194,25 +9916,25 @@ _gtk_widget_synthesize_crossing (GtkWidget      *from,
        {
          if (mode != GDK_CROSSING_GTK_UNGRAB)
            synth_crossing (from, GDK_LEAVE_NOTIFY, from_window,
-                           mode, GDK_NOTIFY_INFERIOR);
+                           device, mode, GDK_NOTIFY_INFERIOR);
          for (list = to_ancestors; list; list = list->next)
            synth_crossing (NULL, GDK_ENTER_NOTIFY, (GdkWindow *) list->data, 
-                           mode, GDK_NOTIFY_VIRTUAL);
+                           device, mode, GDK_NOTIFY_VIRTUAL);
          synth_crossing (to, GDK_ENTER_NOTIFY, to_window,
-                         mode, GDK_NOTIFY_ANCESTOR);
+                         device, mode, GDK_NOTIFY_ANCESTOR);
        }
       else if (from_ancestor == to_window)
        {
          synth_crossing (from, GDK_LEAVE_NOTIFY, from_window,
-                         mode, GDK_NOTIFY_ANCESTOR);
+                         device, mode, GDK_NOTIFY_ANCESTOR);
          for (list = g_list_last (from_ancestors); list; list = list->prev)
            {
              synth_crossing (NULL, GDK_LEAVE_NOTIFY, (GdkWindow *) list->data,
-                             mode, GDK_NOTIFY_VIRTUAL);
+                             device, mode, GDK_NOTIFY_VIRTUAL);
            }
          if (mode != GDK_CROSSING_GTK_GRAB)
            synth_crossing (to, GDK_ENTER_NOTIFY, to_window,
-                           mode, GDK_NOTIFY_INFERIOR);
+                           device, mode, GDK_NOTIFY_INFERIOR);
        }
       else
        {
@@ -9225,20 +9947,20 @@ _gtk_widget_synthesize_crossing (GtkWidget      *from,
            }
 
          synth_crossing (from, GDK_LEAVE_NOTIFY, from_window,
-                         mode, GDK_NOTIFY_NONLINEAR);
+                         device, mode, GDK_NOTIFY_NONLINEAR);
 
          for (list = g_list_last (from_ancestors); list; list = list->prev)
            {
              synth_crossing (NULL, GDK_LEAVE_NOTIFY, (GdkWindow *) list->data,
-                             mode, GDK_NOTIFY_NONLINEAR_VIRTUAL);
+                             device, mode, GDK_NOTIFY_NONLINEAR_VIRTUAL);
            }
          for (list = to_ancestors; list; list = list->next)
            {
              synth_crossing (NULL, GDK_ENTER_NOTIFY, (GdkWindow *) list->data,
-                             mode, GDK_NOTIFY_NONLINEAR_VIRTUAL);
+                             device, mode, GDK_NOTIFY_NONLINEAR_VIRTUAL);
            }
          synth_crossing (to, GDK_ENTER_NOTIFY, to_window,
-                         mode, GDK_NOTIFY_NONLINEAR);
+                         device, mode, GDK_NOTIFY_NONLINEAR);
        }
       g_list_free (from_ancestors);
       g_list_free (to_ancestors);
@@ -9249,36 +9971,34 @@ static void
 gtk_widget_propagate_state (GtkWidget           *widget,
                            GtkStateData        *data)
 {
+  GtkWidgetPrivate *priv = widget->priv;
   guint8 old_state = gtk_widget_get_state (widget);
-  guint8 old_saved_state = widget->saved_state;
+  guint8 old_saved_state = priv->saved_state;
 
   /* don't call this function with state==GTK_STATE_INSENSITIVE,
    * parent_sensitive==TRUE on a sensitive widget
    */
 
 
-  if (data->parent_sensitive)
-    GTK_OBJECT_FLAGS (widget) |= GTK_PARENT_SENSITIVE;
-  else
-    GTK_OBJECT_FLAGS (widget) &= ~(GTK_PARENT_SENSITIVE);
+  priv->parent_sensitive = data->parent_sensitive;
 
   if (gtk_widget_is_sensitive (widget))
     {
       if (data->state_restoration)
-        widget->state = widget->saved_state;
+        priv->state = priv->saved_state;
       else
-        widget->state = data->state;
+        priv->state = data->state;
     }
   else
     {
       if (!data->state_restoration)
        {
          if (data->state != GTK_STATE_INSENSITIVE)
-           widget->saved_state = data->state;
+           priv->saved_state = data->state;
        }
       else if (gtk_widget_get_state (widget) != GTK_STATE_INSENSITIVE)
-       widget->saved_state = gtk_widget_get_state (widget);
-      widget->state = GTK_STATE_INSENSITIVE;
+       priv->saved_state = gtk_widget_get_state (widget);
+      priv->state = GTK_STATE_INSENSITIVE;
     }
 
   if (gtk_widget_is_focus (widget) && !gtk_widget_is_sensitive (widget))
@@ -9291,7 +10011,7 @@ gtk_widget_propagate_state (GtkWidget           *widget,
     }
 
   if (old_state != gtk_widget_get_state (widget) ||
-      old_saved_state != widget->saved_state)
+      old_saved_state != priv->saved_state)
     {
       g_object_ref (widget);
 
@@ -9300,15 +10020,41 @@ gtk_widget_propagate_state (GtkWidget           *widget,
 
       g_signal_emit (widget, widget_signals[STATE_CHANGED], 0, old_state);
 
-      if (GTK_WIDGET_HAS_POINTER (widget) && !GTK_WIDGET_SHADOWED (widget))
-       {
-         if (!gtk_widget_is_sensitive (widget))
-           _gtk_widget_synthesize_crossing (widget, NULL, 
-                                            GDK_CROSSING_STATE_CHANGED);
-         else if (old_state == GTK_STATE_INSENSITIVE)
-           _gtk_widget_synthesize_crossing (NULL, widget, 
-                                            GDK_CROSSING_STATE_CHANGED);
-       }
+      if (!priv->shadowed)
+        {
+          GList *event_windows = NULL;
+          GList *devices, *d;
+
+          devices = _gtk_widget_list_devices (widget);
+
+          for (d = devices; d; d = d->next)
+            {
+              GdkWindow *window;
+              GdkDevice *device;
+
+              device = d->data;
+              window = _gtk_widget_get_device_window (widget, device);
+
+              /* Do not propagate more than once to the
+               * same window if non-multidevice aware.
+               */
+              if (!gdk_window_get_support_multidevice (window) &&
+                  g_list_find (event_windows, window))
+                continue;
+
+              if (!gtk_widget_is_sensitive (widget))
+                _gtk_widget_synthesize_crossing (widget, NULL, d->data,
+                                                 GDK_CROSSING_STATE_CHANGED);
+              else if (old_state == GTK_STATE_INSENSITIVE)
+                _gtk_widget_synthesize_crossing (NULL, widget, d->data,
+                                                 GDK_CROSSING_STATE_CHANGED);
+
+              event_windows = g_list_prepend (event_windows, window);
+            }
+
+          g_list_free (event_windows);
+          g_list_free (devices);
+        }
 
       if (GTK_IS_CONTAINER (widget))
        {
@@ -9326,6 +10072,13 @@ gtk_widget_propagate_state (GtkWidget           *widget,
     }
 }
 
+static const GtkWidgetAuxInfo default_aux_info = {
+  -1, -1,
+  GTK_ALIGN_FILL,
+  GTK_ALIGN_FILL,
+  { 0, 0, 0, 0 }
+};
+
 /*
  * _gtk_widget_get_aux_info:
  * @widget: a #GtkWidget
@@ -9347,8 +10100,7 @@ _gtk_widget_get_aux_info (GtkWidget *widget,
     {
       aux_info = g_slice_new0 (GtkWidgetAuxInfo);
 
-      aux_info->width = -1;
-      aux_info->height = -1;
+      *aux_info = default_aux_info;
 
       g_object_set_qdata (G_OBJECT (widget), quark_aux_info, aux_info);
     }
@@ -9356,6 +10108,21 @@ _gtk_widget_get_aux_info (GtkWidget *widget,
   return aux_info;
 }
 
+static const GtkWidgetAuxInfo*
+_gtk_widget_get_aux_info_or_defaults (GtkWidget *widget)
+{
+  GtkWidgetAuxInfo *aux_info;
+
+  aux_info = _gtk_widget_get_aux_info (widget, FALSE);
+  if (aux_info == NULL)
+    {
+      return &default_aux_info;
+    }
+  else
+    {
+      return aux_info;
+    }
+}
 
 /*****************************************
  * gtk_widget_aux_info_destroy:
@@ -9371,115 +10138,95 @@ gtk_widget_aux_info_destroy (GtkWidgetAuxInfo *aux_info)
   g_slice_free (GtkWidgetAuxInfo, aux_info);
 }
 
-static void
-gtk_widget_shape_info_destroy (GtkWidgetShapeInfo *info)
-{
-  g_object_unref (info->shape_mask);
-  g_slice_free (GtkWidgetShapeInfo, info);
-}
-
 /**
- * gtk_widget_shape_combine_mask
+ * gtk_widget_shape_combine_region
  * @widget: a #GtkWidget
- * @shape_mask: (allow-none): shape to be added, or %NULL to remove an existing shape
- * @offset_x: X position of shape mask with respect to @window
- * @offset_y: Y position of shape mask with respect to @window
+ * @region: (allow-none): shape to be added, or %NULL to remove an existing shape
  * 
  * Sets a shape for this widget's GDK window. This allows for
- * transparent windows etc., see gdk_window_shape_combine_mask()
+ * transparent windows etc., see gdk_window_shape_combine_region()
  * for more information.
+ *
+ * Since: 3.0
  **/
 void
-gtk_widget_shape_combine_mask (GtkWidget *widget,
-                              GdkBitmap *shape_mask,
-                              gint       offset_x,
-                              gint       offset_y)
+gtk_widget_shape_combine_region (GtkWidget *widget,
+                                 cairo_region_t *region)
 {
-  GtkWidgetShapeInfo* shape_info;
+  GtkWidgetPrivate *priv;
   
   g_return_if_fail (GTK_IS_WIDGET (widget));
   /*  set_shape doesn't work on widgets without gdk window */
   g_return_if_fail (gtk_widget_get_has_window (widget));
 
-  if (!shape_mask)
+  priv = widget->priv;
+
+  if (region == NULL)
     {
-      GTK_PRIVATE_UNSET_FLAG (widget, GTK_HAS_SHAPE_MASK);
-      
-      if (widget->window)
-       gdk_window_shape_combine_mask (widget->window, NULL, 0, 0);
+      priv->has_shape_mask = FALSE;
+
+      if (priv->window)
+       gdk_window_shape_combine_region (priv->window, NULL, 0, 0);
       
       g_object_set_qdata (G_OBJECT (widget), quark_shape_info, NULL);
     }
   else
     {
-      GTK_PRIVATE_SET_FLAG (widget, GTK_HAS_SHAPE_MASK);
+      priv->has_shape_mask = TRUE;
       
-      shape_info = g_slice_new (GtkWidgetShapeInfo);
-      g_object_set_qdata_full (G_OBJECT (widget), quark_shape_info, shape_info,
-                              (GDestroyNotify) gtk_widget_shape_info_destroy);
-      
-      shape_info->shape_mask = g_object_ref (shape_mask);
-      shape_info->offset_x = offset_x;
-      shape_info->offset_y = offset_y;
+      g_object_set_qdata_full (G_OBJECT (widget), quark_shape_info,
+                               cairo_region_copy (region),
+                              (GDestroyNotify) cairo_region_destroy);
       
       /* set shape if widget has a gdk window already.
        * otherwise the shape is scheduled to be set by gtk_widget_realize().
        */
-      if (widget->window)
-       gdk_window_shape_combine_mask (widget->window, shape_mask,
-                                      offset_x, offset_y);
+      if (priv->window)
+       gdk_window_shape_combine_region (priv->window, region, 0, 0);
     }
 }
 
 /**
- * gtk_widget_input_shape_combine_mask:
+ * gtk_widget_input_shape_combine_region:
  * @widget: a #GtkWidget
- * @shape_mask: (allow-none): shape to be added, or %NULL to remove an existing shape
- * @offset_x: X position of shape mask with respect to @window
- * @offset_y: Y position of shape mask with respect to @window
+ * @region: (allow-none): shape to be added, or %NULL to remove an existing shape
  *
  * Sets an input shape for this widget's GDK window. This allows for
  * windows which react to mouse click in a nonrectangular region, see 
- * gdk_window_input_shape_combine_mask() for more information.
+ * gdk_window_input_shape_combine_region() for more information.
  *
- * Since: 2.10
+ * Since: 3.0
  **/
 void
-gtk_widget_input_shape_combine_mask (GtkWidget *widget,
-                                    GdkBitmap *shape_mask,
-                                    gint       offset_x,
-                                    gint       offset_y)
+gtk_widget_input_shape_combine_region (GtkWidget *widget,
+                                       cairo_region_t *region)
 {
-  GtkWidgetShapeInfo* shape_info;
+  GtkWidgetPrivate *priv;
   
   g_return_if_fail (GTK_IS_WIDGET (widget));
   /*  set_shape doesn't work on widgets without gdk window */
   g_return_if_fail (gtk_widget_get_has_window (widget));
 
-  if (!shape_mask)
+  priv = widget->priv;
+
+  if (region == NULL)
     {
-      if (widget->window)
-       gdk_window_input_shape_combine_mask (widget->window, NULL, 0, 0);
+      if (priv->window)
+       gdk_window_input_shape_combine_region (priv->window, NULL, 0, 0);
       
       g_object_set_qdata (G_OBJECT (widget), quark_input_shape_info, NULL);
     }
   else
     {
-      shape_info = g_slice_new (GtkWidgetShapeInfo);
       g_object_set_qdata_full (G_OBJECT (widget), quark_input_shape_info, 
-                              shape_info,
-                              (GDestroyNotify) gtk_widget_shape_info_destroy);
-      
-      shape_info->shape_mask = g_object_ref (shape_mask);
-      shape_info->offset_x = offset_x;
-      shape_info->offset_y = offset_y;
+                              cairo_region_copy (region),
+                              (GDestroyNotify) cairo_region_destroy);
       
       /* set shape if widget has a gdk window already.
        * otherwise the shape is scheduled to be set by gtk_widget_realize().
        */
-      if (widget->window)
-       gdk_window_input_shape_combine_mask (widget->window, shape_mask,
-                                            offset_x, offset_y);
+      if (priv->window)
+       gdk_window_input_shape_combine_region (priv->window, region, 0, 0);
     }
 }
 
@@ -9495,7 +10242,7 @@ gtk_reset_shapes_recurse (GtkWidget *widget,
   if (data != widget)
     return;
 
-  gdk_window_shape_combine_mask (window, NULL, 0, 0);
+  gdk_window_shape_combine_region (window, NULL, 0, 0);
   for (list = gdk_window_peek_children (window); list; list = list->next)
     gtk_reset_shapes_recurse (widget, list->data);
 }
@@ -9509,305 +10256,49 @@ gtk_reset_shapes_recurse (GtkWidget *widget,
 void
 gtk_widget_reset_shapes (GtkWidget *widget)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (gtk_widget_get_realized (widget));
 
-  if (!GTK_WIDGET_HAS_SHAPE_MASK (widget))
-    gtk_reset_shapes_recurse (widget, widget->window);
+  priv = widget->priv;
+
+  if (!priv->has_shape_mask)
+    gtk_reset_shapes_recurse (widget, priv->window);
 }
 
+/* style properties
+ */
+
 /**
- * gtk_widget_ref:
- * @widget: a #GtkWidget
- * 
- * Adds a reference to a widget. This function is exactly the same
- * as calling g_object_ref(), and exists mostly for historical
- * reasons. It can still be convenient to avoid casting a widget
- * to a #GObject, it saves a small amount of typing.
+ * gtk_widget_class_install_style_property_parser:
+ * @klass: a #GtkWidgetClass
+ * @pspec: the #GParamSpec for the style property
+ * @parser: the parser for the style property
  * 
- * Return value: the widget that was referenced
- *
- * Deprecated: 2.12: Use g_object_ref() instead.
+ * Installs a style property on a widget class. 
  **/
-GtkWidget*
-gtk_widget_ref (GtkWidget *widget)
+void
+gtk_widget_class_install_style_property_parser (GtkWidgetClass     *klass,
+                                               GParamSpec         *pspec,
+                                               GtkRcPropertyParser parser)
 {
-  g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+  g_return_if_fail (GTK_IS_WIDGET_CLASS (klass));
+  g_return_if_fail (G_IS_PARAM_SPEC (pspec));
+  g_return_if_fail (pspec->flags & G_PARAM_READABLE);
+  g_return_if_fail (!(pspec->flags & (G_PARAM_CONSTRUCT_ONLY | G_PARAM_CONSTRUCT)));
+  
+  if (g_param_spec_pool_lookup (style_property_spec_pool, pspec->name, G_OBJECT_CLASS_TYPE (klass), FALSE))
+    {
+      g_warning (G_STRLOC ": class `%s' already contains a style property named `%s'",
+                G_OBJECT_CLASS_NAME (klass),
+                pspec->name);
+      return;
+    }
 
-  return (GtkWidget*) g_object_ref ((GObject*) widget);
-}
-
-/**
- * gtk_widget_unref:
- * @widget: a #GtkWidget
- *
- * Inverse of gtk_widget_ref(). Equivalent to g_object_unref().
- * 
- * Deprecated: 2.12: Use g_object_unref() instead.
- **/
-void
-gtk_widget_unref (GtkWidget *widget)
-{
-  g_return_if_fail (GTK_IS_WIDGET (widget));
-
-  g_object_unref ((GObject*) widget);
-}
-
-static void
-expose_window (GdkWindow *window)
-{
-  GdkEvent event;
-  GList *l, *children;
-  gpointer user_data;
-  gboolean is_double_buffered;
-
-  gdk_window_get_user_data (window, &user_data);
-
-  if (user_data)
-    is_double_buffered = gtk_widget_get_double_buffered (GTK_WIDGET (user_data));
-  else
-    is_double_buffered = FALSE;
-  
-  event.expose.type = GDK_EXPOSE;
-  event.expose.window = g_object_ref (window);
-  event.expose.send_event = FALSE;
-  event.expose.count = 0;
-  event.expose.area.x = 0;
-  event.expose.area.y = 0;
-  gdk_drawable_get_size (GDK_DRAWABLE (window),
-                        &event.expose.area.width,
-                        &event.expose.area.height);
-  event.expose.region = gdk_region_rectangle (&event.expose.area);
-
-  /* If this is not double buffered, force a double buffer so that
-     redirection works. */
-  if (!is_double_buffered)
-    gdk_window_begin_paint_region (window, event.expose.region);
-  
-  gtk_main_do_event (&event);
-
-  if (!is_double_buffered)
-    gdk_window_end_paint (window);
-  
-  children = gdk_window_peek_children (window);
-  for (l = children; l != NULL; l = l->next)
-    {
-      GdkWindow *child = l->data;
-
-      /* Don't expose input-only windows */
-      if (gdk_drawable_get_depth (GDK_DRAWABLE (child)) != 0)
-       expose_window (l->data);
-    }
-  
-  g_object_unref (window);
-}
-
-/**
- * gtk_widget_get_snapshot:
- * @widget:    a #GtkWidget
- * @clip_rect: (allow-none): a #GdkRectangle or %NULL
- *
- * Create a #GdkPixmap of the contents of the widget and its children.
- *
- * Works even if the widget is obscured. The depth and visual of the
- * resulting pixmap is dependent on the widget being snapshot and likely
- * differs from those of a target widget displaying the pixmap.
- * The function gdk_pixbuf_get_from_drawable() can be used to convert
- * the pixmap to a visual independant representation.
- *
- * The snapshot area used by this function is the @widget's allocation plus
- * any extra space occupied by additional windows belonging to this widget
- * (such as the arrows of a spin button).
- * Thus, the resulting snapshot pixmap is possibly larger than the allocation.
- * 
- * If @clip_rect is non-%NULL, the resulting pixmap is shrunken to
- * match the specified clip_rect. The (x,y) coordinates of @clip_rect are
- * interpreted widget relative. If width or height of @clip_rect are 0 or
- * negative, the width or height of the resulting pixmap will be shrunken
- * by the respective amount.
- * For instance a @clip_rect <literal>{ +5, +5, -10, -10 }</literal> will
- * chop off 5 pixels at each side of the snapshot pixmap.
- * If non-%NULL, @clip_rect will contain the exact widget-relative snapshot
- * coordinates upon return. A @clip_rect of <literal>{ -1, -1, 0, 0 }</literal>
- * can be used to preserve the auto-grown snapshot area and use @clip_rect
- * as a pure output parameter.
- *
- * The returned pixmap can be %NULL, if the resulting @clip_area was empty.
- *
- * Return value: #GdkPixmap snapshot of the widget
- * 
- * Since: 2.14
- **/
-GdkPixmap*
-gtk_widget_get_snapshot (GtkWidget    *widget,
-                         GdkRectangle *clip_rect)
-{
-  int x, y, width, height;
-  GdkWindow *parent_window = NULL;
-  GdkPixmap *pixmap;
-  GList *windows = NULL, *list;
-
-  g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
-  if (!gtk_widget_get_visible (widget))
-    return NULL;
-
-  /* the widget (and parent_window) must be realized to be drawable */
-  if (widget->parent && !gtk_widget_get_realized (widget->parent))
-    gtk_widget_realize (widget->parent);
-  if (!gtk_widget_get_realized (widget))
-    gtk_widget_realize (widget);
-
-  /* determine snapshot rectangle */
-  x = widget->allocation.x;
-  y = widget->allocation.y;
-  width = widget->allocation.width;
-  height = widget->allocation.height;
-
-  if (widget->parent && gtk_widget_get_has_window (widget))
-    {
-      /* grow snapshot rectangle to cover all widget windows */
-      parent_window = gtk_widget_get_parent_window (widget);
-      for (list = gdk_window_peek_children (parent_window); list; list = list->next)
-        {
-          GdkWindow *subwin = list->data;
-          gpointer windata;
-          int wx, wy, ww, wh;
-          gdk_window_get_user_data (subwin, &windata);
-          if (windata != widget)
-            continue;
-          windows = g_list_prepend (windows, subwin);
-          gdk_window_get_position (subwin, &wx, &wy);
-          gdk_drawable_get_size (subwin, &ww, &wh);
-          /* grow snapshot rectangle by extra widget sub window */
-          if (wx < x)
-            {
-              width += x - wx;
-              x = wx;
-            }
-          if (wy < y)
-            {
-              height += y - wy;
-              y = wy;
-            }
-          if (x + width < wx + ww)
-            width += wx + ww - (x + width);
-          if (y + height < wy + wh)
-            height += wy + wh - (y + height);
-        }
-    }
-  else if (!widget->parent)
-    x = y = 0; /* toplevel */
-
-  /* at this point, (x,y,width,height) is the parent_window relative
-   * snapshot area covering all of widget's windows.
-   */
-
-  /* shrink snapshot size by clip_rectangle */
-  if (clip_rect)
-    {
-      GdkRectangle snap = { x, y, width, height }, clip = *clip_rect;
-      clip.x = clip.x < 0 ? x : clip.x;
-      clip.y = clip.y < 0 ? y : clip.y;
-      clip.width = clip.width <= 0 ? MAX (0, width + clip.width) : clip.width;
-      clip.height = clip.height <= 0 ? MAX (0, height + clip.height) : clip.height;
-      if (widget->parent)
-        {
-          /* offset clip_rect, so it's parent_window relative */
-          if (clip_rect->x >= 0)
-            clip.x += widget->allocation.x;
-          if (clip_rect->y >= 0)
-            clip.y += widget->allocation.y;
-        }
-      if (!gdk_rectangle_intersect (&snap, &clip, &snap))
-        {
-          g_list_free (windows);
-          clip_rect->width = clip_rect->height = 0;
-          return NULL; /* empty snapshot area */
-        }
-      x = snap.x;
-      y = snap.y;
-      width = snap.width;
-      height = snap.height;
-    }
-
-  /* render snapshot */
-  pixmap = gdk_pixmap_new (widget->window, width, height, gdk_drawable_get_depth (widget->window));
-  for (list = windows; list; list = list->next) /* !NO_WINDOW widgets */
-    {
-      GdkWindow *subwin = list->data;
-      int wx, wy;
-      if (gdk_drawable_get_depth (GDK_DRAWABLE (subwin)) == 0)
-       continue; /* Input only window */
-      gdk_window_get_position (subwin, &wx, &wy);
-      gdk_window_redirect_to_drawable (subwin, pixmap, MAX (0, x - wx), MAX (0, y - wy),
-                                       MAX (0, wx - x), MAX (0, wy - y), width, height);
-
-      expose_window (subwin);
-    }
-  if (!windows) /* NO_WINDOW || toplevel => parent_window == NULL || parent_window == widget->window */
-    {
-      gdk_window_redirect_to_drawable (widget->window, pixmap, x, y, 0, 0, width, height);
-      expose_window (widget->window);
-    }
-  for (list = windows; list; list = list->next)
-    gdk_window_remove_redirection (list->data);
-  if (!windows) /* NO_WINDOW || toplevel */
-    gdk_window_remove_redirection (widget->window);
-  g_list_free (windows);
-
-  /* return pixmap and snapshot rectangle coordinates */
-  if (clip_rect)
-    {
-      clip_rect->x = x;
-      clip_rect->y = y;
-      clip_rect->width = width;
-      clip_rect->height = height;
-      if (widget->parent)
-        {
-          /* offset clip_rect from parent_window so it's widget relative */
-          clip_rect->x -= widget->allocation.x;
-          clip_rect->y -= widget->allocation.y;
-        }
-      if (0)
-        g_printerr ("gtk_widget_get_snapshot: %s (%d,%d, %dx%d)\n",
-                    G_OBJECT_TYPE_NAME (widget),
-                    clip_rect->x, clip_rect->y, clip_rect->width, clip_rect->height);
-    }
-  return pixmap;
-}
-
-/* style properties
- */
-
-/**
- * gtk_widget_class_install_style_property_parser:
- * @klass: a #GtkWidgetClass
- * @pspec: the #GParamSpec for the style property
- * @parser: the parser for the style property
- * 
- * Installs a style property on a widget class. 
- **/
-void
-gtk_widget_class_install_style_property_parser (GtkWidgetClass     *klass,
-                                               GParamSpec         *pspec,
-                                               GtkRcPropertyParser parser)
-{
-  g_return_if_fail (GTK_IS_WIDGET_CLASS (klass));
-  g_return_if_fail (G_IS_PARAM_SPEC (pspec));
-  g_return_if_fail (pspec->flags & G_PARAM_READABLE);
-  g_return_if_fail (!(pspec->flags & (G_PARAM_CONSTRUCT_ONLY | G_PARAM_CONSTRUCT)));
-  
-  if (g_param_spec_pool_lookup (style_property_spec_pool, pspec->name, G_OBJECT_CLASS_TYPE (klass), FALSE))
-    {
-      g_warning (G_STRLOC ": class `%s' already contains a style property named `%s'",
-                G_OBJECT_CLASS_NAME (klass),
-                pspec->name);
-      return;
-    }
-
-  g_param_spec_ref_sink (pspec);
-  g_param_spec_set_qdata (pspec, quark_property_parser, (gpointer) parser);
-  g_param_spec_pool_insert (style_property_spec_pool, pspec, G_OBJECT_CLASS_TYPE (klass));
+  g_param_spec_ref_sink (pspec);
+  g_param_spec_set_qdata (pspec, quark_property_parser, (gpointer) parser);
+  g_param_spec_pool_insert (style_property_spec_pool, pspec, G_OBJECT_CLASS_TYPE (klass));
 }
 
 /**
@@ -9895,12 +10386,15 @@ gtk_widget_style_get_property (GtkWidget   *widget,
                               const gchar *property_name,
                               GValue      *value)
 {
+  GtkWidgetPrivate *priv;
   GParamSpec *pspec;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (property_name != NULL);
   g_return_if_fail (G_IS_VALUE (value));
 
+  priv = widget->priv;
+
   g_object_ref (widget);
   pspec = g_param_spec_pool_lookup (style_property_spec_pool,
                                    property_name,
@@ -9915,7 +10409,7 @@ gtk_widget_style_get_property (GtkWidget   *widget,
     {
       const GValue *peek_value;
 
-      peek_value = _gtk_style_peek_property_value (widget->style,
+      peek_value = _gtk_style_peek_property_value (priv->style,
                                                   G_OBJECT_TYPE (widget),
                                                   pspec,
                                                   (GtkRcPropertyParser) g_param_spec_get_qdata (pspec, quark_property_parser));
@@ -9951,10 +10445,13 @@ gtk_widget_style_get_valist (GtkWidget   *widget,
                             const gchar *first_property_name,
                             va_list      var_args)
 {
+  GtkWidgetPrivate *priv;
   const gchar *name;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
+  priv = widget->priv;
+
   g_object_ref (widget);
 
   name = first_property_name;
@@ -9978,7 +10475,7 @@ gtk_widget_style_get_valist (GtkWidget   *widget,
        }
       /* style pspecs are always readable so we can spare that check here */
 
-      peek_value = _gtk_style_peek_property_value (widget->style,
+      peek_value = _gtk_style_peek_property_value (priv->style,
                                                   G_OBJECT_TYPE (widget),
                                                   pspec,
                                                   (GtkRcPropertyParser) g_param_spec_get_qdata (pspec, quark_property_parser));
@@ -10051,7 +10548,7 @@ gtk_widget_path (GtkWidget *widget,
   guint len;
   
   g_return_if_fail (GTK_IS_WIDGET (widget));
-  
+
   len = 0;
   do
     {
@@ -10072,9 +10569,9 @@ gtk_widget_path (GtkWidget *widget,
       while (s >= string)
        *(d++) = *(s--);
       len += l;
-      
-      widget = widget->parent;
-      
+
+      widget = widget->priv->parent;
+
       if (widget)
        rev_path[len++] = '.';
       else
@@ -10097,8 +10594,8 @@ gtk_widget_path (GtkWidget *widget,
  * gtk_widget_class_path:
  * @widget: a #GtkWidget
  * @path_length: (out) (allow-none): location to store the length of the class path, or %NULL
- * @path: (out) (allow-none) location to store the class path as an allocated string, or %NULL
- * @path_reversed: (out) (allow-none) location to store the reverse class path as an allocated
+ * @path: (out) (allow-none): location to store the class path as an allocated string, or %NULL
+ * @path_reversed: (out) (allow-none): location to store the reverse class path as an allocated
  *    string, or %NULL
  *
  * Same as gtk_widget_path(), but always uses the name of a widget's type,
@@ -10116,7 +10613,7 @@ gtk_widget_class_path (GtkWidget *widget,
   guint len;
   
   g_return_if_fail (GTK_IS_WIDGET (widget));
-  
+
   len = 0;
   do
     {
@@ -10137,9 +10634,9 @@ gtk_widget_class_path (GtkWidget *widget,
       while (s >= string)
        *(d++) = *(s--);
       len += l;
-      
-      widget = widget->parent;
-      
+
+      widget = widget->priv->parent;
+
       if (widget)
        rev_path[len++] = '.';
       else
@@ -10158,6 +10655,22 @@ gtk_widget_class_path (GtkWidget *widget,
     }
 }
 
+/**
+ * gtk_requisition_new:
+ *
+ * Allocates a new #GtkRequisition structure and initializes its elements to zero.
+ *
+ * Returns: a new empty #GtkRequisition. The newly allocated #GtkRequisition should
+ *   be freed with gtk_requisition_free().
+ *
+ * Since: 3.0
+ */
+GtkRequisition *
+gtk_requisition_new (void)
+{
+  return g_slice_new0 (GtkRequisition);
+}
+
 /**
  * gtk_requisition_copy:
  * @requisition: a #GtkRequisition
@@ -10169,7 +10682,7 @@ gtk_widget_class_path (GtkWidget *widget,
 GtkRequisition *
 gtk_requisition_copy (const GtkRequisition *requisition)
 {
-  return (GtkRequisition *)g_memdup (requisition, sizeof (GtkRequisition));
+  return g_slice_dup (GtkRequisition, requisition);
 }
 
 /**
@@ -10181,34 +10694,25 @@ gtk_requisition_copy (const GtkRequisition *requisition)
 void
 gtk_requisition_free (GtkRequisition *requisition)
 {
-  g_free (requisition);
+  g_slice_free (GtkRequisition, requisition);
 }
 
-GType
-gtk_requisition_get_type (void)
-{
-  static GType our_type = 0;
-  
-  if (our_type == 0)
-    our_type = g_boxed_type_register_static (I_("GtkRequisition"),
-                                            (GBoxedCopyFunc) gtk_requisition_copy,
-                                            (GBoxedFreeFunc) gtk_requisition_free);
-
-  return our_type;
-}
+G_DEFINE_BOXED_TYPE (GtkRequisition, gtk_requisition,
+                     gtk_requisition_copy,
+                     gtk_requisition_free)
 
 /**
  * gtk_widget_get_accessible:
  * @widget: a #GtkWidget
  *
  * Returns the accessible object that describes the widget to an
- * assistive technology. 
- * 
- * If no accessibility library is loaded (i.e. no ATK implementation library is 
- * loaded via <envar>GTK_MODULES</envar> or via another application library, 
- * such as libgnome), then this #AtkObject instance may be a no-op. Likewise, 
- * if no class-specific #AtkObject implementation is available for the widget 
- * instance in question, it will inherit an #AtkObject implementation from the 
+ * assistive technology.
+ *
+ * If no accessibility library is loaded (i.e. no ATK implementation library is
+ * loaded via <envar>GTK_MODULES</envar> or via another application library,
+ * such as libgnome), then this #AtkObject instance may be a no-op. Likewise,
+ * if no class-specific #AtkObject implementation is available for the widget
+ * instance in question, it will inherit an #AtkObject implementation from the
  * first ancestor class for which such an implementation is defined.
  *
  * The documentation of the <ulink url="http://developer.gnome.org/doc/API/2.0/atk/index.html">ATK</ulink>
@@ -10789,67 +11293,302 @@ gtk_widget_buildable_custom_finished (GtkBuildable *buildable,
     }
 }
 
-/*
- * GtkExtendedLayout implementation
- */
 static void
-gtk_widget_real_get_desired_width (GtkExtendedLayout *layout,
-                                  gint              *minimum_size,
-                                  gint              *natural_size)
+gtk_widget_real_get_width (GtkWidget *widget,
+                          gint      *minimum_size,
+                          gint      *natural_size)
 {
-  /* Set the initial values so that unimplemented classes will fall back
-   * on the "size-request" collected values (see gtksizegroup.c:do_size_request()).
-   */
   if (minimum_size)
-    *minimum_size = GTK_WIDGET (layout)->requisition.width;
+    *minimum_size = 0;
 
   if (natural_size)
-    *natural_size = GTK_WIDGET (layout)->requisition.width;
+    *natural_size = 0;
 }
 
 static void
-gtk_widget_real_get_desired_height (GtkExtendedLayout *layout,
-                                   gint              *minimum_size,
-                                   gint              *natural_size)
+gtk_widget_real_get_height (GtkWidget *widget,
+                           gint      *minimum_size,
+                           gint      *natural_size)
 {
-  /* Set the initial values so that unimplemented classes will fall back
-   * on the "size-request" collected values (see gtksizegroup.c:do_size_request()).
-   */
   if (minimum_size)
-    *minimum_size = GTK_WIDGET (layout)->requisition.height;
+    *minimum_size = 0;
 
   if (natural_size)
-    *natural_size = GTK_WIDGET (layout)->requisition.height;
+    *natural_size = 0;
 }
 
 static void
-gtk_widget_real_get_height_for_width (GtkExtendedLayout *layout,
+gtk_widget_real_get_height_for_width (GtkWidget *widget,
                                       gint       width,
                                       gint      *minimum_height,
                                       gint      *natural_height)
 {
-  gtk_extended_layout_get_desired_height (layout, minimum_height, natural_height);
+  GTK_WIDGET_GET_CLASS (widget)->get_preferred_height (widget, minimum_height, natural_height);
 }
 
 static void
-gtk_widget_real_get_width_for_height (GtkExtendedLayout *layout,
+gtk_widget_real_get_width_for_height (GtkWidget *widget,
                                       gint       height,
                                       gint      *minimum_width,
                                       gint      *natural_width)
-{ 
-  gtk_extended_layout_get_desired_width (layout, minimum_width, natural_width);
+{
+  GTK_WIDGET_GET_CLASS (widget)->get_preferred_width (widget, minimum_width, natural_width);
 }
 
-static void
-gtk_widget_extended_layout_init (GtkExtendedLayoutIface *iface)
+/**
+ * gtk_widget_get_halign:
+ * @widget: a #GtkWidget
+ *
+ * Gets the value of the #GtkWidget:halign property.
+ *
+ * Returns: the horizontal alignment of @widget
+ */
+GtkAlign
+gtk_widget_get_halign (GtkWidget *widget)
 {
-  iface->get_desired_width    = gtk_widget_real_get_desired_width;
-  iface->get_desired_height   = gtk_widget_real_get_desired_height;
-  iface->get_width_for_height = gtk_widget_real_get_width_for_height;
-  iface->get_height_for_width = gtk_widget_real_get_height_for_width;  
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_ALIGN_FILL);
+  return _gtk_widget_get_aux_info_or_defaults (widget)->halign;
 }
+
+/**
+ * gtk_widget_set_halign:
+ * @widget: a #GtkWidget
+ * @align: the horizontal alignment
+ *
+ * Sets the horizontal alignment of @widget.
+ * See the #GtkWidget:halign property.
+ */
+void
+gtk_widget_set_halign (GtkWidget *widget,
+                       GtkAlign   align)
+{
+  GtkWidgetAuxInfo *aux_info;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+
+  aux_info = _gtk_widget_get_aux_info (widget, TRUE);
+
+  if (aux_info->halign == align)
+    return;
+
+  aux_info->halign = align;
+  gtk_widget_queue_resize (widget);
+  g_object_notify (G_OBJECT (widget), "halign");
+}
+
+/**
+ * gtk_widget_get_valign:
+ * @widget: a #GtkWidget
+ *
+ * Gets the value of the #GtkWidget:valign property.
+ *
+ * Returns: the vertical alignment of @widget
+ */
+GtkAlign
+gtk_widget_get_valign (GtkWidget *widget)
+{
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), GTK_ALIGN_FILL);
+  return _gtk_widget_get_aux_info_or_defaults (widget)->valign;
+}
+
+/**
+ * gtk_widget_set_valign:
+ * @widget: a #GtkWidget
+ * @align: the vertical alignment
+ *
+ * Sets the vertical alignment of @widget.
+ * See the #GtkWidget:valign property.
+ */
+void
+gtk_widget_set_valign (GtkWidget *widget,
+                       GtkAlign   align)
+{
+  GtkWidgetAuxInfo *aux_info;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+
+  aux_info = _gtk_widget_get_aux_info (widget, TRUE);
+
+  if (aux_info->valign == align)
+    return;
+
+  aux_info->valign = align;
+  gtk_widget_queue_resize (widget);
+  g_object_notify (G_OBJECT (widget), "valign");
+}
+
+/**
+ * gtk_widget_get_margin_left:
+ * @widget: a #GtkWidget
+ *
+ * Gets the value of the #GtkWidget:margin-left property.
+ *
+ * Returns: The left margin of @widget
+ */
+gint
+gtk_widget_get_margin_left (GtkWidget *widget)
+{
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
+
+  return _gtk_widget_get_aux_info_or_defaults (widget)->margin.left;
+}
+
+/**
+ * gtk_widget_set_margin_left:
+ * @widget: a #GtkWidget
+ * @margin: the left margin
+ *
+ * Sets the left margin of @widget.
+ * See the #GtkWidget:margin-left property.
+ */
+void
+gtk_widget_set_margin_left (GtkWidget *widget,
+                            gint       margin)
+{
+  GtkWidgetAuxInfo *aux_info;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (margin <= G_MAXINT16);
+
+  aux_info = _gtk_widget_get_aux_info (widget, TRUE);
+
+  if (aux_info->margin.left == margin)
+    return;
+
+  aux_info->margin.left = margin;
+  gtk_widget_queue_resize (widget);
+  g_object_notify (G_OBJECT (widget), "margin-left");
+}
+
+/**
+ * gtk_widget_get_margin_right:
+ * @widget: a #GtkWidget
+ *
+ * Gets the value of the #GtkWidget:margin-right property.
+ *
+ * Returns: The left margin of @widget
+ */
+gint
+gtk_widget_get_margin_right (GtkWidget *widget)
+{
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
+
+  return _gtk_widget_get_aux_info_or_defaults (widget)->margin.right;
+}
+
+/**
+ * gtk_widget_set_margin_right:
+ * @widget: a #GtkWidget
+ * @margin: the right margin
+ *
+ * Sets the right margin of @widget.
+ * See the #GtkWidget:margin-right property.
+ */
+void
+gtk_widget_set_margin_right (GtkWidget *widget,
+                             gint       margin)
+{
+  GtkWidgetAuxInfo *aux_info;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (margin <= G_MAXINT16);
+
+  aux_info = _gtk_widget_get_aux_info (widget, TRUE);
+
+  if (aux_info->margin.right == margin)
+    return;
+
+  aux_info->margin.right = margin;
+  gtk_widget_queue_resize (widget);
+  g_object_notify (G_OBJECT (widget), "margin-right");
+}
+
+/**
+ * gtk_widget_get_margin_top:
+ * @widget: a #GtkWidget
+ *
+ * Gets the value of the #GtkWidget:margin-top property.
+ *
+ * Returns: The top margin of @widget
+ */
+gint
+gtk_widget_get_margin_top (GtkWidget *widget)
+{
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
+
+  return _gtk_widget_get_aux_info_or_defaults (widget)->margin.top;
+}
+
+/**
+ * gtk_widget_set_margin_top:
+ * @widget: a #GtkWidget
+ * @margin: the top margin
+ *
+ * Sets the top margin of @widget.
+ * See the #GtkWidget:margin-top property.
+ */
+void
+gtk_widget_set_margin_top (GtkWidget *widget,
+                           gint       margin)
+{
+  GtkWidgetAuxInfo *aux_info;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (margin <= G_MAXINT16);
+
+  aux_info = _gtk_widget_get_aux_info (widget, TRUE);
+
+  if (aux_info->margin.top == margin)
+    return;
+
+  aux_info->margin.top = margin;
+  gtk_widget_queue_resize (widget);
+  g_object_notify (G_OBJECT (widget), "margin-top");
+}
+
+/**
+ * gtk_widget_get_margin_bottom:
+ * @widget: a #GtkWidget
+ *
+ * Gets the value of the #GtkWidget:margin-bottom property.
+ *
+ * Returns: The bottom margin of @widget
+ */
+gint
+gtk_widget_get_margin_bottom (GtkWidget *widget)
+{
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
+
+  return _gtk_widget_get_aux_info_or_defaults (widget)->margin.bottom;
+}
+
+/**
+ * gtk_widget_set_margin_bottom:
+ * @widget: a #GtkWidget
+ * @margin: the bottom margin
+ *
+ * Sets the bottom margin of @widget.
+ * See the #GtkWidget:margin-bottom property.
+ */
+void
+gtk_widget_set_margin_bottom (GtkWidget *widget,
+                              gint       margin)
+{
+  GtkWidgetAuxInfo *aux_info;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (margin <= G_MAXINT16);
+
+  aux_info = _gtk_widget_get_aux_info (widget, TRUE);
+
+  if (aux_info->margin.bottom == margin)
+    return;
+
+  aux_info->margin.bottom = margin;
+  gtk_widget_queue_resize (widget);
+  g_object_notify (G_OBJECT (widget), "margin-bottom");
+}
+
 /**
  * gtk_widget_get_clipboard:
  * @widget: a #GtkWidget
@@ -10876,7 +11615,7 @@ gtk_widget_get_clipboard (GtkWidget *widget, GdkAtom selection)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
   g_return_val_if_fail (gtk_widget_has_screen (widget), NULL);
-  
+
   return gtk_clipboard_get_for_display (gtk_widget_get_display (widget),
                                        selection);
 }
@@ -10884,9 +11623,9 @@ gtk_widget_get_clipboard (GtkWidget *widget, GdkAtom selection)
 /**
  * gtk_widget_list_mnemonic_labels:
  * @widget: a #GtkWidget
- * 
- * Returns a newly allocated list of the widgets, normally labels, for 
- * which this widget is a the target of a mnemonic (see for example, 
+ *
+ * Returns a newly allocated list of the widgets, normally labels, for
+ * which this widget is the target of a mnemonic (see for example,
  * gtk_label_set_mnemonic_widget()).
 
  * The widgets in the list are not individually referenced. If you
@@ -10993,7 +11732,7 @@ gtk_widget_get_no_show_all (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
   
-  return (GTK_OBJECT_FLAGS (widget) & GTK_NO_SHOW_ALL) != 0;
+  return widget->priv->no_show_all;
 }
 
 /**
@@ -11018,15 +11757,12 @@ gtk_widget_set_no_show_all (GtkWidget *widget,
 
   no_show_all = (no_show_all != FALSE);
 
-  if (no_show_all == gtk_widget_get_no_show_all (widget))
-    return;
+  if (widget->priv->no_show_all != no_show_all)
+    {
+      widget->priv->no_show_all = no_show_all;
 
-  if (no_show_all)
-    GTK_OBJECT_FLAGS (widget) |= GTK_NO_SHOW_ALL;
-  else
-    GTK_OBJECT_FLAGS (widget) &= ~(GTK_NO_SHOW_ALL);
-  
-  g_object_notify (G_OBJECT (widget), "no-show-all");
+      g_object_notify (G_OBJECT (widget), "no-show-all");
+    }
 }
 
 
@@ -11035,6 +11771,7 @@ gtk_widget_real_set_has_tooltip (GtkWidget *widget,
                                 gboolean   has_tooltip,
                                 gboolean   force)
 {
+  GtkWidgetPrivate *priv = widget->priv;
   gboolean priv_has_tooltip;
 
   priv_has_tooltip = GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (widget),
@@ -11047,8 +11784,8 @@ gtk_widget_real_set_has_tooltip (GtkWidget *widget,
       if (priv_has_tooltip)
         {
          if (gtk_widget_get_realized (widget) && !gtk_widget_get_has_window (widget))
-           gdk_window_set_events (widget->window,
-                                  gdk_window_get_events (widget->window) |
+           gdk_window_set_events (priv->window,
+                                  gdk_window_get_events (priv->window) |
                                   GDK_LEAVE_NOTIFY_MASK |
                                   GDK_POINTER_MOTION_MASK |
                                   GDK_POINTER_MOTION_HINT_MASK);
@@ -11314,16 +12051,35 @@ gtk_widget_get_has_tooltip (GtkWidget *widget)
  *
  * Retrieves the widget's allocation.
  *
+ * Note, when implementing a #GtkContainer: a widget's allocation will
+ * be its "adjusted" allocation, that is, the widget's parent
+ * container typically calls gtk_widget_size_allocate() with an
+ * allocation, and that allocation is then adjusted (to handle margin
+ * and alignment for example) before assignment to the widget.
+ * gtk_widget_get_allocation() returns the adjusted allocation that
+ * was actually assigned to the widget. The adjusted allocation is
+ * guaranteed to be completely contained within the
+ * gtk_widget_size_allocate() allocation, however. So a #GtkContainer
+ * is guaranteed that its children stay inside the assigned bounds,
+ * but not that they have exactly the bounds the container assigned.
+ * There is no way to get the original allocation assigned by
+ * gtk_widget_size_allocate(), since it isn't stored; if a container
+ * implementation needs that information it will have to track it itself.
+ *
  * Since: 2.18
  */
 void
 gtk_widget_get_allocation (GtkWidget     *widget,
                            GtkAllocation *allocation)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (allocation != NULL);
 
-  *allocation = widget->allocation;
+  priv = widget->priv;
+
+  *allocation = priv->allocation;
 }
 
 /**
@@ -11334,16 +12090,63 @@ gtk_widget_get_allocation (GtkWidget     *widget,
  * Sets the widget's allocation.  This should not be used
  * directly, but from within a widget's size_allocate method.
  *
+ * The allocation set should be the "adjusted" or actual
+ * allocation. If you're implementing a #GtkContainer, you want to use
+ * gtk_widget_size_allocate() instead of gtk_widget_set_allocation().
+ * The GtkWidgetClass::adjust_size_allocation virtual method adjusts the
+ * allocation inside gtk_widget_size_allocate() to create an adjusted
+ * allocation.
+ *
  * Since: 2.18
  */
 void
 gtk_widget_set_allocation (GtkWidget           *widget,
                            const GtkAllocation *allocation)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (allocation != NULL);
 
-  widget->allocation = *allocation;
+  priv = widget->priv;
+
+  priv->allocation = *allocation;
+}
+
+/**
+ * gtk_widget_get_allocated_width:
+ * @widget: the widget to query
+ *
+ * Returns the width that has currently been allocated to @widget.
+ * This function is intended to be used when implementing handlers
+ * for the GtkWidget::draw function.
+ *
+ * Returns: the width of the @widget
+ **/
+int
+gtk_widget_get_allocated_width (GtkWidget *widget)
+{
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
+
+  return widget->priv->allocation.width;
+}
+
+/**
+ * gtk_widget_get_allocated_height:
+ * @widget: the widget to query
+ *
+ * Returns the height that has currently been allocated to @widget.
+ * This function is intended to be used when implementing handlers
+ * for the GtkWidget::draw function.
+ *
+ * Returns: the height of the @widget
+ **/
+int
+gtk_widget_get_allocated_height (GtkWidget *widget)
+{
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
+
+  return widget->priv->allocation.height;
 }
 
 /**
@@ -11361,6 +12164,10 @@ gtk_widget_set_allocation (GtkWidget           *widget,
  * Normally, gtk_widget_size_request() should be used.
  *
  * Since: 2.20
+ *
+ * Deprecated: 3.0: The #GtkRequisition cache on the widget was
+ * removed, If you need to cache sizes across requests and allocations,
+ * add an explicit cache to the widget in question instead.
  */
 void
 gtk_widget_get_requisition (GtkWidget      *widget,
@@ -11369,7 +12176,7 @@ gtk_widget_get_requisition (GtkWidget      *widget,
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (requisition != NULL);
 
-  *requisition = widget->requisition;
+  gtk_widget_get_preferred_size (widget, requisition, NULL);
 }
 
 /**
@@ -11387,18 +12194,24 @@ gtk_widget_get_requisition (GtkWidget      *widget,
  * by calling gtk_widget_set_has_window(). This is usually done in the
  * widget's init() function.
  *
+ * <note><para>This function does not add any reference to @window.</para></note>
+ *
  * Since: 2.18
  */
 void
 gtk_widget_set_window (GtkWidget *widget,
                        GdkWindow *window)
 {
+  GtkWidgetPrivate *priv;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
 
-  if (widget->window != window)
+  priv = widget->priv;
+
+  if (priv->window != window)
     {
-      widget->window = window;
+      priv->window = window;
       g_object_notify (G_OBJECT (widget), "window");
     }
 }
@@ -11409,7 +12222,7 @@ gtk_widget_set_window (GtkWidget *widget,
  *
  * Returns the widget's window if it is realized, %NULL otherwise
  *
- * Return value: @widget's window.
+ * Return value: (transfer none): @widget's window.
  *
  * Since: 2.14
  */
@@ -11418,17 +12231,68 @@ gtk_widget_get_window (GtkWidget *widget)
 {
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
 
-  return widget->window;
+  return widget->priv->window;
+}
+
+/**
+ * gtk_widget_get_support_multidevice:
+ * @widget: a #GtkWidget
+ *
+ * Returns %TRUE if @widget is multiple pointer aware. See
+ * gtk_widget_set_support_multidevice() for more information.
+ *
+ * Returns: %TRUE is @widget is multidevice aware.
+ **/
+gboolean
+gtk_widget_get_support_multidevice (GtkWidget *widget)
+{
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+
+  return widget->priv->multidevice;
+}
+
+/**
+ * gtk_widget_set_support_multidevice:
+ * @widget: a #GtkWidget
+ * @support_multidevice: %TRUE to support input from multiple devices.
+ *
+ * Enables or disables multiple pointer awareness. If this setting is %TRUE,
+ * @widget will start receiving multiple, per device enter/leave events. Note
+ * that if custom #GdkWindow<!-- -->s are created in #GtkWidget::realize,
+ * gdk_window_set_support_multidevice() will have to be called manually on them.
+ *
+ * Since: 3.0
+ **/
+void
+gtk_widget_set_support_multidevice (GtkWidget *widget,
+                                    gboolean   support_multidevice)
+{
+  GtkWidgetPrivate *priv;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+
+  priv = widget->priv;
+
+  if (support_multidevice)
+    {
+      priv->multidevice = TRUE;
+      gtk_widget_set_extension_events (widget, GDK_EXTENSION_EVENTS_ALL);
+    }
+  else
+    {
+      priv->multidevice = FALSE;
+      gtk_widget_set_extension_events (widget, GDK_EXTENSION_EVENTS_NONE);
+    }
+
+  if (gtk_widget_get_realized (widget))
+    gdk_window_set_support_multidevice (priv->window, support_multidevice);
 }
 
 static void
 _gtk_widget_set_has_focus (GtkWidget *widget,
                            gboolean   has_focus)
 {
-  if (has_focus)
-    GTK_OBJECT_FLAGS (widget) |= GTK_HAS_FOCUS;
-  else
-    GTK_OBJECT_FLAGS (widget) &= ~(GTK_HAS_FOCUS);
+  widget->priv->has_focus = has_focus;
 }
 
 /**
@@ -11487,5 +12351,98 @@ gtk_widget_send_focus_change (GtkWidget *widget,
   return res;
 }
 
-#define __GTK_WIDGET_C__
-#include "gtkaliasdef.c"
+gboolean
+gtk_widget_in_destruction (GtkWidget *widget)
+{
+  return widget->priv->in_destruction;
+}
+
+_gtk_widget_get_resize_pending (GtkWidget *widget)
+{
+  return widget->priv->resize_pending;
+}
+
+void
+_gtk_widget_set_resize_pending (GtkWidget *widget,
+                                gboolean   resize_pending)
+{
+  widget->priv->resize_pending = resize_pending;
+}
+
+gboolean
+_gtk_widget_get_in_reparent (GtkWidget *widget)
+{
+  return widget->priv->in_reparent;
+}
+
+void
+_gtk_widget_set_in_reparent (GtkWidget *widget,
+                             gboolean   in_reparent)
+{
+  widget->priv->in_reparent = in_reparent;
+}
+
+gboolean
+_gtk_widget_get_anchored (GtkWidget *widget)
+{
+  return widget->priv->anchored;
+}
+
+void
+_gtk_widget_set_anchored (GtkWidget *widget,
+                          gboolean   anchored)
+{
+  widget->priv->anchored = anchored;
+}
+
+gboolean
+_gtk_widget_get_shadowed (GtkWidget *widget)
+{
+  return widget->priv->shadowed;
+}
+
+void
+_gtk_widget_set_shadowed (GtkWidget *widget,
+                          gboolean   shadowed)
+{
+  widget->priv->shadowed = shadowed;
+}
+
+gboolean
+_gtk_widget_get_alloc_needed (GtkWidget *widget)
+{
+  return widget->priv->alloc_needed;
+}
+
+void
+_gtk_widget_set_alloc_needed (GtkWidget *widget,
+                              gboolean   alloc_needed)
+{
+  widget->priv->alloc_needed = alloc_needed;
+}
+
+gboolean
+_gtk_widget_get_width_request_needed (GtkWidget *widget)
+{
+  return widget->priv->width_request_needed;
+}
+
+void
+_gtk_widget_set_width_request_needed (GtkWidget *widget,
+                                      gboolean   width_request_needed)
+{
+  widget->priv->width_request_needed = width_request_needed;
+}
+
+gboolean
+_gtk_widget_get_height_request_needed (GtkWidget *widget)
+{
+  return widget->priv->height_request_needed;
+}
+
+void
+_gtk_widget_set_height_request_needed (GtkWidget *widget,
+                                       gboolean   height_request_needed)
+{
+  widget->priv->height_request_needed = height_request_needed;
+}