aboutsummaryrefslogtreecommitdiff
path: root/src/FocusableList.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/FocusableList.cc')
-rw-r--r--src/FocusableList.cc71
1 files changed, 20 insertions, 51 deletions
diff --git a/src/FocusableList.cc b/src/FocusableList.cc
index 0368442..77ff247 100644
--- a/src/FocusableList.cc
+++ b/src/FocusableList.cc
@@ -107,17 +107,6 @@ void FocusableList::init() {
107 } 107 }
108} 108}
109 109
110void FocusableList::update(FbTk::Subject *subj) {
111 if (subj == 0 || m_screen.isShuttingdown())
112 return;
113
114 if (typeid(*subj) == typeid(FluxboxWindow::WinSubject)) {
115 FluxboxWindow::WinSubject *fsubj =
116 static_cast<FluxboxWindow::WinSubject *>(subj);
117 windowUpdated(fsubj->win());
118 }
119}
120
121void FocusableList::windowUpdated(FluxboxWindow &fbwin) { 110void FocusableList::windowUpdated(FluxboxWindow &fbwin) {
122 if (m_screen.isShuttingdown()) 111 if (m_screen.isShuttingdown())
123 return; 112 return;
@@ -243,7 +232,7 @@ void FocusableList::remove(Focusable &win) {
243 // if the window isn't already in this list, we could send a bad signal 232 // if the window isn't already in this list, we could send a bad signal
244 bool contained = contains(win); 233 bool contained = contains(win);
245 234
246 detachSignals(win); 235 m_signal_map.erase(&win);
247 if (!contained) { 236 if (!contained) {
248 return; 237 return;
249 } 238 }
@@ -257,50 +246,30 @@ void FocusableList::updateTitle(Focusable& win) {
257#include "Debug.hh" 246#include "Debug.hh"
258 247
259void FocusableList::attachSignals(Focusable &win) { 248void FocusableList::attachSignals(Focusable &win) {
260 if (m_parent) { 249 if (m_parent == NULL)
261 FluxboxWindow *fbwin = win.fbwindow(); 250 return;
262
263 // attach various signals for matching
264 FbTk::RefCount<FbTk::SignalTracker> &tracker = m_signal_map[&win];
265 if (! tracker) {
266 // we have not attached to this window yet
267 tracker = new SignalTracker;
268 tracker->join(win.titleSig(), MemFunSelectArg1(*this, &FocusableList::updateTitle));
269 tracker->join(win.dieSig(), MemFun(*this, &FocusableList::remove));
270 if(fbwin) {
271 tracker->join(fbwin->workspaceSig(),
272 MemFun(*this, &FocusableList::windowUpdated)
273 );
274 tracker->join(fbwin->stateSig(),
275 MemFun(*this, &FocusableList::windowUpdated)
276 );
277 }
278 }
279
280 if (!fbwin)
281 return;
282 fbwin->layerSig().attach(this);
283 // TODO: can't watch (head=...) yet
284 }
285}
286 251
287void FocusableList::detachSignals(Focusable &win) { 252 FluxboxWindow *fbwin = win.fbwindow();
288 m_signal_map.erase(&win); 253
289 if (m_parent) { 254 // attach various signals for matching
290 // detach various signals for matching 255 FbTk::RefCount<FbTk::SignalTracker> &tracker = m_signal_map[&win];
291 FluxboxWindow *fbwin = win.fbwindow(); 256 if (! tracker) {
292 if (!fbwin) 257 // we have not attached to this window yet
293 return; 258 tracker = new SignalTracker;
294 fbwin->layerSig().detach(this); 259 tracker->join(win.titleSig(), MemFunSelectArg1(*this, &FocusableList::updateTitle));
295 // TODO: can't watch (head=...) yet 260 tracker->join(win.dieSig(), MemFun(*this, &FocusableList::remove));
261 if(fbwin) {
262 tracker->join(fbwin->workspaceSig(), MemFun(*this, &FocusableList::windowUpdated));
263 tracker->join(fbwin->stateSig(), MemFun(*this, &FocusableList::windowUpdated));
264 tracker->join(fbwin->layerSig(), MemFun(*this, &FocusableList::windowUpdated));
265 // TODO: can't watch (head=...) yet
266 }
296 } 267 }
297} 268}
298 269
299void FocusableList::reset() { 270void FocusableList::reset() {
300 while (!m_list.empty()) { 271 m_signal_map.clear();
301 detachSignals(*m_list.back()); 272 m_list.clear();
302 m_list.pop_back();
303 }
304 m_pat->resetMatches(); 273 m_pat->resetMatches();
305 if (m_parent) 274 if (m_parent)
306 addMatching(); 275 addMatching();