frontengine 1.0.76__tar.gz → 1.0.77__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.77/PKG-INFO +453 -0
- frontengine-1.0.77/README.md +429 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/monitor/monitor_widget.py +134 -31
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/presentation/keystroke_display.py +122 -4
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/hotkey_settings_dialog.py +5 -0
- frontengine-1.0.77/frontengine/ui/dialog/rules_dialog.py +221 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/main_ui.py +76 -1
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/menu/settings_menu.py +9 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/control_center/control_center_ui.py +50 -2
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/presentation/presentation_setting_ui.py +70 -11
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/text/text_setting_ui.py +32 -4
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/widgets/widgets_setting_ui.py +49 -2
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/user_setting/user_setting_file.py +18 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/input_watch/input_watch_service.py +29 -3
- frontengine-1.0.77/frontengine/utils/media_keys/media_keys.py +136 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/english.py +720 -686
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/france.py +710 -676
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/germany.py +713 -679
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/italy.py +710 -676
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/russian.py +710 -676
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/simplified_chinese.py +712 -678
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/traditional_chinese.py +719 -685
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/remote/remote_server.py +2 -1
- frontengine-1.0.77/frontengine/utils/rules/rule_engine.py +349 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/system_stats/system_stats.py +111 -20
- frontengine-1.0.77/frontengine/utils/virtual_desktop/virtual_desktop.py +307 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/weather/weather_service.py +10 -0
- frontengine-1.0.77/frontengine/utils/window_pin/__init__.py +0 -0
- frontengine-1.0.77/frontengine/utils/window_pin/monitor_move.py +296 -0
- frontengine-1.0.77/frontengine/utils/window_replica/__init__.py +0 -0
- frontengine-1.0.77/frontengine/utils/workshop/__init__.py +0 -0
- frontengine-1.0.77/frontengine.egg-info/PKG-INFO +453 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine.egg-info/SOURCES.txt +8 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/pyproject.toml +1 -1
- frontengine-1.0.76/PKG-INFO +0 -362
- frontengine-1.0.76/README.md +0 -338
- frontengine-1.0.76/frontengine.egg-info/PKG-INFO +0 -362
- {frontengine-1.0.76 → frontengine-1.0.77}/LICENSE +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/__main__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/base_widget.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/camera/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/camera/camera_widget.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/canvas/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/canvas/whiteboard_widget.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/capture/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/capture/region_capture.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/draggable_window.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/focus_shield/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/focus_shield/focus_shield_widget.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/freeze/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/freeze/freeze_widget.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/gif/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/gif/paint_gif.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/image/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/image/paint_image.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/load/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/load/load_someone_make_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/measure/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/measure/measure_widget.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/monitor/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/notes/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/notes/sticky_note_widget.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/overlay_factory.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/particle/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/particle/particle_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/pet/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/pet/desktop_pet.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/pinned/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/pinned/pinned_image.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/presentation/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/presentation/annotation_overlay.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/presentation/cursor_effects.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/presentation/magnifier.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/reference/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/reference/reference_board.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/replica/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/replica/replica_widget.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/scene/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/scene/extend_graphic_scene.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/scene/extend_graphic_view.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/scene/scene.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/screen_care/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/screen_care/color_vision_widget.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/screen_care/screen_filter.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/shortcuts/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/shortcuts/shortcut_sheet.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/sound_player/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/sound_player/sound_effect.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/sound_player/sound_player.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/spectrum/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/spectrum/spectrum_widget.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/text/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/text/draw_text.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/toast/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/toast/toast_widget.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/video/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/video/video_player.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/wallpaper/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/wallpaper/wallpaper_widget.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/web/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/web/webview.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/window_helpers.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/system_tray/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/system_tray/extend_system_tray.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/color/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/color/global_color.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/app_profile_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/choose_file_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/clipboard_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/how_to_use_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/preset_schedule_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/reminder_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/remote_control_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/screen_privacy_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/screen_text_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/screensaver_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/signage_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/smart_pause_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/usage_report_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/window_pin_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/window_replica_dialog.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/menu/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/menu/help_menu.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/menu/how_to_menu.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/menu/language_menu.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/menu/preset_menu.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/nav/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/nav/sidebar.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/control_center/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/focus/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/focus/focus_setting_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/gif/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/gif/gif_setting_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/image/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/image/image_setting_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/layout_kit.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/particle/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/particle/particle_setting_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/pet/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/pet/pet_setting_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/presentation/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_manager.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/base_scene_page.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/gif.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/image.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/registry.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/sound.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/text.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/video.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/web.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_setting_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/screen_care/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/screen_care/screen_care_setting_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/sound_player/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/sound_player/sound_player_setting_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/text/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/tools/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/tools/tools_setting_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/utils.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/video/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/video/video_setting_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/wallpaper/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/wallpaper/wallpaper_setting_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/web/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/web/web_setting_ui.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/widgets/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/style/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/style/app_style.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/user_setting/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/user_setting/preset_repository.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/user_setting/scene_setting.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/app_profile/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/app_profile/app_profile_service.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/audio_envelope.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/loopback_capture.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/microphone_meter.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/screen_audio.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/spectrum_analyzer.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/system_audio_meter.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/autostart/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/autostart/autostart_service.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/break_reminder/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/break_reminder/break_reminder.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/browser/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/browser/browser.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/clipboard/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/clipboard/clipboard_history.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/clipboard/clipboard_watcher.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/color_vision/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/color_vision/color_vision.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/critical_exit/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/critical_exit/check_key_is_press.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/critical_exit/critical_exit.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/critical_exit/win32_vk.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/exception/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/exception/exception_tags.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/exception/exceptions.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/focus_shield/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/focus_shield/focus_shield.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/focus_timer/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/focus_timer/focus_timer.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/hotkey/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/hotkey/hotkey_service.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/input_watch/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/input_watch/typing_watch.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/json/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/json/json_file.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/json/json_repository.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/keep_awake/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/keep_awake/keep_awake.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/logging/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/logging/loggin_instance.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/measure/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/measure/measure.py +0 -0
- {frontengine-1.0.76/frontengine/utils/midi → frontengine-1.0.77/frontengine/utils/media_keys}/__init__.py +0 -0
- {frontengine-1.0.76/frontengine/utils/multi_language → frontengine-1.0.77/frontengine/utils/midi}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/midi/midi_input.py +0 -0
- {frontengine-1.0.76/frontengine/utils/now_playing → frontengine-1.0.77/frontengine/utils/multi_language}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/language_wrapper.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/retranslate.py +0 -0
- {frontengine-1.0.76/frontengine/utils/pet_chat → frontengine-1.0.77/frontengine/utils/now_playing}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/now_playing/now_playing.py +0 -0
- {frontengine-1.0.76/frontengine/utils/platform_info → frontengine-1.0.77/frontengine/utils/pet_chat}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/pet_chat/pet_chat_service.py +0 -0
- {frontengine-1.0.76/frontengine/utils/playlist → frontengine-1.0.77/frontengine/utils/platform_info}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/platform_info/platform_info.py +0 -0
- {frontengine-1.0.76/frontengine/utils/plugins → frontengine-1.0.77/frontengine/utils/playlist}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/playlist/playlist.py +0 -0
- {frontengine-1.0.76/frontengine/utils/power_mode → frontengine-1.0.77/frontengine/utils/plugins}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/plugins/plugin_loader.py +0 -0
- {frontengine-1.0.76/frontengine/utils/preset_schedule → frontengine-1.0.77/frontengine/utils/power_mode}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/power_mode/power_mode.py +0 -0
- {frontengine-1.0.76/frontengine/utils/recording → frontengine-1.0.77/frontengine/utils/preset_schedule}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/preset_schedule/preset_schedule_service.py +0 -0
- {frontengine-1.0.76/frontengine/utils/redirect_manager → frontengine-1.0.77/frontengine/utils/recording}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/recording/frame_recorder.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/recording/gif_writer.py +0 -0
- {frontengine-1.0.76/frontengine/utils/reminder → frontengine-1.0.77/frontengine/utils/redirect_manager}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/redirect_manager/redirect_manager_class.py +0 -0
- {frontengine-1.0.76/frontengine/utils/remote → frontengine-1.0.77/frontengine/utils/reminder}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/reminder/reminder_service.py +0 -0
- {frontengine-1.0.76/frontengine/utils/screen_privacy → frontengine-1.0.77/frontengine/utils/remote}/__init__.py +0 -0
- {frontengine-1.0.76/frontengine/utils/screen_text → frontengine-1.0.77/frontengine/utils/rules}/__init__.py +0 -0
- {frontengine-1.0.76/frontengine/utils/screensaver → frontengine-1.0.77/frontengine/utils/screen_privacy}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/screen_privacy/capture_affinity.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/screen_privacy/share_watch.py +0 -0
- {frontengine-1.0.76/frontengine/utils/signage → frontengine-1.0.77/frontengine/utils/screen_text}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/screen_text/screen_text_service.py +0 -0
- {frontengine-1.0.76/frontengine/utils/smart_pause → frontengine-1.0.77/frontengine/utils/screensaver}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/screensaver/screensaver_service.py +0 -0
- {frontengine-1.0.76/frontengine/utils/steam → frontengine-1.0.77/frontengine/utils/signage}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/signage/signage_service.py +0 -0
- {frontengine-1.0.76/frontengine/utils/system_stats → frontengine-1.0.77/frontengine/utils/smart_pause}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/smart_pause/pause_rules.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/smart_pause/smart_pause_service.py +0 -0
- {frontengine-1.0.76/frontengine/utils/text_source → frontengine-1.0.77/frontengine/utils/steam}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/steam/steam_language.py +0 -0
- {frontengine-1.0.76/frontengine/utils/theme_schedule → frontengine-1.0.77/frontengine/utils/system_stats}/__init__.py +0 -0
- {frontengine-1.0.76/frontengine/utils/usage_tracking → frontengine-1.0.77/frontengine/utils/text_source}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/text_source/text_source.py +0 -0
- {frontengine-1.0.76/frontengine/utils/virtual_camera → frontengine-1.0.77/frontengine/utils/theme_schedule}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/theme_schedule/theme_schedule_service.py +0 -0
- {frontengine-1.0.76/frontengine/utils/weather → frontengine-1.0.77/frontengine/utils/usage_tracking}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/usage_tracking/usage_service.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/usage_tracking/usage_tracker.py +0 -0
- {frontengine-1.0.76/frontengine/utils/window_pin → frontengine-1.0.77/frontengine/utils/virtual_camera}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/virtual_camera/camera_feed.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/virtual_camera/virtual_camera.py +0 -0
- {frontengine-1.0.76/frontengine/utils/window_replica → frontengine-1.0.77/frontengine/utils/virtual_desktop}/__init__.py +0 -0
- {frontengine-1.0.76/frontengine/utils/workshop → frontengine-1.0.77/frontengine/utils/weather}/__init__.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/web_url.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/window_pin/window_layout.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/window_pin/window_pin.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/window_replica/dwm_thumbnail.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/workshop/workshop_content.py +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine.egg-info/dependency_links.txt +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine.egg-info/entry_points.txt +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine.egg-info/requires.txt +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/frontengine.egg-info/top_level.txt +0 -0
- {frontengine-1.0.76 → frontengine-1.0.77}/setup.cfg +0 -0
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: frontengine
|
|
3
|
+
Version: 1.0.77
|
|
4
|
+
Summary: FrontEngine is use-define frontview or only use like screen saver
|
|
5
|
+
Author-email: JE-Chen <jechenmailman@gmail.com>
|
|
6
|
+
Project-URL: Homepage, https://github.com/Intergration-Automation-Testing/FrontEngine
|
|
7
|
+
Project-URL: Code, https://github.com/Intergration-Automation-Testing/FrontEngine
|
|
8
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
9
|
+
Classifier: Development Status :: 2 - Pre-Alpha
|
|
10
|
+
Classifier: Environment :: Win32 (MS Windows)
|
|
11
|
+
Classifier: Environment :: MacOS X
|
|
12
|
+
Classifier: Environment :: X11 Applications
|
|
13
|
+
Classifier: Operating System :: OS Independent
|
|
14
|
+
Requires-Python: >=3.10
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
License-File: LICENSE
|
|
17
|
+
Requires-Dist: PySide6==6.11.1
|
|
18
|
+
Requires-Dist: qt-material
|
|
19
|
+
Requires-Dist: PyOpenGL
|
|
20
|
+
Requires-Dist: PyOpenGL_accelerate
|
|
21
|
+
Requires-Dist: numpy
|
|
22
|
+
Requires-Dist: pynput
|
|
23
|
+
Dynamic: license-file
|
|
24
|
+
|
|
25
|
+
# FrontEngine
|
|
26
|
+
|
|
27
|
+
[](https://github.com/JeffreyChen-SteamProjects/FrontEngine/actions/workflows/ci.yml)
|
|
28
|
+
[](https://pypi.org/project/frontengine/)
|
|
29
|
+
[](https://pypi.org/project/frontengine/)
|
|
30
|
+
|
|
31
|
+
**Put anything on top of your screen — or underneath it.**
|
|
32
|
+
|
|
33
|
+
FrontEngine is a desktop overlay app. Video, images, GIFs, web pages, text,
|
|
34
|
+
particles, sound and an animated pet can be placed over every other window
|
|
35
|
+
(click-through, so what is underneath still works), or behind them as a live
|
|
36
|
+
wallpaper. Around that sits a set of tools for the screen itself: eye-comfort
|
|
37
|
+
filters, presentation annotation, measuring and capture, focus masks and
|
|
38
|
+
desktop widgets.
|
|
39
|
+
|
|
40
|
+
[Support this project on Steam](https://store.steampowered.com/app/2793470/FrontEngine/)
|
|
41
|
+
· [Documentation](https://frontengine.readthedocs.io/en/latest/)
|
|
42
|
+
· [Watch a demo](https://youtu.be/fewogcb3b8Y)
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Install
|
|
49
|
+
|
|
50
|
+
Python **3.10+**. Windows 10/11 is the primary target; macOS and Linux run the
|
|
51
|
+
app, with the platform differences listed under [Platform support](#platform-support).
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
pip install frontengine
|
|
55
|
+
|
|
56
|
+
frontengine # or: python -m frontengine
|
|
57
|
+
frontengine --preset "Work" # apply a saved preset on launch
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Pre-built Windows binaries are on the
|
|
61
|
+
[Releases page](https://github.com/JeffreyChen-SteamProjects/FrontEngine/releases),
|
|
62
|
+
and the Steam build ships the same application with Workshop support.
|
|
63
|
+
|
|
64
|
+
> **Getting out.** Overlays can cover the whole screen, including FrontEngine's
|
|
65
|
+
> own window, so there are two escape hatches that do not need the mouse:
|
|
66
|
+
> `Ctrl+Shift+F12` closes every overlay, and **F12 quits the application
|
|
67
|
+
> outright** from anywhere (Windows only — see *Help → How to force close*).
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## What it puts on screen
|
|
72
|
+
|
|
73
|
+
The sidebar groups the pages by what they are for. This section follows it.
|
|
74
|
+
|
|
75
|
+
### On screen
|
|
76
|
+
|
|
77
|
+
Media overlays. Each one picks its monitor (or spans all of them), remembers
|
|
78
|
+
where you dragged it, and has its own opacity.
|
|
79
|
+
|
|
80
|
+
- **Video** — with volume, playback rate and looping.
|
|
81
|
+
- **Image** — a single picture, a folder as a slideshow, or a **reference
|
|
82
|
+
board**: several images on one canvas, each draggable, the whole board
|
|
83
|
+
zoomable and pannable.
|
|
84
|
+
- **Web** — a URL or a local HTML file, optionally interactive. **Dashboard
|
|
85
|
+
mode** rotates through a list of URLs, so a wall display can cycle pages on a
|
|
86
|
+
hotkey or a timer.
|
|
87
|
+
- **GIF / WebP** — animations at an adjustable speed.
|
|
88
|
+
- **Text** — font, colour, outline, alignment and a marquee, showing either a
|
|
89
|
+
fixed string or a **live source**: clock, date, countdown, stopwatch, system
|
|
90
|
+
load, or the weather. The live sources take a `{field}` template, and the page
|
|
91
|
+
lists the fields each one offers.
|
|
92
|
+
- **Sound** — music playback and low-latency WAV effects.
|
|
93
|
+
- **Scene** — combine several of the above into one composition described by a
|
|
94
|
+
JSON document you can save and share.
|
|
95
|
+
- **Particle** — an OpenGL particle effect.
|
|
96
|
+
|
|
97
|
+
<details>
|
|
98
|
+
<summary>Screenshots (GIFs may take a moment to load)</summary>
|
|
99
|
+
|
|
100
|
+
| GIF | WebP |
|
|
101
|
+
| --- | --- |
|
|
102
|
+
|  |  |
|
|
103
|
+
|
|
104
|
+
| Video | Website |
|
|
105
|
+
| --- | --- |
|
|
106
|
+
|  |  |
|
|
107
|
+
|
|
108
|
+
</details>
|
|
109
|
+
|
|
110
|
+
### Desktop
|
|
111
|
+
|
|
112
|
+
**Desktop pet** — an animated sprite that lives on your desktop.
|
|
113
|
+
|
|
114
|
+
- **Sprites** — a single GIF/WebP/PNG, or a *pet pack* folder whose file names
|
|
115
|
+
map to states: `walk`, `idle`, `sleep`, `climb`, `fall`, `drag` (a missing
|
|
116
|
+
state falls back to `walk`). An optional `pet.json` sets size, speed and
|
|
117
|
+
whether it may climb, talk or sit on windows.
|
|
118
|
+
- **Behaviour** — walk on the floor with gravity (throw it and it bounces),
|
|
119
|
+
wander freely, or chase the cursor. Floor pets climb screen edges and stand on
|
|
120
|
+
the top edge of other windows.
|
|
121
|
+
- **Life** — mood, fullness and an affection level that persist between runs.
|
|
122
|
+
It grows as it levels up, talks in speech bubbles, naps while you are away and
|
|
123
|
+
warns you about a low battery.
|
|
124
|
+
- **Interaction** — drag it, right-click to clone / feed / set a reminder, and
|
|
125
|
+
**drop a file onto it**: an image or pet pack becomes its new look, anything
|
|
126
|
+
else is eaten. What it eats matters — an archive is a feast, music cheers it
|
|
127
|
+
up more than it fills, a document is a modest meal, a binary is too hard to
|
|
128
|
+
chew.
|
|
129
|
+
- **Tag** — with two or more pets on screen, tick *Play tag with each other* and
|
|
130
|
+
one becomes "it": it walks toward its nearest neighbour while the others run
|
|
131
|
+
the other way, and catching someone passes the tag on.
|
|
132
|
+
- **Reacts to sound** — the pet pulses with your speakers' output, or with your
|
|
133
|
+
**microphone** so it moves while you talk. Both read only the output *meter* —
|
|
134
|
+
a number, not audio. Peaks are smoothed with an RMS window and a
|
|
135
|
+
fast-attack/slow-decay envelope so the pulse breathes instead of flickering.
|
|
136
|
+
With several monitors, each pet follows the audio endpoint matching its own
|
|
137
|
+
screen.
|
|
138
|
+
- **Focus timer** — a pomodoro on the same page, announced by the pet: it tells
|
|
139
|
+
you when focus ends and when the break is over.
|
|
140
|
+
- **Chat** — the pet can answer you through Claude when `ANTHROPIC_API_KEY` is
|
|
141
|
+
set. Off unless you enable it; see [What leaves the machine](#what-leaves-the-machine).
|
|
142
|
+
|
|
143
|
+
**Wallpaper** — play a folder of images and animations *beneath* every window.
|
|
144
|
+
Each monitor points at its own folder with its own timer, shuffled or read
|
|
145
|
+
recursively, and can pulse with the speaker level. A second folder can take over
|
|
146
|
+
during quiet hours.
|
|
147
|
+
|
|
148
|
+
**Widgets** — four things that sit on the desktop:
|
|
149
|
+
|
|
150
|
+
- **Audio spectrum** — bars or a ring, log-spaced bands, smoothed with a
|
|
151
|
+
fast-attack/slow-decay follower and peak markers that drift down.
|
|
152
|
+
- **Now playing** — the current track from Windows' media controls when the
|
|
153
|
+
optional `winsdk` bindings are installed; otherwise the name of the app that
|
|
154
|
+
is actually making sound.
|
|
155
|
+
- **System monitor** — CPU, memory, disk, battery and network throughput as
|
|
156
|
+
small sparklines; tick the lines you want. An average hides a stall; a line
|
|
157
|
+
does not. A hidden line keeps recording, so turning it back on shows what
|
|
158
|
+
happened meanwhile.
|
|
159
|
+
- **Sticky notes** — editable cards above every window, keeping their text,
|
|
160
|
+
colour and position between sessions.
|
|
161
|
+
|
|
162
|
+
### Work
|
|
163
|
+
|
|
164
|
+
**Focus** — two overlays for when the screen competes with your work. *Dim
|
|
165
|
+
background windows* shades everything except the window you are working in, at
|
|
166
|
+
an adjustable strength. *Cover a distraction* masks a strip of the screen: the
|
|
167
|
+
taskbar, a notification corner, an edge, or all of it. Both pass clicks
|
|
168
|
+
through, so what they cover still works — it just stops pulling your eye.
|
|
169
|
+
|
|
170
|
+
**Screen care** — for long sessions at the screen:
|
|
171
|
+
|
|
172
|
+
- **Colour filter** — seven tints from warm through amber and rose to grey, at
|
|
173
|
+
an adjustable strength.
|
|
174
|
+
- **Reading ruler** — dims the page and leaves a bright band that follows the
|
|
175
|
+
cursor.
|
|
176
|
+
- **Break reminder** — the 20-20-20 rule, with a rest overlay when the interval
|
|
177
|
+
is up.
|
|
178
|
+
- **Colour-vision simulation** — protanopia, deuteranopia, tritanopia and
|
|
179
|
+
achromatopsia at an adjustable severity, using the Machado et al. (2009)
|
|
180
|
+
model. Unlike the other overlays this one is opaque, because showing what
|
|
181
|
+
someone else sees means repainting the screen rather than tinting it.
|
|
182
|
+
|
|
183
|
+
**Presenting** — for demos, lessons and recordings:
|
|
184
|
+
|
|
185
|
+
- **Annotation** — draw over the screen with a pen, highlighter or eraser, with
|
|
186
|
+
undo and clear.
|
|
187
|
+
- **Cursor effects** — a ring around the pointer, a ripple on click, and a
|
|
188
|
+
spotlight that dims everything else.
|
|
189
|
+
- **Keystroke display** — shows what you just pressed, and which mouse button
|
|
190
|
+
you clicked, so viewers can follow along; it fades after a couple of seconds.
|
|
191
|
+
Pick where the panel sits and how big the text is, and turn mouse clicks off
|
|
192
|
+
on their own.
|
|
193
|
+
- **Magnifier** — a zoomed view of the area around the cursor.
|
|
194
|
+
- **Whiteboard** — an infinite canvas: drag to pan, scroll to zoom, save what
|
|
195
|
+
you drew. Strokes live in canvas coordinates, so panning and zooming leaves
|
|
196
|
+
them where they belong.
|
|
197
|
+
- **Freeze** — pin the current frame of a monitor so you can keep working
|
|
198
|
+
behind a still image. `Ctrl+Shift+F7` releases it, which matters because the
|
|
199
|
+
frozen image covers the button that would.
|
|
200
|
+
|
|
201
|
+
**Tools** — measuring, capture and window handling:
|
|
202
|
+
|
|
203
|
+
- **Colour picker / pixel ruler / protractor** — click to sample or measure; the
|
|
204
|
+
result goes straight to the clipboard as `#rrggbb`, `rgb(...)`, `hsl(...)` or
|
|
205
|
+
a CSS custom property.
|
|
206
|
+
- **Region capture** — drag out an area; it lands on the clipboard, can be saved
|
|
207
|
+
to a file, or **pinned** on top as a floating, zoomable copy.
|
|
208
|
+
- **Record area** — record a region to an animated GIF, with the camera
|
|
209
|
+
composited into the corner for the reaction-video look. Capped by both length
|
|
210
|
+
and frame count, because every frame is held in memory.
|
|
211
|
+
- **Camera** — your webcam in a circle, rounded box or rectangle, shown locally
|
|
212
|
+
and never recorded. Any video input works, including capture cards, and the
|
|
213
|
+
device list refreshes without a restart since cards are usually plugged in
|
|
214
|
+
while the app is already running.
|
|
215
|
+
- **Virtual camera** — send a region, overlays and all, as a webcam that Zoom,
|
|
216
|
+
Teams or Discord can select as their video source. Needs the optional
|
|
217
|
+
`pyvirtualcam` package and a virtual camera driver (OBS installs one); without
|
|
218
|
+
either, the button says so rather than failing quietly.
|
|
219
|
+
- **Read text** — drag out an area to copy the text in it, translate it, or ask
|
|
220
|
+
a question about it. This one sends the selection off the machine; see
|
|
221
|
+
[What leaves the machine](#what-leaves-the-machine).
|
|
222
|
+
- **Pin a window** — keep another program's window on top, or fade it, while you
|
|
223
|
+
work against it. Only stacking and opacity are touched, never window content.
|
|
224
|
+
- **Window replica** — a small always-on-top live copy of another window, so you
|
|
225
|
+
can watch a render or a chat while it is buried.
|
|
226
|
+
- **Window layouts** — save where every window sits and put them back later.
|
|
227
|
+
Windows are matched by title; one that is not on screen is skipped rather than
|
|
228
|
+
guessed at.
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Controlling everything at once
|
|
233
|
+
|
|
234
|
+
The **Control center** page reaches every overlay on every page, whichever tab
|
|
235
|
+
opened it: hide, show, close, mute, lock, reset positions, step the opacity, and
|
|
236
|
+
apply a **quality tier** (high / balanced / saver) that caps each overlay's
|
|
237
|
+
refresh rate and drops its render resolution. It also carries a chroma-key
|
|
238
|
+
background for OBS, a *Hide from capture* toggle, the log panel, and **Pin to
|
|
239
|
+
this desktop** — the overlays step aside when you switch virtual desktop and
|
|
240
|
+
return when you come back. Unpinning brings back whatever it put away.
|
|
241
|
+
|
|
242
|
+
Default global hotkeys, all rebindable from **Settings → Hotkeys**:
|
|
243
|
+
|
|
244
|
+
| Shortcut | Action |
|
|
245
|
+
| --- | --- |
|
|
246
|
+
| `Ctrl+Shift+F12` | Close every overlay |
|
|
247
|
+
| `Ctrl+Shift+F11` / `F10` | Hide / show every overlay |
|
|
248
|
+
| `Ctrl+Shift+F9` | Mute everything |
|
|
249
|
+
| `Ctrl+Shift+↑` / `↓` | Opacity up / down |
|
|
250
|
+
| `Ctrl+Shift+L` | Lock or unlock (click-through vs draggable) |
|
|
251
|
+
| `Ctrl+Shift+→` | Next dashboard page |
|
|
252
|
+
| `Ctrl+Shift+F8` | Show the shortcut sheet on screen |
|
|
253
|
+
| `Ctrl+Shift+F7` | Freeze / unfreeze the screen |
|
|
254
|
+
| `Ctrl+Shift+F6` / `F5` / `F4` | Media play/pause, next and previous track |
|
|
255
|
+
| `Ctrl+Shift+F3` | Move the foreground window to the next monitor |
|
|
256
|
+
| `F12` | Quit immediately (Windows) |
|
|
257
|
+
|
|
258
|
+
Media transport sends the system media keys, so it reaches any player that
|
|
259
|
+
listens for them. Moving a window keeps its proportions rather than snapping it
|
|
260
|
+
across, which is what Windows' own `Win+Shift+Arrow` does.
|
|
261
|
+
|
|
262
|
+
The same actions — and nothing beyond them — are what the remote controls drive:
|
|
263
|
+
|
|
264
|
+
- **Your phone** (Settings → Remote control) — FrontEngine serves a small page on
|
|
265
|
+
your local network; open the link on a phone and the buttons drive those
|
|
266
|
+
actions.
|
|
267
|
+
- **A MIDI controller** — press *Learn*, move a knob or pad, and bind it. It uses
|
|
268
|
+
Windows' built-in winmm, so no extra package is needed. A knob fires once it
|
|
269
|
+
reaches the top rather than repeatedly on the way, and releasing a pad does not
|
|
270
|
+
count as a second press.
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## Presets and automation
|
|
275
|
+
|
|
276
|
+
**Presets** capture the settings of every page at once. Save, load, delete,
|
|
277
|
+
export and import them from the **Presets** menu, apply one on launch, or
|
|
278
|
+
restore the previous session automatically. A preset can be exported as a
|
|
279
|
+
**package** — a zip carrying the media it references — so it opens on a machine
|
|
280
|
+
that does not have those files.
|
|
281
|
+
|
|
282
|
+
Things that then decide for themselves, all from the **Settings** menu. Smart
|
|
283
|
+
pause is the only one that starts out on; everything else is off until you
|
|
284
|
+
switch it on.
|
|
285
|
+
|
|
286
|
+
| | |
|
|
287
|
+
| --- | --- |
|
|
288
|
+
| **Rules** | *"When these conditions hold, do this."* Combine a weekday, a time window and which application has focus, then apply a preset, hide/show/close the overlays, or set the quality. A blank condition means "any", and a rule runs **once** when its conditions start holding rather than repeatedly while they do. This is the one place conditions compose; the rows below each know a single kind. |
|
|
289
|
+
| **Smart pause** | Stand the overlays down while a fullscreen app runs, while the machine is on battery, or while a named app has focus. *(On by default, for the fullscreen rule.)* |
|
|
290
|
+
| **App profiles** | Apply a preset when you switch to a given app. |
|
|
291
|
+
| **Preset schedule** | Apply a preset on chosen weekdays at a set time. |
|
|
292
|
+
| **Theme schedule** | Switch between a day and a night theme by the clock. |
|
|
293
|
+
| **Signage mode** | Rotate a list of presets on a timer with the main window put away, for a machine left running as a display. |
|
|
294
|
+
| **Screensaver** | After an idle threshold, bring up the video / image / GIF / particle / web page you chose, and take it down when you come back. |
|
|
295
|
+
| **Reminders** | Every N minutes, or once a day at a set time, shown as a toast that closes itself. |
|
|
296
|
+
| **Keep awake** | Stop the display sleeping while overlays are up. |
|
|
297
|
+
| **Start with the system** | Launch at login. |
|
|
298
|
+
| **Screen time** | Which apps had focus and for how long, with a daily breakdown and a seven-day summary. It pauses while you are away from the keyboard, keeps 60 days at most, and clearing deletes the file itself. |
|
|
299
|
+
| **Clipboard history** | Search what you copied and pin the phrases you reuse. Clipboards routinely hold passwords, so this is kept **in memory only** unless you separately tick "keep between sessions". |
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## Languages
|
|
304
|
+
|
|
305
|
+
Seven: English, 繁體中文, 简体中文, Deutsch, Русский, Français, Italiano.
|
|
306
|
+
|
|
307
|
+
Pick one from the **Language** menu and the interface changes **immediately** —
|
|
308
|
+
no restart. Whatever you had open stays open: overlays keep running, and the
|
|
309
|
+
settings on every page are left exactly as they were. On a Steam install the
|
|
310
|
+
first launch follows the Steam client's own language.
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## Privacy and platform notes
|
|
315
|
+
|
|
316
|
+
### What leaves the machine
|
|
317
|
+
|
|
318
|
+
Everything in FrontEngine is local unless it is on this list. There are four
|
|
319
|
+
exceptions, all opt-in:
|
|
320
|
+
|
|
321
|
+
| Feature | Where it goes | Guard |
|
|
322
|
+
| --- | --- | --- |
|
|
323
|
+
| **Read text** (Tools) | The selected region is sent to Anthropic's API | Asks once before the first send and remembers the answer; consent can be withdrawn from the result window. Uses your own `ANTHROPIC_API_KEY`, read from the environment and never written to a settings file. Nothing is sent without both. |
|
|
324
|
+
| **Pet chat** | Your message goes to Anthropic's API | Same key, same rule; off by default. |
|
|
325
|
+
| **Weather** (text source) | Coordinates go to Open-Meteo | No key, no account, no identifying data; only what you typed as a location. |
|
|
326
|
+
| **Phone remote** | Serves a page on your local network | Off by default. The link carries a token regenerated on every start, so an old link stops working, and the page can only ask for the fixed action list. It is plain HTTP: someone else on the same network could read the token and press the same buttons — a nuisance rather than a breach given what those buttons do, but leave it off on networks you do not trust. |
|
|
327
|
+
|
|
328
|
+
The audio features read only an output **meter** — a single number — except the
|
|
329
|
+
spectrum, which needs real samples to compute frequencies and so captures the
|
|
330
|
+
system output stream. Those samples are analysed in memory, never written to
|
|
331
|
+
disk or sent anywhere, and capture stops the moment you stop the spectrum.
|
|
332
|
+
|
|
333
|
+
**Plugins** are Python and run with the same privileges as FrontEngine — they
|
|
334
|
+
cannot be sandboxed. Loading is off by default (Settings → Load plugins), every
|
|
335
|
+
load is logged, and one broken plugin is skipped rather than stopping the app.
|
|
336
|
+
Install only plugins you trust.
|
|
337
|
+
|
|
338
|
+
### Screen-sharing privacy
|
|
339
|
+
|
|
340
|
+
Your overlays are for you, not for the people you are sharing with. From
|
|
341
|
+
**Settings → Screen-sharing privacy**, FrontEngine can take them out of the
|
|
342
|
+
capture while a meeting app is open:
|
|
343
|
+
|
|
344
|
+
- **They stay on your own screen.** Only the captured copy is blank — this uses
|
|
345
|
+
Windows' `WDA_EXCLUDEFROMCAPTURE`, an OS-level flag conferencing apps and
|
|
346
|
+
recorders honour.
|
|
347
|
+
- **Masks are the exception.** A distraction mask exists to cover something, so
|
|
348
|
+
it deliberately stays visible in the capture.
|
|
349
|
+
- **The trigger is your list.** Windows has no dependable "am I being captured"
|
|
350
|
+
API, so it watches for window titles you name — which also catches a meeting
|
|
351
|
+
held in a browser tab, where the executable is just the browser.
|
|
352
|
+
|
|
353
|
+
There is a manual *Hide from capture* button in the control center too.
|
|
354
|
+
|
|
355
|
+
> This is privacy, not security: it defeats the ordinary capture path, and it
|
|
356
|
+
> never hides anything from the person sitting at the desk.
|
|
357
|
+
|
|
358
|
+
### Platform support
|
|
359
|
+
|
|
360
|
+
Everything not listed here works on all three platforms.
|
|
361
|
+
|
|
362
|
+
| Feature | Windows | macOS | Linux |
|
|
363
|
+
| --- | :---: | :---: | :---: |
|
|
364
|
+
| Overlays, pet, wallpaper, presenting, screen care, capture, recording | ✅ | ✅ | ✅ |
|
|
365
|
+
| Audio reaction, spectrum, lip-sync (WASAPI) | ✅ | — | — |
|
|
366
|
+
| Now playing (media controls) | ✅ | — | — |
|
|
367
|
+
| Pin / fade another window, window layouts, live replica | ✅ | — | — |
|
|
368
|
+
| Hide overlays from screen capture | ✅ | — | — |
|
|
369
|
+
| MIDI control (winmm) | ✅ | — | — |
|
|
370
|
+
| Media transport keys | ✅ | — | — |
|
|
371
|
+
| Pin overlays to a virtual desktop | ✅ | — | — |
|
|
372
|
+
| Move a window to the next monitor | ✅ | — | — |
|
|
373
|
+
| `F12` emergency exit | ✅ | — | — |
|
|
374
|
+
| Dim background around the *active* window | ✅ | whole screen | whole screen |
|
|
375
|
+
| Pet standing on other windows | ✅ | — | with `wmctrl` |
|
|
376
|
+
|
|
377
|
+
Where a feature cannot work, the button says so rather than failing quietly.
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## Extending
|
|
382
|
+
|
|
383
|
+
- **Steam Workshop** — subscribed items are picked up from Steam's own
|
|
384
|
+
`steamapps/workshop/content` folder: presets are imported and pet packs are
|
|
385
|
+
listed with their paths, from **Presets → Import Workshop content**.
|
|
386
|
+
Publishing to the Workshop needs the Steamworks SDK and is not built in.
|
|
387
|
+
- **Plugins** — a `plugins/` folder can add its own tabs, either through a
|
|
388
|
+
`FRONTENGINE_TABS = {"name": WidgetClass}` mapping or a `register(registry)`
|
|
389
|
+
hook. Read the trust note above first.
|
|
390
|
+
|
|
391
|
+
---
|
|
392
|
+
|
|
393
|
+
## Development
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
pip install -r dev_requirements.txt
|
|
397
|
+
pip install -e .
|
|
398
|
+
|
|
399
|
+
python -m pytest tests/ -q # the whole suite, headless (Qt offscreen)
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
Static checking uses pyflakes (`pip install pyflakes`), and a clean tree prints
|
|
403
|
+
nothing at all:
|
|
404
|
+
|
|
405
|
+
```bash
|
|
406
|
+
python -m pyflakes frontengine/ exe/ tests/
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
The test suite runs entirely offscreen and needs no display, sound card or
|
|
410
|
+
camera; anything that touches the outside world takes an injectable source so
|
|
411
|
+
it can be tested with a fake one.
|
|
412
|
+
|
|
413
|
+
- **Architecture** — [`architecture_explore.md`](architecture_explore.md) maps
|
|
414
|
+
every module, the layering, the overlay contract and the extension points.
|
|
415
|
+
Read it before adding a page or an overlay: several things (the control
|
|
416
|
+
center registry, seven language dictionaries, seven documentation trees) have
|
|
417
|
+
to be updated together, and the tests enforce that.
|
|
418
|
+
- **Contributing** — see [`CONTRIBUTING.md`](CONTRIBUTING.md). One feature per
|
|
419
|
+
pull request, all CI checks green.
|
|
420
|
+
- **Building the Windows executable** — `python exe/build_exe.py`
|
|
421
|
+
(Nuitka; add `--onefile` for a single file).
|
|
422
|
+
- **Documentation** — Sphinx sources in `docs/`, published to
|
|
423
|
+
[Read the Docs](https://frontengine.readthedocs.io/en/latest/) in all seven
|
|
424
|
+
languages.
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
## Continuous integration and releases
|
|
429
|
+
|
|
430
|
+
| Workflow | Trigger | Purpose |
|
|
431
|
+
| --- | --- | --- |
|
|
432
|
+
| `CI` (`ci.yml`) | Push / PR to `main` or `dev`, or called by `Nightly` | Compile, run the unit tests, then build a wheel from *that checkout*, install it and start the app — on Python 3.10 / 3.11 / 3.12, Windows |
|
|
433
|
+
| `Nightly` (`nightly.yml`) | Daily cron, manual dispatch | Calls `CI`. The schedule lives here on purpose: GitHub disables workflows containing a cron after ~60 days of inactivity, and that would otherwise take the PR checks down with it |
|
|
434
|
+
| `Release` (`release.yml`) | A pull request is merged into `main`, or manual dispatch | Bumps the version, commits it back with `[skip ci]`, swaps `stable.toml` → `pyproject.toml`, builds sdist + wheel, uploads to PyPI as `frontengine`, and creates a GitHub release tagged `v<version>` |
|
|
435
|
+
|
|
436
|
+
Publishing happens **only on merge to `main`** — pushing to `dev` runs CI and
|
|
437
|
+
never publishes. The patch segment bumps automatically; for a minor or major
|
|
438
|
+
release, run *Actions → Release → Run workflow* and pick the segment. That path
|
|
439
|
+
also re-runs a failed publish without needing a new merge.
|
|
440
|
+
|
|
441
|
+
Versions live in two files: `pyproject.toml` is the dev package
|
|
442
|
+
(`frontengine_dev`) and `stable.toml` is the published one (`frontengine`).
|
|
443
|
+
|
|
444
|
+
One repository secret is required: `PYPI_API_TOKEN`, a PyPI token scoped to the
|
|
445
|
+
`frontengine` project. The workflow uses `__token__` as the twine username, so
|
|
446
|
+
only the token itself needs storing.
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
## License
|
|
451
|
+
|
|
452
|
+
See [`LICENSE`](LICENSE). Community expectations are in
|
|
453
|
+
[`Contributor_Covenant_Code_of_Conduct.md`](Contributor_Covenant_Code_of_Conduct.md).
|