Klass-/Instansinitierare

Du kommer behöva konfigurera en klassinitierare för ditt GObject om din AtkObject-implementation antingen:

  1. 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-8Klassinitierare som åsidosätter överordnad get_name()-funktion
    myatkimp_mytype_class_init (GailLabelClass *klass) 
    { 
      AtkObjectClass *class = ATK_OBJECT_CLASS (klass); 
      class->get_name = myatkimp_mytype_get_name; 
    } 
    
  2. Kräver en parent->init-, parent->notify_gtk- eller parent->finalize-funktion. Detta exempel definierar alla tre:

    Exempel 1-9Klassinitierare som definierar sina egna init()-, notify_gtk()- och finalize()-funktioner
    static 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; 
    }
    
    1. parent->init

      En parent->init()-funktion kan behövas om ATK-implementationen behöver göra något av följande:

      1. Cacha alla data som erhålls från en bakomliggande GTK-komponent.
      2. Lyssna på alla signaler från bakomliggande GTK-komponent.

      Här kommer ett exempel på båda:

      Exempel 1-10En anpassad init()-funktion
      void 
      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.

    2. 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-11En anpassad notify_gtk()-funktion
      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) 
         { 
            /* Hantera egenskapsändringen. */ 
         } 
         else 
         { 
            parent_class->notify_gtk (obj, pspec); 
         } 
      } 
      
    3. 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-12En anpassad finalize()-funktion
      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); 
      }