added debug signal caller, updated some prints to logger, added settings option for min win size
This commit is contained in:
		
							
								
								
									
										36
									
								
								src/app.py
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								src/app.py
									
									
									
									
									
								
							| @@ -1,4 +1,5 @@ | |||||||
| # Python imports | # Python imports | ||||||
|  | import signal | ||||||
| import os | import os | ||||||
|  |  | ||||||
| # Lib imports | # Lib imports | ||||||
| @@ -8,16 +9,40 @@ from utils.ipc_server import IPCServer | |||||||
| from core.window import Window | from core.window import Window | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # Break into a Python console upon SIGUSR1 (Linux) or SIGBREAK (Windows: | ||||||
|  | # CTRL+Pause/Break).  To be included in all production code, just in case. | ||||||
|  | def debug_signal_handler(signal, frame): | ||||||
|  |     del signal | ||||||
|  |     del frame | ||||||
|  |  | ||||||
|  |     try: | ||||||
|  |         import rpdb2 | ||||||
|  |         logger.debug("\n\nStarting embedded RPDB2 debugger. Password is 'foobar'\n\n") | ||||||
|  |         rpdb2.start_embedded_debugger("foobar", True, True) | ||||||
|  |         rpdb2.setbreak(depth=1) | ||||||
|  |         return | ||||||
|  |     except StandardError: | ||||||
|  |         pass | ||||||
|  |  | ||||||
|  |     try: | ||||||
|  |         import code | ||||||
|  |         code.interact() | ||||||
|  |     except StandardError as ex: | ||||||
|  |         logger.debug(f"{ex}, returning to normal program flow...") | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class AppLaunchException(Exception): | class AppLaunchException(Exception): | ||||||
|     ... |     ... | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class Application(IPCServer): | class Application(IPCServer): | ||||||
|     """ docstring for Application. """ |     """ docstring for Application. """ | ||||||
|  |  | ||||||
|     def __init__(self, args, unknownargs): |     def __init__(self, args, unknownargs): | ||||||
|         super(Application, self).__init__() |         super(Application, self).__init__() | ||||||
|  |  | ||||||
|         if not settings.is_trace_debug(): |         if not settings.is_trace_debug(): | ||||||
|             try: |             try: | ||||||
|                 self.create_ipc_listener() |                 self.create_ipc_listener() | ||||||
| @@ -32,4 +57,13 @@ class Application(IPCServer): | |||||||
|  |  | ||||||
|                 raise AppLaunchException(f"{app_name} IPC Server Exists: Will send path(s) to it and close...") |                 raise AppLaunchException(f"{app_name} IPC Server Exists: Will send path(s) to it and close...") | ||||||
|  |  | ||||||
|  |         try: | ||||||
|  |             signal.signal( | ||||||
|  |                     vars(signal).get("SIGBREAK") or vars(signal).get("SIGUSR1"), | ||||||
|  |                     debug_signal_handler | ||||||
|  |                     ) | ||||||
|  |         except ValueError: | ||||||
|  |             # Typically: ValueError: signal only works in main thread | ||||||
|  |             ... | ||||||
|  |  | ||||||
|         Window(args, unknownargs) |         Window(args, unknownargs) | ||||||
|   | |||||||
| @@ -9,7 +9,6 @@ from gi.repository import Gtk | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class BaseContainer(Gtk.Box): | class BaseContainer(Gtk.Box): | ||||||
|     def __init__(self): |     def __init__(self): | ||||||
|         super(BaseContainer, self).__init__() |         super(BaseContainer, self).__init__() | ||||||
| @@ -41,4 +40,4 @@ class BaseContainer(Gtk.Box): | |||||||
|  |  | ||||||
|  |  | ||||||
|     def _hello_world(self, widget=None, eve=None): |     def _hello_world(self, widget=None, eve=None): | ||||||
|         print("Hello, World!") |         logger.debug("Hello, World!") | ||||||
|   | |||||||
| @@ -56,7 +56,7 @@ class Controller(DummyMixin, SignalsMixins, ControllerData): | |||||||
|         event_system.subscribe("tggl_top_main_menubar", self._tggl_top_main_menubar) |         event_system.subscribe("tggl_top_main_menubar", self._tggl_top_main_menubar) | ||||||
|  |  | ||||||
|     def _tggl_top_main_menubar(self): |     def _tggl_top_main_menubar(self): | ||||||
|         print("_tggl_top_main_menubar > stub...") |         logger.debug("_tggl_top_main_menubar > stub...") | ||||||
|  |  | ||||||
|     def setup_builder_and_container(self): |     def setup_builder_and_container(self): | ||||||
|         self.builder     = Gtk.Builder() |         self.builder     = Gtk.Builder() | ||||||
|   | |||||||
| @@ -6,9 +6,8 @@ | |||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class DummyMixin: | class DummyMixin: | ||||||
|     """ DummyMixin is an example of how mixins are used and structured in a project. """ |     """ DummyMixin is an example of how mixins are used and structured in a project. """ | ||||||
|  |  | ||||||
|     def print_hello_world(self) -> None: |     def print_hello_world(self) -> None: | ||||||
|         print("Hello, World!") |         logger.debug("Hello, World!") | ||||||
|   | |||||||
| @@ -11,10 +11,10 @@ class IPCSignalsMixin: | |||||||
|     """ IPCSignalsMixin handle messages from another starting solarfm process. """ |     """ IPCSignalsMixin handle messages from another starting solarfm process. """ | ||||||
|  |  | ||||||
|     def print_to_console(self, message=None): |     def print_to_console(self, message=None): | ||||||
|         print(message) |         logger.debug(message) | ||||||
|  |  | ||||||
|     def handle_file_from_ipc(self, path: str) -> None: |     def handle_file_from_ipc(self, path: str) -> None: | ||||||
|         print(f"File From IPC: {path}") |         logger.debug(f"File From IPC: {path}") | ||||||
|  |  | ||||||
|     def handle_dir_from_ipc(self, path: str) -> None: |     def handle_dir_from_ipc(self, path: str) -> None: | ||||||
|         print(f"Dir From IPC: {path}") |         logger.debug(f"Dir From IPC: {path}") | ||||||
| @@ -39,6 +39,9 @@ class Window(Gtk.ApplicationWindow): | |||||||
|  |  | ||||||
|         self.show() |         self.show() | ||||||
|  |  | ||||||
|  |         # NOTE: Need to set size after show b/c get_allocation methods are initially incorrect if done beforehand... | ||||||
|  |         self._set_size_constraints() | ||||||
|  |  | ||||||
|  |  | ||||||
|     def _setup_styling(self): |     def _setup_styling(self): | ||||||
|         self.set_default_size(settings.get_main_window_width(), |         self.set_default_size(settings.get_main_window_width(), | ||||||
| @@ -66,6 +69,12 @@ class Window(Gtk.ApplicationWindow): | |||||||
|  |  | ||||||
|         self.add( self._controller.get_base_container() ) |         self.add( self._controller.get_base_container() ) | ||||||
|  |  | ||||||
|  |     def _set_size_constraints(self): | ||||||
|  |         self.set_default_size(settings.get_main_window_width(), | ||||||
|  |                                 settings.get_main_window_height()) | ||||||
|  |         self.set_size_request(settings.get_main_window_min_width(), | ||||||
|  |                                 settings.get_main_window_min_height()) | ||||||
|  |  | ||||||
|     def _set_window_data(self) -> None: |     def _set_window_data(self) -> None: | ||||||
|         screen = self.get_screen() |         screen = self.get_screen() | ||||||
|         visual = screen.get_rgba_visual() |         visual = screen.get_rgba_visual() | ||||||
|   | |||||||
| @@ -53,7 +53,7 @@ class PluginsController: | |||||||
|             self.reload_plugins(file) |             self.reload_plugins(file) | ||||||
|  |  | ||||||
|     def load_plugins(self, file: str = None) -> None: |     def load_plugins(self, file: str = None) -> None: | ||||||
|         print(f"Loading plugins...") |         logger.debug(f"Loading plugins...") | ||||||
|         parent_path = os.getcwd() |         parent_path = os.getcwd() | ||||||
|  |  | ||||||
|         for path, folder in [[join(self._plugins_path, item), item] if os.path.isdir(join(self._plugins_path, item)) else None for item in os.listdir(self._plugins_path)]: |         for path, folder in [[join(self._plugins_path, item), item] if os.path.isdir(join(self._plugins_path, item)) else None for item in os.listdir(self._plugins_path)]: | ||||||
| @@ -68,8 +68,7 @@ class PluginsController: | |||||||
|                 module               = self.load_plugin_module(path, folder, target) |                 module               = self.load_plugin_module(path, folder, target) | ||||||
|                 self.execute_plugin(module, plugin, loading_data) |                 self.execute_plugin(module, plugin, loading_data) | ||||||
|             except Exception as e: |             except Exception as e: | ||||||
|                 print(f"Malformed Plugin: Not loading -->: '{folder}' !") |                 logger.debug(f"Malformed Plugin: Not loading -->: '{folder}' !\n{traceback.print_exc()}") | ||||||
|                 traceback.print_exc() |  | ||||||
|  |  | ||||||
|         os.chdir(parent_path) |         os.chdir(parent_path) | ||||||
|  |  | ||||||
| @@ -116,4 +115,4 @@ class PluginsController: | |||||||
|         self._plugin_collection.append(plugin) |         self._plugin_collection.append(plugin) | ||||||
|  |  | ||||||
|     def reload_plugins(self, file: str = None) -> None: |     def reload_plugins(self, file: str = None) -> None: | ||||||
|         print(f"Reloading plugins... stub.") |         logger.debug(f"Reloading plugins... stub.") | ||||||
|   | |||||||
| @@ -108,6 +108,9 @@ class Settings(StartCheckMixin, Singleton): | |||||||
|         self._main_window    = None |         self._main_window    = None | ||||||
|         self._main_window_w  = 800 |         self._main_window_w  = 800 | ||||||
|         self._main_window_h  = 600 |         self._main_window_h  = 600 | ||||||
|  |         self._main_window_mw = 720 | ||||||
|  |         self._main_window_mh = 480 | ||||||
|  |  | ||||||
|         self._builder        = None |         self._builder        = None | ||||||
|         self.PAINT_BG_COLOR  = (0, 0, 0, 0.54) |         self.PAINT_BG_COLOR  = (0, 0, 0, 0.54) | ||||||
|  |  | ||||||
| @@ -147,6 +150,8 @@ class Settings(StartCheckMixin, Singleton): | |||||||
|     def get_main_window(self)        -> any: return self._main_window |     def get_main_window(self)        -> any: return self._main_window | ||||||
|     def get_main_window_width(self)  -> any: return self._main_window_w |     def get_main_window_width(self)  -> any: return self._main_window_w | ||||||
|     def get_main_window_height(self) -> any: return self._main_window_h |     def get_main_window_height(self) -> any: return self._main_window_h | ||||||
|  |     def get_main_window_min_width(self)  -> any: return self._main_window_mw | ||||||
|  |     def get_main_window_min_height(self) -> any: return self._main_window_mh | ||||||
|     def get_builder(self)            -> any: return self._builder |     def get_builder(self)            -> any: return self._builder | ||||||
|     def get_paint_bg_color(self)     -> any: return self.PAINT_BG_COLOR |     def get_paint_bg_color(self)     -> any: return self.PAINT_BG_COLOR | ||||||
|     def get_glade_file(self)         -> str: return self._GLADE_FILE |     def get_glade_file(self)         -> str: return self._GLADE_FILE | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user