From cecbd8864ec9e03f8fc14f0a92bead310de946a9 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sun, 8 Sep 2013 02:46:19 +0200 Subject: mplayer: add --cursor-autohide-fs-only option This option makes the cursor always visible in windowed mode. Apparently, this is what (some?) Windows and OSX users expect. It's disabled by default for now. Restructure the cursor hide logic a bit for this purpose. --- DOCS/man/en/options.rst | 5 +++++ mpvcore/mp_core.h | 2 +- mpvcore/mplayer.c | 41 +++++++++++++++++++++++------------------ mpvcore/options.c | 1 + mpvcore/options.h | 1 + 5 files changed, 31 insertions(+), 19 deletions(-) diff --git a/DOCS/man/en/options.rst b/DOCS/man/en/options.rst index 46b894f931..81fee482af 100644 --- a/DOCS/man/en/options.rst +++ b/DOCS/man/en/options.rst @@ -566,6 +566,11 @@ ``no`` will disable cursor autohide. ``always`` means the cursor will stay hidden. +``--cursor-autohide-fs-only`` + If this option is given, the cursor is always visible in windowed mode. In + fullscreen mode, the cursor is shown or hidden according to + ``--cursor-autohide``. + ``--audio-delay=`` Audio delay in seconds (positive or negative float value). Negative values delay the audio, and positive values delay the video. diff --git a/mpvcore/mp_core.h b/mpvcore/mp_core.h index cb426425b1..777e04945a 100644 --- a/mpvcore/mp_core.h +++ b/mpvcore/mp_core.h @@ -246,7 +246,7 @@ typedef struct MPContext { double mouse_timer; unsigned int mouse_event_ts; - int mouse_waiting_hide; + bool mouse_cursor_visible; // used to prevent hanging in some error cases double start_timestamp; diff --git a/mpvcore/mplayer.c b/mpvcore/mplayer.c index 3a2b65b31c..c9b51c8272 100644 --- a/mpvcore/mplayer.c +++ b/mpvcore/mplayer.c @@ -2402,10 +2402,7 @@ int reinit_video_chain(struct MPContext *mpctx) "the selected video_out (-vo) device.\n"); goto err_out; } - if (opts->cursor_autohide_delay != -1) { - vo_control(mpctx->video_out, VOCTRL_SET_CURSOR_VISIBILITY, - &(bool){false}); - } + mpctx->mouse_cursor_visible = true; mpctx->initialized_flags |= INITIALIZED_VO; } @@ -3454,25 +3451,33 @@ static void run_playloop(struct MPContext *mpctx) // ================================================================ vo_check_events(vo); + bool mouse_cursor_visible = mpctx->mouse_cursor_visible; + if (opts->cursor_autohide_delay == -1) + mouse_cursor_visible = true; + unsigned mouse_event_ts = mp_input_get_mouse_event_counter(mpctx->input); if (mpctx->mouse_event_ts != mouse_event_ts) { mpctx->mouse_event_ts = mouse_event_ts; - if (opts->cursor_autohide_delay > -1) { - vo_control(vo, VOCTRL_SET_CURSOR_VISIBILITY, &(bool){true}); - if (opts->cursor_autohide_delay >= 0) { - mpctx->mouse_waiting_hide = 1; - mpctx->mouse_timer = - mp_time_sec() + opts->cursor_autohide_delay / 1000.0; - } - } + mpctx->mouse_timer = + mp_time_sec() + opts->cursor_autohide_delay / 1000.0; + mouse_cursor_visible = true; } - if (mpctx->mouse_waiting_hide == 1 && - mp_time_sec() >= mpctx->mouse_timer) - { - vo_control(vo, VOCTRL_SET_CURSOR_VISIBILITY, &(bool){false}); - mpctx->mouse_waiting_hide = 2; - } + if (mp_time_sec() >= mpctx->mouse_timer) + mouse_cursor_visible = false; + + if (opts->cursor_autohide_delay == -1) + mouse_cursor_visible = true; + + if (opts->cursor_autohide_delay == -2) + mouse_cursor_visible = false; + + if (opts->cursor_autohide_fs && !opts->vo.fullscreen) + mouse_cursor_visible = true; + + if (mouse_cursor_visible != mpctx->mouse_cursor_visible) + vo_control(vo, VOCTRL_SET_CURSOR_VISIBILITY, &mouse_cursor_visible); + mpctx->mouse_cursor_visible = mouse_cursor_visible; if (opts->heartbeat_cmd) { double now = mp_time_sec(); diff --git a/mpvcore/options.c b/mpvcore/options.c index 9f87186066..cf09702dcb 100644 --- a/mpvcore/options.c +++ b/mpvcore/options.c @@ -606,6 +606,7 @@ const m_option_t mp_opts[] = { OPT_CHOICE_OR_INT("cursor-autohide", cursor_autohide_delay, 0, 0, 30000, ({"no", -1}, {"always", -2})), + OPT_FLAG("cursor-autohide-fs-only", cursor_autohide_fs, 0), OPT_FLAG("stop-screensaver", stop_screensaver, 0), OPT_INT64("wid", vo.WinID, CONF_GLOBAL), diff --git a/mpvcore/options.h b/mpvcore/options.h index a0fe23f050..25ff391615 100644 --- a/mpvcore/options.h +++ b/mpvcore/options.h @@ -69,6 +69,7 @@ typedef struct MPOpts { int stop_screensaver; int cursor_autohide_delay; + int cursor_autohide_fs; int requested_colorspace; int requested_input_range; -- cgit v1.2.3