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.
- {plover-5.0.0.dev3 → plover-5.1.0}/LICENSE.txt +4 -5
- {plover-5.0.0.dev3 → plover-5.1.0}/MANIFEST.in +1 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/NEWS.md +61 -0
- {plover-5.0.0.dev3/plover.egg-info → plover-5.1.0}/PKG-INFO +2 -1
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/ci.md +1 -6
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/conf.py +1 -1
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/developer_guide.md +12 -3
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugins.md +3 -2
- {plover-5.0.0.dev3 → plover-5.1.0}/linux/appimage/build.sh +29 -0
- plover-5.1.0/linux/build_hidapi.sh +8 -0
- plover-5.1.0/osx/build_hidapi.sh +9 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/osx/make_app.sh +46 -6
- plover-5.1.0/osx/make_dmg.sh +23 -0
- plover-5.1.0/osx/notarize_app.sh +78 -0
- plover-5.1.0/osx/notarize_common.sh +33 -0
- plover-5.1.0/osx/notarize_dmg.sh +48 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/__init__.py +1 -1
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/loading_manager.py +22 -5
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/engine.py +11 -11
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/exception.py +0 -12
- plover-5.1.0/plover/gui_qt/config_plover_hid_widget.ui +145 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/dictionaries_widget.py +9 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/engine.py +6 -1
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/machine_options.py +53 -1
- plover-5.1.0/plover/machine/plover_hid.py +312 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/procat.py +1 -1
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/keyboardcontrol_uinput.py +137 -37
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/keyboardlayout.py +4 -1
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/log.py +28 -6
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/system/english_stenotype.py +53 -0
- {plover-5.0.0.dev3 → plover-5.1.0/plover.egg-info}/PKG-INFO +2 -1
- {plover-5.0.0.dev3 → plover-5.1.0}/plover.egg-info/SOURCES.txt +12 -2
- {plover-5.0.0.dev3 → plover-5.1.0}/plover.egg-info/entry_points.txt +5 -3
- {plover-5.0.0.dev3 → plover-5.1.0}/plover.egg-info/requires.txt +1 -0
- plover-5.1.0/plover_build_utils/deps.sh +2 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/download.py +5 -2
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/functions.sh +80 -17
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/constraints.txt +2 -1
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/dist.txt +1 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/setup.cfg +8 -6
- {plover-5.0.0.dev3 → plover-5.1.0}/setup.py +74 -12
- {plover-5.0.0.dev3 → plover-5.1.0}/test/gui_qt/test_dictionaries_widget.py +5 -1
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_engine.py +6 -7
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_loading_manager.py +5 -5
- {plover-5.0.0.dev3 → plover-5.1.0}/tox.ini +23 -2
- plover-5.1.0/windows/build_hidapi.sh +19 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/windows/dist_build.sh +24 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/CONTRIBUTING.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/README.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/SCOWL_README.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/board-layout.png +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/custom.css +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/de-speech.png +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/dolores.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/engine-flow.png +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/favicon.ico +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/jp-speech.png +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/keys-layout.png +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/_static/uncomfortable.png +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/_templates/breadcrumbs.html +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/_templates/layout.html +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/add_translation.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/config.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/dictionary.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/dictionary_lib.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/engine.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/exception.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/formatting.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/i18n.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/key_combo.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/log.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/machine.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/machine_keyboard_capture.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/machine_keymap.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/misc.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/orthography.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer_config.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer_controller.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer_i18n.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer_keyboardcontrol.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer_log.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/oslayer_wmctrl.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/output.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/plover.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/plover_stroke.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/qt.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/registry.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/resource.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/steno.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/steno_dictionary.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/suggestions.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/system.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api/translation.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/api_reference.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/basic_usage.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/cli_reference.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/configuration.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/contributing.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/design.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/dict_editor.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/dict_formats.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/dictionaries.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/hardware_communication.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/hardware_setup.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/i18n.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/index.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/installation.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/internals.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/platform_layer.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/commands.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/dictionaries.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/extensions.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/gui_tools.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/machines.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/macros.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/metas.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/publishing.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/setup.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin-dev/systems.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/plugin_dev.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/releases.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/requirements.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/system-dev/board-layout.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/system-dev/key-arrangement.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/system-dev/layout-test.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/system-dev/steno-system.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/system-dev/system.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/system_dev.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/doc/translation_language.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/linux/README.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/linux/appimage/Dockerfile +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/linux/appimage/apprun.sh +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/linux/appimage/blacklist.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/linux/appimage/deps.sh +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/linux/appimage/pyinfo.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/linux/plover.desktop +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/news.d/api/.gitignore +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/news.d/bugfix/.gitignore +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/news.d/feature/.gitignore +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/news.d/template.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/osx/README.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/osx/app_resources/Info.plist +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/osx/app_resources/dist_blacklist.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/osx/app_resources/plover.icns +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/osx/app_resources/plover_launcher.c +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/osx/deps.sh +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/osx/dmg_resources/background.png +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/osx/dmg_resources/background.psd +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/osx/dmg_resources/background@2x.png +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/osx/dmg_resources/settings.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/__main__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/american_english_words.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/commands.json +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/main.json +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/plover-icon.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/plover.ico +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/plover.png +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/assets/user.json +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/command/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/command/set_config.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/config.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/base.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/helpers.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/json_dict.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/rtfcre_dict.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/dictionary/rtfcre_parse.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/formatting.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_none/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_none/add_translation.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_none/engine.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_none/main.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/about_dialog.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/about_dialog.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/add_translation_dialog.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/add_translation_dialog.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/add_translation_widget.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/add_translation_widget.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/config_file_widget.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/config_keyboard_widget.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/config_serial_widget.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/config_window.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/config_window.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/console_widget.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/console_widget.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/dictionaries_widget.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/dictionary_editor.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/dictionary_editor.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/info_browser.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/log_qt.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/lookup_dialog.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/lookup_dialog.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/main.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/main_window.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/main_window.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/paper_tape.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/paper_tape.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/plugins_manager.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/plugins_manager.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/add.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/dictionary_error.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/dictionary_favorite.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/dictionary_loading.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/dictionary_normal.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/dictionary_readonly.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/down.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/folder.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/font_selector.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/git.png +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/lightbulb.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/lookup.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/pencil.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/pin.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/plover.png +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/plugins_manager.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/reconnect.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/remove.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/save.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/settings.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/state-disabled.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/state-disconnected.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/state-enabled.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/tape.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/translation_add.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/trash.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/undo.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources/up.svg +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/resources.qrc +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/run_dialog.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/run_dialog.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/steno_validator.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/suggestions_dialog.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/suggestions_dialog.ui +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/suggestions_widget.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/tool.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/trayicon.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/gui_qt/utils.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/i18n.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/key_combo.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/log.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/base.py +0 -0
- /plover-5.0.0.dev3/plover/machine/geminipr.py → /plover-5.1.0/plover/machine/gemini_pr.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/keyboard.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/keyboard_capture/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/keymap.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/passport.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/machine/stentura.py +0 -0
- /plover-5.0.0.dev3/plover/machine/txbolt.py → /plover-5.1.0/plover/machine/tx_bolt.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/macro/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/macro/repeat.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/macro/retro.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/macro/undo.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/messages/es/LC_MESSAGES/plover.po +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/messages/fr/LC_MESSAGES/plover.po +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/messages/it/LC_MESSAGES/plover.po +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/messages/nl/LC_MESSAGES/plover.po +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/messages/plover.pot +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/messages/zh_tw/LC_MESSAGES/plover.po +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/attach.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/case.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/command.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/conditional.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/currency.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/glue.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/key_combo.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/mode.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/punctuation.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/meta/word_end.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/misc.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/orthography.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/config.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/controller.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/display_server.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/i18n.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/keyboardcontrol.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/keyboardcontrol_x11.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/log.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/log_dbus.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/serial.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/wmctrl.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/linux/wmctrl_x11.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/i18n.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/keyboardcontrol.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/log.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/serial.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/osx/wmctrl.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/i18n.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/keyboardcontrol.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/keyboardlayout.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/serial.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/oslayer/windows/wmctrl.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/output/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/output/keyboard.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/__main__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/global_registry.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/local_registry.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/package_index.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/pip_wrapper.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/plugin_metadata.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/registry.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/requests.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/plugins_manager/utils.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/registry.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/resource.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/scripts/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/scripts/dist_main.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/scripts/main.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/scripts/send_command.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/steno.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/steno_dictionary.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/suggestions.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/system/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover/translation.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover.egg-info/dependency_links.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover.egg-info/top_level.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover.egg-info/zip-safe +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/check_requirements.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/get_pip.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/install_wheels.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/pyqt.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/setup.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/source_less.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/blackbox.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/dict.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/output.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/parametrize.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/steno.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/testing/steno_dictionary.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/tree.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/trim.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/plover_build_utils/zipdir.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/pyproject.toml +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/pytest.ini +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/bootstrap.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/build.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/ci.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/code_quality.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/dev.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/dist_extra_gui_qt.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/dist_extra_log.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/packaging.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/release.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/setup.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/reqs/test.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/conftest.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/gui_qt/__init__.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/gui_qt/test_steno_validator.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/py37compat.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_blackbox.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_command.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_config.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_default_dict.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_formatting.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_json_dict.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_key_combo.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_keyboard.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_keymap.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_log.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_machine.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_misc.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_orthography.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_passport.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_resource.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_rtfcre_dict.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_steno.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_steno_dictionary.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_stentura.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/test/test_translation.py +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/windows/README.md +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/windows/dist_blacklist.txt +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/windows/dist_deps.sh +0 -0
- {plover-5.0.0.dev3 → plover-5.1.0}/windows/installer.bmp +0 -0
- {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
|
-
|
|
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,
|
|
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
|
|
333
|
-
|
|
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.
|
|
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
|
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
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,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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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()
|