]> git.sesse.net Git - vlc/blobdiff - src/video_output/window.c
Add a window variable to select the window provider
[vlc] / src / video_output / window.c
index 0d769a0ed108e1216b7ec6afc8a32b41e4ffff0b..a8ef7976076f7d2dcf94f2cf232354dc60e47f7d 100644 (file)
 #include <assert.h>
 
 #include <vlc_common.h>
-#include <vlc_plugin.h>
 #include <vlc_vout_window.h>
+#include "inhibit.h"
+#include <libvlc.h>
+
+typedef struct
+{
+    vout_window_t wnd;
+    module_t *module;
+    vlc_inhibit_t *inhibit;
+} window_t;
 
 vout_window_t *vout_window_New(vlc_object_t *obj,
                                const char *module,
                                const vout_window_cfg_t *cfg)
 {
-    vout_window_t *window = vlc_object_create(obj, sizeof(*window));
+    static char const name[] = "window";
+    window_t *w = vlc_custom_create(obj, sizeof(*w), VLC_OBJECT_GENERIC, name);
+    vout_window_t *window = &w->wnd;
 
     window->cfg = cfg;
     memset(&window->handle, 0, sizeof(window->handle));
@@ -48,23 +58,37 @@ vout_window_t *vout_window_New(vlc_object_t *obj,
 
     const char *type;
     switch (cfg->type) {
+#ifdef WIN32
     case VOUT_WINDOW_TYPE_HWND:
         type = "vout window hwnd";
+        window->handle.hwnd = NULL;
         break;
+#endif
     case VOUT_WINDOW_TYPE_XID:
         type = "vout window xid";
+        window->handle.xid = 0;
+        window->display.x11 = NULL;
         break;
     default:
         assert(0);
     }
 
-    window->module = module_need(window, type,
-                                 module, module && *module != '\0');
-    if (!window->module) {
-        vlc_object_detach(window);
+    w->module = module_need(window, type, module, module && *module != '\0');
+    if (!w->module) {
         vlc_object_release(window);
         return NULL;
     }
+
+    /* Hook for screensaver inhibition */
+    if ( var_InheritBool( obj, "disable-screensaver" ) && cfg->type == VOUT_WINDOW_TYPE_XID) {
+        w->inhibit = vlc_inhibit_Create (VLC_OBJECT (window),
+                                         window->handle.xid);
+        if (w->inhibit != NULL)
+            vlc_inhibit_Set (w->inhibit, true);
+            /* FIXME: ^ wait for vout activation, pause */
+    }
+    else
+        w->inhibit = NULL;
     return window;
 }
 
@@ -73,9 +97,11 @@ void vout_window_Delete(vout_window_t *window)
     if (!window)
         return;
 
-    vlc_object_detach(window);
+    window_t *w = (window_t *)window;
+    if (w->inhibit)
+        vlc_inhibit_Destroy (w->inhibit);
 
-    module_unneed(window, window->module);
+    module_unneed(window, w->module);
 
     vlc_object_release(window);
 }