📄 misc.m
字号:
/***************************************************************************** * misc.m: code not specific to vlc ***************************************************************************** * Copyright (C) 2003-2008 the VideoLAN team * $Id$ * * Authors: Jon Lech Johansen <jon-vl@nanocrew.net> * Felix Paul Kühne <fkuehne at videolan dot org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/#import <Cocoa/Cocoa.h>#import <QuickTime/QuickTime.h>#import "intf.h" /* VLCApplication */#import "misc.h"#import "playlist.h"#import "controls.h"/***************************************************************************** * NSImage (VLCAdditions) * * Addition to NSImage *****************************************************************************/@implementation NSImage (VLCAdditions)+ (id)imageWithSystemName:(int)name{ /* ugly Carbon stuff following... * regrettably, you can't get the icons through clean Cocoa */ /* retrieve our error icon */ NSImage * icon; IconRef ourIconRef; int returnValue; returnValue = GetIconRef(kOnSystemDisk, 'macs', name, &ourIconRef); icon = [[[NSImage alloc] initWithSize:NSMakeSize(32,32)] autorelease]; [icon lockFocus]; CGRect rect = CGRectMake(0,0,32,32); PlotIconRefInContext((CGContextRef)[[NSGraphicsContext currentContext] graphicsPort], &rect, kAlignNone, kTransformNone, NULL /*inLabelColor*/, kPlotIconRefNormalFlags, (IconRef)ourIconRef); [icon unlockFocus]; returnValue = ReleaseIconRef(ourIconRef); return icon;}+ (id)imageWithWarningIcon{ static NSImage * imageWithWarningIcon = nil; if( !imageWithWarningIcon ) { imageWithWarningIcon = [[[self class] imageWithSystemName:'caut'] retain]; } return imageWithWarningIcon;}+ (id)imageWithErrorIcon{ static NSImage * imageWithErrorIcon = nil; if( !imageWithErrorIcon ) { imageWithErrorIcon = [[[self class] imageWithSystemName:'stop'] retain]; } return imageWithErrorIcon;}@end/***************************************************************************** * NSAnimation (VLCAdditions) * * Missing extension to NSAnimation *****************************************************************************/@implementation NSAnimation (VLCAdditions)/* fake class attributes */static NSMapTable *VLCAdditions_userInfo = NULL;+ (void)load{ /* init our fake object attribute */ VLCAdditions_userInfo = NSCreateMapTable(NSNonRetainedObjectMapKeyCallBacks, NSObjectMapValueCallBacks, 16);}- (void)dealloc{ NSMapRemove(VLCAdditions_userInfo, self); [super dealloc];}- (void)setUserInfo: (void *)userInfo{ NSMapInsert(VLCAdditions_userInfo, self, (void*)userInfo);}- (void *)userInfo{ return NSMapGet(VLCAdditions_userInfo, self);}@end/***************************************************************************** * NSScreen (VLCAdditions) * * Missing extension to NSScreen *****************************************************************************/@implementation NSScreen (VLCAdditions)static NSMutableArray *blackoutWindows = NULL;+ (void)load{ /* init our fake object attribute */ blackoutWindows = [[NSMutableArray alloc] initWithCapacity:1];}+ (NSScreen *)screenWithDisplayID: (CGDirectDisplayID)displayID{ int i; for( i = 0; i < [[NSScreen screens] count]; i++ ) { NSScreen *screen = [[NSScreen screens] objectAtIndex: i]; if([screen displayID] == displayID) return screen; } return nil;}- (BOOL)isMainScreen{ return ([self displayID] == [[[NSScreen screens] objectAtIndex:0] displayID]);}- (BOOL)isScreen: (NSScreen*)screen{ return ([self displayID] == [screen displayID]);}- (CGDirectDisplayID)displayID{ return (CGDirectDisplayID)_screenNumber;}- (void)blackoutOtherScreens{ unsigned int i; /* Free our previous blackout window (follow blackoutWindow alloc strategy) */ [blackoutWindows makeObjectsPerformSelector:@selector(close)]; [blackoutWindows removeAllObjects]; for(i = 0; i < [[NSScreen screens] count]; i++) { NSScreen *screen = [[NSScreen screens] objectAtIndex: i]; VLCWindow *blackoutWindow; NSRect screen_rect; if([self isScreen: screen]) continue; screen_rect = [screen frame]; screen_rect.origin.x = screen_rect.origin.y = 0; /* blackoutWindow alloc strategy - The NSMutableArray blackoutWindows has the blackoutWindow references - blackoutOtherDisplays is responsible for alloc/releasing its Windows */ blackoutWindow = [[VLCWindow alloc] initWithContentRect: screen_rect styleMask: NSBorderlessWindowMask backing: NSBackingStoreBuffered defer: NO screen: screen]; [blackoutWindow setBackgroundColor:[NSColor blackColor]]; [blackoutWindow setLevel: NSFloatingWindowLevel]; /* Disappear when Expose is triggered */ [blackoutWindow displayIfNeeded]; [blackoutWindow orderFront: self animate: YES]; [blackoutWindows addObject: blackoutWindow]; [blackoutWindow release]; if( [screen isMainScreen ] ) SetSystemUIMode( kUIModeAllHidden, kUIOptionAutoShowMenuBar); }}+ (void)unblackoutScreens{ unsigned int i; for(i = 0; i < [blackoutWindows count]; i++) { VLCWindow *blackoutWindow = [blackoutWindows objectAtIndex: i]; [blackoutWindow closeAndAnimate: YES]; } SetSystemUIMode( kUIModeNormal, 0);}@end/***************************************************************************** * VLCWindow * * Missing extension to NSWindow *****************************************************************************/@implementation VLCWindow- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag{ self = [super initWithContentRect:contentRect styleMask:styleMask backing:backingType defer:flag]; if( self ) b_isset_canBecomeKeyWindow = NO; return self;}- (void)setCanBecomeKeyWindow: (BOOL)canBecomeKey{ b_isset_canBecomeKeyWindow = YES; b_canBecomeKeyWindow = canBecomeKey;}- (BOOL)canBecomeKeyWindow{ if(b_isset_canBecomeKeyWindow) return b_canBecomeKeyWindow; return [super canBecomeKeyWindow];}- (void)closeAndAnimate: (BOOL)animate{ NSInvocation *invoc; if (!animate || MACOS_VERSION < 10.4f) { [super close]; return; } invoc = [NSInvocation invocationWithMethodSignature:[super methodSignatureForSelector:@selector(close)]]; [invoc setTarget: (id)super]; if (![self isVisible] || [self alphaValue] == 0.0) { [super close]; return; } [self orderOut: self animate: YES callback: invoc];}- (void)orderOut: (id)sender animate: (BOOL)animate{ NSInvocation *invoc = [NSInvocation invocationWithMethodSignature:[super methodSignatureForSelector:@selector(orderOut:)]]; [invoc setTarget: (id)super]; [invoc setArgument: sender atIndex: 0]; [self orderOut: sender animate: animate callback: invoc];}- (void)orderOut: (id)sender animate: (BOOL)animate callback:(NSInvocation *)callback{ NSViewAnimation *anim; NSViewAnimation *current_anim; NSMutableDictionary *dict; if (!animate || MACOS_VERSION < 10.4f) { [self orderOut: sender]; return; } dict = [[NSMutableDictionary alloc] initWithCapacity:2]; [dict setObject:self forKey:NSViewAnimationTargetKey]; [dict setObject:NSViewAnimationFadeOutEffect forKey:NSViewAnimationEffectKey]; anim = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict, nil]]; [dict release]; [anim setAnimationBlockingMode:NSAnimationNonblocking]; [anim setDuration:0.9]; [anim setFrameRate:30]; [anim setUserInfo: callback]; @synchronized(self) { current_anim = self->animation; if ([[[current_anim viewAnimations] objectAtIndex:0] objectForKey: NSViewAnimationEffectKey] == NSViewAnimationFadeOutEffect && [current_anim isAnimating]) { [anim release]; } else { if (current_anim) { [current_anim stopAnimation]; [anim setCurrentProgress:1.0-[current_anim currentProgress]]; [current_anim release]; } else [anim setCurrentProgress:1.0 - [self alphaValue]]; self->animation = anim; [self setDelegate: self]; [anim startAnimation]; } }}- (void)orderFront: (id)sender animate: (BOOL)animate{ NSViewAnimation *anim; NSViewAnimation *current_anim; NSMutableDictionary *dict; if (!animate || MACOS_VERSION < 10.4f) { [super orderFront: sender]; [self setAlphaValue: 1.0]; return; } if (![self isVisible]) { [self setAlphaValue: 0.0]; [super orderFront: sender]; } else if ([self alphaValue] == 1.0) { [super orderFront: self]; return; } dict = [[NSMutableDictionary alloc] initWithCapacity:2]; [dict setObject:self forKey:NSViewAnimationTargetKey]; [dict setObject:NSViewAnimationFadeInEffect forKey:NSViewAnimationEffectKey]; anim = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict, nil]]; [dict release]; [anim setAnimationBlockingMode:NSAnimationNonblocking]; [anim setDuration:0.5]; [anim setFrameRate:30]; @synchronized(self) { current_anim = self->animation; if ([[[current_anim viewAnimations] objectAtIndex:0] objectForKey: NSViewAnimationEffectKey] == NSViewAnimationFadeInEffect && [current_anim isAnimating]) { [anim release]; } else { if (current_anim) { [current_anim stopAnimation]; [anim setCurrentProgress:1.0 - [current_anim currentProgress]]; [current_anim release]; } else [anim setCurrentProgress:[self alphaValue]]; self->animation = anim;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -