Ported back to Qt3/KDE3
[switcha.git] / switcha.py
blobd95b73f59cf50c55537707ec7879f1b912dc8201
1 #!/usr/bin/env python
2 import os
3 import sys
5 from qt import *
6 from kdecore import *
7 from kdeui import *
9 import wmctrl
11 class ListViewSearchLine(KListViewSearchLine):
12 def updateSearch(self, text):
13 KListViewSearchLine.updateSearch(self, text)
15 view = self.listView()
16 item = view.selectedItem()
17 if item and item.isVisible():
18 return
20 iterator = QListViewItemIterator(view, QListViewItemIterator.Visible)
21 item = iterator.current()
22 if item:
23 view.setSelected(item, True)
26 class Window(QDialog):
27 def __init__(self):
28 QDialog.__init__(self)
29 self.setCaption("Switcha")
30 self.initModel()
31 self.initUi()
34 def initModel(self):
35 self._windowList = wmctrl.getWindowList()
38 def initUi(self):
39 frame = QFrame(self)
40 frame.setFrameStyle(QFrame.Box | QFrame.Plain)
41 layout = QVBoxLayout(self)
42 layout.setMargin(0)
43 layout.addWidget(frame)
45 # LineEdit
46 self._lineEdit = ListViewSearchLine(frame)
47 QObject.connect(self._lineEdit, SIGNAL("returnPressed()"),
48 self.slotReturnPressed)
50 self._lineEdit.installEventFilter(self)
52 # View
53 self._view = KListView(frame)
54 self._view.addColumn("")
55 self._view.header().hide()
56 for name, wid in self._windowList:
57 name = unicode(name, "utf8")
58 QListViewItem(self._view, name)
60 if len(self._windowList) > 0:
61 self._view.setSelected(self._view.firstChild(), True)
63 QObject.connect(self._view, SIGNAL("clicked(QListViewItem*)"),
64 self.switchToWindow)
66 self._lineEdit.setListView(self._view)
68 # Layout
69 layout = QVBoxLayout(frame)
70 layout.setMargin(6)
71 layout.addWidget(self._lineEdit)
72 layout.addWidget(self._view)
75 def slotCurrentChanged(self, item):
76 if not item:
77 self.selectFirstItem()
80 def eventFilter(self, obj, event):
81 if event.type() != QEvent.KeyPress:
82 return False
84 if event.key() in (Qt.Key_Up, Qt.Key_Down):
85 newEvent = QKeyEvent(event.type(), event.key(), event.ascii(), event.state(), event.text())
86 QApplication.postEvent(self._view, newEvent)
87 return True
89 return False
92 def switchToWindow(self, item):
93 itemName = unicode(item.text(0)).encode("utf8")
94 for name, wid in self._windowList:
95 if name == itemName:
96 wmctrl.switchToWindow(unicode(wid))
97 self.close()
98 return
101 def slotReturnPressed(self):
102 item = self._view.selectedItem()
103 if item and item.isVisible():
104 self.switchToWindow(item)
105 else:
106 cmd = unicode(self._lineEdit.text())
107 os.spawnlp(os.P_NOWAIT, 'sh', 'sh', '-c', cmd)
108 self.close()
111 def main():
112 # Keep app global otherwise there is a crash on exit
113 global app
114 description = "A fast window switcher and application launcher"
115 version = "1.0"
116 aboutData = KAboutData ("", "",\
117 version, description, KAboutData.License_GPL,\
118 "(C) 2007 Aurelien Gateau")
119 KCmdLineArgs.init (sys.argv, aboutData)
121 app = KApplication()
122 window = Window()
124 rect = QApplication.desktop().availableGeometry()
125 window.move( \
126 rect.left() + (rect.width() - window.sizeHint().width()) / 2, \
127 rect.top() + (rect.height() - window.sizeHint().height()) / 2 \
129 window.exec_loop()
132 if __name__ == "__main__":
133 main()