diff options
-rw-r--r-- | src/AttentionNoticeHandler.cc | 15 | ||||
-rw-r--r-- | src/AttentionNoticeHandler.hh | 8 | ||||
-rw-r--r-- | src/ClientMenu.cc | 22 | ||||
-rw-r--r-- | src/ClientMenu.hh | 9 | ||||
-rw-r--r-- | src/CurrentWindowCmd.cc | 8 | ||||
-rw-r--r-- | src/Focusable.hh | 9 | ||||
-rw-r--r-- | src/FocusableList.cc | 28 | ||||
-rw-r--r-- | src/FocusableList.hh | 3 | ||||
-rw-r--r-- | src/WinClient.cc | 2 | ||||
-rw-r--r-- | src/Window.cc | 2 | ||||
-rw-r--r-- | src/fluxbox.cc | 69 | ||||
-rw-r--r-- | src/fluxbox.hh | 4 |
12 files changed, 77 insertions, 102 deletions
diff --git a/src/AttentionNoticeHandler.cc b/src/AttentionNoticeHandler.cc index 88dd72a..9052319 100644 --- a/src/AttentionNoticeHandler.cc +++ b/src/AttentionNoticeHandler.cc | |||
@@ -88,9 +88,8 @@ void AttentionNoticeHandler::addAttention(Focusable &client) { | |||
88 | 88 | ||
89 | m_attentions[&client] = timer; | 89 | m_attentions[&client] = timer; |
90 | // attach signals that will make notice go away | 90 | // attach signals that will make notice go away |
91 | client.dieSig().attach(this); | 91 | join(client.dieSig(), MemFun(*this, &AttentionNoticeHandler::removeWindow)); |
92 | 92 | join(client.focusSig(), MemFun(*this, &AttentionNoticeHandler::windowFocusChanged)); | |
93 | client.focusSig().connect(MemFun(*this, &AttentionNoticeHandler::windowFocusChanged)); | ||
94 | 93 | ||
95 | // update _NET_WM_STATE atom | 94 | // update _NET_WM_STATE atom |
96 | if (client.fbwindow()) | 95 | if (client.fbwindow()) |
@@ -104,16 +103,6 @@ void AttentionNoticeHandler::removeWindow(Focusable& win) { | |||
104 | updateWindow(win, true); | 103 | updateWindow(win, true); |
105 | } | 104 | } |
106 | 105 | ||
107 | void AttentionNoticeHandler::update(FbTk::Subject* subj) { | ||
108 | // we need to be able to get the window | ||
109 | if (!subj || typeid(*subj) != typeid(Focusable::FocusSubject)) | ||
110 | return; | ||
111 | Focusable::FocusSubject *winsubj = | ||
112 | static_cast<Focusable::FocusSubject *>(subj); | ||
113 | |||
114 | removeWindow(winsubj->win()); | ||
115 | } | ||
116 | |||
117 | void AttentionNoticeHandler::updateWindow(Focusable& win, bool died) { | 106 | void AttentionNoticeHandler::updateWindow(Focusable& win, bool died) { |
118 | // all signals results in destruction of the notice | 107 | // all signals results in destruction of the notice |
119 | 108 | ||
diff --git a/src/AttentionNoticeHandler.hh b/src/AttentionNoticeHandler.hh index 27d3b43..ed319b4 100644 --- a/src/AttentionNoticeHandler.hh +++ b/src/AttentionNoticeHandler.hh | |||
@@ -22,10 +22,10 @@ | |||
22 | #ifndef ATTENTIONNOTICEHANDLER_HH | 22 | #ifndef ATTENTIONNOTICEHANDLER_HH |
23 | #define ATTENTIONNOTICEHANDLER_HH | 23 | #define ATTENTIONNOTICEHANDLER_HH |
24 | 24 | ||
25 | #include "FbTk/Observer.hh" | ||
26 | |||
27 | #include <map> | 25 | #include <map> |
28 | 26 | ||
27 | #include "FbTk/Signal.hh" | ||
28 | |||
29 | class Focusable; | 29 | class Focusable; |
30 | 30 | ||
31 | namespace FbTk { | 31 | namespace FbTk { |
@@ -36,7 +36,7 @@ class Timer; | |||
36 | * Makes the title and iconbutton flash when the window | 36 | * Makes the title and iconbutton flash when the window |
37 | * demands attention. | 37 | * demands attention. |
38 | */ | 38 | */ |
39 | class AttentionNoticeHandler: public FbTk::Observer { | 39 | class AttentionNoticeHandler: private FbTk::SignalTracker { |
40 | public: | 40 | public: |
41 | ~AttentionNoticeHandler(); | 41 | ~AttentionNoticeHandler(); |
42 | 42 | ||
@@ -44,8 +44,6 @@ public: | |||
44 | /// Adds a client that requires attention, | 44 | /// Adds a client that requires attention, |
45 | /// will fail if the client is already active | 45 | /// will fail if the client is already active |
46 | void addAttention(Focusable &client); | 46 | void addAttention(Focusable &client); |
47 | /// removes the client from the attention map | ||
48 | void update(FbTk::Subject *subj); | ||
49 | 47 | ||
50 | bool isDemandingAttention(const Focusable &client); | 48 | bool isDemandingAttention(const Focusable &client); |
51 | 49 | ||
diff --git a/src/ClientMenu.cc b/src/ClientMenu.cc index 4a3dacd..96527ec 100644 --- a/src/ClientMenu.cc +++ b/src/ClientMenu.cc | |||
@@ -40,10 +40,7 @@ public: | |||
40 | m_client(client) { | 40 | m_client(client) { |
41 | m_signals.join(client.titleSig(), | 41 | m_signals.join(client.titleSig(), |
42 | FbTk::MemFunSelectArg1(menu, &ClientMenu::titleChanged)); | 42 | FbTk::MemFunSelectArg1(menu, &ClientMenu::titleChanged)); |
43 | client.dieSig().attach(&menu); | 43 | m_signals.join(client.dieSig(), FbTk::MemFun(menu, &ClientMenu::clientDied)); |
44 | } | ||
45 | |||
46 | ~ClientMenuItem() { | ||
47 | } | 44 | } |
48 | 45 | ||
49 | void click(int button, int time, unsigned int mods) { | 46 | void click(int button, int time, unsigned int mods) { |
@@ -156,16 +153,11 @@ void ClientMenu::titleChanged(Focusable& win) { | |||
156 | themeReconfigured(); | 153 | themeReconfigured(); |
157 | } | 154 | } |
158 | 155 | ||
159 | void ClientMenu::update(FbTk::Subject *subj) { | 156 | void ClientMenu::clientDied(Focusable &win) { |
160 | if (Focusable::FocusSubject *fsubj = dynamic_cast<Focusable::FocusSubject *>(subj)) { | 157 | // find correct menu item |
161 | Focusable &win = fsubj->win(); | 158 | ClientMenuItem* cl_item = getMenuItem(*this, win); |
162 | |||
163 | // find correct menu item | ||
164 | ClientMenuItem* cl_item = getMenuItem(*this, win); | ||
165 | 159 | ||
166 | // update accordingly | 160 | // update accordingly |
167 | if (cl_item && fsubj == &win.dieSig()) { | 161 | if (cl_item) |
168 | remove(cl_item->getIndex()); | 162 | remove(cl_item->getIndex()); |
169 | } | ||
170 | } | ||
171 | } | 163 | } |
diff --git a/src/ClientMenu.hh b/src/ClientMenu.hh index 61fd198..b40e122 100644 --- a/src/ClientMenu.hh +++ b/src/ClientMenu.hh | |||
@@ -25,7 +25,6 @@ | |||
25 | #include "FbMenu.hh" | 25 | #include "FbMenu.hh" |
26 | 26 | ||
27 | #include "FbTk/Signal.hh" | 27 | #include "FbTk/Signal.hh" |
28 | #include "FbTk/Observer.hh" | ||
29 | 28 | ||
30 | class BScreen; | 29 | class BScreen; |
31 | class FluxboxWindow; | 30 | class FluxboxWindow; |
@@ -35,7 +34,7 @@ class Focusable; | |||
35 | * A menu holding a set of client menus. | 34 | * A menu holding a set of client menus. |
36 | * @see WorkspaceMenu | 35 | * @see WorkspaceMenu |
37 | */ | 36 | */ |
38 | class ClientMenu: public FbMenu, public FbTk::Observer { | 37 | class ClientMenu: public FbMenu { |
39 | public: | 38 | public: |
40 | 39 | ||
41 | typedef std::list<FluxboxWindow *> Focusables; | 40 | typedef std::list<FluxboxWindow *> Focusables; |
@@ -54,15 +53,15 @@ public: | |||
54 | /// Called when window title changed. | 53 | /// Called when window title changed. |
55 | void titleChanged(Focusable& win); | 54 | void titleChanged(Focusable& win); |
56 | 55 | ||
56 | /// Called when a client dies. Removes the corresponding menu item | ||
57 | void clientDied(Focusable& win); | ||
58 | |||
57 | private: | 59 | private: |
58 | 60 | ||
59 | void updateClientList(BScreen& screen) { | 61 | void updateClientList(BScreen& screen) { |
60 | refreshMenu(); | 62 | refreshMenu(); |
61 | } | 63 | } |
62 | 64 | ||
63 | /// called when receiving a subject signal | ||
64 | void update(FbTk::Subject *subj); | ||
65 | |||
66 | Focusables &m_list; ///< clients in the menu | 65 | Focusables &m_list; ///< clients in the menu |
67 | FbTk::SignalTracker m_slots; ///< track all the slots | 66 | FbTk::SignalTracker m_slots; ///< track all the slots |
68 | }; | 67 | }; |
diff --git a/src/CurrentWindowCmd.cc b/src/CurrentWindowCmd.cc index 1122e1f..8d27a3a 100644 --- a/src/CurrentWindowCmd.cc +++ b/src/CurrentWindowCmd.cc | |||
@@ -635,18 +635,18 @@ void ChangeLayerCmd::real_execute() { | |||
635 | } | 635 | } |
636 | 636 | ||
637 | namespace { | 637 | namespace { |
638 | class SetTitleDialog: public TextDialog, public FbTk::Observer { | 638 | class SetTitleDialog: public TextDialog, private FbTk::SignalTracker { |
639 | public: | 639 | public: |
640 | SetTitleDialog(FluxboxWindow &win, const string &title): | 640 | SetTitleDialog(FluxboxWindow &win, const string &title): |
641 | TextDialog(win.screen(), title), window(win) { | 641 | TextDialog(win.screen(), title), window(win) { |
642 | win.dieSig().attach(this); | 642 | join(win.dieSig(), FbTk::MemFunIgnoreArgs(*this, &SetTitleDialog::windowDied)); |
643 | setText(win.title()); | 643 | setText(win.title()); |
644 | } | 644 | } |
645 | 645 | ||
646 | private: | ||
646 | // only attached signal is window destruction | 647 | // only attached signal is window destruction |
647 | void update(FbTk::Subject *subj) { delete this; } | 648 | void windowDied() { delete this; } |
648 | 649 | ||
649 | private: | ||
650 | void exec(const std::string &text) { | 650 | void exec(const std::string &text) { |
651 | window.winClient().setTitle(text); | 651 | window.winClient().setTitle(text); |
652 | } | 652 | } |
diff --git a/src/Focusable.hh b/src/Focusable.hh index 72a1dcc..cf2169a 100644 --- a/src/Focusable.hh +++ b/src/Focusable.hh | |||
@@ -41,9 +41,9 @@ public: | |||
41 | m_screen(scr), m_fbwin(fbwin), | 41 | m_screen(scr), m_fbwin(fbwin), |
42 | m_instance_name("fluxbox"), m_class_name("fluxbox"), | 42 | m_instance_name("fluxbox"), m_class_name("fluxbox"), |
43 | m_focused(false), m_attention_state(false), | 43 | m_focused(false), m_attention_state(false), |
44 | m_diesig(*this), | ||
45 | m_attentionsig(*this), | 44 | m_attentionsig(*this), |
46 | m_focussig(), | 45 | m_focussig(), |
46 | m_diesig(), | ||
47 | m_titlesig() { } | 47 | m_titlesig() { } |
48 | virtual ~Focusable() { } | 48 | virtual ~Focusable() { } |
49 | 49 | ||
@@ -125,9 +125,7 @@ public: | |||
125 | /// Used for both title and icon changes. | 125 | /// Used for both title and icon changes. |
126 | const TitleSignal &titleSig() const { return m_titlesig; } | 126 | const TitleSignal &titleSig() const { return m_titlesig; } |
127 | FbTk::Signal<Focusable&> &focusSig() { return m_focussig; } | 127 | FbTk::Signal<Focusable&> &focusSig() { return m_focussig; } |
128 | const FbTk::Signal<Focusable&> &focusSig() const { return m_focussig; } | 128 | FbTk::Signal<Focusable&> &dieSig() { return m_diesig; } |
129 | FbTk::Subject &dieSig() { return m_diesig; } | ||
130 | const FbTk::Subject &dieSig() const { return m_diesig; } | ||
131 | FbTk::Subject &attentionSig() { return m_attentionsig; } | 129 | FbTk::Subject &attentionSig() { return m_attentionsig; } |
132 | const FbTk::Subject &attentionSig() const { return m_attentionsig; } | 130 | const FbTk::Subject &attentionSig() const { return m_attentionsig; } |
133 | /** @} */ // end group signals | 131 | /** @} */ // end group signals |
@@ -150,10 +148,11 @@ protected: | |||
150 | FbTk::PixmapWithMask m_icon; //< icon pixmap with mask | 148 | FbTk::PixmapWithMask m_icon; //< icon pixmap with mask |
151 | 149 | ||
152 | // state and hint signals | 150 | // state and hint signals |
153 | FocusSubject m_diesig, m_attentionsig; | 151 | FocusSubject m_attentionsig; |
154 | 152 | ||
155 | private: | 153 | private: |
156 | FbTk::Signal<Focusable&> m_focussig; | 154 | FbTk::Signal<Focusable&> m_focussig; |
155 | FbTk::Signal<Focusable&> m_diesig; | ||
157 | TitleSignal m_titlesig; | 156 | TitleSignal m_titlesig; |
158 | }; | 157 | }; |
159 | 158 | ||
diff --git a/src/FocusableList.cc b/src/FocusableList.cc index 748e940..a130ec0 100644 --- a/src/FocusableList.cc +++ b/src/FocusableList.cc | |||
@@ -111,13 +111,6 @@ void FocusableList::update(FbTk::Subject *subj) { | |||
111 | if (subj == 0 || m_screen.isShuttingdown()) | 111 | if (subj == 0 || m_screen.isShuttingdown()) |
112 | return; | 112 | return; |
113 | 113 | ||
114 | if (typeid(*subj) == typeid(Focusable::FocusSubject)) { | ||
115 | Focusable::FocusSubject *fsubj = | ||
116 | static_cast<Focusable::FocusSubject *>(subj); | ||
117 | if (fsubj == &fsubj->win().dieSig()) { | ||
118 | remove(fsubj->win()); | ||
119 | } | ||
120 | } | ||
121 | if (typeid(*subj) == typeid(FluxboxWindow::WinSubject)) { | 114 | if (typeid(*subj) == typeid(FluxboxWindow::WinSubject)) { |
122 | FluxboxWindow::WinSubject *fsubj = | 115 | FluxboxWindow::WinSubject *fsubj = |
123 | static_cast<FluxboxWindow::WinSubject *>(subj); | 116 | static_cast<FluxboxWindow::WinSubject *>(subj); |
@@ -254,15 +247,17 @@ void FocusableList::remove(Focusable &win) { | |||
254 | void FocusableList::updateTitle(Focusable& win) { | 247 | void FocusableList::updateTitle(Focusable& win) { |
255 | checkUpdate(win); | 248 | checkUpdate(win); |
256 | } | 249 | } |
250 | #include "Debug.hh" | ||
257 | 251 | ||
258 | void FocusableList::attachSignals(Focusable &win) { | 252 | void FocusableList::attachSignals(Focusable &win) { |
259 | win.dieSig().attach(this); | ||
260 | if (m_parent) { | 253 | if (m_parent) { |
261 | // attach various signals for matching | 254 | // attach various signals for matching |
262 | if (m_signal_map.find(&win) == m_signal_map.end()) { | 255 | FbTk::RefCount<FbTk::SignalTracker> &tracker = m_signal_map[&win]; |
263 | m_signal_map[&win] = join(win.titleSig(), | 256 | if (! tracker) { |
264 | MemFunSelectArg1(*this, | 257 | // we have not attached to this window yet |
265 | &FocusableList::updateTitle)); | 258 | tracker = new SignalTracker; |
259 | tracker->join(win.titleSig(), MemFunSelectArg1(*this, &FocusableList::updateTitle)); | ||
260 | tracker->join(win.dieSig(), MemFun(*this, &FocusableList::remove)); | ||
266 | } | 261 | } |
267 | 262 | ||
268 | FluxboxWindow *fbwin = win.fbwindow(); | 263 | FluxboxWindow *fbwin = win.fbwindow(); |
@@ -276,15 +271,8 @@ void FocusableList::attachSignals(Focusable &win) { | |||
276 | } | 271 | } |
277 | 272 | ||
278 | void FocusableList::detachSignals(Focusable &win) { | 273 | void FocusableList::detachSignals(Focusable &win) { |
279 | win.dieSig().detach(this); | 274 | m_signal_map.erase(&win); |
280 | if (m_parent) { | 275 | if (m_parent) { |
281 | // disconnect client | ||
282 | SignalMap::iterator sigIt = m_signal_map.find(&win); | ||
283 | if (sigIt != m_signal_map.end()) { | ||
284 | leave(sigIt->second); | ||
285 | m_signal_map.erase(sigIt); | ||
286 | } | ||
287 | |||
288 | // detach various signals for matching | 276 | // detach various signals for matching |
289 | FluxboxWindow *fbwin = win.fbwindow(); | 277 | FluxboxWindow *fbwin = win.fbwindow(); |
290 | if (!fbwin) | 278 | if (!fbwin) |
diff --git a/src/FocusableList.hh b/src/FocusableList.hh index 1382da6..6e46db9 100644 --- a/src/FocusableList.hh +++ b/src/FocusableList.hh | |||
@@ -24,6 +24,7 @@ | |||
24 | 24 | ||
25 | #include "FbTk/NotCopyable.hh" | 25 | #include "FbTk/NotCopyable.hh" |
26 | #include "FbTk/Observer.hh" | 26 | #include "FbTk/Observer.hh" |
27 | #include "FbTk/RefCount.hh" | ||
27 | #include "FbTk/Subject.hh" | 28 | #include "FbTk/Subject.hh" |
28 | #include "FbTk/Signal.hh" | 29 | #include "FbTk/Signal.hh" |
29 | 30 | ||
@@ -126,7 +127,7 @@ private: | |||
126 | std::list<Focusable *> m_list; | 127 | std::list<Focusable *> m_list; |
127 | 128 | ||
128 | mutable FocusableListSubject m_ordersig, m_addsig, m_removesig, m_resetsig; | 129 | mutable FocusableListSubject m_ordersig, m_addsig, m_removesig, m_resetsig; |
129 | typedef std::map<Focusable*, FbTk::SignalTracker::TrackID> SignalMap; | 130 | typedef std::map<Focusable*, FbTk::RefCount<FbTk::SignalTracker> > SignalMap; |
130 | SignalMap m_signal_map; | 131 | SignalMap m_signal_map; |
131 | }; | 132 | }; |
132 | 133 | ||
diff --git a/src/WinClient.cc b/src/WinClient.cc index 4ef37ae..b73f27c 100644 --- a/src/WinClient.cc +++ b/src/WinClient.cc | |||
@@ -155,7 +155,7 @@ WinClient::~WinClient() { | |||
155 | fbwindow()->removeClient(*this); | 155 | fbwindow()->removeClient(*this); |
156 | 156 | ||
157 | // this takes care of any focus issues | 157 | // this takes care of any focus issues |
158 | m_diesig.notify(); | 158 | dieSig().emit(*this); |
159 | 159 | ||
160 | // This fixes issue 1 (see WinClient.hh): | 160 | // This fixes issue 1 (see WinClient.hh): |
161 | // If transients die before the transient_for is created | 161 | // If transients die before the transient_for is created |
diff --git a/src/Window.cc b/src/Window.cc index 756c358..ca63178 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -350,7 +350,7 @@ FluxboxWindow::~FluxboxWindow() { | |||
350 | m_timer.stop(); | 350 | m_timer.stop(); |
351 | 351 | ||
352 | // notify die | 352 | // notify die |
353 | m_diesig.notify(); | 353 | dieSig().emit(*this); |
354 | 354 | ||
355 | if (m_client != 0 && !m_screen.isShuttingdown()) | 355 | if (m_client != 0 && !m_screen.isShuttingdown()) |
356 | delete m_client; // this also removes client from our list | 356 | delete m_client; // this also removes client from our list |
diff --git a/src/fluxbox.cc b/src/fluxbox.cc index 99b9ea9..0263de7 100644 --- a/src/fluxbox.cc +++ b/src/fluxbox.cc | |||
@@ -943,7 +943,6 @@ void Fluxbox::handleSignal(int signum) { | |||
943 | void Fluxbox::update(FbTk::Subject *changedsub) { | 943 | void Fluxbox::update(FbTk::Subject *changedsub) { |
944 | //TODO: fix signaling, this does not look good | 944 | //TODO: fix signaling, this does not look good |
945 | FluxboxWindow *fbwin = 0; | 945 | FluxboxWindow *fbwin = 0; |
946 | WinClient *client = 0; | ||
947 | 946 | ||
948 | if (typeid(*changedsub) == typeid(FluxboxWindow::WinSubject)) { | 947 | if (typeid(*changedsub) == typeid(FluxboxWindow::WinSubject)) { |
949 | FluxboxWindow::WinSubject *winsub = dynamic_cast<FluxboxWindow::WinSubject *>(changedsub); | 948 | FluxboxWindow::WinSubject *winsub = dynamic_cast<FluxboxWindow::WinSubject *>(changedsub); |
@@ -951,8 +950,6 @@ void Fluxbox::update(FbTk::Subject *changedsub) { | |||
951 | } else if (typeid(*changedsub) == typeid(Focusable::FocusSubject)) { | 950 | } else if (typeid(*changedsub) == typeid(Focusable::FocusSubject)) { |
952 | Focusable::FocusSubject *winsub = dynamic_cast<Focusable::FocusSubject *>(changedsub); | 951 | Focusable::FocusSubject *winsub = dynamic_cast<Focusable::FocusSubject *>(changedsub); |
953 | fbwin = winsub->win().fbwindow(); | 952 | fbwin = winsub->win().fbwindow(); |
954 | if (typeid(winsub->win()) == typeid(WinClient)) | ||
955 | client = dynamic_cast<WinClient *>(&winsub->win()); | ||
956 | } | 953 | } |
957 | 954 | ||
958 | if (fbwin && &fbwin->stateSig() == changedsub) { // state signal | 955 | if (fbwin && &fbwin->stateSig() == changedsub) { // state signal |
@@ -981,41 +978,49 @@ void Fluxbox::update(FbTk::Subject *changedsub) { | |||
981 | } else if (fbwin && &fbwin->layerSig() == changedsub) { // layer signal | 978 | } else if (fbwin && &fbwin->layerSig() == changedsub) { // layer signal |
982 | STLUtil::forAllIf(m_atomhandler, mem_fun(&AtomHandler::update), | 979 | STLUtil::forAllIf(m_atomhandler, mem_fun(&AtomHandler::update), |
983 | CallMemFunWithRefArg<AtomHandler, FluxboxWindow&, void>(&AtomHandler::updateLayer, *fbwin)); | 980 | CallMemFunWithRefArg<AtomHandler, FluxboxWindow&, void>(&AtomHandler::updateLayer, *fbwin)); |
984 | } else if (fbwin && &fbwin->dieSig() == changedsub) { // window death signal | ||
985 | STLUtil::forAllIf(m_atomhandler, mem_fun(&AtomHandler::update), | ||
986 | CallMemFunWithRefArg<AtomHandler, FluxboxWindow&, void>(&AtomHandler::updateFrameClose, *fbwin)); | ||
987 | |||
988 | // make sure each workspace get this | ||
989 | BScreen &scr = fbwin->screen(); | ||
990 | scr.removeWindow(fbwin); | ||
991 | if (FocusControl::focusedFbWindow() == fbwin) | ||
992 | FocusControl::setFocusedFbWindow(0); | ||
993 | } else if (fbwin && &fbwin->workspaceSig() == changedsub) { // workspace signal | 981 | } else if (fbwin && &fbwin->workspaceSig() == changedsub) { // workspace signal |
994 | STLUtil::forAllIf(m_atomhandler, mem_fun(&AtomHandler::update), | 982 | STLUtil::forAllIf(m_atomhandler, mem_fun(&AtomHandler::update), |
995 | CallMemFunWithRefArg<AtomHandler, FluxboxWindow&, void>(&AtomHandler::updateWorkspace, *fbwin)); | 983 | CallMemFunWithRefArg<AtomHandler, FluxboxWindow&, void>(&AtomHandler::updateWorkspace, *fbwin)); |
996 | } else if (client && &client->dieSig() == changedsub) { // client death | 984 | } |
997 | STLUtil::forAllIf(m_atomhandler, mem_fun(&AtomHandler::update), | 985 | } |
998 | CallMemFunWithRefArg<AtomHandler, WinClient&, void>(&AtomHandler::updateClientClose, *client)); | ||
999 | 986 | ||
1000 | BScreen &screen = client->screen(); | 987 | void Fluxbox::windowDied(Focusable &focusable) { |
988 | FluxboxWindow *fbwin = focusable.fbwindow(); | ||
1001 | 989 | ||
1002 | // At this point, we trust that this client is no longer in the | 990 | STLUtil::forAllIf(m_atomhandler, mem_fun(&AtomHandler::update), |
1003 | // client list of its frame (but it still has reference to the frame) | 991 | CallMemFunWithRefArg<AtomHandler, FluxboxWindow&, void>(&AtomHandler::updateFrameClose, *focusable.fbwindow())); |
1004 | // We also assume that any remaining active one is the last focused one | ||
1005 | 992 | ||
1006 | // This is where we revert focus on window close | 993 | // make sure each workspace get this |
1007 | // NOWHERE ELSE!!! | 994 | BScreen &scr = focusable.screen(); |
1008 | if (FocusControl::focusedWindow() == client) { | 995 | scr.removeWindow(fbwin); |
1009 | FocusControl::unfocusWindow(*client); | 996 | if (FocusControl::focusedFbWindow() == fbwin) |
1010 | // make sure nothing else uses this window before focus reverts | 997 | FocusControl::setFocusedFbWindow(0); |
1011 | FocusControl::setFocusedWindow(0); | 998 | } |
1012 | } else if (FocusControl::expectingFocus() == client) { | 999 | |
1013 | FocusControl::setExpectingFocus(0); | 1000 | void Fluxbox::clientDied(Focusable &focusable) { |
1014 | revertFocus(); | 1001 | WinClient &client = dynamic_cast<WinClient &>(focusable); |
1015 | } | 1002 | |
1003 | STLUtil::forAllIf(m_atomhandler, mem_fun(&AtomHandler::update), | ||
1004 | CallMemFunWithRefArg<AtomHandler, WinClient&, void>(&AtomHandler::updateClientClose, client)); | ||
1016 | 1005 | ||
1017 | screen.removeClient(*client); | 1006 | BScreen &screen = client.screen(); |
1007 | |||
1008 | // At this point, we trust that this client is no longer in the | ||
1009 | // client list of its frame (but it still has reference to the frame) | ||
1010 | // We also assume that any remaining active one is the last focused one | ||
1011 | |||
1012 | // This is where we revert focus on window close | ||
1013 | // NOWHERE ELSE!!! | ||
1014 | if (FocusControl::focusedWindow() == &client) { | ||
1015 | FocusControl::unfocusWindow(client); | ||
1016 | // make sure nothing else uses this window before focus reverts | ||
1017 | FocusControl::setFocusedWindow(0); | ||
1018 | } else if (FocusControl::expectingFocus() == &client) { | ||
1019 | FocusControl::setExpectingFocus(0); | ||
1020 | revertFocus(); | ||
1018 | } | 1021 | } |
1022 | |||
1023 | screen.removeClient(client); | ||
1019 | } | 1024 | } |
1020 | 1025 | ||
1021 | void Fluxbox::attachSignals(FluxboxWindow &win) { | 1026 | void Fluxbox::attachSignals(FluxboxWindow &win) { |
@@ -1023,13 +1028,13 @@ void Fluxbox::attachSignals(FluxboxWindow &win) { | |||
1023 | win.stateSig().attach(this); | 1028 | win.stateSig().attach(this); |
1024 | win.workspaceSig().attach(this); | 1029 | win.workspaceSig().attach(this); |
1025 | win.layerSig().attach(this); | 1030 | win.layerSig().attach(this); |
1026 | win.dieSig().attach(this); | 1031 | join(win.dieSig(), FbTk::MemFun(*this, &Fluxbox::windowDied)); |
1027 | STLUtil::forAll(m_atomhandler, | 1032 | STLUtil::forAll(m_atomhandler, |
1028 | CallMemFunWithRefArg<AtomHandler, FluxboxWindow&, void>(&AtomHandler::setupFrame, win)); | 1033 | CallMemFunWithRefArg<AtomHandler, FluxboxWindow&, void>(&AtomHandler::setupFrame, win)); |
1029 | } | 1034 | } |
1030 | 1035 | ||
1031 | void Fluxbox::attachSignals(WinClient &winclient) { | 1036 | void Fluxbox::attachSignals(WinClient &winclient) { |
1032 | winclient.dieSig().attach(this); | 1037 | join(winclient.dieSig(), FbTk::MemFun(*this, &Fluxbox::clientDied)); |
1033 | STLUtil::forAll(m_atomhandler, | 1038 | STLUtil::forAll(m_atomhandler, |
1034 | CallMemFunWithRefArg<AtomHandler, WinClient&, void>(&AtomHandler::setupClient, winclient)); | 1039 | CallMemFunWithRefArg<AtomHandler, WinClient&, void>(&AtomHandler::setupClient, winclient)); |
1035 | } | 1040 | } |
diff --git a/src/fluxbox.hh b/src/fluxbox.hh index 36b39ef..082297f 100644 --- a/src/fluxbox.hh +++ b/src/fluxbox.hh | |||
@@ -217,6 +217,10 @@ private: | |||
217 | 217 | ||
218 | /// Called when the workspace area changed. | 218 | /// Called when the workspace area changed. |
219 | void workspaceAreaChanged(BScreen &screen); | 219 | void workspaceAreaChanged(BScreen &screen); |
220 | /// Called when a window (FluxboxWindow) dies | ||
221 | void windowDied(Focusable &focusable); | ||
222 | /// Called when a client (WinClient) dies | ||
223 | void clientDied(Focusable &focusable); | ||
220 | 224 | ||
221 | std::auto_ptr<FbAtoms> m_fbatoms; | 225 | std::auto_ptr<FbAtoms> m_fbatoms; |
222 | 226 | ||