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.
Files changed (289) hide show
  1. frontengine-1.0.77/PKG-INFO +453 -0
  2. frontengine-1.0.77/README.md +429 -0
  3. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/monitor/monitor_widget.py +134 -31
  4. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/presentation/keystroke_display.py +122 -4
  5. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/hotkey_settings_dialog.py +5 -0
  6. frontengine-1.0.77/frontengine/ui/dialog/rules_dialog.py +221 -0
  7. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/main_ui.py +76 -1
  8. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/menu/settings_menu.py +9 -0
  9. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/control_center/control_center_ui.py +50 -2
  10. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/presentation/presentation_setting_ui.py +70 -11
  11. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/text/text_setting_ui.py +32 -4
  12. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/widgets/widgets_setting_ui.py +49 -2
  13. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/user_setting/user_setting_file.py +18 -0
  14. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/input_watch/input_watch_service.py +29 -3
  15. frontengine-1.0.77/frontengine/utils/media_keys/media_keys.py +136 -0
  16. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/english.py +720 -686
  17. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/france.py +710 -676
  18. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/germany.py +713 -679
  19. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/italy.py +710 -676
  20. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/russian.py +710 -676
  21. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/simplified_chinese.py +712 -678
  22. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/traditional_chinese.py +719 -685
  23. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/remote/remote_server.py +2 -1
  24. frontengine-1.0.77/frontengine/utils/rules/rule_engine.py +349 -0
  25. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/system_stats/system_stats.py +111 -20
  26. frontengine-1.0.77/frontengine/utils/virtual_desktop/virtual_desktop.py +307 -0
  27. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/weather/weather_service.py +10 -0
  28. frontengine-1.0.77/frontengine/utils/window_pin/__init__.py +0 -0
  29. frontengine-1.0.77/frontengine/utils/window_pin/monitor_move.py +296 -0
  30. frontengine-1.0.77/frontengine/utils/window_replica/__init__.py +0 -0
  31. frontengine-1.0.77/frontengine/utils/workshop/__init__.py +0 -0
  32. frontengine-1.0.77/frontengine.egg-info/PKG-INFO +453 -0
  33. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine.egg-info/SOURCES.txt +8 -0
  34. {frontengine-1.0.76 → frontengine-1.0.77}/pyproject.toml +1 -1
  35. frontengine-1.0.76/PKG-INFO +0 -362
  36. frontengine-1.0.76/README.md +0 -338
  37. frontengine-1.0.76/frontengine.egg-info/PKG-INFO +0 -362
  38. {frontengine-1.0.76 → frontengine-1.0.77}/LICENSE +0 -0
  39. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/__init__.py +0 -0
  40. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/__main__.py +0 -0
  41. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/__init__.py +0 -0
  42. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/base_widget.py +0 -0
  43. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/camera/__init__.py +0 -0
  44. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/camera/camera_widget.py +0 -0
  45. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/canvas/__init__.py +0 -0
  46. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/canvas/whiteboard_widget.py +0 -0
  47. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/capture/__init__.py +0 -0
  48. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/capture/region_capture.py +0 -0
  49. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/draggable_window.py +0 -0
  50. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/focus_shield/__init__.py +0 -0
  51. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/focus_shield/focus_shield_widget.py +0 -0
  52. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/freeze/__init__.py +0 -0
  53. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/freeze/freeze_widget.py +0 -0
  54. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/gif/__init__.py +0 -0
  55. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/gif/paint_gif.py +0 -0
  56. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/image/__init__.py +0 -0
  57. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/image/paint_image.py +0 -0
  58. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/load/__init__.py +0 -0
  59. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/load/load_someone_make_ui.py +0 -0
  60. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/measure/__init__.py +0 -0
  61. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/measure/measure_widget.py +0 -0
  62. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/monitor/__init__.py +0 -0
  63. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/notes/__init__.py +0 -0
  64. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/notes/sticky_note_widget.py +0 -0
  65. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/overlay_factory.py +0 -0
  66. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/particle/__init__.py +0 -0
  67. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/particle/particle_ui.py +0 -0
  68. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/pet/__init__.py +0 -0
  69. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/pet/desktop_pet.py +0 -0
  70. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/pinned/__init__.py +0 -0
  71. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/pinned/pinned_image.py +0 -0
  72. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/presentation/__init__.py +0 -0
  73. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/presentation/annotation_overlay.py +0 -0
  74. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/presentation/cursor_effects.py +0 -0
  75. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/presentation/magnifier.py +0 -0
  76. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/reference/__init__.py +0 -0
  77. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/reference/reference_board.py +0 -0
  78. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/replica/__init__.py +0 -0
  79. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/replica/replica_widget.py +0 -0
  80. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/scene/__init__.py +0 -0
  81. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/scene/extend_graphic_scene.py +0 -0
  82. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/scene/extend_graphic_view.py +0 -0
  83. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/scene/scene.py +0 -0
  84. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/screen_care/__init__.py +0 -0
  85. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/screen_care/color_vision_widget.py +0 -0
  86. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/screen_care/screen_filter.py +0 -0
  87. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/shortcuts/__init__.py +0 -0
  88. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/shortcuts/shortcut_sheet.py +0 -0
  89. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/sound_player/__init__.py +0 -0
  90. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/sound_player/sound_effect.py +0 -0
  91. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/sound_player/sound_player.py +0 -0
  92. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/spectrum/__init__.py +0 -0
  93. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/spectrum/spectrum_widget.py +0 -0
  94. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/text/__init__.py +0 -0
  95. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/text/draw_text.py +0 -0
  96. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/toast/__init__.py +0 -0
  97. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/toast/toast_widget.py +0 -0
  98. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/video/__init__.py +0 -0
  99. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/video/video_player.py +0 -0
  100. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/wallpaper/__init__.py +0 -0
  101. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/wallpaper/wallpaper_widget.py +0 -0
  102. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/web/__init__.py +0 -0
  103. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/web/webview.py +0 -0
  104. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/show/window_helpers.py +0 -0
  105. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/system_tray/__init__.py +0 -0
  106. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/system_tray/extend_system_tray.py +0 -0
  107. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/__init__.py +0 -0
  108. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/color/__init__.py +0 -0
  109. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/color/global_color.py +0 -0
  110. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/__init__.py +0 -0
  111. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/app_profile_dialog.py +0 -0
  112. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/choose_file_dialog.py +0 -0
  113. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/clipboard_dialog.py +0 -0
  114. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/how_to_use_dialog.py +0 -0
  115. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/preset_schedule_dialog.py +0 -0
  116. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/reminder_dialog.py +0 -0
  117. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/remote_control_dialog.py +0 -0
  118. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/screen_privacy_dialog.py +0 -0
  119. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/screen_text_dialog.py +0 -0
  120. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/screensaver_dialog.py +0 -0
  121. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/signage_dialog.py +0 -0
  122. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/smart_pause_dialog.py +0 -0
  123. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/usage_report_dialog.py +0 -0
  124. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/window_pin_dialog.py +0 -0
  125. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/dialog/window_replica_dialog.py +0 -0
  126. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/menu/__init__.py +0 -0
  127. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/menu/help_menu.py +0 -0
  128. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/menu/how_to_menu.py +0 -0
  129. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/menu/language_menu.py +0 -0
  130. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/menu/preset_menu.py +0 -0
  131. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/nav/__init__.py +0 -0
  132. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/nav/sidebar.py +0 -0
  133. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/__init__.py +0 -0
  134. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/control_center/__init__.py +0 -0
  135. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/focus/__init__.py +0 -0
  136. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/focus/focus_setting_ui.py +0 -0
  137. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/gif/__init__.py +0 -0
  138. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/gif/gif_setting_ui.py +0 -0
  139. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/image/__init__.py +0 -0
  140. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/image/image_setting_ui.py +0 -0
  141. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/layout_kit.py +0 -0
  142. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/particle/__init__.py +0 -0
  143. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/particle/particle_setting_ui.py +0 -0
  144. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/pet/__init__.py +0 -0
  145. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/pet/pet_setting_ui.py +0 -0
  146. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/presentation/__init__.py +0 -0
  147. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/__init__.py +0 -0
  148. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_manager.py +0 -0
  149. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/__init__.py +0 -0
  150. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/base_scene_page.py +0 -0
  151. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/gif.py +0 -0
  152. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/image.py +0 -0
  153. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/registry.py +0 -0
  154. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/sound.py +0 -0
  155. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/text.py +0 -0
  156. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/video.py +0 -0
  157. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_page/web.py +0 -0
  158. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/scene_setting/scene_setting_ui.py +0 -0
  159. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/screen_care/__init__.py +0 -0
  160. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/screen_care/screen_care_setting_ui.py +0 -0
  161. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/sound_player/__init__.py +0 -0
  162. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/sound_player/sound_player_setting_ui.py +0 -0
  163. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/text/__init__.py +0 -0
  164. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/tools/__init__.py +0 -0
  165. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/tools/tools_setting_ui.py +0 -0
  166. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/utils.py +0 -0
  167. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/video/__init__.py +0 -0
  168. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/video/video_setting_ui.py +0 -0
  169. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/wallpaper/__init__.py +0 -0
  170. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/wallpaper/wallpaper_setting_ui.py +0 -0
  171. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/web/__init__.py +0 -0
  172. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/web/web_setting_ui.py +0 -0
  173. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/page/widgets/__init__.py +0 -0
  174. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/style/__init__.py +0 -0
  175. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/ui/style/app_style.py +0 -0
  176. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/user_setting/__init__.py +0 -0
  177. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/user_setting/preset_repository.py +0 -0
  178. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/user_setting/scene_setting.py +0 -0
  179. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/__init__.py +0 -0
  180. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/app_profile/__init__.py +0 -0
  181. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/app_profile/app_profile_service.py +0 -0
  182. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/__init__.py +0 -0
  183. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/audio_envelope.py +0 -0
  184. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/loopback_capture.py +0 -0
  185. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/microphone_meter.py +0 -0
  186. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/screen_audio.py +0 -0
  187. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/spectrum_analyzer.py +0 -0
  188. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/audio_meter/system_audio_meter.py +0 -0
  189. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/autostart/__init__.py +0 -0
  190. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/autostart/autostart_service.py +0 -0
  191. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/break_reminder/__init__.py +0 -0
  192. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/break_reminder/break_reminder.py +0 -0
  193. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/browser/__init__.py +0 -0
  194. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/browser/browser.py +0 -0
  195. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/clipboard/__init__.py +0 -0
  196. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/clipboard/clipboard_history.py +0 -0
  197. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/clipboard/clipboard_watcher.py +0 -0
  198. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/color_vision/__init__.py +0 -0
  199. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/color_vision/color_vision.py +0 -0
  200. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/critical_exit/__init__.py +0 -0
  201. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/critical_exit/check_key_is_press.py +0 -0
  202. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/critical_exit/critical_exit.py +0 -0
  203. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/critical_exit/win32_vk.py +0 -0
  204. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/exception/__init__.py +0 -0
  205. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/exception/exception_tags.py +0 -0
  206. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/exception/exceptions.py +0 -0
  207. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/focus_shield/__init__.py +0 -0
  208. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/focus_shield/focus_shield.py +0 -0
  209. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/focus_timer/__init__.py +0 -0
  210. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/focus_timer/focus_timer.py +0 -0
  211. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/hotkey/__init__.py +0 -0
  212. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/hotkey/hotkey_service.py +0 -0
  213. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/input_watch/__init__.py +0 -0
  214. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/input_watch/typing_watch.py +0 -0
  215. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/json/__init__.py +0 -0
  216. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/json/json_file.py +0 -0
  217. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/json/json_repository.py +0 -0
  218. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/keep_awake/__init__.py +0 -0
  219. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/keep_awake/keep_awake.py +0 -0
  220. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/logging/__init__.py +0 -0
  221. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/logging/loggin_instance.py +0 -0
  222. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/measure/__init__.py +0 -0
  223. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/measure/measure.py +0 -0
  224. {frontengine-1.0.76/frontengine/utils/midi → frontengine-1.0.77/frontengine/utils/media_keys}/__init__.py +0 -0
  225. {frontengine-1.0.76/frontengine/utils/multi_language → frontengine-1.0.77/frontengine/utils/midi}/__init__.py +0 -0
  226. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/midi/midi_input.py +0 -0
  227. {frontengine-1.0.76/frontengine/utils/now_playing → frontengine-1.0.77/frontengine/utils/multi_language}/__init__.py +0 -0
  228. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/language_wrapper.py +0 -0
  229. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/multi_language/retranslate.py +0 -0
  230. {frontengine-1.0.76/frontengine/utils/pet_chat → frontengine-1.0.77/frontengine/utils/now_playing}/__init__.py +0 -0
  231. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/now_playing/now_playing.py +0 -0
  232. {frontengine-1.0.76/frontengine/utils/platform_info → frontengine-1.0.77/frontengine/utils/pet_chat}/__init__.py +0 -0
  233. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/pet_chat/pet_chat_service.py +0 -0
  234. {frontengine-1.0.76/frontengine/utils/playlist → frontengine-1.0.77/frontengine/utils/platform_info}/__init__.py +0 -0
  235. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/platform_info/platform_info.py +0 -0
  236. {frontengine-1.0.76/frontengine/utils/plugins → frontengine-1.0.77/frontengine/utils/playlist}/__init__.py +0 -0
  237. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/playlist/playlist.py +0 -0
  238. {frontengine-1.0.76/frontengine/utils/power_mode → frontengine-1.0.77/frontengine/utils/plugins}/__init__.py +0 -0
  239. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/plugins/plugin_loader.py +0 -0
  240. {frontengine-1.0.76/frontengine/utils/preset_schedule → frontengine-1.0.77/frontengine/utils/power_mode}/__init__.py +0 -0
  241. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/power_mode/power_mode.py +0 -0
  242. {frontengine-1.0.76/frontengine/utils/recording → frontengine-1.0.77/frontengine/utils/preset_schedule}/__init__.py +0 -0
  243. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/preset_schedule/preset_schedule_service.py +0 -0
  244. {frontengine-1.0.76/frontengine/utils/redirect_manager → frontengine-1.0.77/frontengine/utils/recording}/__init__.py +0 -0
  245. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/recording/frame_recorder.py +0 -0
  246. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/recording/gif_writer.py +0 -0
  247. {frontengine-1.0.76/frontengine/utils/reminder → frontengine-1.0.77/frontengine/utils/redirect_manager}/__init__.py +0 -0
  248. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/redirect_manager/redirect_manager_class.py +0 -0
  249. {frontengine-1.0.76/frontengine/utils/remote → frontengine-1.0.77/frontengine/utils/reminder}/__init__.py +0 -0
  250. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/reminder/reminder_service.py +0 -0
  251. {frontengine-1.0.76/frontengine/utils/screen_privacy → frontengine-1.0.77/frontengine/utils/remote}/__init__.py +0 -0
  252. {frontengine-1.0.76/frontengine/utils/screen_text → frontengine-1.0.77/frontengine/utils/rules}/__init__.py +0 -0
  253. {frontengine-1.0.76/frontengine/utils/screensaver → frontengine-1.0.77/frontengine/utils/screen_privacy}/__init__.py +0 -0
  254. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/screen_privacy/capture_affinity.py +0 -0
  255. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/screen_privacy/share_watch.py +0 -0
  256. {frontengine-1.0.76/frontengine/utils/signage → frontengine-1.0.77/frontengine/utils/screen_text}/__init__.py +0 -0
  257. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/screen_text/screen_text_service.py +0 -0
  258. {frontengine-1.0.76/frontengine/utils/smart_pause → frontengine-1.0.77/frontengine/utils/screensaver}/__init__.py +0 -0
  259. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/screensaver/screensaver_service.py +0 -0
  260. {frontengine-1.0.76/frontengine/utils/steam → frontengine-1.0.77/frontengine/utils/signage}/__init__.py +0 -0
  261. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/signage/signage_service.py +0 -0
  262. {frontengine-1.0.76/frontengine/utils/system_stats → frontengine-1.0.77/frontengine/utils/smart_pause}/__init__.py +0 -0
  263. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/smart_pause/pause_rules.py +0 -0
  264. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/smart_pause/smart_pause_service.py +0 -0
  265. {frontengine-1.0.76/frontengine/utils/text_source → frontengine-1.0.77/frontengine/utils/steam}/__init__.py +0 -0
  266. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/steam/steam_language.py +0 -0
  267. {frontengine-1.0.76/frontengine/utils/theme_schedule → frontengine-1.0.77/frontengine/utils/system_stats}/__init__.py +0 -0
  268. {frontengine-1.0.76/frontengine/utils/usage_tracking → frontengine-1.0.77/frontengine/utils/text_source}/__init__.py +0 -0
  269. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/text_source/text_source.py +0 -0
  270. {frontengine-1.0.76/frontengine/utils/virtual_camera → frontengine-1.0.77/frontengine/utils/theme_schedule}/__init__.py +0 -0
  271. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/theme_schedule/theme_schedule_service.py +0 -0
  272. {frontengine-1.0.76/frontengine/utils/weather → frontengine-1.0.77/frontengine/utils/usage_tracking}/__init__.py +0 -0
  273. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/usage_tracking/usage_service.py +0 -0
  274. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/usage_tracking/usage_tracker.py +0 -0
  275. {frontengine-1.0.76/frontengine/utils/window_pin → frontengine-1.0.77/frontengine/utils/virtual_camera}/__init__.py +0 -0
  276. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/virtual_camera/camera_feed.py +0 -0
  277. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/virtual_camera/virtual_camera.py +0 -0
  278. {frontengine-1.0.76/frontengine/utils/window_replica → frontengine-1.0.77/frontengine/utils/virtual_desktop}/__init__.py +0 -0
  279. {frontengine-1.0.76/frontengine/utils/workshop → frontengine-1.0.77/frontengine/utils/weather}/__init__.py +0 -0
  280. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/web_url.py +0 -0
  281. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/window_pin/window_layout.py +0 -0
  282. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/window_pin/window_pin.py +0 -0
  283. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/window_replica/dwm_thumbnail.py +0 -0
  284. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine/utils/workshop/workshop_content.py +0 -0
  285. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine.egg-info/dependency_links.txt +0 -0
  286. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine.egg-info/entry_points.txt +0 -0
  287. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine.egg-info/requires.txt +0 -0
  288. {frontengine-1.0.76 → frontengine-1.0.77}/frontengine.egg-info/top_level.txt +0 -0
  289. {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
+ [![CI](https://github.com/JeffreyChen-SteamProjects/FrontEngine/actions/workflows/ci.yml/badge.svg)](https://github.com/JeffreyChen-SteamProjects/FrontEngine/actions/workflows/ci.yml)
28
+ [![PyPI](https://img.shields.io/pypi/v/frontengine)](https://pypi.org/project/frontengine/)
29
+ [![Python](https://img.shields.io/pypi/pyversions/frontengine)](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
+ ![FrontEngine UI](image/FrontEngine.png)
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
+ | ![GIF](gifs/play_gif.gif) | ![WEBP](gifs/webp.gif) |
103
+
104
+ | Video | Website |
105
+ | --- | --- |
106
+ | ![Video](gifs/video.gif) | ![Website](gifs/website.gif) |
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).