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

Back to archive index

ruby-****@sourc***** ruby-****@sourc*****
2003年 8月 15日 (金) 20:43:46 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():
  
    GValue gval = {0,};
    g_value_init(&gval, RVAL2GTYPE(value));
    
    rbgobj_rvalue_to_gvalue(value, &gval);
    /* Ensuite, utilisez gval... */
  
  --- 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).
  
  === 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:
+ (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);
+       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;
        }
-       return our_type;
-   }
  
- *2) Cr馥z la fonction suivante, qui se chargera de retourner une copie d'un objet issu de notre classe:
+ (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;
-   }
+       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_*:
+ (3) D馭inissez une macro G*_TYPE_*:
  
-   #define G_TYPE_FOO         (foo_get_type())
+       #define G_TYPE_FOO         (foo_get_type())
  
- *4) Vous pouvez maintenant appelez dans votre fonction Init_*():
+ (4) Vous pouvez maintenant appelez dans votre fonction Init_*():
  
-   void Init_foo(void) {
-     VALUE cFoo = G_DEF_CLASS(G_TYPE_FOO, "Foo", unModule);
-     /* ... */
-   }
+       void Init_foo(void) {
+           VALUE cFoo = G_DEF_CLASS(G_TYPE_FOO, "Foo", unModule);
+           /* ... */
+       }
  
- *5) Pour les conversions:
+ (5) Pour les conversions:
  
-   /* Ruby -> GLib */
-   RVAL2BOXED(objet, G_TYPE_FOO);
+       /* Ruby -> GLib */
+       RVAL2BOXED(objet, G_TYPE_FOO);
  
-   /* GLib -> Ruby */
-   BOXED2RVAL(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