前言

由于博主买了一个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)