[ruby-gnome2-doc-cvs] [Hiki] create - Comment implementer Ruby-GNOME2

Back to archive index

ruby-****@sourc***** ruby-****@sourc*****
2003年 8月 15日 (金) 20:07:55 JST


-------------------------
REMOTE_ADDR = 217.117.54.155
REMOTE_HOST = 
        URL = http://ruby-gnome2.sourceforge.jp/fr?Comment+implementer+Ruby-GNOME2
-------------------------
= Comment impl駑enter Ruby-GNOME2
Ce document explique comment impl駑enter une extension Ruby-GNOME2.

== Signaux, propri騁駸
Des m騁hodes accesseurs sont automatiquement g駭駻馥s pour les propri騁駸.  Les signaux sont 馮alement support駸 directement par GLib::Instantiatable#signal_connect.  Vous n'avez donc plus besoin de les impl駑enter manuellement.

== M騁hodes/classes d駱r馗i馥s ou obsol鑼es
Ne les impl駑entez pas.

== Macros
Vous devez savoir qu'il existe plusieurs macros qui peuvent vous aider impl駑enter votre nouvelle classe/module plus facilement.  La plupart de ces macros sont dans les fichiers d'ent黎e glib/src/rbgobject.h, rbglib.h et gtk/src/rbgtk.h.

=== D馭inition d'une classe ou d'une interface
Ces macros sont utilis馥s dans les fonctions Init_*().

--- G_DEF_CLASS(gtype, name, module)
--- G_DEF_CLASS2(gtype, name, module, mark, free)
    D馭init une classe.  La seconde macro vous permet de d馭inir manuellement les fonctions de marquage et de lib駻ation de la m駑oire, utilis馥s par le ramasse-miettes ((- en anglais, ((*garbage collector*))-)).

--- G_DEF_INTERFACE(gtype, name, module)
--- G_DEF_INTERFACE2(gtype, name, module, mark, free)
    D馭init un module.  La seconde macro vous permet de d馭inir manuellement les fonctions de marquage et de lib駻ation de la m駑oire, utilis馥s par le ramasse-miettes.

--- void rbgobj_boxed_not_copy_obj(GType gtype)
    Utilisez cette fonction si l'objet GBoxed ne doit pas 黎re copipendant une conversion vers une valeur Ruby (par exemple dans GBOXED2RVAL ou G_INITIALIZE).

=== Initialisation d'un objet
Ces macros sont utilis馥s dans les constructeurs de classes (m騁hodes ((*initialize*)).

--- G_INITIALIZE(obj, cobj)
--- RBGTK_INITIALIZE(obj, gtkobj)
--- RBGST_INITIALIZE(obj, gstobj)
    Initialise un objet.  Si cette classe h駻ite de GtkObject, utilisez RBGTK_INITIALIZE.  Si cette classe h駻ite de GstObject, utilisez RBGST_INITIALIZE.

=== Conversion Ruby <-> GLib

--- RVAL2GOBJ(obj)
--- GOBJ2RVAL(gobj)
    VALUE(GLib::Object) <-> GObject

--- RVAL2BOXED(obj)
--- BOXED2RVAL(cobj, gtype)
    VALUE(GLib::Boxed) <-> GBoxed

--- RVAL2CSTR(v)
--- CSTR2RVAL(s)
    VALUE(String) <-> gchar*

--- RVAL2CBOOL(v)
--- CBOOL2RVAL(b)
    VALUE(true or false) <-> gboolean

--- GVAL2RVAL(v)
    GValue(GLib::Value) -> RValue. 
    RVAL2GVAL(v) n'est pas encore impl駑ent  Si vous d駸irez convertir une valeur Ruby en valeur GLib, utilisez alors ((<rbgobj_rvalue_to_gvalue()|#Conversion RValue vers GValue>)).

--- GEV2RVAL(ev)
--- RVAL2GEV(ev)
    VALUE(Gtk::Event) <-> GtkEvent

--- GLIST2ARY(list)
--- GSLIT2ARY(list)
    GList/GSList of GObject -> Array

--- GLIST2ARY2(list)
--- GSLIT2ARY2(list)
    GList/GSList of GBoxed -> Array

=== Conversion RGObjClassInfo <-> GType, classe/instance Ruby
--- CLASS2CINFO(klass)
    Class -> RGObjClassInfo
--- GTYPE2CINFO(gtype)
    GType -> RGObjClassInfo
--- RVAL2CINFO(obj)
    VALUE -> RGObjClassInfo

=== Conversion GType <-> Classe/instance Ruby
--- GTYPE2CLASS(gtype)
    GType -> Class
--- CLASS2GTYPE(klass)
    Class -> GType
--- RVAL2GTYPE(obj)
    VALUE -> GType

=== Relations
Ces macros permettent d'interagir avec le ramasse-miettes.  Dans ces macros, ((*obj*)) est g駭駻alement la variable ((*self*)) et ((*rel*)) est le widget/objet fils ou un objet ((*proc*)).

--- G_RELATIVE(obj, rel)
    Etabit une relation.  L'objet ne sera pas d騁ruit par le ramasse-miettes.
--- G_RELATIVE2(obj, rel, id, hash_key)
    Etabit une relation.  L'objet ne sera pas d騁ruit par le ramasse-miettes.  Cette relation peut-黎re retir馥 avec la macro suivante.
--- G_REMOVE_RELATIVE(obj, id, hash_key)
    Retire une relation existante.

=== M騁hodes ((*set*))
--- G_DEF_SETTER(classe, nom)
--- G_DEF_SETTERS(classe)
    Ces macros permettent d'impl駑enter automatiquement les m騁hodes d'affectation avec l'op駻ateur ((*=*)) partir des m騁hodes ((*set*)) traditionelles.  
    Voici comment 軋 fonctionne; vous impl駑entez par vous-m麥e la m騁hode set_hoge(uneValeur), et ensuite vous appelez G_DEF_SETTER(classe, "hoge").

 set_hoge(a)           #renvoie self (impl駑ent馥 par vous-m麥e)
 hoge=(a)              #renvoie a    (cr馥 automatiquement partir de set_hoge)

Si vous avez plusieurs cas de figure dans une m麥e classe, appelez alors G_DEF_SETTERS, qui se chargera de faire le m麥e travail pour toutes les m騁hodes ((*set*)).

=== Definition de constantes
--- G_DEF_CONSTANTS(mod, type, strip_prefix)
    D馭init automatiquement les constantes d'une classe ou d'un module partir d'un type GLib.
    Un exemple, tirdu code source de Gtk::Window:

 /* D馭init Gtk::Window::TOPLEVEL et Gtk::Window::POPUP. */
 G_DEF_CONSTANTS((gWindow, GTK_TYPE_WINDOW_TYPE, "GTK_WINDOW_");

--- G_RENAME_CONSTANT(orig, alt)
    Renomme des constantes pr饌lablement d馭inies par G_DEF_CONSTANTS().

=== Blocs
--- G_BLOCK_PROC()
    Il s'agit d'une macro qui appelle soit rb_f_lambda() (Yuby 1.7.x ou inf駻ieur), soit rb_block_proc() (Ruby 1.8.x ou sup駻ieur).
    Dans un soucis de portabilit vous ne devriez pas appeler directement rb_f_lambda() ou rb_block_proc().

=== Utilisez un tableau de hachage comme argument pour une propri騁--- G_SET_PROPERTIES(self, properties)
    Cette macro vous aidera impl駑enter set_hoge(a, {:foo => 0, :bar =>"hoge"}).

=== Propri騁駸 avec symboles
--- G_SET_SYMBOL_PROPERTY(gtype, name)
    Utilisez cette macro dans votre fonction Init_*() pour les propri騁駸 qui utilisent Symbol la place de String (par exemple comme Gtk::Stock).

=== Conversion RValue vers GValue
RVAL2GVAL(v) n'est pas encore impl駑ent  Si vous d駸irez convertir une valeur Ruby en valeur GLib, utilisez alors rbgobj_rvalue_to_gvalue():

  GValue gval = {0,};
  g_value_init(&gval, RVAL2GTYPE(value));
  
  rbgobj_rvalue_to_gvalue(value, &gval);
  /* Ensuite, utilisez gval... */

=== Impl駑enter une classe incompatible avec le syst鑪e de type GLib (sans macros G*_TYPE_*)
Vous pouvez utiliser soit la m騁hode traditionnelle, soit impl駑enter la classe comme un objet GBoxed.

Voici un exemple pour la classe ((*foo*)).

*1) Cr馥z la fonction suivante, qui se chargera de retourner un type GLib pour notre classe:

  GType foo_get_type(void) {
      static GType our_type = 0;
      if (our_type == 0) {
        our_type = g_boxed_type_register_static("Foo",
                                                (GBoxedCopyFunc)foo_copy,
                                                (GBoxedFreeFunc)g_free);
      }
      return our_type;
  }

*2) Cr馥z la fonction suivante, qui se chargera de retourner une copie d'un objet issu de notre classe:

  Foo* foo_copy(const Foo* foo) {
      Foo* new_foo;
      g_return_val_if_fail (foo != NULL, NULL);
      new_foo = g_new(Foo, sizeof(Foo));
      *new_foo = *foo;
      return new_foo;
  }

*3) D馭inissez une macro G*_TYPE_*:

  #define G_TYPE_FOO         (foo_get_type())

*4) Vous pouvez maintenant appelez dans votre fonction Init_*():

  void Init_foo(void) {
    VALUE cFoo = G_DEF_CLASS(G_TYPE_FOO, "Foo", unModule);
    /* ... */
  }

*5) Pour les conversions:

  /* Ruby -> GLib */
  RVAL2BOXED(objet, G_TYPE_FOO);

  /* GLib -> Ruby */
  BOXED2RVAL(objet, G_TYPE_FOO))

=== GError
--- RAISE_GERROR(GError* error)
    Lance une exception Ruby en fonction du code d'erreur encapsuldans la variable ((*error*)).

=== GLib::Instantiatable#signal_connect: corriger manuellement les variables pour le bloc de code 
--- G_DEF_SIGNAL_FUNC(klass, signal_name, signal_g2r_func);
--- signal_g2r_func(guint num, const GValue* values);
    A l'aide de ces macros, vous pouvez d馭inir par vous-m麥e les variables pour les blocs de code relatifs aux signaux.  Vous ne devriez les utiliser que dans des cas sp馗iaux (les signaux 騁ant automatiquement ger駸).

=== Editeurs
Si vous d騅eloppez Ruby-GNOME2 avec GNU Emacs, nous vous recommandons de personaliser votre fichier .emacs comme ceci:

 (c-add-style
  "ruby"
  '("bsd"
    (c-basic-offset . 4)
    (c-offsets-alist
     (case-label . 2)
     (label . 2)
      (statement-case-open . 2)
      (statement-case-intro . 2))))
 
 (add-hook 'c-mode-common-hook
           '(lambda () (setq indent-tabs-mode nil)))

- ((<Masao|URL:../hiki.cgi?Masao>))

Traduction de la page anglaise par Laurent Sansonetti.





ruby-gnome2-cvs メーリングリストの案内
Back to archive index