From 4899b78ce301935c5ab1585894ea0236bf59f04b Mon Sep 17 00:00:00 2001
From: lovetox <philipp@hoerist.com>
Date: Sat, 5 Dec 2020 20:15:24 +0100
Subject: [PATCH] Add custom module load for GUI

---
 gajim/gajim.py        | 10 ++++++++--
 gajim/gui/__init__.py | 38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 2 deletions(-)
 create mode 100644 gajim/gui/__init__.py

diff --git a/gajim/gajim.py b/gajim/gajim.py
index 4ff6125480..5ec56ed5d8 100644
--- a/gajim/gajim.py
+++ b/gajim/gajim.py
@@ -24,8 +24,10 @@
 from ctypes.util import find_library
 from packaging.version import Version as V
 
+import gajim.gui
 from gajim.common import i18n
 
+
 _MIN_NBXMPP_VER = '1.99.0'
 _MIN_GTK_VER = '3.22.27'
 _MIN_CAIRO_VER = '1.16.0'
@@ -102,13 +104,16 @@ def _disable_csd():
 
 
 def _init_gtk():
-    from gajim.gtk import exception
+    gajim.gui.init('gtk')
+
+    from gajim.gui import exception
     exception.init()
 
     i18n.initialize_direction_mark()
 
-    from gajim.application import GajimApplication
 
+def _run_app():
+    from gajim.application import GajimApplication
     application = GajimApplication()
     _install_sginal_handlers(application)
     application.run(sys.argv)
@@ -152,3 +157,4 @@ def main():
     _set_proc_title()
     _disable_csd()
     _init_gui('GTK')
+    _run_app()
diff --git a/gajim/gui/__init__.py b/gajim/gui/__init__.py
new file mode 100644
index 0000000000..680f53cf2b
--- /dev/null
+++ b/gajim/gui/__init__.py
@@ -0,0 +1,38 @@
+
+import sys
+import importlib
+from pathlib import Path
+
+
+class GUIFinder(importlib.abc.MetaPathFinder):
+
+    def __init__(self, name, fallback=None):
+        self._path = Path(__file__).parent.parent / name
+
+        self._fallback_path = None
+        if fallback is not None:
+            self._fallback_path = Path(__file__).parent.parent / fallback
+
+        self._suffix = 'pyc' if sys.platform == 'win32' else 'py'
+
+    def find_spec(self, fullname, _path, _target=None):
+        if not fullname.startswith('gajim.gui'):
+            return None
+
+        _namespace, module_name = fullname.rsplit('.', 1)
+        module_path = self._path / f'{module_name}.{self._suffix}'
+
+        if not module_path.exists():
+            if self._fallback_path is None:
+                return None
+
+            module_path = self._fallback_path / f'{module_name}.{self._suffix}'
+            if not module_path.exists():
+                return None
+
+        spec = importlib.util.spec_from_file_location(fullname, module_path)
+
+        return spec
+
+def init(name, fallback=None):
+    sys.meta_path.append(GUIFinder(name, fallback=fallback))
-- 
GitLab