X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fembeddedwindow.m;h=3392fd1f256bdf0cec08d2479605e724de2c2c36;hb=223286529bb015c350f9839b4fcdb03ea59b2c7a;hp=b59ccf94b74d47259380b60762b9e92e7ee938fc;hpb=7b4ce76a13a8000c3fffb9c1d2c05a2f70fb2dcf;p=vlc diff --git a/modules/gui/macosx/embeddedwindow.m b/modules/gui/macosx/embeddedwindow.m index b59ccf94b7..3392fd1f25 100644 --- a/modules/gui/macosx/embeddedwindow.m +++ b/modules/gui/macosx/embeddedwindow.m @@ -1,7 +1,7 @@ /***************************************************************************** * embeddedwindow.m: MacOS X interface module ***************************************************************************** - * Copyright (C) 2005-2009 the VideoLAN team + * Copyright (C) 2005-2008 the VideoLAN team * $Id$ * * Authors: Benjamin Pracht @@ -26,14 +26,26 @@ * Preamble *****************************************************************************/ +/* DisableScreenUpdates, SetSystemUIMode, ... */ +#import + #import "intf.h" #import "controls.h" #import "vout.h" #import "embeddedwindow.h" #import "fspanel.h" +#import "playlist.h" -/* SetSystemUIMode, ... */ -#import +/***************************************************************************** + * extension to NSWindow's interface to fix compilation warnings + * and let us access this functions properly + * this uses a private Apple-API, but works fine on all current OSX releases + * keep checking for compatiblity with future releases though + *****************************************************************************/ + +@interface NSWindow (UndocumentedWindowProperties) +- (void)setBottomCornerRounded: (BOOL)value; +@end /***************************************************************************** * VLCEmbeddedWindow Implementation @@ -41,40 +53,48 @@ @implementation VLCEmbeddedWindow -- (id)initWithContentRect:(NSRect)contentRect styleMask: (NSUInteger)windowStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation -{ - BOOL b_useTextured = YES; - if( [[NSWindow class] instancesRespondToSelector:@selector(setContentBorderThickness:forEdge:)] ) - { - b_useTextured = NO; - windowStyle ^= NSTexturedBackgroundWindowMask; - } - self = [super initWithContentRect:contentRect styleMask:windowStyle backing:bufferingType defer:deferCreation]; - if(! b_useTextured ) - { - [self setContentBorderThickness:28.0 forEdge:NSMinYEdge]; - } - return self; -} - - (void)awakeFromNib { [self setDelegate: self]; + [self setBottomCornerRounded:NO]; + /* button strings */ [o_btn_backward setToolTip: _NS("Rewind")]; [o_btn_forward setToolTip: _NS("Fast Forward")]; [o_btn_fullscreen setToolTip: _NS("Fullscreen")]; [o_btn_play setToolTip: _NS("Play")]; - [o_slider setToolTip: _NS("Position")]; - - o_img_play = [NSImage imageNamed: @"play_embedded"]; - o_img_pause = [NSImage imageNamed: @"pause_embedded"]; + [o_timeslider setToolTip: _NS("Position")]; + [o_btn_prev setToolTip: _NS("Previous")]; + [o_btn_stop setToolTip: _NS("Stop")]; + [o_btn_next setToolTip: _NS("Next")]; + [o_volumeslider setToolTip: _NS("Volume")]; + [o_btn_playlist setToolTip: _NS("Playlist")]; + [self setTitle: _NS("VLC media player")]; + + if(MACOS_VERSION < 10.5f) { + o_img_play = [NSImage imageNamed: @"play"]; + o_img_pause = [NSImage imageNamed: @"pause"]; + [o_btn_play setImage: [NSImage imageNamed: @"play"]]; + } + else { + o_img_play = [NSImage imageNamed: @"play_big"]; + o_img_pause = [NSImage imageNamed: @"pause_big"]; + } [self controlTintChanged]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector( controlTintChanged ) name: NSControlTintDidChangeNotification object: nil]; + /* Set color of sidebar to Leopard's "Sidebar Blue" */ + [o_sidebar_list setBackgroundColor: [NSColor colorWithCalibratedRed:0.820 + green:0.843 + blue:0.886 + alpha:1.0]]; + + [self setMinSize:NSMakeSize([o_sidebar_list convertRect:[o_sidebar_list bounds] + toView: nil].size.width + 551., 114.)]; + /* Useful to save o_view frame in fullscreen mode */ o_temp_view = [[NSView alloc] init]; [o_temp_view setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable]; @@ -86,13 +106,9 @@ [o_btn_fullscreen setState: NO]; b_fullscreen = NO; - [self setMovableByWindowBackground:YES]; - - [self setDelegate:self]; - /* Make sure setVisible: returns NO */ [self orderOut:self]; - b_window_is_invisible = YES; + //b_window_is_invisible = YES; videoRatio = NSMakeSize( 0., 0. ); } @@ -102,21 +118,29 @@ if( [o_btn_play alternateImage] == o_img_play_pressed ) b_playing = YES; - if( [NSColor currentControlTint] == NSGraphiteControlTint ) - { - o_img_play_pressed = [NSImage imageNamed: @"play_embedded_graphite"]; - o_img_pause_pressed = [NSImage imageNamed: @"pause_embedded_graphite"]; - [o_btn_backward setAlternateImage: [NSImage imageNamed: @"skip_previous_embedded_graphite"]]; - [o_btn_forward setAlternateImage: [NSImage imageNamed: @"skip_forward_embedded_graphite"]]; - [o_btn_fullscreen setAlternateImage: [NSImage imageNamed: @"fullscreen_graphite"]]; + if (MACOS_VERSION < 10.5f) { + /* System is running Tiger and should use aqua buttons */ + [o_btn_backward setImage: [NSImage imageNamed: @"skip_previous_active"]]; + [o_btn_forward setImage: [NSImage imageNamed: @"skip_forward_active"]]; + if( [NSColor currentControlTint] == NSGraphiteControlTint ) + { + o_img_play_pressed = [NSImage imageNamed: @"play_graphite"]; + o_img_pause_pressed = [NSImage imageNamed: @"pause_graphite"]; + [o_btn_backward setAlternateImage: [NSImage imageNamed: @"skip_previous_graphite"]]; + [o_btn_forward setAlternateImage: [NSImage imageNamed: @"skip_forward_graphite"]]; + } + else + { + o_img_play_pressed = [NSImage imageNamed: @"play_blue"]; + o_img_pause_pressed = [NSImage imageNamed: @"pause_blue"]; + [o_btn_backward setAlternateImage: [NSImage imageNamed: @"skip_previous_blue"]]; + [o_btn_forward setAlternateImage: [NSImage imageNamed: @"skip_forward_blue"]]; + } } - else - { - o_img_play_pressed = [NSImage imageNamed: @"play_embedded_blue"]; - o_img_pause_pressed = [NSImage imageNamed: @"pause_embedded_blue"]; - [o_btn_backward setAlternateImage: [NSImage imageNamed: @"skip_previous_embedded_blue"]]; - [o_btn_forward setAlternateImage: [NSImage imageNamed: @"skip_forward_embedded_blue"]]; - [o_btn_fullscreen setAlternateImage: [NSImage imageNamed: @"fullscreen_blue"]]; + else{ + /* System is running Leopard or later and should use metal buttons */ + o_img_play_pressed = [NSImage imageNamed: @"play_big_down"]; + o_img_pause_pressed = [NSImage imageNamed: @"pause_big_down"]; } if( b_playing ) @@ -139,7 +163,7 @@ - (void)setTime:(NSString *)o_arg_time position:(float)f_position { [o_time setStringValue: o_arg_time]; - [o_slider setFloatValue: f_position]; + [o_timeslider setFloatValue: f_position]; } - (void)playStatusUpdated:(int)i_status @@ -162,7 +186,45 @@ { [o_btn_forward setEnabled: b_seekable]; [o_btn_backward setEnabled: b_seekable]; - [o_slider setEnabled: b_seekable]; + [o_timeslider setEnabled: b_seekable]; +} + +- (void)setScrollString:(NSString *)o_string +{ + [o_scrollfield setStringValue: o_string]; +} + +- (id)getPgbar +{ + if( o_main_pgbar ) + return o_main_pgbar; + + return nil; +} + +- (void)setStop:(BOOL)b_input +{ + [o_btn_stop setEnabled: b_input]; +} + +- (void)setNext:(BOOL)b_input +{ + [o_btn_next setEnabled: b_input]; +} + +- (void)setPrev:(BOOL)b_input +{ + [o_btn_prev setEnabled: b_input]; +} + +- (void)setVolumeEnabled:(BOOL)b_input +{ + [o_volumeslider setEnabled: b_input]; +} + +- (void)setVolumeSlider:(float)f_level +{ + [o_volumeslider setFloatValue: f_level]; } - (BOOL)windowShouldZoom:(NSWindow *)sender toFrame:(NSRect)newFrame @@ -175,7 +237,9 @@ { playlist_t * p_playlist = pl_Hold( VLCIntf ); - playlist_Stop( p_playlist ); + /* Only want to stop playback if video is playing */ + if( videoRatio.height != 0. && videoRatio.width != 0. ) + playlist_Stop( p_playlist ); pl_Release( VLCIntf ); return YES; } @@ -195,6 +259,16 @@ - (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize { + NSView *playlist_area = [[o_vertical_split subviews] objectAtIndex:1]; + NSRect newList = [playlist_area frame]; + if( newList.size.height < 50 && newList.size.height > 0 ) { + [self togglePlaylist:self]; + } + + /* With no video open or with the playlist open the behavior is odd */ + if( newList.size.height > 50 ) + return proposedFrameSize; + if( videoRatio.height == 0. || videoRatio.width == 0. ) return proposedFrameSize; @@ -202,11 +276,121 @@ NSRect contentRect = [self contentRectForFrameRect:[self frame]]; float marginy = viewRect.origin.y + [self frame].size.height - contentRect.size.height; float marginx = contentRect.size.width - viewRect.size.width; + proposedFrameSize.height = (proposedFrameSize.width - marginx) * videoRatio.height / videoRatio.width + marginy; return proposedFrameSize; } +- (void)becomeMainWindow +{ + [o_sidebar_list setBackgroundColor: [NSColor colorWithCalibratedRed:0.820 + green:0.843 + blue:0.886 + alpha:1.0]]; + [o_status becomeMainWindow]; + [super becomeMainWindow]; +} + +- (void)resignMainWindow +{ + [o_sidebar_list setBackgroundColor: [NSColor colorWithCalibratedWhite:0.91 alpha:1.0]]; + [o_status resignMainWindow]; + [super resignMainWindow]; +} + +- (float)splitView:(NSSplitView *) splitView constrainSplitPosition:(float) proposedPosition ofSubviewAt:(int) index +{ + if([splitView isVertical]) + return proposedPosition; + else { + float bottom = [splitView frame].size.height - [splitView dividerThickness]; + if(proposedPosition > bottom - 50) { + [o_btn_playlist setState: NSOffState]; + [o_searchfield setHidden:YES]; + [o_playlist_view setHidden:YES]; + return bottom; + } + else { + [o_btn_playlist setState: NSOnState]; + [o_searchfield setHidden:NO]; + [o_playlist_view setHidden:NO]; + [o_playlist swapPlaylists: o_playlist_table]; + [o_vlc_main togglePlaylist:self]; + return proposedPosition; + } + } +} + +- (void)splitViewWillResizeSubviews:(NSNotification *) notification +{ + +} + +- (float)splitView:(NSSplitView *) splitView constrainMinCoordinate:(float) proposedMin ofSubviewAt:(int) offset +{ + if([splitView isVertical]) + return 125.; + else + return 0.; +} + +- (float)splitView:(NSSplitView *) splitView constrainMaxCoordinate:(float) proposedMax ofSubviewAt:(int) offset +{ + if([splitView isVertical]) + return MIN([self frame].size.width - 551, 300); + else + return [splitView frame].size.height; +} + +- (BOOL)splitView:(NSSplitView *) splitView canCollapseSubview:(NSView *) subview +{ + if([splitView isVertical]) + return NO; + else + return NO; +} + +- (NSRect)splitView:(NSSplitView *)splitView effectiveRect:(NSRect)proposedEffectiveRect forDrawnRect:(NSRect)drawnRect + ofDividerAtIndex:(NSInteger)dividerIndex +{ + if([splitView isVertical]) { + drawnRect.origin.x -= 3; + drawnRect.size.width += 5; + return drawnRect; + } + else + return drawnRect; +} + +- (IBAction)togglePlaylist:(id)sender +{ + NSView *playback_area = [[o_vertical_split subviews] objectAtIndex:0]; + NSView *playlist_area = [[o_vertical_split subviews] objectAtIndex:1]; + NSRect newVid = [playback_area frame]; + NSRect newList = [playlist_area frame]; + if(newList.size.height < 50 && sender != self && sender != o_vlc_main) { + newList.size.height = newVid.size.height/2; + newVid.size.height = newVid.size.height/2; + newVid.origin.y = newVid.origin.y + newList.size.height; + [o_btn_playlist setState: NSOnState]; + [o_searchfield setHidden:NO]; + [o_playlist_view setHidden:NO]; + [o_playlist swapPlaylists: o_playlist_table]; + [o_vlc_main togglePlaylist:self]; + } + else { + newVid.size.height = newVid.size.height + newList.size.height; + newList.size.height = 0; + newVid.origin.y = 0; + [o_btn_playlist setState: NSOffState]; + [o_searchfield setHidden:YES]; + [o_playlist_view setHidden:YES]; + } + [playback_area setFrame: newVid]; + [playlist_area setFrame: newList]; +} + /***************************************************************************** * Fullscreen support */ @@ -277,9 +461,10 @@ [o_fullscreen_window setBackgroundColor: [NSColor blackColor]]; [o_fullscreen_window setCanBecomeKeyWindow: YES]; - if (![self isVisible] || [self alphaValue] == 0.0) + if (![self isVisible] || [self alphaValue] == 0.0 || MACOS_VERSION < 10.4f) { - /* We don't animate if we are not visible, instead we + /* 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; @@ -293,6 +478,8 @@ [o_temp_view setFrame:[o_view frame]]; [o_fullscreen_window setContentView:o_view]; + [o_fullscreen_window makeKeyAndOrderFront:self]; + [o_fullscreen_window makeKeyAndOrderFront:self]; [o_fullscreen_window orderFront:self animate:YES]; @@ -308,12 +495,20 @@ } /* Make sure we don't see the o_view disappearing of the screen during this operation */ - NSDisableScreenUpdates(); - [[self contentView] replaceSubview:o_view with:o_temp_view]; + DisableScreenUpdates(); + [[self contentView] replaceSubview:o_view with:o_temp_view]; [o_temp_view setFrame:[o_view frame]]; [o_fullscreen_window setContentView:o_view]; [o_fullscreen_window makeKeyAndOrderFront:self]; - NSEnableScreenUpdates(); + EnableScreenUpdates(); + } + + if (MACOS_VERSION < 10.4f) + { + /* We were already fullscreen nothing to do when NSAnimation + * is not supported */ + [self unlockFullscreenAnimation]; + return; } /* We are in fullscreen (and no animation is running) */ @@ -417,9 +612,10 @@ return; } - if (fadeout) + if (fadeout || MACOS_VERSION < 10.4f) { - /* We don't animate if we are not visible, instead we + /* 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; @@ -500,7 +696,7 @@ { /* 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 */ - NSDisableScreenUpdates(); + DisableScreenUpdates(); [o_view retain]; [o_view removeFromSuperviewWithoutNeedingDisplay]; [[self contentView] replaceSubview:o_temp_view with:o_view]; @@ -510,7 +706,7 @@ if ([self isVisible]) [super makeKeyAndOrderFront:self]; /* our version contains a workaround */ [o_fullscreen_window orderOut: self]; - NSEnableScreenUpdates(); + EnableScreenUpdates(); [o_fullscreen_window release]; o_fullscreen_window = nil; @@ -626,3 +822,167 @@ } @end + +/***************************************************************************** + * embeddedbackground + *****************************************************************************/ + + +@implementation embeddedbackground + +- (void)dealloc +{ + [self unregisterDraggedTypes]; + [super dealloc]; +} + +- (void)awakeFromNib +{ + [self registerForDraggedTypes:[NSArray arrayWithObjects:NSTIFFPboardType, + NSFilenamesPboardType, nil]]; + [self addSubview: o_timeslider]; + [self addSubview: o_scrollfield]; + [self addSubview: o_time]; + [self addSubview: o_main_pgbar]; + [self addSubview: o_btn_backward]; + [self addSubview: o_btn_forward]; + [self addSubview: o_btn_fullscreen]; + [self addSubview: o_btn_equalizer]; + [self addSubview: o_btn_playlist]; + [self addSubview: o_btn_play]; + [self addSubview: o_btn_prev]; + [self addSubview: o_btn_stop]; + [self addSubview: o_btn_next]; + [self addSubview: o_btn_volume_down]; + [self addSubview: o_volumeslider]; + [self addSubview: o_btn_volume_up]; + [self addSubview: o_searchfield]; +} + +- (NSDragOperation)draggingEntered:(id )sender +{ + if ((NSDragOperationGeneric & [sender draggingSourceOperationMask]) + == NSDragOperationGeneric) + { + return NSDragOperationGeneric; + } + else + { + return NSDragOperationNone; + } +} + +- (BOOL)prepareForDragOperation:(id )sender +{ + return YES; +} + +- (BOOL)performDragOperation:(id )sender +{ + NSPasteboard *o_paste = [sender draggingPasteboard]; + NSArray *o_types = [NSArray arrayWithObjects: NSFilenamesPboardType, nil]; + NSString *o_desired_type = [o_paste availableTypeFromArray:o_types]; + NSData *o_carried_data = [o_paste dataForType:o_desired_type]; + BOOL b_autoplay = config_GetInt( VLCIntf, "macosx-autoplay" ); + + if( o_carried_data ) + { + if ([o_desired_type isEqualToString:NSFilenamesPboardType]) + { + int i; + NSArray *o_array = [NSArray array]; + NSArray *o_values = [[o_paste propertyListForType: NSFilenamesPboardType] + sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; + + for( i = 0; i < (int)[o_values count]; i++) + { + NSDictionary *o_dic; + o_dic = [NSDictionary dictionaryWithObject:[o_values objectAtIndex:i] forKey:@"ITEM_URL"]; + o_array = [o_array arrayByAddingObject: o_dic]; + } + if( b_autoplay ) + [[[VLCMain sharedInstance] playlist] appendArray: o_array atPos: -1 enqueue:NO]; + else + [[[VLCMain sharedInstance] playlist] appendArray: o_array atPos: -1 enqueue:YES]; + return YES; + } + } + [self setNeedsDisplay:YES]; + return YES; +} + +- (void)concludeDragOperation:(id )sender +{ + [self setNeedsDisplay:YES]; +} + +- (void)drawRect:(NSRect)rect +{ + NSImage *leftImage = [NSImage imageNamed:@"display_left"]; + NSImage *middleImage = [NSImage imageNamed:@"display_middle"]; + NSImage *rightImage = [NSImage imageNamed:@"display_right"]; + [middleImage setSize:NSMakeSize(NSWidth( [self bounds] ) - 134 - [leftImage size].width - [rightImage size].width, [middleImage size].height)]; + [middleImage setScalesWhenResized:YES]; + [leftImage compositeToPoint:NSMakePoint( 122., 40. ) operation:NSCompositeSourceOver]; + [middleImage compositeToPoint:NSMakePoint( 122. + [leftImage size].width, 40. ) operation:NSCompositeSourceOver]; + [rightImage compositeToPoint:NSMakePoint( NSWidth( [self bounds] ) - 12 - [rightImage size].width, 40. ) operation:NSCompositeSourceOver]; +} + +- (void)mouseDown:(NSEvent *)event +{ + dragStart = [self convertPoint:[event locationInWindow] fromView:nil]; +} + +- (void)mouseDragged:(NSEvent *)event +{ + NSPoint dragLocation = [self convertPoint:[event locationInWindow] fromView:nil]; + NSPoint winOrigin = [o_window frame].origin; + + NSPoint newOrigin = NSMakePoint(winOrigin.x + (dragLocation.x - dragStart.x), + winOrigin.y + (dragLocation.y - dragStart.y)); + [o_window setFrameOrigin: newOrigin]; +} + +@end + +/***************************************************************************** + * statusbar + *****************************************************************************/ + + +@implementation statusbar +- (void)awakeFromNib +{ + [self addSubview: o_text]; + mainwindow = YES; +} + +- (void)resignMainWindow +{ + mainwindow = NO; + [self needsDisplay]; +} + +- (void)becomeMainWindow +{ + mainwindow = YES; + [self needsDisplay]; +} + +- (void)drawRect:(NSRect)rect +{ + if(mainwindow) + [[NSColor colorWithCalibratedRed:0.820 + green:0.843 + blue:0.886 + alpha:1.0] set]; + else + [[NSColor colorWithCalibratedWhite:0.91 alpha:1.0] set]; + NSRectFill(rect); + /*NSRect divider = rect; + divider.origin.y += divider.size.height - 1; + divider.size.height = 1; + [[NSColor colorWithCalibratedWhite:0.65 alpha:1.] set]; + NSRectFill(divider);*/ +} +@end