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 :

Propagation des évènements du clavier


Sujet :

GTK+

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut Propagation des évènements du clavier
    Salut à tous,

    Je suis en train d'écrire un plugin pour une appli GTK.
    Problème : l'appli possède un certain nombre de raccourcis clavier qui m'empêchent d'écrire correctement dans un GtkEntry.

    Par exemple, si je sélectionne mon Entry et que je tappe "123" au clavier, seul "23" sera affiché car "1" est le raccourci clavier qui fait un zoom 100%.
    C'est dû au fait que dans GTK, la fenêtre principale est prioritaire pour gérer les évènements clavier.


    Est-il possible de modifier ce comportement en faisant en sorte que si un GtkEntry est actif il récupère tous les évènements clavier en priorité ?

    Peut-on notamment bloquer temporairement les 'key-press-event' de la fenêtre principale par exemple ?

    J'ai aussi lu ici (...GTK+ keeps stealing the key press events...) qu'on peut empêcher la propagation en renvoyant TRUE je sais pas quand ; quelqu'un a-t-il des précisions là-dessus ?



    Merci d'avance


    -

  2. #2
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 2
    Par défaut
    Je viens de me confronter à un problème identique, et je te réponds ma solution, même s'il est un peu tard j'imagine ;

    En effet, il faut jouer avec les valeurs de retour de ta fonction key-press-event :
    Dans ta fonction callback, mettons key_press, il faut que tu fasses retourner TRUE pour les valeurs que tu ne veux pas rentrer dans ton entry, et FALSE pour le reste ;
    - TRUE = Arrête toi là GTK, j'ai appuyé sur une touche, j'ai fait ce que je voulais et j'ai plus envie que tu cherches à faire autre chose !
    - FALSE = J'ai pas trouvé ce que je voulais faire, va chercher dans les autres objets de la fenêtre s'ils ne peuvent pas faire quelque chose avec la touche appuyée)

    Un petit exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data){
     
        switch(event->keyval){
            case GDK_Left: 
               printf("Touche Gauche appuyée !"); 
               return TRUE; 
            break;
        }
     
        return FALSE;
    }
    Ce code va permettre d'écrire dans la GtkEntry, mais quand la touche "Gauche" sera enfoncée, le curseur de la GtkEntry n'ira pas à gauche, car c'est la fonction callback qui aura géré l'évenement de cette touche d'abord.
    J'espère être clair

  3. #3
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Non non, ce n'est pas trop tard

    J'ai mis ce projet en attente ; je testerai tout ça dans quelques jours.


    Merci à toi


    -

  4. #4
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Bon ben ça marche toujours pas Quand j'appuie sur une des touches concernées, le 'key-press-event' n'est même pas émis !

    Les raccourcis claviers doivent être gérés de façon différente...

    Le top du top ce serait d'arriver à désactiver les Accels pour seulement le widget concerné

  5. #5
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 2
    Par défaut
    Décidemment, tu vas me dire que je suis doué pour répondre en retard moi !

    Oui, donc, je pense simplement que tu n'as pas activé ton widget pour l'évenement "key-pressed" ...

    Tu peux faire cela comme ça :
    gtk_widget_set_events (widget, GDK_KEY_PRESS_MASK);

    Et hop !
    Retrouve une liste des mask des évenements que tu veux ici :
    http://developer.gnome.org/doc/GGAD/sec-gdkevent.html

    (Events Masks)

    En espérant qu'il ne soit pas trop tard encore une fois !

  6. #6
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Malheureusement si, j'avais bien mis le key_press_mask.

    D'ailleurs ça marche bien : si je tape "2" ou "3", la fonction key_press est bien exécutée, mais si je tape "1", ça me refait le zoom 100% et rien d'autre...

    À mon avis, tout se passe au niveau de la fenêtre principale, vu que c'est elle qui capte les évènements du clavier en premier, et qui gère aussi les raccourcis clavier

    -

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

Discussions similaires

  1. Propagation des évènements
    Par le_chomeur dans le forum jQuery
    Réponses: 20
    Dernier message: 27/07/2011, 22h04
  2. [Graphics View] Propagation des évènements vers un QGraphicsWidget
    Par afloret dans le forum Qt
    Réponses: 10
    Dernier message: 10/02/2010, 10h16
  3. Réponses: 4
    Dernier message: 20/10/2009, 18h34
  4. [JTabbedPane] capture des événements clavier
    Par sepas dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 13/06/2008, 23h10
  5. Réponses: 2
    Dernier message: 17/02/2008, 09h42

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