web-dev-qa-db-fra.com

Comment obtenir la disposition actuelle du clavier?

Je me demande s'il existe un outil en ligne de commande qui renvoie la disposition actuelle du clavier.

J'ai XkbLayout réglé sur us, ru.

Mise à jour:setxkbmap renvoie les paramètres de mise en page, pas la mise en page sélectionnée. Par exemple.:

$ setxkbmap -print | grep xkb_symbols
xkb_symbols   { include "pc+us+ru:2+inet(evdev)+capslock(grouplock)+terminate(ctrl_alt_bksp)"   };

Il retournera le même résultat, quelle que soit la disposition actuelle.

61
Andrew

Peut-être que cela dépend de la version, mais sur ma machine qui utilise setxkbmap 1.3.0, la commande suivante fonctionne:

setxkbmap -query | grep layout

Notez qu'en fonction de vos besoins, il peut être inutile de ne connaître que la mise en page: par exemple, la variante Dvorak de la mise en page américaine est assez différente de la QWERTY par défaut. Le -query l'option de setxkbmap donne à la fois la disposition et la variante, sous forme de champs différents:

$ setxkbmap -query
rules:      evdev
model:      default
layout:     fr
variant:    bepo
options:    grp:alt_shift_toggle
33
mars

Il y a xkb-switch qui est décrit ainsi:

xkb-switch est un programme C++ qui permet d'interroger et de modifier l'état de mise en page XKB.

https://github.com/ierton/xkb-switch

Ou, suivant la suggestion de nozimica, vous pouvez utiliser:

setxkbmap -print | awk -F"+" '/xkb_symbols/ {print $2}'

À partir de ce fil sur les cartes Arch Linux: https://bbs.archlinux.org/viewtopic.php?pid=539406

21
jasonwryan

Oui LÀ IS un outil en ligne de commande qui fait ce que vous voulez! Je l'ai découvert il y a 10min :)

Regardez ici: https://github.com/nonpop/xkblayout-state

xkblayout-state print "%s"

fait exactement ce que vous voulez (il ne produit pas de fin de ligne, alors ajoutez ; echo si tu as besoin). exécutez l'outil sans paramètres pour l'aide.

14
Pablo Saratxaga

Utilisez ceci pour obtenir le code de la mise en page actuelle:

$(xset -q|grep LED| awk '{ print $10 }')

Cela pourrait devoir être converti en un formulaire que vous souhaitez, comme:

case "$(xset -q|grep LED| awk '{ print $10 }')" in
  "00000002") KBD="English" ;;
  "00001002") KBD="Thai" ;;
  *) KBD="unknown" ;;
esac
11
Pepa

Une autre approche plus simple, en raison des positions fixes de la sortie du xset -q commande, est-ce:

xset -q | grep -A 0 'LED' | cut -c59-67

Il imprime 00000002 ou 00001002 en fonction de la disposition actuelle de votre clavier.

9
nikospag

Sur les systèmes plus récents, vous pouvez utiliser

localectl status

Il vous montrera par exemple les éléments suivants:

System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
8
oLen

Jusqu'à présent, les réponses n'ont pas fonctionné pour moi. J'utilise setkbmap avec deux mises en page anglais et tchèque donc tout -print ou -query renverra toujours les deux. Grepping l'état de la LED pour xset -q ne fonctionne pas non plus puisque celui-ci affiche l'état de toutes les leds du clavier.

Le mieux jusqu'à présent était d'écrire rapidement ce petit utilitaire: https://Gist.github.com/fikovnik/ef428e82a26774280c4fdf8f96ce8eeb

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <X11/XKBlib.h>
#include <X11/extensions/XKBrules.h>

int main(int argc, char **argv) {
  Display *dpy = XOpenDisplay(NULL);

  if (dpy == NULL) {
    fprintf(stderr, "Cannot open display\n");
    exit(1);
  }

  XkbStateRec state;
  XkbGetState(dpy, XkbUseCoreKbd, &state);

  XkbDescPtr desc = XkbGetKeyboard(dpy, XkbAllComponentsMask, XkbUseCoreKbd);
  char *group = XGetAtomName(dpy, desc->names->groups[state.group]);
  printf("Full name: %s\n", group);

  XkbRF_VarDefsRec vd;
  XkbRF_GetNamesProp(dpy, NULL, &vd);

  char *tok = strtok(vd.layout, ",");

  for (int i = 0; i < state.group; i++) {
    tok = strtok(NULL, ",");
    if (tok == NULL) {
      return 1;
    }
  }

  printf("Layout name: %s\n", tok);

  return 0;
}

et compiler en utilisant

gcc -I/usr/include getxkblayout.c -lX11 -lxkbfile

5
fikovnik

Vous pouvez utiliser xkbprint pour imprimer la mise en page actuelle.

Par exemple, pour imprimer la mise en page actuelle sous la forme PDF use

xkbprint -color "${DISPLAY}" - |\
    ps2pdf - > current_keyboard_layout.pdf

qui produit:

xkbprint result

3
Flow

De Goosfrabaa sur les forums Arch Linux :

setxkbmap -v | awk -F "+" '/symbols/ {print $2}'

Cela fonctionne correctement ici et imprime us(dvorak-intl) (affiché comme "USA Dvorak international" dans le menu de sélection du clavier GNOME).

2
l0b0

Réponse partielle: sous KDE, vous pouvez apparemment obtenir la disposition actuelle du clavier via la commande qdbus:

$ qdbus org.kde.keyboard /Layouts getCurrentLayout
gb(intl)

J'ai plusieurs dispositions configurées, mais elle ne montre que celle qui est actuellement utilisée.

Testé sur Kubuntu 18.04 (qdbus version 4.8.7). Il peut y avoir d'autres solutions basées sur d-bus pour les environnements non-Qt, mais je ne les connais pas.

1
Qeole
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


keyboardLayout () {
    layout=$(variableInFile "KEYMAP" "/etc/vconsole.conf")
    echo ${layout}
}


variableInFile () {
    variable=${1}
    file=${2}

    source ${file}
    eval value=\$\{${variable}\}
    echo ${value}
}


keyboardLayout
0