X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fwindow.c;h=a8ef7976076f7d2dcf94f2cf232354dc60e47f7d;hb=c75fafe4ec348154a6e07c324dbe62c1c23a7149;hp=de464d3a1b3341f5c8e1ceb1245c399d8866d8fc;hpb=a82db287f874c9909ff221b1c30c7ed6655ad649;p=vlc diff --git a/src/video_output/window.c b/src/video_output/window.c index de464d3a1b..a8ef797607 100644 --- a/src/video_output/window.c +++ b/src/video_output/window.c @@ -30,14 +30,24 @@ #include #include -#include #include +#include "inhibit.h" +#include + +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)); @@ -46,13 +56,39 @@ vout_window_t *vout_window_New(vlc_object_t *obj, vlc_object_attach(window, obj); - window->module = module_need(window, "vout window", - module, module && *module != '\0'); - if (!window->module) { - vlc_object_detach(window); + 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); + } + + 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; } @@ -61,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); }