frontengine 1.0.67__tar.gz → 1.0.69__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.
- {frontengine-1.0.67 → frontengine-1.0.69}/PKG-INFO +1 -1
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/pet/desktop_pet.py +10 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/main_ui.py +12 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/menu/settings_menu.py +29 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/pet/pet_setting_ui.py +70 -1
- frontengine-1.0.69/frontengine/utils/input_watch/typing_watch.py +73 -0
- frontengine-1.0.69/frontengine/utils/keep_awake/keep_awake.py +154 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/multi_language/english.py +2 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/multi_language/france.py +2 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/multi_language/germany.py +2 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/multi_language/italy.py +2 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/multi_language/russian.py +2 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/multi_language/simplified_chinese.py +2 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/multi_language/traditional_chinese.py +2 -0
- frontengine-1.0.69/frontengine/utils/workshop/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine.egg-info/PKG-INFO +1 -1
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine.egg-info/SOURCES.txt +3 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/pyproject.toml +1 -1
- {frontengine-1.0.67 → frontengine-1.0.69}/LICENSE +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/README.md +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/__main__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/base_widget.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/camera/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/camera/camera_widget.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/canvas/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/canvas/whiteboard_widget.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/capture/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/capture/region_capture.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/focus_shield/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/focus_shield/focus_shield_widget.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/gif/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/gif/paint_gif.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/image/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/image/paint_image.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/load/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/load/load_someone_make_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/measure/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/measure/measure_widget.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/monitor/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/monitor/monitor_widget.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/notes/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/notes/sticky_note_widget.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/overlay_factory.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/particle/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/particle/particle_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/pet/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/presentation/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/presentation/annotation_overlay.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/presentation/cursor_effects.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/presentation/keystroke_display.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/presentation/magnifier.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/replica/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/replica/replica_widget.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/scene/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/scene/extend_graphic_scene.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/scene/extend_graphic_view.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/scene/scene.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/screen_care/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/screen_care/color_vision_widget.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/screen_care/screen_filter.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/sound_player/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/sound_player/sound_effect.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/sound_player/sound_player.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/spectrum/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/spectrum/spectrum_widget.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/text/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/text/draw_text.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/toast/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/toast/toast_widget.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/video/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/video/video_player.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/wallpaper/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/wallpaper/wallpaper_widget.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/web/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/web/webview.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/window_helpers.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/system_tray/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/system_tray/extend_system_tray.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/color/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/color/global_color.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/app_profile_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/choose_file_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/clipboard_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/hotkey_settings_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/how_to_use_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/reminder_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/remote_control_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/screen_privacy_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/screen_text_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/screensaver_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/signage_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/smart_pause_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/usage_report_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/window_pin_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/dialog/window_replica_dialog.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/menu/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/menu/help_menu.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/menu/how_to_menu.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/menu/language_menu.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/menu/preset_menu.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/nav/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/nav/sidebar.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/control_center/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/control_center/control_center_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/focus/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/focus/focus_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/gif/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/gif/gif_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/image/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/image/image_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/layout_kit.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/particle/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/particle/particle_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/pet/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/presentation/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/presentation/presentation_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/scene_setting/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/scene_setting/scene_manager.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/scene_setting/scene_page/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/scene_setting/scene_page/base_scene_page.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/scene_setting/scene_page/gif.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/scene_setting/scene_page/image.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/scene_setting/scene_page/registry.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/scene_setting/scene_page/sound.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/scene_setting/scene_page/text.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/scene_setting/scene_page/video.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/scene_setting/scene_page/web.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/scene_setting/scene_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/screen_care/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/screen_care/screen_care_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/sound_player/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/sound_player/sound_player_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/text/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/text/text_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/tools/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/tools/tools_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/utils.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/video/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/video/video_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/wallpaper/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/wallpaper/wallpaper_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/web/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/web/web_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/widgets/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/page/widgets/widgets_setting_ui.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/style/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/ui/style/app_style.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/user_setting/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/user_setting/preset_repository.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/user_setting/scene_setting.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/user_setting/user_setting_file.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/app_profile/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/app_profile/app_profile_service.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/audio_meter/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/audio_meter/audio_envelope.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/audio_meter/loopback_capture.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/audio_meter/microphone_meter.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/audio_meter/screen_audio.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/audio_meter/spectrum_analyzer.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/audio_meter/system_audio_meter.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/autostart/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/autostart/autostart_service.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/break_reminder/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/break_reminder/break_reminder.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/browser/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/browser/browser.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/clipboard/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/clipboard/clipboard_history.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/clipboard/clipboard_watcher.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/color_vision/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/color_vision/color_vision.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/critical_exit/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/critical_exit/check_key_is_press.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/critical_exit/critical_exit.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/critical_exit/win32_vk.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/exception/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/exception/exception_tags.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/exception/exceptions.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/focus_shield/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/focus_shield/focus_shield.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/focus_timer/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/focus_timer/focus_timer.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/hotkey/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/hotkey/hotkey_service.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/input_watch/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/input_watch/input_watch_service.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/json/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/json/json_file.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/json/json_repository.py +0 -0
- {frontengine-1.0.67/frontengine/utils/logging → frontengine-1.0.69/frontengine/utils/keep_awake}/__init__.py +0 -0
- {frontengine-1.0.67/frontengine/utils/measure → frontengine-1.0.69/frontengine/utils/logging}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/logging/loggin_instance.py +0 -0
- {frontengine-1.0.67/frontengine/utils/midi → frontengine-1.0.69/frontengine/utils/measure}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/measure/measure.py +0 -0
- {frontengine-1.0.67/frontengine/utils/multi_language → frontengine-1.0.69/frontengine/utils/midi}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/midi/midi_input.py +0 -0
- {frontengine-1.0.67/frontengine/utils/now_playing → frontengine-1.0.69/frontengine/utils/multi_language}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/multi_language/language_wrapper.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/multi_language/retranslate.py +0 -0
- {frontengine-1.0.67/frontengine/utils/pet_chat → frontengine-1.0.69/frontengine/utils/now_playing}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/now_playing/now_playing.py +0 -0
- {frontengine-1.0.67/frontengine/utils/platform_info → frontengine-1.0.69/frontengine/utils/pet_chat}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/pet_chat/pet_chat_service.py +0 -0
- {frontengine-1.0.67/frontengine/utils/playlist → frontengine-1.0.69/frontengine/utils/platform_info}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/platform_info/platform_info.py +0 -0
- {frontengine-1.0.67/frontengine/utils/plugins → frontengine-1.0.69/frontengine/utils/playlist}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/playlist/playlist.py +0 -0
- {frontengine-1.0.67/frontengine/utils/power_mode → frontengine-1.0.69/frontengine/utils/plugins}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/plugins/plugin_loader.py +0 -0
- {frontengine-1.0.67/frontengine/utils/preset_schedule → frontengine-1.0.69/frontengine/utils/power_mode}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/power_mode/power_mode.py +0 -0
- {frontengine-1.0.67/frontengine/utils/recording → frontengine-1.0.69/frontengine/utils/preset_schedule}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/preset_schedule/preset_schedule_service.py +0 -0
- {frontengine-1.0.67/frontengine/utils/redirect_manager → frontengine-1.0.69/frontengine/utils/recording}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/recording/frame_recorder.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/recording/gif_writer.py +0 -0
- {frontengine-1.0.67/frontengine/utils/reminder → frontengine-1.0.69/frontengine/utils/redirect_manager}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/redirect_manager/redirect_manager_class.py +0 -0
- {frontengine-1.0.67/frontengine/utils/remote → frontengine-1.0.69/frontengine/utils/reminder}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/reminder/reminder_service.py +0 -0
- {frontengine-1.0.67/frontengine/utils/screen_privacy → frontengine-1.0.69/frontengine/utils/remote}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/remote/remote_server.py +0 -0
- {frontengine-1.0.67/frontengine/utils/screen_text → frontengine-1.0.69/frontengine/utils/screen_privacy}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/screen_privacy/capture_affinity.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/screen_privacy/share_watch.py +0 -0
- {frontengine-1.0.67/frontengine/utils/screensaver → frontengine-1.0.69/frontengine/utils/screen_text}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/screen_text/screen_text_service.py +0 -0
- {frontengine-1.0.67/frontengine/utils/signage → frontengine-1.0.69/frontengine/utils/screensaver}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/screensaver/screensaver_service.py +0 -0
- {frontengine-1.0.67/frontengine/utils/smart_pause → frontengine-1.0.69/frontengine/utils/signage}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/signage/signage_service.py +0 -0
- {frontengine-1.0.67/frontengine/utils/steam → frontengine-1.0.69/frontengine/utils/smart_pause}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/smart_pause/pause_rules.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/smart_pause/smart_pause_service.py +0 -0
- {frontengine-1.0.67/frontengine/utils/system_stats → frontengine-1.0.69/frontengine/utils/steam}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/steam/steam_language.py +0 -0
- {frontengine-1.0.67/frontengine/utils/text_source → frontengine-1.0.69/frontengine/utils/system_stats}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/system_stats/system_stats.py +0 -0
- {frontengine-1.0.67/frontengine/utils/theme_schedule → frontengine-1.0.69/frontengine/utils/text_source}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/text_source/text_source.py +0 -0
- {frontengine-1.0.67/frontengine/utils/usage_tracking → frontengine-1.0.69/frontengine/utils/theme_schedule}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/theme_schedule/theme_schedule_service.py +0 -0
- {frontengine-1.0.67/frontengine/utils/virtual_camera → frontengine-1.0.69/frontengine/utils/usage_tracking}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/usage_tracking/usage_service.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/usage_tracking/usage_tracker.py +0 -0
- {frontengine-1.0.67/frontengine/utils/weather → frontengine-1.0.69/frontengine/utils/virtual_camera}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/virtual_camera/camera_feed.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/virtual_camera/virtual_camera.py +0 -0
- {frontengine-1.0.67/frontengine/utils/window_pin → frontengine-1.0.69/frontengine/utils/weather}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/weather/weather_service.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/web_url.py +0 -0
- {frontengine-1.0.67/frontengine/utils/window_replica → frontengine-1.0.69/frontengine/utils/window_pin}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/window_pin/window_layout.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/window_pin/window_pin.py +0 -0
- {frontengine-1.0.67/frontengine/utils/workshop → frontengine-1.0.69/frontengine/utils/window_replica}/__init__.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/window_replica/dwm_thumbnail.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/workshop/workshop_content.py +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine.egg-info/dependency_links.txt +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine.egg-info/entry_points.txt +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine.egg-info/requires.txt +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/frontengine.egg-info/top_level.txt +0 -0
- {frontengine-1.0.67 → frontengine-1.0.69}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: frontengine
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.69
|
|
4
4
|
Summary: FrontEngine is use-define frontview or only use like screen saver
|
|
5
5
|
Author-email: JE-Chen <jechenmailman@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/Intergration-Automation-Testing/FrontEngine
|
|
@@ -669,6 +669,9 @@ class PetMotion:
|
|
|
669
669
|
self.vx = float(self.speed)
|
|
670
670
|
self.vy = 0.0 if behaviour != BEHAVIOUR_WANDER else float(self.speed)
|
|
671
671
|
self._airborne = False
|
|
672
|
+
# 打字時安分下來:True 的時候 step() 原地不動。
|
|
673
|
+
# Settled while typing: step() stays put while this is True.
|
|
674
|
+
self.settled = False
|
|
672
675
|
self.state = "walk" # walk | idle | sleep
|
|
673
676
|
self._state_ticks = 0
|
|
674
677
|
self._idle_count = 0
|
|
@@ -784,6 +787,13 @@ class PetMotion:
|
|
|
784
787
|
self.follow_target_x = None
|
|
785
788
|
|
|
786
789
|
def step(self) -> Tuple[int, int]:
|
|
790
|
+
# 安分的時候原地不動。閘門放在這裡而不是各個行為分支裡:每個分支都要記得
|
|
791
|
+
# 檢查的話,總有一個會漏掉,而漏掉的那個就是打字時還在跑的那隻。
|
|
792
|
+
# Settled means staying put. The gate is here rather than inside each
|
|
793
|
+
# behaviour branch: with a check per branch one of them eventually gets
|
|
794
|
+
# missed, and the missed one is the pet still running about while you type.
|
|
795
|
+
if self.settled:
|
|
796
|
+
return int(self.x), int(self.y)
|
|
787
797
|
left, top, right, bottom = self.bounds
|
|
788
798
|
floor_y = bottom - self.height
|
|
789
799
|
if self.behaviour == BEHAVIOUR_CHASE:
|
|
@@ -52,6 +52,7 @@ from frontengine.utils.steam.steam_language import steam_language
|
|
|
52
52
|
from frontengine.utils.critical_exit.critical_exit import CriticalExit
|
|
53
53
|
from frontengine.utils.critical_exit.win32_vk import keyboard_keys_table
|
|
54
54
|
from frontengine.utils.hotkey.hotkey_service import HotkeyService
|
|
55
|
+
from frontengine.utils.keep_awake.keep_awake import KeepAwake
|
|
55
56
|
from frontengine.utils.logging.loggin_instance import front_engine_logger
|
|
56
57
|
from frontengine.utils.multi_language.language_wrapper import language_wrapper
|
|
57
58
|
from frontengine.utils.multi_language.retranslate import retranslator
|
|
@@ -330,6 +331,12 @@ class FrontEngineMainUI(QMainWindow):
|
|
|
330
331
|
)
|
|
331
332
|
self.preset_schedule_service.start()
|
|
332
333
|
|
|
334
|
+
# 保持喚醒:覆蓋層放著的時候別讓螢幕睡著
|
|
335
|
+
# Keep awake: do not let the display sleep while an overlay is up
|
|
336
|
+
self.keep_awake = KeepAwake()
|
|
337
|
+
if user_setting_dict.get("keep_awake"):
|
|
338
|
+
self.keep_awake.enable()
|
|
339
|
+
|
|
333
340
|
# 閒置夠久就把選定的覆蓋層放上來 / Show the chosen overlay once idle
|
|
334
341
|
self._screensaver_overlays: list = []
|
|
335
342
|
self.screensaver_service = ScreensaverService(
|
|
@@ -858,6 +865,11 @@ class FrontEngineMainUI(QMainWindow):
|
|
|
858
865
|
if user_setting_dict.get("restore_last_session"):
|
|
859
866
|
save_last_session(self)
|
|
860
867
|
self._stop_services()
|
|
868
|
+
# 執行緒執行狀態跟著行程活著,不放開的話關掉程式之後螢幕還是不會睡。
|
|
869
|
+
# The execution state lives with the process: without releasing it the
|
|
870
|
+
# display keeps refusing to sleep after the application is gone.
|
|
871
|
+
if getattr(self, "keep_awake", None) is not None:
|
|
872
|
+
self.keep_awake.disable()
|
|
861
873
|
self._save_page_state()
|
|
862
874
|
self._save_window_geometry()
|
|
863
875
|
write_user_setting()
|
|
@@ -13,6 +13,7 @@ from frontengine.ui.dialog.reminder_dialog import ReminderDialog
|
|
|
13
13
|
from frontengine.ui.dialog.remote_control_dialog import RemoteControlDialog
|
|
14
14
|
from frontengine.ui.dialog.screen_privacy_dialog import ScreenPrivacyDialog
|
|
15
15
|
from frontengine.ui.dialog.screensaver_dialog import ScreensaverDialog
|
|
16
|
+
from frontengine.utils.keep_awake.keep_awake import available as keep_awake_available
|
|
16
17
|
from frontengine.ui.dialog.signage_dialog import SignageDialog
|
|
17
18
|
from frontengine.ui.dialog.smart_pause_dialog import SmartPauseDialog
|
|
18
19
|
from frontengine.ui.dialog.usage_report_dialog import UsageReportDialog
|
|
@@ -73,6 +74,15 @@ def build_settings_menu(ui: "FrontEngineMainUI") -> None:
|
|
|
73
74
|
menu.addAction(autostart_action)
|
|
74
75
|
ui.autostart_action = autostart_action
|
|
75
76
|
|
|
77
|
+
keep_awake_action = QAction(_t("settings_menu_keep_awake", "Keep the screen awake"), menu)
|
|
78
|
+
retranslator.bind(keep_awake_action, "settings_menu_keep_awake", "Keep the screen awake")
|
|
79
|
+
keep_awake_action.setCheckable(True)
|
|
80
|
+
keep_awake_action.setChecked(bool(user_setting_dict.get("keep_awake")))
|
|
81
|
+
keep_awake_action.setEnabled(keep_awake_available())
|
|
82
|
+
keep_awake_action.toggled.connect(lambda checked: _toggle_keep_awake(ui, checked))
|
|
83
|
+
menu.addAction(keep_awake_action)
|
|
84
|
+
ui.keep_awake_action = keep_awake_action
|
|
85
|
+
|
|
76
86
|
restore_action = QAction(_t("settings_menu_restore_session", "Restore last session"), menu)
|
|
77
87
|
retranslator.bind(restore_action, "settings_menu_restore_session", "Restore last session")
|
|
78
88
|
restore_action.setCheckable(True)
|
|
@@ -180,6 +190,25 @@ def _dispose(dialog: QDialog) -> None:
|
|
|
180
190
|
dialog.deleteLater()
|
|
181
191
|
|
|
182
192
|
|
|
193
|
+
def _toggle_keep_awake(ui: "FrontEngineMainUI", enabled: bool) -> None:
|
|
194
|
+
"""開關保持喚醒,並把選擇記下來。做不到時把勾勾拿掉,不要留一個假的開著。"""
|
|
195
|
+
service = getattr(ui, "keep_awake", None)
|
|
196
|
+
if service is None:
|
|
197
|
+
return
|
|
198
|
+
if enabled and not service.enable():
|
|
199
|
+
# 開不起來就把選單的勾勾收回去:勾著卻沒生效比沒有這個選項更糟。
|
|
200
|
+
# If it could not be held, untick: a ticked box that does nothing is
|
|
201
|
+
# worse than no box at all.
|
|
202
|
+
action = getattr(ui, "keep_awake_action", None)
|
|
203
|
+
if action is not None:
|
|
204
|
+
action.setChecked(False)
|
|
205
|
+
return
|
|
206
|
+
if not enabled:
|
|
207
|
+
service.disable()
|
|
208
|
+
user_setting_dict["keep_awake"] = bool(enabled)
|
|
209
|
+
write_user_setting()
|
|
210
|
+
|
|
211
|
+
|
|
183
212
|
def _open_signage_dialog(ui: "FrontEngineMainUI") -> None:
|
|
184
213
|
"""開看板設定;按下確定後立刻套用新的輪播狀態。"""
|
|
185
214
|
front_engine_logger.info("[SettingsMenu] open SignageDialog")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from typing import Optional
|
|
2
2
|
|
|
3
|
-
from PySide6.QtCore import QTimer
|
|
3
|
+
from PySide6.QtCore import Qt, QTimer
|
|
4
4
|
from PySide6.QtGui import QGuiApplication
|
|
5
5
|
from PySide6.QtWidgets import (
|
|
6
6
|
QLabel, QPushButton, QMessageBox, QComboBox, QCheckBox, QFileDialog,
|
|
@@ -28,6 +28,8 @@ from frontengine.utils.focus_timer.focus_timer import (
|
|
|
28
28
|
PHASE_BREAK, PHASE_FOCUS, PHASE_LONG_BREAK, FocusTimer,
|
|
29
29
|
)
|
|
30
30
|
from frontengine.ui.page.layout_kit import SettingPage
|
|
31
|
+
from frontengine.utils.input_watch.input_watch_service import InputWatchService
|
|
32
|
+
from frontengine.utils.input_watch.typing_watch import TypingWatch
|
|
31
33
|
from frontengine.utils.logging.loggin_instance import front_engine_logger
|
|
32
34
|
from frontengine.utils.multi_language.language_wrapper import language_wrapper
|
|
33
35
|
from frontengine.utils.multi_language.retranslate import retranslator, tr
|
|
@@ -49,6 +51,14 @@ class PetSettingUI(SettingPage):
|
|
|
49
51
|
|
|
50
52
|
# Init variable
|
|
51
53
|
self.pet_list: list = []
|
|
54
|
+
# 打字時安分:按鍵由既有的全域監聽服務推過來,這裡只記時間並在停手後放行
|
|
55
|
+
# Settling while typing: keys come from the existing global watch
|
|
56
|
+
# service; this only times them and lets the pet go once typing stops.
|
|
57
|
+
self._typing_watch = TypingWatch()
|
|
58
|
+
self._input_watch: Optional[InputWatchService] = None
|
|
59
|
+
self._settle_timer = QTimer(self)
|
|
60
|
+
self._settle_timer.setSingleShot(True)
|
|
61
|
+
self._settle_timer.timeout.connect(lambda: self._apply_settled(False))
|
|
52
62
|
self.ready_to_play = False
|
|
53
63
|
self.pet_image_path: Optional[str] = None
|
|
54
64
|
self.pet_sound_path: Optional[str] = None
|
|
@@ -106,6 +116,13 @@ class PetSettingUI(SettingPage):
|
|
|
106
116
|
self.sit_checkbox.setChecked(True)
|
|
107
117
|
self.tag_checkbox = tr(QCheckBox(), "pet_tag_label", "Play tag with each other")
|
|
108
118
|
self.tag_checkbox.toggled.connect(self._on_tag_toggled)
|
|
119
|
+
# 打字時安分:寵物在螢幕上跑過你正在看的那一行,是最常被抱怨的一點。
|
|
120
|
+
# Settle while typing: a pet walking over the line you are reading is
|
|
121
|
+
# the single thing people complain about most.
|
|
122
|
+
self.settle_typing_checkbox = tr(QCheckBox(), "pet_settle_typing",
|
|
123
|
+
"Settle while typing")
|
|
124
|
+
self.settle_typing_checkbox.clicked.connect(self._on_settle_typing_toggled)
|
|
125
|
+
|
|
109
126
|
self.speech_checkbox = tr(QCheckBox(), "pet_speech_label", "Speak out loud")
|
|
110
127
|
self.chat_checkbox = tr(QCheckBox(), "pet_chat_label", "AI chat (needs API key)")
|
|
111
128
|
self.chat_checkbox.setToolTip(
|
|
@@ -169,6 +186,7 @@ class PetSettingUI(SettingPage):
|
|
|
169
186
|
behaviour = self.add_section("section_behaviour", "Behaviour")
|
|
170
187
|
behaviour.add_row(self.behaviour_label, self.behaviour_combobox)
|
|
171
188
|
behaviour.add_inline(self.climb_checkbox, self.sit_checkbox)
|
|
189
|
+
behaviour.add_inline(self.settle_typing_checkbox)
|
|
172
190
|
|
|
173
191
|
sound = self.add_section("section_options", "Sound and speech")
|
|
174
192
|
sound.add_row(self.volume_label, self.volume_combobox)
|
|
@@ -189,6 +207,54 @@ class PetSettingUI(SettingPage):
|
|
|
189
207
|
self.finish_body()
|
|
190
208
|
self.set_footer(primary=self.start_button, status=self.ready_label)
|
|
191
209
|
|
|
210
|
+
def _start_typing_watch(self) -> bool:
|
|
211
|
+
"""開始監聽按鍵(只在第一次需要時建立)。pynput 不能用時安靜跳過。"""
|
|
212
|
+
if self._input_watch is None:
|
|
213
|
+
self._input_watch = InputWatchService(self)
|
|
214
|
+
# 按鍵在 pynput 自己的執行緒觸發,一定要排回 UI 執行緒才能碰 widget。
|
|
215
|
+
# Keys fire on pynput's own thread; this has to hop to the UI thread
|
|
216
|
+
# before touching any widget.
|
|
217
|
+
self._input_watch.key_pressed.connect(
|
|
218
|
+
self._on_key_pressed, Qt.ConnectionType.QueuedConnection)
|
|
219
|
+
# start() 本身是冪等的:已經在監聽時再呼叫不會多開一個 listener。
|
|
220
|
+
# start() is idempotent: calling it again does not add a second listener.
|
|
221
|
+
return self._input_watch.start(keyboard=True, mouse=False)
|
|
222
|
+
|
|
223
|
+
def _stop_typing_watch(self) -> None:
|
|
224
|
+
"""停止監聽並讓所有寵物恢復走動。"""
|
|
225
|
+
self._settle_timer.stop()
|
|
226
|
+
self._typing_watch.clear()
|
|
227
|
+
if self._input_watch is not None:
|
|
228
|
+
self._input_watch.stop()
|
|
229
|
+
self._apply_settled(False)
|
|
230
|
+
|
|
231
|
+
def _on_settle_typing_toggled(self) -> None:
|
|
232
|
+
if self.settle_typing_checkbox.isChecked():
|
|
233
|
+
if self.pet_list:
|
|
234
|
+
self._start_typing_watch()
|
|
235
|
+
else:
|
|
236
|
+
# 關掉時一定要放行。少了這一步,剛好在打字時關掉這個選項的寵物會
|
|
237
|
+
# 永遠停在原地——看起來就是寵物壞了。
|
|
238
|
+
# Releasing on the way out matters: switched off mid-keystroke
|
|
239
|
+
# without it, the pet stays frozen for good and simply looks broken.
|
|
240
|
+
self._stop_typing_watch()
|
|
241
|
+
|
|
242
|
+
def _on_key_pressed(self, _keys) -> None:
|
|
243
|
+
"""有人按了鍵:寵物先停下來,停手一段時間後再放行。"""
|
|
244
|
+
if not self.settle_typing_checkbox.isChecked():
|
|
245
|
+
return
|
|
246
|
+
self._typing_watch.note_key()
|
|
247
|
+
self._apply_settled(True)
|
|
248
|
+
self._settle_timer.start(int(self._typing_watch.settle_seconds * 1000))
|
|
249
|
+
|
|
250
|
+
def _apply_settled(self, settled: bool) -> None:
|
|
251
|
+
"""把安分狀態套到目前所有寵物身上。"""
|
|
252
|
+
for pet in self.pet_list[:]:
|
|
253
|
+
try:
|
|
254
|
+
pet.motion.settled = settled
|
|
255
|
+
except RuntimeError: # pragma: no cover - 底層物件已消失
|
|
256
|
+
continue
|
|
257
|
+
|
|
192
258
|
def _spawn_pet(self) -> None:
|
|
193
259
|
"""建立、顯示並開始移動一隻寵物(供 Start 與右鍵複製共用)。"""
|
|
194
260
|
if not self.pet_image_path:
|
|
@@ -215,6 +281,9 @@ class PetSettingUI(SettingPage):
|
|
|
215
281
|
if self.audio_react_checkbox.isChecked():
|
|
216
282
|
pet.set_audio_level_provider(self._audio_provider(geometry))
|
|
217
283
|
pet.set_pet_window_flag()
|
|
284
|
+
if self.settle_typing_checkbox.isChecked():
|
|
285
|
+
pet.motion.settled = self._typing_watch.typing()
|
|
286
|
+
self._start_typing_watch()
|
|
218
287
|
self.pet_list.append(pet)
|
|
219
288
|
pet.show()
|
|
220
289
|
self._start_tag_game()
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""
|
|
2
|
+
「使用者正在打字嗎」——用來讓桌寵在打字時安分下來。
|
|
3
|
+
|
|
4
|
+
桌寵在螢幕上到處跑,是打字時最常被抱怨的一點:牠正好跑過你在看的那一行。這裡只
|
|
5
|
+
記住最後一次按鍵的時間,讓呼叫端問「現在算不算在打字」。
|
|
6
|
+
|
|
7
|
+
時鐘可以注入,所以測試不必真的等兩秒。
|
|
8
|
+
|
|
9
|
+
"Is the user typing?" - so the desktop pet can settle down while they are.
|
|
10
|
+
|
|
11
|
+
A pet wandering across the screen is the thing people complain about most while
|
|
12
|
+
typing: it walks over the line you are reading. This only remembers when the last
|
|
13
|
+
key went down and lets the caller ask whether that counts as typing now.
|
|
14
|
+
|
|
15
|
+
The clock is injectable, so tests do not wait two seconds.
|
|
16
|
+
"""
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import time
|
|
20
|
+
from typing import Any, Callable, Optional
|
|
21
|
+
|
|
22
|
+
DEFAULT_SETTLE_SECONDS = 2.0
|
|
23
|
+
MIN_SETTLE_SECONDS = 0.5
|
|
24
|
+
MAX_SETTLE_SECONDS = 30.0
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def clamp_settle_seconds(value: Any, fallback: float = DEFAULT_SETTLE_SECONDS) -> float:
|
|
28
|
+
"""安分的持續時間夾在 0.5 到 30 秒。"""
|
|
29
|
+
try:
|
|
30
|
+
return max(MIN_SETTLE_SECONDS, min(MAX_SETTLE_SECONDS, float(value)))
|
|
31
|
+
except (TypeError, ValueError):
|
|
32
|
+
return fallback
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class TypingWatch:
|
|
36
|
+
"""
|
|
37
|
+
記住最後一次按鍵的時間,回答「現在還算在打字嗎」。
|
|
38
|
+
|
|
39
|
+
用單調時鐘而不是牆上時鐘:系統時間被調整(校時、換時區)時,牆上時鐘會讓
|
|
40
|
+
「距離上次按鍵幾秒」變成負數或一大跳,寵物就會莫名其妙卡住或突然衝出去。
|
|
41
|
+
Remembers when the last key went down and answers whether that still counts
|
|
42
|
+
as typing.
|
|
43
|
+
|
|
44
|
+
On a monotonic clock rather than the wall clock: when the system time is
|
|
45
|
+
adjusted - an NTP step, a timezone change - a wall clock makes "seconds since
|
|
46
|
+
the last key" negative or wildly large, and the pet either freezes for no
|
|
47
|
+
reason or bolts.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def __init__(self, settle_seconds: Any = DEFAULT_SETTLE_SECONDS,
|
|
51
|
+
clock: Callable[[], float] = time.monotonic) -> None:
|
|
52
|
+
self.settle_seconds = clamp_settle_seconds(settle_seconds)
|
|
53
|
+
self._clock = clock
|
|
54
|
+
self._last_key: Optional[float] = None
|
|
55
|
+
|
|
56
|
+
def note_key(self) -> None:
|
|
57
|
+
"""記下這一刻有人按了鍵。"""
|
|
58
|
+
self._last_key = self._clock()
|
|
59
|
+
|
|
60
|
+
def clear(self) -> None:
|
|
61
|
+
"""忘掉先前的按鍵(功能關掉時用,免得寵物停在原地不動)。"""
|
|
62
|
+
self._last_key = None
|
|
63
|
+
|
|
64
|
+
def seconds_since_key(self) -> Optional[float]:
|
|
65
|
+
"""距離上次按鍵幾秒;還沒按過就是 None。"""
|
|
66
|
+
if self._last_key is None:
|
|
67
|
+
return None
|
|
68
|
+
return max(0.0, self._clock() - self._last_key)
|
|
69
|
+
|
|
70
|
+
def typing(self) -> bool:
|
|
71
|
+
"""現在算不算在打字。"""
|
|
72
|
+
elapsed = self.seconds_since_key()
|
|
73
|
+
return elapsed is not None and elapsed < self.settle_seconds
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""
|
|
2
|
+
保持喚醒:開著覆蓋層的時候別讓螢幕睡著。
|
|
3
|
+
|
|
4
|
+
這是螢幕保護的另一面。放了影片、看板或簡報層在畫面上,系統照樣會在幾分鐘後把
|
|
5
|
+
螢幕關掉——那正是最不該關的時候。
|
|
6
|
+
|
|
7
|
+
三個平台各自用系統既有的方式,都不需要新相依:Windows 是一個 Win32 呼叫,
|
|
8
|
+
macOS 與 Linux 是常駐一個系統本來就有的小程式(`caffeinate` / `systemd-inhibit`)
|
|
9
|
+
並在結束時終止它。做不到的平台照實回報,不假裝成功。
|
|
10
|
+
|
|
11
|
+
Keep awake: stop the screen sleeping while an overlay is up.
|
|
12
|
+
|
|
13
|
+
This is the other side of the screensaver. With a video, a signage rotation or a
|
|
14
|
+
presenting layer on screen, the system still blanks the display after a few
|
|
15
|
+
minutes - exactly when it should not.
|
|
16
|
+
|
|
17
|
+
Each platform uses what it already has, with no new dependency: one Win32 call on
|
|
18
|
+
Windows, and on macOS and Linux a small program that ships with the system
|
|
19
|
+
(`caffeinate` / `systemd-inhibit`) held open and terminated on release. A
|
|
20
|
+
platform that cannot do it says so rather than pretending.
|
|
21
|
+
"""
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import shutil
|
|
25
|
+
import subprocess # nosec B404 - only runs the fixed argv in _HELPERS below
|
|
26
|
+
import sys
|
|
27
|
+
from typing import List, Optional
|
|
28
|
+
|
|
29
|
+
from frontengine.utils.logging.loggin_instance import front_engine_logger
|
|
30
|
+
|
|
31
|
+
# SetThreadExecutionState 的旗標 / Flags for SetThreadExecutionState
|
|
32
|
+
ES_CONTINUOUS = 0x80000000
|
|
33
|
+
ES_SYSTEM_REQUIRED = 0x00000001
|
|
34
|
+
ES_DISPLAY_REQUIRED = 0x00000002
|
|
35
|
+
|
|
36
|
+
# 非 Windows 平台用的常駐小程式。argv 全部寫死在這裡,沒有任何外部輸入。
|
|
37
|
+
# The helper held open on the other platforms. Every argv is literal here; no
|
|
38
|
+
# outside input reaches it.
|
|
39
|
+
_HELPERS = {
|
|
40
|
+
"darwin": ["/usr/bin/caffeinate", "-dimsu"],
|
|
41
|
+
"linux": ["systemd-inhibit", "--what=idle:sleep",
|
|
42
|
+
"--who=FrontEngine", "--why=Overlay on screen", "--mode=block",
|
|
43
|
+
"sleep", "infinity"],
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def helper_command() -> Optional[List[str]]:
|
|
48
|
+
"""這個平台要跑哪一個小程式;Windows 或找不到程式時回傳 None。"""
|
|
49
|
+
command = _HELPERS.get(sys.platform)
|
|
50
|
+
if command is None:
|
|
51
|
+
return None
|
|
52
|
+
return command if shutil.which(command[0]) else None
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def available() -> bool:
|
|
56
|
+
"""這個平台能不能阻止螢幕睡著。"""
|
|
57
|
+
if sys.platform == "win32":
|
|
58
|
+
return True
|
|
59
|
+
return helper_command() is not None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class KeepAwake:
|
|
63
|
+
"""
|
|
64
|
+
保持喚醒的開關。enable() 開始、disable() 放開,兩者重複呼叫都是安全的。
|
|
65
|
+
|
|
66
|
+
**一定要記得放開。** Windows 的執行緒執行狀態會跟著行程活著,忘了還原的話,
|
|
67
|
+
使用者關掉這個選項、甚至關掉整個程式之後,螢幕還是不會依設定睡著——而且看不出
|
|
68
|
+
是誰造成的。
|
|
69
|
+
A keep-awake switch. enable() holds it, disable() lets go, and both are safe
|
|
70
|
+
to call twice.
|
|
71
|
+
|
|
72
|
+
**Releasing matters.** The Windows execution state lives as long as the
|
|
73
|
+
process: forget to restore it and the display stops sleeping even after the
|
|
74
|
+
user switches the option off, with nothing on screen to say why.
|
|
75
|
+
"""
|
|
76
|
+
|
|
77
|
+
def __init__(self) -> None:
|
|
78
|
+
self._active = False
|
|
79
|
+
self._process: Optional[subprocess.Popen] = None
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def active(self) -> bool:
|
|
83
|
+
return self._active
|
|
84
|
+
|
|
85
|
+
def enable(self, keep_display_on: bool = True) -> bool:
|
|
86
|
+
"""開始保持喚醒;做不到就回傳 False。"""
|
|
87
|
+
if self._active:
|
|
88
|
+
return True
|
|
89
|
+
if not available():
|
|
90
|
+
front_engine_logger.info("[KeepAwake] not supported on this platform")
|
|
91
|
+
return False
|
|
92
|
+
if sys.platform == "win32":
|
|
93
|
+
if not self._windows_state(keep_display_on):
|
|
94
|
+
return False
|
|
95
|
+
elif not self._start_helper():
|
|
96
|
+
return False
|
|
97
|
+
self._active = True
|
|
98
|
+
front_engine_logger.info(f"[KeepAwake] on | display={keep_display_on}")
|
|
99
|
+
return True
|
|
100
|
+
|
|
101
|
+
def disable(self) -> None:
|
|
102
|
+
"""放開,讓系統回到原本的睡眠設定。重複呼叫是安全的。"""
|
|
103
|
+
if not self._active:
|
|
104
|
+
return
|
|
105
|
+
if sys.platform == "win32":
|
|
106
|
+
self._windows_state(False, release=True)
|
|
107
|
+
self._stop_helper()
|
|
108
|
+
self._active = False
|
|
109
|
+
front_engine_logger.info("[KeepAwake] off")
|
|
110
|
+
|
|
111
|
+
# --- platform boundaries ---------------------------------------------
|
|
112
|
+
@staticmethod
|
|
113
|
+
def _windows_state(keep_display_on: bool, release: bool = False) -> bool: # pragma: no cover - Win32
|
|
114
|
+
try:
|
|
115
|
+
import ctypes
|
|
116
|
+
|
|
117
|
+
if release:
|
|
118
|
+
flags = ES_CONTINUOUS
|
|
119
|
+
else:
|
|
120
|
+
flags = ES_CONTINUOUS | ES_SYSTEM_REQUIRED
|
|
121
|
+
if keep_display_on:
|
|
122
|
+
flags |= ES_DISPLAY_REQUIRED
|
|
123
|
+
# 回傳 0 代表失敗;不檢查的話會以為已經開著,其實螢幕照樣會睡。
|
|
124
|
+
# A zero return means it failed; unchecked, this would report success
|
|
125
|
+
# while the display goes on sleeping anyway.
|
|
126
|
+
return bool(ctypes.windll.kernel32.SetThreadExecutionState(ctypes.c_uint(flags)))
|
|
127
|
+
except Exception as error:
|
|
128
|
+
front_engine_logger.warning(f"[KeepAwake] SetThreadExecutionState failed: {error!r}")
|
|
129
|
+
return False
|
|
130
|
+
|
|
131
|
+
def _start_helper(self) -> bool: # pragma: no cover - process boundary
|
|
132
|
+
command = helper_command()
|
|
133
|
+
if command is None:
|
|
134
|
+
return False
|
|
135
|
+
try:
|
|
136
|
+
self._process = subprocess.Popen( # nosec B603 # nosemgrep - literal argv, shell=False
|
|
137
|
+
command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
|
|
138
|
+
stdin=subprocess.DEVNULL, shell=False)
|
|
139
|
+
return True
|
|
140
|
+
except OSError as error:
|
|
141
|
+
front_engine_logger.warning(f"[KeepAwake] helper failed: {error!r}")
|
|
142
|
+
self._process = None
|
|
143
|
+
return False
|
|
144
|
+
|
|
145
|
+
def _stop_helper(self) -> None: # pragma: no cover - process boundary
|
|
146
|
+
process = self._process
|
|
147
|
+
self._process = None
|
|
148
|
+
if process is None:
|
|
149
|
+
return
|
|
150
|
+
try:
|
|
151
|
+
process.terminate()
|
|
152
|
+
process.wait(timeout=5)
|
|
153
|
+
except Exception as error:
|
|
154
|
+
front_engine_logger.warning(f"[KeepAwake] helper stop failed: {error!r}")
|
|
@@ -46,6 +46,7 @@ english_word_dict = {
|
|
|
46
46
|
"tools_shape": "Shape",
|
|
47
47
|
"tools_name": "Name",
|
|
48
48
|
"tools_saved": "Saved",
|
|
49
|
+
"pet_settle_typing": "Settle while typing",
|
|
49
50
|
"target_monitor_span": "Span all screens",
|
|
50
51
|
"tools_replicate_window": "Replicate a window...",
|
|
51
52
|
"window_replica_title": "Replicate a window",
|
|
@@ -464,6 +465,7 @@ english_word_dict = {
|
|
|
464
465
|
"pet_chatter_battery": "Battery's low - plug me in?|Low power, careful!|Find a charger soon?|Running on fumes here~",
|
|
465
466
|
"pet_start": "Spawn pet",
|
|
466
467
|
"pet_message_box_text": "Pet image not found",
|
|
468
|
+
"settings_menu_keep_awake": "Keep the screen awake",
|
|
467
469
|
"settings_menu_smart_pause": "Smart pause...",
|
|
468
470
|
"settings_menu_app_profiles": "App profiles...",
|
|
469
471
|
"settings_menu_reminders": "Reminders...",
|
|
@@ -47,6 +47,7 @@ french_word_dict = {
|
|
|
47
47
|
"tools_shape": "Forme",
|
|
48
48
|
"tools_name": "Nom",
|
|
49
49
|
"tools_saved": "Enregistrés",
|
|
50
|
+
"pet_settle_typing": "Rester tranquille pendant la frappe",
|
|
50
51
|
"target_monitor_span": "Sur tous les écrans",
|
|
51
52
|
"tools_replicate_window": "Dupliquer une fenêtre...",
|
|
52
53
|
"window_replica_title": "Dupliquer une fenêtre",
|
|
@@ -454,6 +455,7 @@ french_word_dict = {
|
|
|
454
455
|
"pet_chatter_battery": "La batterie est faible — tu me branches ?|Peu d'énergie, attention !|On trouve un chargeur ?|Je suis sur la réserve~",
|
|
455
456
|
"pet_start": "Faire apparaître la mascotte",
|
|
456
457
|
"pet_message_box_text": "Image de mascotte introuvable",
|
|
458
|
+
"settings_menu_keep_awake": "Garder l'écran allumé",
|
|
457
459
|
"settings_menu_smart_pause": "Pause intelligente…",
|
|
458
460
|
"settings_menu_app_profiles": "Profils d'application…",
|
|
459
461
|
"settings_menu_reminders": "Rappels…",
|
|
@@ -47,6 +47,7 @@ germany_word_dict = {
|
|
|
47
47
|
"tools_shape": "Form",
|
|
48
48
|
"tools_name": "Name",
|
|
49
49
|
"tools_saved": "Gespeichert",
|
|
50
|
+
"pet_settle_typing": "Beim Tippen still halten",
|
|
50
51
|
"target_monitor_span": "Über alle Bildschirme",
|
|
51
52
|
"tools_replicate_window": "Fenster duplizieren...",
|
|
52
53
|
"window_replica_title": "Fenster duplizieren",
|
|
@@ -456,6 +457,7 @@ germany_word_dict = {
|
|
|
456
457
|
"pet_chatter_battery": "Der Akku ist fast leer – steckst du mich an?|Wenig Energie, pass auf!|Bald ein Ladegerät finden?|Ich laufe auf Reserve~",
|
|
457
458
|
"pet_start": "Haustier erzeugen",
|
|
458
459
|
"pet_message_box_text": "Haustier-Bild nicht gefunden",
|
|
460
|
+
"settings_menu_keep_awake": "Bildschirm wach halten",
|
|
459
461
|
"settings_menu_smart_pause": "Intelligente Pause …",
|
|
460
462
|
"settings_menu_app_profiles": "App-Profile …",
|
|
461
463
|
"settings_menu_reminders": "Erinnerungen …",
|
|
@@ -47,6 +47,7 @@ italian_word_dict = {
|
|
|
47
47
|
"tools_shape": "Forma",
|
|
48
48
|
"tools_name": "Nome",
|
|
49
49
|
"tools_saved": "Salvati",
|
|
50
|
+
"pet_settle_typing": "Fermo mentre scrivi",
|
|
50
51
|
"target_monitor_span": "Su tutti gli schermi",
|
|
51
52
|
"tools_replicate_window": "Duplica una finestra...",
|
|
52
53
|
"window_replica_title": "Duplica una finestra",
|
|
@@ -454,6 +455,7 @@ italian_word_dict = {
|
|
|
454
455
|
"pet_chatter_battery": "La batteria è quasi scarica — mi attacchi alla presa?|Poca energia, attenta!|Cerchiamo un caricabatterie?|Sono agli sgoccioli~",
|
|
455
456
|
"pet_start": "Fai comparire la mascotte",
|
|
456
457
|
"pet_message_box_text": "Immagine della mascotte non trovata",
|
|
458
|
+
"settings_menu_keep_awake": "Mantieni lo schermo attivo",
|
|
457
459
|
"settings_menu_smart_pause": "Pausa intelligente…",
|
|
458
460
|
"settings_menu_app_profiles": "Profili applicazione…",
|
|
459
461
|
"settings_menu_reminders": "Promemoria…",
|
|
@@ -47,6 +47,7 @@ russian_word_dict = {
|
|
|
47
47
|
"tools_shape": "Форма",
|
|
48
48
|
"tools_name": "Имя",
|
|
49
49
|
"tools_saved": "Сохранённые",
|
|
50
|
+
"pet_settle_typing": "Не двигаться при наборе текста",
|
|
50
51
|
"target_monitor_span": "На все экраны",
|
|
51
52
|
"tools_replicate_window": "Копия окна...",
|
|
52
53
|
"window_replica_title": "Копия окна",
|
|
@@ -454,6 +455,7 @@ russian_word_dict = {
|
|
|
454
455
|
"pet_chatter_battery": "Батарея на исходе — подключишь меня?|Мало заряда, осторожнее!|Найдём зарядку?|Я на последних каплях~",
|
|
455
456
|
"pet_start": "Призвать питомца",
|
|
456
457
|
"pet_message_box_text": "Изображение питомца не найдено",
|
|
458
|
+
"settings_menu_keep_awake": "Не давать экрану гаснуть",
|
|
457
459
|
"settings_menu_smart_pause": "Умная пауза…",
|
|
458
460
|
"settings_menu_app_profiles": "Профили приложений…",
|
|
459
461
|
"settings_menu_reminders": "Напоминания…",
|
{frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/multi_language/simplified_chinese.py
RENAMED
|
@@ -47,6 +47,7 @@ simplified_chinese_word_dict = {
|
|
|
47
47
|
"tools_shape": "形状",
|
|
48
48
|
"tools_name": "名称",
|
|
49
49
|
"tools_saved": "已保存",
|
|
50
|
+
"pet_settle_typing": "打字时安分",
|
|
50
51
|
"target_monitor_span": "横跨所有屏幕",
|
|
51
52
|
"tools_replicate_window": "窗口副本⋯",
|
|
52
53
|
"window_replica_title": "窗口副本",
|
|
@@ -455,6 +456,7 @@ simplified_chinese_word_dict = {
|
|
|
455
456
|
"pet_chatter_battery": "电池快没了 — 帮我插电?|电量低,小心点!|快找个充电器?|快撑不住了~",
|
|
456
457
|
"pet_start": "召唤宠物",
|
|
457
458
|
"pet_message_box_text": "找不到宠物图档",
|
|
459
|
+
"settings_menu_keep_awake": "保持屏幕唤醒",
|
|
458
460
|
"settings_menu_smart_pause": "智慧暂停…",
|
|
459
461
|
"settings_menu_app_profiles": "应用情境…",
|
|
460
462
|
"settings_menu_reminders": "提醒…",
|
{frontengine-1.0.67 → frontengine-1.0.69}/frontengine/utils/multi_language/traditional_chinese.py
RENAMED
|
@@ -47,6 +47,7 @@ traditional_chinese_word_dict = {
|
|
|
47
47
|
"tools_shape": "形狀",
|
|
48
48
|
"tools_name": "名稱",
|
|
49
49
|
"tools_saved": "已儲存",
|
|
50
|
+
"pet_settle_typing": "打字時安分",
|
|
50
51
|
"target_monitor_span": "橫跨所有螢幕",
|
|
51
52
|
"tools_replicate_window": "視窗複本⋯",
|
|
52
53
|
"window_replica_title": "視窗複本",
|
|
@@ -463,6 +464,7 @@ traditional_chinese_word_dict = {
|
|
|
463
464
|
"pet_chatter_battery": "電量很低,幫我插電好嗎?|快沒電了,小心!|該找充電器囉?|我快撐不住了~",
|
|
464
465
|
"pet_start": "召喚寵物",
|
|
465
466
|
"pet_message_box_text": "找不到寵物圖片",
|
|
467
|
+
"settings_menu_keep_awake": "保持螢幕喚醒",
|
|
466
468
|
"settings_menu_smart_pause": "智慧暫停…",
|
|
467
469
|
"settings_menu_app_profiles": "程式對應預設集…",
|
|
468
470
|
"settings_menu_reminders": "自訂提醒…",
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: frontengine
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.69
|
|
4
4
|
Summary: FrontEngine is use-define frontview or only use like screen saver
|
|
5
5
|
Author-email: JE-Chen <jechenmailman@gmail.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/Intergration-Automation-Testing/FrontEngine
|
|
@@ -184,9 +184,12 @@ frontengine/utils/hotkey/__init__.py
|
|
|
184
184
|
frontengine/utils/hotkey/hotkey_service.py
|
|
185
185
|
frontengine/utils/input_watch/__init__.py
|
|
186
186
|
frontengine/utils/input_watch/input_watch_service.py
|
|
187
|
+
frontengine/utils/input_watch/typing_watch.py
|
|
187
188
|
frontengine/utils/json/__init__.py
|
|
188
189
|
frontengine/utils/json/json_file.py
|
|
189
190
|
frontengine/utils/json/json_repository.py
|
|
191
|
+
frontengine/utils/keep_awake/__init__.py
|
|
192
|
+
frontengine/utils/keep_awake/keep_awake.py
|
|
190
193
|
frontengine/utils/logging/__init__.py
|
|
191
194
|
frontengine/utils/logging/loggin_instance.py
|
|
192
195
|
frontengine/utils/measure/__init__.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{frontengine-1.0.67 → frontengine-1.0.69}/frontengine/show/focus_shield/focus_shield_widget.py
RENAMED
|
File without changes
|
|
File without changes
|