Provided by: libglib-perl_1.329.3-3build3_amd64 bug

NAME

       Glib::devel - Binding developer's overview of Glib's internals

DESCRIPTION

       Do you need to know how the gtk2-perl language bindings work, or need to write your own language bindings
       for a Glib/Gtk2-based library?  Then you've come to the right place.  If you are just a perl developer
       wanting to write programs with Glib or Gtk2, then this is probably way over your head.

       This document began its life as a post to gtk-perl-list about a redesign of the fundamentals of the
       bindings; today it is the reference documentation for the developers of the bindings.

       To reduce confusion, refer to GLib, the C library, with a capital L, and Glib the perl module with a
       lower-case l.  While the Gtk2 module is the primary client of Glib, it is not necessarily the only one;
       in fact, the perl bindings for the GStreamer library build directly atop Glib.  Therefore, this document
       describes just the GLib/Glib basics.  For details on how Gtk2 extends upon the concepts presented here,
       see Gtk2::devel.

       In various places, we use the name GPerl to refer to the actual binding subsystem.

       In order to avoid getting very quickly out of date, this document doesn't go into great detail on APIs.
       gperl.h is rather heavily commented, and should be considered the canonical source of correct API
       information.

Basic Philosophy

       GLib is a portability library for C programs, providing a common set of APIs and services on various
       platforms.  Along with that you get libgobject, which provides an inheritance-based type system and other
       spiffy things.

       Glib, as a perl module, must decide which portions of GLib's facilities to map to perl and which to
       abstract and encapsulate.

       In the grand scheme, the bindings have been designed with a few basic tenets in mind:

       -   Stick close to the C API, to allow a perl developer to use knowledge from the C API and API reference
           docs with the perl bindings; this is overruled in some places by the remaining tenets.

       -   Be  perlish.   This  is  the  most important.  The user of the perl bindings should not have to worry
           about memory management, reference counting, freeing objects, and all that stuff, else  he  might  as
           well go write in C instead.

       -   Leave out deprecated functionality.

       -   Don't  add new functionality.  The exceptions to this rule are consolidation of methods where default
           parameters may be used, or where the direct analog from C is not practical.

       -   Be lightweight.  As little indirection and bloat as possible.  If possible, implement  each  toplevel
           module (e.g., Glib, Gtk2, Gnome2, GtkHTML, etc) as one .pm and one .so.

       -   Be  extensible.   Export  header files and typemaps so that other modules can easily chain off of our
           base.  Do not require the entirely of Gtk2 for someone who needs only to build atop GObject.

The Glib Module

       In keeping with the tenet of not requiring the entire car for someone who only needs a  single  wheel,  I
       broke  the  glib/gobject  library  family  into  its  own  module and namespace.  This has proved to be a
       godsend, as it has made things very easy to debug; there's a clean separation between  the  base  of  the
       type system and the stuff on top of it.

       The  Glib  module  takes  care  of  all the basic types handled by the GObject library --- GEnum, GFlags,
       GBoxed, GObject, GValue, GClosure --- as well has signal marshalling and such in GSignal.   I'll  discuss
       each of these separately.

       In  practice,  you will rarely see direct calls to the functions that convert objects in and out of perl.
       Most code should use the C preprocessor to provide easier-to-remember names  that  follow  the  perl  API
       style,  e.g.,  newSVGObject(obj)  rather  than  gperl_new_object(type,obj)  and  SvGObject(sv) instead of
       gperl_get_gobject(type, sv).  The convention used in all of gtk2-perl is described in Gtk2::devel.

   Wrappers
       FIXME maybe this section should be rolled into the GBoxed and GObject sections?

       In order to use the C data structures from Perl, we need to wrap those objects up in  Perl  objects.   In
       general,  a  Perl  object  is simply a blessed reference.  A typical scheme for representing C objects in
       perl is bless a reference to a scalar holding the C pointer  value;  perl  will  destroy  the  reference-
       counted  scalar  when  there  are no more references to it, and one would normally destroy the underlying
       data structure at this point.  However, GLib is a little more complex than your  typical  C  library,  so
       this easy, typical setup won't work for us.

       GBoxed  types are opaque wrappers for C structures, providing copy and free functions, to allow the types
       to be used generically.  For the most part we can get away with using the typical scheme described  above
       to  provide  an  opaque  object,  but  in  some  instances  an  opaque object is very alien in perl.  The
       Glib::Boxed section explains how we get around this.

       GObject, on the other hand, is a type-aware, reference-counted object with lifetime semantics that differ
       somewhat from perl SVs.  Thus we need something a bit more sophisticated than a plain old opaque wrapper;
       in fact, we use a blessed hash reference with the pointer to the C object tucked away in attached  magic,
       and  a  pointer  to the SV stored in the GObject's user data.  The combined perl/C object does some nifty
       reference-count borrowing to ensure that object lifetime is managed correctly.

       If an object is created by a function that returns directly to perl, then the wrapper  returned  by  that
       function  should  "own"  the  object.   If  no  other code assumes ownership of that object (by ref'ing a
       GObject or copying a GBoxed), then the object should be destroyed  when  the  perl  scalar  is  destroyed
       (actually, as part of its destruction).

       If  a  function  returns a preexisting object owned by someone else, then the bindings should NOT destroy
       the object with the perl wrapper.  How we handle this for the various types is described below.

   GType to Package Mappings
       GType is the GObject library's unique type identifier; this is a runtime variable, because GLib types may
       be loaded dynamically.  The direct analog in perl is  the  package  name,  which  uniquely  specifies  an
       object's  class.   Since  these  do  about  the same thing, we completely replace the GType with the perl
       package.

       For various reasons, mostly to do with robustness and performance, there is a one-to-one mapping  between
       GType  classes  and  perl  package  names.   These  must  be  registered,  usually  as part of the module
       initialization process.

       In addition, the type system tries as hard as it can to recover when things  don't  go  well,  using  the
       GType  system  to  its  advantage.  If you return a C object of a type that is not registered with Gperl,
       such as MyCustomTypeFoo, gperl_new_object (see below) will warn you  that  it  has  blessed  the  unknown
       MyCustomTypeFoo into the first known package in its ancestry, Gtk2::VBox.

       GBoxed  and  GObject have distinct mapping registries to avoid cross-pollination and mistakes in the type
       system.  See below.

       To assist in handling inheritance that isn't  specified  directly  by  the  GType  system,  the  function
       gperl_set_isa  allows you to add elements to the @ISA for a package.  gperl_register_object does this for
       you,  but  you  may  need  to  add  additional  parents,  e.g.,  for  implementing   GInterfaces.    (see
       Gtk2/xs/GtkEntry.xs for an example)

       You  may be thinking that we could use substitution rules to map the GObject classes to perl packages. In
       practice, this is a bad idea, fraught with problems; the substitution rules are not easily extendable and
       are easily broken by extension packages which don't follow the naming conventions.

   GEnums and GFlags
       GLib provides a mechanism for creating  runtime  type  information  about  enumeration  and  flag  types.
       Enumerations  are  lists  of  specific values, one of which may be used at at time, whereas multiple flag
       values may be supplied at a time.  In C flags are meant to be used with bitfields.  A GType is associated
       with the various valid values for a given GEnum or GFlags type as strings, in both full-name and nickname
       forms.

       GPerl uses this mechanism to avoid the need to know integer values for enum and flag types  at  the  perl
       level.   An  enum  value  is just a string; a bitfield of flag values is represented as a reference to an
       array of strings.  These strings are  the  GLib-provided  nicknames.   For  the  convenience  of  a  perl
       developer,  the bindings treat '-' and '_' as equivalent when looking up the corresponding integer values
       during conversion.

       A GEnum or GFlags type mapping should be registered with

        void gperl_register_fundamental (GType gtype, const char * package);

       so that their package names can be used where a GType is required (for example, as GObject property types
       or GtkTreeModel column types).

       The basic functions for converting between C and perl values are

        /* croak if val is not part of type, otherwise return
         * corresponding value.  this is the general case. */
        gint gperl_convert_enum (GType type, SV * val);

        /* return a scalar which is the nickname of the enum value
         * val, or croak if val is not a member of the enum. */
        SV * gperl_convert_back_enum (GType type, gint val);

        /* collapse a list of strings to an integer with all the
         * correct bits set, croak if anything is invalid. */
        gint gperl_convert_flags (GType type, SV * val);

        /* convert a bitfield to a list of strings, or croak. */
        SV * gperl_convert_back_flags (GType type, gint val);

       Other utility functions allow for finer-grained control, such as the  ability  to  pass  unknown  values,
       which  can  be  necessary in special cases.  In general, each of these functions raises an exception when
       something goes wrong.  To be helpful, they croak with a  message  listing  the  valid  values  when  they
       encounter invalid input.

   GBoxed
       GBoxed  provides  a  way to register functions that create, copy, and destroy opaque structures.  For our
       purposes, we'll allow any perl package to inherit from Glib::Boxed and implement accessors for the struct
       members, but Glib::Boxed will handle the object and wrapper lifetime issues.

       There are two functions for creating boxed wrappers:

        SV * gperl_new_boxed (gpointer boxed, GType gtype, gboolean own);
        SV * gperl_new_boxed_copy (gpointer boxed, GType gtype);

       If own is TRUE, the wrapper returned by gperl_new_boxed will take boxed with it when  it  dies.   In  the
       case of a copy, own is implied, so there's a separate function which doesn't need the own option.

       To  get  a boxed pointer out of a scalar wrapper, you just call gperl_get_boxed_check --- this will croak
       if the sv is undef or not blessed into the specified package.

       When you register a boxed type you get the option of supplying a table of  function  pointers  describing
       how  the  boxed  object  should  be  wrapped, unwrapped, and destroyed.  This allows you to decide in the
       wrapping function what subclass of the boxed type's class the wrapper should actually take (a trick  used
       by Gtk2::Gdk::Event), or represent a boxed type as a native perl type (such as using array references for
       Gnome2::Canvas::Point  objects).   All  of  this happens automagically, behind the scenes, and most types
       assume the default wrapper class.

       See the commentary in gperl.h for more information.

   GObject
       The GObject knows its own type.  Thus, we need only one  parameter  to  create  a  GObject  wrapper.   In
       reality, we ask for two:

        SV * gperl_new_object (GObject * object, gboolean own);

       The  wrapper  SV  will  be  blessed into the package corresponding to the gtype returned by G_OBJECT_TYPE
       (object), that is, the bottommost type in the inheritance chain.  If that bottommost type is  not  known,
       the  function  walks  back  up  the tree until it finds one that's known, blesses the reference into that
       package, and spits out a warning on stderr.  To hush the warning, you need merely call

       In general, this process will claim a reference on the GObject  (with  g_object_ref()),  so  that  the  C
       object  stays  alive  so  long as there is a perl wrapper for it.  If <i>own</i> is set to TRUE, the perl
       wrapper will claim ownership of the C object by removing that reference; in theory, for  a  new  GObject,
       fresh  from  a constructor, this leaves the object with a single reference owned by the perl object.  The
       next question out of your mouth should be, "But what about GObject derivatives that  require  sinking  or
       other  strange  methods  to claim ownership?"  For the answer, see the GtkObject section's description of
       sink functions.

        void gperl_register_object (GType gtype, const char * package);

       This magical function also sets up the @ISA for the package to point  to  the  package  corresponding  to
       g_type_parent  (gtype).   [Since  this  requires  the  parent package to be registered, there is a simple
       deferral mechanism, which means your @ISA might not be set until the next call to gperl_register_object.]

       There are two ways to get an object out of an SV (though I think only one is really needed):

        GObject * gperl_get_object (SV * sv);
        GObject * gperl_get_object_check (SV * sv, GType gtype);

       The second one is like the first, but croaks if the object is not derived from gtype.

       You can get and set object data and object parameters just like you'd expect.

   GSignal
       All of this GObject stuff wouldn't be very useful if you couldn't connect signals and  closures.   I  got
       most  of  my handling code from gtk2-perl and pygtk, and it's pretty straightforward.  The data member is
       optional, and must be a scalar.

       To connect perl subroutines to GSignals I use GClosures, which require the handling of GValues.

   GPerlClosure
       Use a GPerlClosure wherever you could use a GClosure and things should work out great.   FIXME  say  more
       here

   GPerlCallback
       Function  pointers  are  required  in many places throughout gtk+, usually for a callback to be used as a
       "foreach" function or for some other purpose.  Unfortunately, a majority of these spots  aren't  designed
       to  work with GClosures (usually by lacking a way to destroy data associated with the callback when it is
       no longer needed).  For this purpose, the GPerlCallback wraps up the gruntwork of using perl's call_sv to
       use a callback function directly.

SEE ALSO

       perl(1),     perlxs(1),     perlguts(1),      perlapi(1),      perlxstut(1),      ExtUtils::Depends(3pm),
       ExtUtils::PkgConfig(3pm) Glib(3pm), Glib::Object::Subclass(3pm), Glib::xsapi(3pm)

AUTHOR

       muppet <scott at asofyet.org>

COPYRIGHT

       Copyright (C) 2003 by the gtk2-perl team (see the file AUTHORS for the full list)

       This  library  is  free  software;  you  can  redistribute it and/or modify it under the terms of the GNU
       Library General Public License as published by the Free Software Foundation; either version  2.1  of  the
       License, or (at your option) any later version.

       This  library  is  distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
       the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General
       Public License for more details.

       You should have received a copy of the GNU Library General Public License along  with  this  library;  if
       not,  write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
       USA.

perl v5.38.2                                       2024-03-31                                         devel(3pm)