[Gtk-sharp-list] Gtk# constructors

Charles Iliya Krempeaux charles@reptile.ca
18 Feb 2003 09:51:52 -0800


Hello,

On Tue, 2003-02-18 at 08:59, Lee Mallabone wrote:
> On Tue, 2003-02-18 at 16:43, Charles Iliya Krempeaux wrote:
> > [...]
> > 
> > > 2: public HBox(IntPtr raw) : base(raw) {}
> > 
> > This one is necessary for people creating bindings.  You would
> > use this if you had a PInvoke procedure that returned a (C based)
> > GtkHBox struct.
> 
> Maybe I've got the wrong end of the stick here... Are you talking about people making bindings around the C# API, but using the C API themselves to manipulate their C based Gtk+ objects with the Gtk C# calls?
> 
> Because if that's what you're saying, Why would anyone do that?? :)

No.  (I'm talking about people who are wrapping C API's.)

Let me give you an example.  Maybe that would be helpful.

OK, we have the C API called librsvg.  (Also just called rsvg.)
Now, I am making a .NET wrapper to this.  That way people can
use librsvg in the C# programs.

Now, alot of the work is automatically done [basically] by two
programs -- gapi.pl and gapi_codegen.exe.  However, not everything
is done by these two programs.  So I had to do some wrapping by
hand.

In the librsvg C API, there is the following procedure which did
NOT get wrapped:

    GdkPixbuf *rsvg_pixbuf_from_file( const gchar  *file_name
                                    , GError **error
                                    );

So, I had to wrap this myself, by hand.  So... I imported that
C procedure into C# using the following call:

  [System.Runtime.InteropServices.DllImport("rsvg-2")]
  static extern
  System.IntPtr rsvg_pixbuf_from_file( string file_name
                                     , out System.IntPtr error
                                     );

(Don't worry about what it means, or why it looks different than the
C declaration.  It's just how you import that C procedure into C#.)

Then, I make a C# procedure with the following signature:

    public static Gdk.Pixbuf PixbufFromFile(string file_name)

(This is what people writing C# programs will call.)

Now, this procedure returns a C# "Gdk.Pixbuf" class.  But (the
C procedure) "rsvg_pixbuf_from_file" returns a "GdkPixbuf *".

So I need to change a the C struct "GdkPixbuf *" into the
C# class "Gdk.Pixbuf".

And the way I do that is through the constructor:

    Gdk.Pixbuf(IntPtr raw)

This constructor lets me pass it a C struct "GdkPixbuf *" and
gives me a C# class "Gdk.Pixbuf".

Basically, the call comes down to a:

  public static Gdk.Pixbuf PixbufFromFile(string file_name)
  {
      return new Gdk.Pixbuf( rsvg_pixbuf_from_file(file_name, error) );
  }

(Although the real code does more stuff... like error checking.
But....)  Notice that the C procedure is being called; and the
C struct "GdkPixbuf *" is being passed to that constructor, which
returns a C# class "Gdk.Pixbuf".  Which is what we wanted.

The same goes for that HBox constructor you mentioned.

I hope that explained things.


See ya

-- 
     Charles Iliya Krempeaux, BSc
     charles@reptile.ca

________________________________________________________________________
 Reptile Consulting & Services    604-REPTILE    http://www.reptile.ca/