X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_output%2Fios2.m;h=6939d2e476b8b17c3878a1358e92255917431f92;hb=2312578206b8539bac215ad7c747d61dd742dccd;hp=46c8aca5f97bef8d512fc6594947ab49b8705df0;hpb=26d1937b70a0c9dcf444bf2d7b490d6a43db0a09;p=vlc diff --git a/modules/video_output/ios2.m b/modules/video_output/ios2.m index 46c8aca5f9..6939d2e476 100644 --- a/modules/video_output/ios2.m +++ b/modules/video_output/ios2.m @@ -1,7 +1,7 @@ /***************************************************************************** * ios2.m: iOS OpenGL ES 2 provider ***************************************************************************** - * Copyright (C) 2001-2013 VLC authors and VideoLAN + * Copyright (C) 2001-2014 VLC authors and VideoLAN * $Id$ * * Authors: Pierre d'Herbemont @@ -100,6 +100,7 @@ struct vout_display_sys_t { VLCOpenGLES2VideoView *glESView; UIView* viewContainer; + UITapGestureRecognizer *tapRecognizer; vlc_gl_t gl; vout_display_opengl_t *vgl; @@ -151,7 +152,21 @@ static int Open(vlc_object_t *this) [sys->glESView setVoutDisplay:vd]; - [sys->viewContainer performSelectorOnMainThread:@selector(addSubview:) withObject:sys->glESView waitUntilDone:YES]; + [sys->viewContainer performSelectorOnMainThread:@selector(addSubview:) + withObject:sys->glESView + waitUntilDone:YES]; + + /* add tap gesture recognizer for DVD menus and stuff */ + sys->tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:sys->glESView + action:@selector(tapRecognized:)]; + sys->tapRecognizer.numberOfTapsRequired = 2; + if (sys->viewContainer.window) { + if (sys->viewContainer.window.rootViewController) { + if (sys->viewContainer.window.rootViewController.view) + [sys->viewContainer.superview addGestureRecognizer:sys->tapRecognizer]; + } + } + sys->tapRecognizer.cancelsTouchesInView = NO; /* Initialize common OpenGL video display */ sys->gl.lock = OpenglESClean; @@ -162,7 +177,7 @@ static int Open(vlc_object_t *this) const vlc_fourcc_t *subpicture_chromas; video_format_t fmt = vd->fmt; - sys->vgl = vout_display_opengl_New (&vd->fmt, &subpicture_chromas, &sys->gl); + sys->vgl = vout_display_opengl_New(&vd->fmt, &subpicture_chromas, &sys->gl); if (!sys->vgl) { sys->gl.sys = NULL; goto bailout; @@ -173,6 +188,7 @@ static int Open(vlc_object_t *this) info.has_pictures_invalid = false; info.has_event_thread = true; info.subpicture_chromas = subpicture_chromas; + info.has_hide_mouse = false; /* Setup vout_display_t once everything is fine */ vd->info = info; @@ -182,10 +198,23 @@ static int Open(vlc_object_t *this) vd->display = PictureDisplay; vd->control = Control; + /* forward our dimensions to the vout core */ + CGSize viewSize = sys->viewContainer.frame.size; + vout_display_SendEventFullscreen(vd, false); + vout_display_SendEventDisplaySize(vd, (int)viewSize.width, (int)viewSize.height, false); + /* */ - [[NSNotificationCenter defaultCenter] addObserver:sys->glESView selector:@selector(applicationStateChanged:) name:UIApplicationWillResignActiveNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:sys->glESView selector:@selector(applicationStateChanged:) name:UIApplicationDidBecomeActiveNotification object:nil]; - [sys->glESView performSelectorOnMainThread:@selector(reshape) withObject:nil waitUntilDone:YES]; + [[NSNotificationCenter defaultCenter] addObserver:sys->glESView + selector:@selector(applicationStateChanged:) + name:UIApplicationWillResignActiveNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:sys->glESView + selector:@selector(applicationStateChanged:) + name:UIApplicationDidBecomeActiveNotification + object:nil]; + [sys->glESView performSelectorOnMainThread:@selector(reshape) + withObject:nil + waitUntilDone:YES]; [autoreleasePool release]; return VLC_SUCCESS; @@ -201,6 +230,11 @@ void Close (vlc_object_t *this) vout_display_t *vd = (vout_display_t *)this; vout_display_sys_t *sys = vd->sys; + if (sys->tapRecognizer) { + [sys->glESView removeGestureRecognizer:sys->tapRecognizer]; + [sys->tapRecognizer release]; + } + [sys->glESView setVoutDisplay:nil]; var_Destroy (vd, "drawable-nsobject"); @@ -226,10 +260,11 @@ static int Control(vout_display_t *vd, int query, va_list ap) vout_display_sys_t *sys = vd->sys; switch (query) { + case VOUT_DISPLAY_HIDE_MOUSE: + return VLC_EGENERIC; + case VOUT_DISPLAY_CHANGE_FULLSCREEN: case VOUT_DISPLAY_CHANGE_WINDOW_STATE: - case VOUT_DISPLAY_HIDE_MOUSE: - return VLC_SUCCESS; case VOUT_DISPLAY_CHANGE_DISPLAY_FILLED: case VOUT_DISPLAY_CHANGE_ZOOM: case VOUT_DISPLAY_CHANGE_SOURCE_ASPECT: @@ -243,7 +278,6 @@ static int Control(vout_display_t *vd, int query, va_list ap) const vout_display_cfg_t *cfg; const video_format_t *source; - bool is_forced = false; if (query == VOUT_DISPLAY_CHANGE_SOURCE_ASPECT || query == VOUT_DISPLAY_CHANGE_SOURCE_CROP) { source = (const video_format_t *)va_arg(ap, const video_format_t *); @@ -251,25 +285,21 @@ static int Control(vout_display_t *vd, int query, va_list ap) } else { source = &vd->source; cfg = (const vout_display_cfg_t*)va_arg(ap, const vout_display_cfg_t *); - if (query == VOUT_DISPLAY_CHANGE_DISPLAY_SIZE) - is_forced = (bool)va_arg(ap, int); } - if (query == VOUT_DISPLAY_CHANGE_DISPLAY_SIZE && is_forced - && (cfg->display.width != vd->cfg->display.width - || cfg->display.height != vd->cfg->display.height)) + /* we don't adapt anything here regardless of what the vout core + * wants since we are not in a traditional desktop window */ + if (!cfg) return VLC_EGENERIC; - /* we always use our current frame here, because we have some size constraints - in the ui vout provider */ vout_display_cfg_t cfg_tmp = *cfg; - CGRect bounds; - bounds = [sys->glESView bounds]; + CGSize viewSize; + viewSize = [sys->glESView bounds].size; - /* on HiDPI displays, the point bounds don't equal the actual pixel based bounds */ + /* on HiDPI displays, the point bounds don't equal the actual pixels */ CGFloat scaleFactor = sys->glESView.contentScaleFactor; - cfg_tmp.display.width = bounds.size.width * scaleFactor; - cfg_tmp.display.height = bounds.size.height * scaleFactor; + cfg_tmp.display.width = viewSize.width * scaleFactor; + cfg_tmp.display.height = viewSize.height * scaleFactor; vout_display_place_t place; vout_display_PlacePicture(&place, source, &cfg_tmp, false); @@ -277,12 +307,6 @@ static int Control(vout_display_t *vd, int query, va_list ap) sys->place = place; } - /* For resize, we call glViewport in reshape and not here. - This has the positive side effect that we avoid erratic sizing as we animate every resize. */ - if (query != VOUT_DISPLAY_CHANGE_DISPLAY_SIZE) - // x / y are top left corner, but we need the lower left one - glViewport(place.x, cfg_tmp.display.height - (place.y + place.height), place.width, place.height); - [autoreleasePool release]; return VLC_SUCCESS; } @@ -297,7 +321,7 @@ static int Control(vout_display_t *vd, int query, va_list ap) case VOUT_DISPLAY_RESET_PICTURES: assert (0); default: - msg_Err(vd, "Unknown request %i in iOS ES 2 vout display", query); + msg_Err(vd, "Unknown request %d", query); return VLC_EGENERIC; } } @@ -364,7 +388,7 @@ static void OpenglESSwap(vlc_gl_t *gl) - (id)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; // perform selector on main thread? + self = [super initWithFrame:frame]; if (!self) return nil; @@ -453,17 +477,13 @@ static void OpenglESSwap(vlc_gl_t *gl) _bufferNeedReset = YES; } -/** - * Method called by Cocoa when the view is resized. - */ - (void)reshape { assert([[NSThread currentThread] isMainThread]); [EAGLContext setCurrentContext:_eaglContext]; - CGRect bounds; - bounds = [self bounds]; + CGSize viewSize = [self bounds].size; vout_display_place_t place; @@ -472,12 +492,14 @@ static void OpenglESSwap(vlc_gl_t *gl) vout_display_cfg_t cfg_tmp = *(_voutDisplay->cfg); CGFloat scaleFactor = self.contentScaleFactor; - cfg_tmp.display.width = bounds.size.width * scaleFactor; - cfg_tmp.display.height = bounds.size.height * scaleFactor; + cfg_tmp.display.width = viewSize.width * scaleFactor; + cfg_tmp.display.height = viewSize.height * scaleFactor; vout_display_PlacePicture(&place, &_voutDisplay->source, &cfg_tmp, false); _voutDisplay->sys->place = place; - vout_display_SendEventDisplaySize(_voutDisplay, bounds.size.width * scaleFactor, bounds.size.height * scaleFactor, _voutDisplay->cfg->is_fullscreen); + vout_display_SendEventDisplaySize(_voutDisplay, viewSize.width * scaleFactor, + viewSize.height * scaleFactor, + _voutDisplay->cfg->is_fullscreen); } } @@ -485,9 +507,23 @@ static void OpenglESSwap(vlc_gl_t *gl) glViewport(place.x, place.y, place.width, place.height); } +- (void)tapRecognized:(UITapGestureRecognizer *)tapRecognizer +{ + UIGestureRecognizerState state = [tapRecognizer state]; + CGPoint touchPoint = [tapRecognizer locationInView:self]; + vout_display_SendMouseMovedDisplayCoordinates(_voutDisplay, ORIENT_NORMAL, + (int)touchPoint.x, (int)touchPoint.y, + &_voutDisplay->sys->place); + + vout_display_SendEventMousePressed(_voutDisplay, MOUSE_BUTTON_LEFT); + vout_display_SendEventMouseReleased(_voutDisplay, MOUSE_BUTTON_LEFT); +} + - (void)applicationStateChanged:(NSNotification *)notification { - if ([[notification name] isEqualToString:UIApplicationWillResignActiveNotification] || [[notification name] isEqualToString:UIApplicationDidEnterBackgroundNotification] || [[notification name] isEqualToString:UIApplicationWillTerminateNotification]) + if ([[notification name] isEqualToString:UIApplicationWillResignActiveNotification] + || [[notification name] isEqualToString:UIApplicationDidEnterBackgroundNotification] + || [[notification name] isEqualToString:UIApplicationWillTerminateNotification]) _appActive = NO; else _appActive = YES;