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 :

Executer un callback au lancement de la fenêtre


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut Executer un callback au lancement de la fenêtre
    Bonjour,
    Je souhaiterais savoir comment éxectuter un callback au lancement du programme ou de la fenêtre.

  2. #2
    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
    Trop vague comme question. Ce CALLBACK, il est normalement appelé avec quel signal?

  3. #3
    Membre confirmé Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Trop vague comme question. Ce CALLBACK, il est normalement appelé avec quel signal?
    Slt! je pense que c'est le signal même qu'il demande.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut exactement
    Exactement, c'est le signal et le widget que je cherche.
    J'ai essayé sur la fenêtre principale avec le signal focus mais ça ne marche pas.
    Mettre la fonction directement ça marche mais le problème c'est que je ne peux plus accéder à d'autres fonctions.

  5. #5
    Membre Expert
    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
    Par défaut
    Je me rappelle jamais, tu as des évènements expose, map et realize sur les GtkWidgets, un de ceux là (je dirais expose) doit correspondre à ce que tu veux. Il y a aussi show, mais je pense que c'est émis en réponse à un gtk_widget_show.

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut
    Ca me rend fou. les "events" fonctionnent mais trop tôt apparemment. Avec "expose" la liste n'est pas encore chargé du coup quand j'essaie d'exploiter son contenu j'ai des caractères spéciaux au lieu d'une chaine de caractère. Je précise que lorsque j'utilise un bouton pour démarrer mes taches ça fonctionne parfaitement.

    Donc ma question, comment faire pour que le callback soit éxecuter après que tout soit chargé (j'ai essayé g_signal_connect_after() mais ça ne marche pas non plus)?

  7. #7
    Membre Expert
    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
    Par défaut
    Je n'ai aucune idée de quelle façon tu charges "tout", ni de ce que "tout" peut être, donc je ne peux pas t'aider.

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut
    Je parle de l'interface, il faudrai que le callback se connecte seulement après que toute l'interface soit chargée.
    Voilà mon callback:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(mainWindow),		"expose-event",		G_CALLBACK(Ouverture), 		&tab);
    et voila la fonction appelée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Ouverture(GtkWidget *pWidget, gpointer datas)
    {
    	Datas *n = (Datas *)datas; //"Datas" est un struct
    	n->num_fichier = 0; //le numero de fichier par defaut, qui signifie qu'aucun fichier de la liste n'est en cours de traitement
    	gtk_tree_model_foreach(GTK_TREE_MODEL(n->store), foreach_func, n); //parcour la liste pour récupérer quelques infos, avec expose il ne se fait pas (vérifié avec des "cout" un peu partout dans la fonction "foreach_func")
    	n->ss_total = n->cumulTaille; //utile pour une autres fonction plus tard, le cumulTaille est incorrecte également avec expose
    	cout << toChar(to_string(n->compteur)) << endl; //avec expose on voit que cette variable n'a pas eu d'affectation de valeur, qui ce fait dans le foreach_func (avec un bouton au lieu de l'exécution automatique ça fonctionne)
    	gtk_label_set_label(GTK_LABEL(n->lbl_num_fichier_tot), toChar(to_string(n->compteur))); //change les label en conséquence
    	gtk_label_set_label(GTK_LABEL(n->lbl_taille_totale), toChar(strSize(n->cumulTaille))); //idem
    }
    J'espère que c'est clair

  9. #9
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Et en utilisant le signal supposé fonctionner (expose event ?) ca marche pas ?

    Cela étant dit, je vois pas l'interet de foutre ca en callback ?

    Il suffit d'appeller ta fonction lors de la création de la fenêtre non ?

    (ou lors du gtk_show ...)

    Parce que la fenêtre, y'a bien un moment (que ca soit via un callback ou directement) ou tu dois appeller son lancement ! Bah tu balance l'appel juste aprés (ou juste avant si c'est de l'initiatisation), et le tour est joué ?

    (C'est peut être même pour ca que GTK ne t'autorises pas à faire ce que tu veux via une callback ? )

  10. #10
    Membre confirmé Avatar de doderic
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 215
    Par défaut
    SAlut! je ne sais pas si tu as essayé le signal realize mais si tu ne l'as pas fait alors essaye le.
    Bonne suite

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut
    Merci de vos réponses,
    je ne peux pas mettre une fonction sans callback car j'ai besoin dans ma fonction de retourner dans la boucle du main avec gtk_main_iteration() car j'ai une boucle qui freeze mon interface jusqu'à la fin de son execution.

    Ensuite pour le realize tu me conseil de le mettre sur quel widget ? Je l'ai essayé sur mon mainWindow mais sans succès. Peux-tu me donner un marche à suivre ?

  12. #12
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Citation Envoyé par drazx Voir le message
    je ne peux pas mettre une fonction sans callback car j'ai besoin dans ma fonction de retourner dans la boucle du main avec gtk_main_iteration() car j'ai une boucle qui freeze mon interface jusqu'à la fin de son execution.
    Salut,

    C'est peut être moi qui ne comprends pas un truc, mais à partir du moment ou tu sais que cette fonction ne sera appellée qu'une fois, lors de la création de ta fenêtre (de toute facon si c'est lors de la création, encore une fois, il faut bien que tu l'affiche à un moment ta fenêtre ... => bah au moment de l'afficher, tu lances ta fonction!)
    Y'a aucun cas ou une callback est applicable ici d'aprés moi ...

    Je crois que tu fais un bloquage alors que y'a pas à se creuser la tête.

    La solution est la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // Création de la fenêtre :
    myWindow= gtk_window_new("myWindow");
    (...)
     
    // Affichage de la fenêtre :
    gtk_window_show_all(myWindow);
     
    // Modifications à apporter aprés l'ouverture :
    Ouverture(datas); // pas besoin de GtkWidget *pWidget.
    gtk_window_show_all(datas->page); (enfin ce que t'as changé quoi, sinon appelle Ouverture juste avant le show all ...)
    Citation Envoyé par drazx Voir le message
    car j'ai besoin dans ma fonction de retourner dans la boucle du main
    Tu es toujours dans la boucle du main ... Si t'y es plus, c'est que le programme est terminé.


    Si vraiment c'est toujours pas ok, postes l'appel de fonction, ou plutot l'endroit ou tu veux coller ton signal.

    Mais vraiment, je vois pas le probleme (pour l'instant en tout cas )

  13. #13
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    up ?
    Je suis curieux de savoir si j'ai vraiment raté un épisode ou pas

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Par défaut
    t'as vraiment rien compris au problème skip : /

  15. #15
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut
    Effectivement skip tu n'a pas compris.
    Dans mon programme j'ai une boucle main (normal puisqu'il y a une interface graphique) et si j'utilise ma fonction sans callback (qui avec la fonction gtk_main_iteration permet de revenir dans la boucle du main pour rafraichir l'interface) la boucle qui est dans ma fonction tourne sans revenir à aucun moment dans ma boucle main. En revanche si j'utilise un callback je peux mettre un gtk_main_iteration dans ma boucle (toujours dans ma fonction) de manière à se que je retourne dans le main pour rafraichir l'interface, sans le gtk_main_iteration la boucle de ma fonction tournerais jusqu'à être terminé et seulement à ce moment elle reviendrais dans le main, en gros sans gtk_main_iteration mon interface se fige jusqu'à ce que la boucle se termine.

    Pour en revenir à mon problème, je confirme que realize sur mon mainWindow ne fonctionne pas, il ne rentre pas dans ma fonction, j'ai mis un cout << "test" << endl en début de fonction pour vérifier. Et pour map-event et expose-event ma théorie est que les callback arrive trop tôt ma liste n'a pas le temps de s'initialiser car j'ai des hexadecimaux (des adresses) au lieu de mes chaines du coup j'ai une erreur de segmentation car ma fonction n'a pas les bons paramètres.

    PS: Au moins quelqu'un aura appris quelque chose avec mon post c'est déjà ça

  16. #16
    Membre confirmé Avatar de skip78
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 247
    Par défaut
    Citation Envoyé par drazx Voir le message
    En revanche si j'utilise un callback je peux mettre un gtk_main_iteration dans ma boucle (toujours dans ma fonction) de manière à se que je retourne dans le main pour rafraichir l'interface, sans le gtk_main_iteration la boucle de ma fonction tournerais jusqu'à être terminé et seulement à ce moment elle reviendrais dans le main, en gros sans gtk_main_iteration mon interface se fige jusqu'à ce que la boucle se termine.
    Oki, au moins ton explication est claire

    Et donc le gtk_main_iteration, t'es sur que tu peux pas le mettre dans une fonction normale, parce que sinon, il suffit de le mettre dans ta fonction classique quoi.
    Et sinon, mettre un gtk_show / gtk_show_all à la place, ca marche/suffit pas?

  17. #17
    Membre Expert
    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
    Par défaut
    Je ne comprends pas bien moi Tu veux un callback pour exécuter un gtk_main_iteration pendant que ta fonction tourne, mais les callbacks sont justement invoqués par gtk_main_iteration, c'est à ça que sert (essentiellement) cette fonction. Et si tu as des appels à gtk_main_iteration dans ton code pour invoquer le callback, le callback en question ne sert plus à grand chose. Donc soit j'ai mal compris ce que tu veux faire, soit ce que tu veux faire se mord la queue

  18. #18
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 34
    Par défaut
    Dessolé de faire remonter un sujet vieux de 3 ans, mais je suis exactement dans le même problème que drazx, je veux lancer un callback automatiquement après l'ouverture et l'affichage de ma fenêtre.

    Ma raison est légèrement différente, je veux récupérer la taille d'une gtk_hbox pour pouvoir gérer la taille d'un gtk_hpaned placé à l’intérieur.

    Le problème est que si je demande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    GtkAllocation* alloc_m_pH0;
    gtk_widget_get_allocation(GTK_WIDGET(pData->m_pH0),alloc_m_pH0);
     
    std::cout<<"alloc_m_pH0 (height x width) : " <<alloc_m_pH0->height <<" x "<<alloc_m_pH0->width<<std::endl;
    std::cout<<"alloc_m_pH0 (X x Y) : " <<alloc_m_pH0->x <<" x "<<alloc_m_pH0->y<<std::endl;
    -> sans callback (dans mon main)
    alloc_m_pH0 (height x width) : 1 x 1
    alloc_m_pH0 (X x Y) : -1 x -1

    -> avec un callback automatique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(m_pWindow),"show",G_CALLBACK(Callback_Test),(gpointer*) &struc_gtk_principale);
    alloc_m_pH0 (height x width) : 565 x 1179
    alloc_m_pH0 (X x Y) : 0 x 25

    Dommage ce ne sont pas les bonnes taille !!!

    -> sur un callback attaché à un bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_connect(G_OBJECT(pButton),"clicked",G_CALLBACK(Callback_Test),(gpointer*) &struc_gtk_principale);
    alloc_m_pH0 (height x width) : 730 x 1130
    alloc_m_pH0 (X x Y) : 0 x 25

    Dimension OK !!!

    Auriez vous une idée pour résoudre ce problème ???

Discussions similaires

  1. [Divers] Execution lente au premier lancement de l'application
    Par SpecialCharacter dans le forum Langage
    Réponses: 2
    Dernier message: 13/02/2008, 11h37
  2. évènement au lancement d'une fenètre ??
    Par mahe01 dans le forum Delphi
    Réponses: 3
    Dernier message: 13/06/2006, 13h57
  3. Réponses: 3
    Dernier message: 05/09/2005, 14h09
  4. executer une fonction à la fermeture d'une fenêtre
    Par Oluha dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 22/02/2005, 09h46
  5. lancement de 2 fenêtres ms-dos
    Par neonico dans le forum Windows
    Réponses: 2
    Dernier message: 02/06/2004, 09h24

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