python xlib で keydown と keyup イベントをキャッチしたいのですが、いくつかのキーを同時に押すと keyup イベントが消えてしまいます。
2 つ以上のキーが同時に離された場合、2 つ以上のキープレス イベントが発生しますが、キーリリース イベントは 1 つだけです。
これを行うには、キーを同時に離す必要さえありません。たとえば、次のシーケンスをすばやく入力する場合です。
- Aを押します
- Bを押す
- リリースA
- リリース B
Aのキーリリースは1つだけになります
- Aを押します
- Bを押す
- リリース B
- リリースA
2つのキーリリースが得られます
from Xlib import X,XK
from Xlib.display import Display
import signal,sys
root = None
display = None
def grab_keyname(n):
global root
keysym = XK.string_to_keysym(n)
keycode = display.keysym_to_keycode(keysym)
root.grab_key(keycode, X.AnyModifier, False,X.GrabModeSync, X.GrabModeAsync)
def main():
# current display
global display,root
display = Display()
root = display.screen().root
root.change_attributes(event_mask = X.KeyPressMask|X.KeyReleaseMask)
grab_keyname("j")
grab_keyname("k")
grab_keyname("l")
signal.signal(signal.SIGALRM, lambda a,b:sys.exit(1))
signal.alarm(4)
while True:
event = display.next_event()
print event.type
main()