[vlc-commits] macosx: reactivate fast path for exiting fullscreen window when video finished

David Fuhrmann git at videolan.org
Thu Mar 20 20:30:12 CET 2014


vlc | branch: master | David Fuhrmann <david.fuhrmann at googlemail.com> | Wed Mar 19 09:48:07 2014 +0100| [0011c26124c608f632418108ec9f4444e632afbb] | committer: David Fuhrmann

macosx: reactivate fast path for exiting fullscreen window when video finished

This also removes old workarounds which are not needed anymore.

close #10826

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0011c26124c608f632418108ec9f4444e632afbb
---

 modules/gui/macosx/VLCVoutWindowController.m |   10 ++-
 modules/gui/macosx/Windows.h                 |    4 +-
 modules/gui/macosx/Windows.m                 |  103 +++++---------------------
 3 files changed, 27 insertions(+), 90 deletions(-)

diff --git a/modules/gui/macosx/VLCVoutWindowController.m b/modules/gui/macosx/VLCVoutWindowController.m
index f2def5b..de86df7 100644
--- a/modules/gui/macosx/VLCVoutWindowController.m
+++ b/modules/gui/macosx/VLCVoutWindowController.m
@@ -249,8 +249,11 @@
         return;
     }
 
-    if ([o_window fullscreen] && ![[VLCMainWindow sharedInstance] nativeFullscreenMode])
-        [o_window leaveFullscreen];
+    // prevent visible extra window if in fullscreen
+    NSDisableScreenUpdates();
+    if (![[VLCMainWindow sharedInstance] nativeFullscreenMode] &&
+            ([o_window fullscreen] || [o_window inFullscreenTransition]))
+        [o_window leaveFullscreenWithAnimation: NO];
 
     [[o_window videoView] releaseVoutThread];
 
@@ -261,6 +264,7 @@
     if ([o_window class] != [VLCMainWindow class]) {
         [o_window close];
     }
+    NSEnableScreenUpdates();
 
     [o_window retain];
     [o_vout_dict removeObjectForKey:o_key];
@@ -370,7 +374,7 @@
                 vlc_object_release(p_input);
         } else {
             // leaving fullscreen is always allowed
-            [o_current_window leaveFullscreen];
+            [o_current_window leaveFullscreenWithAnimation:YES];
         }
     }
 }
diff --git a/modules/gui/macosx/Windows.h b/modules/gui/macosx/Windows.h
index 2c4273f..ce3f714 100644
--- a/modules/gui/macosx/Windows.h
+++ b/modules/gui/macosx/Windows.h
@@ -98,10 +98,8 @@ static const float f_min_video_height = 70.0;
     VLCWindow       * o_fullscreen_window;
     NSViewAnimation * o_fullscreen_anim1;
     NSViewAnimation * o_fullscreen_anim2;
-    NSViewAnimation * o_makekey_anim;
     NSView          * o_temp_view;
 
-    BOOL              b_window_is_invisible;
     NSInteger i_originalLevel;
 
     BOOL              b_video_view_was_hidden;
@@ -129,7 +127,7 @@ static const float f_min_video_height = 70.0;
 
 /* fullscreen handling */
 - (void)enterFullscreen;
-- (void)leaveFullscreen;
+- (void)leaveFullscreenWithAnimation:(BOOL)b_animation;
 
 /* lion fullscreen handling */
 - (void)windowWillEnterFullScreen:(NSNotification *)notification;
diff --git a/modules/gui/macosx/Windows.m b/modules/gui/macosx/Windows.m
index 51c1135..2e58b6f 100644
--- a/modules/gui/macosx/Windows.m
+++ b/modules/gui/macosx/Windows.m
@@ -275,7 +275,6 @@
 @interface VLCVideoWindowCommon (Internal)
 - (void)customZoom:(id)sender;
 - (void)hasBecomeFullscreen;
-- (void)leaveFullscreenAndFadeOut:(BOOL)fadeout;
 - (void)hasEndedFullscreen;
 @end
 
@@ -1007,12 +1006,7 @@
     [self setFullscreen:YES];
 }
 
-- (void)leaveFullscreen
-{
-    [self leaveFullscreenAndFadeOut: NO];
-}
-
-- (void)leaveFullscreenAndFadeOut: (BOOL)fadeout
+- (void)leaveFullscreenWithAnimation:(BOOL)b_animation
 {
     NSMutableDictionary *dict1, *dict2;
     NSRect frame;
@@ -1032,7 +1026,21 @@
         return;
     }
 
-    if (fadeout) {
+    [[[VLCMainWindow sharedInstance] fsPanel] setNonActive: nil];
+    [[o_fullscreen_window screen] setNonFullscreenPresentationOptions];
+
+    if (o_fullscreen_anim1) {
+        [o_fullscreen_anim1 stopAnimation];
+        [o_fullscreen_anim1 release];
+        o_fullscreen_anim1 = nil;
+    }
+    if (o_fullscreen_anim2) {
+        [o_fullscreen_anim2 stopAnimation];
+        [o_fullscreen_anim2 release];
+        o_fullscreen_anim2 = nil;
+    }
+
+    if (!b_animation) {
         /* We don't animate if we are not visible, instead we
          * simply fade the display */
         CGDisplayFadeReservationToken token;
@@ -1042,16 +1050,12 @@
             CGDisplayFade(token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0, 0, 0, YES);
         }
 
-        [[[VLCMainWindow sharedInstance] fsPanel] setNonActive: nil];
-        [[o_fullscreen_window screen] setNonFullscreenPresentationOptions];
+        [self setAlphaValue:1.0];
+        [self orderFront: self];
 
         /* Will release the lock */
         [self hasEndedFullscreen];
 
-        /* Our window is hidden, and might be faded. We need to workaround that, so note it
-         * here */
-        b_window_is_invisible = YES;
-
         if (blackout_other_displays) {
             CGDisplayFade(token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0, 0, 0, NO);
             CGReleaseDisplayFadeReservation(token);
@@ -1066,18 +1070,6 @@
     [self orderFront: self];
     [[o_video_view window] orderFront: self];
 
-    [[[VLCMainWindow sharedInstance] fsPanel] setNonActive: nil];
-    [[o_fullscreen_window screen] setNonFullscreenPresentationOptions];
-
-    if (o_fullscreen_anim1) {
-        [o_fullscreen_anim1 stopAnimation];
-        [o_fullscreen_anim1 release];
-    }
-    if (o_fullscreen_anim2) {
-        [o_fullscreen_anim2 stopAnimation];
-        [o_fullscreen_anim2 release];
-    }
-
     frame = [[o_temp_view superview] convertRect: [o_temp_view frame] toView: nil]; /* Convert to Window base coord */
     frame.origin.x += [self frame].origin.x;
     frame.origin.y += [self frame].origin.y;
@@ -1134,7 +1126,7 @@
 
     [o_video_view setHidden: b_video_view_was_hidden];
 
-    [super makeKeyAndOrderFront:self]; /* our version (in main window) contains a workaround */
+    [self makeKeyAndOrderFront:self];
 
     [o_fullscreen_window orderOut: self];
     NSEnableScreenUpdates();
@@ -1146,19 +1138,11 @@
     [self setLevel:i_originalLevel];
 
     [self setAlphaValue: config_GetFloat(VLCIntf, "macosx-opaqueness")];
-
-    // if we quit fullscreen because there is no video anymore, make sure non-embedded window is not visible
-    if (![[VLCMain sharedInstance] activeVideoPlayback] && [self class] != [VLCMainWindow class])
-        [self orderOut: self];
 }
 
 - (void)animationDidEnd:(NSAnimation*)animation
 {
     NSArray *viewAnimations;
-    if (o_makekey_anim == animation) {
-        [o_makekey_anim release];
-        return;
-    }
     if ([animation currentValue] < 1.0)
         return;
 
@@ -1173,55 +1157,6 @@
         [self hasBecomeFullscreen];
 }
 
-- (void)orderOut:(id)sender
-{
-    [super orderOut:sender];
-
-    /*
-     * TODO reimplement leaveFullscreenAndFadeOut:YES, or remove code
-     * and the hack below
-    
-    if (![NSStringFromClass([self class]) isEqualToString:@"VLCMainWindow"]) {
-        [self leaveFullscreenAndFadeOut:YES];
-    }
-     */
-}
-
-- (void)makeKeyAndOrderFront: (id)sender
-{
-    /* Hack
-     * when we exit fullscreen and fade out, we may endup in
-     * having a window that is faded. We can't have it fade in unless we
-     * animate again. */
-
-    if (!b_window_is_invisible) {
-        /* Make sure we don't do it too much */
-        [super makeKeyAndOrderFront: sender];
-        return;
-    }
-
-    [super setAlphaValue:0.0f];
-    [super makeKeyAndOrderFront: sender];
-
-    NSMutableDictionary * dict = [[NSMutableDictionary alloc] initWithCapacity:2];
-    [dict setObject:self forKey:NSViewAnimationTargetKey];
-    [dict setObject:NSViewAnimationFadeInEffect forKey:NSViewAnimationEffectKey];
-
-    o_makekey_anim = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObject:dict]];
-    [dict release];
-
-    [o_makekey_anim setAnimationBlockingMode: NSAnimationNonblocking];
-    [o_makekey_anim setDuration: 0.1];
-    [o_makekey_anim setFrameRate: 30];
-    [o_makekey_anim setDelegate: self];
-
-    [o_makekey_anim startAnimation];
-    b_window_is_invisible = NO;
-
-    /* fullscreenAnimation will be unlocked when animation ends */
-}
-
-
 #pragma mark -
 #pragma mark Accessibility stuff
 



More information about the vlc-commits mailing list