Αρχικοποιήσεις κλάσης/υπόδειξης

Θα πρέπει να ρυθμίσετε μία αρχικοποίηση κλάσης για το GObject αν η εκτέλεση AtkObject είτε:

  1. Ορίζει ξανά οποιεσδήποτε κλήσεις συναρτήσεων καθορίστηκαν από το ριζικό κατάλογο του αντικειμένου. Αυτό είναι τυπικά απαραίτητο όταν ένα αντικείμενο πρέπει να εκτελέσει μία συνάρτηση όπως η atk_object_get_n_accessible_children(). Αυτό είναι απαραίτητο αν το αντικείμενο έχει θυγατρικό κατάλογο, αλλά δεν αντιπροσωπεύεται με γραφικά συστατικά.

    Για παράδειγμα, αν η εκτέλεση ΑΤΚ πρέπει να παρακάμψει τη συνάρτηση AtkObject get_name(), τότε η αρχικοποίηση κλάσης θα μοιάζει κάπως έτσι:

    Παράδειγμα 1-8Αρχικοποίηση κλάσης η οποία παρακάμπτει την τη συνάρτηση get_name() του ριζικού καταλόγου
    myatkimp_mytype_class_init (GailLabelClass *klass) 
    { 
      AtkObjectClass *class = ATK_OBJECT_CLASS (klass); 
      class->get_name = myatkimp_mytype_get_name; 
    } 
    
  2. Απαιτεί μία συνάρτηση parent->init, μία parent->notify_gtk, ή μία parent->finalize function. Το παράδειγμα αυτό ορίζει και τις τρεις:

    Παράδειγμα 1-9Αρχικοποίηση κλάσης που ορίζει τις δικές της συναρτήσεις init(), notify_gtk() και finalize()
    static ParentObjectType *parent_class = NULL; 
    
    myatkimp_mytype_class_init (GailLabelClass *klass) 
    { 
       ParentObjectType *parent_class = (ParentObjectType*)klass; 
    
       /* 
        * Caching the parent_class is necessary if the init, 
        * notify_gtk, or finalize functions are set up. 
        */ 
        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

      Ενδεχομένως να είναι απαραίτητα μία συνάρτηση parent->init() αν η εκτέλεση ΑΤΚ χρειάζεται να εφαρμόζει τα ακόλουθα:

      1. Αποθήκευση όλων των δεδομένων που λήφθηκαν από ένα γραφικό συστατικό υποστήριξης GTK.
      2. Ακρόαση οποιουδήποτε σήματος από το γραφικό συστατικό υποστήριξης GTK.

      Δείτε ένα παράδειγμα και για τις δύο περιπτώσεις:

      Παράδειγμα 1-10Μία προσαρμοσμένη συνάρτηση init()
      void 
      gail_tree_view_widget_init (MyatkimpMytype  *mytype, 
                                  GtkWidget       *gtk_widget) 
      { 
         /* Make sure to call the parent's init function */ 
         parent_class->init (widget, gtk_widget); 
         
         /* Cache a value in the ATK implementation */ 
         mytype->cached_value = gtk_widget_function_call(); 
      
         /* Listen to a signal */ 
         gtk_signal_connect (GTK_OBJECT (gtk_widget), 
                             "signal-type", 
                             GTK_SIGNAL_FUNC (_myatkimp_mytype_signal_type), 
                             NULL); 
      } 
      

      Στο παράδειγμα αυτό, αν το καθορισμένο σήμα signal-type δημιουργήθηκε στο gtk_widgetυποστήριξης , τότε θα κληθεί η συνάρτηση _myatkimp_mytype_signal_type().

    2. parent->notify_gtk

      Αν η εκτέλεση ATK πρέπει να κάνει ακρόαση σε οποιεσδήποτε ειδοποιήσεις ιδιοτήτων στο αντικείμενο υποστήριξης GTK, ενδεχομένως να είναι απαραίτητη μία συνάρτηση parent->notify_gtk(). Για παράδειγμα:

      Παράδειγμα 1-11Μία προσαρμοσμένη συνάρτηση notify_gtk()
      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) 
         { 
            /* Handle the property change. */ 
         } 
         else 
         { 
            parent_class->notify_gtk (obj, pspec); 
         } 
      } 
      
    3. parent->finalize

      Αν αυτό είναι απαραίτητα για την ελευθέρωση οποιονδήποτε δεδομένων όταν καταστρέφεται μία υπόδειξη GObject, τότε είναι απαραίτητη μία συνάρτηση finalize() για την απελευθέρωση μνήμης. Για παράδειγμα:

      Παράδειγμα 1-12Μία προσαρμοσμένη συνάρτηση finalize()
      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); 
      }