diff options
author | Thomas Lübking <thomas.luebking@gmail.com> | 2016-08-14 11:42:27 (GMT) |
---|---|---|
committer | Mathias Gumz <akira@fluxbox.org> | 2016-08-26 06:06:47 (GMT) |
commit | 10a957473803e87f119c363dc19efe92ea938a1d (patch) | |
tree | 42dc0c55521d6a8736e1cde00374e503ca15c3df /src | |
parent | fe8ff8729299a4fd4371394d3ca9102ece22fefb (diff) | |
download | fluxbox-10a957473803e87f119c363dc19efe92ea938a1d.zip fluxbox-10a957473803e87f119c363dc19efe92ea938a1d.tar.bz2 |
Fix autohiding/raising timer logics
Trying to control a timer bound to an unconditional toggle, caused by
opposing events does not work. <- That's a period.
The toolbar implementation would act too seldom, the slit to often.
Instead, fire the timer whenever the state does not match the event and
bind it to a function that queries the pointer position and acts
accordingly.
Diffstat (limited to 'src')
-rw-r--r-- | src/Slit.cc | 74 | ||||
-rw-r--r-- | src/Slit.hh | 1 | ||||
-rw-r--r-- | src/Toolbar.cc | 68 | ||||
-rw-r--r-- | src/Toolbar.hh | 2 |
4 files changed, 67 insertions, 78 deletions
diff --git a/src/Slit.cc b/src/Slit.cc index b628d18..7eb7dea 100644 --- a/src/Slit.cc +++ b/src/Slit.cc | |||
@@ -272,8 +272,8 @@ Slit::Slit(BScreen &scr, FbTk::Layer &layer, const char *filename) | |||
272 | // setup timer | 272 | // setup timer |
273 | m_timer.setTimeout(200L * FbTk::FbTime::IN_MILLISECONDS); // default timeout | 273 | m_timer.setTimeout(200L * FbTk::FbTime::IN_MILLISECONDS); // default timeout |
274 | m_timer.fireOnce(true); | 274 | m_timer.fireOnce(true); |
275 | FbTk::RefCount<FbTk::Command<void> > toggle_hidden(new FbTk::SimpleCommand<Slit>(*this, &Slit::toggleHidden)); | 275 | FbTk::RefCount<FbTk::Command<void> > ucs(new FbTk::SimpleCommand<Slit>(*this, &Slit::updateCrossingState)); |
276 | m_timer.setCommand(toggle_hidden); | 276 | m_timer.setCommand(ucs); |
277 | 277 | ||
278 | 278 | ||
279 | FbTk::EventManager::instance()->add(*this, frame.window); | 279 | FbTk::EventManager::instance()->add(*this, frame.window); |
@@ -958,45 +958,47 @@ void Slit::buttonPressEvent(XButtonEvent &be) { | |||
958 | } | 958 | } |
959 | 959 | ||
960 | 960 | ||
961 | void Slit::enterNotifyEvent(XCrossingEvent &) { | 961 | void Slit::updateCrossingState() { |
962 | if (m_rc_auto_raise) | 962 | Window wr, wc; |
963 | m_layeritem->moveToLayer(ResourceLayer::ABOVE_DOCK); | 963 | int rx, ry, x, y; |
964 | 964 | unsigned int mask; | |
965 | if (! doAutoHide()) | 965 | const int bw = -theme()->borderWidth(); |
966 | return; | 966 | bool hovered = false; |
967 | 967 | if (XQueryPointer(Fluxbox::instance()->display(), window().window(), &wr, &wc, &rx, &ry, &x, &y, &mask)) | |
968 | if (isHidden()) { | 968 | hovered = x >= bw && y >= bw && x < int(width()) && y < int(height()); |
969 | if (! m_timer.isTiming()) | 969 | |
970 | m_timer.start(); | 970 | if (hovered) { |
971 | if (m_rc_auto_raise) | ||
972 | m_layeritem->moveToLayer(ResourceLayer::ABOVE_DOCK); | ||
973 | if (m_rc_auto_hide && isHidden()) | ||
974 | toggleHidden(); | ||
971 | } else { | 975 | } else { |
972 | if (m_timer.isTiming()) | 976 | if (m_rc_auto_hide && !isHidden()) |
973 | m_timer.stop(); | 977 | toggleHidden(); |
978 | if (m_rc_auto_raise) | ||
979 | m_layeritem->moveToLayer(m_rc_layernum->getNum()); | ||
974 | } | 980 | } |
975 | } | 981 | } |
976 | 982 | ||
983 | void Slit::enterNotifyEvent(XCrossingEvent &ce) { | ||
984 | if (!m_rc_auto_hide && isHidden()) { | ||
985 | toggleHidden(); | ||
986 | } | ||
977 | 987 | ||
978 | void Slit::leaveNotifyEvent(XCrossingEvent &ev) { | 988 | if (!m_timer.isTiming() && (m_rc_auto_hide && isHidden()) || |
979 | if (m_rc_auto_raise) | 989 | (m_rc_auto_raise && m_layeritem->getLayerNum() != ResourceLayer::ABOVE_DOCK)) |
980 | m_layeritem->moveToLayer(m_rc_layernum->getNum()); | 990 | m_timer.start(); |
991 | } | ||
981 | 992 | ||
982 | if (! doAutoHide()) | 993 | void Slit::leaveNotifyEvent(XCrossingEvent &event) { |
994 | if (m_slitmenu.isVisible()) | ||
983 | return; | 995 | return; |
984 | 996 | ||
985 | if (isHidden()) { | 997 | if (!m_timer.isTiming() && (m_rc_auto_hide && !isHidden()) || |
986 | if (m_timer.isTiming()) | 998 | (m_rc_auto_raise && m_layeritem->getLayerNum() != m_rc_layernum->getNum())) |
987 | m_timer.stop(); | 999 | m_timer.start(); |
988 | } else { | ||
989 | if (! m_timer.isTiming()) { | ||
990 | // the menu is open, keep it firing until it closes | ||
991 | if (m_slitmenu.isVisible()) | ||
992 | m_timer.fireOnce(false); | ||
993 | m_timer.start(); | ||
994 | } | ||
995 | } | ||
996 | |||
997 | } | 1000 | } |
998 | 1001 | ||
999 | |||
1000 | void Slit::configureRequestEvent(XConfigureRequestEvent &event) { | 1002 | void Slit::configureRequestEvent(XConfigureRequestEvent &event) { |
1001 | bool reconf = false; | 1003 | bool reconf = false; |
1002 | XWindowChanges xwc; | 1004 | XWindowChanges xwc; |
@@ -1050,16 +1052,6 @@ void Slit::clearWindow() { | |||
1050 | } | 1052 | } |
1051 | 1053 | ||
1052 | void Slit::toggleHidden() { | 1054 | void Slit::toggleHidden() { |
1053 | if (doAutoHide()) { | ||
1054 | if (!m_slitmenu.isVisible()) { | ||
1055 | m_timer.fireOnce(true); | ||
1056 | } else { | ||
1057 | return; | ||
1058 | } | ||
1059 | //} else if (!isHidden()) { | ||
1060 | // return; | ||
1061 | } | ||
1062 | |||
1063 | m_hidden = ! m_hidden; // toggle hidden state | 1055 | m_hidden = ! m_hidden; // toggle hidden state |
1064 | if (isHidden()) | 1056 | if (isHidden()) |
1065 | frame.window.move(frame.x_hidden, frame.y_hidden); | 1057 | frame.window.move(frame.x_hidden, frame.y_hidden); |
diff --git a/src/Slit.hh b/src/Slit.hh index 0b476b5..d882309 100644 --- a/src/Slit.hh +++ b/src/Slit.hh | |||
@@ -134,6 +134,7 @@ private: | |||
134 | void screenSizeChanged(BScreen &screen); | 134 | void screenSizeChanged(BScreen &screen); |
135 | 135 | ||
136 | void updateAlpha(); | 136 | void updateAlpha(); |
137 | void updateCrossingState(); | ||
137 | void clearWindow(); | 138 | void clearWindow(); |
138 | void setupMenu(); | 139 | void setupMenu(); |
139 | 140 | ||
diff --git a/src/Toolbar.cc b/src/Toolbar.cc index 23a8244..2920925 100644 --- a/src/Toolbar.cc +++ b/src/Toolbar.cc | |||
@@ -250,8 +250,8 @@ Toolbar::Toolbar(BScreen &scrn, FbTk::Layer &layer, size_t width): | |||
250 | 250 | ||
251 | // setup hide timer | 251 | // setup hide timer |
252 | m_hide_timer.setTimeout(Fluxbox::instance()->getAutoRaiseDelay() * FbTk::FbTime::IN_MILLISECONDS); | 252 | m_hide_timer.setTimeout(Fluxbox::instance()->getAutoRaiseDelay() * FbTk::FbTime::IN_MILLISECONDS); |
253 | FbTk::RefCount<FbTk::Command<void> > toggle_hidden(new FbTk::SimpleCommand<Toolbar>(*this, &Toolbar::toggleHidden)); | 253 | FbTk::RefCount<FbTk::Command<void> > ucs(new FbTk::SimpleCommand<Toolbar>(*this, &Toolbar::updateCrossingState)); |
254 | m_hide_timer.setCommand(toggle_hidden); | 254 | m_hide_timer.setCommand(ucs); |
255 | m_hide_timer.fireOnce(true); | 255 | m_hide_timer.fireOnce(true); |
256 | 256 | ||
257 | 257 | ||
@@ -523,55 +523,49 @@ void Toolbar::buttonPressEvent(XButtonEvent &be) { | |||
523 | .placeAndShowMenu(menu(), be.x_root, be.y_root, false); | 523 | .placeAndShowMenu(menu(), be.x_root, be.y_root, false); |
524 | } | 524 | } |
525 | 525 | ||
526 | void Toolbar::enterNotifyEvent(XCrossingEvent &ce) { | 526 | void Toolbar::updateCrossingState() { |
527 | if (m_rc_auto_raise) | 527 | Window wr, wc; |
528 | m_layeritem.moveToLayer(ResourceLayer::ABOVE_DOCK); | 528 | int rx, ry, x, y; |
529 | 529 | unsigned int mask; | |
530 | Fluxbox::instance()->keys()->doAction(ce.type, ce.state, 0, | 530 | const int bw = -theme()->border().width(); |
531 | Keys::ON_TOOLBAR); | 531 | bool hovered = false; |
532 | 532 | if (XQueryPointer(Fluxbox::instance()->display(), window().window(), &wr, &wc, &rx, &ry, &x, &y, &mask)) | |
533 | if (! doAutoHide()) { | 533 | hovered = x >= bw && y >= bw && x < int(width()) && y < int(height()); |
534 | if (isHidden()) | 534 | if (hovered) { |
535 | if (m_rc_auto_raise) | ||
536 | m_layeritem.moveToLayer(ResourceLayer::ABOVE_DOCK); | ||
537 | if (m_rc_auto_hide && isHidden()) | ||
535 | toggleHidden(); | 538 | toggleHidden(); |
536 | return; | ||
537 | } | ||
538 | |||
539 | if (isHidden()) { | ||
540 | if (! m_hide_timer.isTiming()) | ||
541 | m_hide_timer.start(); | ||
542 | } else { | 539 | } else { |
543 | if (m_hide_timer.isTiming()) | 540 | if (m_rc_auto_hide && !isHidden()) |
544 | m_hide_timer.stop(); | 541 | toggleHidden(); |
542 | if (m_rc_auto_raise) | ||
543 | m_layeritem.moveToLayer(m_rc_layernum->getNum()); | ||
545 | } | 544 | } |
546 | } | 545 | } |
547 | 546 | ||
548 | void Toolbar::leaveNotifyEvent(XCrossingEvent &event) { | 547 | void Toolbar::enterNotifyEvent(XCrossingEvent &ce) { |
548 | Fluxbox::instance()->keys()->doAction(ce.type, ce.state, 0, Keys::ON_TOOLBAR); | ||
549 | 549 | ||
550 | // in autoHide mode we'll receive a leaveNotifyEvent when activating | 550 | if (!m_rc_auto_hide && isHidden()) { |
551 | // the toolbar. so check if we are still inside the toolbar area. | 551 | toggleHidden(); |
552 | // event.subwindow gets != None if we really left the window (eg the Slit | ||
553 | // was entered ontop of the toolbar) | ||
554 | if (event.x_root > x() && event.x_root <= (int)(x() + width()) && | ||
555 | event.y_root > y() && event.y_root <= (int)(y() + height()) && | ||
556 | event.subwindow == None ) { | ||
557 | return; | ||
558 | } | 552 | } |
559 | 553 | ||
560 | if (m_rc_auto_raise) | 554 | if ((m_rc_auto_hide || m_rc_auto_raise) && !m_hide_timer.isTiming()) |
561 | m_layeritem.moveToLayer(m_rc_layernum->getNum()); | 555 | m_hide_timer.start(); |
556 | } | ||
562 | 557 | ||
563 | Fluxbox::instance()->keys()->doAction(event.type, event.state, 0, | 558 | void Toolbar::leaveNotifyEvent(XCrossingEvent &event) { |
564 | Keys::ON_TOOLBAR); | ||
565 | 559 | ||
566 | if (! doAutoHide()) | 560 | if (menu().isVisible()) |
567 | return; | 561 | return; |
568 | 562 | ||
569 | if (isHidden()) { | 563 | if (!m_hide_timer.isTiming() && (m_rc_auto_hide && !isHidden()) || |
570 | if (m_hide_timer.isTiming()) | 564 | (m_rc_auto_raise && m_layeritem.getLayerNum() != m_rc_layernum->getNum())) |
571 | m_hide_timer.stop(); | ||
572 | } else if (! menu().isVisible() && ! m_hide_timer.isTiming()) | ||
573 | m_hide_timer.start(); | 565 | m_hide_timer.start(); |
574 | 566 | ||
567 | if (!isHidden()) | ||
568 | Fluxbox::instance()->keys()->doAction(event.type, event.state, 0, Keys::ON_TOOLBAR); | ||
575 | } | 569 | } |
576 | 570 | ||
577 | 571 | ||
diff --git a/src/Toolbar.hh b/src/Toolbar.hh index 47569f6..c31a85f 100644 --- a/src/Toolbar.hh +++ b/src/Toolbar.hh | |||
@@ -143,6 +143,8 @@ private: | |||
143 | void updateStrut(); | 143 | void updateStrut(); |
144 | void updateAlpha(); | 144 | void updateAlpha(); |
145 | 145 | ||
146 | void updateCrossingState(); | ||
147 | |||
146 | /// Called when the screen changed property. | 148 | /// Called when the screen changed property. |
147 | void screenChanged(BScreen &screen); | 149 | void screenChanged(BScreen &screen); |
148 | 150 | ||