IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

GParamSpec avec g_object_connect / g_signal_connect


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut GParamSpec avec g_object_connect / g_signal_connect
    Bonjour,

    J'ai suivie le manuel pour créer un GObject avec des propriétés : https://www.freedesktop.org/software...roperties.html
    J’essaie d'écouter le signal "notify::papa-number"
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    static void
    on_event(GObject *obj, GParamSpec *pspec, gpointer user_data) {
        if (pspec) {
            g_print("on_event was emited by g_object_set_property()\n");
        } else {
            g_print("on_event was emited by g_signal_emit[_by_name]()\n");
        }
    }
     
    int
    main (int argc, char *argv[])
    {
        MamanBar *obj = maman_bar_new();
     
        g_object_connect(obj, "signal::notify::papa-number", G_CALLBACK(on_event), NULL, NULL);
        //g_signal_connect(obj, "notify::papa-number", G_CALLBACK(on_event), NULL);
     
        GValue value = G_VALUE_INIT;
        g_value_init(&value, G_TYPE_UCHAR);
        g_value_set_uchar(&value, 7);
        g_object_set_property(obj, "papa-number", &value);
     
        g_signal_emit_by_name(obj, "notify::papa-number"/*, pspec */, NULL);//  Why, in on_event, parameter pspec of GParamSpec is null
     
        return 0;
    }
    A l'execution, j'obtiens :
    Code output : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    on_event was emited by g_object_set_property()
    on_event was emited by g_signal_emit[_by_name]

    Pouvez-vous m'expliquer pourquoi le paramètre pspec est nul quand j'utilise g_signal_emit ? Est-ce un bug de Glib 2.56.4 ? Une incompréhension de ma part ?

    Cdlt,

  2. #2
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Ton code ne doit pas compiler, puisque tu utilises pspec puis spec dans on_event(), et l'invocation de g_signal_emit_by_name() ne doit pas passer à l'exécution (en tout cas chez moi elle ne passe pas, mais j'utilise GLib 2.70.1 et j'ai testé avec un autre objet).
    Par ailleurs, tu veux écouter "notify::papa-number" mais tu ne t'es connecté qu'à "notify::zoom-level", en tout cas dans le code que tu montres.
    Donc impossible de savoir pourquoi tu obtiens la sortie que tu donnes, car elle ne correspond pas à ce code.

    Au-delà de ça, l'émission de signaux pour les changements de propriétés d'objets est gérée par GObject en interne, et ne devrait pas être faite directement à la main.
    La bonne manière de faire est soit d'utiliser g_object_set(), qui se chargera de changer la propriété et d'émettre le signal, soit d'utiliser g_object_notify() une fois que la propriété a été changée.

    Cela dit, si l'invocation de g_signal_emit_by_name() passe à l'exécution et que tu te connectes à "notify::papa-number", il n'est pas étonnant que tu obtiennes NULL pour le pspec, puisque c'est ce que tu lui passes en entrée (le 3ème paramètre de g_signal_emit_by_name()).

  3. #3
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut
    Bonjour Balkany,

    Merci pour ton aide. Excuse moi pour la négligence, je corrige tes remarques maintenant.

    Voici ma solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GParamSpec *pspec = g_object_class_find_property(G_OBJECT_GET_CLASS(obj), "papa-number");
    g_signal_emit_by_name(obj, "notify::papa-number", pspec/*parametre pspec */, NULL/* return void*/);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GParamSpec *pspec = g_object_class_find_property(G_OBJECT_GET_CLASS(obj), "papa-number");
    uint signal_id = g_signal_lookup("notify", MY_TYPE_OBJ);
    g_signal_emit(obj, signal_id, g_quark_from_string("papa-number"), pspec/*argument pspec*/, NULL/*return void*/);
    PS : Je n'ai pas trouver dans la doc une mention sur le faite d'émettre un signal directement à la main. Est-ce moi qui est mal cherché ?

  4. #4
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Oui voilà, je venais d'éditer mon post ci-dessus : si tu veux récupérer un pspec non nul à la réception du signal, il faut que tu en passes un non nul à l'émission.
    Par "émettre un signal à la main", je voulais dire utiliser une fonction g_signal_emit_*() : il n'y a pas besoin de faire ça pour les propriétés d'objets, il vaut mieux laisser GObject le faire lui-même.

  5. #5
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut
    Géniale !

    Je passe le post a résolut.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    g_object_set(obj, "papa-number", 1);

    PS : T'as remarqué toi aussi ? MamanBar, papa-number .... Vive l'inspiration ^_^

  6. #6
    Membre éprouvé Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 346
    Points : 977
    Points
    977
    Par défaut
    Attention, il te manque une sentinelle à la fin des paramètres de la fonction dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_object_set (obj, "papa-number", 1, NULL);
    Citation Envoyé par Gaulouis Voir le message
    PS : T'as remarqué toi aussi ? MamanBar, papa-number .... Vive l'inspiration ^_^
    On fait ce qu'on peut
    Au moins GObject est pas mal documenté je trouve, dans l'ensemble.
    D'ailleurs, les documentations officielles seraient plutôt celles-là (ancienne et nouvelle versions) :
    https://developer-old.gnome.org/references
    https://www.gtk.org/docs/apis/

Discussions similaires

  1. Récupération de pointeurs après la fonction g_signal_connect
    Par julieng31 dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 11/03/2008, 13h22
  2. [débutant] où est g_signal_connect ?
    Par afrancisco dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 05/10/2007, 13h14
  3. return directement dans un g_signal_connect
    Par PiXi-PiX dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 28/09/2007, 15h13
  4. Valeur de retour étrange de g_signal_connect
    Par julieng31 dans le forum GTK+ avec C & C++
    Réponses: 12
    Dernier message: 01/08/2007, 19h53
  5. probleme avec g_signal_connect
    Par kitsune dans le forum GTK+ avec C & C++
    Réponses: 6
    Dernier message: 14/05/2007, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo