From d4a38c3e14a45c0cf78e6b88d5bf047a3ab38e45 Mon Sep 17 00:00:00 2001 From: itdominator <1itdominator@gmail.com> Date: Mon, 8 Jan 2024 19:32:53 -0600 Subject: [PATCH] improved pid usage logic; stopped inhertance of IPC in App class --- src/__main__.py | 1 - src/app.py | 32 +++++---- src/utils/mixins/__init__.py | 3 + src/utils/mixins/dnd_mixin.py | 70 +++++++++++++++++++ .../settings_manager/start_check_mixin.py | 17 ++++- 5 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 src/utils/mixins/__init__.py create mode 100644 src/utils/mixins/dnd_mixin.py diff --git a/src/__main__.py b/src/__main__.py index 91fc2e6..6b5df75 100644 --- a/src/__main__.py +++ b/src/__main__.py @@ -17,7 +17,6 @@ from app import Application - if __name__ == "__main__": ''' Set process title, get arguments, and create GTK main thread. ''' diff --git a/src/app.py b/src/app.py index c39a82d..3555f5b 100644 --- a/src/app.py +++ b/src/app.py @@ -16,34 +16,38 @@ class AppLaunchException(Exception): -class Application(IPCServer): +class Application: """ docstring for Application. """ def __init__(self, args, unknownargs): super(Application, self).__init__() if not settings_manager.is_trace_debug(): - self.socket_realization_check() - - if not self.is_ipc_alive: - for arg in unknownargs + [args.new_tab,]: - if os.path.isfile(arg): - message = f"FILE|{arg}" - self.send_ipc_message(message) - - raise AppLaunchException(f"{app_name} IPC Server Exists: Have sent path(s) to it and closing...") + self.load_ipc(args, unknownargs) self.setup_debug_hook() Window(args, unknownargs).main() - def socket_realization_check(self): + def load_ipc(self, args, unknownargs): + ipc_server = IPCServer() + self.ipc_realization_check(ipc_server) + + if not ipc_server.is_ipc_alive: + for arg in unknownargs + [args.new_tab,]: + if os.path.isfile(arg): + message = f"FILE|{arg}" + ipc_server.send_ipc_message(message) + + raise AppLaunchException(f"{app_name} IPC Server Exists: Have sent path(s) to it and closing...") + + def ipc_realization_check(self, ipc_server): try: - self.create_ipc_listener() + ipc_server.create_ipc_listener() except Exception: - self.send_test_ipc_message() + ipc_server.send_test_ipc_message() try: - self.create_ipc_listener() + ipc_server.create_ipc_listener() except Exception as e: ... diff --git a/src/utils/mixins/__init__.py b/src/utils/mixins/__init__.py new file mode 100644 index 0000000..6eb3b43 --- /dev/null +++ b/src/utils/mixins/__init__.py @@ -0,0 +1,3 @@ +""" + Utils/Mixins module +""" \ No newline at end of file diff --git a/src/utils/mixins/dnd_mixin.py b/src/utils/mixins/dnd_mixin.py new file mode 100644 index 0000000..f38448e --- /dev/null +++ b/src/utils/mixins/dnd_mixin.py @@ -0,0 +1,70 @@ +# Python imports + +# Lib imports +import gi +gi.require_version('Gtk', '3.0') +gi.require_version('Gdk', '3.0') +from gi.repository import Gtk +from gi.repository import Gdk +from gi.repository import Gio + +# Application imports + + + +class DnDMixin: + + def _setup_dnd(self): + # flags = Gtk.DestDefaults.ALL + + PLAIN_TEXT_TARGET_TYPE = 70 + URI_TARGET_TYPE = 80 + + text_target = Gtk.TargetEntry.new('text/plain', Gtk.TargetFlags(0), PLAIN_TEXT_TARGET_TYPE) + uri_target = Gtk.TargetEntry.new('text/uri-list', Gtk.TargetFlags(0), URI_TARGET_TYPE) + + targets = [ text_target, uri_target ] + + # action = Gdk.DragAction.COPY + + self.drag_dest_set_target_list(targets) + # self.drag_dest_set(flags, targets, action) + + self._setup_dnd_signals() + + def _setup_dnd_signals(self): + self.connect("drag-motion", self._on_drag_motion) + self.connect('drag-drop', self._on_drag_set) + self.connect("drag-data-received", self._on_drag_data_received) + + def _on_drag_motion(self, widget, drag_context, x, y, time): + Gdk.drag_status(drag_context, drag_context.get_actions(), time) + + return True + + def _on_drag_set(self, widget, drag_context, data, info, time): + self.drag_get_data(drag_context, drag_context.list_targets()[-1], time) + return True + + def _on_drag_data_received(self, widget, drag_context, x, y, data, info, time): + if info == 70: return + + if info == 80: + uris = data.get_uris() + files = [] + + if len(uris) == 0: + uris = data.get_text().split("\n") + + for uri in uris: + gfile = None + try: + gfile = Gio.File.new_for_uri(uri) + except Exception as e: + gfile = Gio.File.new_for_path(uri) + + files.append(gfile) + + event_system.emit('set_pre_drop_dnd', (files,)) + drag_context.finish(True, False, time) + diff --git a/src/utils/settings_manager/start_check_mixin.py b/src/utils/settings_manager/start_check_mixin.py index 688da36..0f7dd00 100644 --- a/src/utils/settings_manager/start_check_mixin.py +++ b/src/utils/settings_manager/start_check_mixin.py @@ -12,9 +12,17 @@ import inspect class StartCheckMixin: def is_dirty_start(self) -> bool: return self._dirty_start - def clear_pid(self): self._clean_pid() + + def clear_pid(self): + if not self.is_trace_debug(): + self._clean_pid() def do_dirty_start_check(self): + if self.is_trace_debug(): + pid = os.getpid() + self._print_pid(pid) + return + if not os.path.exists(self._PID_FILE): self._write_new_pid() else: @@ -31,7 +39,7 @@ class StartCheckMixin: try: os.kill(pid, 0) except OSError: - print(f"{app_name} is starting dirty...") + print(f"{app_name} PID exists but is not up; starting dirty...") self._dirty_start = True self._write_new_pid() return @@ -41,6 +49,9 @@ class StartCheckMixin: def _write_new_pid(self): pid = os.getpid() self._write_pid(pid) + self._print_pid(pid) + + def _print_pid(self, pid): print(f"{app_name} PID: {pid}") def _clean_pid(self): @@ -48,4 +59,4 @@ class StartCheckMixin: def _write_pid(self, pid): with open(self._PID_FILE, "w") as _pid: - _pid.write(f"{pid}") + _pid.write(f"{pid}") \ No newline at end of file