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 :

prob fermeture fenetre après confirmation


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 256
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 256
    Par défaut prob fermeture fenetre après confirmation
    Un truc m'echappe.

    Je fais un essai de fermeture de fenêtre par le clic de la croix avec gtk.
    Le code ci-dessous fonctionne. Par contre sir dans ma routine callback routine_quit, j'enlève le printf dans mon test de réponde de fermeture ( résultat réponse à boite de dialogue ), j'ai une deuxième demande de confirmation une fois la fenêtre fermée. Je pense qu'elle est détruite par "delete-event". Je m'en sors en mettant ce printf qui en fait ne me sert à rien d'autre qu'à contourner mon prob. mais j'aimerais comprendre.

    Merci d'avance à la personne pouvant m'expliquer.

    PS : je suis sur ubuntu 9.04 et en gtk 2 ( je ne sais pas si ça a une importance )



    #include <gtk/gtk.h>

    void routine_quit();

    int main (int argc, char **argv)
    {
    GtkWidget *fenetre;

    gtk_init (&argc, &argv);

    fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (fenetre), "Test");
    gtk_window_set_default_size(GTK_WINDOW(fenetre), 640, 480);

    g_signal_connect (G_OBJECT(fenetre), "delete-event",
    G_CALLBACK (routine_quit), NULL);

    gtk_widget_show_all(fenetre);
    gtk_main ();
    return 0;
    }

    void routine_quit()
    {
    GtkWidget *demande_fermeture;
    GtkResponseType reponse_fermeture;

    demande_fermeture=gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
    GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
    "Etes-vous sur de vouloir quitter ?");
    gtk_window_set_title (GTK_WINDOW (demande_fermeture), "Confirmation");
    gtk_window_set_modal(GTK_WINDOW(demande_fermeture), TRUE);
    reponse_fermeture=gtk_dialog_run(GTK_DIALOG (demande_fermeture));
    gtk_widget_destroy(demande_fermeture);
    if (reponse_fermeture==GTK_RESPONSE_YES)
    {
    gtk_main_quit();
    }
    else
    {
    printf("Sortie annulée\n"); /*ne fait rien mais evite le dysfinctionnement */

    }

    }
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  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
    Par défaut
    A mon avis cela vient du fait que ta callback ne respecte pas le prototype associé au signal delete-event.

  3. #3
    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
    Par défaut
    Je réponds ici à ton message privé:
    Si tu suis le lien que je t'ai donné juste au dessus sur le signal delete-event, tu vois que sous le nom du signal, il y a la signature (c'est à dire le prototype de fonction) que doit respecter une callback que l'on souhaite connecter à cet événement.

    Ici en l'occurence, on a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    gboolean user_function (GtkWidget *widget,
                                     GdkEvent  *event,
                                     gpointer user_data)
    Cela signifie que la fonction que tu connecteras au signal delete-event doit être formée de cette manière (mêmes paramètres d'entrée et de sortie).

    Or toi tu as connecté à ce signal la callback de signature suivante:

    Tu ne respectes donc pas la signature attendue. Ta fonction devrait avoir pour signature:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    gboolean routine_quit (GtkWidget *widget,
                                     GdkEvent  *event,
                                     gpointer user_data)
    La différence la plus notable est sur la valeur de retour de la callback, qui doit renvoyer TRUE (comme l'indique la documentation) si elle a traité l'événement et que ce dernier ne doit plus être propagé.

    Voici du code fonctionnel chez moi (Windows/MinGW, GTK 2.22):

    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
    #include <gtk/gtk.h>
     
    gboolean routine_quit (GtkWidget *widget,
            GdkEvent  *event,
            gpointer user_data);
     
    int main (int argc, char **argv)
    {
        GtkWidget *fenetre;
     
        gtk_init (&argc, &argv);
     
        fenetre = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title (GTK_WINDOW (fenetre), "Test");
        gtk_window_set_default_size(GTK_WINDOW(fenetre), 640, 480);
     
        g_signal_connect (G_OBJECT(fenetre), "delete-event",
                G_CALLBACK (routine_quit), NULL);
     
        gtk_widget_show_all(fenetre);
        gtk_main ();
        return 0;
    }
     
    gboolean routine_quit (GtkWidget *widget,
            GdkEvent  *event,
            gpointer user_data)
    {
        GtkWidget *demande_fermeture;
        GtkResponseType reponse_fermeture;
     
        demande_fermeture=gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
                GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
                "Etes-vous sur de vouloir quitter ?");
        gtk_window_set_title (GTK_WINDOW (demande_fermeture), "Confirmation");
        gtk_window_set_modal(GTK_WINDOW(demande_fermeture), TRUE);
        reponse_fermeture=gtk_dialog_run(GTK_DIALOG (demande_fermeture));
        gtk_widget_destroy(demande_fermeture);
        if (reponse_fermeture==GTK_RESPONSE_YES)
        {
            gtk_main_quit();
        }
        else
        {
            g_print("Sortie annulée\n"); /*ne fait rien mais evite le dysfinctionnement */
        }
     
        return TRUE;
    }
    J'ai remplacé ton printf par un g_print pour avoir un message au moment du clic, mais il est à présent purement cosmétique: le programme fonctionne sans

Discussions similaires

  1. prob fermeture fenetre ( complément 30.09 )
    Par Christophe dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 16/09/2011, 11h47
  2. [WD14] trace du cadre de la fenetre apres fermeture
    Par kitcarson23 dans le forum WinDev
    Réponses: 5
    Dernier message: 21/07/2011, 00h13
  3. Reprendre un programme apres fermeture fenetre
    Par XSquallX dans le forum Tkinter
    Réponses: 10
    Dernier message: 15/04/2010, 18h58
  4. Fermeture fenetre crée par code javascript
    Par Kerod dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 27/02/2010, 00h04
  5. Réponses: 3
    Dernier message: 03/02/2004, 17h34

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