Make sure FocusableList disconnects from signals when it is destroyed
This commit is contained in:
parent
aa84c95253
commit
e54bca68d2
2 changed files with 11 additions and 15 deletions
|
@ -94,7 +94,11 @@ FocusableList::FocusableList(BScreen &scr, const FocusableList &parent,
|
||||||
|
|
||||||
void FocusableList::init() {
|
void FocusableList::init() {
|
||||||
addMatching();
|
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
|
// TODO: can't handle (head=[mouse]) yet
|
||||||
if (m_pat->dependsOnCurrentWorkspace()) {
|
if (m_pat->dependsOnCurrentWorkspace()) {
|
||||||
|
@ -291,13 +295,6 @@ Focusable *FocusableList::find(const ClientPattern &pat) const {
|
||||||
return 0;
|
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) {
|
void FocusableList::workspaceChanged(BScreen &screen) {
|
||||||
reset();
|
reset();
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,10 +78,10 @@ public:
|
||||||
@name signals
|
@name signals
|
||||||
@{
|
@{
|
||||||
*/
|
*/
|
||||||
FbTk::Signal<Focusable *> &orderSig() { return m_ordersig; }
|
const FbTk::Signal<Focusable *> &orderSig() const { return m_ordersig; }
|
||||||
FbTk::Signal<Focusable *> &addSig() { return m_addsig; }
|
const FbTk::Signal<Focusable *> &addSig() const { return m_addsig; }
|
||||||
FbTk::Signal<Focusable *> &removeSig() { return m_removesig; }
|
const FbTk::Signal<Focusable *> &removeSig() const { return m_removesig; }
|
||||||
FbTk::Signal<> &resetSig() { return m_resetsig; }
|
const FbTk::Signal<> &resetSig() const { return m_resetsig; }
|
||||||
/** @} */ // end group signals
|
/** @} */ // end group signals
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -91,7 +91,6 @@ private:
|
||||||
bool insertFromParent(Focusable &win);
|
bool insertFromParent(Focusable &win);
|
||||||
void attachSignals(Focusable &win);
|
void attachSignals(Focusable &win);
|
||||||
void reset();
|
void reset();
|
||||||
void attachChild(FocusableList &child) const;
|
|
||||||
void workspaceChanged(BScreen &screen);
|
void workspaceChanged(BScreen &screen);
|
||||||
void focusedWindowChanged(BScreen &screen, FluxboxWindow *win, WinClient *client);
|
void focusedWindowChanged(BScreen &screen, FluxboxWindow *win, WinClient *client);
|
||||||
/// Title has changed for a window
|
/// Title has changed for a window
|
||||||
|
@ -108,8 +107,8 @@ private:
|
||||||
BScreen &m_screen;
|
BScreen &m_screen;
|
||||||
std::list<Focusable *> m_list;
|
std::list<Focusable *> m_list;
|
||||||
|
|
||||||
mutable FbTk::Signal<Focusable *> m_ordersig, m_addsig, m_removesig;
|
FbTk::Signal<Focusable *> m_ordersig, m_addsig, m_removesig;
|
||||||
mutable FbTk::Signal<> m_resetsig;
|
FbTk::Signal<> m_resetsig;
|
||||||
typedef std::map<Focusable*, FbTk::RefCount<FbTk::SignalTracker> > SignalMap;
|
typedef std::map<Focusable*, FbTk::RefCount<FbTk::SignalTracker> > SignalMap;
|
||||||
SignalMap m_signal_map;
|
SignalMap m_signal_map;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue