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 :

Reutilisation de fonctions callback


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut Reutilisation de fonctions callback
    Bonjour,

    je débute en GTK et je cherche à appeler une fonction de callback à partir d'un bouton de menu et à partir de la détection du signal delete_event.

    En fait, la partie suivante fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    g_signal_connect(GTK_OBJECT(main_window), "delete_event", G_CALLBACK(delete_event), (GtkWidget*) main_window);
    qui appelle :

    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
     
    bool delete_event(GtkWidget *widget, GdkEvent *event, gpointer window) {
        GtkWidget *dialog_box;
        dialog_box = gtk_message_dialog_new(GTK_WINDOW(window),
            GTK_DIALOG_MODAL,
            GTK_MESSAGE_QUESTION,
            GTK_BUTTONS_YES_NO,
            "Êtes-vous sûr de vouloir quitter ?");
        gtk_window_set_title(GTK_WINDOW(dialog_box), "CD Manager");
        switch(gtk_dialog_run(GTK_DIALOG(dialog_box))) {
            case GTK_RESPONSE_YES:
                // Exit program
                return false;
                break;
            case GTK_RESPONSE_NO:
                // Message box destroyed
                gtk_widget_destroy(dialog_box);
                return true;
                break;
        }
    }
    En fait, j'ai aussi le code suivant dans la fenêtre principale main_windows:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Ce n'est pas du code mais juste la hiérarchie de ma barre de menu
    menu_bar = gtk_menu_bar_new();
    menu_item_1 = gtk_menu_item_new_with_mnemonic("_Fichier");
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item_1), menu_item_1_menu);
    quit = gtk_image_menu_item_new_from_stock("gtk-quit", accel_group);
    J'aimerais connecter le signal "activate" à la fonction de callback delete_event. J'ai essayé des choses comme pour pouvoir fermer la fenêtre avec le même code en cliquant aussi sur ce bouton du menu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect((gpointer) quit, "activate", G_CALLBACK(delete_event), main_window);
    J'obtiens des erreurs à l'exécution du programme:
    (encoder:22453): GLib-GObject-WARNING **: invalid unclassed pointer in cast to `GtkWindow'
    (encoder:22453): Gtk-CRITICAL **: gtk_message_dialog_new: assertion `parent == NULL || GTK_IS_WINDOW (parent)' failed
    (encoder:22453): Gtk-CRITICAL **: gtk_window_set_title: assertion `GTK_IS_WINDOW (window)' failed
    (encoder:22453): Gtk-CRITICAL **: gtk_dialog_run: assertion `GTK_IS_DIALOG (dialog)' failed

    Est ce que quelqu'un pourrait m'éclairer ?

    Merci d'avance.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Pourquoi ne pas faire une fonction quitter (...) où tu remplaces ... par les arguments dont tu as besoin et avoir deux callbacks différents pour activate et delete-event, callback qui se contenteront d'appeler ta fonction quitter avec les arguments qui vont bien ?

  3. #3
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut
    Bonjour teuf13,

    je viens d'essayer ce que tu me proposes en changeant mon g_signal_connect comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_signal_connect((gpointer) quit, "activate", G_CALLBACK(on_quit), main_window);
    La fonction on_quit est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void on_quit(GtkWidget *widget, gpointer window) {
        delete_event(window, "delete_event", window);
    }
    J'obiens l'erreur suivante:
    encoder.cpp:35: erreur: cannot convert «const char*" to «GdkEvent*" for argument «2" to «bool delete_event(GtkWidget*, GdkEvent*, void*)"

    Problème de type pour le signal. Quel cast est-ce que je dois utiliser pour déclarer que "delete_event" est un signal ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Mais tu t'en fous complètement du GdkEvent non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    g_signal_connect((gpointer) quit, "activate", G_CALLBACK(activate_cb), main_window);
    g_signal_connect((gpointer) quit, "delete_event", G_CALLBACK(delete_event_cb), main_window);
     
    blah delete_event_cb (...) 
    {
       do_quit (...);
    }
     
    blah activate_cb (...) 
    {
       do_quit (...);
    }
    C'est ça que j'ai suggéré de faire, pas d'appeler directement le callback du delete_event à partir du callback de l'activate_cb

  5. #5
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut
    Ok, comme je t'ai dit, je débute en GTK+. Tous les exemples que j'ai trouvé donnent des callback de la forme:
    => void callback(GtkWidget *widget, GdkEvent *event, gpointer data)

    Je n'avais pas compris que des fonctions de callback pouvaient prendre d'autres formes. D'ailleurs, si tu connais des tutoriels clairs et assez complet, je suis preneur !

    Donc avec ce que tu me dis, il ne devrait plus y avoir de problème.

    Merci.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Les fonctions callbacks ont un prototype prédéfini (qui dépend du signal que tu veux intercepter), donc tu ne peux pas le changer comme tu veux. Par contre, rien n'empêche une fonction callback d'appeler une fonction que tu as écrite, la fonction do_quit de mon exemple.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    je me permets de m'incruster dans le topic car j'ai un problème assez similaire au tien.

    moi il y a une chose que je n'arrive pas à trouver (et j'ai passé du temps à fouiller dans la doc!) c'est la liste des différents signaux définis et à quoi ils correspondent (activate, destroy, delete-event, ...)

    Cette liste existe t-elle quelque part?

  8. #8
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 134
    Points : 55
    Points
    55
    Par défaut
    Tous les signaux, leur description et la signature de la fonction de callback sont dans la doc GTK. Ex. pour les GtkButtons:

    http://developer.gnome.org/doc/API/2...GtkButton.html (a la fin de la page)

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    merci! Je devais pas être bien réveillé en cherchant!

    En fait je cherchait une page particulière qui listerait tous les signaux et n'ai pas fait gaffe qu'ils étaient listés dans chaque page de doc.

    Autant pour moi

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

Discussions similaires

  1. Fonction callback
    Par saibe dans le forum Linux
    Réponses: 4
    Dernier message: 19/01/2012, 10h41
  2. [debutant] fonction callback
    Par samipate dans le forum Langage
    Réponses: 5
    Dernier message: 09/10/2005, 14h59
  3. problème fonctions callback
    Par youp_db dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 02/10/2005, 14h47
  4. [Débutant] fonction CALLBACK
    Par tlt dans le forum MFC
    Réponses: 2
    Dernier message: 29/10/2004, 16h55
  5. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42

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