plover 5.0.0.dev3__tar.gz → 5.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. {plover-5.0.0.dev3 → plover-5.1.0}/LICENSE.txt +4 -5
  2. {plover-5.0.0.dev3 → plover-5.1.0}/MANIFEST.in +1 -0
  3. {plover-5.0.0.dev3 → plover-5.1.0}/NEWS.md +61 -0
  4. {plover-5.0.0.dev3/plover.egg-info → plover-5.1.0}/PKG-INFO +2 -1
  5. {plover-5.0.0.dev3 → plover-5.1.0}/doc/ci.md +1 -6
  6. {plover-5.0.0.dev3 → plover-5.1.0}/doc/conf.py +1 -1
  7. {plover-5.0.0.dev3 → plover-5.1.0}/doc/developer_guide.md +12 -3
  8. {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugins.md +3 -2
  9. {plover-5.0.0.dev3 → plover-5.1.0}/linux/appimage/build.sh +29 -0
  10. plover-5.1.0/linux/build_hidapi.sh +8 -0
  11. plover-5.1.0/osx/build_hidapi.sh +9 -0
  12. {plover-5.0.0.dev3 → plover-5.1.0}/osx/make_app.sh +46 -6
  13. plover-5.1.0/osx/make_dmg.sh +23 -0
  14. plover-5.1.0/osx/notarize_app.sh +78 -0
  15. plover-5.1.0/osx/notarize_common.sh +33 -0
  16. plover-5.1.0/osx/notarize_dmg.sh +48 -0
  17. {plover-5.0.0.dev3 → plover-5.1.0}/plover/__init__.py +1 -1
  18. {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/loading_manager.py +22 -5
  19. {plover-5.0.0.dev3 → plover-5.1.0}/plover/engine.py +11 -11
  20. {plover-5.0.0.dev3 → plover-5.1.0}/plover/exception.py +0 -12
  21. plover-5.1.0/plover/gui_qt/config_plover_hid_widget.ui +145 -0
  22. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/dictionaries_widget.py +9 -0
  23. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/engine.py +6 -1
  24. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/machine_options.py +53 -1
  25. plover-5.1.0/plover/machine/plover_hid.py +312 -0
  26. {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/procat.py +1 -1
  27. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/keyboardcontrol_uinput.py +137 -37
  28. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/keyboardlayout.py +4 -1
  29. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/log.py +28 -6
  30. {plover-5.0.0.dev3 → plover-5.1.0}/plover/system/english_stenotype.py +53 -0
  31. {plover-5.0.0.dev3 → plover-5.1.0/plover.egg-info}/PKG-INFO +2 -1
  32. {plover-5.0.0.dev3 → plover-5.1.0}/plover.egg-info/SOURCES.txt +12 -2
  33. {plover-5.0.0.dev3 → plover-5.1.0}/plover.egg-info/entry_points.txt +5 -3
  34. {plover-5.0.0.dev3 → plover-5.1.0}/plover.egg-info/requires.txt +1 -0
  35. plover-5.1.0/plover_build_utils/deps.sh +2 -0
  36. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/download.py +5 -2
  37. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/functions.sh +80 -17
  38. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/constraints.txt +2 -1
  39. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/dist.txt +1 -0
  40. {plover-5.0.0.dev3 → plover-5.1.0}/setup.cfg +8 -6
  41. {plover-5.0.0.dev3 → plover-5.1.0}/setup.py +74 -12
  42. {plover-5.0.0.dev3 → plover-5.1.0}/test/gui_qt/test_dictionaries_widget.py +5 -1
  43. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_engine.py +6 -7
  44. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_loading_manager.py +5 -5
  45. {plover-5.0.0.dev3 → plover-5.1.0}/tox.ini +23 -2
  46. plover-5.1.0/windows/build_hidapi.sh +19 -0
  47. {plover-5.0.0.dev3 → plover-5.1.0}/windows/dist_build.sh +24 -0
  48. {plover-5.0.0.dev3 → plover-5.1.0}/CONTRIBUTING.md +0 -0
  49. {plover-5.0.0.dev3 → plover-5.1.0}/README.md +0 -0
  50. {plover-5.0.0.dev3 → plover-5.1.0}/doc/SCOWL_README.txt +0 -0
  51. {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/board-layout.png +0 -0
  52. {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/custom.css +0 -0
  53. {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/de-speech.png +0 -0
  54. {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/dolores.svg +0 -0
  55. {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/engine-flow.png +0 -0
  56. {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/favicon.ico +0 -0
  57. {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/jp-speech.png +0 -0
  58. {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/keys-layout.png +0 -0
  59. {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/uncomfortable.png +0 -0
  60. {plover-5.0.0.dev3 → plover-5.1.0}/doc/_templates/breadcrumbs.html +0 -0
  61. {plover-5.0.0.dev3 → plover-5.1.0}/doc/_templates/layout.html +0 -0
  62. {plover-5.0.0.dev3 → plover-5.1.0}/doc/add_translation.md +0 -0
  63. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/config.md +0 -0
  64. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/dictionary.md +0 -0
  65. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/dictionary_lib.md +0 -0
  66. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/engine.md +0 -0
  67. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/exception.md +0 -0
  68. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/formatting.md +0 -0
  69. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/i18n.md +0 -0
  70. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/key_combo.md +0 -0
  71. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/log.md +0 -0
  72. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/machine.md +0 -0
  73. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/machine_keyboard_capture.md +0 -0
  74. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/machine_keymap.md +0 -0
  75. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/misc.md +0 -0
  76. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/orthography.md +0 -0
  77. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer.md +0 -0
  78. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer_config.md +0 -0
  79. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer_controller.md +0 -0
  80. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer_i18n.md +0 -0
  81. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer_keyboardcontrol.md +0 -0
  82. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer_log.md +0 -0
  83. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer_wmctrl.md +0 -0
  84. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/output.md +0 -0
  85. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/plover.md +0 -0
  86. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/plover_stroke.md +0 -0
  87. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/qt.md +0 -0
  88. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/registry.md +0 -0
  89. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/resource.md +0 -0
  90. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/steno.md +0 -0
  91. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/steno_dictionary.md +0 -0
  92. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/suggestions.md +0 -0
  93. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/system.md +0 -0
  94. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/translation.md +0 -0
  95. {plover-5.0.0.dev3 → plover-5.1.0}/doc/api_reference.md +0 -0
  96. {plover-5.0.0.dev3 → plover-5.1.0}/doc/basic_usage.md +0 -0
  97. {plover-5.0.0.dev3 → plover-5.1.0}/doc/cli_reference.md +0 -0
  98. {plover-5.0.0.dev3 → plover-5.1.0}/doc/configuration.md +0 -0
  99. {plover-5.0.0.dev3 → plover-5.1.0}/doc/contributing.md +0 -0
  100. {plover-5.0.0.dev3 → plover-5.1.0}/doc/design.md +0 -0
  101. {plover-5.0.0.dev3 → plover-5.1.0}/doc/dict_editor.md +0 -0
  102. {plover-5.0.0.dev3 → plover-5.1.0}/doc/dict_formats.md +0 -0
  103. {plover-5.0.0.dev3 → plover-5.1.0}/doc/dictionaries.md +0 -0
  104. {plover-5.0.0.dev3 → plover-5.1.0}/doc/hardware_communication.md +0 -0
  105. {plover-5.0.0.dev3 → plover-5.1.0}/doc/hardware_setup.md +0 -0
  106. {plover-5.0.0.dev3 → plover-5.1.0}/doc/i18n.md +0 -0
  107. {plover-5.0.0.dev3 → plover-5.1.0}/doc/index.md +0 -0
  108. {plover-5.0.0.dev3 → plover-5.1.0}/doc/installation.md +0 -0
  109. {plover-5.0.0.dev3 → plover-5.1.0}/doc/internals.md +0 -0
  110. {plover-5.0.0.dev3 → plover-5.1.0}/doc/platform_layer.md +0 -0
  111. {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/commands.md +0 -0
  112. {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/dictionaries.md +0 -0
  113. {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/extensions.md +0 -0
  114. {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/gui_tools.md +0 -0
  115. {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/machines.md +0 -0
  116. {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/macros.md +0 -0
  117. {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/metas.md +0 -0
  118. {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/publishing.md +0 -0
  119. {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/setup.md +0 -0
  120. {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/systems.md +0 -0
  121. {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin_dev.md +0 -0
  122. {plover-5.0.0.dev3 → plover-5.1.0}/doc/releases.md +0 -0
  123. {plover-5.0.0.dev3 → plover-5.1.0}/doc/requirements.txt +0 -0
  124. {plover-5.0.0.dev3 → plover-5.1.0}/doc/system-dev/board-layout.md +0 -0
  125. {plover-5.0.0.dev3 → plover-5.1.0}/doc/system-dev/key-arrangement.md +0 -0
  126. {plover-5.0.0.dev3 → plover-5.1.0}/doc/system-dev/layout-test.md +0 -0
  127. {plover-5.0.0.dev3 → plover-5.1.0}/doc/system-dev/steno-system.md +0 -0
  128. {plover-5.0.0.dev3 → plover-5.1.0}/doc/system-dev/system.md +0 -0
  129. {plover-5.0.0.dev3 → plover-5.1.0}/doc/system_dev.md +0 -0
  130. {plover-5.0.0.dev3 → plover-5.1.0}/doc/translation_language.md +0 -0
  131. {plover-5.0.0.dev3 → plover-5.1.0}/linux/README.md +0 -0
  132. {plover-5.0.0.dev3 → plover-5.1.0}/linux/appimage/Dockerfile +0 -0
  133. {plover-5.0.0.dev3 → plover-5.1.0}/linux/appimage/apprun.sh +0 -0
  134. {plover-5.0.0.dev3 → plover-5.1.0}/linux/appimage/blacklist.txt +0 -0
  135. {plover-5.0.0.dev3 → plover-5.1.0}/linux/appimage/deps.sh +0 -0
  136. {plover-5.0.0.dev3 → plover-5.1.0}/linux/appimage/pyinfo.py +0 -0
  137. {plover-5.0.0.dev3 → plover-5.1.0}/linux/plover.desktop +0 -0
  138. {plover-5.0.0.dev3 → plover-5.1.0}/news.d/api/.gitignore +0 -0
  139. {plover-5.0.0.dev3 → plover-5.1.0}/news.d/bugfix/.gitignore +0 -0
  140. {plover-5.0.0.dev3 → plover-5.1.0}/news.d/feature/.gitignore +0 -0
  141. {plover-5.0.0.dev3 → plover-5.1.0}/news.d/template.md +0 -0
  142. {plover-5.0.0.dev3 → plover-5.1.0}/osx/README.md +0 -0
  143. {plover-5.0.0.dev3 → plover-5.1.0}/osx/app_resources/Info.plist +0 -0
  144. {plover-5.0.0.dev3 → plover-5.1.0}/osx/app_resources/dist_blacklist.txt +0 -0
  145. {plover-5.0.0.dev3 → plover-5.1.0}/osx/app_resources/plover.icns +0 -0
  146. {plover-5.0.0.dev3 → plover-5.1.0}/osx/app_resources/plover_launcher.c +0 -0
  147. {plover-5.0.0.dev3 → plover-5.1.0}/osx/deps.sh +0 -0
  148. {plover-5.0.0.dev3 → plover-5.1.0}/osx/dmg_resources/background.png +0 -0
  149. {plover-5.0.0.dev3 → plover-5.1.0}/osx/dmg_resources/background.psd +0 -0
  150. {plover-5.0.0.dev3 → plover-5.1.0}/osx/dmg_resources/background@2x.png +0 -0
  151. {plover-5.0.0.dev3 → plover-5.1.0}/osx/dmg_resources/settings.py +0 -0
  152. {plover-5.0.0.dev3 → plover-5.1.0}/plover/__main__.py +0 -0
  153. {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/american_english_words.txt +0 -0
  154. {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/commands.json +0 -0
  155. {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/main.json +0 -0
  156. {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/plover-icon.svg +0 -0
  157. {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/plover.ico +0 -0
  158. {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/plover.png +0 -0
  159. {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/user.json +0 -0
  160. {plover-5.0.0.dev3 → plover-5.1.0}/plover/command/__init__.py +0 -0
  161. {plover-5.0.0.dev3 → plover-5.1.0}/plover/command/set_config.py +0 -0
  162. {plover-5.0.0.dev3 → plover-5.1.0}/plover/config.py +0 -0
  163. {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/__init__.py +0 -0
  164. {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/base.py +0 -0
  165. {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/helpers.py +0 -0
  166. {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/json_dict.py +0 -0
  167. {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/rtfcre_dict.py +0 -0
  168. {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/rtfcre_parse.py +0 -0
  169. {plover-5.0.0.dev3 → plover-5.1.0}/plover/formatting.py +0 -0
  170. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_none/__init__.py +0 -0
  171. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_none/add_translation.py +0 -0
  172. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_none/engine.py +0 -0
  173. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_none/main.py +0 -0
  174. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/__init__.py +0 -0
  175. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/about_dialog.py +0 -0
  176. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/about_dialog.ui +0 -0
  177. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/add_translation_dialog.py +0 -0
  178. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/add_translation_dialog.ui +0 -0
  179. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/add_translation_widget.py +0 -0
  180. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/add_translation_widget.ui +0 -0
  181. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/config_file_widget.ui +0 -0
  182. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/config_keyboard_widget.ui +0 -0
  183. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/config_serial_widget.ui +0 -0
  184. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/config_window.py +0 -0
  185. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/config_window.ui +0 -0
  186. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/console_widget.py +0 -0
  187. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/console_widget.ui +0 -0
  188. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/dictionaries_widget.ui +0 -0
  189. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/dictionary_editor.py +0 -0
  190. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/dictionary_editor.ui +0 -0
  191. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/info_browser.py +0 -0
  192. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/log_qt.py +0 -0
  193. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/lookup_dialog.py +0 -0
  194. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/lookup_dialog.ui +0 -0
  195. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/main.py +0 -0
  196. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/main_window.py +0 -0
  197. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/main_window.ui +0 -0
  198. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/paper_tape.py +0 -0
  199. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/paper_tape.ui +0 -0
  200. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/plugins_manager.py +0 -0
  201. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/plugins_manager.ui +0 -0
  202. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/__init__.py +0 -0
  203. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/add.svg +0 -0
  204. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/dictionary_error.svg +0 -0
  205. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/dictionary_favorite.svg +0 -0
  206. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/dictionary_loading.svg +0 -0
  207. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/dictionary_normal.svg +0 -0
  208. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/dictionary_readonly.svg +0 -0
  209. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/down.svg +0 -0
  210. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/folder.svg +0 -0
  211. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/font_selector.svg +0 -0
  212. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/git.png +0 -0
  213. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/lightbulb.svg +0 -0
  214. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/lookup.svg +0 -0
  215. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/pencil.svg +0 -0
  216. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/pin.svg +0 -0
  217. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/plover.png +0 -0
  218. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/plugins_manager.svg +0 -0
  219. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/reconnect.svg +0 -0
  220. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/remove.svg +0 -0
  221. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/save.svg +0 -0
  222. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/settings.svg +0 -0
  223. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/state-disabled.svg +0 -0
  224. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/state-disconnected.svg +0 -0
  225. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/state-enabled.svg +0 -0
  226. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/tape.svg +0 -0
  227. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/translation_add.svg +0 -0
  228. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/trash.svg +0 -0
  229. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/undo.svg +0 -0
  230. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/up.svg +0 -0
  231. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources.qrc +0 -0
  232. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/run_dialog.py +0 -0
  233. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/run_dialog.ui +0 -0
  234. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/steno_validator.py +0 -0
  235. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/suggestions_dialog.py +0 -0
  236. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/suggestions_dialog.ui +0 -0
  237. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/suggestions_widget.py +0 -0
  238. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/tool.py +0 -0
  239. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/trayicon.py +0 -0
  240. {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/utils.py +0 -0
  241. {plover-5.0.0.dev3 → plover-5.1.0}/plover/i18n.py +0 -0
  242. {plover-5.0.0.dev3 → plover-5.1.0}/plover/key_combo.py +0 -0
  243. {plover-5.0.0.dev3 → plover-5.1.0}/plover/log.py +0 -0
  244. {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/__init__.py +0 -0
  245. {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/base.py +0 -0
  246. /plover-5.0.0.dev3/plover/machine/geminipr.py → /plover-5.1.0/plover/machine/gemini_pr.py +0 -0
  247. {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/keyboard.py +0 -0
  248. {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/keyboard_capture/__init__.py +0 -0
  249. {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/keymap.py +0 -0
  250. {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/passport.py +0 -0
  251. {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/stentura.py +0 -0
  252. /plover-5.0.0.dev3/plover/machine/txbolt.py → /plover-5.1.0/plover/machine/tx_bolt.py +0 -0
  253. {plover-5.0.0.dev3 → plover-5.1.0}/plover/macro/__init__.py +0 -0
  254. {plover-5.0.0.dev3 → plover-5.1.0}/plover/macro/repeat.py +0 -0
  255. {plover-5.0.0.dev3 → plover-5.1.0}/plover/macro/retro.py +0 -0
  256. {plover-5.0.0.dev3 → plover-5.1.0}/plover/macro/undo.py +0 -0
  257. {plover-5.0.0.dev3 → plover-5.1.0}/plover/messages/es/LC_MESSAGES/plover.po +0 -0
  258. {plover-5.0.0.dev3 → plover-5.1.0}/plover/messages/fr/LC_MESSAGES/plover.po +0 -0
  259. {plover-5.0.0.dev3 → plover-5.1.0}/plover/messages/it/LC_MESSAGES/plover.po +0 -0
  260. {plover-5.0.0.dev3 → plover-5.1.0}/plover/messages/nl/LC_MESSAGES/plover.po +0 -0
  261. {plover-5.0.0.dev3 → plover-5.1.0}/plover/messages/plover.pot +0 -0
  262. {plover-5.0.0.dev3 → plover-5.1.0}/plover/messages/zh_tw/LC_MESSAGES/plover.po +0 -0
  263. {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/__init__.py +0 -0
  264. {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/attach.py +0 -0
  265. {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/case.py +0 -0
  266. {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/command.py +0 -0
  267. {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/conditional.py +0 -0
  268. {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/currency.py +0 -0
  269. {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/glue.py +0 -0
  270. {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/key_combo.py +0 -0
  271. {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/mode.py +0 -0
  272. {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/punctuation.py +0 -0
  273. {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/word_end.py +0 -0
  274. {plover-5.0.0.dev3 → plover-5.1.0}/plover/misc.py +0 -0
  275. {plover-5.0.0.dev3 → plover-5.1.0}/plover/orthography.py +0 -0
  276. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/__init__.py +0 -0
  277. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/config.py +0 -0
  278. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/controller.py +0 -0
  279. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/__init__.py +0 -0
  280. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/display_server.py +0 -0
  281. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/i18n.py +0 -0
  282. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/keyboardcontrol.py +0 -0
  283. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/keyboardcontrol_x11.py +0 -0
  284. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/log.py +0 -0
  285. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/log_dbus.py +0 -0
  286. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/serial.py +0 -0
  287. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/wmctrl.py +0 -0
  288. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/wmctrl_x11.py +0 -0
  289. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/__init__.py +0 -0
  290. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/i18n.py +0 -0
  291. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/keyboardcontrol.py +0 -0
  292. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/log.py +0 -0
  293. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/serial.py +0 -0
  294. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/wmctrl.py +0 -0
  295. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/__init__.py +0 -0
  296. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/i18n.py +0 -0
  297. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/keyboardcontrol.py +0 -0
  298. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/keyboardlayout.py +0 -0
  299. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/serial.py +0 -0
  300. {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/wmctrl.py +0 -0
  301. {plover-5.0.0.dev3 → plover-5.1.0}/plover/output/__init__.py +0 -0
  302. {plover-5.0.0.dev3 → plover-5.1.0}/plover/output/keyboard.py +0 -0
  303. {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/__init__.py +0 -0
  304. {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/__main__.py +0 -0
  305. {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/global_registry.py +0 -0
  306. {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/local_registry.py +0 -0
  307. {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/package_index.py +0 -0
  308. {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/pip_wrapper.py +0 -0
  309. {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/plugin_metadata.py +0 -0
  310. {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/registry.py +0 -0
  311. {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/requests.py +0 -0
  312. {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/utils.py +0 -0
  313. {plover-5.0.0.dev3 → plover-5.1.0}/plover/registry.py +0 -0
  314. {plover-5.0.0.dev3 → plover-5.1.0}/plover/resource.py +0 -0
  315. {plover-5.0.0.dev3 → plover-5.1.0}/plover/scripts/__init__.py +0 -0
  316. {plover-5.0.0.dev3 → plover-5.1.0}/plover/scripts/dist_main.py +0 -0
  317. {plover-5.0.0.dev3 → plover-5.1.0}/plover/scripts/main.py +0 -0
  318. {plover-5.0.0.dev3 → plover-5.1.0}/plover/scripts/send_command.py +0 -0
  319. {plover-5.0.0.dev3 → plover-5.1.0}/plover/steno.py +0 -0
  320. {plover-5.0.0.dev3 → plover-5.1.0}/plover/steno_dictionary.py +0 -0
  321. {plover-5.0.0.dev3 → plover-5.1.0}/plover/suggestions.py +0 -0
  322. {plover-5.0.0.dev3 → plover-5.1.0}/plover/system/__init__.py +0 -0
  323. {plover-5.0.0.dev3 → plover-5.1.0}/plover/translation.py +0 -0
  324. {plover-5.0.0.dev3 → plover-5.1.0}/plover.egg-info/dependency_links.txt +0 -0
  325. {plover-5.0.0.dev3 → plover-5.1.0}/plover.egg-info/top_level.txt +0 -0
  326. {plover-5.0.0.dev3 → plover-5.1.0}/plover.egg-info/zip-safe +0 -0
  327. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/__init__.py +0 -0
  328. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/check_requirements.py +0 -0
  329. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/get_pip.py +0 -0
  330. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/install_wheels.py +0 -0
  331. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/pyqt.py +0 -0
  332. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/setup.py +0 -0
  333. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/source_less.py +0 -0
  334. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/__init__.py +0 -0
  335. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/blackbox.py +0 -0
  336. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/dict.py +0 -0
  337. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/output.py +0 -0
  338. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/parametrize.py +0 -0
  339. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/steno.py +0 -0
  340. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/steno_dictionary.py +0 -0
  341. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/tree.py +0 -0
  342. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/trim.py +0 -0
  343. {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/zipdir.py +0 -0
  344. {plover-5.0.0.dev3 → plover-5.1.0}/pyproject.toml +0 -0
  345. {plover-5.0.0.dev3 → plover-5.1.0}/pytest.ini +0 -0
  346. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/bootstrap.txt +0 -0
  347. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/build.txt +0 -0
  348. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/ci.txt +0 -0
  349. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/code_quality.txt +0 -0
  350. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/dev.txt +0 -0
  351. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/dist_extra_gui_qt.txt +0 -0
  352. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/dist_extra_log.txt +0 -0
  353. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/packaging.txt +0 -0
  354. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/release.txt +0 -0
  355. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/setup.txt +0 -0
  356. {plover-5.0.0.dev3 → plover-5.1.0}/reqs/test.txt +0 -0
  357. {plover-5.0.0.dev3 → plover-5.1.0}/test/__init__.py +0 -0
  358. {plover-5.0.0.dev3 → plover-5.1.0}/test/conftest.py +0 -0
  359. {plover-5.0.0.dev3 → plover-5.1.0}/test/gui_qt/__init__.py +0 -0
  360. {plover-5.0.0.dev3 → plover-5.1.0}/test/gui_qt/test_steno_validator.py +0 -0
  361. {plover-5.0.0.dev3 → plover-5.1.0}/test/py37compat.py +0 -0
  362. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_blackbox.py +0 -0
  363. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_command.py +0 -0
  364. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_config.py +0 -0
  365. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_default_dict.py +0 -0
  366. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_formatting.py +0 -0
  367. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_json_dict.py +0 -0
  368. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_key_combo.py +0 -0
  369. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_keyboard.py +0 -0
  370. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_keymap.py +0 -0
  371. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_log.py +0 -0
  372. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_machine.py +0 -0
  373. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_misc.py +0 -0
  374. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_orthography.py +0 -0
  375. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_passport.py +0 -0
  376. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_resource.py +0 -0
  377. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_rtfcre_dict.py +0 -0
  378. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_steno.py +0 -0
  379. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_steno_dictionary.py +0 -0
  380. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_stentura.py +0 -0
  381. {plover-5.0.0.dev3 → plover-5.1.0}/test/test_translation.py +0 -0
  382. {plover-5.0.0.dev3 → plover-5.1.0}/windows/README.md +0 -0
  383. {plover-5.0.0.dev3 → plover-5.1.0}/windows/dist_blacklist.txt +0 -0
  384. {plover-5.0.0.dev3 → plover-5.1.0}/windows/dist_deps.sh +0 -0
  385. {plover-5.0.0.dev3 → plover-5.1.0}/windows/installer.bmp +0 -0
  386. {plover-5.0.0.dev3 → plover-5.1.0}/windows/installer.nsi +0 -0
@@ -2,7 +2,7 @@
2
2
  Version 2, June 1991
3
3
 
4
4
  Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
5
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
5
+ <https://fsf.org/>
6
6
  Everyone is permitted to copy and distribute verbatim copies
7
7
  of this license document, but changing it is not allowed.
8
8
 
@@ -304,8 +304,7 @@ the "copyright" line and a pointer to where the full notice is found.
304
304
  GNU General Public License for more details.
305
305
 
306
306
  You should have received a copy of the GNU General Public License along
307
- with this program; if not, write to the Free Software Foundation, Inc.,
308
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
307
+ with this program; if not, see <https://www.gnu.org/licenses/>.
309
308
 
310
309
  Also add information on how to contact you by electronic and paper mail.
311
310
 
@@ -329,8 +328,8 @@ necessary. Here is a sample; alter the names:
329
328
  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
330
329
  `Gnomovision' (which makes passes at compilers) written by James Hacker.
331
330
 
332
- <signature of Ty Coon>, 1 April 1989
333
- Ty Coon, President of Vice
331
+ <signature of Moe Ghoul>, 1 April 1989
332
+ Moe Ghoul, President of Vice
334
333
 
335
334
  This General Public License does not permit incorporating your program into
336
335
  proprietary programs. If your program is a subroutine library, you may
@@ -33,6 +33,7 @@ include test/*.py
33
33
  include test/gui_qt/*.py
34
34
  include tox.ini
35
35
  include windows/*
36
+ exclude dev/*
36
37
  exclude .pre-commit-config.yaml
37
38
  # without first including it, exluding .readthedocs.yml results in a warning when running locally
38
39
  include .readthedocs.yml
@@ -1,3 +1,64 @@
1
+ # v5.1.0 (2025-11-04)
2
+
3
+
4
+ ## Features
5
+
6
+ ### Core
7
+
8
+ - Add support for Plover HID protocol based on plover-machine-hid plugin by dnaq. (#1777)
9
+
10
+ ### User Interface
11
+
12
+ - Dynamically update individual status icons while loading dictionaries. (#1400)
13
+
14
+ ### macOS
15
+
16
+ - Add code signing and notarization for macOS app. (#1769)
17
+
18
+ ## Bugfixes
19
+
20
+ ### Core
21
+
22
+ - Update frontmatter in GPLv2 license file; no substantive change to the license (#1779)
23
+
24
+ ## API
25
+
26
+ No significant changes.
27
+
28
+ # v5.0.0 (2025-09-10)
29
+
30
+
31
+ ## Features
32
+
33
+ No significant changes.
34
+
35
+ ## Bugfixes
36
+
37
+ No significant changes.
38
+
39
+ ## API
40
+
41
+ No significant changes.
42
+
43
+ # v5.0.0rc1 (2025-09-02)
44
+
45
+
46
+ ## Features
47
+
48
+ ### Linux
49
+
50
+ - Refactor Uinput to use pipe instead of select with timeout. (#1760)
51
+ - Passthrough keyboard shortcuts. (#1761)
52
+ - Uinput: refactor initialization and cleanup. (#1765)
53
+
54
+ ## Bugfixes
55
+
56
+ No significant changes.
57
+
58
+ ## API
59
+
60
+ No significant changes.
61
+
1
62
  # v5.0.0.dev3 (2025-07-14)
2
63
 
3
64
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plover
3
- Version: 5.0.0.dev3
3
+ Version: 5.1.0
4
4
  Summary: Open Source Stenography Software
5
5
  Home-page: http://www.openstenoproject.org/
6
6
  Download-URL: http://www.openstenoproject.org/plover
@@ -35,6 +35,7 @@ Description-Content-Type: text/markdown
35
35
  License-File: LICENSE.txt
36
36
  Requires-Dist: appdirs
37
37
  Requires-Dist: appnope; "darwin" in sys_platform
38
+ Requires-Dist: hid
38
39
  Requires-Dist: pkginfo
39
40
  Requires-Dist: plover-stroke
40
41
  Requires-Dist: plyer; "win32" in sys_platform
@@ -123,13 +123,8 @@ jobs completed successfully.
123
123
  ### PyPI release
124
124
 
125
125
  On *tagged* release, the source distribution and wheel are published
126
- to PyPI.
126
+ to PyPI via [Trusted Publishing](https://docs.pypi.org/trusted-publishers/).
127
127
 
128
- For this to work, a valid [PyPI token](https://pypi.org/help/#apitoken)
129
- must be configured: the `PYPI_TOKEN` secret of the `release`
130
- [environment](https://docs.github.com/en/actions/reference/environments)
131
- will be used. Additionally, the optional `PYPI_URL` secret can be set to
132
- use another PyPI compatible index (e.g. Test PyPI).
133
128
 
134
129
  ### GitHub release
135
130
 
@@ -6,7 +6,7 @@ project = "Plover"
6
6
  copyright = "Open Steno Project"
7
7
  author = copyright
8
8
 
9
- release = "5.0.0.dev3"
9
+ release = "5.1.0"
10
10
  version = release
11
11
 
12
12
  # -- General configuration ---------------------------------------------------
@@ -13,9 +13,12 @@ environment created using tools like [venv](https://docs.python.org/3/library/ve
13
13
  This helps keep your global Python environment clean, avoids project conflicts, and
14
14
  isolates tox and its dependencies.
15
15
 
16
- A typical setup looks like this:
16
+ You also need [CMake](https://cmake.org) to build [hidapi](https://github.com/libusb/hidapi) from source which is required for Plover HID support.
17
+
18
+ A typical development setup looks like this, assuming that `python` has the correct version:
17
19
 
18
20
  ### Linux/macOS (Bash):
21
+
19
22
  ```bash
20
23
  cd path/to/plover
21
24
  python -m venv .venv
@@ -24,9 +27,13 @@ pip install -r reqs/dev.txt
24
27
  pre-commit install
25
28
  pre-commit run --all-files
26
29
  tox
30
+ tox -e launch -- -l debug
27
31
  ```
28
32
 
29
33
  ### Windows (PowerShell):
34
+
35
+ This assumes that you installed a Git version that includes Git Bash.
36
+
30
37
  ```powershell
31
38
  cd path\to\plover
32
39
  python -m venv .venv
@@ -34,9 +41,11 @@ python -m venv .venv
34
41
  pip install -r reqs\dev.txt
35
42
  pre-commit install
36
43
  pre-commit run --all-files
37
- tox
44
+ & "C:\Program Files\Git\bin\bash.exe" -lc "tox"
45
+ & "C:\Program Files\Git\bin\bash.exe" -lc "tox -e launch -- -l debug"
38
46
  ```
39
- Some features require a Bash shell, so on Windows you may need to use Git Bash or WSL instead of PowerShell.
47
+
48
+ Some features require a Bash shell, which is why on Windows you need to run commands through Git Bash or similar.
40
49
 
41
50
  ## Tox
42
51
 
@@ -39,12 +39,13 @@ There are two ways to install plugins:
39
39
 
40
40
  Plover comes with the following machine plugins installed:
41
41
 
42
- - Keyboard
43
42
  - Gemini PR
44
- - TX Bolt
43
+ - Keyboard
45
44
  - Passport
45
+ - Plover HID
46
46
  - ProCAT
47
47
  - Stentura
48
+ - TX Bolt
48
49
 
49
50
  - **Systems**: Define new key layouts and theories. This lets Plover support
50
51
  stenographic layouts other than the standard American Stenotype system,
@@ -2,6 +2,7 @@
2
2
 
3
3
  set -e
4
4
 
5
+ . ./plover_build_utils/deps.sh
5
6
  . ./plover_build_utils/functions.sh
6
7
 
7
8
  topdir="$PWD"
@@ -196,6 +197,34 @@ run "$linuxdeploy" \
196
197
  # Install Plover and dependencies.
197
198
  bootstrap_dist "$wheel"
198
199
 
200
+ # ------- Start: Build & bundle hidapi from source -------
201
+ hidapi_src="$builddir/hidapi-src"
202
+ hidapi_bld="$builddir/hidapi-build"
203
+
204
+ . ./linux/build_hidapi.sh
205
+
206
+ echo "Downloading and unpacking hidapi ${hidapi_version}…"
207
+ fetch_hidapi "$hidapi_src" "$builddir"
208
+
209
+ echo "Building hidapi…"
210
+ cmake_build_linux "$hidapi_src" "$hidapi_bld" "Release"
211
+
212
+ # Locate the produced .so
213
+ hidapi_so="$(find "$hidapi_bld" -name 'libhidapi-hidraw.so*' -type f -print -quit)"
214
+ if [ -z "$hidapi_so" ] || [ ! -f "$hidapi_so" ]; then
215
+ echo "Error: built libhidapi-hidraw.so not found." >&2
216
+ exit 3
217
+ fi
218
+
219
+ # Bundle into the AppDir's lib directory
220
+ run cp -v "$hidapi_so" "$appdir/usr/lib/"
221
+ base="$(basename "$hidapi_so")"
222
+ # Add symlink for unversioned .so if needed
223
+ if [ ! -e "$appdir/usr/lib/libhidapi-hidraw.so" ]; then
224
+ ln -s "$base" "$appdir/usr/lib/libhidapi-hidraw.so"
225
+ fi
226
+ # ------- End: Build & bundle hidapi from source -------
227
+
199
228
  # Trim the fat, second pass.
200
229
  run "$python" -m plover_build_utils.trim "$appdir" "$builddir/blacklist.txt"
201
230
 
@@ -0,0 +1,8 @@
1
+ cmake_build_linux() {
2
+ local src="$1" bld="$2" config="${3:-Release}"
3
+ rm -rf "$bld"
4
+ cmake -S "$src" -B "$bld" \
5
+ -DBUILD_SHARED_LIBS=ON \
6
+ -DCMAKE_BUILD_TYPE="$config"
7
+ cmake --build "$bld" --config "$config" --parallel
8
+ }
@@ -0,0 +1,9 @@
1
+ cmake_build_macos() {
2
+ local src="$1" bld="$2" arches="$3" config="${4:-Release}"
3
+ rm -rf "$bld"
4
+ cmake -S "$src" -B "$bld" \
5
+ -DBUILD_SHARED_LIBS=ON \
6
+ -DCMAKE_BUILD_TYPE="$config" \
7
+ -DCMAKE_OSX_ARCHITECTURES="$arches"
8
+ cmake --build "$bld" --config "$config" --parallel
9
+ }
@@ -2,6 +2,7 @@
2
2
 
3
3
  set -e
4
4
 
5
+ . ./plover_build_utils/deps.sh
5
6
  . ./plover_build_utils/functions.sh
6
7
 
7
8
  topdir="$PWD"
@@ -14,6 +15,7 @@ plover_wheel="$1"
14
15
  . ./osx/deps.sh
15
16
 
16
17
  py_version="$py_installer_version"
18
+ bundle_id="org.openstenoproject.plover"
17
19
 
18
20
  echo "Making Plover.app with Plover wheel $plover_wheel."
19
21
 
@@ -34,23 +36,29 @@ py_binary="$py_home/bin/python${py_version%.*}"
34
36
 
35
37
  # Extract Python binary from launcher and fix its references.
36
38
  run mv "$py_home/Resources/Python.app/Contents/MacOS/Python" "$py_binary"
37
- run install_name_tool -rpath "@executable_path/../../../../../../" "@executable_path/../../../" "$py_binary"
38
- # Remove the codesignature so that we can change the identifier for notifications.
39
- run /usr/bin/codesign -s - --deep --force "$py_binary"
40
- run tee "$py_home/bin/Info.plist" <<\EOF
39
+
40
+ echo "Rewrite runtime search path of Python binary with install_name_tool..."
41
+ run_quiet install_name_tool -rpath "@executable_path/../../../../../../" "@executable_path/../../../" "$py_binary"
42
+ echo "Rewrite runtime search path complete"
43
+
44
+ echo "Ad-hoc signing the Python binary after install_name_tool invalidated signature..."
45
+ run_quiet /usr/bin/codesign -s - --force "$py_binary"
46
+ echo "Ad-hoc signing complete"
47
+
48
+ run tee "$py_home/bin/Info.plist" <<EOF
41
49
  <?xml version="1.0" encoding="UTF-8"?>
42
50
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
43
51
  <plist version="1.0">
44
52
  <dict>
45
53
  <key>CFBundleIdentifier</key>
46
- <string>org.openstenoproject.plover</string>
54
+ <string>${bundle_id}</string>
47
55
  </dict>
48
56
  </plist>
49
57
  EOF
50
58
 
51
59
  # Switch to target Python.
52
60
  SSL_CERT_FILE="$("$python" -m certifi)"
53
- run_eval "appdir_python() { env PYTHONNOUSERSITE=1 "$py_home/bin/python" \"\$@\"; }"
61
+ run_eval "appdir_python() { env PYTHONNOUSERSITE=1 \"$py_home/bin/python\" \"\$@\"; }"
54
62
  run_eval "export SSL_CERT_FILE='$SSL_CERT_FILE'"
55
63
  run_eval "unset __PYVENV_LAUNCHER__"
56
64
  python='appdir_python'
@@ -58,6 +66,37 @@ python='appdir_python'
58
66
  # Install Plover and dependencies.
59
67
  bootstrap_dist "$plover_wheel"
60
68
 
69
+ # ------- Start: Build & bundle hidapi from source -------
70
+ . ./osx/build_hidapi.sh
71
+
72
+ hidapi_src="$builddir/hidapi-src"
73
+ hidapi_bld="$builddir/hidapi-build"
74
+
75
+ echo "Downloading and unpacking hidapi ${hidapi_version}…"
76
+ fetch_hidapi "$hidapi_src" "$builddir"
77
+
78
+ echo "Building hidapi…"
79
+ cmake_build_macos "$hidapi_src" "$hidapi_bld" "x86_64;arm64" "Release"
80
+
81
+ # Locate the produced dylib
82
+ hidapi_dylib="$(/usr/bin/find "$hidapi_bld" -name 'libhidapi*.dylib' -type f -print -quit)"
83
+ if [ -z "$hidapi_dylib" ] || [ ! -f "$hidapi_dylib" ]; then
84
+ echo "Error: built libhidapi*.dylib not found." >&2
85
+ exit 3
86
+ fi
87
+
88
+ # Bundle into the app's Frameworks directory
89
+ run cp "$hidapi_dylib" "$frameworks_dir/"
90
+ base="$(basename "$hidapi_dylib")"
91
+
92
+ # Add alias to Frameworks dir
93
+ ln -sfn "$base" "$frameworks_dir/libhidapi.dylib"
94
+
95
+ # Add RPATH to the Python binary itself and re-sign it
96
+ run install_name_tool -add_rpath "@executable_path/../../../../../Frameworks" "$py_binary"
97
+ run /usr/bin/codesign -f -s - "$py_binary"
98
+ # ------- End: Build & bundle hidapi from source -------
99
+
61
100
  # Create launcher.
62
101
  run gcc -Wall -O2 -arch x86_64 -arch arm64 'osx/app_resources/plover_launcher.c' -o "$macos_dir/Plover"
63
102
 
@@ -87,4 +126,5 @@ run "$python" -I -m plover_build_utils.check_requirements
87
126
  # Ad-hoc signing to satisfy Gatekeeper.
88
127
  run /usr/bin/codesign -s - --deep --force "$appdir"
89
128
 
129
+ # Move the finished app to dist.
90
130
  run mv "$appdir" "$distdir"
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ topdir="$PWD"
5
+
6
+ . ./plover_build_utils/functions.sh
7
+
8
+ PLATFORM="${1:-}"
9
+ PACKAGE="${2:-}"
10
+ if [[ -z "$PLATFORM" || -z "$PACKAGE" ]]; then
11
+ echo "❌ Usage: $0 <platform-string> <package>" >&2
12
+ echo " e.g.: $0 macosx_12_0_universal2 plover-5.0.0" >&2
13
+ exit 1
14
+ fi
15
+
16
+ APP="$topdir/dist/Plover.app"
17
+ [[ -d "$APP" ]] || { echo "❌ App not found: $APP. Run bdist_app first."; exit 1; }
18
+
19
+ DMG="$topdir/dist/${PACKAGE}-${PLATFORM}.dmg"
20
+
21
+ # Build DMG via dmgbuild
22
+ echo "Building DMG → $DMG"
23
+ python3 -m dmgbuild -s osx/dmg_resources/settings.py "Plover" "$DMG"
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ # Sign and notarize + staple a .dmg image.
5
+ # Enabled with:
6
+ # MACOS_NOTARIZE_ENABLED=1
7
+ # Required envs when notarization is enabled:
8
+ # MACOS_CODESIGN_IDENTITY
9
+ # MACOS_NOTARIZE_TEAM_ID
10
+ # MACOS_NOTARIZE_KEY_ID
11
+ # MACOS_NOTARIZE_ISSUER_ID
12
+ # MACOS_NOTARIZE_KEY_CONTENTS
13
+ # Optional:
14
+ # MACOS_CODESIGN_KEYCHAIN, e.g. plover-dev.keychain
15
+
16
+ topdir="$PWD"
17
+ builddir="$topdir/build/osxapp"
18
+ APP="$topdir/dist/Plover.app"
19
+
20
+ notarize_enabled="${MACOS_NOTARIZE_ENABLED:-0}"
21
+ if [[ "$notarize_enabled" != "1" ]]; then
22
+ echo "ℹ️ Skipping notarization of $APP (MACOS_NOTARIZE_ENABLED=$notarize_enabled)"
23
+ return 0
24
+ fi
25
+
26
+ . ./plover_build_utils/functions.sh
27
+ . ./osx/notarize_common.sh
28
+
29
+ # --- Codesign ---
30
+ require_env MACOS_CODESIGN_IDENTITY
31
+ echo "Signing with identity: $MACOS_CODESIGN_IDENTITY ..."
32
+ # Make sure the build directory exists for the entitlements file
33
+ mkdir -p "$builddir"
34
+ ent_plist="$builddir/entitlements.plist"
35
+ cat >"$ent_plist" <<'EOS'
36
+ <?xml version="1.0" encoding="UTF-8"?>
37
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
38
+ <plist version="1.0">
39
+ <dict>
40
+ <key>com.apple.security.cs.disable-library-validation</key><true/>
41
+ </dict>
42
+ </plist>
43
+ EOS
44
+
45
+ # Build common codesign args
46
+ cs_args=(--force --timestamp --options runtime --entitlements "$ent_plist" -s "$MACOS_CODESIGN_IDENTITY")
47
+ if [[ -n "${MACOS_CODESIGN_KEYCHAIN:-}" ]]; then
48
+ cs_args+=(--keychain "$MACOS_CODESIGN_KEYCHAIN")
49
+ echo "Using keychain: $MACOS_CODESIGN_KEYCHAIN"
50
+ fi
51
+
52
+ # 1) Sign all Mach-O binaries first: *.dylib, *.so, and the actual executables inside
53
+ # framework Versions directories. This ensures their _CodeSignature folders exist
54
+ # before we sign the framework bundle itself, preventing resource seal mismatches.
55
+ while IFS= read -r -d '' f; do
56
+ run_quiet /usr/bin/codesign "${cs_args[@]}" "$f"
57
+ done < <(find "$APP/Contents" -type f \
58
+ \( -name "*.dylib" -o -name "*.so" -o \
59
+ \( -path "*/*.framework/Versions/*" -perm -111 \) \
60
+ \) -print0)
61
+
62
+ # 2) Now sign framework bundles depth-first, after their contents are signed.
63
+ while IFS= read -r -d '' fw; do
64
+ run_quiet /usr/bin/codesign "${cs_args[@]}" "$fw"
65
+ done < <(find "$APP/Contents" -depth -type d -name "*.framework" -print0)
66
+
67
+ # 3) Sign the main executable and then the app bundle.
68
+ run_quiet /usr/bin/codesign "${cs_args[@]}" "$APP/Contents/MacOS/Plover"
69
+ run_quiet /usr/bin/codesign "${cs_args[@]}" "$APP"
70
+
71
+ echo "Verifying signature..."
72
+ run_quiet /usr/bin/codesign --verify --deep --strict "$APP"
73
+ run_quiet /usr/bin/codesign --verify --deep --strict "$APP/Contents/Frameworks/Python.framework"
74
+ echo "✅ Code signing complete"
75
+ # --- End codesign ---
76
+
77
+ # Notarize & staple app
78
+ notarize_and_staple "$APP"
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ notarize_and_staple() {
5
+ local path=$1
6
+ require_env MACOS_NOTARIZE_TEAM_ID
7
+ require_env MACOS_NOTARIZE_KEY_ID
8
+ require_env MACOS_NOTARIZE_ISSUER_ID
9
+ require_env MACOS_NOTARIZE_KEY_CONTENTS
10
+
11
+ local workdir; workdir="$(mktemp -d)"; trap 'rm -rf "$workdir"' RETURN
12
+ local zip="$workdir/$(basename "$path").zip"
13
+ echo "Zipping for notarization → $zip"
14
+ ditto -c -k --keepParent "$path" "$zip"
15
+
16
+ local key_path="$workdir/AuthKey_${MACOS_NOTARIZE_KEY_ID}.p8"
17
+ umask 077
18
+ printf '%s' "$MACOS_NOTARIZE_KEY_CONTENTS" > "$key_path"
19
+
20
+ echo "Submitting to notary service (team=$MACOS_NOTARIZE_TEAM_ID, key_id=$MACOS_NOTARIZE_KEY_ID)…"
21
+ xcrun notarytool submit "$zip" \
22
+ --key "$key_path" \
23
+ --key-id "$MACOS_NOTARIZE_KEY_ID" \
24
+ --issuer "$MACOS_NOTARIZE_ISSUER_ID" \
25
+ --team-id "$MACOS_NOTARIZE_TEAM_ID" \
26
+ --wait --timeout 20m --progress
27
+
28
+ echo "Stapling ticket to $path..."
29
+ xcrun stapler staple "$path"
30
+ echo "Validating staple for $path..."
31
+ xcrun stapler validate "$path"
32
+ echo "✅ Notarization complete for $path"
33
+ }
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+
4
+ # Sign and notarize + staple a .dmg image.
5
+ # Enabled with:
6
+ # MACOS_NOTARIZE_ENABLED=1
7
+ # Required envs when notarization is enabled:
8
+ # MACOS_CODESIGN_IDENTITY
9
+ # MACOS_NOTARIZE_TEAM_ID
10
+ # MACOS_NOTARIZE_KEY_ID
11
+ # MACOS_NOTARIZE_ISSUER_ID
12
+ # MACOS_NOTARIZE_KEY_CONTENTS
13
+ # Optional:
14
+ # MACOS_CODESIGN_KEYCHAIN, e.g. plover-dev.keychain
15
+
16
+ dmg_path="${1:-}"
17
+ if [[ -z "$dmg_path" || ! -f "$dmg_path" ]]; then
18
+ echo "❌ Usage: $0 /path/to/file.dmg" >&2
19
+ exit 1
20
+ fi
21
+
22
+ . ./plover_build_utils/functions.sh
23
+ . ./osx/notarize_common.sh
24
+
25
+ notarize_enabled="${MACOS_NOTARIZE_ENABLED:-0}"
26
+ if [[ "$notarize_enabled" != "1" ]]; then
27
+ echo "ℹ️ Skipping DMG signing & notarization (MACOS_NOTARIZE_ENABLED=$notarize_enabled)"
28
+ exit 0
29
+ fi
30
+
31
+ # --- Codesign ---
32
+ require_env MACOS_CODESIGN_IDENTITY
33
+ echo "Signing with identity $MACOS_CODESIGN_IDENTITY: $dmg_path"
34
+
35
+ cs_args=(--force --timestamp -s "$MACOS_CODESIGN_IDENTITY")
36
+ if [[ -n "${MACOS_CODESIGN_KEYCHAIN:-}" ]]; then
37
+ cs_args+=(--keychain "$MACOS_CODESIGN_KEYCHAIN")
38
+ echo "Using keychain: $MACOS_CODESIGN_KEYCHAIN"
39
+ fi
40
+ run_quiet /usr/bin/codesign "${cs_args[@]}" "$dmg_path"
41
+
42
+ echo "✅ Code signing complete"
43
+ # --- End codesign ---
44
+
45
+ # Notarize & staple DMG
46
+ notarize_and_staple "$dmg_path"
47
+
48
+ echo "🎉 DMG ready: $dmg_path"
@@ -13,7 +13,7 @@ else:
13
13
  # want to translate anyway.
14
14
  _ = lambda s: s
15
15
 
16
- __version__ = "5.0.0.dev3"
16
+ __version__ = "5.1.0"
17
17
  __copyright__ = "(C) Open Steno Project"
18
18
  __url__ = "http://www.openstenoproject.org/"
19
19
  __download_url__ = "http://www.openstenoproject.org/plover"
@@ -7,13 +7,19 @@ import threading
7
7
  import time
8
8
 
9
9
  from plover.dictionary.base import load_dictionary
10
- from plover.exception import DictionaryLoaderException
11
10
  from plover.resource import resource_timestamp
12
11
  from plover import log
13
12
 
14
13
 
15
14
  class DictionaryLoadingManager:
16
- def __init__(self):
15
+ def __init__(self, state_change_callback):
16
+ """
17
+ Parameters:
18
+ state_change_callback -- A function that will be called when any dictionary is loaded
19
+ with two parameters: the filename and the loaded StenoDictionary object
20
+ (or an instance of ErroredDictionary if the load fails).
21
+ """
22
+ self._state_change_callback = state_change_callback
17
23
  self.dictionaries = {}
18
24
 
19
25
  def __len__(self):
@@ -32,7 +38,7 @@ class DictionaryLoadingManager:
32
38
  log.info(
33
39
  "%s dictionary: %s", "loading" if op is None else "reloading", filename
34
40
  )
35
- op = DictionaryLoadingOperation(filename)
41
+ op = DictionaryLoadingOperation(filename, self._state_change_callback)
36
42
  self.dictionaries[filename] = op
37
43
  return op
38
44
 
@@ -52,7 +58,15 @@ class DictionaryLoadingManager:
52
58
 
53
59
 
54
60
  class DictionaryLoadingOperation:
55
- def __init__(self, filename):
61
+ def __init__(self, filename, state_change_callback):
62
+ """
63
+ Parameters:
64
+ filename -- Path to dictionary file.
65
+ state_change_callback -- A function that will be called when the load is finished
66
+ with two parameters: the filename and the loaded StenoDictionary object
67
+ (or an instance of ErroredDictionary if the load fails).
68
+ """
69
+ self._state_change_callback = state_change_callback
56
70
  self.loading_thread = threading.Thread(target=self.load)
57
71
  self.filename = filename
58
72
  self.result = None
@@ -87,8 +101,11 @@ class DictionaryLoadingOperation:
87
101
  self.result = load_dictionary(self.filename)
88
102
  except Exception as e:
89
103
  log.debug("loading dictionary %s failed", self.filename, exc_info=True)
90
- self.result = DictionaryLoaderException(self.filename, e)
104
+ from plover.engine import ErroredDictionary
105
+
106
+ self.result = ErroredDictionary(self.filename, e)
91
107
  self.result.timestamp = timestamp
108
+ self._state_change_callback(self.filename, self.result)
92
109
 
93
110
  def get(self):
94
111
  self.loading_thread.join()