📄 embeddedwindow.m
字号:
/* We are in fullscreen (and no animation is running) */ if (b_fullscreen) { /* Make sure we are hidden */ [super orderOut: self]; [self unlockFullscreenAnimation]; return; } if (o_fullscreen_anim1) { [o_fullscreen_anim1 stopAnimation]; [o_fullscreen_anim1 release]; } if (o_fullscreen_anim2) { [o_fullscreen_anim2 stopAnimation]; [o_fullscreen_anim2 release]; } if ([screen isMainScreen]) SetSystemUIMode( kUIModeAllHidden, kUIOptionAutoShowMenuBar); dict1 = [[NSMutableDictionary alloc] initWithCapacity:2]; dict2 = [[NSMutableDictionary alloc] initWithCapacity:3]; [dict1 setObject:self forKey:NSViewAnimationTargetKey]; [dict1 setObject:NSViewAnimationFadeOutEffect forKey:NSViewAnimationEffectKey]; [dict2 setObject:o_fullscreen_window forKey:NSViewAnimationTargetKey]; [dict2 setObject:[NSValue valueWithRect:[o_fullscreen_window frame]] forKey:NSViewAnimationStartFrameKey]; [dict2 setObject:[NSValue valueWithRect:screen_rect] forKey:NSViewAnimationEndFrameKey]; /* Strategy with NSAnimation allocation: - Keep at most 2 animation at a time - leaveFullscreen/enterFullscreen are the only responsible for releasing and alloc-ing */ o_fullscreen_anim1 = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict1, nil]]; o_fullscreen_anim2 = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict2, nil]]; [dict1 release]; [dict2 release]; [o_fullscreen_anim1 setAnimationBlockingMode: NSAnimationNonblocking]; [o_fullscreen_anim1 setDuration: 0.3]; [o_fullscreen_anim1 setFrameRate: 30]; [o_fullscreen_anim2 setAnimationBlockingMode: NSAnimationNonblocking]; [o_fullscreen_anim2 setDuration: 0.2]; [o_fullscreen_anim2 setFrameRate: 30]; [o_fullscreen_anim2 setDelegate: self]; [o_fullscreen_anim2 startWhenAnimation: o_fullscreen_anim1 reachesProgress: 1.0]; [o_fullscreen_anim1 startAnimation]; /* fullscreenAnimation will be unlocked when animation ends */}- (void)hasBecomeFullscreen{ [o_fullscreen_window makeFirstResponder: [[[VLCMain sharedInstance] getControls] getVoutView]]; [o_fullscreen_window makeKeyWindow]; [o_fullscreen_window setAcceptsMouseMovedEvents: TRUE]; /* tell the fspanel to move itself to front next time it's triggered */ [[[[VLCMain sharedInstance] getControls] getFSPanel] setVoutWasUpdated: (int)[[o_fullscreen_window screen] displayID]]; if([self isVisible]) [super orderOut: self]; [[[[VLCMain sharedInstance] getControls] getFSPanel] setActive: nil]; b_fullscreen = YES; [self unlockFullscreenAnimation];}- (void)leaveFullscreen{ [self leaveFullscreenAndFadeOut: NO];}- (void)leaveFullscreenAndFadeOut: (BOOL)fadeout{ NSMutableDictionary *dict1, *dict2; NSRect frame; [self lockFullscreenAnimation]; b_fullscreen = NO; [o_btn_fullscreen setState: NO]; /* We always try to do so */ [NSScreen unblackoutScreens]; /* Don't do anything if o_fullscreen_window is already closed */ if (!o_fullscreen_window) { [self unlockFullscreenAnimation]; return; } if (fadeout || MACOS_VERSION < 10.4f) { /* We don't animate if we are not visible or if we are running on * Mac OS X <10.4 which doesn't support NSAnimation, instead we * simply fade the display */ CGDisplayFadeReservationToken token; CGAcquireDisplayFadeReservation(kCGMaxDisplayReservationInterval, &token); CGDisplayFade( token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0, 0, 0, YES ); [[[[VLCMain sharedInstance] getControls] getFSPanel] setNonActive: nil]; SetSystemUIMode( kUIModeNormal, kUIOptionAutoShowMenuBar); /* 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; CGDisplayFade( token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0, 0, 0, NO ); CGReleaseDisplayFadeReservation( token); return; } [self setAlphaValue: 0.0]; [self orderFront: self]; [[[[VLCMain sharedInstance] getControls] getFSPanel] setNonActive: nil]; SetSystemUIMode( kUIModeNormal, kUIOptionAutoShowMenuBar); 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; dict2 = [[NSMutableDictionary alloc] initWithCapacity:2]; [dict2 setObject:self forKey:NSViewAnimationTargetKey]; [dict2 setObject:NSViewAnimationFadeInEffect forKey:NSViewAnimationEffectKey]; o_fullscreen_anim2 = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict2, nil]]; [dict2 release]; [o_fullscreen_anim2 setAnimationBlockingMode: NSAnimationNonblocking]; [o_fullscreen_anim2 setDuration: 0.3]; [o_fullscreen_anim2 setFrameRate: 30]; [o_fullscreen_anim2 setDelegate: self]; dict1 = [[NSMutableDictionary alloc] initWithCapacity:3]; [dict1 setObject:o_fullscreen_window forKey:NSViewAnimationTargetKey]; [dict1 setObject:[NSValue valueWithRect:[o_fullscreen_window frame]] forKey:NSViewAnimationStartFrameKey]; [dict1 setObject:[NSValue valueWithRect:frame] forKey:NSViewAnimationEndFrameKey]; o_fullscreen_anim1 = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict1, nil]]; [dict1 release]; [o_fullscreen_anim1 setAnimationBlockingMode: NSAnimationNonblocking]; [o_fullscreen_anim1 setDuration: 0.2]; [o_fullscreen_anim1 setFrameRate: 30]; [o_fullscreen_anim2 startWhenAnimation: o_fullscreen_anim1 reachesProgress: 1.0]; /* Make sure o_fullscreen_window is the frontmost window */ [o_fullscreen_window orderFront: self]; [o_fullscreen_anim1 startAnimation]; /* fullscreenAnimation will be unlocked when animation ends */}- (void)hasEndedFullscreen{ /* This function is private and should be only triggered at the end of the fullscreen change animation */ /* Make sure we don't see the o_view disappearing of the screen during this operation */ DisableScreenUpdates(); [o_view retain]; [o_view removeFromSuperviewWithoutNeedingDisplay]; [[self contentView] replaceSubview:o_temp_view with:o_view]; [o_view release]; [o_view setFrame:[o_temp_view frame]]; [self makeFirstResponder: o_view]; if ([self isVisible]) [super makeKeyAndOrderFront:self]; /* our version contains a workaround */ [o_fullscreen_window orderOut: self]; EnableScreenUpdates(); [o_fullscreen_window release]; o_fullscreen_window = nil; [self setLevel:originalLevel]; [self unlockFullscreenAnimation];}- (void)animationDidEnd:(NSAnimation*)animation{ NSArray *viewAnimations; if ([animation currentValue] < 1.0) return; /* Fullscreen ended or started (we are a delegate only for leaveFullscreen's/enterFullscren's anim2) */ viewAnimations = [o_fullscreen_anim2 viewAnimations]; if ([viewAnimations count] >=1 && [[[viewAnimations objectAtIndex: 0] objectForKey: NSViewAnimationEffectKey] isEqualToString:NSViewAnimationFadeInEffect]) { /* Fullscreen ended */ [self hasEndedFullscreen]; } else { /* Fullscreen started */ [self hasBecomeFullscreen]; }}- (void)orderOut: (id)sender{ [super orderOut: sender]; /* Make sure we leave fullscreen */ [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] autorelease]; [dict setObject:self forKey:NSViewAnimationTargetKey]; [dict setObject:NSViewAnimationFadeInEffect forKey:NSViewAnimationEffectKey]; NSViewAnimation * anim = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObject:dict]]; [anim setAnimationBlockingMode: NSAnimationNonblocking]; [anim setDuration: 0.1]; [anim setFrameRate: 30]; [anim startAnimation]; b_window_is_invisible = NO; /* fullscreenAnimation will be unlocked when animation ends */}/* Make sure setFrame gets executed on main thread especially if we are animating. * (Thus we won't block the video output thread) */- (void)setFrame:(NSRect)frame display:(BOOL)display animate:(BOOL)animate{ struct { NSRect frame; BOOL display; BOOL animate;} args; NSData *packedargs; args.frame = frame; args.display = display; args.animate = animate; packedargs = [NSData dataWithBytes:&args length:sizeof(args)]; [self performSelectorOnMainThread:@selector(setFrameOnMainThread:) withObject: packedargs waitUntilDone: YES];}- (void)setFrameOnMainThread:(NSData*)packedargs{ struct args { NSRect frame; BOOL display; BOOL animate; } * args = (struct args*)[packedargs bytes]; if( args->animate ) { /* Make sure we don't block too long and set up a non blocking animation */ NSDictionary * dict = [NSDictionary dictionaryWithObjectsAndKeys: self, NSViewAnimationTargetKey, [NSValue valueWithRect:[self frame]], NSViewAnimationStartFrameKey, [NSValue valueWithRect:args->frame], NSViewAnimationEndFrameKey, nil]; NSViewAnimation * anim = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict, nil]]; [anim setAnimationBlockingMode: NSAnimationNonblocking]; [anim setDuration: 0.4]; [anim setFrameRate: 30]; [anim startAnimation]; } else { [super setFrame:args->frame display:args->display animate:args->animate]; }}@end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -