前言
由于博主买了一个poker 2放置在笔记本键盘上正好,但是如果两个键盘共存,则会严重影响使用,于是博主就想,能否在插入外置键盘时,屏蔽笔记本本身的键盘,于是便上网查了一下对于外置设备搜索和禁用的命令,编写了Python脚本,实现了这个功能。
shell命令
主要用到的几个命令有以下几个
xinput list
xinput float
xinput reattach
xinput list 主要用来查看本电脑所用到的外接设备
从中我们可以看到我使用了两个键盘,一个是本地的 2 keyboard,一个是poker,而且 AT Translated键盘已经被禁用了。
xinput float是用来禁用设备的,在命令行输入xinput float [设备名称] 就可以禁用设备了,同时,xinput reattach是重新使用设备,与float功能相反。
代码思路
用xinput list命令查看当前是否存在外置键盘,如果存在则将内置键盘float起来,如果不存在,则将内置键盘reattach起来就可以了。该命令要重复不断执行,则可以使用一个进程进行维护,可以用sleep函数间隙性扫描。
代码实现
是用Python实现这个功能的,代码如下
#!/usr/bin/python
__author__ = 'xnzone'
import re
import subprocess
import time
import signal
kbid = re.compile('(?<=id=)\d+', re.I)
masterid = re.compile('\d+(?=\)\])', re.I)
KB_ID = -1
MASTER_ID = -1
def signal_handler(signal, frame):
subprocess.getoutput('xinput reattach ' + str(KB_ID) + ' ' + str(MASTER_ID))
exit()
signal.signal(signal.SIGINT, signal_handler)
def getStatus():
global KB_ID, MASTER_ID
output_master = subprocess.getoutput('xinput list|grep "AT Translated"')
output_ikb = subprocess.getoutput('xinput list|grep "Technology Poker"|tail -n1')
masterOk = re.match('.*slave keyboard.*', output_master) is not None
masterDis = re.match('.*floating slave.*', output_master) is not None
ikbOK = re.match('.*slave keyboard.*', output_ikb) is not None
ikbNo = len(output_ikb) == 0
if masterOk and ikbOK:
s = re.search(kbid_pattern, output_in)KB_ID = s.group(0)
s = re.search(masterid_pattern, output_in)
MASTER_ID = s.group(0)
print('xinput float ' + str(KB_ID))
subprocess.getoutput('xinput float ' + str(KB_ID))
return 1
elif masterOk and ikbNo:
return 0
elif masterDis and ikbOK:
return 2
elif masterDis and ikbNo:
print('xinput reattach ' + str(KB_ID) + ' ' + str(MASTER_ID))
subprocess.getoutput('xinput reattach ' + str(KB_ID) + ' ' + str(MASTER_ID))
return 3
if __name__ == '__main__':
while True:
status = getStatus()
time.sleep(2)