[vlc-commits] window: allow inhibit the screensaver only in fullscreen

Rémi Denis-Courmont git at videolan.org
Sat Apr 13 18:23:17 CEST 2019


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Apr 13 19:21:59 2019 +0300| [3cfc957bdd50cf3aedb8ae59f802398b93f5e3a7] | committer: Rémi Denis-Courmont

window: allow inhibit the screensaver only in fullscreen

Fixes #8912.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3cfc957bdd50cf3aedb8ae59f802398b93f5e3a7
---

 src/video_output/window.c | 71 +++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 59 insertions(+), 12 deletions(-)

diff --git a/src/video_output/window.c b/src/video_output/window.c
index 4aba087abc..5958a1ccac 100644
--- a/src/video_output/window.c
+++ b/src/video_output/window.c
@@ -41,8 +41,10 @@ typedef struct
     vout_window_t wnd;
     module_t *module;
     vlc_inhibit_t *inhibit;
+    bool inhibit_windowed;
     bool active;
     bool fullscreen;
+    vlc_mutex_t lock;
 } window_t;
 
 static int vout_window_start(void *func, bool forced, va_list ap)
@@ -68,21 +70,31 @@ vout_window_t *vout_window_New(vlc_object_t *obj, const char *module,
     window->sys = NULL;
     assert(owner != NULL);
     window->owner = *owner;
+
+    int dss = var_InheritInteger(obj, "disable-screensaver");
+
+    w->inhibit = NULL;
+    w->inhibit_windowed = dss == 1;
     w->active = false;
     w->fullscreen = false;
+    vlc_mutex_init(&w->lock);
 
     w->module = vlc_module_load(window, "vout window", module, false,
                                 vout_window_start, window);
     if (!w->module) {
+        vlc_mutex_destroy(&w->lock);
         vlc_object_delete(window);
         return NULL;
     }
 
     /* Hook for screensaver inhibition */
-    if (var_InheritInteger(obj, "disable-screensaver"))
-        w->inhibit = vlc_inhibit_Create(VLC_OBJECT(window));
-    else
-        w->inhibit = NULL;
+    if (dss > 0) {
+        vlc_inhibit_t *inh = vlc_inhibit_Create(VLC_OBJECT(window));
+
+        vlc_mutex_lock(&w->lock);
+        w->inhibit = inh;
+        vlc_mutex_unlock(&w->lock);
+    }
     return window;
 }
 
@@ -114,30 +126,60 @@ void vout_window_Delete(vout_window_t *window)
 
     window_t *w = container_of(window, window_t, wnd);
 
-    if (w->inhibit != NULL)
-        vlc_inhibit_Destroy(w->inhibit);
+    if (w->inhibit != NULL) {
+        vlc_inhibit_t *inh = w->inhibit;
+
+        assert(!w->active);
+        vlc_mutex_lock(&w->lock);
+        w->inhibit = NULL;
+        vlc_mutex_unlock(&w->lock);
+
+        vlc_inhibit_Destroy(inh);
+    }
+
     if (window->ops->destroy != NULL)
         window->ops->destroy(window);
+
     vlc_objres_clear(VLC_OBJECT(window));
+    vlc_mutex_destroy(&w->lock);
     vlc_object_delete(window);
 }
 
-void vout_window_SetInhibition(vout_window_t *window, bool enabled)
+static void vout_window_UpdateInhibitionUnlocked(vout_window_t *window)
 {
-    window_t *w = (window_t *)window;
-    unsigned flags = enabled ? VLC_INHIBIT_VIDEO : VLC_INHIBIT_NONE;
+    window_t *w = container_of(window, window_t, wnd);
+    unsigned flags = VLC_INHIBIT_NONE;
 
-    w->active = enabled;
+    vlc_mutex_assert(&w->lock);
 
+    if (w->active && (w->inhibit_windowed || w->fullscreen))
+        flags = VLC_INHIBIT_VIDEO;
     if (w->inhibit != NULL)
         vlc_inhibit_Set(w->inhibit, flags);
 }
 
+void vout_window_SetInhibition(vout_window_t *window, bool enabled)
+{
+    window_t *w = container_of(window, window_t, wnd);
+
+    vlc_mutex_lock(&w->lock);
+    w->active = enabled;
+
+    vout_window_UpdateInhibitionUnlocked(window);
+    vlc_mutex_unlock(&w->lock);
+}
+
 void vout_window_ReportWindowed(vout_window_t *window)
 {
     window_t *w = container_of(window, window_t, wnd);
 
-    w->fullscreen = false;
+    if (!w->inhibit_windowed) {
+        vlc_mutex_lock(&w->lock);
+        w->fullscreen = false;
+
+        vout_window_UpdateInhibitionUnlocked(window);
+        vlc_mutex_unlock(&w->lock);
+    }
 
     if (window->owner.cbs->windowed != NULL)
         window->owner.cbs->windowed(window);
@@ -147,7 +189,12 @@ void vout_window_ReportFullscreen(vout_window_t *window, const char *id)
 {
     window_t *w = container_of(window, window_t, wnd);
 
-    w->fullscreen = true;
+    if (!w->inhibit_windowed) {
+        vlc_mutex_lock(&w->lock);
+        w->fullscreen = true;
+        vout_window_UpdateInhibitionUnlocked(window);
+        vlc_mutex_unlock(&w->lock);
+    }
 
     if (window->owner.cbs->fullscreened != NULL)
         window->owner.cbs->fullscreened(window, id);



More information about the vlc-commits mailing list