Klass-/Instansinitierare
- GNOME:s utvecklarguide för hjälpmedelsteknik
- Vad är tillgänglighet?
- Exempel som använder tillgänglighets-API:t
- Implementera ett ATK-objekt
Du kommer behöva konfigurera en klassinitierare för ditt GObject om din AtkObject-implementation antingen:
-
Omdefinierar funktionsanrop som definierats av objektets överordnade objekt. Detta är typiskt nödvändigt då ett objekt behöver implementera en funktion som atk_object_get_n_accessible_children(). Detta är nödvändigt om objektet har underordnade objekt, men de inte är representerade av komponenter.
Om till exempel din ATK-implementation behöver åsidosätta AtkObject-funktionen get_name() så skulle klassinitieraren se ut som:
Exempel 1-8 Klassinitierare som åsidosätter överordnad get_name()-funktionmyatkimp_mytype_class_init (GailLabelClass *klass) { AtkObjectClass *class = ATK_OBJECT_CLASS (klass); class->get_name = myatkimp_mytype_get_name; }
-
Kräver en parent->init-, parent->notify_gtk- eller parent->finalize-funktion. Detta exempel definierar alla tre:
Exempel 1-9 Klassinitierare som definierar sina egna init()-, notify_gtk()- och finalize()-funktionerstatic ParentObjectType *parent_class = NULL; myatkimp_mytype_class_init (GailLabelClass *klass) { ParentObjectType *parent_class = (ParentObjectType*)klass; /* * Att cacha parent_class är nödvändigt om funktionerna * init, notify_gtk eller finalize är konfigurerade. */ parent_class = g_type_class_ref (MYATKIMP_TYPE_PARENT); parent_class->init = myatkimp_mytype_widget_init; parent_class->notify_gtk = myatkimp_mytype_real_notify_gtk; parent_class->finalize = myatkimp_mytype_finalize; }
-
parent->init
En parent->init()-funktion kan behövas om ATK-implementationen behöver göra något av följande:
- Cacha alla data som erhålls från en bakomliggande GTK-komponent.
- Lyssna på alla signaler från bakomliggande GTK-komponent.
Här kommer ett exempel på båda:
Exempel 1-10 En anpassad init()-funktionvoid gail_tree_view_widget_init (MyatkimpMytype *mytype, GtkWidget *gtk_widget) { /* Säkerställ att anropa överordnad init-funktion */ parent_class->init (widget, gtk_widget); /* Cacha ett värde i ATK-implementationen */ mytype->cached_value = gtk_widget_function_call(); /* Lyssna på en signal */ gtk_signal_connect (GTK_OBJECT (gtk_widget), "signal-type", GTK_SIGNAL_FUNC (_myatkimp_mytype_signal_type), NULL); }
I detta exempel skulle, om den angivna signal-type-signalen genererades på bakomliggande gtk_widget, i så fall funktionen _myatkimp_mytype_signal_type() anropas.
-
parent->notify_gtk
Om ATK-implementationen behöver lyssna på några egenskapsaviseringar på det bakomliggande GTK-objektet, så kan en parent->notify_gtk()-funktion vara nödvändig. Till exempel:
Exempel 1-11 En anpassad notify_gtk()-funktionvoid myatkimp_mytype_real_notify_gtk (GObject *obj, GParamSpec *pspec) { GtkWidget *widget = GTK_WIDGET (obj); AtkObject* atk_obj = gtk_widget_get_accessible (widget); if (strcmp (pspec->name, "property-of-interest") == 0) { /* Hantera egenskapsändringen. */ } else { parent_class->notify_gtk (obj, pspec); } }
-
parent->finalize
Om det är nödvändigt att frigöra data när en GObject-instans förstörs så behövs en finalize()-funktion för att frigöra minnet. Till exempel:
Exempel 1-12 En anpassad finalize()-funktionvoid myatkimp_mytype_finalize (GObject *object) { MyAtkimpMyType *my_type = MYATKIMP_MYTYPE (object); g_object_unref (my_type->cached_value); G_OBJECT_CLASS (parent_class)->finalize (object); }
-