Initialisateurs de classe/instance
- Guide d'accessibilité du bureau GNOME pour les développeurs
- Qu'est-ce que I'accessibilité ?
- Exemples d'utilisation de l'API d'accessibilité
- Implémentation d'un objet ATK
Vous allez devoir configurer un initialisateur de classe pour l'objet GObject dans l'un des deux cas suivants : si votre implémentation d'AtkObject
-
redéfinit un des appels de fonction défini par l'objet parent. C'est en général nécessaire quand un objet doit implémenter une fonction comme atk_object_get_n_accessible_children(). C'est nécessaire si l'objet possède des fils qui ne sont pas représentés par des éléments graphiques.
Par exemple, si votre implémentation ATK doit remplacer la fonction get_name() d'AtkObject alors l'initialisateur de classe ressemblera à :
Exemple I.8 Initialisateur de classe qui remplace la fonction get_name() du parent.mon_imp_atk_montype_class_init (GailLabelClass *klass) { AtkObjectClass *class = ATK_OBJECT_CLASS (klass); class->get_name = mon_imp_atk_montype_get_name; }
-
ou si elle requiert une fonction parent->init, parent->notify_gtk ou parent->finalize. Cet exemple définit les trois :
Exemple I.9 Initialisateur de classe qui définit ses propres fonctions init(), notify_gtk() et finalize()static ParentObjectType *parent_class = NULL; mon_imp_atk_montype_class_init (GailLabelClass *klass) { ParentObjectType *parent_class = (ParentObjectType*)klass; /* * La mise en cache de parent_class est nécessaire si les fonctions * init, notify_gtk ou finalize sont configurées. */ parent_class = g_type_class_ref (MONATKIMP_TYPE_PARENT); parent_class->init = mon_imp_atk_montype_widget_init; parent_class->notify_gtk = mon_imp_atk_montype_real_notify_gtk; parent_class->finalize = mon_imp_atk_montype_finalize; }
-
parent->init
Une fonction parent->init() peut être nécessaire si l'implémentation ATK a besoin d'effectuer l'une des actions suivantes :
- mettre en cache toutes les données obtenues à partir de l'élément graphique GTK auxiliaire,
- écouter tous les signaux émis par l'élément graphique GTK auxiliaire.
Voici un exemple des deux :
Exemple I.10 Une fonction personnalisée init()void gail_tree_view_widget_init (Monimpatkmontype *montype, GtkWidget *gtk_widget) { /* Être sûr d'appeler la fonction init du parent */ parent_class->init (widget, gtk_widget); /* Mettre en cache une valeur dans l'implementation ATK */ montype->cached_value = gtk_widget_function_call(); /* Écouter un signal */ gtk_signal_connect (GTK_OBJECT (gtk_widget), "type-signal", GTK_SIGNAL_FUNC (_mon_imp_atk_montype_signal_type), NULL); }
Dans cet exemple, si le signal type-signal spécifié est généré par le gtk_widget auxiliaire alors la fonction _mon_imp_atk_montype_signal_type() est appelée.
-
parent->notify_gtk
Si l'implémentation d'ATK doit écouter toutes les notifications de propriété de l'objet GTK auxiliaire, une fonction parent->notify_gtk() peut être nécessaire. Par exemple :
Exemple I.11 Une fonction personnalisée notify_gtk()void mon_imp_atk_montype_real_notify_gtk (GObject *obj, GParamSpec *pspec) { GtkWidget *widget = GTK_WIDGET (obj); AtkObject* atk_obj = gtk_widget_get_accessible (widget); if (strcmp (pspec->name, "propriété-concernée") == 0) { /* Gestion de la modification de propriété. */ } else { parent_class->notify_gtk (obj, pspec); } }
-
parent->finalize
S'il est nécessaire de libérer toutes les données quand une instance GObject est détruite alors il y a besoin d'une fonction finalize() pour libérer la mémoire. Par exemple :
Exemple I.12 Une fonction personnalisée finalize()void mon_imp_atk_montype_finalize (GObject *object) { MonImpAtkMonType *mon_type = MONIMPATK_MONTYPE (object); g_object_unref (mon_type->cached_value); G_OBJECT_CLASS (parent_class)->finalize (object); }
-