Added setup py; buiuld system; and IPC and process detection
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								images/pic2.png
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								images/pic2.png
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 300 KiB After Width: | Height: | Size: 456 KiB  | 
@@ -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 "$@";
 | 
			
		||||
							
								
								
									
										3
									
								
								src/versions/pyfm-0.0.1/PyFM/new/pyfm.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/versions/pyfm-0.0.1/PyFM/new/pyfm.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
[build-system]
 | 
			
		||||
requires = ["setuptools", "wheel"]
 | 
			
		||||
build-backend = "setuptools.build_meta"
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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:
 | 
			
		||||
        event_system.keep_ipc_alive = False
 | 
			
		||||
        if debug:
 | 
			
		||||
            traceback.print_exc()
 | 
			
		||||
 
 | 
			
		||||
@@ -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))
 | 
			
		||||
@@ -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
 | 
			
		||||
@@ -58,6 +58,7 @@ class Signals(WidgetFileActionMixin, PaneMixin, WindowMixin):
 | 
			
		||||
 | 
			
		||||
    def tear_down(self, widget=None, eve=None):
 | 
			
		||||
        self.window_controller.save_state()
 | 
			
		||||
        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()
 | 
			
		||||
 
 | 
			
		||||
@@ -2,4 +2,5 @@
 | 
			
		||||
    Gtk Bound Signal Module
 | 
			
		||||
"""
 | 
			
		||||
from .mixins import *
 | 
			
		||||
from .DBusControllerMixin import DBusControllerMixin
 | 
			
		||||
from .Signals import Signals
 | 
			
		||||
 
 | 
			
		||||
@@ -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):
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								src/versions/pyfm-0.0.1/PyFM/new/setup.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/versions/pyfm-0.0.1/PyFM/new/setup.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
from setuptools import setup
 | 
			
		||||
 | 
			
		||||
setup(
 | 
			
		||||
    name='pyfm',
 | 
			
		||||
    version='0.0.1',
 | 
			
		||||
    packages=['pyfm'],
 | 
			
		||||
    install_requires=[
 | 
			
		||||
        'setproctitle',
 | 
			
		||||
        'PyGobject',
 | 
			
		||||
    ],
 | 
			
		||||
)
 | 
			
		||||
		Reference in New Issue
	
	Block a user