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+ Discussion :

[gtkmm] Bloquer le pointeur de la souris


Sujet :

GTK+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Par défaut [gtkmm] Bloquer le pointeur de la souris
    Salut à tous !

    Je me suis récemment mis à gtkmm dans le but de faire un petit éditeur 3D pour un jeu que je programme.
    J'aimerai pouvoir contrôler la camera avec la souris sur mon widget 3D intègré, par exemple cliquer-glisser (drag) avec le bouton gauche pour faire tourner la camera.
    J'y arrive, mais le problème du drag, c'est que le pointeur se déplace. Or, ce qui m'intéresse principalement c'est un mouvement relatif, et non un mouvement absolu : en gros, j'aimerai que le pointeur reste là où il était quand j'ai commencé à faire tourner ma caméra (tout en restant caché pendant l'opération, c'est plus joli).

    J'ai trouvé une astuce, presque parfaite :
    • Quand je commence le drag, je garde de côté la position du pointeur :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      Gdk::ModifierType mModifier;
      Glib::RefPtr<Gdk::Display> pDisplay = Gdk::Display::get_default();
      pDisplay->get_pointer(
           iDragStartX, iDragStartY,
           mModifier
      );
      ... puis je le cache :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      this->get_window()->set_cursor(Gdk::Cursor(
          Gdk::Display::get_default(),
          Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB, true, 8, 1, 1),
          0, 0
      ));
    • Je récupère le mouvement relatif avec l'event "motion notify".
      Je regarde où se trouve le curseur sur l'écran : si il atteint un bord de l'écran, je le repositionne au centre (attention : gdk va générer un event de déplacement de la souris, il ne faut pas en tenir compte, d'une manière où d'une autre ^^) :
      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
      int x, y;
      Gdk::ModifierType mModifier;
      Glib::RefPtr<Gdk::Display> pDisplay = Gdk::Display::get_default();
      pDisplay->get_pointer(
          x, y,
          mModifier
      );
       
      Glib::RefPtr<Gdk::Screen> pScreen = pDisplay->get_default_screen();
       
      if ((x == 0) || (y == 0) ||
          (x == pScreen->get_width()-1) ||
          (y == pScreen->get_height()-1))
      {
          pDisplay->warp_pointer(
              pScreen,
              iDragStartX, iDragStartY
          );
      }
    • Quand j'ai fini mon drag, je repositionne le curseur là où il était au début, puis je le ré-affiche :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      Glib::RefPtr<Gdk::Display> pDisplay = Gdk::Display::get_default();
      Glib::RefPtr<Gdk::Screen> pScreen = pDisplay->get_default_screen();
      pDisplay->warp_pointer(
          pScreen,
          iDragStartX, iDragStartY
      );
      this->get_window()->set_cursor();


    Le seul soucis (sur Ubuntu en tout cas, pas eu l'occasion de tester sous XP), c'est qu'il y a une certaine latence au niveau du repositionnement du curseur : quand le drag est terminé, le curseur réapparait immédiatement, mais il n'est pas encore repositionné. Il faut attendre une miliseconde ^^ Ça peut paraitre tatillon, mais ça se remarque quand même et ça fait vraiment pas propre.
    Y a t-il une fonction (portable si possible) pour forcer l'environnement qui gère le curseur à le repositionner immédiatement (et pas à la prochaine mise à jour, ou je ne sais trop quand) ?

    Merci d'avance !

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Par défaut
    J'ai trouvé une autre solution, tout aussi jolie :
    Au lieu de repositionner le curseur au centre de l'écran quand il atteint un bord, on le téléporte à l'autre bout de l'écran (comme s'il "traversait" le bord droit pour apparaitre sur le bord gauche par exemple).
    Du coup, on le laisse visible pour que l'utilisateur ne le perde pas de vue entre temps Et ça fait disparaitre le problème de synchronisation.

    Ceci dit, je suis toujours intéressé par une réponse à mon premier post.

Discussions similaires

  1. Changer le pointeur de la souris
    Par jolann69 dans le forum 4D
    Réponses: 1
    Dernier message: 13/06/2006, 08h40
  2. [C]Bloquer le clavier ou la souris ?
    Par The Lord of Nesquik dans le forum Windows
    Réponses: 13
    Dernier message: 22/05/2006, 11h09
  3. [MFC] Changer la forme du pointeur de la souris
    Par Philippe320 dans le forum MFC
    Réponses: 2
    Dernier message: 03/12/2005, 11h30
  4. Réponses: 5
    Dernier message: 23/08/2005, 12h08
  5. modifier pointeur de la souris au survol d'une case
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 28/06/2005, 17h54

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