Linux-Mint

有沒有辦法禁用筆記型電腦鍵盤上的飛行模式按鈕?

  • August 28, 2021

前段時間我給媽媽買了一台筆記型電腦,鍵盤佈局很*糟糕。*作業系統是 Linux Mint 18.2 Cinnamon 64 位。

F1問題是,她沒有-鍵,而是F12有不同的多媒體按鈕,更重要的是飛行模式按鈕。-鍵可以通過訪問F1F12``Fn

因為我們有很多寵物,它們經常跳到鍵盤上,按下包括飛行模式按鈕在內的多個按鈕,從而使她與網際網路斷開連接,這是她最近抱怨的。

在 BIOS 中,我看不到切換到正常鍵盤佈局的方法。所以,給你的問題是:

有沒有辦法禁用筆記型電腦鍵盤上的飛行模式按鈕?

編輯1:

將寵物拒之門外是不可能的,因為它們是我們家庭不可分割的一部分。

當然,當媽媽不在電腦前時,她會合上蓋子。但是當她在筆記型電腦旁時,他們會跳到筆記型電腦上。從這個意義上說,貓可能是真正的痛苦:)

編輯2:

當飛行模式關閉,即無線開啟時,執行以下命令:

rfkill list all

輸出:

0: ideapad_wlan: Wireless LAN
   Soft blocked: no
   Hard blocked: no
1: ideapad_bluetooth: Bluetooth
   Soft blocked: yes
   Hard blocked: no
2: hci0: Bluetooth
   Soft blocked: yes
   Hard blocked: no
3: phy0: Wireless LAN
   Soft blocked: no
   Hard blocked: no

編輯3:

一旦按下 Airplane 按鈕,無線就會根據之前的命令被封鎖Soft

編輯4:

acpi_listen

按下按鈕時,輸出:

button/wlan WLAN 00000080 00000000 K 

編輯5:

sudo evtest

輸出:

No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:    Lid Switch
/dev/input/event1:    Power Button
/dev/input/event2:    Power Button
/dev/input/event3:    AT Translated Set 2 keyboard
/dev/input/event4:    MOSART Semi. 2.4G Wireless Mouse
/dev/input/event5:    Video Bus
/dev/input/event6:    Video Bus
/dev/input/event7:    ETPS/2 Elantech Touchpad
/dev/input/event8:    Ideapad extra buttons
/dev/input/event9:    Lenovo EasyCamera
/dev/input/event10:    HDA Intel PCH Mic
/dev/input/event11:    HDA Intel PCH Headphone
/dev/input/event12:    HDA Intel HDMI HDMI/DP,pcm=3
/dev/input/event13:    HDA Intel HDMI HDMI/DP,pcm=7
/dev/input/event14:    HDA Intel HDMI HDMI/DP,pcm=8 
Select the device event number [0-14]: 8
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x0 product 0x0 version 0x0
Input device name: "Ideapad extra buttons"
Supported events:
 Event type 0 (EV_SYN)
 Event type 1 (EV_KEY)
   Event code 1 (KEY_ESC)
   Event code 148 (KEY_PROG1)
   Event code 149 (KEY_PROG2)
   Event code 186 (KEY_F16)
   Event code 192 (KEY_F22)
   Event code 193 (KEY_F23)
   Event code 202 (KEY_PROG3)
   Event code 203 (KEY_PROG4)
   Event code 212 (KEY_CAMERA)
   Event code 227 (KEY_SWITCHVIDEOMODE)
   Event code 238 (KEY_WLAN)
   Event code 240 (KEY_UNKNOWN)
   Event code 248 (KEY_MICMUTE)
 Event type 4 (EV_MSC)
   Event code 4 (MSC_SCAN)
Properties:
Testing ... (interrupt to exit)
Event: time 1508927031.158643, type 4 (EV_MSC), code 4 (MSC_SCAN), value 0d
Event: time 1508927031.158643, type 1 (EV_KEY), code 238 (KEY_WLAN), value 1
Event: time 1508927031.158643, -------------- SYN_REPORT ------------
Event: time 1508927031.158680, type 1 (EV_KEY), code 238 (KEY_WLAN), value 0
Event: time 1508927031.158680, -------------- SYN_REPORT ------------

我沒有確切的硬體,但我試圖在我的系統中找到一個“類似案例”:

  • 一個是電源按鈕。目標是輸入一個鍵(例如鍵“4”)而不是電源。(對我來說,它位於 /dev/input/event2 並發出一個

root# evtest /dev/input/event2

事件:時間 1509218410.222521,類型 1(EV_KEY),程式碼 116(KEY_POWER),值 1

事件:時間 1509218410.222521,————– SYN_REPORT – ———-

事件:時間 1509218410.222552,類型 1(EV_KEY),程式碼 116(KEY_POWER),值 0

事件:時間 1509218410.222552,————– SYN_REPORT - ————

  • 另一個是(這也是我對soo很感興趣的原因):我也有一個WIFI按鈕,但是“什麼都不做”。雖然我了解輸入事件,但我想糾正這個 - 好玩。這裡的目標是做某事。

此 Fn+F3 發出(從普通鍵盤輸入設備)

root# evtest /dev/input/event3

Event: time 1509218870.384483, type 4 (EV_MSC), code 4 (MSC_SCAN), value 86

Event: time 1509218870.384483, ————– SYN_REPORT – ———-

這個 Fn+F3 最初在 syslog 中給出了警告行

核心:

$$ 44802.485207 $$atkbd serio0:釋放未知密鑰(翻譯集 2,isa0060/serio0 上的程式碼 0x86)。

核心:$$ 44802.485210 $$atkbd serio0: 使用 ‘setkeycodes e006 ’ 讓它知道。

到目前為止我做了什麼:

  • 執行許多系列的 setkeycodes和“現實生活”

evdev沒有看到任何變化,但是setkeycodes e006 5syslogsetkeycodes 86 5條目已經消失了。

  • 在 /etc/udev/hwdb 中創建了類似的 hwdb 文件 - 這也消除了系統日誌消息 - 但沒有別的:

evdev:atkbd:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*

KEYBOARD_KEY_86=5

  • 在 /etc/udev/rules.d 中創建 udev 規則(並使其生效)

它執行(因為我看到“電源按鈕 INHIBIT 字元串”並看到所有修改的標籤),我可以更改任何屬性(主要用於電源按鈕)

這是我的規則文件:

ACTION!=“add|change”, GOTO=“pwr_kbd_end”

SUBSYSTEM!=“input”, GOTO=“pwr_kbd_end”

KERNEL!=“event

$$ 0-9 $$*”, GOTO=“pwr_kbd_end”

ENV{ID_PATH_TAG}==“acpi-LNXPWRBN_00”, OPTIONS+=“last_rule”, RUN+="/usr/bin/logger -t 電源按鈕 INHIBIT %k", ENV{KEYBOARD_KEY_116}=" KEY_A",\ TAG:=“whatisthis”, ENV{EV_KEY_116}=“KEY_B”, \ ENV{BTN_116}=“KEY_C”,ENV{BTN_POWER}=“KEY_D”, ENV{KEY_POWER}=“KEY_E” LABEL=" pwr_kbd_end"

但是我閱讀並意識到規則是針對“系統更改”的,例如連接或斷開某些東西,修改(例如製作新分區或使用 modechange 3G 加密狗),但它們與實際的關鍵事件處理無關(但是它們可能有影響)。同時OPTIONS+="last_rule"似乎不起作用-我將此文件輸入為 01-myrule.rule 並作為硬連結 98-myrule.rule 輸入-兩者都“工作”。

  • 然後我把我的興趣集中在處理這些事件上:

我複制了一個evtest.pypython 腳本並玩了一下。

我的概念是“攔截 power putton 事件,不要通過並註入另一個事件(例如 KEY_4 - 值 5 - 正如我在之前的測試中所嘗試的那樣)。

這幾乎是完全成功的。(這也可能是您的解決方案)

from __future__ import print_function

import sys
import select

from evdev import ecodes, list_devices, AbsInfo, InputDevice, UInput

def main():
 device = InputDevice("/dev/input/event2") # yours should be checked... NOT necessalirly always event8 
 device.grab()
 ui = UInput()

 print('Listening for events (press ctrl-c to exit) ...')
 fd_to_device = {device.fd: device}

 while True:
   r, w, e = select.select(fd_to_device, [], [])

   for fd in r:
     for event in fd_to_device[fd].read():
       if (event.type == 1) and (event.code==116): # yours is 238
         print_event(event)
         event.code=5
         event.value=1
         ui.write(event.type, event.code, event.value) # just delete/comment this section if you do not wanna do anything
         ui.syn
         event.value=0
         ui.write(event.type, event.code, event.value)
         ui.syn
       else:
         ui.write(event.type, event.code, event.value)
         ui.syn


def print_event(e):
 if e.type == ecodes.EV_SYN:
   if e.code == ecodes.SYN_MT_REPORT:
     msg = 'time {:<16} +++++++++ {} ++++++++'
   else:
     msg = 'time {:<16} --------- {} --------'
   print(msg.format(e.timestamp(), ecodes.SYN[e.code]))
 else:
   if e.type in ecodes.bytype:
     codename = ecodes.bytype[e.type][e.code]
   else:
     codename = '?'

 evfmt = 'time {:<16} type {} ({}), code {:<4} ({}), value {}'
 print(evfmt.format(e.timestamp(), e.type, ecodes.EV[e.type], e.code, codename, e.value))


if __name__ == '__main__':
 try:
   ret = main()
 except KeyboardInterrupt:
   ret = 0
 sys.exit(ret)

同樣,無論我是在控制台還是 X 中——當這個腳本執行時,我都會得到一個鍵(目前它是雙倍的)而不是“電源開關”。

  • 我截獲了(但讓它們通過鍵盤事件),當我找到我的神奇 86 程式碼時,我注入了一個 EV_KEY 序列(EV_KEY KEY_4 down, SYN, EV_KEY KEY_4 up, SYN)

然而這是部分成功,因為事件不知何故卡住了互相等待,它們顯示為 4 個(我使用了 python -u wifi.py) - 所以我嘗試不緩衝。這裡沒有加倍:我按 Wifi 按鈕 4 次,我得到 ‘4444’ - 在控制台和 X 中。

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