X11

無法使用 shift 鍵輸入大寫字母

  • September 7, 2016

在某些應用程序中,輸入大寫字母就像按 ESC 鍵一樣。

複製:

  • 打開 LibreOffice 文件
  • 選擇“另存為”(Unity 對話框)
  • 點擊“創建文件夾”
  • 使用 shift 鍵輸入大寫字母(例如 Shift+A)

此時,新文件夾的創建被取消。(如 ESC 鍵被按下)

這種行為也存在於許多不同的程序和遊戲中。

使用xev(Hitting Shift+d)分析情況

# xev
KeyPress event, serial 37, synthetic NO, window 0x4c00001,
   root 0x259, subw 0x0, time 994702, (15,-13), root:(987,197),
   state 0x10, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
   XLookupString gives 0 bytes: 
   XmbLookupString gives 0 bytes: 
   XFilterEvent returns: False

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

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

KeymapNotify event, serial 37, synthetic NO, window 0x0,
   keys:  89  0   0   0   0   1   4   0   0   0   0   0   0   0   0   0   
          0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

KeyPress event, serial 37, synthetic NO, window 0x4c00001,
   root 0x259, subw 0x0, time 994927, (15,-13), root:(987,197),
   state 0x11, keycode 40 (keysym 0x44, D), same_screen YES,
   XLookupString gives 1 bytes: (44) "D"
   XmbLookupString gives 1 bytes: (44) "D"
   XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x4c00001,
   root 0x259, subw 0x0, time 995062, (15,-13), root:(987,197),
   state 0x11, keycode 40 (keysym 0x44, D), same_screen YES,
   XLookupString gives 1 bytes: (44) "D"
   XFilterEvent returns: False

KeyRelease event, serial 37, synthetic NO, window 0x4c00001,
   root 0x259, subw 0x0, time 995395, (15,-13), root:(987,197),
   state 0x11, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
   XLookupString gives 0 bytes: 
   XFilterEvent returns: False

我認為,FocusOutFocusIn事件看起來可疑。

Linux:Ubuntu 14.04 LTS 32 位,Unity

如何修復我的系統?歡迎任何想法或進一步測試!

編輯:解決方案

我曾經將語言切換配置為 LeftShift+RightShift。這工作了多年,但在某些時候成為問題。無論如何,將開關配置為任何其他組合鍵都可以解決問題。

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

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

當您按下A並按住時發生Shift的是被動抓取:有一個 X 客戶端對此組合鍵具有獨占控制權,當按下組合鍵時,事件僅路由到該客戶端,而不是xev其他任何人。xev確實報告客戶端在它發生時抓住組合鍵並在它結束時取消抓住它。

用外行的話來說,有一個程序將Shift+定義A為全域鍵綁定。這可能是一個錯字,你打算綁定Shift++或Alt++的東西。key``Win``Shift``A

命令行上操縱 X 鍵和指針抓取中,我詢問瞭如何找到抓取器是誰。我發現的最好方法只報告主動抓取,因此在查詢資訊時必須關閉密鑰。

  1. 如果您還沒有xdotool ,請安裝它。
  2. 執行sleep 1; xdotool key XF86LogGrabInfo
  3. 在一秒鐘內,按住Shift+ A。保持直到xdotool執行。
  4. 在 X 伺服器日誌中查找有關抓取的資訊。X server 日誌的典型位置是/var/log/Xorg.0.log0反映顯示的數字,即$DISPLAY:if $DISPLAYis :1or :1.0then look at/var/log/Xorg.1.log等中的數字)。

下面是一些範例輸出,顯示我按下的鍵是由鋸魚定義的鍵綁定:

[2292688.331] Active grab 0x41602244 (core) on device 'Virtual core keyboard' (3):
[2292688.331]       client pid 6745 sawfish 
[2292688.331]       at 2292687547 (from passive grab) (device thawed, state 3)
[2292688.331]         core event mask 0x3
[2292688.331]       passive grab type 2, detail 0x4e, activating key 78
[2292688.331]       owner-events false, kb 0 ptr 0, confine 0, cursor 0x0
[2292688.331] (II) End list of active device grabs

引用自:https://unix.stackexchange.com/questions/219728