本文為《PVE安裝Kodi》系列文章的一部分。
本文同步發(fā)表在我的個人博客https://evine.win。
- PVE 直接安裝最新版 Kodi
- 為Kodi適配遙控器
- 修改Kodi字幕字體
- 修改Kodi皮膚字體
- 屏蔽Kodi的關(guān)機、重啟按鈕
- 設(shè)置Kodi啟動的前置條件
- 像使用盒子/LibreELEC一樣使用PVE直裝的Kodi,實現(xiàn)遙控器啟停
- kodi-send使用相關(guān)說明
- 轉(zhuǎn)換遙控器的esc鍵為backspace鍵
前言
在上文 《像使用盒子/LibreELEC一樣使用PVE直裝的Kodi,實現(xiàn)遙控器啟停》 中,我們把2.4G無線遙控器的電源鍵支持并轉(zhuǎn)換為開關(guān)Kodi了。不過,有些2.4G無線遙控器的返回鍵不是退格鍵(backspace鍵),而是退出鍵(esc鍵),導(dǎo)致短按它的效果是直接退出到上一級菜單(PreviousMenu),而不是返回到上一個界面(Back)。這種情況在點的界面比較深的時候會比較明顯,一點返回結(jié)果返回了很遠。如果不習(xí)慣這樣的操作方式,那么我們可以轉(zhuǎn)換按鍵。
說明
看到本篇教程這里,我默認你已經(jīng)按照《PVE 直接安裝最新版 Kodi》《像使用盒子/LibreELEC一樣使用PVE直裝的Kodi,實現(xiàn)遙控器啟停》《kodi-send使用相關(guān)說明》這三篇教程安裝好了必備的軟件包,編輯好了必備的腳本,相關(guān)的安裝過程就不再贅述了,直接進入正題。
2.4G無線遙控器一般被Linux系統(tǒng)識別為鍵盤設(shè)備,所以這種遙控器的按鍵實際上就是普通鍵盤上的常規(guī)按鍵,它的按鍵的作用是通過/usr/share/kodi/system/keymaps/keyboard.xml來處理的(在未被Keymap Editor映射的前提下)。打開該xml文件內(nèi)容可知(見下),大部分界面中長按esc鍵的效果等同于短按backspace鍵(然而似乎遙控器并不支持長按...普通鍵盤才支持...),如果你習(xí)慣短按是PreviousMenu,也可以不再往下看了。不過對我來說,短按Back才更符合我的習(xí)慣,所以我需要將這個遙控器的esc鍵轉(zhuǎn)換為backspace鍵。
<keymap>
<global>
<keyboard>
...
<backspace>Back</backspace>
...
<escape>PreviousMenu</escape>
<escape mod="longpress">Back</escape>
...
</keyboard>
...
</global>
...
</keymap>
轉(zhuǎn)換按鍵有很多方式,一種使用Kodi本身支持的特性,新建~/.kodi/userdata/keymaps/my_remap.xml(文件名可以自己定義,詳見Keymaps,~/.kodi/userdata/keymaps下的xml覆蓋/usr/share/kodi/keymaps下的,同文件夾下的文件名字母序靠后的覆蓋靠前的),內(nèi)容可以形如下面這種:
<keymap>
<global>
<keyboard>
<escape>Back</escape>
<escape mod="longpress">PreviousMenu</escape>
</keyboard>
</global>
</keymap>
上面的示例就是把短按esc和長按esc的作用交換了一下(盡管遙控器可能并不支持長按)。雖然上述配置并未列全,但基本上可以應(yīng)付大部分情況了,你也可以自行參考/usr/share/kodi/system/keymaps/keyboard.xml中的escape所在的全部模塊進行自定義覆蓋。
既然我已經(jīng)在使用evsieve來脅持電源鍵了,那么再用它來脅持esc鍵也是個不錯的辦法,所以就有了另外第二種辦法,流程如下。
流程
-
測試遙控器的返回鍵到底是個什么按鍵,不出意外,出現(xiàn)一點返回結(jié)果返回了很遠的一個界面這種情況下,返回鍵應(yīng)該就是
esc鍵。注:在測試前請先退出Kodi,保證畫面處于控制臺界面。# 運行evtest evtest --grab # evtest會列出所有可用的輸入設(shè)備,可以看到我的遙控器有event5-event8共4個設(shè)備 # 你可以選擇具體的編號來進行測試,找到每個設(shè)備分別能控制哪些按鍵 # 經(jīng)過測試,我發(fā)現(xiàn)我遙控器的返回鍵在event5,也就是2.4G Composite Devic這個設(shè)備 No device specified, trying to scan all of /dev/input/event* Available devices: /dev/input/event0: Power Button /dev/input/event1: AT Translated Set 2 keyboard /dev/input/event2: VirtualPS/2 VMware VMMouse /dev/input/event3: VirtualPS/2 VMware VMMouse /dev/input/event4: QEMU QEMU USB Tablet /dev/input/event5: 2.4G Composite Devic /dev/input/event6: 2.4G Composite Devic Mouse /dev/input/event7: 2.4G Composite Devic Consumer Control /dev/input/event8: 2.4G Composite Devic System Control /dev/input/event9: PC Speaker Select the device event number [0-9]:5 # 反饋鍵一般在遙控器名稱最短的那個設(shè)備上,也就是2.4G Composite Devic,你也可以把多次測試一個一個試出來 Input driver version is 1.0.1 Input device ID: bus 0x3 vendor 0x276d product 0x1101 version 0x111 Input device name: "2.4G Composite Devic" Supported events: Event type 0 (EV_SYN) Event type 1 (EV_KEY) Event code 1 (KEY_ESC) Event code 2 (KEY_1) Event code 3 (KEY_2) Event code 4 (KEY_3) Event code 5 (KEY_4) Event code 6 (KEY_5) ... ## 中間太長了,略去 Properties: Testing ... (interrupt to exit) ## 按下返回鍵,有反應(yīng)說明設(shè)備選擇對了,無反應(yīng)說明返回鍵不在這個設(shè)備上 Event: time 1691294047.183861, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70029 Event: time 1691294047.183861, type 1 (EV_KEY), code 1 (KEY_ESC), value 1 Event: time 1691294047.183861, -------------- SYN_REPORT ------------ Event: time 1691294047.255862, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70029 Event: time 1691294047.255862, type 1 (EV_KEY), code 1 (KEY_ESC), value 0 Event: time 1691294047.255862, -------------- SYN_REPORT ------------ ## Ctrl+C退出由上述輸出內(nèi)容可知,這款遙控器的返回鍵是
esc鍵,而另外一些遙控器的返回鍵是backspace鍵,這才是返回上一層而非退出的按鍵。所以我們接下來把這個遙控器的esc鍵轉(zhuǎn)換為backspace鍵。 -
先確認
/dev/input/by-id下已經(jīng)有/dev/input/event5(對我而言,event5就是我的2.4G Composite Devic這個遙控器設(shè)備)的軟連接。一般udev程序識別這個設(shè)備沒有問題,不再需要自己編輯相應(yīng)的udev規(guī)則;然后修改在《像使用盒子/LibreELEC一樣使用PVE直裝的Kodi,實現(xiàn)遙控器啟停》中創(chuàng)建的腳本/usr/local/bin/run-evsieve.sh如下,并注意按照注釋修改為自己的信息。#!/usr/bin/env bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ## 要劫持的目標設(shè)備的絕對路徑,請注意修改成自己的 ## 不要直接寫/dev/input/eventX,而要寫/dev/input/by-id下的設(shè)備 ## target_hijack_input_device1是返回鍵(esc鍵)所在的設(shè)備 ## target_hijack_input_device2是電源鍵(power鍵)所在的設(shè)備 target_hijack_input_device1="/dev/input/by-id/usb-0627_2.4G_Composite_Devic-event-kbd" target_hijack_input_device2="/dev/input/by-id/usb-0627_2.4G_Composite_Devic-System-Control" ## 要脅持的按鍵的鍵名,應(yīng)該分別就是esc和power了,大概率不用改 ## target_hijack_button1就是target_hijack_input_device1上的esc鍵 ## target_hijack_button2就是target_hijack_input_device2上的power鍵 target_hijack_button1="esc" target_hijack_button2="power" ###### 以下無需修改 ###### ## 先檢測 target_hijack_input_device1 和 target_hijack_input_device2 是否已經(jīng)存在 while :; do if [[ -L "$target_hijack_input_device1" && -L "$target_hijack_input_device2" ]]; then break else echo "The '$target_hijack_input_device1' or '$target_hijack_input_device2' is not inserted, wait 2 seconds..." sleep 2 fi done ## 執(zhí)行按鍵脅持,詳細用法請見:https://github.com/KarsMulder/evsieve ## 當按下退出鍵時,轉(zhuǎn)換為返回鍵 ## 當按下電源鍵時,轉(zhuǎn)換為運行腳本/usr/local/bin/kodi-power.sh exec evsieve \ --input "$target_hijack_input_device1" grab persist=reopen \ --map key:$target_hijack_button1 key:backspace \ --output \ --input "$target_hijack_input_device2" grab persist=reopen \ --hook key:$target_hijack_button2 exec-shell="/usr/local/bin/kodi-power.sh" \ --block key:$target_hijack_button2 -
然后重啟在《像使用盒子/LibreELEC一樣使用PVE直裝的Kodi,實現(xiàn)遙控器啟停》中創(chuàng)建的服務(wù)
/etc/systemd/system/evsieve.service。systemctl daemon-reload systemctl restart evsieve.service -
確認服務(wù)正常運行起來了,然后你就可以用遙控器打開Kodi并測試退出鍵是否轉(zhuǎn)換為返回鍵了。
## 查看狀態(tài) systemctl status evsieve.service ## 如下輸出內(nèi)容像下面這樣,就表示脅持好了 ● evsieve.service - Run Evsieve Loaded: loaded (/etc/systemd/system/evsieve.service; enabled; preset: enabled) Active: active (running) since Sun 2023-08-06 12:05:36 CST; 1h 20min ago Main PID: 3612370 (evsieve) Tasks: 2 (limit: 75726) Memory: 1.3M CPU: 317ms CGroup: /system.slice/evsieve.service └─3612370 evsieve --input /dev/input/by-id/usb-0627_2.4G_Composite_Devic-event-kbd grab persist=reopen --map key:esc key:backspace --output --input /dev/input/by-id/usb-0627_2.4G_Composite_Devic-System-Control grab persist=reopen --hook key:power exec-shell=/usr/local/bin/kodi-power.sh --block key:power 8月 06 12:05:36 pve systemd[1]: Started evsieve.service - Run Evsieve.