/*****************************************************************************
* vout.m: MacOS X video output module
*****************************************************************************
- * Copyright (C) 2001-2007 the VideoLAN team
+ * Copyright (C) 2001-2009 the VideoLAN team
* $Id$
*
* Authors: Colin Delacroix <colin@zoy.org>
* Derk-Jan Hartman <hartman at videolan dot org>
* Eric Petit <titer@m0k.org>
* Benjamin Pracht <bigben at videolan dot org>
- * Felix K\9fhne <fkuehne at videolan dot org>
+ * 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
*****************************************************************************/
#include <errno.h> /* ENOMEM */
#include <stdlib.h> /* free() */
-#include <string.h> /* strerror() */
+#include <string.h>
/* BeginFullScreen, EndFullScreen */
#include <QuickTime/QuickTime.h>
+/* prevent system sleep */
+#import <CoreServices/CoreServices.h>
+
#include <vlc_keys.h>
#include "intf.h"
var_Create( p_vout->p_libvlc, "video-device", VLC_VAR_INTEGER );
var_Set( p_vout->p_libvlc, "video-device", new_val );
- val.b_bool = VLC_TRUE;
+ val.b_bool = true;
var_Set( p_vout, "intf-change", val );
return VLC_SUCCESS;
}
- (id)getViewForWindow: (id)o_window
{
- id o_enumerator = [o_embedded_array objectEnumerator];
- id o_current_embedded;
-
- while( (o_current_embedded = [o_enumerator nextObject]) )
+ if( o_embedded_array != nil )
{
- if( [o_current_embedded getWindow] == o_window )
+ id o_enumerator = [o_embedded_array objectEnumerator];
+ id o_current_embedded;
+ if( o_window != nil )
{
- return o_current_embedded;
+ while( (o_current_embedded = [o_enumerator nextObject]) )
+ {
+ if( [o_current_embedded getWindow] == o_window )
+ {
+ return o_current_embedded;
+ }
+ }
}
}
return nil;
*****************************************************************************/
@implementation VLCVoutView
-- (id)initWithFrame:(NSRect)frameRect
+- (id)initWithFrame: (NSRect)frameRect
{
- [super initWithFrame: frameRect];
+ self = [super initWithFrame: frameRect];
p_vout = NULL;
o_view = nil;
s_frame = &frameRect;
return self;
}
-- (BOOL)setVout: (vout_thread_t *) vout subView: (NSView *) view
- frame: (NSRect *) frame
+- (BOOL)setVout: (vout_thread_t *) vout
+ subView: (NSView *) view
+ frame: (NSRect *) frame
{
int i_device;
NSAutoreleasePool *o_pool = [[NSAutoreleasePool alloc] init];
var_Create( p_real_vout, "video-device", VLC_VAR_INTEGER |
VLC_VAR_HASCHOICE );
- text.psz_string = _("Video Device");
+ text.psz_string = _("Fullscreen Video Device");
var_Change( p_real_vout, "video-device", VLC_VAR_SETTEXT, &text, NULL );
NSEnumerator * o_enumerator = [o_screens objectEnumerator];
var_AddCallback( p_real_vout, "video-device", DeviceCallback,
NULL );
- val2.b_bool = VLC_TRUE;
+ val2.b_bool = true;
var_Set( p_real_vout, "intf-change", val2 );
}
p_vout = NULL;
s_frame = nil;
o_window = nil;
- p_real_vout = NULL;
+ p_real_vout = NULL;
}
- (void)updateTitle
{
- NSMutableString * o_title = nil, * o_mrl = nil;
+ NSString * o_title = nil;
+ NSMutableString * o_mrl = nil;
input_thread_t * p_input;
+ char * psz_title;
- if( p_vout == NULL )
- {
- return;
- }
+ if( !p_vout ) return;
p_input = vlc_object_find( p_vout, VLC_OBJECT_INPUT, FIND_PARENT );
- if( p_input == NULL )
- {
- return;
- }
+ if( !p_input ) return;
+
+ input_item_t * p_item = input_GetItem( p_input );
- if( input_GetItem(p_input)->psz_name != NULL )
- o_title = [NSMutableString stringWithUTF8String:
- input_GetItem(p_input)->psz_name];
- if( input_GetItem(p_input)->psz_uri != NULL )
- o_mrl = [NSMutableString stringWithUTF8String:
- input_GetItem(p_input)->psz_uri];
- if( o_title == nil )
+ psz_title = input_item_GetNowPlaying ( p_item );
+ if( !psz_title )
+ psz_title = input_item_GetName( p_item );
+
+ if( psz_title )
+ o_title = [NSString stringWithUTF8String: psz_title];
+
+ char *psz_uri = input_item_GetURI( p_item );
+ if( psz_uri )
+ o_mrl = [NSMutableString stringWithUTF8String: psz_uri];
+
+ free( psz_title );
+ free( psz_uri );
+
+ if( !o_title )
o_title = o_mrl;
if( o_mrl != nil )
[o_mrl deleteCharactersInRange: prefix_range];
if( [o_mrl characterAtIndex:0] == '/' )
- {
+ {
/* it's a local file */
[o_window setRepresentedFilename: o_mrl];
}
}
else
{
- [o_window setTitle: [NSString stringWithCString: VOUT_TITLE]];
+ [o_window setTitle: [NSString stringWithUTF8String: VOUT_TITLE]];
}
vlc_object_release( p_input );
}
-
- (void)setOnTop:(BOOL)b_on_top
{
if( b_on_top )
}
}
-- (void)scaleWindowWithFactor: (float)factor animate: (BOOL)animate
+- (NSSize)voutSizeForFactor: (float)factor
{
- NSSize newsize;
int i_corrected_height, i_corrected_width;
- NSPoint topleftbase;
- NSPoint topleftscreen;
+ NSSize newsize;
+
+ if( p_vout->render.i_height * p_vout->render.i_aspect >
+ p_vout->render.i_width * VOUT_ASPECT_FACTOR )
+ {
+ i_corrected_width = p_vout->render.i_height * p_vout->render.i_aspect /
+ VOUT_ASPECT_FACTOR;
+ newsize.width = (int) ( i_corrected_width * factor );
+ newsize.height = (int) ( p_vout->render.i_height * factor );
+ }
+ else
+ {
+ i_corrected_height = p_vout->render.i_width * VOUT_ASPECT_FACTOR /
+ p_vout->render.i_aspect;
+ newsize.width = (int) ( p_vout->render.i_width * factor );
+ newsize.height = (int) ( i_corrected_height * factor );
+ }
+
+ return newsize;
+}
+- (void)scaleWindowWithFactor: (float)factor animate: (BOOL)animate
+{
if ( !p_vout->b_fullscreen )
{
+ NSSize newsize;
+ NSPoint topleftbase;
+ NSPoint topleftscreen;
NSView *mainView;
NSRect new_frame;
topleftbase.x = 0;
topleftbase.y = [o_window frame].size.height;
topleftscreen = [o_window convertBaseToScreen: topleftbase];
- if( p_vout->render.i_height * p_vout->render.i_aspect >
- p_vout->render.i_width * VOUT_ASPECT_FACTOR )
- {
- i_corrected_width = p_vout->render.i_height * p_vout->render.i_aspect /
- VOUT_ASPECT_FACTOR;
- newsize.width = (int) ( i_corrected_width * factor );
- newsize.height = (int) ( p_vout->render.i_height * factor );
- }
- else
- {
- i_corrected_height = p_vout->render.i_width * VOUT_ASPECT_FACTOR /
- p_vout->render.i_aspect;
- newsize.width = (int) ( p_vout->render.i_width * factor );
- newsize.height = (int) ( i_corrected_height * factor );
- }
+ newsize = [self voutSizeForFactor:factor];
/* In fullscreen mode we need to use a view that is different from
* ourselves, with the VLCEmbeddedWindow */
new_frame.origin.x = topleftscreen.x;
new_frame.origin.y = topleftscreen.y - new_frame.size.height;
- [o_window setFrame: new_frame display: animate animate: animate];
-
+ [o_window setFrame:new_frame display:animate animate:animate];
p_vout->i_changes |= VOUT_SIZE_CHANGE;
}
}
if( !p_real_vout ) return;
if( var_Get( p_real_vout, "video-on-top", &val )>=0 && val.b_bool)
{
- val.b_bool = VLC_FALSE;
+ val.b_bool = false;
}
else
{
- val.b_bool = VLC_TRUE;
+ val.b_bool = true;
}
var_Set( p_real_vout, "video-on-top", val );
}
- (BOOL)isFullscreen
{
vlc_value_t val;
+ if( !p_real_vout ) return NO;
var_Get( p_real_vout, "fullscreen", &val );
return( val.b_bool );
}
- (void)snapshot
{
- vout_Control( p_real_vout, VOUT_SNAPSHOT );
+ var_TriggerCallback( p_real_vout, "video-snapshot" );
}
- (void)manage
{
/* Disable Screensaver, when we're playing something, but allow it on pause */
+ if( !VLCIntf || !VLCIntf->p_sys )
+ return;
+
+ UInt8 UsrActivity;
if( VLCIntf->p_sys->i_play_status == PLAYING_S )
UpdateSystemActivity( UsrActivity );
}
return o_window;
}
+- (void)scrollWheel:(NSEvent *)theEvent
+{
+ VLCControls * o_controls = (VLCControls *)[[NSApp delegate] getControls];
+ [o_controls scrollWheel: theEvent];
+}
+
- (void)keyDown:(NSEvent *)o_event
{
unichar key = 0;
if( i_pressed_modifiers & NSCommandKeyMask )
val.i_int |= KEY_MODIFIER_COMMAND;
- key = [[o_event charactersIgnoringModifiers] characterAtIndex: 0];
+ key = [[[o_event charactersIgnoringModifiers] lowercaseString] characterAtIndex: 0];
if( key )
{
[self toggleFullscreen];
}
}
- else if ( key == ' ' )
+ else if ( p_vout )
{
- vlc_value_t val;
- val.i_int = config_GetInt( p_vout, "key-play-pause" );
- var_Set( p_vout->p_libvlc, "key-pressed", val );
- }
- else
- {
- val.i_int |= CocoaKeyToVLC( key );
+ if( key == ' ')
+ val.i_int = config_GetInt( p_vout, "key-play-pause" );
+ else
+ val.i_int |= (int)CocoaKeyToVLC( key );
var_Set( p_vout->p_libvlc, "key-pressed", val );
}
+ else NSLog( @"Could not send keyevent to VLC core" );
}
else
- {
[super keyDown: o_event];
- }
}
- (void)mouseDown:(NSEvent *)o_event
{
vlc_value_t val;
-
if( p_vout )
{
if( ( [o_event type] == NSLeftMouseDown ) &&
( [o_event modifierFlags] & NSControlKeyMask ) ) )
{
msg_Dbg( p_vout, "received NSRightMouseDown (generic method) or Ctrl clic" );
- [NSMenu popUpContextMenu: [[VLCMain sharedInstance] getVoutMenu] withEvent: o_event forView: [[[VLCMain sharedInstance] getControls] getVoutView]];
+ [NSMenu popUpContextMenu: [[VLCMain sharedInstance] getVoutMenu] withEvent: o_event forView: [[[VLCMain sharedInstance] getControls] voutView]];
}
}
if( p_vout && [o_event type] == NSRightMouseDown )
{
msg_Dbg( p_vout, "received NSRightMouseDown (specific method)" );
- [NSMenu popUpContextMenu: [[VLCMain sharedInstance] getVoutMenu] withEvent: o_event forView: [[[VLCMain sharedInstance] getControls] getVoutView]];
+ [NSMenu popUpContextMenu: [[VLCMain sharedInstance] getVoutMenu] withEvent: o_event forView: [[[VLCMain sharedInstance] getControls] voutView]];
}
[super mouseDown: o_event];
if( p_vout && [o_event type] == NSLeftMouseUp )
{
- vlc_value_t b_val;
- b_val.b_bool = VLC_TRUE;
- var_Set( p_vout, "mouse-clicked", b_val );
+ var_SetBool( p_vout, "mouse-clicked", true );
var_Get( p_vout, "mouse-button-down", &val );
val.i_int &= ~1;
{
/* FIXME: this isn't the appropriate place, but we can't receive
* NSRightMouseDown some how */
- msg_Dbg( p_vout, "received NSRightMouseUp" );
- [NSMenu popUpContextMenu: [[VLCMain sharedInstance] getVoutMenu] withEvent: o_event forView: [[[VLCMain sharedInstance] getControls] getVoutView]];
+ msg_Dbg( p_vout, "received NSRightMouseUp" );
+ [NSMenu popUpContextMenu: [[VLCMain sharedInstance] getVoutMenu] withEvent: o_event forView: [[[VLCMain sharedInstance] getControls] voutView]];
}
[super mouseUp: o_event];
}
var_Set( p_vout, "mouse-y", val );
- val.b_bool = VLC_TRUE;
+ val.b_bool = true;
var_Set( p_vout, "mouse-moved", val );
}
if( [self isFullscreen] )
{
/* p_real_vout: the vout we have to use to check for video-on-top
and a few other things. If we are the QuickTime output, it's us.
- It we are the OpenGL provider, it is our parent. */
- if( p_vout->i_object_type == VLC_OBJECT_OPENGL )
- {
- return (vout_thread_t *) p_vout->p_parent;
- }
- else
- {
- return p_vout;
- }
-
+ It we are the OpenGL provider, it is our parent.
+ Since we can't be the QuickTime output anymore, we need to be
+ the parent.
+ FIXME: check with the caca and x11 vouts! */
+ return (vout_thread_t *) p_vout->p_parent;
}
-+ (id)getVoutView: (vout_thread_t *)p_vout subView: (NSView *)view
- frame: (NSRect *)s_frame
++ (id)voutView: (vout_thread_t *)p_vout subView: (NSView *)view
+ frame: (NSRect *)s_frame
{
- vlc_value_t value_drawable;
+ int i_drawable_gl;
int i_timeout;
id o_return = nil;
- var_Get( p_vout->p_libvlc, "drawable", &value_drawable );
+ i_drawable_gl = var_GetInteger( p_vout->p_libvlc, "drawable-gl" );
var_Create( p_vout, "macosx-vdev", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
var_Create( p_vout, "macosx-stretch", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
var_Create( p_vout, "macosx-opaqueness", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT );
var_Create( p_vout, "macosx-background", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
var_Create( p_vout, "macosx-black", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
- var_Create( p_vout, "macosx-embedded", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
-
+ var_Create( p_vout, "embedded-video", VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
/* We only wait for NSApp to initialise if we're not embedded (as in the
* case of the Mozilla plugin). We can tell whether we're embedded or not
- * by examining the "drawable" value: if it's zero, we're running in the
+ * by examining the "drawable-gl" value: if it's zero, we're running in the
* main Mac intf; if it's non-zero, we're embedded. */
- if( value_drawable.i_int == 0 )
+ if( i_drawable_gl == 0 )
{
/* Wait for a MacOS X interface to appear. Timeout is 2 seconds. */
for( i_timeout = 20 ; i_timeout-- ; )
{
if ( VLCIntf && !(p_vout->b_fullscreen) &&
!(var_GetBool( p_vout, "macosx-background" )) &&
- var_GetBool( p_vout, "macosx-embedded") )
+ var_GetBool( p_vout, "embedded-video") )
{
o_return = [[[VLCMain sharedInstance] getEmbeddedList]
getEmbeddedVout];
- (void)enterFullscreen
{
- [[o_view class] resetVout: p_vout];
- [[[[VLCMain sharedInstance] getControls] getFSPanel] setActive: nil];
+ /* Save the settings for next playing item */
+ playlist_t * p_playlist = pl_Hold( p_real_vout );
+ var_SetBool( p_playlist, "fullscreen", true );
+ pl_Release( p_real_vout );
}
- (void)leaveFullscreen
{
- [[o_view class] resetVout: p_vout];
- [[[[VLCMain sharedInstance] getControls] getFSPanel] setNonActive: nil];
+ /* Save the settings for next playing item */
+ playlist_t * p_playlist = pl_Hold( p_real_vout );
+ var_SetBool( p_playlist, "fullscreen", false );
+ pl_Release( p_real_vout );
}
@end
return self;
}
-- (bool)setVout: (vout_thread_t *) p_arg_vout subView: (NSView *) view
+- (BOOL)mouseDownCanMoveWindow
+{
+ return YES;
+}
+
+- (BOOL)setVout: (vout_thread_t *) p_arg_vout subView: (NSView *) view
frame: (NSRect *) s_arg_frame
{
BOOL b_return = [super setVout: p_arg_vout subView: view frame:s_arg_frame];
i_time_mouse_last_moved = mdate();
o_window = [[VLCVoutWindow alloc] initWithVout: p_arg_vout view: self
frame: s_arg_frame];
+
[self updateTitle];
- [view setFrame: [self frame]];
-
- if( var_GetBool( p_real_vout, "video-on-top" ) )
- {
- [o_window setLevel: NSStatusWindowLevel];
- }
-
+ if([self isFullscreen])
+ [o_window performSelectorOnMainThread: @selector(enterFullscreen) withObject: NULL waitUntilDone: YES];
+ else
+ [view setFrame: [self frame]];
- [o_window setAcceptsMouseMovedEvents: TRUE];
return b_return;
}
- (void)closeVout
{
- [o_window closeWindow];
- [o_window setAcceptsMouseMovedEvents: NO];
+ [o_window performSelectorOnMainThread: @selector(close) withObject: NULL waitUntilDone: YES];
i_time_mouse_last_moved = 0;
[super closeVout];
}
- (void)manage
{
+ /* Dooh, why do we spend processor time doing this kind of stuff? */
[super manage];
+ unsigned int i_mouse_hide_timeout =
+ var_CreateGetInteger(p_vout, "mouse-hide-timeout") * 1000;
+
+ if( i_mouse_hide_timeout < 100000 )
+ i_mouse_hide_timeout = 100000;
if( p_vout->b_fullscreen )
{
- if( mdate() - i_time_mouse_last_moved > 3000000 )
+ if( mdate() - i_time_mouse_last_moved > i_mouse_hide_timeout )
{
+ i_time_mouse_last_moved = mdate();
[self hideMouse: YES];
}
}
}
}
+
+- (void)enterFullscreen
+{
+ [o_window performSelectorOnMainThread: @selector(enterFullscreen) withObject: NULL waitUntilDone: NO];
+ [super enterFullscreen];
+
+}
+
+- (void)leaveFullscreen
+{
+ [o_window performSelectorOnMainThread: @selector(leaveFullscreen) withObject: NULL waitUntilDone: NO];
+ [super leaveFullscreen];
+}
+
+
+- (void)scaleWindowWithFactor: (float)factor animate: (BOOL)animate
+{
+ if( p_vout->b_fullscreen )
+ return;
+ [o_window setMovableByWindowBackground: NO];
+ [super scaleWindowWithFactor: factor animate: animate];
+ [o_window setMovableByWindowBackground: YES];
+}
@end
/*****************************************************************************
@implementation VLCEmbeddedVoutView
+- (void)awakeFromNib
+{
+ o_embeddedwindow = [self window];
+}
+
+- (BOOL)mouseDownCanMoveWindow
+{
+ return YES;
+}
+
- (id)initWithFrame: (NSRect)frameRect
{
- [super initWithFrame: frameRect];
- b_used = NO;
- [[[VLCMain sharedInstance] getEmbeddedList] addEmbeddedVout: self];
+ if(self = [super initWithFrame: frameRect])
+ {
+ b_used = NO;
+ [[[VLCMain sharedInstance] getEmbeddedList] addEmbeddedVout: self];
+ o_embeddedwindow = nil; /* Filled later on in -awakeFromNib */
+ }
return self;
}
- (BOOL)setVout: (vout_thread_t *) p_arg_vout subView: (NSView *) view
- frame: (NSRect *)s_arg_frame showWindow: (BOOL)b_show_window
+ frame: (NSRect *)s_arg_frame
{
BOOL b_return;
+
+ [NSObject cancelPreviousPerformRequestsWithTarget:o_window];
+
b_return = [super setVout: p_arg_vout subView: view frame: s_arg_frame];
if( b_return )
{
o_window = [self window];
- if (b_show_window)
- [o_window makeKeyAndOrderFront: self];
+
[o_window setAcceptsMouseMovedEvents: TRUE];
- if( var_GetBool( p_real_vout, "video-on-top" ) )
+ if( var_CreateGetBool( p_real_vout, "video-on-top" ) )
{
[o_window setLevel: NSStatusWindowLevel];
}
[view setFrameSize: [self frame].size];
}
- return b_return;
-}
-
-- (BOOL)setVout: (vout_thread_t *) p_arg_vout subView: (NSView *) view
- frame: (NSRect *) s_arg_frame
-
-{
- return [self setVout: p_arg_vout subView: view frame:s_arg_frame showWindow: YES];
-}
-
-- (void)setUsed: (BOOL)b_new_used
-{
- b_used = b_new_used;
-}
-
-- (BOOL)isUsed
-{
- return b_used;
-}
-
-- (void)closeVout
-{
- [super closeVout];
- [o_window setAcceptsMouseMovedEvents: NO];
- [[[VLCMain sharedInstance] getEmbeddedList] releaseEmbeddedVout: self];
-}
-
-
-@end
-
-@implementation VLCDetachedEmbeddedVoutView
-- (void)awakeFromNib
-{
- o_embeddedwindow = [self window];
-}
-
-- (BOOL)setVout: (vout_thread_t *) p_arg_vout subView: (NSView *) view
- frame: (NSRect *) s_arg_frame
-{
- BOOL b_return = [super setVout: p_arg_vout subView: view frame: s_arg_frame showWindow: NO];
/* o_window needs to point to our o_embeddedwindow, super might have set it
* to the fullscreen window that o_embeddedwindow setups during fullscreen */
o_window = o_embeddedwindow;
-
+
if( b_return )
{
[o_window lockFullscreenAnimation];
[self updateTitle];
+ [NSObject cancelPreviousPerformRequestsWithTarget:o_window];
+
/* Make the window the front and key window before animating */
if ([o_window isVisible] && (![o_window isFullscreen]))
[o_window makeKeyAndOrderFront: self];
[self scaleWindowWithFactor: 1.0 animate: [o_window isVisible] && (![o_window isFullscreen])];
+ [o_embeddedwindow setVideoRatio:[self voutSizeForFactor:1.0]];
+
/* Make sure our window is visible, if we are not in fullscreen */
if (![o_window isFullscreen])
[o_window makeKeyAndOrderFront: self];
[o_window unlockFullscreenAnimation];
}
+
return b_return;
}
-- (void)closeVout
+- (void)setUsed: (BOOL)b_new_used
{
- playlist_t * p_playlist = pl_Yield( VLCIntf );
+ b_used = b_new_used;
+}
- if(!playlist_IsPlaying( p_playlist ))
- [o_window performSelectorOnMainThread: @selector(orderOut:) withObject: self waitUntilDone: YES];
-
- vlc_object_release( p_playlist );
+- (BOOL)isUsed
+{
+ return b_used;
+}
+- (void)closeVout
+{
[super closeVout];
+
+ /* Don't close the window yet, wait a bit to see if a new input is poping up */
+ /* FIXME: Probably fade the window In and Out */
+ /* FIXME: fix core */
+ [o_embeddedwindow performSelector:@selector(orderOut:) withObject:nil afterDelay:3.];
+
+ [[[VLCMain sharedInstance] getEmbeddedList] releaseEmbeddedVout: self];
}
- (void)enterFullscreen
{
+ /* Save settings */
+ [super enterFullscreen];
+
/* We are in a VLCEmbeddedWindow */
[o_embeddedwindow performSelectorOnMainThread: @selector(enterFullscreen) withObject: NULL waitUntilDone: YES];
}
- (void)leaveFullscreen
{
+ /* Save settings */
+ [super leaveFullscreen];
+
/* We are in a VLCEmbeddedWindow */
[o_embeddedwindow performSelectorOnMainThread: @selector(leaveFullscreen) withObject: NULL waitUntilDone: YES];
}
p_vout = vout;
o_view = view;
s_frame = frame;
-
- [self performSelectorOnMainThread: @selector(initReal:)
+ b_init_ok = NO;
+ [self performSelectorOnMainThread: @selector(initMainThread:)
withObject: NULL waitUntilDone: YES];
- if( !b_init_ok )
- {
- return NULL;
- }
-
- return self;
+ return b_init_ok ? self : nil;
}
-- (id)initReal: (id) sender
+- (id)initMainThread: (id) sender
{
- NSAutoreleasePool *o_pool = [[NSAutoreleasePool alloc] init];
- NSArray *o_screens = [NSScreen screens];
- NSScreen *o_screen;
- vlc_bool_t b_menubar_screen = VLC_FALSE;
- int i_device;
-
- b_init_ok = VLC_FALSE;
-
- p_real_vout = [VLCVoutView getRealVout: p_vout];
- i_device = var_GetInteger( p_real_vout->p_libvlc, "video-device" );
- b_black = NO;
- b_embedded = var_GetBool( p_vout, "macosx-embedded" );
-
- /* Find out on which screen to open the window */
- o_screen = [NSScreen screenWithDisplayID: (CGDirectDisplayID)i_device];
-
- if( !o_screen )
- o_screen = [NSScreen mainScreen];
+ NSRect rect;
+ rect.size.height = p_vout->i_window_height;
+ rect.size.width = p_vout->i_window_width;
+ rect.origin.x = rect.origin.y = 70.;
- if( [o_screen isMainScreen] )
- b_menubar_screen = VLC_TRUE;
-
- if( p_vout->b_fullscreen )
+ if( self = [super initWithContentRect:rect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO])
{
- CGDisplayFadeReservationToken token;
- NSRect screen_rect = [o_screen frame];
- screen_rect.origin.x = screen_rect.origin.y = 0;
-
- b_black = var_GetBool( p_vout, "macosx-black" );
-
- /* move the FSPanel to front in case that it is currently shown
- * this won't and is not supposed to work when it's fading right now */
- if( [[[[VLCMain sharedInstance] getControls] getFSPanel] isDisplayed] )
- [[[[VLCMain sharedInstance] getControls] getFSPanel] orderFront: self];
-
- /* tell the fspanel to move itself to front next time it's triggered */
- [[[[VLCMain sharedInstance] getControls] getFSPanel] setVoutWasUpdated: i_device];
-
- /* Creates a window with size: screen_rect on o_screen */
- [self initWithContentRect: screen_rect
- styleMask: NSBorderlessWindowMask
- backing: NSBackingStoreBuffered
- defer: YES screen: o_screen];
-
- if( b_menubar_screen )
- {
- SetSystemUIMode( kUIModeAllHidden, kUIOptionAutoShowMenuBar);
- }
- if( b_black == VLC_TRUE )
+ [self setBackgroundColor:[NSColor blackColor]];
+ [self setHasShadow:YES];
+ [self setMovableByWindowBackground: YES];
+ [self center];
+ [self makeKeyAndOrderFront: self];
+ [self setReleasedWhenClosed: YES];
+ [self setFrameUsingName:@"VLCVoutWindowDetached"];
+ [self setFrameAutosaveName:@"VLCVoutWindowDetached"];
+
+ /* We'll catch mouse events */
+ [self makeFirstResponder: o_view];
+ [self setCanBecomeKeyWindow: YES];
+ [self setAcceptsMouseMovedEvents: YES];
+ [self setIgnoresMouseEvents: NO];
+
+ if( var_CreateGetBool( p_vout, "macosx-background" ) )
{
- CGAcquireDisplayFadeReservation(kCGMaxDisplayReservationInterval, &token);
- CGDisplayFade( token, 0.6 , kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0, 0, 0, YES );
+ int i_device = var_GetInteger( p_vout->p_libvlc, "video-device" );
- [o_screen blackoutOtherScreens];
+ /* Find out on which screen to open the window */
+ NSScreen * screen = [NSScreen screenWithDisplayID: (CGDirectDisplayID)i_device];
+ if( !screen ) screen = [NSScreen mainScreen];
- CGDisplayFade( token, 0.3 , kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0, 0, 0, NO );
- CGReleaseDisplayFadeReservation( token);
- }
- }
- else if( var_GetBool( p_vout, "macosx-background" ) )
- {
- NSRect screen_rect = [o_screen frame];
- screen_rect.origin.x = screen_rect.origin.y = 0;
-
- /* Creates a window with size: screen_rect on o_screen */
- [self initWithContentRect: screen_rect
- styleMask: NSBorderlessWindowMask
- backing: NSBackingStoreBuffered
- defer: YES screen: o_screen];
+ NSRect screen_rect = [screen frame];
+ screen_rect.origin.x = screen_rect.origin.y = 0;
- [self setLevel: CGWindowLevelForKey(kCGDesktopWindowLevelKey)];
- }
- else
- {
- unsigned int i_stylemask = NSTitledWindowMask |
- NSMiniaturizableWindowMask |
- NSClosableWindowMask |
- NSResizableWindowMask;
+ /* Creates a window with size: screen_rect on o_screen */
+ [self setFrame: screen_rect display: NO];
- NSRect s_rect;
- if( !s_frame )
- {
- s_rect.size.width = p_vout->i_window_width;
- s_rect.size.height = p_vout->i_window_height;
+ [self setLevel: CGWindowLevelForKey(kCGDesktopWindowLevelKey)];
+ [self setMovableByWindowBackground: NO];
}
- else
+ if( var_CreateGetBool( p_vout, "video-on-top" ) )
{
- s_rect = *s_frame;
+ [self setLevel: NSStatusWindowLevel];
}
- [self initWithContentRect: s_rect
- styleMask: i_stylemask
- backing: NSBackingStoreBuffered
- defer: YES screen: o_screen];
+ [self setAlphaValue: var_CreateGetFloat( p_vout, "macosx-opaqueness" )];
- [self setAlphaValue: var_GetFloat( p_vout, "macosx-opaqueness" )];
+ /* Add the view. It's automatically resized to fit the window */
+ [self setContentView: o_view];
- if( !s_frame )
- {
- [self center];
- }
+ b_init_ok = YES;
}
-
- [self makeKeyAndOrderFront: nil];
- [self setReleasedWhenClosed: YES];
-
- /* We'll catch mouse events */
- [self makeFirstResponder: o_view];
-
- /* Add the view. It's automatically resized to fit the window */
- [self setContentView: o_view];
-
- [o_pool release];
-
- b_init_ok = VLC_TRUE;
return self;
}
-- (void)close
+- (void)enterFullscreen
{
- [o_view closeVout];
-}
+ if( fullscreen ) return;
-- (void)closeWindow
-{
- /* XXX waitUntilDone = NO to avoid a possible deadlock when hitting
- Command-Q */
- [self performSelectorOnMainThread: @selector(closeReal:)
- withObject: NULL waitUntilDone: NO];
-}
+ NSScreen *screen;
+ int i_device;
+ BOOL b_black = NO;
-- (id)closeReal:(id)sender
-{
- if( b_black == VLC_TRUE )
- {
- CGDisplayFadeReservationToken token;
- CGAcquireDisplayFadeReservation(kCGMaxDisplayReservationInterval, &token);
- CGDisplayFade( token, 0.3 , kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0, 0, 0, YES );
-
- [self disableScreenUpdatesUntilFlush];
- [self orderOut: self];
-
- CGDisplayFade( token, 0.6 , kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0, 0, 0, YES );
- CGReleaseDisplayFadeReservation( token);
- CGDisplayRestoreColorSyncSettings();
- }
- [NSScreen unblackoutScreens];
+ i_device = var_GetInteger( p_vout->p_libvlc, "video-device" );
+ b_black = var_CreateGetBool( p_vout, "macosx-black" );
- SetSystemUIMode( kUIModeNormal, 0);
- [super close];
- /* this does only work in embedded mode */
- if( b_embedded == VLC_TRUE )
- [[[[VLCMain sharedInstance] getControls] getFSPanel] orderOut: self];
+ /* Find out on which screen to open the window */
+ screen = [NSScreen screenWithDisplayID: (CGDirectDisplayID)i_device];
+ if( !screen ) screen = [self screen];
- return NULL;
-}
+ if( b_black )
+ [screen blackoutOtherScreens];
-- (id)getVoutView
-{
- return o_view;
-}
+ [self setMovableByWindowBackground: NO];
-- (BOOL)canBecomeKeyWindow
-{
- return YES;
-}
+ if( [screen isMainScreen] )
+ SetSystemUIMode( kUIModeAllHidden, kUIOptionAutoShowMenuBar);
-/* Sometimes crashes VLC....
-- (BOOL)performKeyEquivalent:(NSEvent *)o_event
-{
- return [[VLCMain sharedInstance] hasDefinedShortcutKey:o_event];
-}*/
+ initialFrame = [self frame];
+ [self setFrame:[screen frame] display:YES animate:YES];
+ [self setLevel:NSNormalWindowLevel];
-/* This is actually the same as VLCControls::stop. */
+ /* tell the fspanel to move itself to front next time it's triggered */
+ [[[[VLCMain sharedInstance] getControls] getFSPanel] setVoutWasUpdated: i_device];
+ [[[[VLCMain sharedInstance] getControls] getFSPanel] setActive: nil];
+
+ fullscreen = YES;
+}
-- (BOOL)windowShouldClose:(id)sender
+- (void)leaveFullscreen
{
- playlist_t * p_playlist = vlc_object_find( p_vout, VLC_OBJECT_PLAYLIST,
- FIND_ANYWHERE );
- if( p_playlist == NULL )
- {
- return NO;
- }
+ if( !fullscreen ) return;
+ fullscreen = NO;
- playlist_Stop( p_playlist );
- vlc_object_release( p_playlist );
+ [NSScreen unblackoutScreens];
- /* The window will be closed by the intf later. */
- return NO;
+ [[[[VLCMain sharedInstance] getControls] getFSPanel] setNonActive: nil];
+ SetSystemUIMode( kUIModeNormal, kUIOptionAutoShowMenuBar);
+ [self setFrame:initialFrame display:YES animate:YES];
+ [self setMovableByWindowBackground: YES];
+ if( var_GetBool( p_vout, "video-on-top" ) )
+ [self setLevel: NSStatusWindowLevel];
}
+- (id)voutView
+{
+ return o_view;
+}
@end
+