aboutsummaryrefslogtreecommitdiff
path: root/src/IconbarTool.cc
diff options
context:
space:
mode:
authorfluxgen <fluxgen>2003-12-19 14:58:48 (GMT)
committerfluxgen <fluxgen>2003-12-19 14:58:48 (GMT)
commit1dd4b27d30a9a96032dffa3946f478ce4cba85b9 (patch)
tree8bb819ac6fa7a214af12ccb36936d48b16e2c7a6 /src/IconbarTool.cc
parent9b88b1f2c7e2da1ec6a47518ded37c0eab36e738 (diff)
downloadfluxbox-1dd4b27d30a9a96032dffa3946f478ce4cba85b9.zip
fluxbox-1dd4b27d30a9a96032dffa3946f478ce4cba85b9.tar.bz2
timedRender so we can remove flicker while changing current client in window
Diffstat (limited to 'src/IconbarTool.cc')
-rw-r--r--src/IconbarTool.cc57
1 files changed, 47 insertions, 10 deletions
diff --git a/src/IconbarTool.cc b/src/IconbarTool.cc
index 1f6d491..8602a2b 100644
--- a/src/IconbarTool.cc
+++ b/src/IconbarTool.cc
@@ -20,7 +20,7 @@
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21// DEALINGS IN THE SOFTWARE. 21// DEALINGS IN THE SOFTWARE.
22 22
23// $Id: IconbarTool.cc,v 1.23 2003/12/18 18:03:21 fluxgen Exp $ 23// $Id: IconbarTool.cc,v 1.24 2003/12/19 14:58:48 fluxgen Exp $
24 24
25#include "IconbarTool.hh" 25#include "IconbarTool.hh"
26 26
@@ -33,6 +33,7 @@
33#include "FbMenu.hh" 33#include "FbMenu.hh"
34#include "BoolMenuItem.hh" 34#include "BoolMenuItem.hh"
35#include "CommandParser.hh" 35#include "CommandParser.hh"
36#include "WinClient.hh"
36 37
37#include "FbTk/Menu.hh" 38#include "FbTk/Menu.hh"
38#include "FbTk/MenuItem.hh" 39#include "FbTk/MenuItem.hh"
@@ -272,6 +273,14 @@ IconbarTool::IconbarTool(const FbTk::FbWindow &parent, IconbarTheme &theme, BScr
272 screen.clientListSig().attach(this); 273 screen.clientListSig().attach(this);
273 screen.iconListSig().attach(this); 274 screen.iconListSig().attach(this);
274 screen.currentWorkspaceSig().attach(this); 275 screen.currentWorkspaceSig().attach(this);
276 // setup focus timer
277 FbTk::RefCount<FbTk::Command> timer_cmd(new FbTk::SimpleCommand<IconbarTool>(*this, &IconbarTool::timedRender));
278 timeval to;
279 to.tv_sec = 0;
280 to.tv_usec = 1; // so it updates next event round
281 m_focus_timer.setCommand(timer_cmd);
282 m_focus_timer.setTimeout(to);
283 m_focus_timer.fireOnce(true);
275 284
276 update(0); 285 update(0);
277} 286}
@@ -392,7 +401,10 @@ void IconbarTool::update(FbTk::Subject *subj) {
392 // we handle everything except die signal here 401 // we handle everything except die signal here
393 FluxboxWindow::WinSubject *winsubj = static_cast<FluxboxWindow::WinSubject *>(subj); 402 FluxboxWindow::WinSubject *winsubj = static_cast<FluxboxWindow::WinSubject *>(subj);
394 if (subj == &(winsubj->win().focusSig())) { 403 if (subj == &(winsubj->win().focusSig())) {
395 renderWindow(winsubj->win()); 404 // start focus timer, so we can update without flicker
405 m_focus_timer.start();
406
407 //renderWindow(winsubj->win());
396 return; 408 return;
397 } else if (subj == &(winsubj->win().workspaceSig())) { 409 } else if (subj == &(winsubj->win().workspaceSig())) {
398 // we can ignore this signal if we're in ALLWINDOWS mode 410 // we can ignore this signal if we're in ALLWINDOWS mode
@@ -441,9 +453,9 @@ void IconbarTool::update(FbTk::Subject *subj) {
441 mode() != ALLWINDOWS && mode() != ICONS) { 453 mode() != ALLWINDOWS && mode() != ICONS) {
442 remove_all = true; // remove and readd all windows 454 remove_all = true; // remove and readd all windows
443 }/* else if (&m_screen.iconListSig() == screen_subj && 455 }/* else if (&m_screen.iconListSig() == screen_subj &&
444 (mode() == ALLWINDOWS || mode() == ICONS || mode() == WORKSPACE)) { 456 (mode() == ALLWINDOWS || mode() == ICONS || mode() == WORKSPACE)) {
445 remove_all = true; 457 remove_all = true;
446 }*/ 458 }*/
447 } 459 }
448 460
449 // lock graphic update 461 // lock graphic update
@@ -477,19 +489,23 @@ void IconbarTool::update(FbTk::Subject *subj) {
477 489
478} 490}
479 491
480void IconbarTool::renderWindow(FluxboxWindow &win) { 492IconButton *IconbarTool::findButton(FluxboxWindow &win) {
481 493
482 IconList::iterator icon_it = m_icon_list.begin(); 494 IconList::iterator icon_it = m_icon_list.begin();
483 IconList::iterator icon_it_end = m_icon_list.end(); 495 IconList::iterator icon_it_end = m_icon_list.end();
484 for (; icon_it != icon_it_end; ++icon_it) { 496 for (; icon_it != icon_it_end; ++icon_it) {
485 if (&(*icon_it)->win() == &win) 497 if (&(*icon_it)->win() == &win)
486 break; 498 return *icon_it;
487 } 499 }
488 500
489 if (icon_it == m_icon_list.end()) 501 return 0;
490 return; 502}
491 503
492 renderButton(*(*icon_it)); 504void IconbarTool::renderWindow(FluxboxWindow &win) {
505 IconButton *button = findButton(win);
506 if (button == 0)
507 return;
508 renderButton(*button);
493} 509}
494 510
495void IconbarTool::renderTheme() { 511void IconbarTool::renderTheme() {
@@ -546,6 +562,7 @@ void IconbarTool::renderButton(IconButton &button) {
546 button.setPixmap(*m_rc_use_pixmap); 562 button.setPixmap(*m_rc_use_pixmap);
547 563
548 if (button.win().isFocused()) { // focused texture 564 if (button.win().isFocused()) { // focused texture
565 m_icon_container.setSelected(m_icon_container.find(&button));
549 button.setGC(m_theme.focusedText().textGC()); 566 button.setGC(m_theme.focusedText().textGC());
550 button.setFont(m_theme.focusedText().font()); 567 button.setFont(m_theme.focusedText().font());
551 button.setJustify(m_theme.focusedText().justify()); 568 button.setJustify(m_theme.focusedText().justify());
@@ -559,6 +576,9 @@ void IconbarTool::renderButton(IconButton &button) {
559 button.setBorderColor(m_theme.focusedBorder().color()); 576 button.setBorderColor(m_theme.focusedBorder().color());
560 577
561 } else { // unfocused 578 } else { // unfocused
579 if (m_icon_container.selected() == &button)
580 m_icon_container.setSelected(-1);
581
562 button.setGC(m_theme.unfocusedText().textGC()); 582 button.setGC(m_theme.unfocusedText().textGC());
563 button.setFont(m_theme.unfocusedText().font()); 583 button.setFont(m_theme.unfocusedText().font());
564 button.setJustify(m_theme.unfocusedText().justify()); 584 button.setJustify(m_theme.unfocusedText().justify());
@@ -696,4 +716,21 @@ void IconbarTool::addList(std::list<FluxboxWindow *> &winlist) {
696 addWindow(**it); 716 addWindow(**it);
697} 717}
698 718
719void IconbarTool::timedRender() {
720 WinClient *client = Fluxbox::instance()->getFocusedWindow();
721 if (client == 0 || client->fbwindow() == 0)
722 return;
723
724 IconButton *button = findButton(*client->fbwindow());
725 IconButton *current_button = static_cast<IconButton *>(m_icon_container.selected());
726 // if old window is the same as the new focused window then ignore this render
727 // else render old client and new client
728 if (button == current_button)
729 return;
730 if (button != 0)
731 renderButton(*button);
732 if (current_button != 0)
733 renderButton(*current_button);
734
735}
699 736