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 :

Callback dans une autre callback


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par d�faut Callback dans une autre callback
    Bonjour � tous.

    Ce que j'ai un peu de mal � appr�hender dans GTK c'est les callback... le plus
    importants quoi. C'est assez simple si on se limite � appeler des callbacks
    depuis la fen�tre principale...


    Mais si je veux faire 2 choses compl�tement diff�rentes (qui n�cessitent deux
    callbacks compl�tement diff�rentes) en une seule callback c'est difficile...


    Je m'explique : Je voudrais qu'� l'appui sur un bouton de mon interface mon
    programme appelle une callback d�roule mon algorithme et dessine dans ma
    DrawingArea.

    Seulement la callback pour l'appui sur un bouton est de la forme :
    g_signal_connect(*, "clicked", *);
    Et la callback pour dessiner avec cairo dans ma drawingArea c'est :
    g_signal_connect(*, "draw", *);

    Mes question sont donc :
    - Comment faire pour donc quand je clique sur mon bouton je puisse dessiner dans ma drawingArea ?
    - Je pense que la solution c'est d'imbriquer une callback dans une autre mais dans ce cas comment faire pour r�cup�rer tous les param�tres n�cessaires � la deuxi�me callback dans la premi�re callback ? (sans variable globale)
    - Y'a-t-il un moyen d'appeler dans une callback une callback d�finie dans la fen�tre principale (main.c) de sorte que celle-ci soit appel�e avec les bon param�tres (puisque les param�tres sont d�finis dans la fen�tre principale) ?

    Bonne soir�e
    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
    Par d�faut
    Bonjour,

    ce que tu dois faire, c'est comprendre l'aspect �v�nementiel: la boucle principale GTK est une pompe � �v�nements, sur le m�me mod�le que la plupart des toolkits. En r�ponse � ces �v�nements, GTK effectue des actions.

    Les �v�nements qui surviennent vont dans une file d'attente. Le premier �v�nement dans la file est trait�, puis supprim� de la file, et ainsi de suite... Si tu connectes une callback � un signal, cela signifie que tu souhaites �tre notifi� quand c'est le tour de cet �v�nement d'�tre trait�.

    La solution � ton probl�me n'est donc pas d'appeler directement une callback � partir d'une autre callback mais de rajouter le bon �v�nement dans la file d'attente pour que ce dernier d�clenche la callback qui t'int�resse.

    Ainsi, dans ta callback en r�ponse au signal GtkButton::clicked, tu n'as qu'� �mettre le signal "draw" sur le bon widget, soit directement (avec les fonctions g_signal_emit*, mais ce n'est pas le cas usuel), soit indirectement en appelant une fonction qui ajoutera l'�v�nement qui t'int�resse dans la file d'�v�nements. Une fois le traitement de ta callback associ�e � GtkButton::cliked termin�, tu rends automatiquement la main � la pompe � �v�nements, qui va traiter les �v�nements restants, jusqu'� traiter l'�v�nement qui t'int�resse: la r�ception du signal "draw" pour ton widget.

    Pour provoquer l'ajout de l'�v�nement "draw" dans la file d'�v�nements (on dit aussi: "�mission du signal draw"), il te suffit d'appeler gtk_widget_queue_draw (pour redessiner le widget entier) ou gtk_widget_queue_draw_area (pour redessiner une zone particuli�re du widget: c'est plus rapide si seule une petit portion est modifi�e). Une fois son tour arriv� dans la pompe � �v�nements, la callback associ�e � "draw" sera appel�e. Mais garde donc � l'esprit que contrairement aux fonctions qui s'appellent les unes les autres, les appels de callbacks ne sont en g�n�ral pas imbriqu�s.

  3. #3
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par d�faut
    Merci � toi. J'avais essay� plein de chose.

    Notamment �m�ttre un signal avec g_signal_emit mais � chaque fois
    j'avais un Core Dump ou bien rien du tout qui changeait...
    J'ai essay� de mettre une callback dans une autre mais pareil rien
    ne fonctionnait...


    Merci pour ces �clairsissement sur la fa�on de penser les Callback.
    Je pense qu'il faudra un peu de temps pour que je comprends bien
    et que je m'adapte.

    Gr�ce � toi j'ai pu faire ce que je voulais. Merci encore

    J'ai cependant encore une derni�re question :
    J'ai d� remplacer ma variable locale � ma fonction main, nomm�e
    area (la DrawingArea) par une variable globale pour pouvoir
    appeler ma callback qui dessine avec gtk_widget_queue_draw(area).
    N'y-a-t'il pas un autre moyen de passer ma drawingArea en variable
    � ma callback appel� en cliquant sur un bouton � part via le param�tre
    gpointer data de ma callback ?

  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
    Par d�faut
    Non, il n'y a que le param�tre data qui te permette de passer des donn�es au signal, donc si tu as plusieurs param�tres � passer, tu dois les encapsuler dans une structure (c'est une limitation de la version C de GTK, les bindings python par exemple te permettent de passer le nombre d'arguments de ton choix). En g�n�ral je d�finis dans le main une structure locale Gui qui contient des pointeurs vers les widgets que je vais manipuler durant l'ex�cution. Mais tu peux aussi y encapsuler les donn�es de ton application.

  5. #5
    Membre averti
    Homme Profil pro
    �tudiant
    Inscrit en
    Octobre 2011
    Messages
    38
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Par d�faut
    Ok merci. J'ai �galement fait une structure pour certaines de mes callbacks.

    En tout cas vous m'avez bien aid�. Merci beaucoup

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. appel du callback dans une autre fonction
    Par amine_wn dans le forum Interfaces Graphiques
    R�ponses: 0
    Dernier message: 08/04/2015, 18h07
  2. appel d'un autre callback dans une fonction
    Par jponsoda dans le forum Interfaces Graphiques
    R�ponses: 4
    Dernier message: 23/06/2010, 10h01
  3. R�ponses: 5
    Dernier message: 07/08/2008, 18h53
  4. Ajout d'un callback dans une figure
    Par dazhoid dans le forum Interfaces Graphiques
    R�ponses: 3
    Dernier message: 16/11/2006, 14h05
  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