Add taskbar functions, called with Spacebar.
Add taskbar functions, called with Spacebar.
diff --git a/qwerty.py b/qwerty.py
index 5a76f13..2b29a02 100755
--- a/qwerty.py
+++ b/qwerty.py
@@ -4,7 +4,7 @@ import sys
import os
import re
-from Xlib import X,display
+from Xlib import X,display,Xatom
import Xlib.protocol.event
import gtk
from gtk import gdk
@@ -277,6 +277,8 @@ class GUI(object):
self.rows[2].append(self.buttons[c])
self.taskbar = gtk.VBox()
+ self.taskbar_shown = False
+
self.keyboard = gtk.VBox()
box = gtk.HBox()
box.show()
@@ -304,9 +306,14 @@ class GUI(object):
btn.set_label(S.title)
btn.set_icon(S.icon)
+ self.main = gtk.VBox()
+ self.main.pack_start(self.taskbar, True)
+ self.main.pack_start(self.keyboard, True)
+ self.main.show()
+
self.window = gtk.Window()
self.window.set_title('Qwerty-Launcher')
- self.window.add(self.keyboard)
+ self.window.add(self.main)
self.window.connect('destroy', self.exit)
self.window.connect('key-release-event', self.on_key)
@@ -316,23 +323,80 @@ class GUI(object):
self.collect_windows()
+ def convert_class(self,clss):
+ if isinstance(clss, tuple):
+ return clss
+ else:
+ return [clss]
+
def collect_windows(self):
self.display = display.Display()
self.root = self.display.screen().root
- self.clients_list = self.root.query_tree()._data['children']
self.NET_ACTIVE_WINDOW = self.display.intern_atom('_NET_ACTIVE_WINDOW')
+ self._NAME = self.display.intern_atom("_NET_WM_NAME")
+ self._SKIP_TASKBAR = self.display.intern_atom("_NET_WM_STATE_SKIP_TASKBAR")
+
+ self._STATE = self.display.intern_atom("_NET_WM_STATE")
+ self._CLIENT_LIST = self.display.intern_atom("_NET_CLIENT_LIST")
+
+# self.clients_list = self.root.query_tree()._data['children']
+ lst = self.root.get_full_property(self._CLIENT_LIST, Xatom.WINDOW).value
+ self.clients_list = [self.display.create_resource_object('window', id) for id in lst]
for w in self.clients_list:
clss = w.get_wm_class()
- if isinstance(clss,tuple):
- for cls in clss:
- self.by_class[cls] = w
- elif clss:
- self.by_class[clss] = w
+ for cls in self.convert_class(clss):
+ self.by_class[cls] = w
# self.by_xid = dict([(w.id,w) for w in self.clients_list])
+ def fill_taskbar(self):
+ def rm(widget):
+ self.taskbar.remove(widget)
+
+ def get_name(task):
+ try:
+ name = task.get_full_property(self._NAME, 0) or task.get_full_property(Xatom.WM_NAME, 0)
+ return name.value
+ except:
+ return ""
+
+
+ self.taskbar.foreach(rm)
+
+ for w in self.clients_list:
+ try:
+ if self._SKIP_TASKBAR in w.get_full_property(self._STATE, Xatom.ATOM).value:
+ continue
+ except:
+ pass
+ name = get_name(w)
+ if not name:
+ continue
+ btn = gtk.Button(name)
+ btn.wm_class = w.get_wm_class()
+ btn.connect('clicked', self.on_taskbar_click)
+# btn = SuperButton(key=name[0], label=name)
+ btn.show()
+ btn.queue_draw()
+ self.taskbar.pack_start(btn)
+
+ def on_taskbar_click(self,widget):
+ cls = widget.wm_class
+ self.activate_window(self.convert_class(cls)[0])
+ self.exit()
+
+ def switch_taskbar(self):
+ self.taskbar_shown = not self.taskbar_shown
+ if self.taskbar_shown:
+ self.keyboard.hide()
+ self.fill_taskbar()
+ self.taskbar.show_all()
+ else:
+ self.taskbar.hide()
+ self.keyboard.show_all()
+
def exit(self,widget=None):
save_config()
gtk.main_quit()
@@ -348,7 +412,7 @@ class GUI(object):
elif k in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
self.do_button(k)
elif k == ' ':
- self.keyboard.hide()
+ self.switch_taskbar()
def key_exec(self,key):
cmd = self.S.keys[key].command