forked from platypush/platypush
Added keyboard/mouse plugin
This commit is contained in:
parent
dc2b3689a2
commit
9eed1014eb
5 changed files with 170 additions and 0 deletions
5
docs/source/platypush/plugins/inputs.rst
Normal file
5
docs/source/platypush/plugins/inputs.rst
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
``platypush.plugins.inputs``
|
||||||
|
============================
|
||||||
|
|
||||||
|
.. automodule:: platypush.plugins.inputs
|
||||||
|
:members:
|
|
@ -48,6 +48,7 @@ Plugins
|
||||||
platypush/plugins/http.request.rss.rst
|
platypush/plugins/http.request.rss.rst
|
||||||
platypush/plugins/http.webpage.rst
|
platypush/plugins/http.webpage.rst
|
||||||
platypush/plugins/ifttt.rst
|
platypush/plugins/ifttt.rst
|
||||||
|
platypush/plugins/inputs.rst
|
||||||
platypush/plugins/inspect.rst
|
platypush/plugins/inspect.rst
|
||||||
platypush/plugins/kafka.rst
|
platypush/plugins/kafka.rst
|
||||||
platypush/plugins/lastfm.rst
|
platypush/plugins/lastfm.rst
|
||||||
|
|
159
platypush/plugins/inputs.py
Normal file
159
platypush/plugins/inputs.py
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
from platypush.plugins import Plugin, action
|
||||||
|
|
||||||
|
|
||||||
|
class InputsPlugin(Plugin):
|
||||||
|
"""
|
||||||
|
This plugin emulates user input on a keyboard/mouse. It requires the a graphical server (X server or Mac/Win
|
||||||
|
interface) to be running - it won't work in console mode.
|
||||||
|
|
||||||
|
Requires:
|
||||||
|
|
||||||
|
* **pyuserinput** (``pip install pyuserinput``)
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_keyboard():
|
||||||
|
# noinspection PyPackageRequirements
|
||||||
|
from pykeyboard import PyKeyboard
|
||||||
|
return PyKeyboard()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_mouse():
|
||||||
|
# noinspection PyPackageRequirements
|
||||||
|
from pymouse import PyMouse
|
||||||
|
return PyMouse()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _parse_key(cls, key: str):
|
||||||
|
k = cls._get_keyboard()
|
||||||
|
keymap = {
|
||||||
|
'ctrl': k.control_key,
|
||||||
|
'alt': k.alt_key,
|
||||||
|
'meta': k.windows_l_key,
|
||||||
|
'shift': k.shift_key,
|
||||||
|
'enter': k.enter_key,
|
||||||
|
'tab': k.tab_key,
|
||||||
|
'home': k.home_key,
|
||||||
|
'end': k.end_key,
|
||||||
|
'capslock': k.caps_lock_key,
|
||||||
|
'back': k.backspace_key,
|
||||||
|
'del': k.delete_key,
|
||||||
|
'up': k.up_key,
|
||||||
|
'down': k.down_key,
|
||||||
|
'left': k.left_key,
|
||||||
|
'right': k.right_key,
|
||||||
|
'pageup': k.page_up_key,
|
||||||
|
'pagedown': k.page_down_key,
|
||||||
|
'esc': k.escape_key,
|
||||||
|
'find': k.find_key,
|
||||||
|
'f1': k.function_keys[1],
|
||||||
|
'f2': k.function_keys[2],
|
||||||
|
'f3': k.function_keys[3],
|
||||||
|
'f4': k.function_keys[4],
|
||||||
|
'f5': k.function_keys[5],
|
||||||
|
'f6': k.function_keys[6],
|
||||||
|
'f7': k.function_keys[7],
|
||||||
|
'f8': k.function_keys[8],
|
||||||
|
'f9': k.function_keys[9],
|
||||||
|
'f10': k.function_keys[10],
|
||||||
|
'f11': k.function_keys[11],
|
||||||
|
'f12': k.function_keys[12],
|
||||||
|
'help': k.help_key,
|
||||||
|
'media_next': k.media_next_track_key,
|
||||||
|
'media_prev': k.media_prev_track_key,
|
||||||
|
'media_play': k.media_play_pause_key,
|
||||||
|
'menu': k.menu_key,
|
||||||
|
'numlock': k.num_lock_key,
|
||||||
|
'print': k.print_key,
|
||||||
|
'print_screen': k.print_screen_key,
|
||||||
|
'sleep': k.sleep_key,
|
||||||
|
'space': k.space_key,
|
||||||
|
'voldown': k.volume_down_key,
|
||||||
|
'volup': k.volume_up_key,
|
||||||
|
'volmute': k.volume_mute_key,
|
||||||
|
'zoom': k.zoom_key,
|
||||||
|
}
|
||||||
|
|
||||||
|
lkey = key.lower()
|
||||||
|
if lkey in keymap:
|
||||||
|
return keymap[lkey]
|
||||||
|
|
||||||
|
return key
|
||||||
|
|
||||||
|
@action
|
||||||
|
def press_key(self, key: str):
|
||||||
|
"""
|
||||||
|
Emulate the pressure of a key.
|
||||||
|
:param key: Key to be pressed
|
||||||
|
"""
|
||||||
|
kbd = self._get_keyboard()
|
||||||
|
key = self._parse_key(key)
|
||||||
|
kbd.press_key(key)
|
||||||
|
|
||||||
|
@action
|
||||||
|
def release_key(self, key: str):
|
||||||
|
"""
|
||||||
|
Release a pressed key.
|
||||||
|
:param key: Key to be released
|
||||||
|
"""
|
||||||
|
kbd = self._get_keyboard()
|
||||||
|
key = self._parse_key(key)
|
||||||
|
kbd.release_key(key)
|
||||||
|
|
||||||
|
@action
|
||||||
|
def press_keys(self, keys: List[str]):
|
||||||
|
"""
|
||||||
|
Emulate the pressure of multiple keys.
|
||||||
|
:param keys: List of keys to be pressed.
|
||||||
|
"""
|
||||||
|
kbd = self._get_keyboard()
|
||||||
|
keys = [self._parse_key(k) for k in keys]
|
||||||
|
kbd.press_keys(keys)
|
||||||
|
|
||||||
|
@action
|
||||||
|
def tap_key(self, key: str, repeat: int = 1, interval: float = 0):
|
||||||
|
"""
|
||||||
|
Emulate a key tap.
|
||||||
|
:param key: Key to be pressed
|
||||||
|
:param repeat: Number of iterations (default: 1)
|
||||||
|
:param interval: Repeat interval in seconds (default: 0)
|
||||||
|
"""
|
||||||
|
kbd = self._get_keyboard()
|
||||||
|
key = self._parse_key(key)
|
||||||
|
kbd.tap_key(key, n=repeat, interval=interval)
|
||||||
|
|
||||||
|
@action
|
||||||
|
def type_string(self, string: str, interval: float = 0):
|
||||||
|
"""
|
||||||
|
Type a string.
|
||||||
|
:param string: String to be typed
|
||||||
|
:param interval: Interval between key strokes in seconds (default: 0)
|
||||||
|
"""
|
||||||
|
kbd = self._get_keyboard()
|
||||||
|
kbd.type_string(string, interval=interval)
|
||||||
|
|
||||||
|
@action
|
||||||
|
def get_screen_size(self) -> List[int]:
|
||||||
|
"""
|
||||||
|
Get the size of the screen in pixels.
|
||||||
|
"""
|
||||||
|
m = self._get_mouse()
|
||||||
|
return [m.screen_size()]
|
||||||
|
|
||||||
|
@action
|
||||||
|
def mouse_click(self, x: int, y: int, btn: int, repeat: int = 1):
|
||||||
|
"""
|
||||||
|
Mouse click.
|
||||||
|
:param x: x screen position
|
||||||
|
:param y: y screen position
|
||||||
|
:param btn: Button number (1 for left, 2 for right, 3 for middle)
|
||||||
|
:param repeat: Number of clicks (default: 1)
|
||||||
|
"""
|
||||||
|
m = self._get_mouse()
|
||||||
|
m.click(x, y, btn, n=repeat)
|
||||||
|
|
||||||
|
|
||||||
|
# vim:sw=4:ts=4:et:
|
|
@ -198,3 +198,6 @@ croniter
|
||||||
# Support for Google Pub/Sub
|
# Support for Google Pub/Sub
|
||||||
# google-cloud-pubsub
|
# google-cloud-pubsub
|
||||||
|
|
||||||
|
# Support for keyboard/mouse plugin
|
||||||
|
# pyuserinput
|
||||||
|
|
||||||
|
|
2
setup.py
2
setup.py
|
@ -258,6 +258,8 @@ setup(
|
||||||
'trello': ['py-trello'],
|
'trello': ['py-trello'],
|
||||||
# Support for Google Pub/Sub
|
# Support for Google Pub/Sub
|
||||||
'google-pubsub': ['google-cloud-pubsub'],
|
'google-pubsub': ['google-cloud-pubsub'],
|
||||||
|
# Support for keyboard/mouse plugin
|
||||||
|
'inputs': ['pyuserinput'],
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue