From df68ce7a5bda17f10f0da763db2ce77a17bbd17a Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Tue, 14 Jun 2022 22:30:41 -0500 Subject: [PATCH] Event system updates, thread decorator changes --- src/__builtins__.py | 22 +++++++++++----------- src/context/controller.py | 32 ++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/__builtins__.py b/src/__builtins__.py index cfd0dbb..dd50ca4 100644 --- a/src/__builtins__.py +++ b/src/__builtins__.py @@ -16,16 +16,16 @@ class EventSystem(IPCServer): def __init__(self): super(EventSystem, self).__init__() - # NOTE: The format used is list of [type, target, (data,)] Where: - # type is useful context for control flow, - # target is the method to call, - # data is the method parameters to give + # NOTE: The format used is list of ['who', target, (data,)] Where: + # who is the sender or target ID and is used for context and control flow, + # method_target is the method to call, + # data is the method parameters OR message data to give # Where data may be any kind of data self._gui_events = [] self._module_events = [] - # Makeshift fake "events" type system FIFO + # Makeshift "events" system FIFO def _pop_gui_event(self) -> None: if len(self._gui_events) > 0: return self._gui_events.pop(0) @@ -40,7 +40,7 @@ class EventSystem(IPCServer): self._gui_events.append(event) return None - raise Exception("Invald event format! Please do: [type, target, (data,)]") + raise Exception("Invald event format! Please do: ['target_id': str, method_target: method, (data,): any]") def push_module_event(self, event: list) -> None: if len(event) == 3: @@ -49,11 +49,11 @@ class EventSystem(IPCServer): raise Exception("Invald event format! Please do: [type, target, (data,)]") - def read_gui_event(self) -> None: - return self._gui_events[0] + def read_gui_event(self) -> list: + return self._gui_events[0] if self._gui_events else None - def read_module_event(self) -> None: - return self._module_events[0] + def read_module_event(self) -> list: + return self._module_events[0] if self._module_events else None def consume_gui_event(self) -> None: return self._pop_gui_event() @@ -67,6 +67,6 @@ class EventSystem(IPCServer): # __builtins__.update({"event_system": Builtins()}) builtins.app_name = "" builtins.event_system = EventSystem() -builtins.event_sleep_time = 0.2 +builtins.event_sleep_time = 0.05 builtins.trace_debug = False builtins.debug = False diff --git a/src/context/controller.py b/src/context/controller.py index 9e662fa..dcfe986 100644 --- a/src/context/controller.py +++ b/src/context/controller.py @@ -13,13 +13,20 @@ from .mixins.dummy_mixin import DummyMixin from .controller_data import Controller_Data - +# NOTE: Threads will not die with parent's destruction def threaded(fn): def wrapper(*args, **kwargs): - threading.Thread(target=fn, args=args, kwargs=kwargs).start() - + threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=False).start() return wrapper +# NOTE: Insure threads die with parent's destruction +def daemon_threaded(fn): + def wrapper(*args, **kwargs): + threading.Thread(target=fn, args=args, kwargs=kwargs, daemon=True).start() + return wrapper + + + class Controller(DummyMixin, Controller_Data): def __init__(self, _settings, args, unknownargs): @@ -35,19 +42,28 @@ class Controller(DummyMixin, Controller_Data): Gtk.main_quit() - @threaded - def gui_event_observer(self) -> None: + @daemon_threaded + def gui_event_observer(self): while True: time.sleep(event_sleep_time) event = event_system.consume_gui_event() if event: try: - type, target, data = event - method = getattr(self.__class__, target) - GLib.idle_add(method, *(self, *data,)) + sender_id, method_target, parameters = event + if sender_id: + method = getattr(self.__class__, "handle_gui_event_and_return_message") + GLib.idle_add(method, *(self, sender_id, method_target, parameters)) + else: + method = getattr(self.__class__, method_target) + GLib.idle_add(method, *(self, *parameters,)) except Exception as e: print(repr(e)) + def handle_gui_event_and_return_message(self, sender, method_target, parameters): + method = getattr(self.__class__, f"{method_target}") + data = method(*(self, *parameters)) + event_system.push_module_event([sender, None, data]) + def handle_file_from_ipc(self, path: str) -> None: print(f"Path From IPC: {path}")