Changed to use wnck Tasklist

master
Maxim 4 years ago committed by GitHub
parent f391bf8bd2
commit 1baa9fcb37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -12,226 +12,23 @@ from gi.repository import Gtk as gtk
from gi.repository import Gdk as gdk
from gi.repository import GLib
# 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.settings = settings
self.builder = self.settings.returnBuilder()
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:
self.createWinLink(w)
def setScreenSignals(self):
self.SCREEN.connect("active-workspace-changed", self.activeWorkspaceChanged)
self.SCREEN.connect("window-opened", self.windowOpened)
self.SCREEN.connect("window-closed", self.windowClosed)
def createWinLink(self, w):
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))
win.connect("name_changed", self.windowNameChanged, (btn))
win.connect("workspace_changed", self.windowWorkspaceChanged, (btn))
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 window.is_minimized():
window.activate(1)
else:
window.minimize()
if e.type == gdk.EventType.BUTTON_PRESS and e.button == MouseButtons.RIGHT_BUTTON:
self.window = window
self.setTaskbarMenuStates()
self.taskbarMenu.show()
def setTaskbarMenuStates(self):
alwaysOnTopToggle = self.builder.get_object("alwaysOnTopToggle")
alwaysBelowToggle = self.builder.get_object("alwaysBelowToggle")
alwaysOnVisableWorkspace = self.builder.get_object("alwaysOnVisableWorkspace")
if self.window.is_above(): # If above all windows
if not alwaysOnTopToggle.get_active():
alwaysOnTopToggle.set_active(True)
else:
if alwaysOnTopToggle.get_active():
alwaysOnTopToggle.set_active(False)
if self.window.is_below(): # If below all windows
if not alwaysBelowToggle.get_active():
alwaysBelowToggle.set_active(True)
else:
if alwaysBelowToggle.get_active():
alwaysBelowToggle.set_active(False)
if self.window.is_pinned(): # If visable on all workspaces
if not alwaysOnVisableWorkspace.get_active():
alwaysOnVisableWorkspace.set_active(True)
else:
if alwaysOnVisableWorkspace.get_active():
alwaysOnVisableWorkspace.set_active(False)
if not self.window.is_sticky(): # If visable on all workspaces??
pass
else:
pass
if not self.window.is_active(): # If window has focus
pass
else:
pass
def hideTaskbarMenu(self, widget, eve):
self.taskbarMenu.hide()
self.setTasklistWidget()
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 windowClosed(self, screen, window):
self.clearChildren(self.taskBarButtons)
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 windowNameChanged(self, win, btn):
btn.set_label(win.get_name())
def windowWorkspaceChanged(self, win, btn):
wnum = win.get_workspace().get_number()
if self.actv_workspace_num == wnum:
btn.show()
else:
btn.hide()
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, eve):
if not self.window.is_above():
self.window.make_above()
else:
self.window.unmake_above()
def setBelowState(self, widget, eve):
if not self.window.is_above():
self.window.make_below()
else:
self.window.unmake_below()
def setWorkspacePin(self, widget, eve):
if not self.window.is_pinned():
self.window.pin()
else:
self.window.unpin()
def closeAppWindow(self, widget, data=None):
self.window.close(1)
self.hideTaskbarMenu(None, None)
# 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()
def setTasklistWidget(self):
barBtns = wnck.Tasklist()
barBtns.set_button_relief(2) # 0 = normal relief, 2 = no relief
barBtns.set_grouping(1) # 0 = mever group, 1 auto group, 2 = always group
self.builder.get_object('taskBarButtons').add(barBtns)

Loading…
Cancel
Save