Como faço para obter o layout atual do teclado?

59

Gostaria de saber se existe alguma ferramenta de linha de comando que retorne o layout atual do teclado.

Eu tenho XkbLayout definido como us, ru .

Atualização: setxkbmap retorna as configurações do layout, não o layout selecionado. Por exemplo:

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

Ele retornará o mesmo resultado, independentemente do layout atual.

    
por Andrew 26.04.2011 / 23:08

10 respostas

28

Talvez seja dependente da versão, mas na minha máquina que usa setxkbmap 1.3.0 o seguinte comando funciona:

setxkbmap -query | grep layout

Observe que, dependendo da sua necessidade, pode ser inútil saber apenas o layout: por exemplo, a variante Dvorak do layout americano é bem diferente do padrão QWERTY. A opção -query de setxkbmap fornece o layout e a variante como campos diferentes:

$ setxkbmap -query
rules:      evdev
model:      default
layout:     fr
variant:    bepo
options:    grp:alt_shift_toggle
    
por 22.09.2012 / 16:18
16

Existe xkb-switch que é descrito assim:

xkb-switch is a C++ program that allows to query and change the XKB layout state.

link

Ou, seguindo a sugestão do nozimica, você pode usar:

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

Deste tópico nas pastas do Arch Linux: link

    
por 26.04.2011 / 23:21
11

Sim Existe uma ferramenta de linha de comando que faz o que você quer! Eu descobri há 10 minutos atrás:)

Veja aqui: link

xkblayout-state print "%s"

faz exatamente o que você quer (não produz um fim de linha, então adicione ; echo se você precisar). execute a ferramenta sem parâmetros para a ajuda.

    
por 06.04.2013 / 01:41
9

Use isso para obter o código do layout atual:

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

Isso pode precisar ser convertido em um formulário que você deseja, como:

case "$(xset -q|grep LED| awk '{ print $10 }')" in
  "00000002") KBD="English" ;;
  "00001002") KBD="Thai" ;;
  *) KBD="unknown" ;;
esac
    
por 26.12.2011 / 16:44
8

Outra abordagem mais simples, devido às posições fixas da saída do comando xset -q , é esta:

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

Imprime 00000002 ou 00001002 dependendo do layout atual do seu teclado.

    
por 05.01.2012 / 06:11
5

Em sistemas mais recentes, você pode usar

localectl status

Por exemplo, mostrará o seguinte:

System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
    
por 12.12.2016 / 14:56
2

De Goosfrabaa nos fóruns do Arch Linux :

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

Isso funciona corretamente aqui e imprime us(dvorak-intl) (exibido como "USA Dvorak international" no menu de seleção de teclado do GNOME).

    
por 05.01.2012 / 12:50
2

As respostas até agora não funcionaram para mim. Eu uso setkbmap com dois layouts inglês e tcheco, então qualquer -print ou -query sempre retornará os dois. A verificação do status do LED para xset -q também não funciona, desde que esse mostre o status de todos os leds do teclado.

O melhor até agora foi escrever rapidamente este pequeno utilitário: link

#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;
}

e compilar usando

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

    
por 07.02.2018 / 10:46
0

Resposta parcial: No KDE , aparentemente você pode obter o layout atual do teclado através do comando qdbus :

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

Eu tenho vários layouts configurados, mas ele mostra apenas o que está em uso atualmente.

Testado no Kubuntu 18.04 (qdbus versão 4.8.7). Pode haver outras soluções baseadas em d-bus para ambientes não-Qt, mas eu não sei sobre elas.

    
por 22.07.2018 / 18:46
-1

Você pode usar:

setxkbmap -print | grep xkb_symbols
    
por 26.04.2011 / 23:27