From 4ceb32f7b7da3a276698b674ab600252787def74 Mon Sep 17 00:00:00 2001 From: Maxim Stewart Date: Thu, 7 May 2020 19:07:33 -0500 Subject: [PATCH] Initial commit n push --- src/__init__.py | 29 +++++++++ src/__main__.py | 32 ++++++++++ src/resources/Main_Window.glade | 14 +++++ src/resources/stylesheet.css | 0 src/signal_classes/Signals.py | 32 ++++++++++ src/signal_classes/__init__.py | 2 + src/signal_classes/mixins/__init__.py | 1 + src/utils/Settings.py | 84 +++++++++++++++++++++++++++ src/utils/__init.py | 1 + 9 files changed, 195 insertions(+) create mode 100644 src/__init__.py create mode 100644 src/__main__.py create mode 100644 src/resources/Main_Window.glade create mode 100644 src/resources/stylesheet.css create mode 100644 src/signal_classes/Signals.py create mode 100644 src/signal_classes/__init__.py create mode 100644 src/signal_classes/mixins/__init__.py create mode 100644 src/utils/Settings.py create mode 100644 src/utils/__init.py diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e6093ed --- /dev/null +++ b/src/__init__.py @@ -0,0 +1,29 @@ +# Python imports +import inspect + + +# Gtk imports + + +# Application imports +from utils import Settings +from signal_classes import Signals + + +class Main: + def __init__(self, args): + settings = Settings() + builder = settings.returnBuilder() + + # Gets the methods from the classes and sets to handler. + # Then, builder connects to any signals it needs. + classes = [Signals(settings)] + + handlers = {} + for c in classes: + methods = inspect.getmembers(c, predicate=inspect.ismethod) + handlers.update(methods) + + builder.connect_signals(handlers) + window = settings.createWindow() + window.show() diff --git a/src/__main__.py b/src/__main__.py new file mode 100644 index 0000000..9873357 --- /dev/null +++ b/src/__main__.py @@ -0,0 +1,32 @@ +#!/usr/bin/python3 + + +# Python imports +import argparse +from setproctitle import setproctitle + +# Gtk imports +import gi, faulthandler, signal +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk as gtk +from gi.repository import GLib + +# Application imports +from __init__ import Main + + +if __name__ == "__main__": + try: + setproctitle('') + GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGINT, gtk.main_quit) + 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.") + + # Read arguments (If any...) + args = parser.parse_args() + main = Main(args) + gtk.main() + except Exception as e: + print( repr(e) ) diff --git a/src/resources/Main_Window.glade b/src/resources/Main_Window.glade new file mode 100644 index 0000000..38409fa --- /dev/null +++ b/src/resources/Main_Window.glade @@ -0,0 +1,14 @@ + + + + + + False + + + + + + + + diff --git a/src/resources/stylesheet.css b/src/resources/stylesheet.css new file mode 100644 index 0000000..e69de29 diff --git a/src/signal_classes/Signals.py b/src/signal_classes/Signals.py new file mode 100644 index 0000000..09894be --- /dev/null +++ b/src/signal_classes/Signals.py @@ -0,0 +1,32 @@ +# Python imports +import threading, subprocess, os + +# Gtk imports + +# Application imports + + +def threaded(fn): + def wrapper(*args, **kwargs): + threading.Thread(target=fn, args=args, kwargs=kwargs).start() + + return wrapper + + +class CrossClassSignals: + def __init__(self, settings): + self.settings = settings + self.builder = self.settings.returnBuilder() + + + 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/signal_classes/__init__.py b/src/signal_classes/__init__.py new file mode 100644 index 0000000..6e3cdc5 --- /dev/null +++ b/src/signal_classes/__init__.py @@ -0,0 +1,2 @@ +from .mixins import * +from . import Signals diff --git a/src/signal_classes/mixins/__init__.py b/src/signal_classes/mixins/__init__.py new file mode 100644 index 0000000..b6e690f --- /dev/null +++ b/src/signal_classes/mixins/__init__.py @@ -0,0 +1 @@ +from . import * diff --git a/src/utils/Settings.py b/src/utils/Settings.py new file mode 100644 index 0000000..4e6ba94 --- /dev/null +++ b/src/utils/Settings.py @@ -0,0 +1,84 @@ +# Python imports +import os + +# Gtk imports +import gi, cairo +gi.require_version('Gtk', '3.0') +gi.require_version('Gdk', '3.0') + +from gi.repository import Gtk as gtk +from gi.repository import Gdk as gdk + + +# Application imports + + +class Settings: + def __init__(self): + self.SCRIPT_PTH = os.path.dirname(os.path.realpath(__file__)) + "/" + self.builder = gtk.Builder() + self.builder.add_from_file(self.SCRIPT_PTH + "../resources/Main_Window.glade") + + # 'Filters' + self.office = ('.doc', '.docx', '.xls', '.xlsx', '.xlt', '.xltx', '.xlm', + '.ppt', 'pptx', '.pps', '.ppsx', '.odt', '.rtf') + self.vids = ('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', + '.mpeg', '.mp4', '.webm') + self.txt = ('.txt', '.text', '.sh', '.cfg', '.conf') + self.music = ('.psf', '.mp3', '.ogg' , '.flac') + self.images = ('.png', '.jpg', '.jpeg', '.gif') + self.pdf = ('.pdf') + + + def createWindow(self): + # Get window and connect signals + window = self.builder.get_object("Main_Window") + window.connect("delete-event", gtk.main_quit) + self.setWindowData(window, False) + return window + + def setWindowData(self, window, paintable): + screen = window.get_screen() + visual = screen.get_rgba_visual() + + if visual != None and screen.is_composited(): + window.set_visual(visual) + + # bind css file + cssProvider = gtk.CssProvider() + cssProvider.load_from_path(self.SCRIPT_PTH + '../resources/stylesheet.css') + screen = gdk.Screen.get_default() + styleContext = gtk.StyleContext() + styleContext.add_provider_for_screen(screen, cssProvider, gtk.STYLE_PROVIDER_PRIORITY_USER) + + window.set_app_paintable(paintable) + if paintable: + window.connect("draw", self.area_draw) + + def getMonitorData(self): + screen = self.builder.get_object("Main_Window").get_screen() + monitors = [] + for m in range(screen.get_n_monitors()): + monitors.append(screen.get_monitor_geometry(m)) + + for monitor in monitors: + print(str(monitor.width) + "x" + str(monitor.height) + "+" + str(monitor.x) + "+" + str(monitor.y)) + + return monitors + + def area_draw(self, widget, cr): + cr.set_source_rgba(0, 0, 0, 0.54) + cr.set_operator(cairo.OPERATOR_SOURCE) + cr.paint() + cr.set_operator(cairo.OPERATOR_OVER) + + + def returnBuilder(self): return self.builder + + # Filter returns + def returnOfficeFilter(self): return self.office + def returnVidsFilter(self): return self.vids + def returnTextFilter(self): return self.txt + def returnMusicFilter(self): return self.music + def returnImagesFilter(self): return self.images + def returnPdfFilter(self): return self.pdf diff --git a/src/utils/__init.py b/src/utils/__init.py new file mode 100644 index 0000000..b616ca1 --- /dev/null +++ b/src/utils/__init.py @@ -0,0 +1 @@ +from . import Settings