[vlc-devel] [PATCH] vout: win32: add a module to handle the inhibit mode

Steve Lhomme robux4 at ycbcr.xyz
Wed Jan 17 17:10:24 CET 2018


Inhibit the screensaver when the player is running, and restore the original
when paused or stopped.

Similar to what is done on XWindows.

Fixes #19463
---
 modules/video_output/Makefile.am     |  5 +++
 modules/video_output/win32/events.c  |  4 --
 modules/video_output/win32/inhibit.c | 71 ++++++++++++++++++++++++++++++++++++
 src/video_output/window.c            |  3 +-
 4 files changed, 78 insertions(+), 5 deletions(-)
 create mode 100644 modules/video_output/win32/inhibit.c

diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am
index 1a80c5a14e..2361549ed4 100644
--- a/modules/video_output/Makefile.am
+++ b/modules/video_output/Makefile.am
@@ -334,6 +334,11 @@ if HAVE_WIN32_DESKTOP
 vout_LTLIBRARIES += libwingdi_plugin.la
 endif
 
+libwinhibit_plugin_la_SOURCES = video_output/win32/inhibit.c
+if HAVE_WIN32_DESKTOP
+vout_LTLIBRARIES += libwinhibit_plugin.la
+endif
+
 libegl_win32_plugin_la_SOURCES = video_output/opengl/egl.c
 libegl_win32_plugin_la_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_PLATFORM_WIN32=1
 libegl_win32_plugin_la_CFLAGS = $(AM_CFLAGS) $(EGL_CFLAGS)
diff --git a/modules/video_output/win32/events.c b/modules/video_output/win32/events.c
index c13c9dbd80..cea69d95e8 100644
--- a/modules/video_output/win32/events.c
+++ b/modules/video_output/win32/events.c
@@ -188,10 +188,6 @@ static void *EventThread( void *p_this )
         return NULL;
     }
 
-    /* Prevent monitor from powering off */
-    if (var_GetBool(vd, "disable-screensaver"))
-        SetThreadExecutionState( ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED | ES_CONTINUOUS );
-
     /* Main loop */
     /* GetMessage will sleep if there's no message in the queue */
     for( ;; )
diff --git a/modules/video_output/win32/inhibit.c b/modules/video_output/win32/inhibit.c
new file mode 100644
index 0000000000..67944c9235
--- /dev/null
+++ b/modules/video_output/win32/inhibit.c
@@ -0,0 +1,71 @@
+/*****************************************************************************
+ * inhibit.c: Windows video output common code
+ *****************************************************************************
+ * Copyright (C) 2018 VLC authors and VideoLAN
+ *
+ * Authors: Steve Lhomme <robux4 at ycbcr.xyz>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_inhibit.h>
+#include <vlc_plugin.h>
+
+struct vlc_inhibit_sys
+{
+    EXECUTION_STATE  prev_state;
+};
+
+static void Inhibit (vlc_inhibit_t *ih, unsigned mask)
+{
+    vlc_inhibit_sys_t *sys = ih->p_sys;
+    bool suspend = (mask & VLC_INHIBIT_DISPLAY) != 0;
+    if (suspend)
+        /* Prevent monitor from powering off */
+        sys->prev_state =
+                SetThreadExecutionState( ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED | ES_CONTINUOUS );
+    else
+        SetThreadExecutionState( sys->prev_state );
+}
+
+int OpenInhibit (vlc_object_t *obj)
+{
+    vlc_inhibit_t *ih = (vlc_inhibit_t *)obj;
+    ih->p_sys = vlc_obj_malloc(obj, sizeof(vlc_inhibit_sys_t));
+    if (unlikely(ih->p_sys == NULL))
+        return VLC_ENOMEM;
+
+    ih->inhibit = Inhibit;
+    return VLC_SUCCESS;
+}
+
+void CloseInhibit (vlc_object_t *obj)
+{
+    VLC_UNUSED(obj);
+}
+
+vlc_module_begin ()
+    set_shortname (N_("Windows screensaver"))
+    set_description (N_("Windows screen saver inhibition"))
+    set_category (CAT_ADVANCED)
+    set_subcategory (SUBCAT_ADVANCED_MISC)
+    set_capability ("inhibit", 10)
+    set_callbacks (OpenInhibit, CloseInhibit)
+vlc_module_end ()
diff --git a/src/video_output/window.c b/src/video_output/window.c
index c5e8bef33b..0eb055a47f 100644
--- a/src/video_output/window.c
+++ b/src/video_output/window.c
@@ -78,7 +78,8 @@ vout_window_t *vout_window_New(vlc_object_t *obj, const char *module,
 
     /* Hook for screensaver inhibition */
     if (var_InheritBool(obj, "disable-screensaver") &&
-        window->type == VOUT_WINDOW_TYPE_XID) {
+        (window->type == VOUT_WINDOW_TYPE_XID || window->type == VOUT_WINDOW_TYPE_HWND))
+    {
         w->inhibit = vlc_inhibit_Create(VLC_OBJECT (window));
         if (w->inhibit != NULL)
             vlc_inhibit_Set(w->inhibit, VLC_INHIBIT_VIDEO);
-- 
2.14.2



More information about the vlc-devel mailing list