From f784366b9604c61aa40e84b35d26351c1ffce762 Mon Sep 17 00:00:00 2001 From: Maxim Stewart Date: Mon, 2 Sep 2019 17:55:35 -0500 Subject: [PATCH] Started conversion to cleaner structure --- bin/gwinwrap-0-0-1-x64.deb | Bin 41176 -> 41876 bytes src/GWinWrap/GWinWrap.py | 404 ++---------------- .../{GWinWrap.glade => Main_Window.glade} | 2 +- .../signal_classes/CrossClassSignals.py | 362 ++++++++++++++++ src/GWinWrap/signal_classes/__init__.py | 1 + src/GWinWrap/utils/Settings.py | 74 ++++ src/GWinWrap/utils/__init__.py | 3 +- 7 files changed, 469 insertions(+), 377 deletions(-) mode change 100755 => 100644 src/GWinWrap/GWinWrap.py rename src/GWinWrap/resources/{GWinWrap.glade => Main_Window.glade} (99%) create mode 100644 src/GWinWrap/signal_classes/CrossClassSignals.py create mode 100644 src/GWinWrap/signal_classes/__init__.py create mode 100644 src/GWinWrap/utils/Settings.py diff --git a/bin/gwinwrap-0-0-1-x64.deb b/bin/gwinwrap-0-0-1-x64.deb index 952079b8b3a652b8f2a39b54d84c1c2d48c46e00..8c1dfce3aeb03460e27be9cf560769aaf16824d4 100644 GIT binary patch delta 33461 zcmV)5K*_(@!2*=W0+1UAH#9ahH!?VpA~^>)G&VFhGB~kf83Rr?G&VFhGB_Y0Fd!fx zARsUxARr(hF)%PTG&CR}G%z_dG$0@#ARu50{Wp48S^xk9=GL@E1i-Jq0)XHMApsTu z00000Mn2MY;xGT7r?bfejvjy4UL1w9>DE2G)wHtdT%|Xe0AZuS^6X=Y(|8{9ffn|p zw(#c&cFYj=Wa04U`-RWjM24pJ#<(|6;L6?m?GZS;e%F_vaK~=ENg}=vA{*HgzB!qn zYII9@j_t-S*@@DMDPuL`xVGosg{+7SYii`J?%>ble)x24-5mRo*P(yOp5DI1?i;Mn zj%7fbv4NazB5tJA0aMq^)$qhyiAUZcrW9Q>Cu3-CA}xUy8+BMu^wayVh?9Pn9b?8e z4wMr&0O`RCPekQGQ0BkpD?F*KMZ=BW+W@ zhN5k0%2)UZLtLqL>;%||AMwDm(3VN#y-^dTEP&

0XZ>i>q#nMkMN9 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 K000001X)_G+NY-g diff --git a/src/GWinWrap/GWinWrap.py b/src/GWinWrap/GWinWrap.py old mode 100755 new mode 100644 index e9a0ce6..0ea29f8 --- a/src/GWinWrap/GWinWrap.py +++ b/src/GWinWrap/GWinWrap.py @@ -1,395 +1,49 @@ -#!/usr/bin/env python - -import os, cairo, sys, gi, re, threading, subprocess, hashlib, signal, time +#!/usr/bin/python3 +# Gtk imports +import gi, faulthandler, signal 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 -from gi.repository import GObject as gobject -from gi.repository import GdkPixbuf from gi.repository import GLib +# Python imports +import inspect -from os import listdir -from os.path import isfile, join -from threading import Thread +from setproctitle import setproctitle -from utils import SaveStateToXWinWarp, SaveGWinWrapSettings - -gdk.threads_init() +# Application imports +from utils import Settings +from signal_classes import CrossClassSignals -class GWinWrap: +class Main: def __init__(self): - self.builder = gtk.Builder() - self.builder.add_from_file("resources/GWinWrap.glade") - self.builder.connect_signals(self) - - # Get window and connect signals - self.stateSaver = SaveStateToXWinWarp() - self.sttngsSver = SaveGWinWrapSettings() - window = self.builder.get_object("Main") - monitors = self.setWindowData(window) - window.connect("delete-event", gtk.main_quit) + setproctitle('GWinWrap') GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGINT, gtk.main_quit) + faulthandler.enable() # For better debug info - # Add filter to allow only folders to be selected - dialog = self.builder.get_object("selectedDirDialog") - filefilter = self.builder.get_object("Folders") - dialog.add_filter(filefilter) + settings = Settings() + builder = settings.returnBuilder() - # Get reference to remove and add it back... - self.gridLabel = self.builder.get_object("gridLabel") + # Gets the methods from the classes and sets to handler. + # Then, builder connects to any signals it needs. + classes = [CrossClassSignals(settings)] + + handlers = {} + for c in classes: + methods = inspect.getmembers(c, predicate=inspect.ismethod) + handlers.update(methods) - self.focusedImg = gtk.Image() - self.usrHome = os.path.expanduser('~') - self.xScreenVal = None - self.toSavePath = None # Global file path and type for saving to file - self.applyType = 1 # 1 is XWinWrap and 2 is Nitrogen - - self.loadProgress = self.builder.get_object("loadProgress") - self.helpLabel = self.builder.get_object("helpLabel") - self.defaultLabel = "Note: Double click an image to view the video or image." - self.savedLabel = "Saved settings..." - self.appliedLabel = "Running xwinwrap..." - self.stoppedLabel = "Stopped xwinwrap..." - # foreground=\"#ffa800\" - # foreground=\"#88cc27\" - # foreground=\"#ff0000\" - - # Fill list xscreensaver - self.xscrPth = "/usr/lib/xscreensaver/" - xscreenList = self.builder.get_object("XScreensaver List") - list = [f for f in listdir(self.xscrPth) if isfile(join(self.xscrPth, f))] - list.sort() - - for file in list: - xscreenList.append((file,)) - - self.selectedImg = None # EventBox holder - self.defPath = None - self.player = None - self.imgVwr = None - self.demoAreaPid = None - - self.retrieveSettings() + builder.connect_signals(handlers) + window = settings.createWindow() window.show() - def setWindowData(self, window): - screen = window.get_screen() - visual = screen.get_rgba_visual() - if visual != None and screen.is_composited(): - window.set_visual(visual) - - window.set_app_paintable(True) - window.connect("draw", self.area_draw) - - # bind css file - cssProvider = gtk.CssProvider() - cssProvider.load_from_path('resources/stylesheet.css') - screen = gdk.Screen.get_default() - styleContext = gtk.StyleContext() - styleContext.add_provider_for_screen(screen, cssProvider, gtk.STYLE_PROVIDER_PRIORITY_USER) - - return self.getMonitorData(screen) - - def area_draw(self, widget, cr): - cr.set_source_rgba(0, 0, 0, 0.64) - cr.set_operator(cairo.OPERATOR_SOURCE) - cr.paint() - cr.set_operator(cairo.OPERATOR_OVER) - - def getMonitorData(self, screen): - posOff = self.builder.get_object("posOffset") - monitors = [] - wxhxny = [] - - for m in range(screen.get_n_monitors()): - monitors.append(screen.get_monitor_geometry(m)) - - wxhxny.append(monitors) - for monitor in monitors: - wxhxny.append(str(monitor.width) + "x" + str(monitor.height) + "+" + str(monitor.x) + "+" + str(monitor.y)) - - if monitor.x >= 0 and monitor.y >= 0: - posOff.append_text("+" + str(monitor.x) + "+" + str(monitor.y)) - elif monitor.x <= 0 and monitor.y <= 0: - posOff.append_text(str(monitor.x) + str(monitor.y)) - elif monitor.x >= 0 and monitor.y <= 0: - posOff.append_text("+" + str(monitor.x) + str(monitor.y)) - elif monitor.x <= 0 and monitor.y >= 0: - posOff.append_text(str(monitor.x) + "+" + str(monitor.y)) - - posOff.set_active(0) - return wxhxny - - - def setNewDir(self, widget, data=None): - dir = widget.get_filename() - Thread(target=self.newDir, args=(dir,)).start() - - def newDir(self, dir): - imageGrid = self.builder.get_object("imageGrid") - dirPath = dir - list = [f for f in listdir(dirPath) if isfile(join(dirPath, f))] - files = [] - row = 0 - col = 0 - - for file in list: - if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm', '.png', '.jpg', '.jpeg', '.gif')): - files.append(file) - - fractionTick = 1.0 / 1.0 if len(files) == 0 else len(files) - tickCount = 0.0 - self.clear() - imageGrid.remove_column(0) - self.loadProgress.set_text("Loading...") - self.loadProgress.set_fraction(0.0) - self.helpLabel.set_markup("" + dirPath.strip(self.usrHome) + "") - for file in files: - fullPathFile = dirPath + "/" + file - eveBox = gtk.EventBox() - thumbnl = gtk.Image() - - if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm')): - fileHash = hashlib.sha256(str.encode(fullPathFile)).hexdigest() - hashImgpth = self.usrHome + "/.thumbnails/normal/" + fileHash + ".png" - if isfile(hashImgpth) == False: - self.generateThumbnail(fullPathFile, hashImgpth) - - thumbnl = self.createGtkImage(hashImgpth, [310, 310]) - eveBox.connect("button_press_event", self.runMplayerProcess, (fullPathFile, file, eveBox,)) - eveBox.connect("enter_notify_event", self.mouseOver, ()) - eveBox.connect("leave_notify_event", self.mouseOut, ()) - elif file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')): - thumbnl = self.createGtkImage(fullPathFile, [310, 310]) - eveBox.connect("button_press_event", self.runImageViewerProcess, (fullPathFile, file, eveBox,)) - eveBox.connect("enter_notify_event", self.mouseOver, ()) - eveBox.connect("leave_notify_event", self.mouseOut, ()) - else: - print("Not a video or image file.") - return - - gobject.idle_add(self.preGridSetup, (eveBox, thumbnl, )) - gobject.idle_add(self.addToGrid, (imageGrid, eveBox, col, row,)) - tickCount = tickCount + fractionTick - self.loadProgress.set_fraction(tickCount) - - col += 1 - if col == 2: - col = 0 - row += 1 - - self.loadProgress.set_text("Finished...") - - def preGridSetup(self, args): - args[0].show() - args[1].show() - args[0].add(args[1]) - - def addToGrid(self, args): - args[0].attach(args[1], args[2], args[3], 1, 1) - - def generateThumbnail(self, fullPathFile, hashImgpth): - subprocess.call(["ffmpegthumbnailer", "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPathFile, "-o", hashImgpth]) - - def createGtkImage(self, path, wxh): - try: - pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( - filename = path, - width = wxh[0], - height = wxh[1], - preserve_aspect_ratio = True) - return gtk.Image.new_from_pixbuf(pixbuf) - except Exception as e: - print(e) - - return gtk.Image() - - - def openMainImageViewer(self, widget): - subprocess.call([self.imgVwr, self.toSavePath]) - - def runImageViewerProcess(self, widget, eve, params): - self.setSelected(params[2]) - - if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS: - previewWindow = self.builder.get_object("previewWindow") - previewImg = self.builder.get_object("previewImg") - previewImg.set_from_file(params[0]) - previewWindow.show_all() - previewWindow.popup() - - self.toSavePath = params[0] - self.applyType = 2 - self.helpLabel.set_markup("" + params[1] + "") - - def setSelected(self, eveBox): - if self.selectedImg: - col = gdk.RGBA(0.0, 0.0, 0.0, 0.0) - self.selectedImg.override_background_color(gtk.StateType.NORMAL, col) - - col = gdk.RGBA(0.9, 0.7, 0.4, 0.74) - eveBox.override_background_color(gtk.StateType.NORMAL, col) - self.selectedImg = eveBox - - def closePopup(self, widget): - self.builder.get_object("previewWindow").popdown() - - def mouseOver(self, widget, eve, args): - hand_cursor = gdk.Cursor(gdk.CursorType.HAND2) - self.builder.get_object("Main").get_window().set_cursor(hand_cursor) - - def mouseOut(self, widget, eve, args): - watch_cursor = gdk.Cursor(gdk.CursorType.LEFT_PTR) - self.builder.get_object("Main").get_window().set_cursor(watch_cursor) - - def toggleXscreenUsageField(self, widget, data=None): - useXscreenSaver = self.builder.get_object("useXScrnList") - if useXscreenSaver.get_active(): - self.builder.get_object("xScreenSvrList").set_sensitive(True) - else: - self.builder.get_object("xScreenSvrList").set_sensitive(False) - - def popSttingsWindow(self, widget): - self.builder.get_object("settingsWindow").popup() - - def saveToSettingsFile(self, widget): - self.defPath = self.builder.get_object("customDefaultPath").get_text().strip() - self.player = self.builder.get_object("customVideoPlyr").get_text().strip() - self.imgVwr = self.builder.get_object("customImgVwr").get_text().strip() - - self.sttngsSver.saveSettings(self.defPath, self.player, self.imgVwr) - - def retrieveSettings(self): - data = self.sttngsSver.retrieveSettings() - self.defPath = data[0] - self.player = data[1] - self.imgVwr = data[2] - - self.builder.get_object("customDefaultPath").set_text(self.defPath) - self.builder.get_object("customVideoPlyr").set_text(self.player) - self.builder.get_object("customImgVwr").set_text(self.imgVwr) - self.builder.get_object("selectedDirDialog").set_filename(self.defPath) - - def saveToFile(self, widget, data=None): - saveLoc = self.builder.get_object("saveLoc").get_active_text() - useXscreenSaver = self.builder.get_object("useXScrnList").get_active() - plyBckRes = self.builder.get_object("playbackResolution") - offset4Res = self.builder.get_object("posOffset") - resolution = plyBckRes.get_active_text() + offset4Res.get_active_text() - self.applyType = self.stateSaver.saveToFile(self.toSavePath, resolution, - saveLoc, useXscreenSaver, self.xScreenVal) - if self.applyType == -1: - self.helpLabel.set_markup("Nothing saved...") - return - - self.helpLabel.set_markup(self.savedLabel) - - def applySttngs(self, widget, data=None): - os.system("killall xwinwrap &") - if self.applyType == 1: - os.system("bash -c '~/.animatedBGstarter.sh' &") - os.system("bash -c '~/.animatedBGstarter2.sh' &") - elif self.applyType == 2: - os.system("nitrogen --restore &") - else: - os.system("nitrogen --restore &") - self.helpLabel.set_markup(self.appliedLabel) - - def killXWinWrp(self, widget, data=None): - os.system("killall xwinwrap &") - self.helpLabel.set_markup(self.stoppedLabel) - - def passXScreenVal(self, widget): - xSvrListStore = self.builder.get_object("XScreensaver List") - row = widget.get_cursor() - path = gtk.TreePath(row.path) - treeiter = xSvrListStore.get_iter(path[0]) - self.xScreenVal = xSvrListStore.get_value(treeiter, 0) - - - def runMplayerProcess(self, widget, eve, params): - self.setSelected(params[2]) - video = params[0] - - if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS: - if self.player == "mplayer": - xid = self.getXID() - command = [self.player, video, "-slave", "-wid", str(xid), "-really-quiet", "-ao", "null", "-loop", "0"] - self.runDemoToDrawArea(command) - else: - subprocess.call([self.player, video, "-really-quiet", "-ao", "null", "-loop", "0"]) - - self.toSavePath = params[0] - self.applyType = 1 - self.helpLabel.set_markup("" + params[1] + "") - - def previewXscreen(self, widget, eve): - if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS: - demoXscrnSaver = self.xscrPth + self.xScreenVal - xid = self.getXID() - command = [demoXscrnSaver, "-window-id", str(xid)] - self.runDemoToDrawArea(command) - - def getXID(self): - # Must be actualized before getting window - demoWindowPopup = self.builder.get_object("demoPreviewPopWindow") - - if demoWindowPopup.get_visible() == False: - demoWindowPopup.show_all() - demoWindowPopup.popup() - - demoPreview = self.builder.get_object("demoPreview") - drwWindow = demoPreview.get_window() - return drwWindow.get_xid() - - def runDemoToDrawArea(self, command): - self.helpLabel.set_markup("") - - if self.demoAreaPid: - os.kill(self.demoAreaPid, signal.SIGTERM) #or signal.SIGKILL - self.demoAreaPid = None - - time.sleep(.800) # 800 mili-seconds to ensure first process dead - process = subprocess.Popen(command) - self.demoAreaPid = process.pid - - def closeDemoWindow(self, widget, data=None): - self.builder.get_object("demoPreviewPopWindow").popdown() - os.kill(self.demoAreaPid, signal.SIGTERM) #or signal.SIGKILL - self.demoAreaPid = None - - def clearSelection(self, widget, data=None): - self.clear() - - def clear(self): - imageGrid = self.builder.get_object("imageGrid") - - while True: - if imageGrid.get_child_at(0,0)!= None: - imageGrid.remove_row(0) - else: - break - - imageGrid.attach(self.gridLabel, 0, 0, 1, 1) - self.builder.get_object("xScreenSvrList").set_sensitive(False) - self.builder.get_object("useXScrnList").set_active(False) - self.helpLabel.set_markup(self.defaultLabel) - self.loadProgress.set_text("") - self.loadProgress.set_fraction(0.0) - self.toSavePath = None - self.xScreenVal = None - self.applyType = 1 # Default to XWinWrap - - def closeProgram(self, widget, data=None): - sys.exit(0) - - if __name__ == "__main__": - main = GWinWrap() - gtk.main() + try: + main = Main() + gtk.main() + except Exception as e: + print(e) diff --git a/src/GWinWrap/resources/GWinWrap.glade b/src/GWinWrap/resources/Main_Window.glade similarity index 99% rename from src/GWinWrap/resources/GWinWrap.glade rename to src/GWinWrap/resources/Main_Window.glade index 1864a66..e0d1930 100644 --- a/src/GWinWrap/resources/GWinWrap.glade +++ b/src/GWinWrap/resources/Main_Window.glade @@ -68,7 +68,7 @@ gtk-media-stop 3 - + 950 600 False diff --git a/src/GWinWrap/signal_classes/CrossClassSignals.py b/src/GWinWrap/signal_classes/CrossClassSignals.py new file mode 100644 index 0000000..49d4241 --- /dev/null +++ b/src/GWinWrap/signal_classes/CrossClassSignals.py @@ -0,0 +1,362 @@ +# Gtk imports +import gi + +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 +from gi.repository import GLib as glib +from gi.repository import GdkPixbuf + +# Python imports +import threading, subprocess, signal, os, sys, re, hashlib, time + +from os import listdir +from os.path import isfile, join + +# Application imports +from utils import SaveStateToXWinWarp, SaveGWinWrapSettings + + + +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() + + self.WINDOW = self.builder.get_object("Main_Window").get_window() + self.stateSaver = SaveStateToXWinWarp() + self.sttngsSver = SaveGWinWrapSettings() + + # Add filter to allow only folders to be selected + dialog = self.builder.get_object("selectedDirDialog") + filefilter = self.builder.get_object("Folders") + dialog.add_filter(filefilter) + + # Get reference to remove and add it back... + self.gridLabel = self.builder.get_object("gridLabel") + + self.focusedImg = gtk.Image() + self.usrHome = os.path.expanduser('~') + self.xScreenVal = None + self.toSavePath = None # Global file path and type for saving to file + self.applyType = 1 # 1 is XWinWrap and 2 is Nitrogen + + self.loadProgress = self.builder.get_object("loadProgress") + self.helpLabel = self.builder.get_object("helpLabel") + self.defaultLabel = "Note: Double click an image to view the video or image." + self.savedLabel = "Saved settings..." + self.appliedLabel = "Running xwinwrap..." + self.stoppedLabel = "Stopped xwinwrap..." + # foreground=\"#ffa800\" + # foreground=\"#88cc27\" + # foreground=\"#ff0000\" + + # Fill list xscreensaver + self.xscrPth = "/usr/lib/xscreensaver/" + xscreenList = self.builder.get_object("XScreensaver List") + list = [f for f in listdir(self.xscrPth) if isfile(join(self.xscrPth, f))] + list.sort() + + for file in list: + xscreenList.append((file,)) + + self.selectedImg = None # EventBox holder + self.defPath = None + self.player = None + self.imgVwr = None + self.demoAreaPid = None + + self.setPosData() + self.retrieveSettings() + + + + def setNewDir(self, widget, data=None): + dir = widget.get_filename() + threading.Thread(target=self.newDir, args=(dir,)).start() + + def newDir(self, dir): + imageGrid = self.builder.get_object("imageGrid") + dirPath = dir + list = [f for f in listdir(dirPath) if isfile(join(dirPath, f))] + files = [] + row = 0 + col = 0 + + for file in list: + if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm', '.png', '.jpg', '.jpeg', '.gif')): + files.append(file) + + fractionTick = 1.0 / 1.0 if len(files) == 0 else len(files) + tickCount = 0.0 + self.clear() + imageGrid.remove_column(0) + self.loadProgress.set_text("Loading...") + self.loadProgress.set_fraction(0.0) + self.helpLabel.set_markup("" + dirPath.strip(self.usrHome) + "") + for file in files: + fullPathFile = dirPath + "/" + file + eveBox = gtk.EventBox() + thumbnl = gtk.Image() + + if file.lower().endswith(('.mkv', '.avi', '.flv', '.mov', '.m4v', '.mpg', '.wmv', '.mpeg', '.mp4', '.webm')): + fileHash = hashlib.sha256(str.encode(fullPathFile)).hexdigest() + hashImgpth = self.usrHome + "/.thumbnails/normal/" + fileHash + ".png" + if isfile(hashImgpth) == False: + self.generateThumbnail(fullPathFile, hashImgpth) + + thumbnl = self.createGtkImage(hashImgpth, [310, 310]) + eveBox.connect("button_press_event", self.runMplayerProcess, (fullPathFile, file, eveBox,)) + eveBox.connect("enter_notify_event", self.mouseOver, ()) + eveBox.connect("leave_notify_event", self.mouseOut, ()) + elif file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')): + thumbnl = self.createGtkImage(fullPathFile, [310, 310]) + eveBox.connect("button_press_event", self.runImageViewerProcess, (fullPathFile, file, eveBox,)) + eveBox.connect("enter_notify_event", self.mouseOver, ()) + eveBox.connect("leave_notify_event", self.mouseOut, ()) + else: + print("Not a video or image file.") + return + + glib.idle_add(self.preGridSetup, (eveBox, thumbnl, )) + glib.idle_add(self.addToGrid, (imageGrid, eveBox, col, row,)) + tickCount = tickCount + fractionTick + self.loadProgress.set_fraction(tickCount) + + col += 1 + if col == 2: + col = 0 + row += 1 + + self.loadProgress.set_text("Finished...") + + def preGridSetup(self, args): + args[0].show() + args[1].show() + args[0].add(args[1]) + + def addToGrid(self, args): + args[0].attach(args[1], args[2], args[3], 1, 1) + + def generateThumbnail(self, fullPathFile, hashImgpth): + subprocess.call(["ffmpegthumbnailer", "-t", "65%", "-s", "300", "-c", "jpg", "-i", fullPathFile, "-o", hashImgpth]) + + def createGtkImage(self, path, wxh): + try: + pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( + filename = path, + width = wxh[0], + height = wxh[1], + preserve_aspect_ratio = True) + return gtk.Image.new_from_pixbuf(pixbuf) + except Exception as e: + print(e) + + return gtk.Image() + + + def openMainImageViewer(self, widget): + subprocess.call([self.imgVwr, self.toSavePath]) + + def runImageViewerProcess(self, widget, eve, params): + self.setSelected(params[2]) + + if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS: + previewWindow = self.builder.get_object("previewWindow") + previewImg = self.builder.get_object("previewImg") + previewImg.set_from_file(params[0]) + previewWindow.show_all() + previewWindow.popup() + + self.toSavePath = params[0] + self.applyType = 2 + self.helpLabel.set_markup("" + params[1] + "") + + def setSelected(self, eveBox): + if self.selectedImg: + col = gdk.RGBA(0.0, 0.0, 0.0, 0.0) + self.selectedImg.override_background_color(gtk.StateType.NORMAL, col) + + col = gdk.RGBA(0.9, 0.7, 0.4, 0.74) + eveBox.override_background_color(gtk.StateType.NORMAL, col) + self.selectedImg = eveBox + + def closePopup(self, widget): + self.builder.get_object("previewWindow").popdown() + + def mouseOver(self, widget, eve, args): + hand_cursor = gdk.Cursor(gdk.CursorType.HAND2) + self.builder.get_object("Main_Window").get_window().set_cursor(hand_cursor) + + def mouseOut(self, widget, eve, args): + watch_cursor = gdk.Cursor(gdk.CursorType.LEFT_PTR) + self.builder.get_object("Main_Window").get_window().set_cursor(watch_cursor) + + def toggleXscreenUsageField(self, widget, data=None): + useXscreenSaver = self.builder.get_object("useXScrnList") + if useXscreenSaver.get_active(): + self.builder.get_object("xScreenSvrList").set_sensitive(True) + else: + self.builder.get_object("xScreenSvrList").set_sensitive(False) + + def popSttingsWindow(self, widget): + self.builder.get_object("settingsWindow").popup() + + def saveToSettingsFile(self, widget): + self.defPath = self.builder.get_object("customDefaultPath").get_text().strip() + self.player = self.builder.get_object("customVideoPlyr").get_text().strip() + self.imgVwr = self.builder.get_object("customImgVwr").get_text().strip() + + self.sttngsSver.saveSettings(self.defPath, self.player, self.imgVwr) + + def retrieveSettings(self): + data = self.sttngsSver.retrieveSettings() + self.defPath = data[0] + self.player = data[1] + self.imgVwr = data[2] + + self.builder.get_object("customDefaultPath").set_text(self.defPath) + self.builder.get_object("customVideoPlyr").set_text(self.player) + self.builder.get_object("customImgVwr").set_text(self.imgVwr) + self.builder.get_object("selectedDirDialog").set_filename(self.defPath) + + def saveToFile(self, widget, data=None): + saveLoc = self.builder.get_object("saveLoc").get_active_text() + useXscreenSaver = self.builder.get_object("useXScrnList").get_active() + plyBckRes = self.builder.get_object("playbackResolution") + offset4Res = self.builder.get_object("posOffset") + resolution = plyBckRes.get_active_text() + offset4Res.get_active_text() + self.applyType = self.stateSaver.saveToFile(self.toSavePath, resolution, + saveLoc, useXscreenSaver, self.xScreenVal) + if self.applyType == -1: + self.helpLabel.set_markup("Nothing saved...") + return + + self.helpLabel.set_markup(self.savedLabel) + + def applySttngs(self, widget, data=None): + os.system("killall xwinwrap &") + if self.applyType == 1: + os.system("bash -c '~/.animatedBGstarter.sh' &") + os.system("bash -c '~/.animatedBGstarter2.sh' &") + elif self.applyType == 2: + os.system("nitrogen --restore &") + else: + os.system("nitrogen --restore &") + self.helpLabel.set_markup(self.appliedLabel) + + def killXWinWrp(self, widget, data=None): + os.system("killall xwinwrap &") + self.helpLabel.set_markup(self.stoppedLabel) + + def passXScreenVal(self, widget): + xSvrListStore = self.builder.get_object("XScreensaver List") + row = widget.get_cursor() + path = gtk.TreePath(row.path) + treeiter = xSvrListStore.get_iter(path[0]) + self.xScreenVal = xSvrListStore.get_value(treeiter, 0) + + + def runMplayerProcess(self, widget, eve, params): + self.setSelected(params[2]) + video = params[0] + + if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS: + if self.player == "mplayer": + xid = self.getXID() + command = [self.player, video, "-slave", "-wid", str(xid), "-really-quiet", "-ao", "null", "-loop", "0"] + self.runDemoToDrawArea(command) + else: + subprocess.call([self.player, video, "-really-quiet", "-ao", "null", "-loop", "0"]) + + self.toSavePath = params[0] + self.applyType = 1 + self.helpLabel.set_markup("" + params[1] + "") + + def previewXscreen(self, widget, eve): + if eve.type == gdk.EventType.DOUBLE_BUTTON_PRESS: + demoXscrnSaver = self.xscrPth + self.xScreenVal + xid = self.getXID() + command = [demoXscrnSaver, "-window-id", str(xid)] + self.runDemoToDrawArea(command) + + def getXID(self): + # Must be actualized before getting window + demoWindowPopup = self.builder.get_object("demoPreviewPopWindow") + + if demoWindowPopup.get_visible() == False: + demoWindowPopup.show_all() + demoWindowPopup.popup() + + demoPreview = self.builder.get_object("demoPreview") + drwWindow = demoPreview.get_window() + return drwWindow.get_xid() + + def runDemoToDrawArea(self, command): + self.helpLabel.set_markup("") + + if self.demoAreaPid: + os.kill(self.demoAreaPid, signal.SIGTERM) #or signal.SIGKILL + self.demoAreaPid = None + + time.sleep(.800) # 800 mili-seconds to ensure first process dead + process = subprocess.Popen(command) + self.demoAreaPid = process.pid + + def closeDemoWindow(self, widget, data=None): + self.builder.get_object("demoPreviewPopWindow").popdown() + os.kill(self.demoAreaPid, signal.SIGTERM) #or signal.SIGKILL + self.demoAreaPid = None + + def clearSelection(self, widget, data=None): + self.clear() + + def clear(self): + imageGrid = self.builder.get_object("imageGrid") + + while True: + if imageGrid.get_child_at(0,0)!= None: + imageGrid.remove_row(0) + else: + break + + imageGrid.attach(self.gridLabel, 0, 0, 1, 1) + self.builder.get_object("xScreenSvrList").set_sensitive(False) + self.builder.get_object("useXScrnList").set_active(False) + self.helpLabel.set_markup(self.defaultLabel) + self.loadProgress.set_text("") + self.loadProgress.set_fraction(0.0) + self.toSavePath = None + self.xScreenVal = None + self.applyType = 1 # Default to XWinWrap + + + + def setPosData(self): + monitors = self.settings.getMonitorData() + posOff = self.builder.get_object("posOffset") + + for monitor in monitors: + if monitor.x >= 0 and monitor.y >= 0: + posOff.append_text("+" + str(monitor.x) + "+" + str(monitor.y)) + elif monitor.x <= 0 and monitor.y <= 0: + posOff.append_text(str(monitor.x) + str(monitor.y)) + elif monitor.x >= 0 and monitor.y <= 0: + posOff.append_text("+" + str(monitor.x) + str(monitor.y)) + elif monitor.x <= 0 and monitor.y >= 0: + posOff.append_text(str(monitor.x) + "+" + str(monitor.y)) + + posOff.set_active(0) + + + def closeProgram(self, widget, data=None): + sys.exit(0) diff --git a/src/GWinWrap/signal_classes/__init__.py b/src/GWinWrap/signal_classes/__init__.py new file mode 100644 index 0000000..d2d4cdf --- /dev/null +++ b/src/GWinWrap/signal_classes/__init__.py @@ -0,0 +1 @@ +from signal_classes.CrossClassSignals import CrossClassSignals diff --git a/src/GWinWrap/utils/Settings.py b/src/GWinWrap/utils/Settings.py new file mode 100644 index 0000000..1f5479f --- /dev/null +++ b/src/GWinWrap/utils/Settings.py @@ -0,0 +1,74 @@ +# 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 + +# Python imports +import os + +# Application imports + + +class Settings: + def __init__(self): + self.builder = gtk.Builder() + self.builder.add_from_file("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) + return window + + def setWindowData(self, window): + 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('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(True) + + 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 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/GWinWrap/utils/__init__.py b/src/GWinWrap/utils/__init__.py index 579b043..ca4b01b 100644 --- a/src/GWinWrap/utils/__init__.py +++ b/src/GWinWrap/utils/__init__.py @@ -1,2 +1,3 @@ +from utils.Settings import Settings from utils.SaveStateToXWinWarp import SaveStateToXWinWarp -from utils.SaveGWinWrapSettings import SaveGWinWrapSettings\ +from utils.SaveGWinWrapSettings import SaveGWinWrapSettings