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++

Vue hybride

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

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    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 confirmé 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
    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 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

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

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

  4. #4
    Membre confirmé 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
    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 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    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 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    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...

+ 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