-
Notifications
You must be signed in to change notification settings - Fork 74
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #72 from dictation-toolbox/action-pynput
Add Key, Text and Paste action support for X11 and Mac OS using pynput
- Loading branch information
Showing
17 changed files
with
931 additions
and
316 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
#!/usr/bin/python | ||
|
||
""" | ||
Script to test the Key and Text action on X11 using the "xev" program. | ||
There should be two lines printed for each key press: a down event and | ||
an up event. Each line will contain the key symbol (e.g. Return). | ||
There will be a small delay per key press for both test actions to help view | ||
the output from "xev" as the keys are pressed. | ||
X11Errors may be logged for keys remapped or not mapped by xkb. | ||
""" | ||
|
||
from __future__ import print_function | ||
|
||
import subprocess | ||
import sys | ||
import threading | ||
import time | ||
|
||
from dragonfly import Key, Text | ||
|
||
XEV_PATH = "/usr/bin/xev" | ||
|
||
|
||
def main(): | ||
# Define keys to type. | ||
keys = [] | ||
alphas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" | ||
digits = "0123456789" | ||
keys.extend(alphas) | ||
keys.extend(digits) | ||
|
||
# Add common symbol characters. Use long names for reserved characters. | ||
symbols = "!@#%^&*()_+`~[]{}|\\;'\".<>?=" | ||
keys.extend(symbols) | ||
keys.extend(["comma", "colon", "minus", "slash", "space"]) | ||
|
||
# Add virtual keys. Some keys are repeated purposefully to maintain key | ||
# state (e.g. caps lock). | ||
keys.extend([ | ||
# Whitespace and editing keys | ||
"enter", "tab", "space", "backspace", "delete", | ||
|
||
# Special keys | ||
"escape", "insert", "insert", "pause", "apps", | ||
|
||
# Lock keys | ||
"scrolllock", "scrolllock", "numlock", "numlock", "capslock", | ||
"capslock", | ||
|
||
# Navigation keys | ||
"up", "down", "left", "right", "pageup", "pagedown", "home", "end", | ||
|
||
# Number pad keys (except npsep) | ||
"npmul", "npadd", "npsub", "npdec", "npdiv", "np0", "np1", | ||
"np2", "np3", "np4", "np5", "np6", "np7", "np8", "np9", | ||
|
||
# Function keys (not including F13-24) | ||
"f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", | ||
"f11", "f12", | ||
|
||
# Multimedia keys (press toggle keys twice) | ||
"volumeup", "volup", "volumedown", "voldown", "volumemute", | ||
"volmute", "tracknext", "trackprev", "playpause", "playpause", | ||
"browserback", "browserforward", | ||
|
||
# Modifiers. | ||
"shift:down", "shift:up", | ||
"ctrl:down", "ctrl:up", | ||
"alt:down", "alt:up", | ||
"rshift:down", "rshift:up", | ||
"rctrl:down", "rctrl:up", | ||
"ralt:down", "ralt:up", | ||
"win:down", "win:up", "win:down", "win:up", | ||
"rwin:down", "rwin:up", "rwin:down", "rwin:up", | ||
|
||
# Some common key combinations. | ||
"s-insert", | ||
"c-left", | ||
"c-home", | ||
"a-f", | ||
"c-a", | ||
]) | ||
|
||
# Define text to type using all alphanumeric characters and valid | ||
# symbols. | ||
text = alphas + digits + symbols + ",:-/ \n\t" | ||
|
||
# Start xev and selectively print lines from it in the background. | ||
# Exit if the command fails. | ||
try: | ||
proc = subprocess.Popen(XEV_PATH, | ||
stdout=subprocess.PIPE, | ||
stderr=subprocess.STDOUT, | ||
stdin=subprocess.PIPE) | ||
def print_key_events(): | ||
for line in iter(proc.stdout.readline, b''): | ||
line = line.decode() | ||
if "keysym" in line: | ||
print(line.strip()) | ||
|
||
t = threading.Thread(target=print_key_events) | ||
t.setDaemon(True) # make this thread terminate with the main thread | ||
t.start() | ||
except Exception as e: | ||
print("Couldn't start xev: %s" % e, file=sys.stderr) | ||
exit(1) | ||
|
||
# Wait a few seconds before beginning. | ||
print("Please ensure xev is focused...") | ||
time.sleep(5) | ||
|
||
print("--------------------Starting Key tests--------------------") | ||
Key("/10,".join(keys)).execute() | ||
print("Done.") | ||
|
||
print("--------------------Starting Text tests-------------------") | ||
Text(text, pause=0.1).execute() | ||
print("Done.") | ||
|
||
print("Stopping xev.") | ||
proc.terminate() | ||
|
||
|
||
if __name__ == '__main__': | ||
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.