ruby-****@sourc*****
ruby-****@sourc*****
2004年 4月 15日 (木) 22:30:05 JST
------------------------- REMOTE_ADDR = 217.224.147.179 REMOTE_HOST = URL = http://ruby-gnome2.sourceforge.jp/de/?How+to+Implement+Ruby-GNOME2 ------------------------- =Code f$B(B Ruby-GNOME2 schreiben - aber wie? Dieses Dokument erkl$BgS(Bt, wie eine Erweiterung f$B(B Ruby-GNOME2 zu schreiben ist. ==Signale und Eigenschaften Zugriffsmethoden (((*set*))/((*get*))) f$B(B Eigenschaften werden automatisch generiert. Signale werden ebenso direkt von GLib::Instantiatable#signal_connect behandelt. Sie m$B(Bsen also nicht von Hand geschrieben werden. ==$B\b(Berholte Klassen/Methoden Im Englischen obsolete oder deprecated genannt, sind $B|b(Berholte Klassen auszusparen. ==Makros Es gibt einige Makros, die das Schreiben einer neuen Klasse oder Methode deutlich erleichtern. Fast alle dieser Makros befinden sich in den Header-Dateien glib/src/rbgobject.h, rbglib.h und gtk/src/rbgtk.h. === Klassen und Interfaces definieren Von diesen Makros wird in den Init_*()-Funktionen Gebrauch gemacht. --- G_DEF_CLASS(gtype, name, module) --- G_DEF_CLASS2(gtype, name, module, mark, free) Definiert eine Klasse. Um die "mark"- und "free"-Funktionen selbst definieren zu k$Bvn(Bnen, steht G_DEF_CLASS2 zur Verf$B|g(Bung. Es wird eine neue Ruby-Klasse zur$B|c(Bkgegeben. --- G_DEF_CLASS3(gtype_name, name, module) Definiert eine Klasse dynamisch. N$B|t(Bzlich f$B|r(B private gtype-Klassen wie GdkScreenX11 oder GdkWindowImplWin32. Diese Funktion hat keinen R$B|c(Bkgabewert. Solche Klassen k$Bvn(Bnen die Methoden und Konstanten nicht selbst definieren. Sie tauchen dort auf, wo eine Methode, die den private gtype erzeugt, von einem Ruby-Skript aufgerufen wird. --- G_DEF_INTERFACE(gtype, name, module) --- G_DEF_INTERFACE2(gtype, name, module, mark, free) Definiert ein Modul. G_DEF_INTERFACE2 steht zur Verf$B|g(Bung, um die mark- und free-Funktionen selbst definieren zu k$Bvn(Bnen. --- void rbgobj_boxed_not_copy_obj(GType gtype) - Benutzen Sie diese Methode, wenn das in einer GBox befindliche Objekt w$Bdh(Brend seiner RVALUE-Umwandlung nicht + Benutzen Sie diese Methode, wenn Sie ein GBoxed-Objekt w$Bdh(Brend seiner RVALUE-Umwandlung nicht kopiert werden soll (was z.B. bei GBOXED2RVAL oder G_INITIALIZE der Fall ist). - -- Objekte initialisieren + === Objekte initialisieren Diese Makros werden in den ((*initialize*))-Methoden benutzt: --- G_INITIALIZE(obj, cobj) --- RBGTK_INITIALIZE(obj,gtkobj) --- RBGST_INITIALIZE(obj,gstobj) Initialisiert ein Objekt. Wenn die Klasse von GtkObject abstammt, muss RBGTK_INITIALIZE verwandt werden. Wenn die Klasse von GstObject abstammt, muss entsprechend RBGST_INITIALIZE verwandt werden. === Umwandlungen: Ruby <-> Glib/Gtk --- 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) existiert noch nicht. Um einen RValue in einen GValue umzuwandeln, k$Bvn(Bnen Sie rbgobj_rvalue_to_gvalue() verwenden: GValue gval = {0,}; g_value_init(&gval, RVAL2GTYPE(value)); rbgobj_rvalue_to_gvalue(value, &gval); /* then use 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 + + === Umwandlungen: RGObjClassInfo <-> GType, Ruby class/instance + --- CLASS2CINFO(klass) + Class -> RGObjClassInfo + --- GTYPE2CINFO(gtype) + GType -> RGObjClassInfo + --- RVAL2CINFO(obj) + VALUE -> RGObjClassInfo + + === Umwandlungen: GType <-> Ruby class/instance + --- GTYPE2CLASS(gtype) + GType -> Class + --- CLASS2GTYPE(klass) + Class -> GType + --- RVAL2GTYPE(obj) + VALUE -> GType