⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 embeddedwindow.m

📁 VLC Player Source Code
💻 M
📖 第 1 页 / 共 2 页
字号:
    /* 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 + -