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 :

Faire tourner une GtkDialog en tache de fond


Sujet :

GTK+ avec C & C++

  1. #1
    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 Faire tourner une GtkDialog en tache de fond
    Bonjour,

    J'aimerai savoir s'il est possible de faire tourner une GtkDialog en tache de fond, c'est à dire, lancer la boite de dialogue mais la laisser non visible, puis l'afficher dans certains cas, et bien entendu la cacher lorsqu'on en a plus besoin.

    En fait, mon problème, c'est que gtk_dialog_run est bloquante.

    Donc, ben si quelqu'un a une idée, ça serait sympa
    Merci

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    L'exemple de la doc officielle fait ça je pense, non ?
    http://library.gnome.org/devel/gtk/u...og.description
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  3. #3
    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
    Dans cet exemple, ils affichent la boîte de dialogue avec un gtk_widget_show_all, et en effet, ça fonctionne dans leur cas.

    Seulement, moi, quand je passe la GtkDialog en paramètre data à une callback, pour la caster en GtkWidget, puis l'afficher avec gtk_widget_show_all, j'ai des erreurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (a.out:11859): GLib-GObject-WARNING **: invalid unclassed pointer in cast to `GtkWidget'
     
    (a.out:11859): Gtk-CRITICAL **: gtk_widget_show_all: assertion `GTK_IS_WIDGET (widget)' failed
    Voici mon code:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include <gtk/gtk.h>
     
    static gboolean delete_event_signal (GtkWidget *widget, gpointer data);
    static void response_event_handler (GtkWidget *widget, gint response_id, gpointer data);
     
    int
    main (int    argc, 
          char   *argv[])
    {
    	GtkWidget *window;
    	GtkWidget *dialog;
     
    	gtk_init (&argc, &argv);
     
    	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_default_size (GTK_WINDOW(window), 320, 200);
     
            /* Cette boite de dialogue doit être affichée lorsque l'on clique sur la
             * croix rouge de la fenetre. Sinon, elle est cachée.
             */
    	dialog = gtk_message_dialog_new (NULL,
    		   GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
    		   GTK_MESSAGE_QUESTION,
    		   GTK_BUTTONS_YES_NO,
    		   "Voulez vous vraiment quitter\nl'application ?", NULL);
    	g_signal_connect (dialog, "response", G_CALLBACK(response_event_handler), NULL);
    	g_signal_connect (window, "delete-event", G_CALLBACK(delete_event_signal), NULL);
     
     
    	gtk_widget_show (window);
     
    	gtk_main ();
     
    	return 0;
    }
     
    static gboolean
    delete_event_signal (GtkWidget *widget, gpointer data)
    {
            /* La croix rouge a été cliquée, j'affiche le message */
    	gtk_widget_show_all (GTK_WIDGET(data));
    	return TRUE;
    }
     
    static void 
    response_event_handler (GtkWidget *widget, gint response_id, gpointer data)
    {
            /* L'utilisateur a répondu, je cache la boite de dialogue */
    	gtk_widget_hide_all (widget);
     
            /* On quitte l'application en cas de réponse positive */
    	if (response_id == GTK_RESPONSE_YES
                || response_id == GTK_RESPONSE_NONE) {
    		gtk_main_quit ();
    	}
    }
    Pourquoi mon parametre data, c'est plus un GtkWidget ?

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Peut être parce que tu as passé NULL comme valeur au paramètre data à la connexion du signal ?
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  5. #5
    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
    J'aime bien l'émoticône que tu as choisis Liberforce . +1 Pour ca et pour le commentaire bien sûr.

  6. #6
    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
    Oups, belle étourderie, lol

    Par contre, même en passant la boite de dialogue en paramètre, j'ai toujours l'erreur

    Voici le code corrigé que j'utilise:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #include <gtk/gtk.h>
     
    static gboolean delete_event_signal (GtkWidget *widget, gpointer data);
    static void response_event_handler (GtkWidget *widget, gint response_id, gpointer data);
     
    int main (int argc, char *argv[])
    {
    	GtkWidget *window;
    	GtkWidget *dialog;
     
    	gtk_init (&argc, &argv);
     
    	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_default_size (GTK_WINDOW(window), 320, 200);
     
    	/* Cette boite de dialogue doit être affichée lorsque l'on clique sur la
    	 * croix rouge de la fenetre. Sinon, elle est cachée.
    	 */
    	dialog = gtk_message_dialog_new (NULL,
    			GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
    			GTK_MESSAGE_QUESTION,
    			GTK_BUTTONS_YES_NO,
    			"Voulez vous vraiment quitter\nl'application ?", NULL);
    	g_signal_connect (dialog, "response", G_CALLBACK(response_event_handler), NULL);
    	g_signal_connect (window, "delete-event", G_CALLBACK(delete_event_signal), dialog);
     
     
    	gtk_widget_show (window);
     
    	gtk_main ();
     
    	return 0;
    }
     
    	static gboolean
    delete_event_signal (GtkWidget *widget, gpointer data)
    {
    	/* La croix rouge a été cliquée, j'affiche le message */
    	gtk_widget_show_all (GTK_WIDGET(data));
    	return TRUE;
    }
     
    	static void 
    response_event_handler (GtkWidget *widget, gint response_id, gpointer data)
    {
    	/* L'utilisateur a répondu, je cache la boite de dialogue */
    	gtk_widget_hide_all (widget);
     
    	/* On quitte l'application en cas de réponse positive */
    	if (response_id == GTK_RESPONSE_YES
    			|| response_id == GTK_RESPONSE_NONE) {
    		gtk_main_quit ();
    	}
    }

  7. #7
    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
    Le prototype du Callback pour le signal "response" est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void                user_function                      (GtkDialog *dialog,
                                                            gint       response_id,
                                                            gpointer   user_data)

  8. #8
    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
    Là ou on peut metre un GtkWidget, on peut mettre un GtkDialog, non ? vu que GtkDialog hérite de GtkWidget ?

    Sinon, pour le problème ça change pas grand chose, toujours pareil.

  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
    Vraiment, c'est très bizarre, j'ai placé des
    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
     
     
    main ()
    {
        /* ... */
     
        g_assert (GTK_IS_WIDGET(dialog));
     
        /* ... */
    }
     
    delete_event_handler ()
    {
        /* ... */
     
        g_assert (GTK_IS_WIDGET(data));
     
        /* ... */
    }
    Au début, c'est bien un widget, pis après, c'est plus un widget

  10. #10
    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
    Il faut "swapper" l'appel à la fonction CallBack. Ne me demandes pas pourquoi. Les voix de Gtk+ sont parfois impénétrables .
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #include <gtk/gtk.h>
     
    static gboolean delete_event_signal (GtkWidget *widget, gpointer *data);
    static void response_event_handler (GtkDialog *dialog, gint response_id, gpointer data);
     
    int main (int argc, char *argv[])
    {
        GtkWidget *window;
        GtkWidget *dialog;
     
        gtk_init (&argc, &argv);
     
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_default_size (GTK_WINDOW(window), 320, 200);
     
        /* Cette boite de dialogue doit être affichée lorsque l'on clique sur la
         * croix rouge de la fenetre. Sinon, elle est cachée.
         */
        dialog = gtk_message_dialog_new (NULL,
                GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                GTK_MESSAGE_QUESTION,
                GTK_BUTTONS_YES_NO,
                "Voulez vous vraiment quitter\nl'application ?");
        g_signal_connect (dialog, "response", G_CALLBACK(response_event_handler), NULL);
        g_signal_connect_swapped (window, "delete-event", G_CALLBACK(delete_event_signal), dialog);
     
     
        gtk_widget_show_all (window);
     
        gtk_main ();
     
        return 0;
    }
     
        static gboolean
    delete_event_signal (GtkWidget *widget, gpointer *data)
    {
        /* La croix rouge a été cliquée, j'affiche le message */
        gtk_widget_show_all (widget);
        return TRUE;
    }
     
        static void 
    response_event_handler (GtkDialog *dialog, gint response_id, gpointer data)
    {
        /* L'utilisateur a répondu, je cache la boite de dialogue */
        gtk_widget_hide_all (GTK_WIDGET(dialog));
     
        /* On quitte l'application en cas de réponse positive */
        if (response_id == GTK_RESPONSE_YES
                || response_id == GTK_RESPONSE_NONE) {
            gtk_main_quit ();
        }
    }

  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
    data et dialog ne pointent pas vers le même objet...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [main] dialog: 0x1562050
    [delete_event_signal] data: 0x1587650

  12. #12
    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
    En fait, le prototype pour le signal delete-event est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    gboolean            user_function                      (GtkWidget *widget,
                                                            GdkEvent  *event,
                                                            gpointer   user_data)      : Run Last
    Et maintenant ça marche

  13. #13
    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
    Nos messages se sont télescopés. Je ne sais pas si tu as vu mon message précédent. Pour finir tu as un argument de trop dans l'appel à gtk_message_dialog_new();.

  14. #14
    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
    En effet. Ce qui explique pourquoi le swap des pointeurs permettait le fonctionnement correcte de l'appli.
    Finalement tout s'explique...

  15. #15
    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
    Ah, ben oui, là aussi, ça fonctionne

    ça veut dire quoi "swapper" l'appel à la fonction

  16. #16
    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
    Ca inverse les pointeurs à l'arrivée dans la Fonction CallBack.

  17. #17
    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
    Pour finir tu as un argument de trop dans l'appel à gtk_message_dialog_new();.
    Ah, oui, je croyais que c'était null-terminated.

  18. #18
    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
    Ca inverse les pointeurs à l'arrivée dans la Fonction CallBack.
    Ah, ok, merci

  19. #19
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Au final, quel est le rapport entre le code que tu as montré et la question initiale ? Tu as utilisé une fenêtre modale, tu ne l'as pas du tout affichée "en tache de fond".

    Ensuite, la solution la plus simple au problème de "comment afficher une confirmation avant de quitter" est tout simplement de créer une boite de dialogue modale dans le delete-event, et l'afficher avec gtk_dialog_run... Cela t'évitait aussi d'avoir à gérer l'évènement "response".
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  20. #20
    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
    La question était en fait

    « Pourquoi quand je passe ma GtkDialog en data à ma callback connectée au signal "delete-event", j'ai une erreur ? »


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

Discussions similaires

  1. faire tourner un script en tache de fond
    Par suzan_ dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 25/09/2010, 08h38
  2. [VB6] Faire tourner une appli en tache non bloquante
    Par hirochirak dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 01/06/2006, 11h56
  3. Faire tourner une Application en Taches de fond
    Par ArkAng3 dans le forum MFC
    Réponses: 3
    Dernier message: 26/08/2005, 14h06
  4. executer une page en tache de fond
    Par Invité(e) dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 22/01/2005, 16h23

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