Make sure FocusableList disconnects from signals when it is destroyed
Pavel Labath pavelo@centrum.sk
2 files changed,
11 insertions(+),
15 deletions(-)
M
src/FocusableList.cc
→
src/FocusableList.cc
@@ -94,7 +94,11 @@ }
void FocusableList::init() { addMatching(); - m_parent->attachChild(*this); + + join(m_parent->addSig(), FbTk::MemFun(*this, &FocusableList::parentWindowAdded)); + join(m_parent->orderSig(), FbTk::MemFun(*this, &FocusableList::parentOrderChanged)); + join(m_parent->removeSig(), FbTk::MemFun(*this, &FocusableList::parentWindowRemoved)); + join(m_parent->resetSig(), FbTk::MemFun(*this, &FocusableList::reset)); // TODO: can't handle (head=[mouse]) yet if (m_pat->dependsOnCurrentWorkspace()) {@@ -289,13 +293,6 @@ if (pat.match(**it))
return *it; } return 0; -} - -void FocusableList::attachChild(FocusableList &child) const { - m_addsig.connect(FbTk::MemFun(child, &FocusableList::parentWindowAdded)); - m_ordersig.connect(FbTk::MemFun(child, &FocusableList::parentOrderChanged)); - m_removesig.connect(FbTk::MemFun(child, &FocusableList::parentWindowRemoved)); - m_resetsig.connect(FbTk::MemFun(child, &FocusableList::reset)); } void FocusableList::workspaceChanged(BScreen &screen) {
M
src/FocusableList.hh
→
src/FocusableList.hh
@@ -78,10 +78,10 @@ /**
@name signals @{ */ - FbTk::Signal<Focusable *> &orderSig() { return m_ordersig; } - FbTk::Signal<Focusable *> &addSig() { return m_addsig; } - FbTk::Signal<Focusable *> &removeSig() { return m_removesig; } - FbTk::Signal<> &resetSig() { return m_resetsig; } + const FbTk::Signal<Focusable *> &orderSig() const { return m_ordersig; } + const FbTk::Signal<Focusable *> &addSig() const { return m_addsig; } + const FbTk::Signal<Focusable *> &removeSig() const { return m_removesig; } + const FbTk::Signal<> &resetSig() const { return m_resetsig; } /** @} */ // end group signals private:@@ -91,7 +91,6 @@ void checkUpdate(Focusable &win);
bool insertFromParent(Focusable &win); void attachSignals(Focusable &win); void reset(); - void attachChild(FocusableList &child) const; void workspaceChanged(BScreen &screen); void focusedWindowChanged(BScreen &screen, FluxboxWindow *win, WinClient *client); /// Title has changed for a window@@ -108,8 +107,8 @@ const FocusableList *m_parent;
BScreen &m_screen; std::list<Focusable *> m_list; - mutable FbTk::Signal<Focusable *> m_ordersig, m_addsig, m_removesig; - mutable FbTk::Signal<> m_resetsig; + FbTk::Signal<Focusable *> m_ordersig, m_addsig, m_removesig; + FbTk::Signal<> m_resetsig; typedef std::map<Focusable*, FbTk::RefCount<FbTk::SignalTracker> > SignalMap; SignalMap m_signal_map; };