frontengine 1.0.77__tar.gz → 1.0.78__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 (287) hide show
  1. {frontengine-1.0.77 → frontengine-1.0.78}/PKG-INFO +22 -10
  2. {frontengine-1.0.77 → frontengine-1.0.78}/README.md +18 -6
  3. frontengine-1.0.78/frontengine/utils/logging/loggin_instance.py +130 -0
  4. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine.egg-info/PKG-INFO +22 -10
  5. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine.egg-info/requires.txt +1 -1
  6. {frontengine-1.0.77 → frontengine-1.0.78}/pyproject.toml +4 -4
  7. frontengine-1.0.77/frontengine/utils/logging/loggin_instance.py +0 -80
  8. {frontengine-1.0.77 → frontengine-1.0.78}/LICENSE +0 -0
  9. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/__init__.py +0 -0
  10. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/__main__.py +0 -0
  11. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/__init__.py +0 -0
  12. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/base_widget.py +0 -0
  13. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/camera/__init__.py +0 -0
  14. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/camera/camera_widget.py +0 -0
  15. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/canvas/__init__.py +0 -0
  16. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/canvas/whiteboard_widget.py +0 -0
  17. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/capture/__init__.py +0 -0
  18. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/capture/region_capture.py +0 -0
  19. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/draggable_window.py +0 -0
  20. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/focus_shield/__init__.py +0 -0
  21. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/focus_shield/focus_shield_widget.py +0 -0
  22. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/freeze/__init__.py +0 -0
  23. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/freeze/freeze_widget.py +0 -0
  24. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/gif/__init__.py +0 -0
  25. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/gif/paint_gif.py +0 -0
  26. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/image/__init__.py +0 -0
  27. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/image/paint_image.py +0 -0
  28. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/load/__init__.py +0 -0
  29. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/load/load_someone_make_ui.py +0 -0
  30. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/measure/__init__.py +0 -0
  31. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/measure/measure_widget.py +0 -0
  32. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/monitor/__init__.py +0 -0
  33. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/monitor/monitor_widget.py +0 -0
  34. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/notes/__init__.py +0 -0
  35. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/notes/sticky_note_widget.py +0 -0
  36. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/overlay_factory.py +0 -0
  37. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/particle/__init__.py +0 -0
  38. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/particle/particle_ui.py +0 -0
  39. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/pet/__init__.py +0 -0
  40. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/pet/desktop_pet.py +0 -0
  41. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/pinned/__init__.py +0 -0
  42. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/pinned/pinned_image.py +0 -0
  43. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/presentation/__init__.py +0 -0
  44. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/presentation/annotation_overlay.py +0 -0
  45. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/presentation/cursor_effects.py +0 -0
  46. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/presentation/keystroke_display.py +0 -0
  47. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/presentation/magnifier.py +0 -0
  48. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/reference/__init__.py +0 -0
  49. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/reference/reference_board.py +0 -0
  50. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/replica/__init__.py +0 -0
  51. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/replica/replica_widget.py +0 -0
  52. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/scene/__init__.py +0 -0
  53. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/scene/extend_graphic_scene.py +0 -0
  54. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/scene/extend_graphic_view.py +0 -0
  55. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/scene/scene.py +0 -0
  56. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/screen_care/__init__.py +0 -0
  57. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/screen_care/color_vision_widget.py +0 -0
  58. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/screen_care/screen_filter.py +0 -0
  59. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/shortcuts/__init__.py +0 -0
  60. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/shortcuts/shortcut_sheet.py +0 -0
  61. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/sound_player/__init__.py +0 -0
  62. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/sound_player/sound_effect.py +0 -0
  63. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/sound_player/sound_player.py +0 -0
  64. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/spectrum/__init__.py +0 -0
  65. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/spectrum/spectrum_widget.py +0 -0
  66. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/text/__init__.py +0 -0
  67. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/text/draw_text.py +0 -0
  68. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/toast/__init__.py +0 -0
  69. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/toast/toast_widget.py +0 -0
  70. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/video/__init__.py +0 -0
  71. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/video/video_player.py +0 -0
  72. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/wallpaper/__init__.py +0 -0
  73. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/wallpaper/wallpaper_widget.py +0 -0
  74. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/web/__init__.py +0 -0
  75. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/web/webview.py +0 -0
  76. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/show/window_helpers.py +0 -0
  77. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/system_tray/__init__.py +0 -0
  78. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/system_tray/extend_system_tray.py +0 -0
  79. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/__init__.py +0 -0
  80. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/color/__init__.py +0 -0
  81. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/color/global_color.py +0 -0
  82. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/__init__.py +0 -0
  83. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/app_profile_dialog.py +0 -0
  84. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/choose_file_dialog.py +0 -0
  85. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/clipboard_dialog.py +0 -0
  86. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/hotkey_settings_dialog.py +0 -0
  87. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/how_to_use_dialog.py +0 -0
  88. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/preset_schedule_dialog.py +0 -0
  89. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/reminder_dialog.py +0 -0
  90. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/remote_control_dialog.py +0 -0
  91. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/rules_dialog.py +0 -0
  92. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/screen_privacy_dialog.py +0 -0
  93. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/screen_text_dialog.py +0 -0
  94. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/screensaver_dialog.py +0 -0
  95. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/signage_dialog.py +0 -0
  96. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/smart_pause_dialog.py +0 -0
  97. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/usage_report_dialog.py +0 -0
  98. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/window_pin_dialog.py +0 -0
  99. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/dialog/window_replica_dialog.py +0 -0
  100. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/main_ui.py +0 -0
  101. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/menu/__init__.py +0 -0
  102. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/menu/help_menu.py +0 -0
  103. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/menu/how_to_menu.py +0 -0
  104. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/menu/language_menu.py +0 -0
  105. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/menu/preset_menu.py +0 -0
  106. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/menu/settings_menu.py +0 -0
  107. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/nav/__init__.py +0 -0
  108. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/nav/sidebar.py +0 -0
  109. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/__init__.py +0 -0
  110. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/control_center/__init__.py +0 -0
  111. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/control_center/control_center_ui.py +0 -0
  112. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/focus/__init__.py +0 -0
  113. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/focus/focus_setting_ui.py +0 -0
  114. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/gif/__init__.py +0 -0
  115. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/gif/gif_setting_ui.py +0 -0
  116. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/image/__init__.py +0 -0
  117. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/image/image_setting_ui.py +0 -0
  118. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/layout_kit.py +0 -0
  119. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/particle/__init__.py +0 -0
  120. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/particle/particle_setting_ui.py +0 -0
  121. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/pet/__init__.py +0 -0
  122. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/pet/pet_setting_ui.py +0 -0
  123. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/presentation/__init__.py +0 -0
  124. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/presentation/presentation_setting_ui.py +0 -0
  125. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/scene_setting/__init__.py +0 -0
  126. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/scene_setting/scene_manager.py +0 -0
  127. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/scene_setting/scene_page/__init__.py +0 -0
  128. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/scene_setting/scene_page/base_scene_page.py +0 -0
  129. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/scene_setting/scene_page/gif.py +0 -0
  130. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/scene_setting/scene_page/image.py +0 -0
  131. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/scene_setting/scene_page/registry.py +0 -0
  132. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/scene_setting/scene_page/sound.py +0 -0
  133. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/scene_setting/scene_page/text.py +0 -0
  134. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/scene_setting/scene_page/video.py +0 -0
  135. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/scene_setting/scene_page/web.py +0 -0
  136. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/scene_setting/scene_setting_ui.py +0 -0
  137. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/screen_care/__init__.py +0 -0
  138. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/screen_care/screen_care_setting_ui.py +0 -0
  139. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/sound_player/__init__.py +0 -0
  140. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/sound_player/sound_player_setting_ui.py +0 -0
  141. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/text/__init__.py +0 -0
  142. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/text/text_setting_ui.py +0 -0
  143. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/tools/__init__.py +0 -0
  144. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/tools/tools_setting_ui.py +0 -0
  145. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/utils.py +0 -0
  146. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/video/__init__.py +0 -0
  147. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/video/video_setting_ui.py +0 -0
  148. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/wallpaper/__init__.py +0 -0
  149. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/wallpaper/wallpaper_setting_ui.py +0 -0
  150. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/web/__init__.py +0 -0
  151. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/web/web_setting_ui.py +0 -0
  152. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/widgets/__init__.py +0 -0
  153. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/page/widgets/widgets_setting_ui.py +0 -0
  154. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/style/__init__.py +0 -0
  155. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/ui/style/app_style.py +0 -0
  156. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/user_setting/__init__.py +0 -0
  157. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/user_setting/preset_repository.py +0 -0
  158. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/user_setting/scene_setting.py +0 -0
  159. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/user_setting/user_setting_file.py +0 -0
  160. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/__init__.py +0 -0
  161. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/app_profile/__init__.py +0 -0
  162. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/app_profile/app_profile_service.py +0 -0
  163. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/audio_meter/__init__.py +0 -0
  164. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/audio_meter/audio_envelope.py +0 -0
  165. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/audio_meter/loopback_capture.py +0 -0
  166. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/audio_meter/microphone_meter.py +0 -0
  167. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/audio_meter/screen_audio.py +0 -0
  168. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/audio_meter/spectrum_analyzer.py +0 -0
  169. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/audio_meter/system_audio_meter.py +0 -0
  170. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/autostart/__init__.py +0 -0
  171. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/autostart/autostart_service.py +0 -0
  172. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/break_reminder/__init__.py +0 -0
  173. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/break_reminder/break_reminder.py +0 -0
  174. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/browser/__init__.py +0 -0
  175. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/browser/browser.py +0 -0
  176. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/clipboard/__init__.py +0 -0
  177. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/clipboard/clipboard_history.py +0 -0
  178. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/clipboard/clipboard_watcher.py +0 -0
  179. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/color_vision/__init__.py +0 -0
  180. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/color_vision/color_vision.py +0 -0
  181. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/critical_exit/__init__.py +0 -0
  182. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/critical_exit/check_key_is_press.py +0 -0
  183. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/critical_exit/critical_exit.py +0 -0
  184. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/critical_exit/win32_vk.py +0 -0
  185. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/exception/__init__.py +0 -0
  186. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/exception/exception_tags.py +0 -0
  187. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/exception/exceptions.py +0 -0
  188. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/focus_shield/__init__.py +0 -0
  189. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/focus_shield/focus_shield.py +0 -0
  190. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/focus_timer/__init__.py +0 -0
  191. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/focus_timer/focus_timer.py +0 -0
  192. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/hotkey/__init__.py +0 -0
  193. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/hotkey/hotkey_service.py +0 -0
  194. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/input_watch/__init__.py +0 -0
  195. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/input_watch/input_watch_service.py +0 -0
  196. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/input_watch/typing_watch.py +0 -0
  197. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/json/__init__.py +0 -0
  198. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/json/json_file.py +0 -0
  199. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/json/json_repository.py +0 -0
  200. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/keep_awake/__init__.py +0 -0
  201. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/keep_awake/keep_awake.py +0 -0
  202. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/logging/__init__.py +0 -0
  203. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/measure/__init__.py +0 -0
  204. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/measure/measure.py +0 -0
  205. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/media_keys/__init__.py +0 -0
  206. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/media_keys/media_keys.py +0 -0
  207. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/midi/__init__.py +0 -0
  208. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/midi/midi_input.py +0 -0
  209. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/multi_language/__init__.py +0 -0
  210. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/multi_language/english.py +0 -0
  211. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/multi_language/france.py +0 -0
  212. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/multi_language/germany.py +0 -0
  213. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/multi_language/italy.py +0 -0
  214. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/multi_language/language_wrapper.py +0 -0
  215. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/multi_language/retranslate.py +0 -0
  216. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/multi_language/russian.py +0 -0
  217. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/multi_language/simplified_chinese.py +0 -0
  218. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/multi_language/traditional_chinese.py +0 -0
  219. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/now_playing/__init__.py +0 -0
  220. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/now_playing/now_playing.py +0 -0
  221. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/pet_chat/__init__.py +0 -0
  222. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/pet_chat/pet_chat_service.py +0 -0
  223. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/platform_info/__init__.py +0 -0
  224. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/platform_info/platform_info.py +0 -0
  225. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/playlist/__init__.py +0 -0
  226. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/playlist/playlist.py +0 -0
  227. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/plugins/__init__.py +0 -0
  228. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/plugins/plugin_loader.py +0 -0
  229. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/power_mode/__init__.py +0 -0
  230. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/power_mode/power_mode.py +0 -0
  231. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/preset_schedule/__init__.py +0 -0
  232. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/preset_schedule/preset_schedule_service.py +0 -0
  233. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/recording/__init__.py +0 -0
  234. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/recording/frame_recorder.py +0 -0
  235. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/recording/gif_writer.py +0 -0
  236. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/redirect_manager/__init__.py +0 -0
  237. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/redirect_manager/redirect_manager_class.py +0 -0
  238. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/reminder/__init__.py +0 -0
  239. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/reminder/reminder_service.py +0 -0
  240. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/remote/__init__.py +0 -0
  241. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/remote/remote_server.py +0 -0
  242. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/rules/__init__.py +0 -0
  243. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/rules/rule_engine.py +0 -0
  244. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/screen_privacy/__init__.py +0 -0
  245. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/screen_privacy/capture_affinity.py +0 -0
  246. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/screen_privacy/share_watch.py +0 -0
  247. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/screen_text/__init__.py +0 -0
  248. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/screen_text/screen_text_service.py +0 -0
  249. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/screensaver/__init__.py +0 -0
  250. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/screensaver/screensaver_service.py +0 -0
  251. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/signage/__init__.py +0 -0
  252. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/signage/signage_service.py +0 -0
  253. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/smart_pause/__init__.py +0 -0
  254. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/smart_pause/pause_rules.py +0 -0
  255. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/smart_pause/smart_pause_service.py +0 -0
  256. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/steam/__init__.py +0 -0
  257. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/steam/steam_language.py +0 -0
  258. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/system_stats/__init__.py +0 -0
  259. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/system_stats/system_stats.py +0 -0
  260. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/text_source/__init__.py +0 -0
  261. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/text_source/text_source.py +0 -0
  262. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/theme_schedule/__init__.py +0 -0
  263. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/theme_schedule/theme_schedule_service.py +0 -0
  264. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/usage_tracking/__init__.py +0 -0
  265. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/usage_tracking/usage_service.py +0 -0
  266. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/usage_tracking/usage_tracker.py +0 -0
  267. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/virtual_camera/__init__.py +0 -0
  268. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/virtual_camera/camera_feed.py +0 -0
  269. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/virtual_camera/virtual_camera.py +0 -0
  270. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/virtual_desktop/__init__.py +0 -0
  271. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/virtual_desktop/virtual_desktop.py +0 -0
  272. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/weather/__init__.py +0 -0
  273. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/weather/weather_service.py +0 -0
  274. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/web_url.py +0 -0
  275. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/window_pin/__init__.py +0 -0
  276. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/window_pin/monitor_move.py +0 -0
  277. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/window_pin/window_layout.py +0 -0
  278. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/window_pin/window_pin.py +0 -0
  279. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/window_replica/__init__.py +0 -0
  280. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/window_replica/dwm_thumbnail.py +0 -0
  281. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/workshop/__init__.py +0 -0
  282. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine/utils/workshop/workshop_content.py +0 -0
  283. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine.egg-info/SOURCES.txt +0 -0
  284. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine.egg-info/dependency_links.txt +0 -0
  285. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine.egg-info/entry_points.txt +0 -0
  286. {frontengine-1.0.77 → frontengine-1.0.78}/frontengine.egg-info/top_level.txt +0 -0
  287. {frontengine-1.0.77 → frontengine-1.0.78}/setup.cfg +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frontengine
3
- Version: 1.0.77
3
+ Version: 1.0.78
4
4
  Summary: FrontEngine is use-define frontview or only use like screen saver
5
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
6
+ Project-URL: Homepage, https://github.com/JeffreyChen-SteamProjects/FrontEngine
7
+ Project-URL: Code, https://github.com/JeffreyChen-SteamProjects/FrontEngine
8
8
  Classifier: Programming Language :: Python :: 3.10
9
9
  Classifier: Development Status :: 2 - Pre-Alpha
10
10
  Classifier: Environment :: Win32 (MS Windows)
@@ -14,7 +14,7 @@ Classifier: Operating System :: OS Independent
14
14
  Requires-Python: >=3.10
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: PySide6==6.11.1
17
+ Requires-Dist: PySide6==6.11.2
18
18
  Requires-Dist: qt-material
19
19
  Requires-Dist: PyOpenGL
20
20
  Requires-Dist: PyOpenGL_accelerate
@@ -427,16 +427,28 @@ it can be tested with a fake one.
427
427
 
428
428
  ## Continuous integration and releases
429
429
 
430
+ Work flows `feature → dev → main`, and only the last step publishes:
431
+
432
+ ```
433
+ feat/xyz ──PR──► dev ──PR──► main
434
+ │ │
435
+ CI, no release CI + release
436
+ ```
437
+
430
438
  | Workflow | Trigger | Purpose |
431
439
  | --- | --- | --- |
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 |
440
+ | `CI` (`ci.yml`) | Push / PR to `main` or `dev`, manual dispatch, 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
441
  | `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>` |
442
+ | `Release` (`release.yml`) | A pull request **from `dev`** 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`, creates a GitHub release tagged `v<version>`, and fast-forwards `dev` |
443
+
444
+ Publishing happens **only when `dev` merges into `main`**. Features land on `dev`
445
+ without minting a version, and a release is a deliberate `dev → main` pull
446
+ request. A feature PR aimed at `main` by mistake still merges but does not
447
+ publish — the failure direction is a missing release, not an unwanted one.
435
448
 
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.
449
+ The patch segment bumps automatically; for a minor or major release, run
450
+ *Actions → Release → Run workflow* and pick the segment. That path also re-runs
451
+ a failed publish without needing a new merge.
440
452
 
441
453
  Versions live in two files: `pyproject.toml` is the dev package
442
454
  (`frontengine_dev`) and `stable.toml` is the published one (`frontengine`).
@@ -403,16 +403,28 @@ it can be tested with a fake one.
403
403
 
404
404
  ## Continuous integration and releases
405
405
 
406
+ Work flows `feature → dev → main`, and only the last step publishes:
407
+
408
+ ```
409
+ feat/xyz ──PR──► dev ──PR──► main
410
+ │ │
411
+ CI, no release CI + release
412
+ ```
413
+
406
414
  | Workflow | Trigger | Purpose |
407
415
  | --- | --- | --- |
408
- | `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 |
416
+ | `CI` (`ci.yml`) | Push / PR to `main` or `dev`, manual dispatch, 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 |
409
417
  | `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 |
410
- | `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>` |
418
+ | `Release` (`release.yml`) | A pull request **from `dev`** 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`, creates a GitHub release tagged `v<version>`, and fast-forwards `dev` |
419
+
420
+ Publishing happens **only when `dev` merges into `main`**. Features land on `dev`
421
+ without minting a version, and a release is a deliberate `dev → main` pull
422
+ request. A feature PR aimed at `main` by mistake still merges but does not
423
+ publish — the failure direction is a missing release, not an unwanted one.
411
424
 
412
- Publishing happens **only on merge to `main`** — pushing to `dev` runs CI and
413
- never publishes. The patch segment bumps automatically; for a minor or major
414
- release, run *Actions → Release → Run workflow* and pick the segment. That path
415
- also re-runs a failed publish without needing a new merge.
425
+ The patch segment bumps automatically; for a minor or major release, run
426
+ *Actions → Release → Run workflow* and pick the segment. That path also re-runs
427
+ a failed publish without needing a new merge.
416
428
 
417
429
  Versions live in two files: `pyproject.toml` is the dev package
418
430
  (`frontengine_dev`) and `stable.toml` is the published one (`frontengine`).
@@ -0,0 +1,130 @@
1
+ """
2
+ The ``FrontEngine`` logger and the file it writes to.
3
+
4
+ The log file is ``~/.frontengine/logs/FrontEngine.log`` unless the
5
+ ``FRONTENGINE_LOG_FILE`` environment variable names another path (a relative one
6
+ resolves against the cwd at import time; ``os.devnull`` turns the file off). It
7
+ used to be ``FrontEngine.log`` in the working directory, opened at import, so
8
+ every process that imported the package -- JEditor and PyBreeze embed it -- left
9
+ a log in whatever directory it started in, and a launch from a read-only
10
+ directory had to fall back through a chain of candidates.
11
+
12
+ The package's handler opens the file on the first record, so importing writes
13
+ nothing. Every process on the account shares the file, so it is opened for
14
+ append, each line carries the process id, and it is rotated only when a process
15
+ opens it: Windows refuses to rename a file another process holds open, and a
16
+ rotation attempted inside ``emit()`` would then fail on every later record.
17
+ """
18
+ import logging
19
+ import os
20
+ import warnings
21
+ from logging.handlers import RotatingFileHandler
22
+ from pathlib import Path
23
+
24
+ # 只調自己這個 logger 的層級。動 root logger 會把 DEBUG 強加給任何
25
+ # `import frontengine` 的程式,連帶它用的每一個第三方套件。
26
+ # Only this logger's level is ours to set. Touching the root logger forces DEBUG
27
+ # onto any application that imports frontengine, and every library it uses.
28
+
29
+ # 建立 FrontEngine logger
30
+ front_engine_logger = logging.getLogger("FrontEngine")
31
+ front_engine_logger.setLevel(logging.DEBUG) # 建議與 handler 一致
32
+
33
+ # 日誌格式
34
+ # Log format
35
+ formatter = logging.Formatter(
36
+ '%(asctime)s | %(process)d | %(name)s | %(levelname)s | %(message)s'
37
+ )
38
+
39
+ #: Environment variable that overrides where the log file is written.
40
+ LOG_FILE_ENV = "FRONTENGINE_LOG_FILE"
41
+
42
+ #: A file past this size is moved to ``<name>.1`` when a process opens it.
43
+ ROTATE_AT_BYTES = 10 * 1024 * 1024
44
+
45
+
46
+ def default_log_file() -> Path:
47
+ """Return the log file path: ``$FRONTENGINE_LOG_FILE``, else the home default."""
48
+ configured = os.environ.get(LOG_FILE_ENV, "").strip()
49
+ if configured:
50
+ return Path(configured).expanduser()
51
+ return Path.home() / ".frontengine" / "logs" / "FrontEngine.log"
52
+
53
+
54
+ def _rotate_if_large(path: Path, limit: int) -> None:
55
+ """Move ``path`` to ``<path>.1`` when it is larger than ``limit`` bytes.
56
+
57
+ Best effort: while another process holds the file open Windows refuses the
58
+ rename, and the file is simply appended to until a later open succeeds.
59
+ """
60
+ try:
61
+ if limit <= 0 or not path.is_file() or path.stat().st_size <= limit:
62
+ return
63
+ os.replace(path, path.with_name(path.name + ".1"))
64
+ except OSError:
65
+ return
66
+
67
+
68
+ class FrontEngineLoggingHandler(RotatingFileHandler):
69
+ """
70
+ FrontEngine 專用日誌處理器
71
+ FrontEngine's file handler: ``default_log_file()``, append, UTF-8.
72
+
73
+ ``delay=True`` defers opening (and creating the directory) to the first
74
+ record, which is how the package's own handler is built. A file that cannot
75
+ be opened is swapped for ``os.devnull`` with one ``RuntimeWarning``: losing
76
+ the log is acceptable, failing to start is not.
77
+ """
78
+
79
+ def __init__(
80
+ self,
81
+ filename: str | None = None,
82
+ mode: str = "a",
83
+ max_bytes: int = 0,
84
+ backup_count: int = 0,
85
+ errors: str = "backslashreplace",
86
+ delay: bool = False,
87
+ ):
88
+ # encoding="utf-8":日誌會寫進翻譯過的字串與使用者的檔案路徑。
89
+ # 用系統預設編碼的話,cp950/cp1252 遇到俄文或中文就整行寫不進去,
90
+ # 還會把 logging 自己的錯誤倒進被導向的輸出面板。
91
+ # encoding="utf-8": the log carries translated strings and user file
92
+ # paths. On the locale codepage, cp950 or cp1252 drops any line with
93
+ # Russian or Chinese in it and spills logging's own traceback into the
94
+ # redirected output panel.
95
+ # errors="backslashreplace" (logging.basicConfig's own default): a lone
96
+ # surrogate from a Windows path still raises under strict, and an
97
+ # escaped record beats a lost one.
98
+ path = filename if filename is not None else str(default_log_file())
99
+ super().__init__(
100
+ filename=path, mode=mode, maxBytes=max_bytes,
101
+ backupCount=backup_count, encoding="utf-8", delay=delay,
102
+ errors=errors)
103
+ self.setFormatter(formatter) # 正確套用 formatter
104
+ self.setLevel(logging.DEBUG)
105
+
106
+ def _open(self):
107
+ """Create the directory and rotate before opening; fall back to devnull."""
108
+ path = Path(self.baseFilename)
109
+ try:
110
+ path.parent.mkdir(parents=True, exist_ok=True)
111
+ _rotate_if_large(path, ROTATE_AT_BYTES)
112
+ return super()._open()
113
+ except OSError as error:
114
+ warnings.warn(
115
+ f"FrontEngine log file {path} unavailable, file logging off: {error!r}",
116
+ RuntimeWarning, stacklevel=2)
117
+ # The handler owns and closes this stream.
118
+ return open(os.devnull, self.mode, encoding=self.encoding, errors=self.errors) # noqa: SIM115
119
+
120
+ def emit(self, record: logging.LogRecord) -> None:
121
+ """
122
+ 實際輸出日誌紀錄
123
+ Emit log record
124
+ """
125
+ super().emit(record)
126
+
127
+
128
+ # The file is opened on the first record, never at import.
129
+ file_handler = FrontEngineLoggingHandler(delay=True)
130
+ front_engine_logger.addHandler(file_handler)
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: frontengine
3
- Version: 1.0.77
3
+ Version: 1.0.78
4
4
  Summary: FrontEngine is use-define frontview or only use like screen saver
5
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
6
+ Project-URL: Homepage, https://github.com/JeffreyChen-SteamProjects/FrontEngine
7
+ Project-URL: Code, https://github.com/JeffreyChen-SteamProjects/FrontEngine
8
8
  Classifier: Programming Language :: Python :: 3.10
9
9
  Classifier: Development Status :: 2 - Pre-Alpha
10
10
  Classifier: Environment :: Win32 (MS Windows)
@@ -14,7 +14,7 @@ Classifier: Operating System :: OS Independent
14
14
  Requires-Python: >=3.10
15
15
  Description-Content-Type: text/markdown
16
16
  License-File: LICENSE
17
- Requires-Dist: PySide6==6.11.1
17
+ Requires-Dist: PySide6==6.11.2
18
18
  Requires-Dist: qt-material
19
19
  Requires-Dist: PyOpenGL
20
20
  Requires-Dist: PyOpenGL_accelerate
@@ -427,16 +427,28 @@ it can be tested with a fake one.
427
427
 
428
428
  ## Continuous integration and releases
429
429
 
430
+ Work flows `feature → dev → main`, and only the last step publishes:
431
+
432
+ ```
433
+ feat/xyz ──PR──► dev ──PR──► main
434
+ │ │
435
+ CI, no release CI + release
436
+ ```
437
+
430
438
  | Workflow | Trigger | Purpose |
431
439
  | --- | --- | --- |
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 |
440
+ | `CI` (`ci.yml`) | Push / PR to `main` or `dev`, manual dispatch, 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
441
  | `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>` |
442
+ | `Release` (`release.yml`) | A pull request **from `dev`** 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`, creates a GitHub release tagged `v<version>`, and fast-forwards `dev` |
443
+
444
+ Publishing happens **only when `dev` merges into `main`**. Features land on `dev`
445
+ without minting a version, and a release is a deliberate `dev → main` pull
446
+ request. A feature PR aimed at `main` by mistake still merges but does not
447
+ publish — the failure direction is a missing release, not an unwanted one.
435
448
 
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.
449
+ The patch segment bumps automatically; for a minor or major release, run
450
+ *Actions → Release → Run workflow* and pick the segment. That path also re-runs
451
+ a failed publish without needing a new merge.
440
452
 
441
453
  Versions live in two files: `pyproject.toml` is the dev package
442
454
  (`frontengine_dev`) and `stable.toml` is the published one (`frontengine`).
@@ -1,4 +1,4 @@
1
- PySide6==6.11.1
1
+ PySide6==6.11.2
2
2
  qt-material
3
3
  PyOpenGL
4
4
  PyOpenGL_accelerate
@@ -6,12 +6,12 @@ build-backend = "setuptools.build_meta"
6
6
 
7
7
  [project]
8
8
  name = "frontengine"
9
- version = "1.0.77"
9
+ version = "1.0.78"
10
10
  authors = [
11
11
  { name = "JE-Chen", email = "jechenmailman@gmail.com" },
12
12
  ]
13
13
  dependencies = [
14
- "PySide6==6.11.1", "qt-material", "PyOpenGL", "PyOpenGL_accelerate", "numpy", "pynput"
14
+ "PySide6==6.11.2", "qt-material", "PyOpenGL", "PyOpenGL_accelerate", "numpy", "pynput"
15
15
  ]
16
16
  description = "FrontEngine is use-define frontview or only use like screen saver"
17
17
  requires-python = ">=3.10"
@@ -29,8 +29,8 @@ classifiers = [
29
29
  frontengine = "frontengine.ui.main_ui:main"
30
30
 
31
31
  [project.urls]
32
- Homepage = "https://github.com/Intergration-Automation-Testing/FrontEngine"
33
- Code = "https://github.com/Intergration-Automation-Testing/FrontEngine"
32
+ Homepage = "https://github.com/JeffreyChen-SteamProjects/FrontEngine"
33
+ Code = "https://github.com/JeffreyChen-SteamProjects/FrontEngine"
34
34
 
35
35
  [project.readme]
36
36
  file = "README.md"
@@ -1,80 +0,0 @@
1
- import logging
2
- from logging.handlers import RotatingFileHandler
3
- from pathlib import Path
4
-
5
- # 只調自己這個 logger 的層級。動 root logger 會把 DEBUG 強加給任何
6
- # `import frontengine` 的程式,連帶它用的每一個第三方套件。
7
- # Only this logger's level is ours to set. Touching the root logger forces DEBUG
8
- # onto any application that imports frontengine, and every library it uses.
9
-
10
- # 建立 FrontEngine logger
11
- front_engine_logger = logging.getLogger("FrontEngine")
12
- front_engine_logger.setLevel(logging.DEBUG) # 建議與 handler 一致
13
-
14
- # 日誌格式
15
- # Log format
16
- formatter = logging.Formatter(
17
- '%(asctime)s | %(name)s | %(levelname)s | %(message)s'
18
- )
19
-
20
- # 日誌檔名 / The log file's name
21
- LOG_FILE_NAME = "FrontEngine.log"
22
-
23
-
24
- class FrontEngineLoggingHandler(RotatingFileHandler):
25
- """
26
- FrontEngine 專用日誌處理器
27
- FrontEngine custom logging handler using RotatingFileHandler
28
- """
29
-
30
- def __init__(
31
- self,
32
- filename: str = LOG_FILE_NAME,
33
- mode: str = "a", # 建議使用 append 模式
34
- max_bytes: int = 1073741824, # 1GB
35
- backup_count: int = 3 # 保留 3 個備份檔案
36
- ):
37
- # encoding="utf-8":日誌會寫進翻譯過的字串與使用者的檔案路徑。
38
- # 用系統預設編碼的話,cp950/cp1252 遇到俄文或中文就整行寫不進去,
39
- # 還會把 logging 自己的錯誤倒進被導向的輸出面板。
40
- # encoding="utf-8": the log carries translated strings and user file
41
- # paths. On the locale codepage, cp950 or cp1252 drops any line with
42
- # Russian or Chinese in it and spills logging's own traceback into the
43
- # redirected output panel.
44
- super().__init__(
45
- filename=filename, mode=mode, maxBytes=max_bytes,
46
- backupCount=backup_count, encoding="utf-8")
47
- self.setFormatter(formatter) # 正確套用 formatter
48
- self.setLevel(logging.DEBUG)
49
-
50
- def emit(self, record: logging.LogRecord) -> None:
51
- """
52
- 實際輸出日誌紀錄
53
- Emit log record
54
- """
55
- super().emit(record)
56
-
57
-
58
- def _build_file_handler() -> logging.Handler:
59
- """
60
- 日誌優先寫在工作目錄,寫不了就退到家目錄,再不行就不寫檔。
61
- 從唯讀目錄或系統目錄啟動(自動啟動很容易這樣)不該讓程式打不開——
62
- 少一份日誌可以接受,開不起來不行。
63
- Prefer the working directory, fall back to the home directory, and give up
64
- on file logging if neither works. Being launched from a read-only or system
65
- directory - which autostart makes easy - must not stop the app from opening:
66
- losing the log is acceptable, failing to start is not.
67
- """
68
- for candidate in (LOG_FILE_NAME, str(Path.home() / LOG_FILE_NAME)):
69
- try:
70
- # 建構子本身就會開檔,所以「開得起來」就是這裡的測試
71
- # The constructor opens the file, so building it is the test.
72
- return FrontEngineLoggingHandler(filename=candidate)
73
- except OSError:
74
- continue
75
- return logging.NullHandler()
76
-
77
-
78
- # 建立並加入 handler
79
- file_handler = _build_file_handler()
80
- front_engine_logger.addHandler(file_handler)
File without changes