compress resize signals typically buttons will call for this quite some, eg. when switching workspace or (now) when altering the focused window. This compresses various changes happening at the same time and re-layout the toolbar only once for them
Thomas Lübking thomas.luebking@gmail.com
2 files changed,
17 insertions(+),
3 deletions(-)
M
src/IconbarTool.cc
→
src/IconbarTool.cc
@@ -287,6 +287,12 @@ m_tracker.join(unfocused_theme.reconfigSig(),
FbTk::MemFun(*this, &IconbarTool::themeReconfigured)); m_tracker.join(screen.reconfigureSig(), FbTk::MemFunIgnoreArgs(*this, &IconbarTool::updateIconifiedPattern)); + + m_resizeSig_timer.setTimeout(100 * FbTk::FbTime::IN_MILLISECONDS); + m_resizeSig_timer.fireOnce(true); + FbTk::RefCount<FbTk::Command<void> > ers(new FbTk::SimpleCommand<IconbarTool>(*this, &IconbarTool::emitResizeSig)); + m_resizeSig_timer.setCommand(ers); + themeReconfigured(); }@@ -360,7 +366,7 @@ ));
} reset(); - resizeSig().emit(); + m_resizeSig_timer.start(); // unlock graphics update m_icon_container.setUpdateLock(false);@@ -372,6 +378,10 @@
m_menu.reconfigure(); } +void IconbarTool::emitResizeSig() { + resizeSig().emit(); +} + unsigned int IconbarTool::width() const { return m_icon_container.width(); }@@ -427,7 +437,7 @@ case ALIGN:
break; } - resizeSig().emit(); + m_resizeSig_timer.start(); const unsigned int maxsize = (m_icon_container.orientation() & 1) ? height() : width(); m_icon_container.setMaxTotalSize(maxsize); m_icon_container.setMaxSizePerClient(maxsize/std::max(1, m_icon_container.size()));@@ -482,7 +492,7 @@ pos++;
} m_icon_container.insertItem(button, pos); - m_tracker.join(button->titleChanged(), FbTk::MemFun(resizeSig(), &FbTk::Signal<>::emit)); + m_tracker.join(button->titleChanged(), FbTk::MemFun(m_resizeSig_timer, &FbTk::Timer::start)); } void IconbarTool::reset() {
M
src/IconbarTool.hh
→
src/IconbarTool.hh
@@ -29,6 +29,7 @@
#include "FbTk/Container.hh" #include "FbTk/CachedPixmap.hh" #include "FbTk/Resource.hh" +#include "FbTk/Timer.hh" #include <map>@@ -103,6 +104,9 @@
void updateIconifiedPattern(); void themeReconfigured(); + + FbTk::Timer m_resizeSig_timer; + void emitResizeSig(); BScreen &m_screen; FbTk::Container m_icon_container;