Changed to use wnck Tasklist
This commit is contained in:
parent
f391bf8bd2
commit
1baa9fcb37
@ -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.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…
Reference in New Issue
Block a user