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 :

[gtk/gdk] Codes des touches clavier


Sujet :

GTK+ avec C & C++

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut [gtk/gdk] Codes des touches clavier
    Bonjour,

    Je fais quelque opérations sur les touches clavier, et je me pose une question: quelle est la valeur la plus sure (dans le sens où elle ne changera pas en fonction de la machine, du système, ou du clavier) entre la valeur logique de la touche (gdkEventKey->keyval) et la valeur hardware de la touche (GdkEventKey->hardware_keycode) ?
    J'ai pensé tout d'abord que ce serait la valeur logique, mais en faisant un test sur un ordi fixe, et sur un portable, j'ai constaté une différence de valeur keyval
    sur la touche " ²" , alors que le hardware_keycode des touches semblent identiques....

    Quelqu'un s'est-il déjà penché sur le sujet ?

    Autre question, comment identifier à coup sur la touche ALT-GR ? car le type de mask sur un eventKey identifie la touche Shit, Control, Lock, mais pas la touche ALT gr (ou Compose)...

    Merci

  2. #2
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    il semblerait que la valeur hardware ne change jamais, alors que la valeur logique est utilisée par gtk pour mapper les différents languages (fr, us, etc...)

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    A mon avis, la valeur hardware dépend de la position de la touche sur le clavier alors que la valeur logique dépend du langage.

    Pour la touche Alt Gr, tu as uniquement GDK_Alt_L et GDK_Alt_R.

  4. #4
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    Je n'en suis plus si sûr, depuis que j'ai remarqué entre un portable et un fixe, que la touche ² ne renvoyait pas le même code logique...
    Voilà pourquoi je pense m'"appuyer sur la valeur hardware qui ne semble pas changer, mais je ne trouve rien sur internet qui précise si la valeur hardware risque de changer d'un clavier à l'autre, ou d'une machine à l'autre...
    Mes tests semblent dire que non, mais on ne fait pas de preuve par l'exemple

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Je viens de faire un p'tit test, sous windows quand je change la langue les deux valeurs sont modifiées :
    En français :
    • A : 113 - 81
    • Q : 97 - 65
    En anglais :
    • A : 97 - 65
    • Q : 113 - 81
    Je viens de trouver un Howto sur le clavier, voici un passage interessant :
    Citation Envoyé par [url=http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/fr/text/Keyboard-and-Console-HOWTO.txt]The Linux Keyboard HOWTO
    [/url]
    2. Le clavier - généralités

    Quand on appuie sur une touche, le contrôleur clavier envoie des
    scancodes au pilote clavier du noyau. Certains claviers sont
    programmables, mais en général les scancodes sont fixes. Quand le
    pilote clavier est en _mode scancode_ (dit aussi _mode raw_), le noyau
    se contente de transmettre les codes tels quels à l'application, c'est
    ce qui se passe sous X. Sinon le flux de scancodes est décomposé en
    keycodes correspondant à l'appui ou au relâchement d'une touche. (Le
    simple fait d'appuyer sur une touche peut produire jusqu'à 6
    scancodes, réduits ici en un seul keycode.) Si le pilote clavier est
    en _mode keycode_ (ou _mode mediumraw_), l'application reçoit les
    keycodes (ce mode est utilisé, par exemple, par showkey). Sinon, les
    keycodes sont traduits d'après une table (keymap), ensuite, soit un
    caractère (ou un chaîne) est envoyé à l'application, soit une action
    est déclenchée. (Exemple: si on appuie et relâche la touche q, le
    clavier envoie les scancodes 0x1E et 0x9E, ce qui est converti en
    keycodes 30 et 158, puis en la valeur 113, qui est le code ASCII ou
    Latin-1 de q (avec un clavier Azerty et une keymap adaptée). Si on
    appuie et relâche la touche Suppr, le clavier envoie les scancodes
    0xE0 0x53 0xE0 0xD3, convertis en keycodes 111 et 239, ce qui donne
    finalement la séquence ESC [ 3 ~. Ctrl-Alt-Suppr est une combinaison
    de touches qui déclenche une action.)
    Je pense que maintenant ta question à plus sa place dans le forum hardware, non ?

    PS :
    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
    #include <gtk/gtk.h>
    #include <gdk/gdkkeysyms.h>
     
    gboolean key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
    {
      gchar *text = NULL;
     
      text = g_strdup_printf ("%d - %d", event->keyval, event->hardware_keycode);
      gtk_label_set_text (GTK_LABEL (user_data), text);
      free (text);
      return TRUE;
    }
     
    int main (int argc, char **argv)
    {
      GtkWidget *window = NULL;
      GtkWidget *vbox = NULL;
      GtkWidget *label = NULL;
     
      gtk_init (&argc, &argv);
     
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      g_signal_connect (G_OBJECT(window), "destroy", gtk_main_quit, NULL);
     
      vbox = gtk_vbox_new (TRUE, 0);
      gtk_container_add (GTK_CONTAINER (window), vbox);
     
      label = gtk_label_new ("Press any key...");
      gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
      g_signal_connect
      (
        G_OBJECT(window),
        "key-release-event",
        G_CALLBACK (key_press),
        label
      );
     
      gtk_widget_show_all (window);
      gtk_main ();
      return 0;
    }

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    arrrg donc en sous windows il change également le hardware ???!! Mais comment se repère-t-il alors ? Je pensais qu'il récupérait le hardware, et que selon le language il renvoyait le code logique adéquat.....
    je ne peux pas encore tester sous win, ma config mingw est en chantier
    tu es sûr de ne pas t'être trompé :'( ?

  7. #7
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    donc, pour ceux que ça peut intéresser,

    pour une touche:
    - le code gdk hardware clavier de linux ne se retrouve pas sous windows
    - le code gdk keyval clavier de linux semble être le même sous windows

    Mais
    - attention, sous linux, certaines touches peuvent changer de valeur keyval
    d'un pc fixe à un portable: la touche ² par exemple
    - certaines combinaisons de touches renvoient la même valeur, par exemple altGr+2 (pour faire le ~) et la maj+² ... éventuellement utiliser les mask, encore faut-il être sûr que parmi toutes les combinaisons renvoyant le même code logique aucunes n'aient un mask en commun

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut keysym
    Bonjour,

    Je suis en train d'écrire un clavier virtuel pour gnome et j'ai bien étudié le problème.
    Pour résumer, le keycode est un code affecté à chaque touche du clavier, alors que le keyval tiens compte des modifiers (shift+A par exemple a un keyval différent de A, mais il y a 2 keycodes pour shift+A : 1 pour shift et 1 pour A).
    Il me semble que ce que tu cherche est un moyen de reproduire un symbole avec une voire plusieurs touches (sur certaines configurations, il faut utiliser shift pour produire ²).
    Il te faut utiliser le keysym (symbole de touche).
    la commande xmodmap -pk imprime les correspondances entre les keycodes et les keysym (plusieurs keysym par keycode, car les touches peuvent être interprétées avec les modifiers ; shift, control, Alt, altGR etc...).
    Chaque keysym a une code et une représentation sous forme de chaîne : par exemple, ² est 0xb2 ou twosuperior et ce symbole sera toujours le même sur un portable ou sur un fixe.
    Avec gdk, tu peux retrouver le keyval correspondant avec gdk_keyval_from_name("twosuperior").
    Le symbole de la touche AlrGr est ISO_Level3_Shift.
    Donc, pour voir à coup sûr si la touche est AltGr, il faut écrire :
    event->keyval==gdk_keyval_from_name("ISO_Level3_Shift")
    Par ailleurs, le type de mask pour altGr est MOD5 (voir xmodmap sans argument).
    xmodmap est la commande pour voir coment le clavier est mappé dans X ou pour changer le mappage ==> voir man xmodmap. Tu peux affecter ² à la touche espace si tu en as envie.

    En espérant que ça aide...

  9. #9
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    hmm ça me laisse songeur... il y une chose que je n'ai pas du comprendre.

    Je cherche à faire un mapping clavier personnalisé au sein de mon application gtk.
    Sur une touche clavier pressée, que je récupère par le on_key_press_event, je peux ensuite avoir simplement la valeur du keyval, du hardware keycode, et du mask correspondant. Mais je n'ai en revanche pas la valeur keycode que l'on voit avec xmodmap -pk.
    Donc je ne comprends pas l'utilité de la fonction gdk_keyval_from_name, puisque j'ai déjà le keyval, et que je n'ai pas le name. De plus, certaines touches ne renvoient pas le même keyval entre un fixe et un portable, donc le problème semble rester entier non ?

  10. #10
    Débutant Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Points : 162
    Points
    162
    Par défaut
    je suis peut-être un peut hors sujet mais il n'y a pas moyen de savoir dans quelle configuration on est en utilisant les locales (locale.h) et en forçant sur ce qu'on veut ?

  11. #11
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    hmm je ne sais pas trop, car dans le cas qui me concerne, peu importe la locale, je veux définir un mapping personnel...

    J'ai bien comparé les différentes valeurs, et il y a des différences:

    - pour le hardware code, il varie si on est sous linux ou windows
    - il reste inchangé pour un même OS
    - ce code change-t-il selon les claviers ? j'ai vérifié juste avec qq uns, pas assez pour être sur

    - pour le keyval, il varie si on est sous linux ou windows (les majuscules notamment)
    - le keyval semble varier pour un même OS: sous linux, "maj + ," et "lockMaj + ," ne renvoie pas la même valeur logique, car sous linux maj et lock Maj ne renvoie pas le même caractère pour tout ce qui n'est pas une lettre
    - j'ai constaté que certaines touches, d'un portable à un fixe, ne renvoie pas le même keyval (touche ²) pour un même OS (linux)

    le choix le plus simple semble être un mapping pour linux, un pour windows, en se basant sur le code hardware et les masques.

  12. #12
    Membre actif
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Points : 248
    Points
    248
    Par défaut
    Alors petite précision, concernant la différence de la valeur logique gdk_keyval , sur un même linux, entre portable et fixe.
    J'ai finalement compris qu'il s'agissait d'une configuration clavier différente dans le fichier xorg.conf de X11
    (il y avait une ligne configuration alternative latin-9)

    Donc la valeur logique des touches claviers, si on prend soin de vérifier la bonne confguration clavier, semble être la même.

    En ce qui concerne les différences de valeur entre maj et majLock, il semble que ce soit le fonctionnement par défaut sous linux, la plupart des applications (gedit, OpenOffice) l'ont laissé.

    Il reste donc juste à faire attention, dans certains cas, une même valeur logique peut être renvoyée par des combinaisons de touche différentes...

Discussions similaires

  1. Codes des touches clavier.
    Par anorham dans le forum C++Builder
    Réponses: 3
    Dernier message: 29/03/2013, 11h01
  2. [Toutes versions] Codes des touches clavier
    Par setepenre dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/01/2011, 14h46
  3. [GDK/GTK+] Répétition automatique des touches
    Par soft0613 dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 05/08/2009, 07h55
  4. code hexa des touches claviers
    Par darkwall_37 dans le forum Débuter
    Réponses: 4
    Dernier message: 24/03/2009, 09h52
  5. Code des touche du clavier
    Par kroma23 dans le forum Langage
    Réponses: 4
    Dernier message: 27/03/2008, 17h46

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