Erstellen  Editieren  FrontPage  Index  Suchen  Veränderungen  Verlauf  RSS  Login

How to Implement Ruby-GNOME2

Code für Ruby-GNOME2 schreiben - aber wie?

Dieses Dokument erklärt, wie eine Erweiterung für Ruby-GNOME2 zu schreiben ist.

Signale und Eigenschaften

Zugriffsmethoden (set/get) für Eigenschaften werden automatisch generiert. Signale werden ebenso direkt von GLib::Instantiatable#signal_connect behandelt. Sie müssen also nicht von Hand geschrieben werden.

Überholte Klassen/Methoden

Im Englischen obsolete oder deprecated genannt, sind ü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önnen, steht G_DEF_CLASS2 zur Verfügung. Es wird eine neue Ruby-Klasse zurückgegeben.
G_DEF_CLASS3(gtype_name, name, module)
Definiert eine Klasse dynamisch. Nützlich für private gtype-Klassen wie GdkScreenX11 oder GdkWindowImplWin32. Diese Funktion hat keinen Rückgabewert. Solche Klassen können 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ügung, um die mark- und free-Funktionen selbst definieren zu können.
void rbgobj_boxed_not_copy_obj(GType gtype)
Benutzen Sie diese Methode, wenn Sie ein GBoxed-Objekt während seiner RVALUE-Umwandlung nicht kopiert werden soll (was z.B. bei GBOXED2RVAL oder G_INITIALIZE der Fall ist).

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önnen 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
Zuletzt geändert:2004/04/15 22:30:05
Stichworte:
Referenzen:[FrontPage]