[frameworks] Hide cursor when tablet pen leaves proximity of the screen
Review Request #128858 - Created Sept. 7, 2016 and updated
I am trying to fix the following papercut: I regularly write on pdf files in presentation mode, using the pen that comes with my Lenovo ThinkPad Yoga. When I approach the screen with the pen, the cursor appears, and it follows the pen tip during writing. When I lift off the pen, the cursor stays on, and auto-hides only a few seconds later (because of Okular::Settings::EnumSlidesCursor::HiddenDelay). As a consequence, the cursor frequently hides the last bits of what I have just written. This is a nuisance, because I do this in front of an audience, and a lot of it is math (where every detail matters).
Ideally, the cursor would auto-hide when I lift the pen off the screen. Luckily, Qt has an event for this: QEvent::TabletLeaveProximity. Unluckily, the documentation says (http://doc.qt.io/qt-5/qtabletevent.html):
"TabletEnterProximity and TabletLeaveProximity events [...] are only sent to QApplication"
Therefore, this patch introduces a new class TabletApplication, which inherits from QApplication, and is used in main.cpp instead of QApplication. The proximity events are really caught, and each time a short note is printed on the console.
Unfortunately, at this point I am stuck and need some help. Apparently, I cannot control the cursor from a QApplication. How do I get the information that a TabletProximity has been caught to the presentation widget? Maybe the answer is trivial, but I have very little Qt programming experience. Thanks for your help!
maybe try with installEventFilter(qApp) in the presentation widget, override eventFilter() and check for the tablet events in PresentationWidget and call setCursor(Qt::BlankCursor) and unsetCursor().
you could also call setOverrideCursor() and unsetOverrideCursor() in your custom QApplication, but then it's tricky to track when the presentation widget is used and I'd prefer not having a new application class just for this.
I had to add code to the mouseMoveEvent class, to make the arrow cursor appear when the mouse is moved.
Otherwise, after a TabletLeaveProximity event causes the cursor to disappear, moving the mouse will
ot make it reappear. I don't think my solution is very elegant. Do you guys know a better way
You're changing the cursor behinds KCursor back, i guess it doesn't like it
KCursor::setAutoHideCursor( this, false );
when setting the cursor to cross and then
KCursor::setHideCursorDelay( 0 );
KCursor::setAutoHideCursor( this, true );
KCursor::setHideCursorDelay( 3000 );
or some variant of that