diff --git a/cornea.desktop b/cornea.desktop index 515f800..e814950 100755 --- a/cornea.desktop +++ b/cornea.desktop @@ -3,7 +3,7 @@ Name=Cornea GenericName=A python screenshot application. Comment=Take screenshots of your desktop. Exec=/screenshot -Icon=/resources/cornea.png +Icon=/usr/share/cornea/cornea.png Type=Application StartupNotify=true Categories=Utility; diff --git a/src/__builtins__.py b/src/__builtins__.py new file mode 100644 index 0000000..ada34ef --- /dev/null +++ b/src/__builtins__.py @@ -0,0 +1,20 @@ +import builtins + +# Python imports +import builtins + +# Lib imports + +# Application imports + + + +class Builtins: + """Docstring for __builtins__ extender""" + + def __init__(self): + pass + +# NOTE: Just reminding myself we can add to builtins two different ways... +# __builtins__.update({"event_system": Builtins()}) +builtins.app_name = "Cornea" diff --git a/src/__init__.py b/src/__init__.py index dc11651..f149b9e 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1,22 +1,17 @@ # Python imports import inspect - from setproctitle import setproctitle -# Gtk imports -import gi, faulthandler, signal -gi.require_version('Gtk', '3.0') +# Lib imports -from gi.repository import Gtk as gtk -from gi.repository import Gdk as gdk -from gi.repository import GLib # Application imports +from __builtins__ import Builtins from utils import Settings, CrossClassSignals from signal_classes import MainWindow, DrawingArea, MainMenuPopup -class Main: +class Main(Builtins): def __init__(self, args): settings = Settings() builder = settings.returnBuilder() diff --git a/src/__main__.py b/src/__main__.py index 621061a..f6a67d0 100755 --- a/src/__main__.py +++ b/src/__main__.py @@ -5,10 +5,10 @@ import argparse from setproctitle import setproctitle -# Gtk imports +# Lib imports import gi, faulthandler, signal gi.require_version('Gtk', '3.0') -from gi.repository import Gtk as gtk +from gi.repository import Gtk from gi.repository import GLib # Application imports @@ -18,7 +18,7 @@ from __init__ import Main if __name__ == "__main__": try: setproctitle('Cornea') - GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGINT, gtk.main_quit) + 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 @@ -27,6 +27,6 @@ if __name__ == "__main__": # Read arguments (If any...) args = parser.parse_args() main = Main(args) - gtk.main() + Gtk.main() except Exception as e: print( repr(e) ) diff --git a/src/signal_classes/DrawingArea.py b/src/signal_classes/DrawingArea.py index 3696ec4..14baf7e 100644 --- a/src/signal_classes/DrawingArea.py +++ b/src/signal_classes/DrawingArea.py @@ -1,18 +1,15 @@ -# 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 -from gi.repository import GLib as glib - - # Python imports import threading, html import pyscreenshot as capture +# Lib imports +import gi, cairo +gi.require_version('Gdk', '3.0') + +from gi.repository import Gdk +from gi.repository import GLib + # Application imports @@ -46,9 +43,9 @@ class DrawingArea: self.regionWindow.set_keep_above(True) self.DRAW_AREA = self.builder.get_object("selectionArea") - self.DRAW_AREA.add_events(gdk.EventMask.BUTTON_PRESS_MASK) - self.DRAW_AREA.add_events(gdk.EventMask.BUTTON_RELEASE_MASK) - self.DRAW_AREA.add_events(gdk.EventMask.BUTTON1_MOTION_MASK) + self.DRAW_AREA.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + self.DRAW_AREA.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK) + self.DRAW_AREA.add_events(Gdk.EventMask.BUTTON1_MOTION_MASK) self.DRAW_AREA.connect("button-press-event", self.on_button_press) self.DRAW_AREA.connect("button-release-event", self.on_button_release) self.DRAW_AREA.connect("motion-notify-event", self.on_mouse_move) @@ -77,7 +74,7 @@ class DrawingArea: def on_button_press(self, w, e): self.messageLabel.set_markup("") - if e.type == gdk.EventType.BUTTON_PRESS and e.button == MouseButtons.LEFT_BUTTON: + if e.type == Gdk.EventType.BUTTON_PRESS and e.button == MouseButtons.LEFT_BUTTON: self.coords[0] = [e.x, e.y] self.regionMenu.hide() @@ -85,7 +82,7 @@ class DrawingArea: if self.cr: self.draw(self.cr, self.WIN_REC, self.BG_COLOR) self.DRAW_AREA.queue_draw() - if e.type == gdk.EventType.BUTTON_PRESS and e.button == MouseButtons.RIGHT_BUTTON: + if e.type == Gdk.EventType.BUTTON_PRESS and e.button == MouseButtons.RIGHT_BUTTON: self.regionMenu.show() # Update second set of coords. @@ -95,24 +92,29 @@ class DrawingArea: @threaded def on_button_release(self, w, e): - if e.type == gdk.EventType.BUTTON_RELEASE and e.button == MouseButtons.LEFT_BUTTON: - glib.idle_add(self.regionMenu.show) - + if e.type == Gdk.EventType.BUTTON_RELEASE and e.button == MouseButtons.LEFT_BUTTON: + GLib.idle_add(self.regionMenu.show) @threaded def grabRegion(self, widget): - glib.idle_add(self.regionMenu.hide) - glib.idle_add(self.mainWindow.hide) - self.boundingBoxGrab(self.rec[0], self.rec[1], self.rec[2], self.rec[3]) - glib.idle_add(self.regionMenu.show) - glib.idle_add(self.mainWindow.show) - self.utilsClass.refereshDirectoryList() + GLib.idle_add(self.grabRegionIdle) @threaded def returnToMainWindow(self, widget): - glib.idle_add(self.regionWindow.hide) - glib.idle_add(self.regionMenu.hide) - glib.idle_add(self.mainWindow.show) + GLib.idle_add(self.returnToMainWindowIdle) + + def grabRegionIdle(self): + self.mainWindow.hide() + self.regionMenu.hide() + self.boundingBoxGrab(self.rec[0], self.rec[1], self.rec[2], self.rec[3]) + self.regionMenu.show() + self.mainWindow.show() + self.utilsClass.refereshDirectoryList() + + def returnToMainWindowIdle(self): + self.regionWindow.hide() + self.regionMenu.hide() + self.mainWindow.show() def on_draw(self, wid, cr): @@ -172,9 +174,9 @@ class DrawingArea: self.utilsClass.boundingBoxGrab(x1, y1, x2, y2) markup = "Grabbed region successfully..." - glib.idle_add(self.messageLabel.set_markup, markup) + GLib.idle_add(self.messageLabel.set_markup, markup) except Exception as e: print(e) markup = "Oops..." + \ "\n" + html.escape( str(e) ) + "" - glib.idle_add(self.messageLabel.set_markup, markup) + GLib.idle_add(self.messageLabel.set_markup, markup) diff --git a/src/signal_classes/MainMenuPopup.py b/src/signal_classes/MainMenuPopup.py index 7b857a1..7a912a0 100644 --- a/src/signal_classes/MainMenuPopup.py +++ b/src/signal_classes/MainMenuPopup.py @@ -1,8 +1,9 @@ -# Gtk imports - # Python imports import os, subprocess +# lib imports + + # Application imports diff --git a/src/signal_classes/MainWindow.py b/src/signal_classes/MainWindow.py index 010258e..63656e6 100644 --- a/src/signal_classes/MainWindow.py +++ b/src/signal_classes/MainWindow.py @@ -1,15 +1,14 @@ -# Gtk imports +# Python imports +import threading, subprocess, os +import pyscreenshot as capture + +# Lib 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 - -# Python imports -import threading, subprocess, os -import pyscreenshot as capture +from gi.repository import Gtk as Gtk +from gi.repository import Gdk as Gdk # Application imports @@ -78,9 +77,9 @@ class MainWindow: def getActiveWindow(self): self.utilsClass.sleep() - screen = gdk.get_default_root_window().get_screen() + screen = Gdk.get_default_root_window().get_screen() w = screen.get_active_window() - pb = gdk.pixbuf_get_from_window(w, *w.get_geometry()) + pb = Gdk.pixbuf_get_from_window(w, *w.get_geometry()) pb.savev(self.utilsClass.generateScreenshotName(), "png", (), ()) def snapshotMonitor(self): @@ -129,7 +128,7 @@ class MainWindow: try: if os.path.isfile(fullPath): fileNameEntry.set_text(file) - pixbuf = gtk.Image.new_from_file(fullPath).get_pixbuf() + pixbuf = Gtk.Image.new_from_file(fullPath).get_pixbuf() scaledPixBuf = pixbuf.scale_simple(480, 320, 2) # 2 = BILINEAR and is best by default imageView.set_from_pixbuf(scaledPixBuf) except Exception as e: @@ -146,8 +145,8 @@ class MainWindow: return active_radio def showMainMenu(self, w, e): - if e.type == gdk.EventType.BUTTON_PRESS and e.button == MouseButtons.RIGHT_BUTTON: + if e.type == Gdk.EventType.BUTTON_PRESS and e.button == MouseButtons.RIGHT_BUTTON: self.builder.get_object("mainMenu").popup() def close(self, widget): - gtk.main_quit() + Gtk.main_quit() diff --git a/src/utils/CrossClassSignals.py b/src/utils/CrossClassSignals.py index 7124714..e6dd1a5 100644 --- a/src/utils/CrossClassSignals.py +++ b/src/utils/CrossClassSignals.py @@ -1,11 +1,11 @@ -# Gtk imports -from gi.repository import GLib as glib - # Python imports import os, threading, time, datetime +# Lib imports +from gi.repository import GLib import pyscreenshot as capture + # Application imports @@ -18,10 +18,10 @@ def threaded(fn): class CrossClassSignals: def __init__(self, settings): - self.settings = settings - self.builder = self.settings.returnBuilder() + self.settings = settings + self.builder = self.settings.returnBuilder() self.SCREENSHOTS_DIR = self.settings.returnScreenshotsDir() - self.fileStore = self.builder.get_object("fileStore") + self.fileStore = self.builder.get_object("fileStore") self.refreshingState = False @@ -40,7 +40,7 @@ class CrossClassSignals: if len(images) != len(self.fileStore): self.fileStore.clear() for image in images: - glib.idle_add(self.addToStore, (image)) + GLib.idle_add(self.addToStore, (image)) # self.fileStore.sort() self.refreshingState = False diff --git a/src/utils/Settings.py b/src/utils/Settings.py index c20aefe..0780644 100644 --- a/src/utils/Settings.py +++ b/src/utils/Settings.py @@ -1,36 +1,52 @@ -# Gtk imports +# Python imports +import os + +# Lib 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 +from gi.repository import Gtk +from gi.repository import Gdk -# Python imports -import os # 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") + self._SCRIPT_PTH = os.path.dirname(os.path.realpath(__file__)) + self._USER_HOME = os.path.expanduser('~') + self._CONFIG_PATH = f"{self._USER_HOME}/.config/{app_name.lower()}" + self._GLADE_FILE = f"{self._CONFIG_PATH}/Main_Window.glade" + self._CSS_FILE = f"{self._CONFIG_PATH}/stylesheet.css" + self._DEFAULT_ICONS = f"{self._CONFIG_PATH}/icons" + self._WINDOW_ICON = f"{self._DEFAULT_ICONS}/{app_name.lower()}.png" + self._USR_PATH = f"/usr/share/{app_name.lower()}" + self.SCREENSHOTS_DIR = f"{self._USER_HOME}/.screenshots" + + if not os.path.exists(self._CONFIG_PATH): + os.mkdir(self._CONFIG_PATH) + if not os.path.exists(self._GLADE_FILE): + self._GLADE_FILE = f"{self._USR_PATH}/Main_Window.glade" + if not os.path.exists(self._CSS_FILE): + self._CSS_FILE = f"{self._USR_PATH}/stylesheet.css" + if not os.path.exists(self._WINDOW_ICON): + self._WINDOW_ICON = f"{self._USR_PATH}/icons/{app_name.lower()}.png" + if not os.path.isdir(self.SCREENSHOTS_DIR): + os.mkdir(self.SCREENSHOTS_DIR) # 'Filters' self.images = ('.png', '.jpg', '.jpeg', '.gif') - HOME_PATH = os.path.expanduser('~') - self.SCREENSHOTS_DIR = HOME_PATH + "/" + ".screenshots" - if not os.path.isdir(self.SCREENSHOTS_DIR): - os.mkdir(self.SCREENSHOTS_DIR) + self.builder = Gtk.Builder() + self.builder.add_from_file(self._GLADE_FILE) def createWindow(self): # Get window and connect signals window = self.builder.get_object("Main_Window") - window.connect("delete-event", gtk.main_quit) + window.connect("delete-event", Gtk.main_quit) self.setWindowData(window) return window @@ -42,17 +58,17 @@ class Settings: 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) + cssProvider = Gtk.CssProvider() + cssProvider.load_from_path(self._CSS_FILE) + screen = Gdk.Screen.get_default() + styleContext = Gtk.StyleContext() + styleContext.add_provider_for_screen(screen, cssProvider, Gtk.STYLE_PROVIDER_PRIORITY_USER) def getMonitorData(self): screen = self.builder.get_object("Main_Window").get_screen() wdth = screen.get_width() hght = screen.get_height() - mon0 = gdk.Rectangle() + mon0 = Gdk.Rectangle() mon0.width = wdth mon0.height = hght monitors = [] diff --git a/src/resources/Main_Window.glade b/user_config/usr/share/cornea/Main_Window.glade similarity index 68% rename from src/resources/Main_Window.glade rename to user_config/usr/share/cornea/Main_Window.glade index 742fdf0..c73008b 100644 --- a/src/resources/Main_Window.glade +++ b/user_config/usr/share/cornea/Main_Window.glade @@ -1,26 +1,23 @@ - + - False - True - True + False + True + True False False center - - - True - False + False vertical True - False + False True @@ -42,37 +39,34 @@ True - False + False gtk-copy - False + False popup - mouse - menu + mouse + menu False north-east - - - True - False + False True - False + False vertical True Grab Region True - True - True + True + True grabRegionImage - True + True @@ -85,10 +79,10 @@ gtk-close True - True - True - True - True + True + True + True + True @@ -107,7 +101,7 @@ True - False + False True @@ -126,58 +120,55 @@ True - False + False gtk-cancel True - False + False gtk-edit True - False + False gtk-undo 60 - 1 - 10 + 1 + 10 - False + False Cornea - center - 500 - 310 - pyCornea.png + center + 500 + 310 + cornea.png center - - - True - False + False True - False + False vertical True - False + False Entire screen True - True - False - Take a screenshot of the entire screen. - 5 + True + False + Take a screenshot of the entire screen. + 5 True - True + True @@ -190,13 +181,13 @@ Active window True - True - False - Take a screenshot of the active window. - 5 - 5 + True + False + Take a screenshot of the active window. + 5 + 5 True - True + True entireScrnToggle @@ -210,13 +201,13 @@ Select a region True - True - False - Select a region to be captured by clicking a point of the screen without releasing the mouse, dragging you mouse to the other corner of the region, and releasing the mouse button. - 5 - 5 + True + False + Select a region to be captured by clicking a point of the screen without releasing the mouse, dragging you mouse to the other corner of the region, and releasing the mouse button. + 5 + 5 True - True + True entireScrnToggle @@ -230,13 +221,13 @@ Select a monitor True - True - False - Take a screenshot of the selected monitor. - 5 - 5 + True + False + Take a screenshot of the selected monitor. + 5 + 5 True - True + True entireScrnToggle @@ -256,15 +247,43 @@ True - False - 5 - 5 + False + vertical - + True - False - Timeout - right + False + 5 + 5 + + + True + False + Timeout + right + + + False + True + 0 + + + + + True + True + Delay in seconds before the screenshot is taken. + number + timeoutAdjustment + True + True + + + True + True + 1 + + False @@ -273,17 +292,12 @@ - + True - True - Delay in seconds before the screenshot is taken. - number - timeoutAdjustment - True - True + False - True + False True 1 @@ -297,16 +311,16 @@ - 312 - 312 + 312 + 312 True - False - 0 - none + False + 0 + none True - False + False gtk-missing-image @@ -327,16 +341,16 @@ True - False + False vertical Take Snapshot True - True - True + True + True picImage - True + True @@ -349,9 +363,9 @@ True False - True + True monitorStore - False + False @@ -375,17 +389,17 @@ - 200 + 200 True - True - 15 - in + True + 15 + in True - True + True fileStore - False + False @@ -396,7 +410,7 @@ Images True - descending + descending @@ -418,10 +432,10 @@ gtk-close True - True - True - True - True + True + True + True + True @@ -441,25 +455,25 @@ - 320 - 150 - False - delayAmount + 320 + 150 + False + popup_bind_area True - False + False vertical True - False + False True - True - True + True + True True @@ -471,10 +485,10 @@ Revert True - True - True + True + True revertImage - True + True @@ -494,10 +508,10 @@ Rename True - True - True + True + True renameImage - True + True @@ -510,10 +524,10 @@ gtk-open True - True - True - True - True + True + True + True + True @@ -526,10 +540,10 @@ gtk-delete True - True - True - True - True + True + True + True + True diff --git a/src/resources/cornea.png b/user_config/usr/share/cornea/cornea.png similarity index 100% rename from src/resources/cornea.png rename to user_config/usr/share/cornea/cornea.png diff --git a/src/resources/stylesheet.css b/user_config/usr/share/cornea/stylesheet.css similarity index 100% rename from src/resources/stylesheet.css rename to user_config/usr/share/cornea/stylesheet.css