Inicializadores de clases/instancias
- Guía de accesibilidad para los desarrolladores de GNOME
- ¿Qué es la accesibilidad?
- Ejemplos que usan la API de accesibilidad
- Implementar un objeto ATK
Deberá tener creada un inicializador de clases para el GObject si su implementación de AtkObject:
-
Redefina cualquier llamada de función por el padre del objeto. Generalmente esto es necesario cuando un objeto necesita implementar una función como atk_object_get_n_accessible_children(). Es necesario si el objeto tiene hijos pero no están representados con los widgets.
Por ejemplo, si su implementación de ATK necesita pasar por encima del tipo AtkObject de la función get_name(), entonces las clases inicializadas podrían ser así:
Ejemplo 1-8 Inicializador de clase que sobreescribe la función padre get_name()myatkimp_mytype_class_init (GailLabelClass *klass) { AtkObjectClass *class = ATK_OBJECT_CLASS (klass); class->get_name = myatkimp_mytype_get_name; }
-
Requere una función parent->init, parent->notify_gtk, o parent->finalize. Este ejemplo define las tres:
Ejemplo 1-9 Inicializador de clases que define su propia función init(), notify_gtk() y finalize()static ParentObjectType *parent_class = NULL; myatkimp_mytype_class_init (GailLabelClass *klass) { ParentObjectType *parent_class = (ParentObjectType*)klass; /* * Es necesario almacenar en caché «parent_class» si se * configuran las funciones init, notify_gtk, o finalize. */ 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
Se puede necesitar una función parent->init() si la implementación de ATK necesita hacer cualquiera de las siguientes:
- Cachear cualquier dato obtenido desde un respaldo del widget de GTK.
- Escuche cualquier señal desde el widget GTK de respaldo.
Aquí hay un ejemplo de ambas:
Ejemplo 1-10 Una función init() personalizadavoid gail_tree_view_widget_init (MyatkimpMytype *mytype, GtkWidget *gtk_widget) { /* Asegúrese de llamar a la función de inicio de los padres */ parent_class->init (widget, gtk_widget); /* Caché un valor en la implementación de ATK */ mytype->cached_value = gtk_widget_function_call(); /* Esperar una señal */ gtk_signal_connect (GTK_OBJECT (gtk_widget), "signal-type", GTK_SIGNAL_FUNC (_myatkimp_mytype_signal_type), NULL); }
En este ejemplo, si la señal especificada signal-type se generase en el respaldo de gtk_widget, entonces se podría llamar a la función _myatkimp_mytype_signal_type().
-
parent->notify_gtk
Si la implementación de ATK necesita escuchar cualquier notificación de propiedad en el respaldo del objeto GTK, podría ser necesaria una función parent->notify_gtk(). Por ejemplo:
Ejemplo 1-11 Una función notify_gtk() personalizadavoid 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) { /* Gestionar el cambio de la propiedad. */ } else { parent_class->notify_gtk (obj, pspec); } }
-
parent->finalize
Si es necesario para liberar cualquier dato cuando se destruye una instancia de GObject, entonces se necesita una función finalize() para liberar la memoria. Por ejemplo:
Ejemplo 1-12 Una función finalize() personalizadavoid 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); }
-