all repos — fluxbox @ e54bca68d2bd42f9b9c342a1564971db6e071808

custom fork of the fluxbox windowmanager

Make sure FocusableList disconnects from signals when it is destroyed
Pavel Labath pavelo@centrum.sk
commit

e54bca68d2bd42f9b9c342a1564971db6e071808

parent

aa84c952535a86e797226a2fe3bc5f41248c93c1

2 files changed, 11 insertions(+), 15 deletions(-)

jump to
M src/FocusableList.ccsrc/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.hhsrc/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; };