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 :

Savoir si une connexion existe entre un signal et une procédure


Sujet :

GTK+ avec C & C++

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut Savoir si une connexion existe entre un signal et une procédure
    Bonjour

    J'aimerai pouvoir supprimer une connexion ou encore mieux, savoir s'il existe une connexion sur un signal.
    Je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(nv_entree), "activate", G_CALLBACK(menu_va_hist1), param);
    , mais j'ai besoin de savoir si cette connexion existe déjà (elle a déjà pu être activée) avant sous peine d'exécuter deux fois la procédure.

    Juste le fait de savoir combien il y a de connexion sur cette fonction ou ce widjet pourrait être suffisant.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Membre actif Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Points : 221
    Points
    221
    Par défaut
    Salut,

    La seule façon de faire que j'ai trouvé perso, c'est de passer par les closures:
    Code : 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
    28
    #include <gtk/gtk.h>
     
    int
    main (int  argc,
          char *argv[])
    {
    	GtkWidget *window;
    	GClosure *closure;
    	gulong id;
     
    	gtk_init (&argc, &argv);
     
    	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);	
    	closure = g_cclosure_new (G_CALLBACK(gtk_main_quit), NULL, NULL);
    	id = g_signal_connect_closure (window, "destroy", closure, TRUE);
     
     
    	if (g_signal_handler_is_connected(window, id))
    		g_print ("Handler is connected !\n");
     
    	gtk_widget_show_all (window);
     
    	gtk_main ();
     
            g_closure_unref (closure);
     
    	return 0;
    }
    Voici un lien interessant: http://developer.gnome.org/gobject/s...er-signal.html

  3. #3
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    g_signal_connect(); renvoie un id. Ne pourrais-tu pas l'utiliser?

  4. #4
    Membre actif Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Points : 221
    Points
    221
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    g_signal_connect(); renvoie un id. Ne pourrais-tu pas l'utiliser?
    Ah, oui, effectivement j'avais pas remarqué, comme c'est une macro ils n'indiquent pas le retour dans le sommaire de la doc . Du coup c'est plus facile comme ça, pas besoin de s'embêter avec les closures


    Code : 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
    #include <gtk/gtk.h>
     
    int
    main (int  argc,
          char *argv[])
    {
    	GtkWidget *window;
    	gulong id;
     
    	gtk_init (&argc, &argv);
     
    	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    	id = g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
     
    	if (g_signal_handler_is_connected(window, id))
    		g_print ("Handler is connected !\n");
     
    	gtk_widget_show_all (window);
     
    	gtk_main ();
     
    	return 0;
    }

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Merci...

    Il me semble que je viens de profiter de vos conseils !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        id_=g_signal_handler_is_connected(nv_entree,((gulong **)param)[12][0]);
        if (!id_)
            ((gulong **)param)[12][0]=g_signal_connect(G_OBJECT(nv_entree), "activate", G_CALLBACK(menu_va_hist1), param);
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    J'avais oublié de faire une remarque...

    Si la ligne suivante est exécutée plusieurs fois, la fonction callback sera exécuter autant de fois que la ligne a été exécuté de fois !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(nv_entree), "activate", G_CALLBACK(menu_va_hist1), param);
    Peut-on aussi "vider" un couple objet/signal des callback qui lui sont associés ? Sans avoir d'information sur l'id des signaux de préférence.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  7. #7
    Membre actif Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Points : 221
    Points
    221
    Par défaut
    Citation Envoyé par troumad Voir le message
    J'avais oublié de faire une remarque...

    Si la ligne suivante est exécutée plusieurs fois, la fonction callback sera exécuter autant de fois que la ligne a été exécuté de fois !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(nv_entree), "activate", G_CALLBACK(menu_va_hist1), param);
    En effet, d'ailleurs, le manuel de GObject dit:
    When a signal is emitted on a given type instance, all the closures connected to this signal on this type instance will be invoked. All the closures connected to such a signal represent callbacks whose signature looks like:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return_type function_callback (gpointer instance, ... , gpointer user_data);
    Citation Envoyé par troumad Voir le message
    Peut-on aussi "vider" un couple objet/signal des callback qui lui sont associés ? Sans avoir d'information sur l'id des signaux de préférence.
    Ça doit pouvoir se faire avec g_signal_handlers_disconnect_by_func

  8. #8
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Pour la remarque sur les appels multiples, je pensais que si la connexion était faite une fois, elle ne pouvait pas se dupliquer !
    Citation Envoyé par artificier59 Voir le message
    Ça doit pouvoir se faire avec g_signal_handlers_disconnect_by_func
    J'avoue que sans information sur les formats des paramètres, je suis planté ! Il manque un peu d'information sur leur #define dans cette doc !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  9. #9
    Membre actif Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Points : 221
    Points
    221
    Par défaut
    Citation Envoyé par troumad Voir le message
    Pour la remarque sur les appels multiples, je pensais que si la connexion était faite une fois, elle ne pouvait pas se dupliquer !
    J'avoue que sans information sur les formats des paramètres, je suis planté ! Il manque un peu d'information sur leur #define dans cette doc !
    Je crois que ça s'utilise comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    g_signal_connect (entry, "activate", G_CALLBACK(entry_activate_cb), entry_data);
    g_signal_connect (button, "clicked", G_CALLBACK(button_clicked_cb), button_data);
     
    /* ... */
     
    g_signal_handler_disconnect (entry, G_CALLBACK(entry_activate_cb), entry_data);
    g_signal_handler_disconnect (button, G_CALLBACK(button_clicked_cb), button_data);
    Sinon lorsque tu as un doute sur comment utiliser une fonction, je te conseil de regarder dans Google Search Code, en général tu trouve des exemples de codes assez clairs.

  10. #10
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Merci !
    Tu as déjà trouvé facilement des code sur Google Search Code ? Moi, pas trop !

    Donc, on ne prend pas en compte l'action, on ne prend en compte que : l'item, la fonction et les datas.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  11. #11
    Membre actif Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Points : 221
    Points
    221
    Par défaut
    Citation Envoyé par troumad Voir le message
    Merci !
    Tu as déjà trouvé facilement des code sur Google Search Code ? Moi, pas trop !
    Si, en général je trouve ce que je cherche, d'ailleurs souvent ces exemples sont tirés de Gtk+ ou de bibliothèques de Gnome et le code se lit plutôt facilement. Par exemple l'autre jour je cherchais comment mettre en place un proxy DBus, eh bien je peut te dire que si j'avais pas eu Google Search Code je pense que je serais encore entrain de chercher

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/03/2011, 09h35
  2. [MySQL] Quelle fonction pour établir une connexion aléatoire entre 2 membres ?
    Par geekforever dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/03/2010, 10h45
  3. Partager une connexion internet entre 2 PC avec RJ45
    Par boumacmilan dans le forum Windows
    Réponses: 3
    Dernier message: 30/06/2009, 09h26
  4. Réponses: 4
    Dernier message: 07/09/2006, 15h41

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