Add taskbar functions, called with Spacebar.

portnov [2008-08-14 07:05:00]
Add taskbar functions, called with Spacebar.
Filename
qwerty.py
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
ViewGit