From 01e73abe88e8dafa789c09e6b18d1c846a5b2fc7 Mon Sep 17 00:00:00 2001 From: phintuka Date: Fri, 17 Feb 2012 09:23:22 +0000 Subject: Fixed hiding mouse cursor (Thanks to Roland Scheidegger) The cursor never disappears because there seem to be incoming xshm completion events every frame (for these events to arrive it is not necessary to actually have xshm support compiled into vdr-sxfe), so there's never a poll timeout and as a consequence the mousecursor timeout never expires. --- xine_sxfe_frontend.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/xine_sxfe_frontend.c b/xine_sxfe_frontend.c index 7bbd4385..90983dd3 100644 --- a/xine_sxfe_frontend.c +++ b/xine_sxfe_frontend.c @@ -4,7 +4,7 @@ * See the main source file 'xineliboutput.c' for copyright information and * how to reach the author. * - * $Id: xine_sxfe_frontend.c,v 1.200 2012-02-17 07:44:25 phintuka Exp $ + * $Id: xine_sxfe_frontend.c,v 1.201 2012-02-17 09:23:22 phintuka Exp $ * */ @@ -61,6 +61,7 @@ #endif #include "tools/rle.h" +#include "tools/time_ms.h" #ifndef WIN_LAYER_NORMAL #define WIN_LAYER_NORMAL 4 @@ -2828,6 +2829,18 @@ static void XButtonEvent_handler(sxfe_t *this, XButtonEvent *bev) * * - main X event loop */ + +static void check_mouse_cursor_hide(sxfe_t *this, int64_t elapsed) +{ + if (elapsed > 0 && elapsed < 500) { + this->mousecursor_timeout -= elapsed; + if (this->mousecursor_timeout <= 0) { + // hide Cursor + set_cursor(this->display, this->window[this->fullscreen ? 1 : 0], 0); + } + } +} + static int sxfe_run(frontend_t *this_gen) { sxfe_t *this = (sxfe_t*)this_gen; @@ -2838,24 +2851,29 @@ static int sxfe_run(frontend_t *this_gen) * watchdog to emergency exit ... */ if (! XPending(this->display)) { + uint64_t poll_time = 0; const int poll_timeout = 50; struct pollfd pfd = { .fd = ConnectionNumber(this->display), .events = POLLIN, }; + + if (this->mousecursor_timeout > 0) { + poll_time = time_ms(); + } + if (poll(&pfd, 1, poll_timeout) < 1 || !(pfd.revents & POLLIN)) { - // timeout expired? if (this->mousecursor_timeout > 0) { - this->mousecursor_timeout -= poll_timeout; - if (this->mousecursor_timeout <= 0) { - // hide Cursor - set_cursor(this->display, this->window[this->fullscreen ? 1 : 0], 0); - } + check_mouse_cursor_hide(this, poll_timeout); } return !this->x.fe.xine_is_finished((frontend_t*)this, 0); } + + if (poll_time) { + check_mouse_cursor_hide(this, elapsed(poll_time)); + } } while (XPending(this->display) > 0) { -- cgit v1.2.3