X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_output%2Fsdl.c;h=efebbff04601d404233f822500abf6b8da7dc941;hb=12ade3e3bc975d5426ba4af155b7372c31093b31;hp=a886daf2cdc9ef2da4cf15553d2bde675fd244f7;hpb=f3ad481e8866164ec8b7b3e3f77331d186a791ba;p=vlc diff --git a/modules/video_output/sdl.c b/modules/video_output/sdl.c index a886daf2cd..efebbff046 100644 --- a/modules/video_output/sdl.c +++ b/modules/video_output/sdl.c @@ -38,11 +38,13 @@ #include -#include SDL_INCLUDE_FILE +#include -/* FIXME add a configure check */ -#if !SDL_VERSION_ATLEAST(1,2,10) -# error "Too old SDL" +#ifndef WIN32 +# ifdef X_DISPLAY_MISSING +# error Xlib required due to XInitThreads +# endif +# include #endif /***************************************************************************** @@ -56,10 +58,6 @@ static void Close(vlc_object_t *); "Force the SDL renderer to use a specific chroma format instead of " \ "trying to improve performances by using the most efficient one.") -#define DRIVER_TEXT N_("SDL video driver name") -#define DRIVER_LONGTEXT N_(\ - "Force a specific SDL video output driver.") - vlc_module_begin() set_shortname("SDL") set_category(CAT_VIDEO) @@ -68,13 +66,11 @@ vlc_module_begin() set_capability("vout display", 60) add_shortcut("sdl") add_string("sdl-chroma", NULL, NULL, CHROMA_TEXT, CHROMA_LONGTEXT, true) -#ifdef HAVE_SETENV - add_string("sdl-video-driver", NULL, NULL, DRIVER_TEXT, DRIVER_LONGTEXT, true) -#endif + add_obsolete_string("sdl-video-driver") /* obsolete since 1.1.0 */ set_callbacks(Open, Close) #if defined(__i386__) || defined(__x86_64__) /* On i386, SDL is linked against svgalib */ - linked_with_a_crap_library_which_uses_atexit() + cannot_unload_broken_library() #endif vlc_module_end() @@ -82,10 +78,10 @@ vlc_module_end() /***************************************************************************** * Local prototypes *****************************************************************************/ -static picture_t *Get (vout_display_t *); -static void Display(vout_display_t *, picture_t *); -static int Control(vout_display_t *, int, va_list); -static void Manage(vout_display_t *); +static picture_pool_t *Pool (vout_display_t *, unsigned); +static void PictureDisplay(vout_display_t *, picture_t *); +static int Control(vout_display_t *, int, va_list); +static void Manage(vout_display_t *); /* */ static int ConvertKey(SDLKey); @@ -120,6 +116,11 @@ static int Open(vlc_object_t *object) vout_display_t *vd = (vout_display_t *)object; vout_display_sys_t *sys; +#ifndef WIN32 + if (!vlc_xlib_init (object)) + return VLC_EGENERIC; +#endif + /* XXX: check for conflicts with the SDL audio output */ vlc_mutex_lock(&sdl_lock); @@ -135,14 +136,6 @@ static int Open(vlc_object_t *object) return VLC_ENOMEM; } -#ifdef HAVE_SETENV - char *psz_driver = var_CreateGetNonEmptyString(vd, "sdl-video-driver"); - if (psz_driver) { - setenv("SDL_VIDEODRIVER", psz_driver, 1); - free(psz_driver); - } -#endif - /* */ int sdl_flags = SDL_INIT_VIDEO; #ifndef WIN32 @@ -199,6 +192,7 @@ static int Open(vlc_object_t *object) msg_Err(vd, "no video mode available"); goto error; } + vout_display_DeleteWindow(vd, NULL); sys->display = SDL_SetVideoMode(display_width, display_height, sys->display_bpp, sys->display_flags); @@ -342,14 +336,14 @@ static int Open(vlc_object_t *object) vd->fmt = fmt; vd->info = info; - vd->get = Get; + vd->pool = Pool; vd->prepare = NULL; - vd->display = Display; + vd->display = PictureDisplay; vd->control = Control; vd->manage = Manage; /* */ - vout_display_SendEventDisplaySize(vd, display_width, display_height); + vout_display_SendEventDisplaySize(vd, display_width, display_height, vd->cfg->is_fullscreen); return VLC_SUCCESS; error: @@ -394,11 +388,12 @@ static void Close(vlc_object_t *object) } /** - * Return a direct buffer + * Return a pool of direct buffers */ -static picture_t *Get(vout_display_t *vd) +static picture_pool_t *Pool(vout_display_t *vd, unsigned count) { vout_display_sys_t *sys = vd->sys; + VLC_UNUSED(count); if (!sys->pool) { picture_resource_t rsc; @@ -435,17 +430,15 @@ static picture_t *Get(vout_display_t *vd) return NULL; sys->pool = picture_pool_New(1, &picture); - if (!sys->pool) - return NULL; } - return picture_pool_Get(sys->pool); + return sys->pool; } /** * Display a picture */ -static void Display(vout_display_t *vd, picture_t *p_pic) +static void PictureDisplay(vout_display_t *vd, picture_t *p_pic) { vout_display_sys_t *sys = vd->sys; @@ -517,7 +510,7 @@ static int Control(vout_display_t *vd, int query, va_list args) vout_display_PlacePicture(&sys->place, &vd->source, &cfg, !sys->overlay); } - vout_display_SendEventDisplaySize(vd, cfg.display.width, cfg.display.height); + vout_display_SendEventDisplaySize(vd, cfg.display.width, cfg.display.height, cfg.is_fullscreen); return VLC_SUCCESS; } case VOUT_DISPLAY_CHANGE_ZOOM: @@ -562,7 +555,7 @@ static int Control(vout_display_t *vd, int query, va_list args) } case VOUT_DISPLAY_CHANGE_SOURCE_CROP: - case VOUT_DISPLAY_CHANGE_ON_TOP: + case VOUT_DISPLAY_CHANGE_WINDOW_STATE: /* I don't think it is possible to support with SDL: * - crop * - on top @@ -650,14 +643,12 @@ static void Manage(vout_display_t *vd) const int y = (int64_t)(event.motion.y - sys->place.y) * vd->source.i_height / sys->place.height; SDL_ShowCursor(1); - if (x >= 0 && (unsigned)x < vd->source.i_width && - y >= 0 && (unsigned)y < vd->source.i_height) - vout_display_SendEventMouseMoved(vd, x, y); + vout_display_SendEventMouseMoved(vd, x, y); break; } case SDL_VIDEORESIZE: - vout_display_SendEventDisplaySize(vd, event.resize.w, event.resize.h); + vout_display_SendEventDisplaySize(vd, event.resize.w, event.resize.h, vd->cfg->is_fullscreen); break; default: @@ -687,7 +678,7 @@ static const struct { { SDLK_RETURN, KEY_ENTER }, { SDLK_KP_ENTER, KEY_ENTER }, - { SDLK_SPACE, KEY_SPACE }, + { SDLK_SPACE, ' ' }, { SDLK_ESCAPE, KEY_ESC }, { SDLK_MENU, KEY_MENU },