Inicializadores de classe/instância

Você precisará configurar um inicializador de classe para o GObject se sua implementação AtkObject:

  1. 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-8Inicializador de classe que substitui a função get_name?() do pai
    myatkimp_mytype_class_init (GailLabelClass *klass) 
    { 
      AtkObjectClass *class = ATK_OBJECT_CLASS (klass); 
      class->get_name = myatkimp_mytype_get_name; 
    } 
    
  2. Requer uma função parent->init, parent->notify_gtk ou parent->finalize. Esse exemplo define todas as três:

    Example 1-9Inicializador 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; 
    }
    
    1. parent->init

      Uma função parent->init() pode ser necessária se a implementação ATK precisar sfazer uma das duas coisas:

      1. Fazer cache de quaisquer dados obtidos do widget GTK backup.
      2. Ouve quaisquer sinais do widget GTK backup.

      Aqui está um exemplo de ambos:

      Example 1-10Uma função init() personalizada
      void 
      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.

    2. 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-11Uma função notify_gtk() personalizada
      void 
      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); 
         } 
      } 
      
    3. 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-12Uma função finalize() personalizada
      void 
      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); 
      }