No more frame
[switcha.git] / switcha.py
blobed3de45510574414e22bf8b7f5912a3070514d8d
1 #!/usr/bin/env python
2 import os
3 import sys
5 from qt import *
6 from kdecore import *
7 from kdeui import *
10 class ListViewSearchLine(KListViewSearchLine):
11 def updateSearch(self, text):
12 KListViewSearchLine.updateSearch(self, text)
14 view = self.listView()
15 item = view.selectedItem()
16 if item and item.isVisible():
17 return
19 iterator = QListViewItemIterator(view, QListViewItemIterator.Visible)
20 item = iterator.current()
21 if item:
22 view.setSelected(item, True)
25 class Window(QDialog):
26 def __init__(self):
27 QDialog.__init__(self)
28 self.setCaption("Switcha")
29 self.initModel()
30 self.initUi()
33 def initModel(self):
34 kwinModule = KWinModule()
35 self._windowList = []
36 for wid in kwinModule.windows():
37 info = KWin.windowInfo(wid)
38 windowType = info.windowType(NET.AllTypesMask)
39 if windowType not in (NET.Desktop, NET.Dock, NET.Menu):
40 self._windowList.append(info)
43 def initUi(self):
44 # LineEdit
45 self._lineEdit = ListViewSearchLine(self)
46 QObject.connect(self._lineEdit, SIGNAL("returnPressed()"),
47 self.slotReturnPressed)
49 self._lineEdit.installEventFilter(self)
51 # View
52 self._view = KListView(self)
53 self._view.addColumn("")
54 self._view.header().hide()
55 for info in self._windowList:
56 item = QListViewItem(self._view, info.visibleName())
57 pix = KWin.icon(info.win(), 16, 16, True)
58 item.setPixmap(0, pix)
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(self)
70 layout.setMargin(6)
71 layout.setSpacing(6)
72 layout.addWidget(self._lineEdit)
73 layout.addWidget(self._view)
76 def slotCurrentChanged(self, item):
77 if not item:
78 self.selectFirstItem()
81 def eventFilter(self, obj, event):
82 if event.type() != QEvent.KeyPress:
83 return False
85 if event.key() in (Qt.Key_Up, Qt.Key_Down):
86 newEvent = QKeyEvent(event.type(), event.key(), event.ascii(), event.state(), event.text())
87 QApplication.postEvent(self._view, newEvent)
88 return True
90 return False
93 def switchToWindow(self, item):
94 itemName = item.text(0)
95 for info in self._windowList:
96 if info.visibleName() == itemName:
97 KWin.forceActiveWindow(info.win())
98 self.close()
99 return
102 def slotReturnPressed(self):
103 item = self._view.selectedItem()
104 if item and item.isVisible():
105 self.switchToWindow(item)
106 else:
107 cmd = unicode(self._lineEdit.text())
108 os.spawnlp(os.P_NOWAIT, 'sh', 'sh', '-c', cmd)
109 self.close()
112 def main():
113 # Keep app global otherwise there is a crash on exit
114 global app
115 description = "A fast window switcher and application launcher"
116 version = "1.0"
117 aboutData = KAboutData ("", "",\
118 version, description, KAboutData.License_GPL,\
119 "(C) 2007 Aurelien Gateau")
120 KCmdLineArgs.init (sys.argv, aboutData)
122 app = KApplication()
123 window = Window()
125 rect = QApplication.desktop().availableGeometry()
126 window.move( \
127 rect.left() + (rect.width() - window.sizeHint().width()) / 2, \
128 rect.top() + (rect.height() - window.sizeHint().height()) / 2 \
130 window.exec_loop()
133 if __name__ == "__main__":
134 main()