Skip to main content

tiny hotkey library and daemon

Project description

Pyzmo is a small hotkey library based on python-evdev. It can call arbitrary Python functions in response to key presses, key chords (simultaneously pressed keys) and key sequences (keys pressed in succession).

Usage (Python)

from pyzmo import *
from evdev.ecodes import *

# triggered when KEY_PLAYPAUSE is pressed
@key(KEY_PLAYPAUSE)
def playpause(events):
    pass

# triggered when KEY_B is pressed, held or released
@key(KEY_B, states=['down', 'hold', 'up'])
def back(events):
    pass

# triggered when either KEY_C or KEY_D are pressed
@key(KEY_C, KEY_D)
def c_or_d(events):
    pass

# triggered when KEY_LEFTCTRL, KEY_LEFTALT and KEY_DELETE are
# pressed at the same time
@chord(KEY_LEFTCTRL, KEY_LEFTALT, KEY_DELETE)
def ctrlaltdel(events):
    pass

# triggered when KEY_A, KEY_B and KEY_C are pressed one after the other
@keyseq(KEY_A, KEY_B, KEY_C)
def abc(events):
    pass

# specifying multiple sequences for one callback (syntax applies for
# @chord and @event as well)
@keyseq( (KEY_1, KEY_2, KEY_3), (KEY_Z, KEY_X, KEY_C) )
def zxc_or_123(events):
    pass

# each handler receives the list of input events, because of
# which it was triggered
@chord(e.KEY_LEFTMETA, e.KEY_A)
def term(events):
    for event in events:
        print(event)  # instance of evdev.events.InputEvent
        #event at 1352244701.749908, code 125, type 01, val 01
        #event at 1352244701.861897, code 30, type 01, val 01

## Note 1:
# If we define two triggers:
#  - @chord(KEY_LEFTCTRL, KEY_V)
#  - @key(KEY_V)
#
# Pressing 'ctrl-v' will run both their callbacks. To stop
# processing any further triggers after a match is made, use:
@chord(KEY_LEFTCTRL, KEY_V, quick=True)
def copy(events):
    pass

## Note 2:
# Pyzmo can actually match arbitrary input events. The following
# will be triggered on scroll-wheel movement:
@event(EV_REL, REL_WHEEL, -1)
def vertical_scroll(events):
    pass

# start main loop
poll('/dev/input/event1', '/dev/input/event2')

# .. or if you wish to get exclusive access to a input device
from evdev import InputDevice
dev = InputDevice('/dev/input/eventX')
dev.grab()
poll(dev)

You can also avoid polluting the global namespace with:

from pyzmo import EventHandler
from evdev import ecodes as e

app = EventHandler('name')

@app.key(e.KEY_F)
def f(events): pass

@app.poll(...)

Usage (Hy)

Pyzmo also has a DSL that can be used from Hy, which is a dialect of lisp that is embedded in Python.

(require pyzmo.dsl)
(import pyzmo [pyzmo [poll util]])

# triggered when KEY_PLAYPAUSE is pressed
(key PLAYPAUSE (print events))

# triggered when KEY_B is pressed, held or released
(key B [:down :hold :up] (print events))

# triggered when either KEY_C or KEY_D are pressed
(key [C D] (print events))

# triggered when KEY_LEFTCTRL, KEY_LEFTALT and KEY_DELETE are
# pressed at the same time
(chord [LEFTCTRL LEFTALT DELETE] (print events))

# triggered when KEY_A, KEY_B and KEY_C are pressed one after the other
(seq [A B C] (print events))

# start main loop
(poll "/dev/input/eventX" "/dev/input/eventY")

Installing

The latest stable version of pyzmo is available on pypi, while the development version can be installed from github:

$ pip install pyzmo  # latest stable version
$ pip install git+git://github.com/gvalkov/pyzmo.git  # latest development version

Alternatively, you can install it manually like any other python package:

$ git clone git@github.com:gvalkov/pyzmo.git
$ cd pyzmo
$ git reset --hard HEAD $versiontag
$ python setup.py install

Similar Projects

License

Pyzmo is released under the terms of the Revised BSD License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
pyzmo-1.0.0-py3-none-any.whl (9.9 kB) Copy SHA256 hash SHA256 Wheel 3.6
pyzmo-1.0.0.tar.gz (6.5 kB) Copy SHA256 hash SHA256 Source None

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page