aboutsummaryrefslogtreecommitdiff
path: root/src/Toolbar.cc
diff options
context:
space:
mode:
authorThomas Lübking <thomas.luebking@gmail.com>2016-07-04 19:55:23 (GMT)
committerThomas Lübking <thomas.luebking@gmail.com>2016-08-27 07:36:19 (GMT)
commit2c6647112667109b109e578ffd55ae8409c9e1af (patch)
treedea7cbb288f2eb286ff5cb7a3a5bd70e833572c6 /src/Toolbar.cc
parentecdaab5edf619d3cdc7bba9856d5f92068c28c83 (diff)
downloadfluxbox-2c6647112667109b109e578ffd55ae8409c9e1af.zip
fluxbox-2c6647112667109b109e578ffd55ae8409c9e1af.tar.bz2
Replay toolbar button events
NOTICE!!!! THIS IS HIGHLY EXPERIMENTAL! The patch alters the button grab mode to GrabSync in order to ReplayPointer the event. THIS CAN FREEZE ANY INPUT TO FLUXBOX!!! The toolbar (and other things?) grab buttons in order to handle MouseN events for the entire bar, INCLUDING all child windows. This causes two problems: 1. The bar handles events which are not meant for fluxbox at all (but the systray icons) BUG: 940 2. The bar will intercept (and suck) *every* press, even if only doubleclicks are desired BUG: 949 The problem with this patch is that an oversight here has the potential to completely freeze input event processing in fluxbox (ie. the process needs to be killed from outside), SO IT NEEDS TESTING! As much as possible.
Diffstat (limited to 'src/Toolbar.cc')
-rw-r--r--src/Toolbar.cc30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/Toolbar.cc b/src/Toolbar.cc
index 92ab81a..bfaec94 100644
--- a/src/Toolbar.cc
+++ b/src/Toolbar.cc
@@ -31,6 +31,7 @@
31#include "Keys.hh" 31#include "Keys.hh"
32#include "Screen.hh" 32#include "Screen.hh"
33#include "ScreenPlacement.hh" 33#include "ScreenPlacement.hh"
34#include "SystemTray.hh"
34#include "WindowCmd.hh" 35#include "WindowCmd.hh"
35 36
36#include "Strut.hh" 37#include "Strut.hh"
@@ -512,14 +513,39 @@ void Toolbar::reconfigure() {
512 513
513 514
514void Toolbar::buttonPressEvent(XButtonEvent &be) { 515void Toolbar::buttonPressEvent(XButtonEvent &be) {
516 Display *dpy = Fluxbox::instance()->display();
517 if (be.subwindow) {
518 // Do not intercept mouse events that are meant for the tray icon
519 if (SystemTray::doesControl(be.subwindow)) {
520 XAllowEvents(dpy, ReplayPointer, CurrentTime);
521 return;
522 }
523#if 0
524 // Unfortunately, the subwindow isn't exactly a reliable source here, so
525 // we COULD query the pointer (what will usually return the systray itself) and
526 // check that as well. NOTICE that due to the async nature of X11, the
527 // pointer might have moved and the result isn't correct either.
528 Window wr, wc; int junk; unsigned int ujunk;
529 XQueryPointer(dpy, be.window, &wr, &wc, &junk, &junk, &junk, &junk, &ujunk);
530 if (SystemTray::doesControl(wc)) {
531 XAllowEvents(dpy, ReplayPointer, CurrentTime);
532 return;
533 }
534#endif
535 }
536
515 if (Fluxbox::instance()->keys()->doAction(be.type, be.state, be.button, 537 if (Fluxbox::instance()->keys()->doAction(be.type, be.state, be.button,
516 Keys::ON_TOOLBAR, 0, be.time)) 538 Keys::ON_TOOLBAR, 0, be.time)) {
539 XAllowEvents(dpy, SyncPointer, CurrentTime);
517 return; 540 return;
541 }
518 542
519 if (be.button == 1) 543 if (be.button == 1)
520 raise(); 544 raise();
521 if (be.button != 2) 545 if (be.button != 2 || be.subwindow) { // only handle direct toolbar MMBs
546 XAllowEvents(dpy, ReplayPointer, CurrentTime);
522 return; 547 return;
548 }
523 549
524 screen() 550 screen()
525 .placementStrategy() 551 .placementStrategy()