Αρχικοποιήσεις κλάσης/υπόδειξης
- Οδηγός προσιτότητας GNOME για προγραμματιστές
- Τι είναι η προσιτότητα;
- Παραδείγμα για τη χρήση της προσιτότητας API
- Εκτέλεση ενός αντικειμένου ΑΤΚ
Θα πρέπει να ρυθμίσετε μία αρχικοποίηση κλάσης για το GObject αν η εκτέλεση AtkObject είτε:
-
Ορίζει ξανά οποιεσδήποτε κλήσεις συναρτήσεων καθορίστηκαν από το ριζικό κατάλογο του αντικειμένου. Αυτό είναι τυπικά απαραίτητο όταν ένα αντικείμενο πρέπει να εκτελέσει μία συνάρτηση όπως η 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; }
-
Απαιτεί μία συνάρτηση 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; }
-
parent->init
Ενδεχομένως να είναι απαραίτητα μία συνάρτηση parent->init() αν η εκτέλεση ΑΤΚ χρειάζεται να εφαρμόζει τα ακόλουθα:
- Αποθήκευση όλων των δεδομένων που λήφθηκαν από ένα γραφικό συστατικό υποστήριξης GTK.
- Ακρόαση οποιουδήποτε σήματος από το γραφικό συστατικό υποστήριξης 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().
-
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); } }
-
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); }
-