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

GLUT Discussion :

Conflit de fonctions de callback GLUT


Sujet :

GLUT

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Conflit de fonctions de callback GLUT
    Bonjour,

    je suis confronté à un problème sous GLUT. J'ai une application qui utilise une fonction de callback pour les clics de la souris (glutMouseFunc) et un menu contextuel GLUT (glutCreateMenu) attaché sur le clic droit de la souris (glutAttachMenu(GLUT_RIGHT_BUTTON)). Le problème est que du fait d'avoir associé le clic droit aux menus, il n'est plus capturé dans ma fonction de callback des de la souris. Or pour mon application il est vital d'avoir à le faire. Je voudrais donc d'abord capturer le clic droit dans la fonction de callback de la souris puis appeler la fonction de callback du menu (enfin afficher le menu en fait, puisqu'en réalité la fonction de callback du menu n'est appelé que lorsque l'on selection un item dans celui-ci).

    j'ai essayé d'attacher le menu à bouton DANS la fonction de callback de la souris, mais au moment ou celle-ci est appelé, le clic est bien évidement "consommé" et le menu n'apparait pas, il faut effectuer un second clic pour le faire apparaitre. Cependant même cette méthode cause d'autre problème apprès car il faut détacher le bouton du menu ce qui est facilement fesable dans la fonction de callback du menu, mais si celle-ci n'est pas appelée si l'on ferme le menu sans sélectionner d'item (en cliquant ailleurs par exemple) alors cela devient impossible.

    J'aimerai donc savoir si l'un d'entre vous à une idée pour d'abord capturer le clic dans la fonction de callback de la souris puis afficher le menu ensuite. J'ai vérifié s'il y avait une méthode pour déclencher l'affichage du menu mais sans succès. J'en appel donc à vos idées.

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Il est, à mon avis, très difficile de le faire dans cet ordre. La gestion du menu contextuel est vraiment dans le coeur de Glut et ce sera difficile de changer son comportement sauf si tu te t'amuses à prendre les sources de Glut et tu les modifies pour qu'il le fasse.

    Le plus simple serait de le faire dans l'autre sens. Ne pourrais tu pas appeler le callback depuis le menu ?

    Sinon, c'est de faire ton propre système de menu pour que tu gères tout en interne.

    Jc

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour cette réponse,

    Je suis d'accord sur le fait que c'est plus simple dans l'autre sens, malheureusement c'est impossible pour moi de le faire. Explication : j'ai une scène avec plusieurs objets graphiques chacun possédant son propre menu. Le but de la manœuvre était donc de capturer le clic dans la fonction de callback de la souris afin de déterminer, grâce aux coordonnées de la souris et à la position de ma caméra dans la scène, au dessus de quel objet graphique la souris se trouve. Une fois l'objet trouvé, je spécifie à GLUT quel devient le menu courant à l'aide de la fonction glutSetMenu. Tu comprends donc que je ne peux pas le faire dans l'autre sens car GLUT ne peut avoir qu'un seul menu actif à la fois.

    Cependant, lueur d'espoir, un collègue m'a donnée une solution qui ne me semble pas bête du tout, je la donne à titre informatifs pour ceux que cela intéresse de posséder plusieurs menus : l'opération sélection du menu correct en fonction de la position de la souris ne serait pas effectuer lors d'un clic mais pour chaque mouvement de la souris à l'aide de la fonction de callback de mouvement de la souris (glutPassiveMotionFunc). Comme cela on associe le bon menu sur le clic de souris désiré et le menu s'affiche. Ensuite si l'on veut tout de même passer également dans la fonction de callback des clics de la souris il faut l'appeler manuellement au début (ou à la fin) de la fonction de callback du menu. Seul inconvénient, cette dernière fonctionnalité ne fonction que lorsque l'on a effectivement sélectionné un item dans le menu, ce qui n'est pas forcément le cas.

    Pour résumer voici ce qu'il faut faire :

    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
    int menu_objet[m];
    int mouse_x = 0;
    int mouse_y = 0;
     
    int main(int argc, char ** argv)
    {
        ...
        glutPassiveMotionFunc(passive_selection);
        glutMouseFunc(mouse_click);
     
        menu_objet[0] = glutCreateMenu(action_menu_0);
        glutAddMenuEntry("blabla", 0);
        ....
        glutAddMenuEntry("blabla", n);
     
        menu_objet[m - 1] = glutCreateMenu(action_menu_m-1);
        glutAddMenuEntry("blabla", 0);
        ....
        glutAddMenuEntry("blabla", n);
    }
     
    void passive_selection(int x, int y)
    {
        mouse_x = x;
        mouse_y = y;
     
        int ind_objet_courant;
        // Trouver l'indice de l'objet courant
        ...
     
        // Si le curseur est au dessus d'un objet graphique possédant un menu
        if(ind_objet_courant != -1)
        {
            glutSetMenu(menu_objet[ind_objet_courrant]);
            glutAttachMenu(GLUT_RIGHT_BUTTON);
        }
        // Si on est au dessus d'aucun menu alors on désactive les menus
        else
            glutDetachMenu(GLUT_RIGHT_BUTTON);
    }
     
    void mouse_click(int button, int state, int x, int y)
    {
        // Traitements à effectuer sur les clics de souris
    }
     
    void action_menu_0(int ind)
    {
        // Actions du menu en fonction de ind
     
        // Permet d'effectuer le traitement pour le clic de souris que l'affichage du menu vient de consommer
        // les autres action_menu_x doivent comporter cette ligne également
        mouse_click(GLUT_RIGHT_BUTTON, GLUT_DOWN, mouse_x, mouse_y);
    }
    Sinon pour te répondre comme ça, j'ai déjà regardé le code source de GLUT et c'est assez fouillis je trouve mais de toute manière je veux que mon application soit portable et compilable facilement sur les trois plateformes standard (enfin au moins les 2 premières que je cite) : Linux, Windows, MacOS.

    Sachez néanmoins, que cette solution n'est pas parfaite et à quelques faiblesses. J'ai notamment relevé ce problème : lorsque l'on affiche un menu et qu'on le ferme en cliquant précisément sur un autre objet comportant un menu, cela le ferme effectivement, mais si on refait un clic pour ouvrir le nouveau menu (donc le menu d'un objet différent), mais sans bouger le curseur du moindre pixel, le menu qui s'affichera sera le même que celui précédemment sélectionné. Cela s'explique du fait que lorsque l'on affiche un menu GLUT, la fonction de callback associé au mouvement de la souris n'est PLUS appelée tant que le menu est ouvert. Le menu qui est donc associé à GLUT comme étant le menu courant n'est donc plus mis à jour.

    Voilà en espérant que cela pourra en aider certains. En tous cas merci de ta réponse fearyourself. Au passage je fais un petit peu de publicité J'avais besoin de votre aide pour une application qui s'appelle VirChor (Virtual Choreographer) qui permet de créer des scènes 3D OpenGL à partir de fichier structurés en XML. Le site de l'appli : http://virchor.sourceforge.net/. Un tuto vraiment bien fait pour apprendre rapidement : http://virchor.sourceforge.net/siteTVC/


    Voilà fin de la pub-time

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Ok je comprends mieux. Faire comme tu le dis aurait un coup tout de même important sur le système.

    Je me demande si tu ne pourrais pas faire appel à la fonction glutMenuStatusFunc qui est appelé lors d'une modification sur la présence ou non d'un menu.

    La fonction prend en même temps la position de la souris ce qui est pratique. Après il faudrait jongler avec la valeur status pour faire fonctionner le tout mais je pense que ce serait mieux.

    Par contre, tu ne pourras pas détruire et reconstruire le menu, faudra modifier ou simplement tout virer et tout remettre (a faire attention, il faut surement virer les sous-menu entièrement en profondeur aussi, a verifier)

    Jc

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    C'est effectivement une excellente idée, j'ai essayé tout de suite après. Malheureusement GLUT interdit de modifier tous les menus si l'un deux est déclaré "actif", ce qui est le cas lorsque la fonction appelée par glutStatusFunc est lancée. A priori cela depuis la version 3.0 de GLUT, enfin c'est ce que me dis le message. Dommage tout de même, je resterai donc sur cette demie solution

    Merci beaucoup de ton aide en tous cas

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

Discussions similaires

  1. Fonction et Callback
    Par biquet dans le forum Interfaces Graphiques
    Réponses: 17
    Dernier message: 13/04/2007, 15h01
  2. Fonction de callback
    Par alain lecomte dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/03/2007, 20h24
  3. problème avec un appel de fonction de callback de C++ vers C#
    Par surfurax dans le forum Framework .NET
    Réponses: 1
    Dernier message: 29/01/2007, 10h09
  4. Réponses: 4
    Dernier message: 14/09/2006, 12h25
  5. Possibles conflits entre GL, GLAUX et GLUT
    Par barthelv dans le forum GLUT
    Réponses: 1
    Dernier message: 19/11/2004, 12h31

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