현재 키보드 레이아웃을 얻는 방법은 무엇입니까?

현재 키보드 레이아웃을 얻는 방법은 무엇입니까?

현재 키보드 레이아웃을 반환할 수 있는 명령줄 도구가 있는지 궁금합니다.

XkbLayout으로 설정 했습니다 us, ru.

고쳐 쓰다: setxkbmap선택한 레이아웃 대신 레이아웃 설정을 반환합니다. 예를 들어:

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

현재 레이아웃이 무엇이든 동일한 결과를 반환합니다.

답변1

버전과 관련이 있을 수도 있지만 setxkbmap1.3.0을 사용하는 내 컴퓨터에서는 다음 명령이 작동합니다.

setxkbmap -query | grep layout

필요에 따라 레이아웃을 아는 것만으로는 유용하지 않을 수 있습니다. 예를 들어 미국 레이아웃의 Dvorak 변형은 기본 QWERTY와 상당히 다릅니다. -query옵션은 setxkbmap레이아웃과 변형을 다양한 필드로 제공합니다.

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

답변2

예, 귀하의 요구 사항에 맞는 명령줄 도구가 있습니다! 10분전에 발견했어요 :)

이봐:https://github.com/nonpop/xklayout-state

xkblayout-state print "%s"

원하는 것을 정확하게 수행합니다(줄 끝을 출력하지 않으므로 ; echo필요한 경우 추가하십시오). 도움말을 보려면 인수 없이 도구를 실행하세요.

답변3

다음과 같이 설명되는 xkb-switch가 있습니다.

xkb-switch는 XKB 레이아웃 상태를 쿼리하고 변경할 수 있는 C++ 프로그램입니다.

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

또는 nozimica가 제안한 대로 다음을 사용할 수 있습니다.

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

Arch Linux 보드의 이 스레드에서:https://bbs.archlinux.org/viewtopic.php?pid=539406

답변4

지금까지의 답변은 나에게 적합하지 않습니다. 저는 setkbmap영어와 체코어 레이아웃을 모두 사용하고 있으므로 any -print또는 -query는 항상 두 레이아웃을 모두 반환합니다. LED 상태 쿼리는 xset -q모든 키보드 LED의 상태를 표시하므로 작동하지 않습니다.

지금까지 가장 좋은 방법은 다음과 같은 작은 유틸리티를 빠르게 작성하는 것입니다. 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;
}

다음을 사용하여 컴파일

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

관련 정보