diff --git a/images/pic2.png b/images/pic2.png index 83d6485..942abf2 100644 Binary files a/images/pic2.png and b/images/pic2.png differ diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/pyfm b/src/versions/pyfm-0.0.1/PyFM/new/pyfm.sh similarity index 95% rename from src/versions/pyfm-0.0.1/PyFM/new/pyfm/pyfm rename to src/versions/pyfm-0.0.1/PyFM/new/pyfm.sh index 6f0e2eb..a527c21 100755 --- a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/pyfm +++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm.sh @@ -13,6 +13,6 @@ function main() { echo "Working Dir: " $(pwd) source "/home/abaddon/Portable_Apps/py-venvs/flask-apps-venv/venv/bin/activate" - python . + python ./pyfm } main "$@"; diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm.toml b/src/versions/pyfm-0.0.1/PyFM/new/pyfm.toml new file mode 100644 index 0000000..9787c3b --- /dev/null +++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/__builtins__.py b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/__builtins__.py index 240c8b7..ef1affd 100644 --- a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/__builtins__.py +++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/__builtins__.py @@ -1,6 +1,13 @@ +# Python imports import builtins -class Builtins: +# Gtk imports + +# Application imports +from signal_classes.DBusControllerMixin import DBusControllerMixin + + +class Builtins(DBusControllerMixin): """Docstring for __builtins__ extender""" def __init__(self): @@ -9,6 +16,8 @@ class Builtins: self._gui_events = [] self._fm_events = [] self.monitor_events = True + self.keep_ipc_alive = True + self.is_ipc_alive = False # Makeshift fake "events" type system FIFO def _pop_gui_event(self): @@ -53,5 +62,5 @@ class Builtins: # NOTE: Just reminding myself we can add to builtins two different ways... # __builtins__.update({"event_system": Builtins()}) builtins.event_system = Builtins() -builtins.event_sleep_time = 0.2 +builtins.event_sleep_time = 0.5 builtins.debug = False diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/__init__.py b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/__init__.py index 092d8cd..221fe20 100644 --- a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/__init__.py +++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/__init__.py @@ -1,10 +1,8 @@ # Python imports -import inspect - +import inspect, time # Gtk imports - # Application imports from utils import Settings from signal_classes import Signals @@ -13,13 +11,24 @@ from __builtins__ import Builtins class Main(Builtins): def __init__(self, args): + event_system.create_ipc_server() + time.sleep(0.5) + if not event_system.is_ipc_alive: + if args.new_tab: + message = f"FILE|{args.new_tab}" + event_system.send_ipc_message(message) + raise Exception("IPC Server Exists: Will send message to it and close...") + settings = Settings() settings.createWindow() + signals = Signals(args, settings) + if not signals: + raise Exception("Signals exited...") + # Gets the methods from the classes and sets to handler. # Then, builder connects to any signals it needs. - classes = [Signals(settings)] - + classes = [signals] handlers = {} for c in classes: methods = None diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/__main__.py b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/__main__.py index 3d02d91..c6f940b 100644 --- a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/__main__.py +++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/__main__.py @@ -12,7 +12,7 @@ tracemalloc.start() # Gtk imports import gi, faulthandler, traceback gi.require_version('Gtk', '3.0') -from gi.repository import Gtk as gtk +from gi.repository import Gtk # Application imports from __init__ import Main @@ -24,11 +24,14 @@ if __name__ == "__main__": faulthandler.enable() # For better debug info parser = argparse.ArgumentParser() # Add long and short arguments - parser.add_argument("--file", "-f", default="default", help="JUST SOME FILE ARG.") + parser.add_argument("--new-tab", "-t", help="Open a file into new tab.") + parser.add_argument("--new-window", "-w", help="Open a file into a new window.") # Read arguments (If any...) args = parser.parse_args() - main = Main(args) - gtk.main() + Main(args) + Gtk.main() except Exception as e: - traceback.print_exc() + event_system.keep_ipc_alive = False + if debug: + traceback.print_exc() diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/DBusControllerMixin.py b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/DBusControllerMixin.py new file mode 100644 index 0000000..30fa2b6 --- /dev/null +++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/DBusControllerMixin.py @@ -0,0 +1,52 @@ +# Python imports +import threading, socket +from multiprocessing.connection import Listener, Client + +# Gtk imports + +# Application imports + + +def threaded(fn): + def wrapper(*args, **kwargs): + threading.Thread(target=fn, args=args, kwargs=kwargs).start() + return wrapper + + +class DBusControllerMixin: + + @threaded + def create_ipc_server(self): + listener = Listener(('127.0.0.1', 4848), authkey=b'pyfm-ipc') + self.is_ipc_alive = True + while event_system.keep_ipc_alive: + conn = listener.accept() + print(f"New Connection: {listener.last_accepted}") + while True: + msg = conn.recv() + print(msg) + + if "FILE|" in msg: + file = msg.split("FILE|")[1].strip() + event_system.push_gui_event(["create_tab_from_ipc", None, file]) + conn.close() + break + + + if msg == 'close connection': + conn.close() + break + if msg == 'close server': + conn.close() + event_system.keep_ipc_alive = False + break + listener.close() + + + def send_ipc_message(self, message="Empty Data..."): + try: + conn = Client(('127.0.0.1', 4848), authkey=b'pyfm-ipc') + conn.send(message) + conn.send('close connection') + except Exception as e: + print(repr(e)) diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/Signals.py b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/Signals.py index 684641b..aee7517 100644 --- a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/Signals.py +++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/Signals.py @@ -21,7 +21,7 @@ def threaded(fn): class Signals(WidgetFileActionMixin, PaneMixin, WindowMixin): - def __init__(self, settings): + def __init__(self, args, settings): self.settings = settings self.builder = self.settings.builder self.logger = self.settings.logger @@ -39,15 +39,15 @@ class Signals(WidgetFileActionMixin, PaneMixin, WindowMixin): self.to_copy_files = [] self.to_cut_files = [] - self.single_click_open = False - self.is_pane1_hidden = False - self.is_pane2_hidden = False - self.is_pane3_hidden = False - self.is_pane4_hidden = False + self.single_click_open = False + self.is_pane1_hidden = False + self.is_pane2_hidden = False + self.is_pane3_hidden = False + self.is_pane4_hidden = False - self.ctrlDown = False - self.shiftDown = False - self.altDown = False + self.ctrlDown = False + self.shiftDown = False + self.altDown = False self.window.show() self.generate_windows(self.state) @@ -58,7 +58,8 @@ class Signals(WidgetFileActionMixin, PaneMixin, WindowMixin): def tear_down(self, widget=None, eve=None): self.window_controller.save_state() - event_system.monitor_events = False + event_system.send_ipc_message("close server") + event_system.monitor_events = False time.sleep(event_sleep_time) Gtk.main_quit() @@ -136,6 +137,8 @@ class Signals(WidgetFileActionMixin, PaneMixin, WindowMixin): if "alt" in keyname: self.altDown = False + if self.ctrlDown and keyname == "q": + self.tear_down() if (self.ctrlDown and keyname == "slash") or keyname == "home": self.builder.get_object("go_home").released() if self.ctrlDown and keyname == "r": @@ -159,12 +162,9 @@ class Signals(WidgetFileActionMixin, PaneMixin, WindowMixin): if self.ctrlDown and keyname == "v": self.paste_files() - if self.ctrlDown and keyname == "o": - pass if keyname == "delete": self.trash_files() - if keyname == "f4": wid, tid = self.window_controller.get_active_data() view = self.get_fm_window(wid).get_view_by_id(tid) @@ -217,14 +217,14 @@ class Signals(WidgetFileActionMixin, PaneMixin, WindowMixin): self.create_new_view_notebook(None, i, None) - def getClipboardData(self): - proc = subprocess.Popen(['xclip','-selection', 'clipboard', '-o'], stdout=subprocess.PIPE) - retcode = proc.wait() - data = proc.stdout.read() - return data.decode("utf-8").strip() - - def setClipboardData(self, data): - proc = subprocess.Popen(['xclip','-selection','clipboard'], stdin=subprocess.PIPE) - proc.stdin.write(data) - proc.stdin.close() - retcode = proc.wait() + # def getClipboardData(self): + # proc = subprocess.Popen(['xclip','-selection', 'clipboard', '-o'], stdout=subprocess.PIPE) + # retcode = proc.wait() + # data = proc.stdout.read() + # return data.decode("utf-8").strip() + # + # def setClipboardData(self, data): + # proc = subprocess.Popen(['xclip','-selection','clipboard'], stdin=subprocess.PIPE) + # proc.stdin.write(data) + # proc.stdin.close() + # retcode = proc.wait() diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/__init__.py b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/__init__.py index 159e1e6..16d0d23 100644 --- a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/__init__.py +++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/__init__.py @@ -2,4 +2,5 @@ Gtk Bound Signal Module """ from .mixins import * +from .DBusControllerMixin import DBusControllerMixin from .Signals import Signals diff --git a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/TabMixin.py b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/TabMixin.py index 0f252dd..76a6672 100644 --- a/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/TabMixin.py +++ b/src/versions/pyfm-0.0.1/PyFM/new/pyfm/signal_classes/mixins/TabMixin.py @@ -9,6 +9,12 @@ from . import WidgetMixin class TabMixin(WidgetMixin): """docstring for TabMixin""" + def create_tab_from_ipc(data): + self, path = data + wid, tid = self.window_controller.get_active_data() + self.create_tab(wid, path) + + def create_tab(self, wid, path=None): notebook = self.builder.get_object(f"window_{wid}") path_entry = self.builder.get_object(f"path_entry") @@ -104,6 +110,7 @@ class TabMixin(WidgetMixin): if action == "create_tab": dir = view.get_current_directory() self.create_tab(wid, dir) + self.window_controller.save_state() return if action == "path_entry": path = widget.get_text() @@ -124,6 +131,7 @@ class TabMixin(WidgetMixin): tab_label.set_label(view.get_end_of_path()) self.set_window_title() self.set_file_watcher(view) + self.window_controller.save_state() def keyboard_close_tab(self): diff --git a/src/versions/pyfm-0.0.1/PyFM/new/setup.py b/src/versions/pyfm-0.0.1/PyFM/new/setup.py new file mode 100644 index 0000000..5cd2885 --- /dev/null +++ b/src/versions/pyfm-0.0.1/PyFM/new/setup.py @@ -0,0 +1,11 @@ +from setuptools import setup + +setup( + name='pyfm', + version='0.0.1', + packages=['pyfm'], + install_requires=[ + 'setproctitle', + 'PyGobject', + ], +)