Fedora

Fedora gnome 鍵盤應用程序的替代方案

  • March 1, 2017

我在 Fedora 25 Gnome 上。我有一個羅技 K350 無線鍵盤。當我在 Xubuntu 和 Manjaro 上時,我可以輕鬆地映射所有鍵。

現在在 Fedora 上,一些鍵無法使用 Fedora 的鍵盤快捷鍵應用程序進行映射,並且當我嘗試映射它們時,一些鍵會執行它們的命令。例如,我的鍵盤上有一個額外的關閉按鈕。在 Fedora 上,它使筆記型電腦進入睡眠狀態,我找不到它來刪除它,如果我嘗試添加快捷方式,如果我按下它,電腦會進入睡眠狀態,而不是向我顯示按鈕的程式碼。

加上鍵盤應用程序滯後。我想知道是否可以用 XFCE 的鍵盤應用程序替換它

在此處輸入圖像描述

我想在頂部和左側映射所有灰色大按鈕。但最重要的是右上角的灰色小按鈕,應該是關機按鈕。

很長時間沒有為此目的使用 Fedora 或 Gnome(或 XFCE)。但是重新映射函式的鍵發生在幾個層上,在我的拙見中,在 WM 層上做這件事很麻煩。擊鍵/程式碼來自核心(來自硬體中的 IRQ 等)到 Xorg,Xorg 將它們全部編號並傳遞回應用程序(是否將它們全部傳遞給應用程序是另一回事)。

Xorg 傳遞密鑰程式碼的應用程序包括 WM(XFCE 或 Gnome 甚至 KDE),以及由這些應用程序打開的視窗。像鍵盤映射桌面應用程序這樣的工具所做的是,它們點擊 Xorg 的鍵碼配置。通過創建新鍵盤 ( setxkbmap) 修改鍵 ( xmodmap) 或什至在將程式碼重新發送到視窗 (IME) 之前在記憶體中重新映射。

如果我們自己使用 Xorg 鍵碼,我們可以為任何系統(即執行 Xorg)配置鍵盤。我將使用自己的鍵盤:

在此處輸入圖像描述

大綱顯示了一個我將用作範例的鍵,即帶有音符的鍵。我們將使該鍵作為向上箭頭工作。

首先讓我們看看 Xorg 是如何看待我的鍵盤的:

$ xinput 
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Optical Mouse                id=10   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
   ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
   ↳ Power Button                              id=6    [slave  keyboard (3)]
   ↳ Video Bus                                 id=7    [slave  keyboard (3)]
   ↳ Power Button                              id=8    [slave  keyboard (3)]
   ↳ Sleep Button                              id=9    [slave  keyboard (3)]
   ↳ USB 2.0 Camera                            id=11   [slave  keyboard (3)]
   ↳ Asus Laptop extra buttons                 id=12   [slave  keyboard (3)]
   ↳ AT Translated Set 2 keyboard              id=13   [slave  keyboard (3)]

好吧,我猜我的鍵(音符)在“華碩筆記型電腦額外按鈕”中。這意味著它在虛擬鍵盤下。很好,這意味著我可以通過xev以下方式找到它的鍵碼:

xev -event keyboard

如果它不是虛擬鍵盤的一部分,我將需要遍歷所有事件(包括滑鼠事件),這將使其難以找到,不是不可能,而是很難。然後我在執行時按下我的音符鍵,xev發現 Xorg 對它的理解如下:

KeyPress event, serial 28, synthetic NO, window 0x1a00001,
   root 0x496, subw 0x0, time 32080036, (381,333), root:(382,352),
   state 0x0, keycode 234 (keysym 0x1008ff32, XF86AudioMedia), same_screen YES,
   XLookupString gives 0 bytes: 
   XmbLookupString gives 0 bytes: 
   XFilterEvent returns: False

很好,這意味著它是鍵碼 234。這也表明它映射到XF86AudioMedia在我的 WM 上什麼都不做(xmonad,因為它忽略了很多 XF86 標準)。但無論如何,我們有一把重新映射的鑰匙。為了做到這一點,我們這樣做:

xmodmap -e 'keycode 234 = Up NoSymbol Up'

我的音符鍵用作向上箭頭。此外,這是獨立於 WM 的。要使其在重新啟動時工作,您需要將xmodmap表達式放入~/.Xmodmap文件中:

keycode 234 = Up NoSymbol Up

並執行

xmodmap ~/.Xmodmap

在 WM 初始化期間。在 XFCE 初始化期間執行哪些文件~/.xprofile, ~/.xinitrc, ~/.profile, 是另一個問題。WM 在執行哪些文件方面特別不標準化。不過,您始終可以手動執行它。

.Xmodmap文件每行包含一個映射,因此可用於重新映射多個鍵。!標記是該文件中的註釋指示符。

這是如何運作的?

首先,讓我們了解為什麼我需要編寫Up NoSymbol Up而不是簡單地編寫Up. 實際上我不需要,但通常為一個鍵提供至少三個(有時是四個)映射。映射意味著當鍵是時要採取的行動:

= <key pressed> <shift+key> <ctrl+key> <ctrl+shift+key>

(請注意,Ctrl+Up這在某些應用程序中效果不佳,這使得這個例子不是那麼好。)

好的,所以我們重新映射了一個鍵。但是如何找到正確的操作來重新映射鍵。箭頭很簡單:上、下、左、右;字母也可以通過添加字母作為參數來簡單地重新映射。XF86AudioMedia但是我們之前的那個東西呢?或者如何使按鍵成為睡眠或電源按鈕?

要獲取您目前的映射,您可以:

xmodmap -pke

它列印一個很長的列表,包括幾個XF86修飾符(例如XF86Sleep, XF86PowerOff, XF86WebCam)。就像我們使用上面的向上箭頭一樣,這些可以添加到任何鍵。完整列表可以在 Xorg原始碼中找到。

不幸的是,就像源中的評論一樣:

X.Org 不會添加到 XF86 鍵符集,儘管它們已被採用並被視為 X 鍵符定義的“標準”部分。XFree86 從未正確註釋過這些鍵符,因此我們已盡力解釋這些鍵的語義含義。

XFree86 已經刪除了他們那個時期的郵件檔案,這可能更清楚地說明了其中的一些定義。直到/除非我們復活這些檔案,這些檔案來自記憶和使用。

可能很難找到其中每一個的確切目的。而且,由於缺乏明確定義的標準,WM 只實現了其中的一些映射。並且不同的WM實現不同的映射。此外,一些 WM 具有這些映射功能的配置工具,而另一些則沒有。一些 WM 幾乎忽略了所有這些映射。

測試您的 WM 是否支持特定映射的一種方法是嘗試一下。例如,我將XF86XK_ToDoList首先嘗試從定義中刪除XK並重新映射未使用的鍵碼:

xmodmap -e 'keycode 248 = XF86_ToDoList'

xdotool用來組成這樣一個鍵碼的按鍵:

xdotool keydown 248
xdotool keyup 248

我的 WM 肯定不支持XF86_ToDoList,因為什麼都沒發生(實際上我認為沒有任何 WM 支持那個)。

然後,您可以搜尋密鑰所需的功能,並在找到該功能後重新映射它們。當然,鑑於 XFCE 支持它。

警告

如果您在不同語言之間更改鍵盤,使用或在後台setxkbmap呼叫的工具,映射將被撤消。setxkbmapIME 很好,因為它們獨立於 Xorg 執行。

登錄時映射工作。您可以創建一個“開機”鍵

測試類似的東西時要小心XF86PowerOff,您可能會無意中強制硬重啟。

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