aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPavel Labath <pavelo@centrum.sk>2011-05-04 16:26:15 (GMT)
committerPavel Labath <pavelo@centrum.sk>2011-05-10 11:00:45 (GMT)
commitae68b7f7cd47c91e776fadee7aecb93d5b3ee3df (patch)
treeeb364477359197a8c4c84a0ae7c5cbc674076c21 /src
parent19ac8e40d85235328e0e2c7c428a2d3e1e86872c (diff)
downloadfluxbox-ae68b7f7cd47c91e776fadee7aecb93d5b3ee3df.zip
fluxbox-ae68b7f7cd47c91e776fadee7aecb93d5b3ee3df.tar.bz2
Convert Focusable::orderSig,addSig,removeSig,resetSig to FbTk::Signal
Diffstat (limited to 'src')
-rw-r--r--src/FocusableList.cc63
-rw-r--r--src/FocusableList.hh33
-rw-r--r--src/IconbarTool.cc47
-rw-r--r--src/IconbarTool.hh8
4 files changed, 72 insertions, 79 deletions
diff --git a/src/FocusableList.cc b/src/FocusableList.cc
index a130ec0..73d865e 100644
--- a/src/FocusableList.cc
+++ b/src/FocusableList.cc
@@ -125,40 +125,41 @@ void FocusableList::update(FbTk::Subject *subj) {
125 checkUpdate(**it); 125 checkUpdate(**it);
126 } 126 }
127 } 127 }
128 if (typeid(*subj) == typeid(FocusableListSubject)) { 128}
129 FocusableListSubject *fsubj = 129
130 static_cast<FocusableListSubject *>(subj); 130void FocusableList::parentOrderChanged(Focusable *win) {
131 if (subj == &m_parent->addSig()) { 131 if(!m_screen.isShuttingdown() && contains(*win)) {
132 attachSignals(*fsubj->win()); 132 if(insertFromParent(*win))
133 if (m_pat->match(*fsubj->win())) { 133 m_ordersig.emit(win);
134 insertFromParent(*fsubj->win()); 134 }
135 m_addsig.notify(fsubj->win()); 135}
136 } 136
137 } else if (subj == &m_parent->removeSig()) 137void FocusableList::parentWindowAdded(Focusable *win) {
138 remove(*fsubj->win()); 138 if(!m_screen.isShuttingdown()) {
139 else if (subj == &m_parent->resetSig()) 139 attachSignals(*win);
140 reset(); 140 if (m_pat->match(*win)) {
141 else if (subj == &m_parent->orderSig()) { 141 insertFromParent(*win);
142 Focusable *win = fsubj->win(); 142 m_addsig.emit(win);
143 if (!win || !contains(*win))
144 return;
145 if (insertFromParent(*win))
146 m_ordersig.notify(win);
147 } 143 }
148 } 144 }
149} 145}
150 146
147void FocusableList::parentWindowRemoved(Focusable *win) {
148 if(!m_screen.isShuttingdown())
149 remove(*win);
150}
151
151void FocusableList::checkUpdate(Focusable &win) { 152void FocusableList::checkUpdate(Focusable &win) {
152 if (contains(win)) { 153 if (contains(win)) {
153 if (!m_pat->match(win)) { 154 if (!m_pat->match(win)) {
154 m_list.remove(&win); 155 m_list.remove(&win);
155 m_pat->removeMatch(); 156 m_pat->removeMatch();
156 m_removesig.notify(&win); 157 m_removesig.emit(&win);
157 } 158 }
158 } else if (m_pat->match(win)) { 159 } else if (m_pat->match(win)) {
159 insertFromParent(win); 160 insertFromParent(win);
160 m_pat->addMatch(); 161 m_pat->addMatch();
161 m_addsig.notify(&win); 162 m_addsig.emit(&win);
162 } 163 }
163} 164}
164 165
@@ -203,13 +204,13 @@ void FocusableList::addMatching() {
203void FocusableList::pushFront(Focusable &win) { 204void FocusableList::pushFront(Focusable &win) {
204 m_list.push_front(&win); 205 m_list.push_front(&win);
205 attachSignals(win); 206 attachSignals(win);
206 m_addsig.notify(&win); 207 m_addsig.emit(&win);
207} 208}
208 209
209void FocusableList::pushBack(Focusable &win) { 210void FocusableList::pushBack(Focusable &win) {
210 m_list.push_back(&win); 211 m_list.push_back(&win);
211 attachSignals(win); 212 attachSignals(win);
212 m_addsig.notify(&win); 213 m_addsig.emit(&win);
213} 214}
214 215
215void FocusableList::moveToFront(Focusable &win) { 216void FocusableList::moveToFront(Focusable &win) {
@@ -219,7 +220,7 @@ void FocusableList::moveToFront(Focusable &win) {
219 220
220 m_list.remove(&win); 221 m_list.remove(&win);
221 m_list.push_front(&win); 222 m_list.push_front(&win);
222 m_ordersig.notify(&win); 223 m_ordersig.emit(&win);
223} 224}
224 225
225void FocusableList::moveToBack(Focusable &win) { 226void FocusableList::moveToBack(Focusable &win) {
@@ -229,7 +230,7 @@ void FocusableList::moveToBack(Focusable &win) {
229 230
230 m_list.remove(&win); 231 m_list.remove(&win);
231 m_list.push_back(&win); 232 m_list.push_back(&win);
232 m_ordersig.notify(&win); 233 m_ordersig.emit(&win);
233} 234}
234 235
235void FocusableList::remove(Focusable &win) { 236void FocusableList::remove(Focusable &win) {
@@ -241,7 +242,7 @@ void FocusableList::remove(Focusable &win) {
241 return; 242 return;
242 } 243 }
243 m_list.remove(&win); 244 m_list.remove(&win);
244 m_removesig.notify(&win); 245 m_removesig.emit(&win);
245} 246}
246 247
247void FocusableList::updateTitle(Focusable& win) { 248void FocusableList::updateTitle(Focusable& win) {
@@ -292,7 +293,7 @@ void FocusableList::reset() {
292 m_pat->resetMatches(); 293 m_pat->resetMatches();
293 if (m_parent) 294 if (m_parent)
294 addMatching(); 295 addMatching();
295 m_resetsig.notify(0); 296 m_resetsig.emit();
296} 297}
297 298
298bool FocusableList::contains(const Focusable &win) const { 299bool FocusableList::contains(const Focusable &win) const {
@@ -311,10 +312,10 @@ Focusable *FocusableList::find(const ClientPattern &pat) const {
311} 312}
312 313
313void FocusableList::attachChild(FocusableList &child) const { 314void FocusableList::attachChild(FocusableList &child) const {
314 m_addsig.attach(&child); 315 m_addsig.connect(FbTk::MemFun(child, &FocusableList::parentWindowAdded));
315 m_removesig.attach(&child); 316 m_ordersig.connect(FbTk::MemFun(child, &FocusableList::parentOrderChanged));
316 m_resetsig.attach(&child); 317 m_removesig.connect(FbTk::MemFun(child, &FocusableList::parentWindowRemoved));
317 m_ordersig.attach(&child); 318 m_resetsig.connect(FbTk::MemFun(child, &FocusableList::reset));
318} 319}
319 320
320void FocusableList::workspaceChanged(BScreen &screen) { 321void FocusableList::workspaceChanged(BScreen &screen) {
diff --git a/src/FocusableList.hh b/src/FocusableList.hh
index 6e46db9..29d536f 100644
--- a/src/FocusableList.hh
+++ b/src/FocusableList.hh
@@ -82,30 +82,12 @@ public:
82 @name signals 82 @name signals
83 @{ 83 @{
84 */ 84 */
85 FbTk::Subject &orderSig() { return m_ordersig; } 85 FbTk::Signal<Focusable *> &orderSig() { return m_ordersig; }
86 const FbTk::Subject &orderSig() const { return m_ordersig; } 86 FbTk::Signal<Focusable *> &addSig() { return m_addsig; }
87 FbTk::Subject &addSig() { return m_addsig; } 87 FbTk::Signal<Focusable *> &removeSig() { return m_removesig; }
88 const FbTk::Subject &addSig() const { return m_addsig; } 88 FbTk::Signal<> &resetSig() { return m_resetsig; }
89 FbTk::Subject &removeSig() { return m_removesig; }
90 const FbTk::Subject &removeSig() const { return m_removesig; }
91 FbTk::Subject &resetSig() { return m_resetsig; }
92 const FbTk::Subject &resetSig() const { return m_resetsig; }
93 /** @} */ // end group signals 89 /** @} */ // end group signals
94 90
95 /**
96 * Signaling object to attatch observers to.
97 */
98 class FocusableListSubject: public FbTk::Subject {
99 public:
100 explicit FocusableListSubject(): m_win(0) { }
101 void notify(Focusable *win) { m_win = win; FbTk::Subject::notify(); }
102 /// @return context for this signal
103 Focusable *win() { return m_win; }
104
105 private:
106 Focusable *m_win;
107 };
108
109private: 91private:
110 void init(); 92 void init();
111 void addMatching(); 93 void addMatching();
@@ -120,13 +102,18 @@ private:
120 /// Title has changed for a window 102 /// Title has changed for a window
121 /// @param win The window that title changed for. 103 /// @param win The window that title changed for.
122 void updateTitle(Focusable& win); 104 void updateTitle(Focusable& win);
105 void parentOrderChanged(Focusable* win);
106 void parentWindowAdded(Focusable* win);
107 void parentWindowRemoved(Focusable* win);
108
123 109
124 std::auto_ptr<ClientPattern> m_pat; 110 std::auto_ptr<ClientPattern> m_pat;
125 const FocusableList *m_parent; 111 const FocusableList *m_parent;
126 BScreen &m_screen; 112 BScreen &m_screen;
127 std::list<Focusable *> m_list; 113 std::list<Focusable *> m_list;
128 114
129 mutable FocusableListSubject m_ordersig, m_addsig, m_removesig, m_resetsig; 115 mutable FbTk::Signal<Focusable *> m_ordersig, m_addsig, m_removesig;
116 mutable FbTk::Signal<> m_resetsig;
130 typedef std::map<Focusable*, FbTk::RefCount<FbTk::SignalTracker> > SignalMap; 117 typedef std::map<Focusable*, FbTk::RefCount<FbTk::SignalTracker> > SignalMap;
131 SignalMap m_signal_map; 118 SignalMap m_signal_map;
132}; 119};
diff --git a/src/IconbarTool.cc b/src/IconbarTool.cc
index 42817c5..45e3a45 100644
--- a/src/IconbarTool.cc
+++ b/src/IconbarTool.cc
@@ -331,7 +331,7 @@ void IconbarTool::hide() {
331 331
332void IconbarTool::setAlignment(FbTk::Container::Alignment align) { 332void IconbarTool::setAlignment(FbTk::Container::Alignment align) {
333 *m_rc_alignment = align; 333 *m_rc_alignment = align;
334 update(0); 334 update(ALIGN, NULL);
335 m_menu.reconfigure(); 335 m_menu.reconfigure();
336} 336}
337 337
@@ -344,22 +344,24 @@ void IconbarTool::setMode(string mode) {
344 // lock graphics update 344 // lock graphics update
345 m_icon_container.setUpdateLock(true); 345 m_icon_container.setUpdateLock(true);
346 346
347 if (m_winlist.get()) {
348 m_winlist->addSig().detach(this);
349 m_winlist->removeSig().detach(this);
350 m_winlist->orderSig().detach(this);
351 m_winlist->resetSig().detach(this);
352 }
353 if (mode == "none") 347 if (mode == "none")
354 m_winlist.reset(new FocusableList(m_screen)); 348 m_winlist.reset(new FocusableList(m_screen));
355 else 349 else
356 m_winlist.reset(new FocusableList(m_screen, 350 m_winlist.reset(new FocusableList(m_screen,
357 mode + " (iconhidden=no)")); 351 mode + " (iconhidden=no)"));
358 if (m_winlist.get()) { 352 if (m_winlist.get()) {
359 m_winlist->addSig().attach(this); 353 m_winlist->addSig().connect(
360 m_winlist->removeSig().attach(this); 354 std::bind1st(FbTk::MemFun(*this, &IconbarTool::update), LIST_ADD)
361 m_winlist->orderSig().attach(this); 355 );
362 m_winlist->resetSig().attach(this); 356 m_winlist->removeSig().connect(
357 std::bind1st(FbTk::MemFun(*this, &IconbarTool::update), LIST_REMOVE)
358 );
359 m_winlist->addSig().connect(
360 std::bind1st(FbTk::MemFun(*this, &IconbarTool::update), LIST_ORDER)
361 );
362 m_winlist->resetSig().connect(FbTk::MemFunBind(
363 *this, &IconbarTool::update, LIST_RESET, static_cast<Focusable *>(0)
364 ));
363 } 365 }
364 reset(); 366 reset();
365 367
@@ -389,7 +391,7 @@ void IconbarTool::themeReconfigured() {
389 setMode(*m_rc_mode); 391 setMode(*m_rc_mode);
390} 392}
391 393
392void IconbarTool::update(FbTk::Subject *subj) { 394void IconbarTool::update(UpdateReason reason, Focusable *win) {
393 // ignore updates if we're shutting down 395 // ignore updates if we're shutting down
394 if (m_screen.isShuttingdown()) { 396 if (m_screen.isShuttingdown()) {
395 if (!m_icons.empty()) 397 if (!m_icons.empty())
@@ -405,17 +407,18 @@ void IconbarTool::update(FbTk::Subject *subj) {
405 // lock graphic update 407 // lock graphic update
406 m_icon_container.setUpdateLock(true); 408 m_icon_container.setUpdateLock(true);
407 409
408 if (subj && typeid(*subj) == typeid(FocusableList::FocusableListSubject)) { 410 switch(reason) {
409 FocusableList::FocusableListSubject *fsubj = 411 case LIST_ADD: case LIST_ORDER:
410 static_cast<FocusableList::FocusableListSubject *>(subj); 412 insertWindow(*win);
411 if (subj == &m_winlist->addSig()) 413 break;
412 insertWindow(*fsubj->win()); 414 case LIST_REMOVE:
413 else if (subj == &m_winlist->removeSig()) 415 removeWindow(*win);
414 removeWindow(*fsubj->win()); 416 break;
415 else if (subj == &m_winlist->resetSig()) 417 case LIST_RESET:
416 reset(); 418 reset();
417 else if (subj == &m_winlist->orderSig()) 419 break;
418 insertWindow(*fsubj->win()); 420 case ALIGN:
421 break;
419 } 422 }
420 423
421 // unlock container and update graphics 424 // unlock container and update graphics
diff --git a/src/IconbarTool.hh b/src/IconbarTool.hh
index 92fbe63..118eacf 100644
--- a/src/IconbarTool.hh
+++ b/src/IconbarTool.hh
@@ -28,7 +28,6 @@
28 28
29#include "FbTk/Container.hh" 29#include "FbTk/Container.hh"
30#include "FbTk/CachedPixmap.hh" 30#include "FbTk/CachedPixmap.hh"
31#include "FbTk/Observer.hh"
32#include "FbTk/Resource.hh" 31#include "FbTk/Resource.hh"
33 32
34#include <map> 33#include <map>
@@ -39,7 +38,7 @@ class IconButton;
39class Focusable; 38class Focusable;
40class FocusableList; 39class FocusableList;
41 40
42class IconbarTool: public ToolbarItem, public FbTk::Observer { 41class IconbarTool: public ToolbarItem {
43public: 42public:
44 typedef std::map<Focusable *, IconButton *> IconMap; 43 typedef std::map<Focusable *, IconButton *> IconMap;
45 44
@@ -54,7 +53,6 @@ public:
54 void moveResize(int x, int y, 53 void moveResize(int x, int y,
55 unsigned int width, unsigned int height); 54 unsigned int width, unsigned int height);
56 55
57 void update(FbTk::Subject *subj);
58 void show(); 56 void show();
59 void hide(); 57 void hide();
60 void setAlignment(FbTk::Container::Alignment a); 58 void setAlignment(FbTk::Container::Alignment a);
@@ -72,6 +70,7 @@ public:
72 70
73 const BScreen &screen() const { return m_screen; } 71 const BScreen &screen() const { return m_screen; }
74private: 72private:
73 enum UpdateReason { LIST_ORDER, LIST_ADD, LIST_REMOVE, LIST_RESET, ALIGN };
75 74
76 void updateSizing(); 75 void updateSizing();
77 76
@@ -95,6 +94,9 @@ private:
95 /// add icons to the list 94 /// add icons to the list
96 void updateList(); 95 void updateList();
97 96
97 /// called when the list emits a signal
98 void update(UpdateReason reason, Focusable *win);
99
98 void themeReconfigured(); 100 void themeReconfigured();
99 101
100 BScreen &m_screen; 102 BScreen &m_screen;