Add support for creation methods with a different (mostly super) type than
authorRaffaele Sandrini <raffaele@sandrini.ch>
Wed, 9 Jul 2008 09:17:43 +0000 (09:17 +0000)
committerRaffaele Sandrini <rasa@src.gnome.org>
Wed, 9 Jul 2008 09:17:43 +0000 (09:17 +0000)
2008-07-09  Raffaele Sandrini  <raffaele@sandrini.ch>

* gobject/valaccodegenerator.vala:
* gobject/valaccodemethodbinding.vala:
* vala/valacreationmethod.vala:
* vala/valainterfacewriter.vala:
* vapigen/valagidlparser.vala:

Add support for creation methods with a different (mostly super) type
than the type of the object it creates. Add a `type' parameter to the
CCode attribute which will be used to get the casts right for such
creation methods.

* vapi/gio-2.0.vapi:
* vapi/gtk+-2.0.vapi:

Regenerated, fixes bug 540661

svn path=/trunk/; revision=1688

ChangeLog
gobject/valaccodegenerator.vala
gobject/valaccodemethodbinding.vala
vala/valacreationmethod.vala
vala/valainterfacewriter.vala
vapi/gio-2.0.vapi
vapi/gtk+-2.0.vapi
vapigen/valagidlparser.vala

index 3c3314b..3cbcaf5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2008-07-09  Raffaele Sandrini  <raffaele@sandrini.ch>
+
+       * gobject/valaccodegenerator.vala:
+       * gobject/valaccodemethodbinding.vala:
+       * vala/valacreationmethod.vala:
+       * vala/valainterfacewriter.vala:
+       * vapigen/valagidlparser.vala:
+
+       Add support for creation methods with a different (mostly super) type
+       than the type of the object it creates. Add a `type' parameter to the
+       CCode attribute which will be used to get the casts right for such
+       creation methods.
+
+       * vapi/gio-2.0.vapi:
+       * vapi/gtk+-2.0.vapi:
+
+       Regenerated, fixes bug 540661
+
 2008-07-08  Raffaele Sandrini  <raffaele@sandrini.ch>
 
        * vapi/packages/gtk+-2.0/gtk+-2.0.metadata:
index 5e3358f..45e4689 100644 (file)
@@ -3083,7 +3083,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                expr.accept_children (this);
 
                CCodeExpression instance = null;
-               CCodeFunctionCall creation_call = null;
+               CCodeExpression creation_expr = null;
 
                var st = expr.type_reference.data_type as Struct;
                if ((st != null && !st.is_simple_type ()) || expr.get_object_initializer ().size > 0) {
@@ -3095,6 +3095,8 @@ public class Vala.CCodeGenerator : CodeGenerator {
                }
 
                if (expr.symbol_reference == null) {
+                       CCodeFunctionCall creation_call;
+
                        // no creation method
                        if (expr.type_reference.data_type == glist_type ||
                            expr.type_reference.data_type == gslist_type) {
@@ -3116,10 +3118,13 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                creation_call.add_argument (new CCodeConstant ("0"));
                                creation_call.add_argument (new CCodeIdentifier ("sizeof (%s)".printf (expr.type_reference.get_cname ())));
                        }
+
+                       creation_expr = creation_call;
                } else if (expr.symbol_reference is Method) {
                        // use creation method
                        var m = (Method) expr.symbol_reference;
                        var params = m.get_parameters ();
+                       CCodeFunctionCall creation_call;
 
                        creation_call = new CCodeFunctionCall (new CCodeIdentifier (m.get_cname ()));
 
@@ -3230,9 +3235,18 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                // ensure variable argument list ends with NULL
                                creation_call.add_argument (new CCodeConstant ("NULL"));
                        }
+
+                       creation_expr = creation_call;
+
+                       // cast the return value of the creation method back to the intended type if
+                       // it requested a special C return type
+                       if (method_binding (m).get_custom_creturn_type () != null) {
+                               creation_expr = new CCodeCastExpression (creation_expr, expr.type_reference.get_cname ());
+                       }
                } else if (expr.symbol_reference is ErrorCode) {
                        var ecode = (ErrorCode) expr.symbol_reference;
                        var edomain = (ErrorDomain) ecode.parent_symbol;
+                       CCodeFunctionCall creation_call;
 
                        creation_call = new CCodeFunctionCall (new CCodeIdentifier ("g_error_new"));
                        creation_call.add_argument (new CCodeIdentifier (edomain.get_upper_case_cname ()));
@@ -3241,6 +3255,8 @@ public class Vala.CCodeGenerator : CodeGenerator {
                        foreach (Expression arg in expr.get_argument_list ()) {
                                creation_call.add_argument ((CCodeExpression) arg.ccodenode);
                        }
+
+                       creation_expr = creation_call;
                } else {
                        assert (false);
                }
@@ -3249,9 +3265,9 @@ public class Vala.CCodeGenerator : CodeGenerator {
                        var ccomma = new CCodeCommaExpression ();
 
                        if (expr.type_reference.data_type is Struct) {
-                               ccomma.append_expression (creation_call);
+                               ccomma.append_expression (creation_expr);
                        } else {
-                               ccomma.append_expression (new CCodeAssignment (instance, creation_call));
+                               ccomma.append_expression (new CCodeAssignment (instance, creation_expr));
                        }
 
                        foreach (MemberInitializer init in expr.get_object_initializer ()) {
@@ -3278,8 +3294,8 @@ public class Vala.CCodeGenerator : CodeGenerator {
                        ccomma.append_expression (instance);
 
                        expr.ccodenode = ccomma;
-               } else if (creation_call != null) {
-                       expr.ccodenode = creation_call;
+               } else if (creation_expr != null) {
+                       expr.ccodenode = creation_expr;
                }
        }
 
index b113591..06155e7 100644 (file)
@@ -18,6 +18,7 @@
  *
  * Author:
  *     Jürg Billeter <j@bitron.ch>
+ *     Raffaele Sandrini <raffaele@sandrini.ch>
  */
 
 using GLib;
@@ -33,6 +34,25 @@ public class Vala.CCodeMethodBinding : CCodeBinding {
                get { return (method.get_attribute ("NoWrapper") == null); }
        }
 
+       public string? get_custom_creturn_type () {\r
+               var attr = method.get_attribute ("CCode");\r
+               if (attr != null) {\r
+                       string type = attr.get_string ("type");\r
+                       if (type != null) {\r
+                               return type;\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+\r
+       string get_creturn_type (string default_value) {\r
+               string type = get_custom_creturn_type ();\r
+               if (type == null) {\r
+                       return default_value;\r
+               }\r
+               return type;\r
+       }
+
        public CCodeMethodBinding (CCodeGenerator codegen, Method method) {
                this.method = method;
                this.codegen = codegen;
@@ -127,7 +147,7 @@ public class Vala.CCodeMethodBinding : CCodeBinding {
                        }
                }
 
-               codegen.function = new CCodeFunction (m.get_real_cname (), creturn_type.get_cname ());
+               codegen.function = new CCodeFunction (m.get_real_cname (), get_creturn_type (creturn_type.get_cname ()));
                m.ccodenode = codegen.function;
 
                if (m.is_inline) {
@@ -166,7 +186,7 @@ public class Vala.CCodeMethodBinding : CCodeBinding {
                        cparam_map.set (codegen.get_param_pos (m.cinstance_parameter_position), instance_param);
 
                        if (m.is_abstract || m.is_virtual) {
-                               var vdecl = new CCodeDeclaration (creturn_type.get_cname ());
+                               var vdecl = new CCodeDeclaration (get_creturn_type (creturn_type.get_cname ()));
                                vdeclarator = new CCodeFunctionDeclarator (m.vfunc_name);
                                vdecl.add_declarator (vdeclarator);
                                codegen.type_struct.add_declaration (vdecl);
@@ -498,7 +518,7 @@ public class Vala.CCodeMethodBinding : CCodeBinding {
                                cstmt = new CCodeReturnStatement (vcall);
                        } else {
                                /* store method return value for postconditions */
-                               var cdecl = new CCodeDeclaration (creturn_type.get_cname ());
+                               var cdecl = new CCodeDeclaration (get_creturn_type (creturn_type.get_cname ()));
                                cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("result", vcall));
                                cstmt = cdecl;
                        }
@@ -549,8 +569,13 @@ public class Vala.CCodeMethodBinding : CCodeBinding {
                        }
 
                        if (codegen.current_type_symbol is Class) {
+                               CCodeExpression cresult = new CCodeIdentifier ("self");\r
+                               if (get_custom_creturn_type () != null) {\r
+                                       cresult = new CCodeCastExpression (cresult, get_custom_creturn_type ());\r
+                               }\r
+
                                var creturn = new CCodeReturnStatement ();
-                               creturn.return_expression = new CCodeIdentifier ("self");
+                               creturn.return_expression = cresult;
                                codegen.function.block.add_statement (creturn);
                        }
                }
index b4cffbd..b2c40e9 100644 (file)
@@ -38,6 +38,14 @@ public class Vala.CreationMethod : Method {
        public int n_construction_params { get; set; }
 
        /**
+        * Specifies a custom C return type for that creation method.
+        * Only the idl parser and the interface writer should use this.
+        * FIXME: remove this as soon the compiler has a decent attribute
+        * handling.
+        */
+       public string? custom_return_type_cname { get; set; }
+
+       /**
         * Creates a new method.
         *
         * @param name             method name
index 510b525..db97941 100644 (file)
@@ -769,6 +769,9 @@ public class Vala.InterfaceWriter : CodeVisitor {
                        ccode_params.append_printf ("%ssentinel = \"%s\"", separator, m.sentinel);
                        separator = ", ";
                }
+               if (m is CreationMethod && ((CreationMethod)m).custom_return_type_cname != null) {
+                       ccode_params.append_printf ("%stype = \"%s\"", separator, ((CreationMethod)m).custom_return_type_cname);
+               }
 
                if (ccode_params.len > 0) {
                        write_indent ();
index f4f227f..2e69843 100644 (file)
@@ -254,7 +254,9 @@ namespace GLib {
        public class BufferedInputStream : GLib.FilterInputStream {
                public ulong get_available ();
                public ulong get_buffer_size ();
+               [CCode (type = "GInputStream*")]
                public BufferedInputStream (GLib.InputStream base_stream);
+               [CCode (type = "GInputStream*")]
                public BufferedInputStream.sized (GLib.InputStream base_stream, ulong size);
                public ulong peek (void* buffer, ulong offset, ulong count);
                public void* peek_buffer (ulong count);
@@ -269,7 +271,9 @@ namespace GLib {
        public class BufferedOutputStream : GLib.FilterOutputStream {
                public bool get_auto_grow ();
                public ulong get_buffer_size ();
+               [CCode (type = "GOutputStream*")]
                public BufferedOutputStream (GLib.OutputStream base_stream);
+               [CCode (type = "GOutputStream*")]
                public BufferedOutputStream.sized (GLib.OutputStream base_stream, ulong size);
                public void set_auto_grow (bool auto_grow);
                public void set_buffer_size (ulong size);
@@ -340,6 +344,7 @@ namespace GLib {
        [CCode (cheader_filename = "gio/gio.h")]
        public class FileIcon : GLib.Object, GLib.Icon, GLib.LoadableIcon {
                public weak GLib.File get_file ();
+               [CCode (type = "GIcon*")]
                public FileIcon (GLib.File file);
        }
        [CCode (cheader_filename = "gio/gio.h")]
@@ -494,7 +499,9 @@ namespace GLib {
        [CCode (cheader_filename = "gio/gio.h")]
        public class MemoryInputStream : GLib.InputStream, GLib.Seekable {
                public void add_data (void* data, long len, GLib.DestroyNotify? destroy);
+               [CCode (type = "GInputStream*")]
                public MemoryInputStream ();
+               [CCode (type = "GInputStream*")]
                public MemoryInputStream.from_data (void* data, long len, GLib.DestroyNotify? destroy);
        }
        [CCode (cheader_filename = "gio/gio.h")]
@@ -502,6 +509,7 @@ namespace GLib {
                public void* get_data ();
                public ulong get_data_size ();
                public ulong get_size ();
+               [CCode (type = "GOutputStream*")]
                public MemoryOutputStream (void* data, ulong len, GLib.ReallocFunc realloc_fn, GLib.DestroyNotify? destroy);
        }
        [CCode (cheader_filename = "gio/gio.h")]
@@ -584,8 +592,11 @@ namespace GLib {
        public class ThemedIcon : GLib.Object, GLib.Icon {
                public void append_name (string iconname);
                public weak string get_names ();
+               [CCode (type = "GIcon*")]
                public ThemedIcon (string iconname);
+               [CCode (type = "GIcon*")]
                public ThemedIcon.from_names (string[] iconnames, int len);
+               [CCode (type = "GIcon*")]
                public ThemedIcon.with_default_fallbacks (string iconname);
                public void prepend_name (string iconname);
                [NoAccessorMethod]
index ad2cd2c..7acf3e2 100644 (file)
@@ -1745,6 +1745,7 @@ namespace Gtk {
                public weak string get_website ();
                public weak string get_website_label ();
                public bool get_wrap_license ();
+               [CCode (type = "GtkWidget*")]
                public AboutDialog ();
                [NoArrayLength]
                public void set_artists (string[] artists);
@@ -1809,6 +1810,7 @@ namespace Gtk {
                public ushort accel_string_width;
                public weak Gtk.Widget get_accel_widget ();
                public uint get_accel_width ();
+               [CCode (type = "GtkWidget*")]
                public AccelLabel (string str);
                public bool refetch ();
                public void set_accel_closure (GLib.Closure accel_closure);
@@ -1927,6 +1929,7 @@ namespace Gtk {
        public class Adjustment : Gtk.Object {
                public void clamp_page (double lower, double upper);
                public double get_value ();
+               [CCode (type = "GtkObject*")]
                public Adjustment (double value, double lower, double upper, double step_increment, double page_increment, double page_size);
                public void set_value (double value);
                [NoAccessorMethod]
@@ -1948,6 +1951,7 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class Alignment : Gtk.Bin, Atk.Implementor, Gtk.Buildable {
                public void get_padding (uint padding_top, uint padding_bottom, uint padding_left, uint padding_right);
+               [CCode (type = "GtkWidget*")]
                public Alignment (float xalign, float yalign, float xscale, float yscale);
                public void set (float xalign, float yalign, float xscale, float yscale);
                public void set_padding (uint padding_top, uint padding_bottom, uint padding_left, uint padding_right);
@@ -1970,6 +1974,7 @@ namespace Gtk {
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class Arrow : Gtk.Misc, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public Arrow (Gtk.ArrowType arrow_type, Gtk.ShadowType shadow_type);
                public void set (Gtk.ArrowType arrow_type, Gtk.ShadowType shadow_type);
                [NoAccessorMethod]
@@ -1980,6 +1985,7 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class AspectFrame : Gtk.Frame, Atk.Implementor, Gtk.Buildable {
                public Gtk.Allocation center_allocation;
+               [CCode (type = "GtkWidget*")]
                public AspectFrame (string label, float xalign, float yalign, float ratio, bool obey_child);
                public void set (float xalign, float yalign, float ratio, bool obey_child);
                [NoAccessorMethod]
@@ -2007,6 +2013,7 @@ namespace Gtk {
                public weak string get_page_title (Gtk.Widget page);
                public Gtk.AssistantPageType get_page_type (Gtk.Widget page);
                public int insert_page (Gtk.Widget page, int position);
+               [CCode (type = "GtkWidget*")]
                public Assistant ();
                public int prepend_page (Gtk.Widget page);
                public void remove_action_widget (Gtk.Widget child);
@@ -2080,9 +2087,13 @@ namespace Gtk {
                public Gtk.ReliefStyle get_relief ();
                public bool get_use_stock ();
                public bool get_use_underline ();
+               [CCode (type = "GtkWidget*")]
                public Button ();
+               [CCode (type = "GtkWidget*")]
                public Button.from_stock (string stock_id);
+               [CCode (type = "GtkWidget*")]
                public Button.with_label (string label);
+               [CCode (type = "GtkWidget*")]
                public Button.with_mnemonic (string label);
                public void set_alignment (float xalign, float yalign);
                public void set_focus_on_click (bool focus_on_click);
@@ -2155,6 +2166,7 @@ namespace Gtk {
                public int get_detail_width_chars ();
                public Gtk.CalendarDisplayOptions get_display_options ();
                public bool mark_day (uint day);
+               [CCode (type = "GtkWidget*")]
                public Calendar ();
                public void select_day (uint day);
                public bool select_month (uint month, uint year);
@@ -2236,6 +2248,7 @@ namespace Gtk {
                public weak Gtk.Widget edit_widget;
                public weak Gtk.Widget grab_widget;
                public weak Gtk.Widget sizing_label;
+               [CCode (type = "GtkCellRenderer*")]
                public CellRendererAccel ();
                [NoAccessorMethod]
                public uint accel_key { get; set; }
@@ -2251,6 +2264,7 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class CellRendererCombo : Gtk.CellRendererText {
                public uint focus_out_id;
+               [CCode (type = "GtkCellRenderer*")]
                public CellRendererCombo ();
                [NoAccessorMethod]
                public bool has_entry { get; set; }
@@ -2262,6 +2276,7 @@ namespace Gtk {
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class CellRendererPixbuf : Gtk.CellRenderer {
+               [CCode (type = "GtkCellRenderer*")]
                public CellRendererPixbuf ();
                [NoAccessorMethod]
                public bool follow_state { get; set; }
@@ -2282,6 +2297,7 @@ namespace Gtk {
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class CellRendererProgress : Gtk.CellRenderer {
+               [CCode (type = "GtkCellRenderer*")]
                public CellRendererProgress ();
                [NoAccessorMethod]
                public Gtk.ProgressBarOrientation orientation { get; set; }
@@ -2298,6 +2314,7 @@ namespace Gtk {
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class CellRendererSpin : Gtk.CellRendererText {
+               [CCode (type = "GtkCellRenderer*")]
                public CellRendererSpin ();
                [NoAccessorMethod]
                public Gtk.Adjustment adjustment { get; set; }
@@ -2313,6 +2330,7 @@ namespace Gtk {
                public Pango.Underline underline_style;
                public int fixed_height_rows;
                public uint calc_fixed_height;
+               [CCode (type = "GtkCellRenderer*")]
                public CellRendererText ();
                public void set_fixed_height_from_font (int number_of_rows);
                [NoAccessorMethod]
@@ -2409,6 +2427,7 @@ namespace Gtk {
        public class CellRendererToggle : Gtk.CellRenderer {
                public bool get_active ();
                public bool get_radio ();
+               [CCode (type = "GtkCellRenderer*")]
                public CellRendererToggle ();
                public void set_active (bool setting);
                public void set_radio (bool radio);
@@ -2427,9 +2446,13 @@ namespace Gtk {
                public weak GLib.List get_cell_renderers ();
                public weak Gtk.TreePath get_displayed_row ();
                public bool get_size_of_row (Gtk.TreePath path, out Gtk.Requisition requisition);
+               [CCode (type = "GtkWidget*")]
                public CellView ();
+               [CCode (type = "GtkWidget*")]
                public CellView.with_markup (string markup);
+               [CCode (type = "GtkWidget*")]
                public CellView.with_pixbuf (Gdk.Pixbuf pixbuf);
+               [CCode (type = "GtkWidget*")]
                public CellView.with_text (string text);
                public void set_background_color (Gdk.Color color);
                public void set_displayed_row (Gtk.TreePath path);
@@ -2445,8 +2468,11 @@ namespace Gtk {
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class CheckButton : Gtk.ToggleButton, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public CheckButton ();
+               [CCode (type = "GtkWidget*")]
                public CheckButton.with_label (string label);
+               [CCode (type = "GtkWidget*")]
                public CheckButton.with_mnemonic (string label);
                [NoWrapper]
                public virtual void draw_indicator (Gdk.Rectangle area);
@@ -2457,8 +2483,11 @@ namespace Gtk {
                public bool get_active ();
                public bool get_draw_as_radio ();
                public bool get_inconsistent ();
+               [CCode (type = "GtkWidget*")]
                public CheckMenuItem ();
+               [CCode (type = "GtkWidget*")]
                public CheckMenuItem.with_label (string label);
+               [CCode (type = "GtkWidget*")]
                public CheckMenuItem.with_mnemonic (string label);
                public void set_active (bool is_active);
                public void set_draw_as_radio (bool draw_as_radio);
@@ -2506,7 +2535,9 @@ namespace Gtk {
                public void get_color (out Gdk.Color color);
                public weak string get_title ();
                public bool get_use_alpha ();
+               [CCode (type = "GtkWidget*")]
                public ColorButton ();
+               [CCode (type = "GtkWidget*")]
                public ColorButton.with_color (Gdk.Color color);
                public void set_alpha (ushort alpha);
                public void set_color (Gdk.Color color);
@@ -2527,6 +2558,7 @@ namespace Gtk {
                public ushort get_previous_alpha ();
                public void get_previous_color (out Gdk.Color color);
                public bool is_adjusting ();
+               [CCode (type = "GtkWidget*")]
                public ColorSelection ();
                public static bool palette_from_string (string str, Gdk.Color[] colors);
                public static weak string palette_to_string (Gdk.Color[] colors);
@@ -2549,6 +2581,7 @@ namespace Gtk {
                public weak Gtk.Widget ok_button;
                public weak Gtk.Widget cancel_button;
                public weak Gtk.Widget help_button;
+               [CCode (type = "GtkWidget*")]
                public ColorSelectionDialog (string title);
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
@@ -2566,8 +2599,11 @@ namespace Gtk {
                public weak string get_title ();
                public int get_wrap_width ();
                public void insert_text (int position, string text);
+               [CCode (type = "GtkWidget*")]
                public ComboBox ();
+               [CCode (type = "GtkWidget*")]
                public ComboBox.text ();
+               [CCode (type = "GtkWidget*")]
                public ComboBox.with_model (Gtk.TreeModel model);
                public void prepend_text (string text);
                public void remove_text (int position);
@@ -2605,8 +2641,11 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class ComboBoxEntry : Gtk.ComboBox, Atk.Implementor, Gtk.Buildable, Gtk.CellEditable, Gtk.CellLayout {
                public int get_text_column ();
+               [CCode (type = "GtkWidget*")]
                public ComboBoxEntry ();
+               [CCode (type = "GtkWidget*")]
                public ComboBoxEntry.text ();
+               [CCode (type = "GtkWidget*")]
                public ComboBoxEntry.with_model (Gtk.TreeModel model, int text_column);
                public void set_text_column (int text_column);
                public int text_column { get; set; }
@@ -2678,6 +2717,7 @@ namespace Gtk {
                [NoArrayLength]
                public weak float[] ctlpoint;
                public void get_vector (int veclen, float[] vector);
+               [CCode (type = "GtkWidget*")]
                public Curve ();
                public void reset ();
                public void set_curve_type (Gtk.CurveType type);
@@ -2706,7 +2746,9 @@ namespace Gtk {
                public void add_buttons (...);
                public bool get_has_separator ();
                public int get_response_for_widget (Gtk.Widget widget);
+               [CCode (type = "GtkWidget*")]
                public Dialog ();
+               [CCode (type = "GtkWidget*")]
                public Dialog.with_buttons (string? title, Gtk.Window? parent, Gtk.DialogFlags flags, ...);
                public int run ();
                [CCode (sentinel = "-1")]
@@ -2723,6 +2765,7 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class DrawingArea : Gtk.Widget, Atk.Implementor, Gtk.Buildable {
                public void* draw_data;
+               [CCode (type = "GtkWidget*")]
                public DrawingArea ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
@@ -2773,6 +2816,7 @@ namespace Gtk {
                public bool get_visibility ();
                public int get_width_chars ();
                public int layout_index_to_text_index (int layout_index);
+               [CCode (type = "GtkWidget*")]
                public Entry ();
                public void set_activates_default (bool setting);
                public void set_alignment (float xalign);
@@ -2865,6 +2909,7 @@ namespace Gtk {
        public class EventBox : Gtk.Bin, Atk.Implementor, Gtk.Buildable {
                public bool get_above_child ();
                public bool get_visible_window ();
+               [CCode (type = "GtkWidget*")]
                public EventBox ();
                public void set_above_child (bool above_child);
                public void set_visible_window (bool visible_window);
@@ -2879,7 +2924,9 @@ namespace Gtk {
                public int get_spacing ();
                public bool get_use_markup ();
                public bool get_use_underline ();
+               [CCode (type = "GtkWidget*")]
                public Expander (string label);
+               [CCode (type = "GtkWidget*")]
                public Expander.with_mnemonic (string label);
                public void set_expanded (bool expanded);
                public void set_label (string label);
@@ -2900,8 +2947,11 @@ namespace Gtk {
                public bool get_focus_on_click ();
                public weak string get_title ();
                public int get_width_chars ();
+               [CCode (type = "GtkWidget*")]
                public FileChooserButton (string title, Gtk.FileChooserAction action);
+               [CCode (type = "GtkWidget*")]
                public FileChooserButton.with_backend (string title, Gtk.FileChooserAction action, string backend);
+               [CCode (type = "GtkWidget*")]
                public FileChooserButton.with_dialog (Gtk.Widget dialog);
                public void set_focus_on_click (bool focus_on_click);
                public void set_title (string title);
@@ -2915,12 +2965,16 @@ namespace Gtk {
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class FileChooserDialog : Gtk.Dialog, Atk.Implementor, Gtk.Buildable, Gtk.FileChooser {
+               [CCode (type = "GtkWidget*")]
                public FileChooserDialog (string? title, Gtk.Window? parent, Gtk.FileChooserAction action, ...);
+               [CCode (type = "GtkWidget*")]
                public FileChooserDialog.with_backend (string? title, Gtk.Window? parent, Gtk.FileChooserAction action, string backend, ...);
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class FileChooserWidget : Gtk.VBox, Atk.Implementor, Gtk.Buildable, Gtk.FileChooser, Gtk.FileChooserEmbed {
+               [CCode (type = "GtkWidget*")]
                public FileChooserWidget (Gtk.FileChooserAction action);
+               [CCode (type = "GtkWidget*")]
                public FileChooserWidget.with_backend (Gtk.FileChooserAction action, string backend);
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
@@ -2940,6 +2994,7 @@ namespace Gtk {
                public weak GLib.List children;
                public bool get_has_window ();
                public void move (Gtk.Widget widget, int x, int y);
+               [CCode (type = "GtkWidget*")]
                public Fixed ();
                public void put (Gtk.Widget widget, int x, int y);
                public void set_has_window (bool has_window);
@@ -2952,7 +3007,9 @@ namespace Gtk {
                public weak string get_title ();
                public bool get_use_font ();
                public bool get_use_size ();
+               [CCode (type = "GtkWidget*")]
                public FontButton ();
+               [CCode (type = "GtkWidget*")]
                public FontButton.with_font (string fontname);
                public bool set_font_name (string fontname);
                public void set_show_size (bool show_size);
@@ -2985,6 +3042,7 @@ namespace Gtk {
                public int size;
                public weak string get_font_name ();
                public weak string get_preview_text ();
+               [CCode (type = "GtkWidget*")]
                public FontSelection ();
                public bool set_font_name (string fontname);
                public void set_preview_text (string text);
@@ -3005,6 +3063,7 @@ namespace Gtk {
                public bool auto_resize;
                public weak string get_font_name ();
                public weak string get_preview_text ();
+               [CCode (type = "GtkWidget*")]
                public FontSelectionDialog (string title);
                public bool set_font_name (string fontname);
                public void set_preview_text (string text);
@@ -3016,6 +3075,7 @@ namespace Gtk {
                public void get_label_align (float xalign, float yalign);
                public weak Gtk.Widget get_label_widget ();
                public Gtk.ShadowType get_shadow_type ();
+               [CCode (type = "GtkWidget*")]
                public Frame (string? label);
                public void set_label (string label);
                public void set_label_align (float xalign, float yalign);
@@ -3042,35 +3102,44 @@ namespace Gtk {
                public float gamma;
                public weak Gtk.Widget gamma_dialog;
                public weak Gtk.Widget gamma_text;
+               [CCode (type = "GtkWidget*")]
                public GammaCurve ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class HBox : Gtk.Box, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public HBox (bool homogeneous, int spacing);
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class HButtonBox : Gtk.ButtonBox, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public HButtonBox ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class HPaned : Gtk.Paned, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public HPaned ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class HRuler : Gtk.Ruler, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public HRuler ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class HScale : Gtk.Scale, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public HScale (Gtk.Adjustment adjustment);
+               [CCode (type = "GtkWidget*")]
                public HScale.with_range (double min, double max, double step);
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class HScrollbar : Gtk.Scrollbar, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public HScrollbar (Gtk.Adjustment adjustment);
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class HSeparator : Gtk.Separator, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public HSeparator ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
@@ -3087,6 +3156,7 @@ namespace Gtk {
                public Gtk.PositionType get_handle_position ();
                public Gtk.ShadowType get_shadow_type ();
                public Gtk.PositionType get_snap_edge ();
+               [CCode (type = "GtkWidget*")]
                public HandleBox ();
                public void set_handle_position (Gtk.PositionType position);
                public void set_shadow_type (Gtk.ShadowType type);
@@ -3131,6 +3201,7 @@ namespace Gtk {
                public uint in_hex_sequence;
                public uint modifiers_dropped;
                public void add_table (ushort data, int max_seq_len, int n_seqs);
+               [CCode (type = "GtkIMContext*")]
                public IMContextSimple ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
@@ -3138,6 +3209,7 @@ namespace Gtk {
                public weak Gtk.IMContext slave;
                public weak string context_id;
                public void append_menuitems (Gtk.MenuShell menushell);
+               [CCode (type = "GtkIMContext*")]
                public IMMulticontext ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
@@ -3203,7 +3275,9 @@ namespace Gtk {
                public int get_tooltip_column ();
                public bool get_tooltip_context (int x, int y, bool keyboard_tip, out weak Gtk.TreeModel model, out weak Gtk.TreePath path, out Gtk.TreeIter iter);
                public bool get_visible_range (out weak Gtk.TreePath start_path, out weak Gtk.TreePath end_path);
+               [CCode (type = "GtkWidget*")]
                public IconView ();
+               [CCode (type = "GtkWidget*")]
                public IconView.with_model (Gtk.TreeModel model);
                public bool path_is_selected (Gtk.TreePath path);
                public void scroll_to_path (Gtk.TreePath path, bool use_align, float row_align, float col_align);
@@ -3268,15 +3342,25 @@ namespace Gtk {
                public void get_pixmap (out weak Gdk.Pixmap pixmap, out weak Gdk.Bitmap mask);
                public void get_stock (out weak string stock_id, out Gtk.IconSize size);
                public Gtk.ImageType get_storage_type ();
+               [CCode (type = "GtkWidget*")]
                public Image ();
+               [CCode (type = "GtkWidget*")]
                public Image.from_animation (Gdk.PixbufAnimation animation);
+               [CCode (type = "GtkWidget*")]
                public Image.from_file (string filename);
+               [CCode (type = "GtkWidget*")]
                public Image.from_gicon (GLib.Icon icon, Gtk.IconSize size);
+               [CCode (type = "GtkWidget*")]
                public Image.from_icon_name (string icon_name, Gtk.IconSize size);
+               [CCode (type = "GtkWidget*")]
                public Image.from_icon_set (Gtk.IconSet icon_set, Gtk.IconSize size);
+               [CCode (type = "GtkWidget*")]
                public Image.from_image (Gdk.Image image, Gdk.Bitmap mask);
+               [CCode (type = "GtkWidget*")]
                public Image.from_pixbuf (Gdk.Pixbuf pixbuf);
+               [CCode (type = "GtkWidget*")]
                public Image.from_pixmap (Gdk.Pixmap pixmap, Gdk.Bitmap mask);
+               [CCode (type = "GtkWidget*")]
                public Image.from_stock (string stock_id, Gtk.IconSize size);
                public void set_from_animation (Gdk.PixbufAnimation animation);
                public void set_from_file (string filename);
@@ -3316,9 +3400,13 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class ImageMenuItem : Gtk.MenuItem, Atk.Implementor, Gtk.Buildable {
                public weak Gtk.Widget get_image ();
+               [CCode (type = "GtkWidget*")]
                public ImageMenuItem ();
+               [CCode (type = "GtkWidget*")]
                public ImageMenuItem.from_stock (string stock_id, Gtk.AccelGroup? accel_group);
+               [CCode (type = "GtkWidget*")]
                public ImageMenuItem.with_label (string label);
+               [CCode (type = "GtkWidget*")]
                public ImageMenuItem.with_mnemonic (string label);
                public void set_image (Gtk.Widget image);
                public Gtk.Widget image { get; set; }
@@ -3335,6 +3423,7 @@ namespace Gtk {
                public weak Gdk.Device current_device;
                public weak Gtk.Widget keys_list;
                public weak Gtk.Widget keys_listbox;
+               [CCode (type = "GtkWidget*")]
                public InputDialog ();
                public virtual signal void disable_device (Gdk.Device device);
                public virtual signal void enable_device (Gdk.Device device);
@@ -3343,7 +3432,9 @@ namespace Gtk {
        public class Invisible : Gtk.Widget, Atk.Implementor, Gtk.Buildable {
                public bool has_user_ref_count;
                public weak Gdk.Screen get_screen ();
+               [CCode (type = "GtkWidget*")]
                public Invisible ();
+               [CCode (type = "GtkWidget*")]
                public Invisible.for_screen (Gdk.Screen screen);
                public void set_screen (Gdk.Screen screen);
                public Gdk.Screen screen { get; set; }
@@ -3388,7 +3479,9 @@ namespace Gtk {
                public bool get_use_markup ();
                public bool get_use_underline ();
                public int get_width_chars ();
+               [CCode (type = "GtkWidget*")]
                public Label (string? str);
+               [CCode (type = "GtkWidget*")]
                public Label.with_mnemonic (string str);
                public void select_region (int start_offset, int end_offset);
                public void set_angle (double angle);
@@ -3448,6 +3541,7 @@ namespace Gtk {
                public void get_size (out uint width, out uint height);
                public weak Gtk.Adjustment get_vadjustment ();
                public void move (Gtk.Widget child_widget, int x, int y);
+               [CCode (type = "GtkWidget*")]
                public Layout (Gtk.Adjustment hadjustment, Gtk.Adjustment vadjustment);
                public void put (Gtk.Widget child_widget, int x, int y);
                public void set_hadjustment (Gtk.Adjustment adjustment);
@@ -3464,7 +3558,9 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class LinkButton : Gtk.Button, Atk.Implementor, Gtk.Buildable {
                public weak string get_uri ();
+               [CCode (type = "GtkWidget*")]
                public LinkButton (string uri);
+               [CCode (type = "GtkWidget*")]
                public LinkButton.with_label (string uri, string label);
                public void set_uri (string uri);
                public static weak Gtk.LinkButtonUriFunc set_uri_hook (Gtk.LinkButtonUriFunc func, void* data, GLib.DestroyNotify destroy);
@@ -3549,6 +3645,7 @@ namespace Gtk {
                public static weak GLib.List get_for_attach_widget (Gtk.Widget widget);
                public bool get_tearoff_state ();
                public weak string get_title ();
+               [CCode (type = "GtkWidget*")]
                public Menu ();
                public void popdown ();
                public void popup (Gtk.Widget? parent_menu_shell, Gtk.Widget? parent_menu_item, Gtk.MenuPositionFunc? func, uint button, uint activate_time);
@@ -3570,6 +3667,7 @@ namespace Gtk {
        public class MenuBar : Gtk.MenuShell, Atk.Implementor, Gtk.Buildable {
                public Gtk.PackDirection get_child_pack_direction ();
                public Gtk.PackDirection get_pack_direction ();
+               [CCode (type = "GtkWidget*")]
                public MenuBar ();
                public void set_child_pack_direction (Gtk.PackDirection child_pack_dir);
                public void set_pack_direction (Gtk.PackDirection pack_dir);
@@ -3591,8 +3689,11 @@ namespace Gtk {
                public uint timer;
                public bool get_right_justified ();
                public weak Gtk.Widget get_submenu ();
+               [CCode (type = "GtkWidget*")]
                public MenuItem ();
+               [CCode (type = "GtkWidget*")]
                public MenuItem.with_label (string label);
+               [CCode (type = "GtkWidget*")]
                public MenuItem.with_mnemonic (string label);
                public void set_accel_path (string accel_path);
                public void set_right_justified (bool right_justified);
@@ -3644,7 +3745,9 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class MenuToolButton : Gtk.ToolButton, Atk.Implementor, Gtk.Buildable {
                public weak Gtk.Widget get_menu ();
+               [CCode (type = "GtkToolItem*")]
                public MenuToolButton (Gtk.Widget icon_widget, string label);
+               [CCode (type = "GtkToolItem*")]
                public MenuToolButton.from_stock (string stock_id);
                public void set_arrow_tooltip_markup (string markup);
                public void set_arrow_tooltip_text (string text);
@@ -3657,7 +3760,9 @@ namespace Gtk {
                public weak Gtk.Widget label;
                public void format_secondary_markup (string message_format);
                public void format_secondary_text (string message_format);
+               [CCode (type = "GtkWidget*")]
                public MessageDialog (Gtk.Window? parent, Gtk.DialogFlags flags, Gtk.MessageType type, Gtk.ButtonsType buttons, string message_format, ...);
+               [CCode (type = "GtkWidget*")]
                public MessageDialog.with_markup (Gtk.Window? parent, Gtk.DialogFlags flags, Gtk.MessageType type, Gtk.ButtonsType buttons, string message_format, ...);
                public void set_image (Gtk.Widget image);
                public void set_markup (string str);
@@ -3695,6 +3800,7 @@ namespace Gtk {
        public class MountOperation : GLib.MountOperation {
                public weak Gtk.Window get_parent ();
                public weak Gdk.Screen get_screen ();
+               [CCode (type = "GMountOperation*")]
                public MountOperation (Gtk.Window parent);
                public void set_parent (Gtk.Window parent);
                public void set_screen (Gdk.Screen screen);
@@ -3739,6 +3845,7 @@ namespace Gtk {
                public Gtk.PositionType get_tab_pos ();
                public bool get_tab_reorderable (Gtk.Widget child);
                public int insert_page_menu (Gtk.Widget child, Gtk.Widget tab_label, Gtk.Widget menu_label, int position);
+               [CCode (type = "GtkWidget*")]
                public Notebook ();
                public void next_page ();
                public void popup_disable ();
@@ -3889,7 +3996,9 @@ namespace Gtk {
                public void @construct (Gdk.NativeWindow socket_id);
                public void construct_for_display (Gdk.Display display, Gdk.NativeWindow socket_id);
                public Gdk.NativeWindow get_id ();
+               [CCode (type = "GtkWidget*")]
                public Plug (Gdk.NativeWindow socket_id);
+               [CCode (type = "GtkWidget*")]
                public Plug.for_display (Gdk.Display display, Gdk.NativeWindow socket_id);
                [NoAccessorMethod]
                public bool embedded { get; }
@@ -4048,6 +4157,7 @@ namespace Gtk {
                public Gtk.ProgressBarOrientation get_orientation ();
                public double get_pulse_step ();
                public weak string get_text ();
+               [CCode (type = "GtkWidget*")]
                public ProgressBar ();
                public void pulse ();
                public void set_ellipsize (Pango.EllipsizeMode mode);
@@ -4087,11 +4197,17 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class RadioButton : Gtk.CheckButton, Atk.Implementor, Gtk.Buildable {
                public weak GLib.SList get_group ();
+               [CCode (type = "GtkWidget*")]
                public RadioButton (GLib.SList? group);
+               [CCode (type = "GtkWidget*")]
                public RadioButton.from_widget (Gtk.RadioButton radio_group_member);
+               [CCode (type = "GtkWidget*")]
                public RadioButton.with_label (GLib.SList? group, string label);
+               [CCode (type = "GtkWidget*")]
                public RadioButton.with_label_from_widget (Gtk.RadioButton radio_group_member, string label);
+               [CCode (type = "GtkWidget*")]
                public RadioButton.with_mnemonic (GLib.SList? group, string label);
+               [CCode (type = "GtkWidget*")]
                public RadioButton.with_mnemonic_from_widget (Gtk.RadioButton radio_group_member, string label);
                public void set_group (GLib.SList group);
                public Gtk.RadioButton group { set; }
@@ -4100,11 +4216,17 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class RadioMenuItem : Gtk.CheckMenuItem, Atk.Implementor, Gtk.Buildable {
                public weak GLib.SList get_group ();
+               [CCode (type = "GtkWidget*")]
                public RadioMenuItem (GLib.SList group);
+               [CCode (type = "GtkWidget*")]
                public RadioMenuItem.from_widget (Gtk.RadioMenuItem group);
+               [CCode (type = "GtkWidget*")]
                public RadioMenuItem.with_label (GLib.SList group, string label);
+               [CCode (type = "GtkWidget*")]
                public RadioMenuItem.with_label_from_widget (Gtk.RadioMenuItem group, string label);
+               [CCode (type = "GtkWidget*")]
                public RadioMenuItem.with_mnemonic (GLib.SList group, string label);
+               [CCode (type = "GtkWidget*")]
                public RadioMenuItem.with_mnemonic_from_widget (Gtk.RadioMenuItem group, string label);
                public void set_group (GLib.SList group);
                public Gtk.RadioMenuItem group { set; }
@@ -4113,9 +4235,13 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class RadioToolButton : Gtk.ToggleToolButton, Atk.Implementor, Gtk.Buildable {
                public weak GLib.SList get_group ();
+               [CCode (type = "GtkToolItem*")]
                public RadioToolButton (GLib.SList group);
+               [CCode (type = "GtkToolItem*")]
                public RadioToolButton.from_stock (GLib.SList group, string stock_id);
+               [CCode (type = "GtkToolItem*")]
                public RadioToolButton.from_widget (Gtk.RadioToolButton group);
+               [CCode (type = "GtkToolItem*")]
                public RadioToolButton.with_stock_from_widget (Gtk.RadioToolButton group, string stock_id);
                public void set_group (GLib.SList group);
                public Gtk.RadioToolButton group { set; }
@@ -4214,20 +4340,26 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class RecentAction : Gtk.Action, Gtk.Buildable, Gtk.RecentChooser {
                public bool get_show_numbers ();
+               [CCode (type = "GtkAction*")]
                public RecentAction (string name, string label, string tooltip, string stock_id);
+               [CCode (type = "GtkAction*")]
                public RecentAction.for_manager (string name, string label, string tooltip, string stock_id, Gtk.RecentManager manager);
                public void set_show_numbers (bool show_numbers);
                public bool show_numbers { get; set; }
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class RecentChooserDialog : Gtk.Dialog, Atk.Implementor, Gtk.Buildable, Gtk.RecentChooser {
+               [CCode (type = "GtkWidget*")]
                public RecentChooserDialog (string title, Gtk.Window parent, ...);
+               [CCode (type = "GtkWidget*")]
                public RecentChooserDialog.for_manager (string title, Gtk.Window parent, Gtk.RecentManager manager, ...);
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class RecentChooserMenu : Gtk.Menu, Atk.Implementor, Gtk.Buildable, Gtk.RecentChooser {
                public bool get_show_numbers ();
+               [CCode (type = "GtkWidget*")]
                public RecentChooserMenu ();
+               [CCode (type = "GtkWidget*")]
                public RecentChooserMenu.for_manager (Gtk.RecentManager manager);
                public void set_show_numbers (bool show_numbers);
                [NoWrapper]
@@ -4242,7 +4374,9 @@ namespace Gtk {
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class RecentChooserWidget : Gtk.VBox, Atk.Implementor, Gtk.Buildable, Gtk.RecentChooser {
+               [CCode (type = "GtkWidget*")]
                public RecentChooserWidget ();
+               [CCode (type = "GtkWidget*")]
                public RecentChooserWidget.for_manager (Gtk.RecentManager manager);
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
@@ -4326,6 +4460,7 @@ namespace Gtk {
                public weak Gtk.Widget minus_button;
                public weak Gtk.Adjustment get_adjustment ();
                public double get_value ();
+               [CCode (type = "GtkWidget*")]
                public ScaleButton (Gtk.IconSize size, double min, double max, double step, string[] icons);
                public void set_adjustment (Gtk.Adjustment adjustment);
                public void set_icons (string[] icons);
@@ -4358,6 +4493,7 @@ namespace Gtk {
                public Gtk.ShadowType get_shadow_type ();
                public weak Gtk.Adjustment get_vadjustment ();
                public weak Gtk.Widget get_vscrollbar ();
+               [CCode (type = "GtkWidget*")]
                public ScrolledWindow (Gtk.Adjustment? hadjustment, Gtk.Adjustment? vadjustment);
                public void set_hadjustment (Gtk.Adjustment hadjustment);
                public void set_placement (Gtk.CornerType window_placement);
@@ -4384,11 +4520,13 @@ namespace Gtk {
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class SeparatorMenuItem : Gtk.MenuItem, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public SeparatorMenuItem ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class SeparatorToolItem : Gtk.ToolItem, Atk.Implementor, Gtk.Buildable {
                public bool get_draw ();
+               [CCode (type = "GtkToolItem*")]
                public SeparatorToolItem ();
                public void set_draw (bool draw);
                public bool draw { get; set; }
@@ -4539,6 +4677,7 @@ namespace Gtk {
                public weak Gtk.Widget toplevel;
                public void add_id (Gdk.NativeWindow window_id);
                public Gdk.NativeWindow get_id ();
+               [CCode (type = "GtkWidget*")]
                public Socket ();
                public virtual signal void plug_added ();
                public virtual signal bool plug_removed ();
@@ -4564,7 +4703,9 @@ namespace Gtk {
                public double get_value ();
                public int get_value_as_int ();
                public bool get_wrap ();
+               [CCode (type = "GtkWidget*")]
                public SpinButton (Gtk.Adjustment adjustment, double climb_rate, uint digits);
+               [CCode (type = "GtkWidget*")]
                public SpinButton.with_range (double min, double max, double step);
                public void set_adjustment (Gtk.Adjustment adjustment);
                public void set_digits (uint digits);
@@ -4651,6 +4792,7 @@ namespace Gtk {
                public weak Gdk.Window grip_window;
                public uint get_context_id (string context_description);
                public bool get_has_resize_grip ();
+               [CCode (type = "GtkWidget*")]
                public Statusbar ();
                public void pop (uint context_id);
                public uint push (uint context_id, string text);
@@ -4782,6 +4924,7 @@ namespace Gtk {
                public uint get_default_row_spacing ();
                public bool get_homogeneous ();
                public uint get_row_spacing (uint row);
+               [CCode (type = "GtkWidget*")]
                public Table (uint rows, uint columns, bool homogeneous);
                public void resize (uint rows, uint columns);
                public void set_col_spacing (uint column, uint spacing);
@@ -4801,6 +4944,7 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class TearoffMenuItem : Gtk.MenuItem, Atk.Implementor, Gtk.Buildable {
                public uint torn_off;
+               [CCode (type = "GtkWidget*")]
                public TearoffMenuItem ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
@@ -5161,7 +5305,9 @@ namespace Gtk {
                public void move_child (Gtk.Widget child, int xpos, int ypos);
                public bool move_mark_onscreen (Gtk.TextMark mark);
                public bool move_visually (Gtk.TextIter iter, int count);
+               [CCode (type = "GtkWidget*")]
                public TextView ();
+               [CCode (type = "GtkWidget*")]
                public TextView.with_buffer (Gtk.TextBuffer buffer);
                public bool place_cursor_onscreen ();
                public void scroll_mark_onscreen (Gtk.TextMark mark);
@@ -5233,8 +5379,11 @@ namespace Gtk {
                public bool get_active ();
                public bool get_inconsistent ();
                public bool get_mode ();
+               [CCode (type = "GtkWidget*")]
                public ToggleButton ();
+               [CCode (type = "GtkWidget*")]
                public ToggleButton.with_label (string label);
+               [CCode (type = "GtkWidget*")]
                public ToggleButton.with_mnemonic (string label);
                public void set_active (bool is_active);
                public void set_inconsistent (bool setting);
@@ -5249,7 +5398,9 @@ namespace Gtk {
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class ToggleToolButton : Gtk.ToolButton, Atk.Implementor, Gtk.Buildable {
                public bool get_active ();
+               [CCode (type = "GtkToolItem*")]
                public ToggleToolButton ();
+               [CCode (type = "GtkToolItem*")]
                public ToggleToolButton.from_stock (string stock_id);
                public void set_active (bool is_active);
                public bool active { get; set; }
@@ -5263,7 +5414,9 @@ namespace Gtk {
                public weak Gtk.Widget get_label_widget ();
                public weak string get_stock_id ();
                public bool get_use_underline ();
+               [CCode (type = "GtkToolItem*")]
                public ToolButton (Gtk.Widget icon_widget, string label);
+               [CCode (type = "GtkToolItem*")]
                public ToolButton.from_stock (string stock_id);
                public void set_icon_name (string icon_name);
                public void set_icon_widget (Gtk.Widget icon_widget);
@@ -5325,6 +5478,7 @@ namespace Gtk {
                public bool get_show_arrow ();
                public bool get_tooltips ();
                public void insert (Gtk.ToolItem item, int pos);
+               [CCode (type = "GtkWidget*")]
                public Toolbar ();
                public void set_drop_highlight_item (Gtk.ToolItem tool_item, int index_);
                public void set_icon_size (Gtk.IconSize icon_size);
@@ -5366,6 +5520,7 @@ namespace Gtk {
                public void convert_iter_to_child_iter (out Gtk.TreeIter child_iter, Gtk.TreeIter filter_iter);
                public weak Gtk.TreePath convert_path_to_child_path (Gtk.TreePath filter_path);
                public weak Gtk.TreeModel get_model ();
+               [CCode (type = "GtkTreeModel*")]
                public TreeModelFilter (Gtk.TreeModel child_model, Gtk.TreePath? root);
                public void refilter ();
                public void set_modify_func (int n_columns, GLib.Type[] types, Gtk.TreeModelFilterModifyFunc func, void* data, Gtk.DestroyNotify destroy);
@@ -5401,6 +5556,7 @@ namespace Gtk {
                public weak Gtk.TreePath convert_path_to_child_path (Gtk.TreePath sorted_path);
                public weak Gtk.TreeModel get_model ();
                public bool iter_is_valid (Gtk.TreeIter iter);
+               [CCode (type = "GtkTreeModel*")]
                public TreeModelSort.with_model (Gtk.TreeModel child_model);
                public void reset_default_sort_func ();
                [NoAccessorMethod]
@@ -5536,7 +5692,9 @@ namespace Gtk {
                public bool is_rubber_banding_active ();
                public void map_expanded_rows (Gtk.TreeViewMappingFunc func, void* data);
                public void move_column_after (Gtk.TreeViewColumn column, Gtk.TreeViewColumn base_column);
+               [CCode (type = "GtkWidget*")]
                public TreeView ();
+               [CCode (type = "GtkWidget*")]
                public TreeView.with_model (Gtk.TreeModel model);
                public int remove_column (Gtk.TreeViewColumn column);
                public void scroll_to_cell (Gtk.TreePath? path, Gtk.TreeViewColumn? column, bool use_align, float row_align, float col_align);
@@ -5712,6 +5870,7 @@ namespace Gtk {
                public weak string get_ui ();
                public void insert_action_group (Gtk.ActionGroup action_group, int pos);
                public UIManager ();
+               [CCode (type = "guint")]
                public UIManager.merge_id (Gtk.UIManager self);
                public void remove_action_group (Gtk.ActionGroup action_group);
                public void remove_ui (uint merge_id);
@@ -5729,31 +5888,39 @@ namespace Gtk {
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class VBox : Gtk.Box, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public VBox (bool homogeneous, int spacing);
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class VButtonBox : Gtk.ButtonBox, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public VButtonBox ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class VPaned : Gtk.Paned, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public VPaned ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class VRuler : Gtk.Ruler, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public VRuler ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class VScale : Gtk.Scale, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public VScale (Gtk.Adjustment adjustment);
+               [CCode (type = "GtkWidget*")]
                public VScale.with_range (double min, double max, double step);
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class VScrollbar : Gtk.Scrollbar, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public VScrollbar (Gtk.Adjustment adjustment);
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class VSeparator : Gtk.Separator, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public VSeparator ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
@@ -5763,6 +5930,7 @@ namespace Gtk {
                public weak Gtk.Adjustment get_hadjustment ();
                public Gtk.ShadowType get_shadow_type ();
                public weak Gtk.Adjustment get_vadjustment ();
+               [CCode (type = "GtkWidget*")]
                public Viewport (Gtk.Adjustment hadjustment, Gtk.Adjustment vadjustment);
                public void set_hadjustment (Gtk.Adjustment adjustment);
                public void set_shadow_type (Gtk.ShadowType type);
@@ -5774,6 +5942,7 @@ namespace Gtk {
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
        public class VolumeButton : Gtk.ScaleButton, Atk.Implementor, Gtk.Buildable {
+               [CCode (type = "GtkWidget*")]
                public VolumeButton ();
        }
        [CCode (cheader_filename = "gtk/gtk.h")]
@@ -5848,6 +6017,7 @@ namespace Gtk {
                public void maximize ();
                public bool mnemonic_activate (uint keyval, Gdk.ModifierType modifier);
                public void move (int x, int y);
+               [CCode (type = "GtkWidget*")]
                public Window (Gtk.WindowType type);
                public bool parse_geometry (string geometry);
                public void present ();
index c97d87d..2b39443 100644 (file)
@@ -1257,6 +1257,15 @@ public class Vala.GIdlParser : CodeVisitor {
                        } else if (m.name.has_prefix ("new_")) {
                                m.name = m.name.offset ("new_".len ());
                        }
+                       // For classes, check whether a creation method return type equals to the
+                       // type of the class created. If the types do not match (e.g. in most
+                       // gtk widgets) add an attribute to the creation method indicating the used
+                       // return type.
+                       if (current_data_type is Class && res != null) {
+                               if ("%s*".printf (current_data_type.get_cname()) != res.type.unparsed) {
+                                       ((CreationMethod)m).custom_return_type_cname = res.type.unparsed;
+                               }
+                       }
                } else {
                        m = new Method (name, return_type, current_source_reference);
                }