web-dev-qa-db-ja.com

キーボードショートカットが断続的に機能しなくなる

編集:答えからわかるように、これは実際にはスタンバイまたは休止状態とは関係がありませんでしたが、むしろ、行く前にアプリのウィンドウを閉じて(バグを引き起こした)私と相関していましたほとんどの場合、スタンバイ状態になります。

ネット上のさまざまな場所でこれを報告する複数の人を見たことがありますが、解決策はありませんが、いずれにせよ私のものを追加すると思いました。

多くの場合、しばらくしてから(スタンバイになったとき)コンピューターに戻った後、一部のショートカットが機能しなくなったことに気付きました。これは端末だけでなく、Chrome(Ctrl-L、Ctrl-R、F5がすべて動作しなくなる)でも発生します )。また、すべてのctrl-shortcutsに影響するわけではありません。たとえば、Ctrl-Cはまだ機能しています(ありがとう!)。

これをデバッグする方法はありますか?以前にxevを試してみてもどこにも行きませんでしたが、キープレスがプログラムに届かない原因を見つける方法はあるのでしょうか。

編集:Ctrl-Rで奇妙なことが起こっているのを見ることができます

何かがキーボードショートカットをつかんでいます!

xevからキャプチャされた出力

KeyPress event, serial 37, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 24547557, (-130,529), root:(0,633),
    state 0x10, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

FocusOut event, serial 37, synthetic NO, window 0x5200001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 37, synthetic NO, window 0x5200001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 37, synthetic NO, window 0x0,
    keys:  4294967278 0   0   0   0   0   0   0   0   0   0   0   0   2   0   0   
           0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

KeyRelease event, serial 37, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 24548550, (-130,529), root:(0,633),
    state 0x14, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Ctrl-Cと比較してください

ここで発生している4つの論理イベントを簡単に確認できます

KeyPress event, serial 37, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 24724066, (572,852), root:(702,956),
    state 0x10, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 37, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 24724818, (572,852), root:(702,956),
    state 0x14, keycode 54 (keysym 0x63, c), same_screen YES,
    XLookupString gives 1 bytes: (03) ""
    XmbLookupString gives 1 bytes: (03) ""
    XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 24724966, (572,852), root:(702,956),
    state 0x14, keycode 54 (keysym 0x63, c), same_screen YES,
    XLookupString gives 1 bytes: (03) ""
    XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 24725339, (572,852), root:(702,956),
    state 0x14, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
3
oligofren

Caprine Messengerアプリ !これは、 ショートカットライブラリのバグ が修正されるまで、Electronフレームワーク(Spotify、Atom、VS Code)で作成された他の多くのアプリケーションでも発生する可能性があります。

私は今、一貫してバグを再現する方法を知っています electron issue trackerのバグレポートを読んだ後 :アプリを閉じて、システムトレイに常駐するようにします。しかし、そこに着く前に、ショートカットを捕らえているのはCaprineであり、それを殺すことで問題が解決したという決定的な証拠を見つけることができました。これは私が見つけた方法です(同様の状況に使用できます):

これの重複した質問に対するやや不透明な回答 は、魔法のキーストロークを発行することで、どのアプリがキーを取得しているかを検出できることを説明しました。最初は、それを設定する方法をまったく理解できませんでしたが、特別なキーマッピング設定をセットアップするためにあらゆる種類のフープ(Xorg設定をいじり、vtyスイッチングを無効にする、++)を実行する必要があると思いました実際には、これらのキーの組み合わせをプログラムでトリガーする方法も説明されています。

したがって、2つのターミナルウィンドウを開くだけで済みました。最初のターミナルウィンドウで、Xorgシステムのイベントのログを開始しました。

tail -f /var/log/Xorg.0.log > out.txt

別のウィンドウで、Xorgシステムにキーの組み合わせを発行するイベントをトリガーしました。

KEY="ctrl+r"                  # the combination that was "grabbed"
xdotool keydown ${KEY};       # start pressing the key combo
xdotool key XF86LogGrabInfo;  # the keysym that when emitted asks X to print info on the grabber of the current keys
xdotool keyup ${KEY}          # stop pressing the key combo

これを行う プログラムで 指タコのように手動で行うよりもはるかに簡単でした:-)別のウィンドウ(13'000行!)でキャプチャされたイベントログでは、興味深い部分が最初の数行:

[ 24264.517]     detail 71 (mask 0), modifiersDetail 128 (mask 0)
[ 24264.517]     device 'Virtual core keyboard' (3), modifierDevice 'Virtual core keyboard' (3)
[ 24264.517]     core event mask 0x3
[ 24264.517]     owner-events false, kb 1 ptr 1, confine 0x0, cursor 0x0
[ 24264.517]   Printing all registered grabs of client pid 5643 /opt/Caprine/caprine --type=gpu-process --no-sandbox --supports-dual-gpus=false --gpu-driver-bug-workarounds=1,7,23,59,71 --gpu-vendor-id=0x8086 --gpu-device-id=0x5916 --gpu-driver-vendor --gpu-driver-version --gpu-driver-date --service-request-channel-token=B68A5099B5760C39675F51019B3D4F7A --v8-natives-passed-by-fd --v8-snapshot-passed-by-f 
[ 24264.517]   Printing all registered grabs of client pid 5643 /opt/Caprine/caprine --type=gpu-process --no-sandbox --supports-dual-gpus=false --gpu-driver-bug-workarounds=1,7,23,59,71 --gpu-vendor-id=0x8086 --gpu-device-id=0x5916 --gpu-driver-vendor --gpu-driver-version --gpu-driver-date --service-request-channel-token=B68A5099B5760C39675F51019B3D4F7A --v8-natives-passed-by-fd --v8-snapshot-passed-by-f 
[ 24264.517]   Printing all registered grabs of client pid 5684 /usr/lib/slack/slack --disable-gp 
[ 24264.517]   Printing all registered grabs of client pid 5684 /usr/lib/slack/slack --disable-gp 
[ 24264.517]   Printing all registered grabs of client pid 18336 xdotool key XF86LogGrabInfo
[ 24264.517] End list of registered passive grabs
[ 24308.177] (II) Printing all currently active device grabs:
[ 24308.177] Active grab 0x44800160 (core) on device 'Virtual core keyboard' (3):
[ 24308.177]       client pid 5614 /opt/Caprine/caprine 
[ 24308.177]       at 24308139 (from passive grab) (device thawed, state 1)
[ 24308.177]         core event mask 0x3
[ 24308.177]       passive grab type 2, detail 0x1b, activating key 27
[ 24308.177]       owner-events false, kb 1 ptr 1, confine 0, cursor 0x0
[ 24308.177] (II) End list of active device grabs

Caprineを殺した後、最終的に端末でCtrl-Rを再び使用して、履歴の逆検索を行い、Chromeを更新することができました! xevは、質問で説明したものとはまったく異なるものも出力しますが、現在はCtrl-Lの出力と非常によく似ています。

KeyPress event, serial 39, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 25356738, (917,877), root:(1047,981),
    state 0x10, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 39, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 25357181, (917,877), root:(1047,981),
    state 0x14, keycode 27 (keysym 0x72, r), same_screen YES,
    XLookupString gives 1 bytes: (12) ""
    XmbLookupString gives 1 bytes: (12) ""
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 25357315, (917,877), root:(1047,981),
    state 0x14, keycode 27 (keysym 0x72, r), same_screen YES,
    XLookupString gives 1 bytes: (12) ""
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x5200001,
    root 0xee, subw 0x0, time 25357710, (917,877), root:(1047,981),
    state 0x14, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

編集:判明 バグは既知

バグの問題は、これを一貫して再現する(最小化する)方法も示しています。 electron-localshortcut ライブラリのバグが原因でした。


これらのショートカットをプログラムで簡単に送信するために small util を作成しました。

4
oligofren