ruby-****@sourc*****
ruby-****@sourc*****
2003年 8月 15日 (金) 20:38:22 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*)). + 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*)). + 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.