Inicializadores de classe/instância
- Guia de accessibilidade para desenvolvedores GNOME
- O que é acessibilidade?
- Exemplos que usam a API de acessibilidade
- Implementando um objeto ATK
Você precisará configurar um inicializador de classe para o GObject se sua implementação AtkObject:
-
Redefine quaisquer chamadas de função definidas pelo pai do objeto. Isso geralmente é necessário quando um objeto precisa implementar uma função como atk_object_get_n_accessible_children(). Isso é necessário se o objeto possui um filho, mas eles não são representados com widgets.
Por exemplo, se sua implementação ATK precisa substituir a função AtkObject get_name() então o inicializador de classe seria algo como:
Example 1-8 Inicializador de classe que substitui a função get_name?() do paimyatkimp_mytype_class_init (GailLabelClass *klass) { AtkObjectClass *class = ATK_OBJECT_CLASS (klass); class->get_name = myatkimp_mytype_get_name; }
-
Requer uma função parent->init, parent->notify_gtk ou parent->finalize. Esse exemplo define todas as três:
Example 1-9 Inicializador de classe que define suas próprias init(), notify_gtk() e finalize()static ParentObjectType *parent_class = NULL; myatkimp_mytype_class_init (GailLabelClass *klass) { ParentObjectType *parent_class = (ParentObjectType*)klass; /* * Pegar a classe pai é necessária se as funções * init, notify_gtk ou finalize estiverem definidas. */ 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
Uma função parent->init() pode ser necessária se a implementação ATK precisar sfazer uma das duas coisas:
- Fazer cache de quaisquer dados obtidos do widget GTK backup.
- Ouve quaisquer sinais do widget GTK backup.
Aqui está um exemplo de ambos:
Example 1-10 Uma função init() personalizadavoid gail_tree_view_widget_init (MyatkimpMytype *mytype, GtkWidget *gtk_widget) { /* Certifica-se de chamar a função init do pai */ parent_class->init (widget, gtk_widget); /* Fazer cache de um valor na implementação ATK */ mytype->cached_value = gtk_widget_function_call(); /* Ouve um sinal */ gtk_signal_connect (GTK_OBJECT (gtk_widget), "signal-type", GTK_SIGNAL_FUNC (_myatkimp_mytype_signal_type), NULL); }
Neste exemplo, se o sinal signal-type especificado foi gerado no gtk_widget backup, então a função _myatkimp_mytype_signal_type() seria chamada.
-
parent->notify_gtk
Se a implementação ATK precisa ouvir a quaisquer notificações de propriedade no objeto GTK backup, uma função parent->notify_gtk() pode ser necessário. Por exemplo:
Example 1-11 Uma função 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) { /* Lida com a alteração de propósito. */ } else { parent_class->notify_gtk (obj, pspec); } }
-
parent->finalize
Se for necessário liberar quaisquer dados quando uma instância GObject é destruída, então uma função finalize() é necessária para liberar a memória. Por exemplo:
Example 1-12 Uma função 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); }
-