Linux環境のキー検出

最近 labwc を v0.6.5 にアップグレードしたところ、スクリーンショット ボタンの印刷がどのように押しても反応しないことがわかりました。

理由は次のとおりです。

  • リンクされたスクリーンショット ソフトウェアが失敗しました。
  • ボタンが壊れています。
  • labwc のアップグレードによって発生する問題。

私が使用しているスクリーンショットソフトは「grip + slurp + ksnip」の組み合わせで、screenshot.sh スクリプトを呼び出して実装していますが、実際のテストでは問題ありません。

1pwd
2/home/mephisto/.config/labwc
3➜  cat screenshot.sh
4#!/bin/sh
5NOW=$(date +"%Y-%m-%d-%H%M%S")
6grim -g "$(slurp )" -t png $HOME/Pictures/grim-$NOW.png
7QT_QPA_PLATFORM=xcb /usr/bin/ksnip $HOME/Pictures/grim-$NOW.png

もしかしてボタンが壊れたのでしょうか? 私の機材は 1800 円、各ボタンは少なくとも数ドルの価値があるので、そう簡単に失敗するわけにはいきません。

問題は、Linux 環境で「print」キーが有効かどうかをどのように検出するかということです。 このとき、それぞれ X 環境と Wayland 環境でのイベント検出に相当する xev と wev を考えました。 悲劇的なのは、これら 2 つのコマンド ライン ツールを使用して検出すると、印刷ボタンを押しても何も出力されないことです。 キーキャップを裏返して押してみましたが、何も起こりませんでした。

絶望的に、labwc にロールバックすることしかできませんでしたが、再度ログインすると、すべてが正常になりました。 これは大冗談です。特定のボタンをターゲットにして固定点を狙撃するという魔法の問題があります。

普通の人はこの時点でそれを追求しないかもしれませんが、夜寝るときに、ボタンが有効であることを簡単に検出するにはどうすればよいかを考えます。

要約すると次のようになります。

1. xev と wev を使用する

X 環境は xev を使用し、Wayland は wev を使用します。特殊な未知数のため問題を検出できませんでしたが、それでも非常に便利です。

以下に示すように、Enter と 1 の隣のキーを押しました (これは墓と呼ばれるもので、以下の出力を見てわかりました 😊) ボタン名やキーなどボタンの核となる情報を、押したときと離したときに 1 項目ずつリアルタイムに表示します。

 1➜  ~ wev
 2[07:         wl_seat] name: seat0
 3[07:         wl_seat] capabilities: pointer keyboard
 4[10:    xdg_toplevel] configure: width: 0; height: 0
 5[09:     xdg_surface] configure: serial: 39874
 6[14:     wl_keyboard] keymap: format: 1 (xkb v1), size: 63738
 7[14:     wl_keyboard] repeat_info: rate: 25 keys/sec; delay: 600 ms
 8[14:     wl_keyboard] enter: serial: 39879; surface: 3
 9'                     sym: Return       (65293), utf8: '
10[14:     wl_keyboard] modifiers: serial: 0; group: 0
11                      depressed: 00000000
12                      latched: 00000000
13                      locked: 00000000
14[11:  wl_data_device] data_offer: id: 4278190080
15[4278190080:   wl_data_offer] offer: mime_type: TEXT
16[4278190080:   wl_data_offer] offer: mime_type: text/plain
17[4278190080:   wl_data_offer] offer: mime_type: text/plain;charset=utf-8
18[4278190080:   wl_data_offer] offer: mime_type: STRING
19[4278190080:   wl_data_offer] offer: mime_type: UTF8_STRING
20[11:  wl_data_device] selection: id: 4278190080
21[13:      wl_pointer] enter: serial: 39882; surface: 3, x, y: 197.863281, 79.218750
22[13:      wl_pointer] frame
23[10:    xdg_toplevel] configure: width: 0; height: 0
24                      activated
25[09:     xdg_surface] configure: serial: 39877
26[14:     wl_keyboard] key: serial: 39883; time: 24157739; key: 36; state: 0 (released)
27                      sym: Return       (65293), utf8: ''
28[14:     wl_keyboard] key: serial: 39884; time: 24162044; key: 49; state: 1 (pressed)
29                      sym: grave        (96), utf8: '`'
30[14:     wl_keyboard] key: serial: 39885; time: 24162200; key: 49; state: 0 (released)
31                      sym: grave        (96), utf8: ''
32[14:     wl_keyboard] key: serial: 39886; time: 24172492; key: 36; state: 1 (pressed)
33'                     sym: Return       (65293), utf8: '
34[14:     wl_keyboard] key: serial: 39887; time: 24172621; key: 36; state: 0 (released)
35                      sym: Return       (65293), utf8: ''
36[14:     wl_keyboard] key: serial: 39888; time: 24183338; key: 49; state: 1 (pressed)
37                      sym: grave        (96), utf8: '`'
38[14:     wl_keyboard] key: serial: 39889; time: 24183480; key: 49; state: 0 (released)

2. showkey コマンドを使用する

システムのグラフィカル インターフェイスに入った場合は、以下に示すように sudo showkey を実行する必要があります。99 は印刷キーです。

 1➜  ~ sudo showkey
 2[sudo] password for mephisto:
 3kb mode was ?UNKNOWN?
 4[ if you are trying this under X, it might not work
 5since the X server is also reading /dev/console ]
 6
 7press any key (program terminates 10s after last keypress)...
 8keycode  28 release
 9keycode  99 press
10keycode  99 release
11keycode  99 press
12keycode  99 release
13keycode   1 press
14keycode   1 release

ターミナル環境にいる場合 (「Ctl + Alt + F1-F7」、F1-F7 を押していずれかを選択し、テスト用のターミナル環境に切り替えることができます)、パスワードを入力し、sudo を使用せずに直接実行します。 このとき、キー入力はすべて遮断され、自動的に終了するまで 10 秒しか待つことができませんが、これは今まで経験したことがありません。

つまり、showkey はさまざまな環境に影響されず、キーが物理的に破損しているかどうかを検出できる究極のトリックです。

文字を入力できる場所を見つけて、画面上の文字が正しいかどうか確認すればいいのではないか、と疑問に思う人もいるかもしれません。 これでは「print」などの各種ファンクションキーを検出できません。

私は組み込みエンジニアであり、問 ​​ 題を検出して解決するプログラムを書くことは確かに可能であると言う人もいるでしょう。 しかし、showkey は長い間存在しており、それを使用するのに時間を無駄にすることはありません。

要約すると、単純なキーボード検出には xev と wev を使用し、特殊な場合には showkey を使用します。

最後に、新しいバージョンの labwc によってトリガーされたスクリーンショットは無効です。スクリプト Screenshot.sh が追加されたときに例外が発生すると推定されます。簡単なデバッグ方法はないため、最初にロールバックして解決してください。labwc はバイナリですプログラムを直接置き換えるのは面倒ではありません。

最終更新日: Saturday, October 7, 2023

このシリーズの投稿:

翻訳: