Initialisateurs de classe/instance

Vous allez devoir configurer un initialisateur de classe pour l'objet GObject dans l'un des deux cas suivants : si votre implémentation d'AtkObject

  1. redéfinit un des appels de fonction défini par l'objet parent. C'est en général nécessaire quand un objet doit implémenter une fonction comme atk_object_get_n_accessible_children(). C'est nécessaire si l'objet possède des fils qui ne sont pas représentés par des éléments graphiques.

    Par exemple, si votre implémentation ATK doit remplacer la fonction get_name() d'AtkObject alors l'initialisateur de classe ressemblera à :

    Exemple I.8 Initialisateur de classe qui remplace la fonction get_name() du parent.
    mon_imp_atk_montype_class_init (GailLabelClass *klass) 
    { 
      AtkObjectClass *class = ATK_OBJECT_CLASS (klass); 
      class->get_name = mon_imp_atk_montype_get_name; 
    } 
    
  2. ou si elle requiert une fonction parent->init, parent->notify_gtk ou parent->finalize. Cet exemple définit les trois :

    Exemple I.9 Initialisateur de classe qui définit ses propres fonctions init(), notify_gtk() et finalize()
    static ParentObjectType *parent_class = NULL; 
    
    mon_imp_atk_montype_class_init (GailLabelClass *klass) 
    { 
       ParentObjectType *parent_class = (ParentObjectType*)klass; 
    
       /* 
        * La mise en cache de parent_class est nécessaire si les fonctions 
        * init, notify_gtk ou finalize sont configurées. 
        */ 
        parent_class = g_type_class_ref (MONATKIMP_TYPE_PARENT); 
    
        parent_class->init = mon_imp_atk_montype_widget_init; 
        parent_class->notify_gtk = mon_imp_atk_montype_real_notify_gtk; 
        parent_class->finalize = mon_imp_atk_montype_finalize; 
    }
    
    1. parent->init

      Une fonction parent->init() peut être nécessaire si l'implémentation ATK a besoin d'effectuer l'une des actions suivantes :

      1. mettre en cache toutes les données obtenues à partir de l'élément graphique GTK auxiliaire,
      2. écouter tous les signaux émis par l'élément graphique GTK auxiliaire.

      Voici un exemple des deux :

      Exemple I.10 Une fonction personnalisée init()
      void 
      gail_tree_view_widget_init (Monimpatkmontype  *montype, 
                                  GtkWidget       *gtk_widget) 
      { 
         /* Être sûr d'appeler la fonction init du parent */ 
         parent_class->init (widget, gtk_widget); 
         
         /* Mettre en cache une valeur dans l'implementation ATK */ 
         montype->cached_value = gtk_widget_function_call(); 
      
         /* Écouter un signal */ 
         gtk_signal_connect (GTK_OBJECT (gtk_widget), 
                             "type-signal", 
                             GTK_SIGNAL_FUNC (_mon_imp_atk_montype_signal_type), 
                             NULL); 
      } 
      

      Dans cet exemple, si le signal type-signal spécifié est généré par le gtk_widget auxiliaire alors la fonction _mon_imp_atk_montype_signal_type() est appelée.

    2. parent->notify_gtk

      Si l'implémentation d'ATK doit écouter toutes les notifications de propriété de l'objet GTK auxiliaire, une fonction parent->notify_gtk() peut être nécessaire. Par exemple :

      Exemple I.11 Une fonction personnalisée notify_gtk()
      void 
      mon_imp_atk_montype_real_notify_gtk (GObject    *obj, 
                                       GParamSpec *pspec) 
      { 
         GtkWidget *widget = GTK_WIDGET (obj); 
         AtkObject* atk_obj = gtk_widget_get_accessible (widget); 
      
         if (strcmp (pspec->name, "propriété-concernée") == 0) 
         { 
            /* Gestion de la modification de propriété. */ 
         } 
         else 
         { 
            parent_class->notify_gtk (obj, pspec); 
         } 
      } 
      
    3. parent->finalize

      S'il est nécessaire de libérer toutes les données quand une instance GObject est détruite alors il y a besoin d'une fonction finalize() pour libérer la mémoire. Par exemple :

      Exemple I.12 Une fonction personnalisée finalize()
      void 
      mon_imp_atk_montype_finalize (GObject *object) 
      { 
         MonImpAtkMonType *mon_type = MONIMPATK_MONTYPE (object); 
      
         g_object_unref (mon_type->cached_value); 
         G_OBJECT_CLASS (parent_class)->finalize (object); 
      }