_keys.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. """
  2. rescriptoon
  3. Copyright (C) 2018-2019 Fabian Peter Hammerle <fabian@hammerle.me>
  4. This program is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation, either version 3 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program. If not, see <https://www.gnu.org/licenses/>.
  14. """
  15. import enum
  16. import typing
  17. from Xlib import XK
  18. class USKeyCode(enum.Enum):
  19. w = 25
  20. e = 26
  21. i = 31
  22. o = 32
  23. ctrl_left = 37
  24. a = 38
  25. s = 39
  26. d = 40
  27. f = 41
  28. j = 44
  29. k = 45
  30. l = 46
  31. semicolon = 47
  32. grave = 49
  33. v = 55
  34. n = 57
  35. slash = 61
  36. space = 65
  37. _KEYSYM_LABELS = {
  38. # pylint: disable=no-member; false positive
  39. XK.XK_Control_L: "left ctrl",
  40. XK.XK_Control_R: "right ctrl",
  41. XK.XK_Delete: "delete",
  42. XK.XK_Down: "↓",
  43. XK.XK_Left: "→",
  44. XK.XK_Right: "←",
  45. XK.XK_Up: "↑",
  46. XK.XK_space: "␣",
  47. }
  48. def keysym_to_label(keysym: int) -> typing.Optional[str]:
  49. return _KEYSYM_LABELS.get(keysym, XK.keysym_to_string(keysym))
  50. def invert_string_to_keysym(keysym: int) -> typing.Optional[str]:
  51. """
  52. Surprisingly, XK.keysym_to_string does not invert XK.string_to_keysym:
  53. >>> XK.keysym_to_string(XK.XK_grave)
  54. '`'
  55. >>> XK.string_to_keysym("`")
  56. 0
  57. >>> XK.string_to_keysym("grave")
  58. 96
  59. >>> string_to_keysym_inverted(keysym=XK.XK_grave)
  60. 'grave'
  61. """
  62. for string, ksym in vars(XK).items():
  63. if keysym == ksym:
  64. assert string.startswith("XK_")
  65. return string[3:]
  66. return None