diff options
-rw-r--r-- | src/IconbarTool.cc | 57 | ||||
-rw-r--r-- | src/IconbarTool.hh | 8 |
2 files changed, 53 insertions, 12 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 | ||
480 | void IconbarTool::renderWindow(FluxboxWindow &win) { | 492 | IconButton *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)); | 504 | void IconbarTool::renderWindow(FluxboxWindow &win) { |
505 | IconButton *button = findButton(win); | ||
506 | if (button == 0) | ||
507 | return; | ||
508 | renderButton(*button); | ||
493 | } | 509 | } |
494 | 510 | ||
495 | void IconbarTool::renderTheme() { | 511 | void 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 | ||
719 | void 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 | ||
diff --git a/src/IconbarTool.hh b/src/IconbarTool.hh index d60d14b..0f2574e 100644 --- a/src/IconbarTool.hh +++ b/src/IconbarTool.hh | |||
@@ -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.hh,v 1.11 2003/12/12 14:36:22 fluxgen Exp $ | 23 | // $Id: IconbarTool.hh,v 1.12 2003/12/19 14:57:44 fluxgen Exp $ |
24 | 24 | ||
25 | #ifndef ICONBARTOOL_HH | 25 | #ifndef ICONBARTOOL_HH |
26 | #define ICONBARTOOL_HH | 26 | #define ICONBARTOOL_HH |
@@ -76,6 +76,8 @@ public: | |||
76 | Mode mode() const { return *m_rc_mode; } | 76 | Mode mode() const { return *m_rc_mode; } |
77 | Container::Alignment alignment() const { return m_icon_container.alignment(); } | 77 | Container::Alignment alignment() const { return m_icon_container.alignment(); } |
78 | private: | 78 | private: |
79 | /// @return button associated with window | ||
80 | IconButton *findButton(FluxboxWindow &win); | ||
79 | 81 | ||
80 | /// render single button that holds win | 82 | /// render single button that holds win |
81 | void renderWindow(FluxboxWindow &win); | 83 | void renderWindow(FluxboxWindow &win); |
@@ -97,6 +99,8 @@ private: | |||
97 | void updateAllWindows(); | 99 | void updateAllWindows(); |
98 | /// add a list of windows | 100 | /// add a list of windows |
99 | void addList(std::list<FluxboxWindow *> &winlist); | 101 | void addList(std::list<FluxboxWindow *> &winlist); |
102 | /// so we can update current window without flicker | ||
103 | void timedRender(); | ||
100 | 104 | ||
101 | BScreen &m_screen; | 105 | BScreen &m_screen; |
102 | Container m_icon_container; | 106 | Container m_icon_container; |
@@ -111,7 +115,7 @@ private: | |||
111 | FbTk::Resource<Container::Alignment> m_rc_alignment; ///< alignment of buttons | 115 | FbTk::Resource<Container::Alignment> m_rc_alignment; ///< alignment of buttons |
112 | FbTk::Resource<int> m_rc_client_width; ///< size of client button in LEFT/RIGHT mode | 116 | FbTk::Resource<int> m_rc_client_width; ///< size of client button in LEFT/RIGHT mode |
113 | FbTk::Resource<bool> m_rc_use_pixmap; ///< if iconbar should use win pixmap or not | 117 | FbTk::Resource<bool> m_rc_use_pixmap; ///< if iconbar should use win pixmap or not |
114 | 118 | FbTk::Timer m_focus_timer; ///< so we can update current window without flicker while changing attached clients | |
115 | FbMenu m_menu; | 119 | FbMenu m_menu; |
116 | }; | 120 | }; |
117 | 121 | ||