現在のキーボードレイアウトを取得する方法は?

現在のキーボードレイアウトを取得する方法は?

現在のキーボードレイアウトを返すコマンドラインツールがあるかどうか疑問に思います。

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

関連情報