轉(zhuǎn)換遙控器的esc鍵為backspace鍵

本文為《PVE安裝Kodi》系列文章的一部分。

本文同步發(fā)表在我的個人博客https://evine.win。

前言

在上文 《像使用盒子/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鍵也是個不錯的辦法,所以就有了另外第二種辦法,流程如下。

流程

  1. 測試遙控器的返回鍵到底是個什么按鍵,不出意外,出現(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鍵。

  2. 先確認/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
    
  3. 然后重啟在《像使用盒子/LibreELEC一樣使用PVE直裝的Kodi,實現(xiàn)遙控器啟停》中創(chuàng)建的服務(wù)/etc/systemd/system/evsieve.service

    systemctl daemon-reload
    systemctl restart evsieve.service
    
  4. 確認服務(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.
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容