From 1f43632928d0c472b9bbbf9713ae860c8bf50ca2 Mon Sep 17 00:00:00 2001 From: Maxim Stewart Date: Sat, 28 Sep 2019 19:14:32 -0500 Subject: [PATCH] Added taskbar --- README.md | 3 + bin/pytop-0-0-1-x64.deb | Bin 22376 -> 23876 bytes src/Pytop/PyTop.py | 7 +- src/Pytop/resources/PyTop.glade | 186 ++++++++++++++++++++- src/Pytop/signal_classes/TaskbarSignals.py | 181 ++++++++++++++++++++ src/Pytop/signal_classes/__init__.py | 1 + src/Pytop/utils/FileHandler.py | 16 +- src/Pytop/widgets/Grid.py | 5 +- 8 files changed, 384 insertions(+), 15 deletions(-) create mode 100644 src/Pytop/signal_classes/TaskbarSignals.py diff --git a/README.md b/README.md index 18b7b9a..fd06add 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # Pytop Pytop is a Gtk + Python gui to have a custom desktop interface. +# Updates +Added task bar. + # Notes ```sudo apt-get install python3 wget steamcmd``` diff --git a/bin/pytop-0-0-1-x64.deb b/bin/pytop-0-0-1-x64.deb index 1fd06cfd1ce988caf315f2e0cb2a506410b937fc..491b1d9360b33732ba64ec9bb744fb42a2a49766 100644 GIT binary patch delta 21839 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 6 multiple - 6 + 72 @@ -79,6 +79,62 @@ 1 + + + True + False + + + 64 + True + True + never + in + + + True + False + + + True + False + start + + + + + + + + + + True + True + 0 + + + + + True + False + start + + + + + + False + True + 1 + + + + + False + True + 2 + + @@ -87,6 +143,134 @@ False gtk-new + + False + + + True + False + vertical + start + + + Minimize + True + True + True + + + + True + True + 0 + + + + + Maximize + True + True + True + + + + True + True + 1 + + + + + Move + True + True + True + + + + True + True + 2 + + + + + Resixze + True + True + True + + + + True + True + 3 + + + + + Always On Top + True + True + False + True + + + + True + True + 4 + + + + + Always Below + True + True + False + True + + + + True + True + 5 + + + + + Always On Visible Workspace + True + True + False + True + + + + True + True + 6 + + + + + gtk-close + True + True + True + True + True + + + + True + True + 7 + + + + + True False diff --git a/src/Pytop/signal_classes/TaskbarSignals.py b/src/Pytop/signal_classes/TaskbarSignals.py new file mode 100644 index 0000000..5f2d663 --- /dev/null +++ b/src/Pytop/signal_classes/TaskbarSignals.py @@ -0,0 +1,181 @@ +# Gtk imports +import gi +gi.require_version('Gtk', '3.0') +gi.require_version('Gdk', '3.0') +gi.require_version('Wnck', '3.0') + +from gi.repository import Wnck as wnck +from gi.repository import Gtk as gtk +from gi.repository import Gdk as gdk +from gi.repository import GLib + + +# Python imports +import threading + +# Application imports + + + +def threaded(fn): + def wrapper(*args, **kwargs): + threading.Thread(target=fn, args=args, kwargs=kwargs).start() + + return wrapper + +class MouseButtons: + LEFT_BUTTON = 1 + RIGHT_BUTTON = 3 + + +class TaskbarSignals: + def __init__(self, settings): + self.settings = settings + self.builder = self.settings.returnBuilder() + self.taskBarButtons = self.builder.get_object('taskBarButtons') + self.taskbarMenu = self.builder.get_object('taskbarMenu') + + self.SCREEN = wnck.Screen.get_default() + self.actv_workspace_num = None + self.window = None + + self.SCREEN.force_update() # (Re)populate screen windows list + self.refreashTaskbar() + self.setScreenSignals() + self.setPagerWidget() + + + def refreashTaskbar(self): + workspace = self.SCREEN.get_active_workspace() + self.actv_workspace_num = workspace.get_number() + + windows = self.SCREEN.get_windows() + for w in windows: + if workspace and w.get_workspace(): + wnum = w.get_workspace().get_number() + if not w.is_skip_pager() and not w.is_skip_tasklist() and wnum == self.actv_workspace_num: + btn = self.createWinBttn(w) + self.setupSignals(btn, w) + self.taskBarButtons.add(btn) + + def setupSignals(self, btn, win): + btn.connect("button-press-event", self.clickEvent, (win)) + + def setScreenSignals(self): + self.SCREEN.connect("active-workspace-changed", self.activeWorkspaceChanged) + # self.SCREEN.connect("application-opened", self.applicationOpened) + # self.SCREEN.connect("application-closed", self.applicationClosed) + self.SCREEN.connect("window-opened", self.windowOpened) + self.SCREEN.connect("window-closed", self.windowClosed) + + def createWinBttn(self, w): + btn = gtk.Button(label=w.get_name(), always_show_image=True) + img = gtk.Image() + img.set_from_pixbuf( w.get_icon() ) # w.get_mini_icon() or w.get_icon() + btn.set_image(img) + btn.show() + return btn + + def clickEvent(self, widget, e, window): + if e.type == gdk.EventType.BUTTON_PRESS and e.button == MouseButtons.LEFT_BUTTON: + if not window.is_minimized(): + window.minimize() + else: + window.activate(1) + if e.type == gdk.EventType.BUTTON_PRESS and e.button == MouseButtons.RIGHT_BUTTON: + self.window = window + self.taskbarMenu.set_relative_to(widget) + self.taskbarMenu.popup() + + def setPagerWidget(self): + pager = wnck.Pager() + self.builder.get_object('taskBarWorkspaces').add(pager) + + # ---- Screen Events ---- + # NOTE: This is the worst way of doing this and kids die when these are run. + # We need to filter actions and more like add/remove buttons than just + # clearing everything. I'm sorry to all the families hurt by this.... + def activeWorkspaceChanged(self, screen, workspace): + self.clearChildren(self.taskBarButtons) + self.SCREEN = screen + self.SCREEN.force_update() # (Re)populate screen windows list + self.refreashTaskbar() + def windowOpened(self, screen, window): + self.SCREEN.force_update() # (Re)populate screen windows list + btn = self.createWinBttn(window) + self.setupSignals(btn, window) + self.taskBarButtons.add(btn) + def windowClosed(self, screen, window): + self.clearChildren(self.taskBarButtons) + self.SCREEN.force_update() # (Re)populate screen windows list + self.refreashTaskbar() + + def clearChildren(self, parent): + children = parent.get_children(); + for child in parent: + child.destroy() + + # ---- Taskbar Button Events ---- + def toggleMinimize(self, widget, data=None): + if not self.window.is_minimized(): + self.window.minimize() + widget.set_label("Unminimize") + else: + self.window.activate(1) + widget.set_label("Minimize") + + def toggleMaximize(self, widget, data=None): + if not self.window.is_maximized(): + self.window.maximize() + widget.set_label("Unmaximize") + else: + self.window.unmaximize() + widget.set_label("Maximize") + + def startMoveWindow(self, widget, data=None): + self.window.keyboard_move() + + def startResizeWindow(self, widget, data=None): + self.window.keyboard_size() + + def setTopState(self, widget): + if not self.window.is_above(): + self.window.make_above() + else: + self.window.unmake_above() + + def setBelowState(self, widget): + if not self.window.is_above(): + self.window.make_below() + else: + self.window.unmake_below() + + def setWorkspacePin(self, widget): + if not self.window.is_pinned(): + self.window.pin() + else: + self.window.unpin() + + def closeAppWindow(self, widget, data=None): + self.window.close(1) + + + # WINDOW_SIGNALS + # print(w.get_icon()) + # w.get_name() + # w.get_icon() + # w.get_mini_icon() + # w.make_above() + # w. pin() + # w. get_state() # https://lazka.github.io/pgi-docs/Wnck-3.0/flags.html#Wnck.WindowState + # w.get_workspace() + # w.set_workspace(workspace) + # w.close() + # w.is_above() + # w.is_active() + # w.is_below() + # w.is_fullscreen() + # w.is_maximized() + # w.is_minimized() + # w.is_pinned() + # w.is_sticky() diff --git a/src/Pytop/signal_classes/__init__.py b/src/Pytop/signal_classes/__init__.py index 4bd914e..6bfa30d 100644 --- a/src/Pytop/signal_classes/__init__.py +++ b/src/Pytop/signal_classes/__init__.py @@ -1,2 +1,3 @@ from signal_classes.CrossClassSignals import CrossClassSignals from signal_classes.GridSignals import GridSignals +from signal_classes.TaskbarSignals import TaskbarSignals diff --git a/src/Pytop/utils/FileHandler.py b/src/Pytop/utils/FileHandler.py index c017ea2..2376792 100644 --- a/src/Pytop/utils/FileHandler.py +++ b/src/Pytop/utils/FileHandler.py @@ -35,24 +35,22 @@ class FileHandler: self.TRASHINFOFOLDER = settings.returnTrshInfoPth() - - @threaded def openFile(self, file): print("Opening: " + file) if file.lower().endswith(self.vids): - subprocess.Popen([self.MEDIAPLAYER, self.MPV_WH, file]) + subprocess.Popen([self.MEDIAPLAYER, self.MPV_WH, file], stdout=subprocess.PIPE) elif file.lower().endswith(self.music): - subprocess.Popen([self.MUSICPLAYER, file]) + subprocess.Popen([self.MUSICPLAYER, file], stdout=subprocess.PIPE) elif file.lower().endswith(self.images): - subprocess.Popen([self.IMGVIEWER, file]) + subprocess.Popen([self.IMGVIEWER, file], stdout=subprocess.PIPE) elif file.lower().endswith(self.txt): - subprocess.Popen([self.TEXTVIEWER, file]) + subprocess.Popen([self.TEXTVIEWER, file], stdout=subprocess.PIPE) elif file.lower().endswith(self.pdf): - subprocess.Popen([self.PDFVIEWER, file]) + subprocess.Popen([self.PDFVIEWER, file], stdout=subprocess.PIPE) elif file.lower().endswith(self.office): - subprocess.Popen([self.OFFICEPROG, file]) + subprocess.Popen([self.OFFICEPROG, file], stdout=subprocess.PIPE) else: - subprocess.Popen(['xdg-open', file]) + subprocess.Popen(['xdg-open', file], stdout=subprocess.PIPE) def create(self, name, type): diff --git a/src/Pytop/widgets/Grid.py b/src/Pytop/widgets/Grid.py index 16c3ef7..096e2de 100644 --- a/src/Pytop/widgets/Grid.py +++ b/src/Pytop/widgets/Grid.py @@ -50,7 +50,7 @@ class Grid: self.grid.connect("item-activated", self.iconDblLeftClick) self.grid.connect("button_release_event", self.iconSingleClick, (self.grid,)) - + # @threaded def setNewDirectory(self, path): self.currentPath = path dirPaths = ['.', '..'] @@ -112,7 +112,8 @@ class Grid: for dataSet in self.toWorkPool: self.store.append([dataSet[0].get_pixbuf(), dataSet[1]]) - self.toWorkPool.clear() + self.toWorkPool.clear() + if len(self.store) == len(files): # Processed all files return False else: # Check again when idle