X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fvideo_output%2Fwindow.c;h=b351936e989518fd27d8e58c0abc1bfcfcc6ed93;hb=6d5336200143e6d1ad70ef653c72265d25f67640;hp=7fb66141f130b245ff7904ca81e685a684960c16;hpb=198f89545ba90685c91e6eba13b59b21b547fca4;p=vlc diff --git a/src/video_output/window.c b/src/video_output/window.c index 7fb66141f1..b351936e98 100644 --- a/src/video_output/window.c +++ b/src/video_output/window.c @@ -6,19 +6,19 @@ * * Authors: Laurent Aimar * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * 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 General Public License for more details. + * 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 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. + * 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. *****************************************************************************/ /***************************************************************************** @@ -31,6 +31,7 @@ #include #include +#include #include "inhibit.h" #include @@ -41,51 +42,77 @@ typedef struct vlc_inhibit_t *inhibit; } window_t; +static int vout_window_start(void *func, va_list ap) +{ + int (*activate)(vout_window_t *, const vout_window_cfg_t *) = func; + vout_window_t *wnd = va_arg(ap, vout_window_t *); + const vout_window_cfg_t *cfg = va_arg(ap, const vout_window_cfg_t *); + + return activate(wnd, cfg); +} + vout_window_t *vout_window_New(vlc_object_t *obj, const char *module, const vout_window_cfg_t *cfg) { - static char const name[] = "window"; - window_t *w = vlc_custom_create(obj, sizeof(*w), VLC_OBJECT_GENERIC, name); + window_t *w = vlc_custom_create(obj, sizeof(*w), "window"); vout_window_t *window = &w->wnd; - window->cfg = cfg; memset(&window->handle, 0, sizeof(window->handle)); window->control = NULL; window->sys = NULL; - vlc_object_attach(window, obj); - const char *type; switch (cfg->type) { +#if defined(_WIN32) || defined(__OS2__) case VOUT_WINDOW_TYPE_HWND: type = "vout window hwnd"; + window->handle.hwnd = NULL; + break; +#endif +#ifdef __APPLE__ + case VOUT_WINDOW_TYPE_NSOBJECT: + type = "vout window nsobject"; + window->handle.nsobject = 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'); + w->module = vlc_module_load(window, type, module, module && *module, + vout_window_start, window, cfg); if (!w->module) { - vlc_object_detach(window); vlc_object_release(window); return NULL; } /* Hook for screensaver inhibition */ - if (cfg->type == VOUT_WINDOW_TYPE_XID) { - w->inhibit = vlc_inhibit_Create (VLC_OBJECT (window), - window->handle.xid); + if (var_InheritBool(obj, "disable-screensaver") && + cfg->type == VOUT_WINDOW_TYPE_XID) { + w->inhibit = vlc_inhibit_Create(VLC_OBJECT (window)); if (w->inhibit != NULL) - vlc_inhibit_Set (w->inhibit, true); + vlc_inhibit_Set(w->inhibit, VLC_INHIBIT_VIDEO); /* FIXME: ^ wait for vout activation, pause */ } + else + w->inhibit = NULL; return window; } +static void vout_window_stop(void *func, va_list ap) +{ + int (*deactivate)(vout_window_t *) = func; + vout_window_t *wnd = va_arg(ap, vout_window_t *); + + deactivate(wnd); +} + void vout_window_Delete(vout_window_t *window) { if (!window) @@ -93,11 +120,12 @@ void vout_window_Delete(vout_window_t *window) window_t *w = (window_t *)window; if (w->inhibit) + { + vlc_inhibit_Set (w->inhibit, VLC_INHIBIT_NONE); vlc_inhibit_Destroy (w->inhibit); - vlc_object_detach(window); - - module_unneed(window, w->module); + } + vlc_module_unload(w->module, vout_window_stop, window); vlc_object_release(window); }