|
#!/usr/bin/python |
|
from Xlib.display import Display |
|
from Xlib import X |
|
from Xlib.ext import record |
|
from Xlib.protocol import rq |
|
import shlex |
|
from subprocess import Popen, PIPE, call |
|
from time import sleep |
|
import re |
|
|
|
disp = None |
|
hotkey_id = 96 |
|
path_to_expect = "/home/i/lol.expect" |
|
usb_ids = "046d:c066" |
|
usb_name = "G9x Laser Mouse" |
|
|
|
def get_exitcode_stdout_stderr(args): |
|
""" |
|
Device 0.2, Port 2, Speed 12 Mb/s, Product G9x Laser Mouse |
|
Execute the external command and get its exitcode, stdout and stderr. |
|
args = shlex.split(cmd) |
|
""" |
|
|
|
proc = Popen(args, stdout=PIPE, stderr=PIPE) |
|
out, err = proc.communicate() |
|
exitcode = proc.returncode |
|
# |
|
return exitcode, out, err |
|
|
|
|
|
def handler(reply): |
|
global hotkey_id, path_to_expect, usb_name, usb_ids |
|
""" This function is called when a xlib event is fired """ |
|
data = reply.data |
|
while len(data): |
|
event, data = rq.EventField(None).parse_binary_value(data, disp.display, None, None) |
|
|
|
if event.type == X.KeyPress and event.detail == hotkey_id: |
|
_, out, _ = get_exitcode_stdout_stderr([path_to_expect, "info usb"]) |
|
print out |
|
if usb_name in out: |
|
print "F12 pressed - unlock mouse" |
|
m = re.search('.+Device ([0-9\.]+), Port [0-9\.]+, Speed [0-9\.]+ Mb/s, Product ' + usb_name + '.+', out) |
|
if m: |
|
found = m.group(1) |
|
get_exitcode_stdout_stderr([path_to_expect, "usb_del " + found]) |
|
print "SUCCESS - ID found!" |
|
else: |
|
print "FAIL - ID not found!" |
|
else: |
|
print "F12 pressed - lock mouse" |
|
get_exitcode_stdout_stderr([path_to_expect, "usb_add host:" + usb_ids]) |
|
|
|
|
|
call(["setxkbmap", "us"]) |
|
# get current display |
|
disp = Display() |
|
root = disp.screen().root |
|
|
|
# Monitor keypress and button press |
|
ctx = disp.record_create_context( |
|
0, |
|
[record.AllClients], |
|
[{ |
|
'core_requests': (0, 0), |
|
'core_replies': (0, 0), |
|
'ext_requests': (0, 0, 0, 0), |
|
'ext_replies': (0, 0, 0, 0), |
|
'delivered_events': (0, 0), |
|
'device_events': (X.KeyReleaseMask, X.ButtonReleaseMask), |
|
'errors': (0, 0), |
|
'client_started': False, |
|
'client_died': False, |
|
}]) |
|
disp.record_enable_context(ctx, handler) |
|
disp.record_free_context(ctx) |
|
|
|
while 1: |
|
# Infinite wait, doesn't do anything as no events are grabbed |
|
event = root.display.next_event() |