-
Notifications
You must be signed in to change notification settings - Fork 115
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- The existing ecodes.py is renamed to ecodes_runtime.py. - An ecodes.py is generated at build time (in build_ext) with the genecodes_py.py script, after the extension modules are built. The script essentially does a repr() on vars(ecodes_runtime) and adds type annotations. - If something goes wrong in the process of generating ecodes.py, ecodes_runtime.py is copied to ecodes.py. - Stop generating ecodes.pyi as the generated ecodes.py is fully annotated.
- Loading branch information
Showing
9 changed files
with
180 additions
and
118 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
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -15,6 +15,7 @@ TAGS | |
.#* | ||
__pycache__ | ||
.pytest_cache | ||
.ruff_cache | ||
|
||
evdev/*.so | ||
evdev/ecodes.c | ||
|
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 |
---|---|---|
@@ -1,102 +1,5 @@ | ||
# pylint: disable=undefined-variable | ||
""" | ||
This modules exposes the integer constants defined in ``linux/input.h`` and | ||
``linux/input-event-codes.h``. | ||
# When installed, this module is replaced by an ecodes.py generated at | ||
# build time by genecodes_py.py (see build_ext in setup.py). | ||
|
||
Exposed constants:: | ||
KEY, ABS, REL, SW, MSC, LED, BTN, REP, SND, ID, EV, | ||
BUS, SYN, FF, FF_STATUS, INPUT_PROP | ||
This module also provides reverse and forward mappings of the names and values | ||
of the above mentioned constants:: | ||
>>> evdev.ecodes.KEY_A | ||
30 | ||
>>> evdev.ecodes.ecodes['KEY_A'] | ||
30 | ||
>>> evdev.ecodes.KEY[30] | ||
'KEY_A' | ||
>>> evdev.ecodes.REL[0] | ||
'REL_X' | ||
>>> evdev.ecodes.EV[evdev.ecodes.EV_KEY] | ||
'EV_KEY' | ||
>>> evdev.ecodes.bytype[evdev.ecodes.EV_REL][0] | ||
'REL_X' | ||
Keep in mind that values in reverse mappings may point to one or more event | ||
codes. For example:: | ||
>>> evdev.ecodes.FF[80] | ||
['FF_EFFECT_MIN', 'FF_RUMBLE'] | ||
>>> evdev.ecodes.FF[81] | ||
'FF_PERIODIC' | ||
""" | ||
|
||
from inspect import getmembers | ||
|
||
from . import _ecodes | ||
|
||
#: Mapping of names to values. | ||
ecodes = {} | ||
|
||
prefixes = "KEY ABS REL SW MSC LED BTN REP SND ID EV BUS SYN FF_STATUS FF INPUT_PROP" | ||
prev_prefix = "" | ||
g = globals() | ||
|
||
# eg. code: 'REL_Z', val: 2 | ||
for code, val in getmembers(_ecodes): | ||
for prefix in prefixes.split(): # eg. 'REL' | ||
if code.startswith(prefix): | ||
ecodes[code] = val | ||
# FF_STATUS codes should not appear in the FF reverse mapping | ||
if not code.startswith(prev_prefix): | ||
d = g.setdefault(prefix, {}) | ||
# codes that share the same value will be added to a list. eg: | ||
# >>> ecodes.FF_STATUS | ||
# {0: 'FF_STATUS_STOPPED', 1: ['FF_STATUS_MAX', 'FF_STATUS_PLAYING']} | ||
if val in d: | ||
if isinstance(d[val], list): | ||
d[val].append(code) | ||
else: | ||
d[val] = [d[val], code] | ||
else: | ||
d[val] = code | ||
|
||
prev_prefix = prefix | ||
|
||
#: Keys are a combination of all BTN and KEY codes. | ||
keys = {} | ||
keys.update(BTN) | ||
keys.update(KEY) | ||
|
||
# make keys safe to use for the default list of uinput device | ||
# capabilities | ||
del keys[_ecodes.KEY_MAX] | ||
del keys[_ecodes.KEY_CNT] | ||
|
||
#: Mapping of event types to other value/name mappings. | ||
bytype = { | ||
_ecodes.EV_KEY: keys, | ||
_ecodes.EV_ABS: ABS, | ||
_ecodes.EV_REL: REL, | ||
_ecodes.EV_SW: SW, | ||
_ecodes.EV_MSC: MSC, | ||
_ecodes.EV_LED: LED, | ||
_ecodes.EV_REP: REP, | ||
_ecodes.EV_SND: SND, | ||
_ecodes.EV_SYN: SYN, | ||
_ecodes.EV_FF: FF, | ||
_ecodes.EV_FF_STATUS: FF_STATUS, | ||
} | ||
|
||
from evdev._ecodes import * | ||
|
||
# cheaper than whitelisting in an __all__ | ||
del code, val, prefix, getmembers, g, d, prefixes, prev_prefix | ||
# This stub exists to make development of evdev itself more convenient. | ||
from . ecodes_runtime import * |
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,102 @@ | ||
# pylint: disable=undefined-variable | ||
""" | ||
This modules exposes the integer constants defined in ``linux/input.h`` and | ||
``linux/input-event-codes.h``. | ||
Exposed constants:: | ||
KEY, ABS, REL, SW, MSC, LED, BTN, REP, SND, ID, EV, | ||
BUS, SYN, FF, FF_STATUS, INPUT_PROP | ||
This module also provides reverse and forward mappings of the names and values | ||
of the above mentioned constants:: | ||
>>> evdev.ecodes.KEY_A | ||
30 | ||
>>> evdev.ecodes.ecodes['KEY_A'] | ||
30 | ||
>>> evdev.ecodes.KEY[30] | ||
'KEY_A' | ||
>>> evdev.ecodes.REL[0] | ||
'REL_X' | ||
>>> evdev.ecodes.EV[evdev.ecodes.EV_KEY] | ||
'EV_KEY' | ||
>>> evdev.ecodes.bytype[evdev.ecodes.EV_REL][0] | ||
'REL_X' | ||
Keep in mind that values in reverse mappings may point to one or more event | ||
codes. For example:: | ||
>>> evdev.ecodes.FF[80] | ||
['FF_EFFECT_MIN', 'FF_RUMBLE'] | ||
>>> evdev.ecodes.FF[81] | ||
'FF_PERIODIC' | ||
""" | ||
|
||
from inspect import getmembers | ||
|
||
from . import _ecodes | ||
|
||
#: Mapping of names to values. | ||
ecodes = {} | ||
|
||
prefixes = "KEY ABS REL SW MSC LED BTN REP SND ID EV BUS SYN FF_STATUS FF INPUT_PROP" | ||
prev_prefix = "" | ||
g = globals() | ||
|
||
# eg. code: 'REL_Z', val: 2 | ||
for code, val in getmembers(_ecodes): | ||
for prefix in prefixes.split(): # eg. 'REL' | ||
if code.startswith(prefix): | ||
ecodes[code] = val | ||
# FF_STATUS codes should not appear in the FF reverse mapping | ||
if not code.startswith(prev_prefix): | ||
d = g.setdefault(prefix, {}) | ||
# codes that share the same value will be added to a list. eg: | ||
# >>> ecodes.FF_STATUS | ||
# {0: 'FF_STATUS_STOPPED', 1: ['FF_STATUS_MAX', 'FF_STATUS_PLAYING']} | ||
if val in d: | ||
if isinstance(d[val], list): | ||
d[val].append(code) | ||
else: | ||
d[val] = [d[val], code] | ||
else: | ||
d[val] = code | ||
|
||
prev_prefix = prefix | ||
|
||
#: Keys are a combination of all BTN and KEY codes. | ||
keys = {} | ||
keys.update(BTN) | ||
keys.update(KEY) | ||
|
||
# make keys safe to use for the default list of uinput device | ||
# capabilities | ||
del keys[_ecodes.KEY_MAX] | ||
del keys[_ecodes.KEY_CNT] | ||
|
||
#: Mapping of event types to other value/name mappings. | ||
bytype = { | ||
_ecodes.EV_KEY: keys, | ||
_ecodes.EV_ABS: ABS, | ||
_ecodes.EV_REL: REL, | ||
_ecodes.EV_SW: SW, | ||
_ecodes.EV_MSC: MSC, | ||
_ecodes.EV_LED: LED, | ||
_ecodes.EV_REP: REP, | ||
_ecodes.EV_SND: SND, | ||
_ecodes.EV_SYN: SYN, | ||
_ecodes.EV_FF: FF, | ||
_ecodes.EV_FF_STATUS: FF_STATUS, | ||
} | ||
|
||
from evdev._ecodes import * | ||
|
||
# cheaper than whitelisting in an __all__ | ||
del code, val, prefix, getmembers, g, d, prefixes, prev_prefix |
File renamed without changes.
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,53 @@ | ||
import sys | ||
from unittest import mock | ||
from pprint import PrettyPrinter | ||
|
||
sys.modules["evdev.ecodes"] = mock.Mock() | ||
from evdev import ecodes_runtime as ecodes | ||
|
||
pprint = PrettyPrinter(indent=2, sort_dicts=True, width=120).pprint | ||
|
||
|
||
print("# Automatically generated by evdev.genecodes_py") | ||
print() | ||
print('"""') | ||
print(ecodes.__doc__.strip()) | ||
print('"""') | ||
|
||
print() | ||
print("from typing import Final, Dict, List, Union") | ||
print() | ||
|
||
for name, value in ecodes.ecodes.items(): | ||
print(f"{name}: Final = {value}") | ||
print() | ||
|
||
entries = [ | ||
("ecodes", "Dict[str, int]", "#: Mapping of names to values."), | ||
("bytype", "Dict[int, Dict[int, Union[str, List[str]]", "#: Mapping of event types to other value/name mappings."), | ||
("keys", "Dict[int, Union[str, List[str]]", "#: Keys are a combination of all BTN and KEY codes."), | ||
("KEY", "Dict[int, Union[str, List[str]]", None), | ||
("ABS", "Dict[int, Union[str, List[str]]", None), | ||
("REL", "Dict[int, Union[str, List[str]]", None), | ||
("SW", "Dict[int, Union[str, List[str]]", None), | ||
("MSC", "Dict[int, Union[str, List[str]]", None), | ||
("LED", "Dict[int, Union[str, List[str]]", None), | ||
("BTN", "Dict[int, Union[str, List[str]]", None), | ||
("REP", "Dict[int, Union[str, List[str]]", None), | ||
("SND", "Dict[int, Union[str, List[str]]", None), | ||
("ID", "Dict[int, Union[str, List[str]]", None), | ||
("EV", "Dict[int, Union[str, List[str]]", None), | ||
("BUS", "Dict[int, Union[str, List[str]]", None), | ||
("SYN", "Dict[int, Union[str, List[str]]", None), | ||
("FF", "Dict[int, Union[str, List[str]]", None), | ||
("FF_STATUS", "Dict[int, Union[str, List[str]]", None), | ||
("INPUT_PROP", "Dict[int, Union[str, List[str]]", None) | ||
] | ||
|
||
for key, annotation, doc in entries: | ||
if doc: | ||
print(doc) | ||
|
||
print(f"{key}: {annotation} = ", end="") | ||
pprint(getattr(ecodes, key)) | ||
print() |
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