Commit c1e002d0 authored by Pierre d'Herbemont's avatar Pierre d'Herbemont

macosx: Group via pragma related methods.

This file is way too big (!).
parent f6c0a1a1
......@@ -64,30 +64,13 @@
*****************************************************************************/
static void Run ( intf_thread_t *p_intf );
/* Quick hack */
/*****************************************************************************
* VLCApplication implementation (this hack is really disgusting now,
* feel free to fix.)
*****************************************************************************/
@interface VLCApplication : NSApplication
{
libvlc_int_t *o_libvlc;
}
- (void)setVLC: (libvlc_int_t *)p_libvlc;
@end
static void * ManageThread( void *user_data );
static unichar VLCKeyToCocoa( unsigned int i_key );
static unsigned int VLCModifiersToCocoa( unsigned int i_key );
@implementation VLCApplication
- (void)setVLC: (libvlc_int_t *) p_libvlc
{
o_libvlc = p_libvlc;
}
- (void)terminate: (id)sender
{
vlc_object_kill( o_libvlc );
[super terminate: sender];
}
@end
#pragma mark VLC -
#pragma mark VLC Interface Object Callbacks
/*****************************************************************************
* OpenIntf: initialize interface
......@@ -168,17 +151,8 @@ static void Run( intf_thread_t *p_intf )
[o_pool release];
}
/*****************************************************************************
* ManageThread: An ugly thread that polls
*****************************************************************************/
static void * ManageThread( void *user_data )
{
id self = user_data;
[self manage];
return NULL;
}
#pragma mark -
#pragma mark Variables Callback
/*****************************************************************************
* playlistChanged: Callback triggered by the intf-change playlist
......@@ -239,90 +213,16 @@ static int InteractCallback( vlc_object_t *p_this, const char *psz_variable,
return VLC_SUCCESS;
}
static struct
{
unichar i_nskey;
unsigned int i_vlckey;
} nskeys_to_vlckeys[] =
{
{ NSUpArrowFunctionKey, KEY_UP },
{ NSDownArrowFunctionKey, KEY_DOWN },
{ NSLeftArrowFunctionKey, KEY_LEFT },
{ NSRightArrowFunctionKey, KEY_RIGHT },
{ NSF1FunctionKey, KEY_F1 },
{ NSF2FunctionKey, KEY_F2 },
{ NSF3FunctionKey, KEY_F3 },
{ NSF4FunctionKey, KEY_F4 },
{ NSF5FunctionKey, KEY_F5 },
{ NSF6FunctionKey, KEY_F6 },
{ NSF7FunctionKey, KEY_F7 },
{ NSF8FunctionKey, KEY_F8 },
{ NSF9FunctionKey, KEY_F9 },
{ NSF10FunctionKey, KEY_F10 },
{ NSF11FunctionKey, KEY_F11 },
{ NSF12FunctionKey, KEY_F12 },
{ NSInsertFunctionKey, KEY_INSERT },
{ NSHomeFunctionKey, KEY_HOME },
{ NSEndFunctionKey, KEY_END },
{ NSPageUpFunctionKey, KEY_PAGEUP },
{ NSPageDownFunctionKey, KEY_PAGEDOWN },
{ NSMenuFunctionKey, KEY_MENU },
{ NSTabCharacter, KEY_TAB },
{ NSCarriageReturnCharacter, KEY_ENTER },
{ NSEnterCharacter, KEY_ENTER },
{ NSBackspaceCharacter, KEY_BACKSPACE },
{ (unichar) ' ', KEY_SPACE },
{ (unichar) 0x1b, KEY_ESC },
{0,0}
};
unichar VLCKeyToCocoa( unsigned int i_key )
{
unsigned int i;
for( i = 0; nskeys_to_vlckeys[i].i_vlckey != 0; i++ )
{
if( nskeys_to_vlckeys[i].i_vlckey == (i_key & ~KEY_MODIFIER) )
{
return nskeys_to_vlckeys[i].i_nskey;
}
}
return (unichar)(i_key & ~KEY_MODIFIER);
}
unsigned int CocoaKeyToVLC( unichar i_key )
{
unsigned int i;
for( i = 0; nskeys_to_vlckeys[i].i_nskey != 0; i++ )
{
if( nskeys_to_vlckeys[i].i_nskey == i_key )
{
return nskeys_to_vlckeys[i].i_vlckey;
}
}
return (unsigned int)i_key;
}
unsigned int VLCModifiersToCocoa( unsigned int i_key )
{
unsigned int new = 0;
if( i_key & KEY_MODIFIER_COMMAND )
new |= NSCommandKeyMask;
if( i_key & KEY_MODIFIER_ALT )
new |= NSAlternateKeyMask;
if( i_key & KEY_MODIFIER_SHIFT )
new |= NSShiftKeyMask;
if( i_key & KEY_MODIFIER_CTRL )
new |= NSControlKeyMask;
return new;
}
#pragma mark -
/*****************************************************************************
* VLCMain implementation
*****************************************************************************/
@implementation VLCMain
#pragma mark -
#pragma mark Initialization
static VLCMain *_o_sharedMainInstance = nil;
+ (VLCMain *)sharedInstance
......@@ -526,107 +426,56 @@ static VLCMain *_o_sharedMainInstance = nil;
nib_main_loaded = TRUE;
}
#pragma mark Toolbar delegate
/* Our item identifiers */
static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl";
- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar
{
return [NSArray arrayWithObjects:
// NSToolbarCustomizeToolbarItemIdentifier,
// NSToolbarFlexibleSpaceItemIdentifier,
// NSToolbarSpaceItemIdentifier,
// NSToolbarSeparatorItemIdentifier,
VLCToolbarMediaControl,
nil ];
}
- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar
{
return [NSArray arrayWithObjects:
VLCToolbarMediaControl,
nil ];
}
- (NSToolbarItem *) toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
- (void)applicationWillFinishLaunching:(NSNotification *)o_notification
{
NSToolbarItem *toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier] autorelease];
o_msg_lock = [[NSLock alloc] init];
o_msg_arr = [[NSMutableArray arrayWithCapacity: 200] retain];
if( [itemIdentifier isEqual: VLCToolbarMediaControl] )
{
[toolbarItem setLabel:@"Media Controls"];
[toolbarItem setPaletteLabel:@"Media Controls"];
/* FIXME: don't poll */
interfaceTimer = [[NSTimer scheduledTimerWithTimeInterval: 0.5
target: self selector: @selector(manageIntf:)
userInfo: nil repeats: FALSE] retain];
NSSize size = toolbarMediaControl.frame.size;
[toolbarItem setView:toolbarMediaControl];
[toolbarItem setMinSize:size];
size.width += 1000.;
[toolbarItem setMaxSize:size];
/* Note: we use the pthread API to support pre-10.5 */
pthread_create( &manage_thread, NULL, ManageThread, self );
// Hack: For some reason we need to make sure
// that the those element are on top
// Add them again will put them frontmost
[toolbarMediaControl addSubview:o_scrollfield];
[toolbarMediaControl addSubview:o_timeslider];
[toolbarMediaControl addSubview:o_timefield];
[toolbarMediaControl addSubview:o_main_pgbar];
[o_controls setupVarMenuItem: o_mi_add_intf target: (vlc_object_t *)p_intf
var: "intf-add" selector: @selector(toggleVar:)];
/* TODO: setup a menu */
}
else
/* check whether the user runs a valid version of OSX; alert is auto-released */
if( MACOS_VERSION < 10.4f )
{
/* itemIdentifier referred to a toolbar item that is not
* provided or supported by us or Cocoa
* Returning nil will inform the toolbar
* that this kind of item is not supported */
toolbarItem = nil;
NSAlert *ourAlert;
int i_returnValue;
ourAlert = [NSAlert alertWithMessageText: _NS("Your version of Mac OS X is not supported")
defaultButton: _NS("Quit")
alternateButton: NULL
otherButton: NULL
informativeTextWithFormat: _NS("VLC media player requires Mac OS X 10.4 or higher.")];
[ourAlert setAlertStyle: NSCriticalAlertStyle];
i_returnValue = [ourAlert runModal];
[NSApp terminate: self];
}
return toolbarItem;
}
#pragma mark -
vlc_thread_set_priority( p_intf, VLC_THREAD_PRIORITY_LOW );
}
- (void)controlTintChanged
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
BOOL b_playing = NO;
if( [o_btn_play alternateImage] == o_img_play_pressed )
b_playing = YES;
if( [NSColor currentControlTint] == NSGraphiteControlTint )
{
o_img_play_pressed = [NSImage imageNamed: @"play_graphite"];
o_img_pause_pressed = [NSImage imageNamed: @"pause_graphite"];
[o_btn_prev setAlternateImage: [NSImage imageNamed: @"previous_graphite"]];
[o_btn_rewind setAlternateImage: [NSImage imageNamed: @"skip_previous_graphite"]];
[o_btn_stop setAlternateImage: [NSImage imageNamed: @"stop_graphite"]];
[o_btn_ff setAlternateImage: [NSImage imageNamed: @"skip_forward_graphite"]];
[o_btn_next setAlternateImage: [NSImage imageNamed: @"next_graphite"]];
[o_btn_fullscreen setAlternateImage: [NSImage imageNamed: @"fullscreen_graphite"]];
[o_btn_playlist setAlternateImage: [NSImage imageNamed: @"playlistdrawer_graphite"]];
[o_btn_equalizer setAlternateImage: [NSImage imageNamed: @"equalizerdrawer_graphite"]];
}
else
{
o_img_play_pressed = [NSImage imageNamed: @"play_blue"];
o_img_pause_pressed = [NSImage imageNamed: @"pause_blue"];
[o_btn_prev setAlternateImage: [NSImage imageNamed: @"previous_blue"]];
[o_btn_rewind setAlternateImage: [NSImage imageNamed: @"skip_previous_blue"]];
[o_btn_stop setAlternateImage: [NSImage imageNamed: @"stop_blue"]];
[o_btn_ff setAlternateImage: [NSImage imageNamed: @"skip_forward_blue"]];
[o_btn_next setAlternateImage: [NSImage imageNamed: @"next_blue"]];
[o_btn_fullscreen setAlternateImage: [NSImage imageNamed: @"fullscreen_blue"]];
[o_btn_playlist setAlternateImage: [NSImage imageNamed: @"playlistdrawer_blue"]];
[o_btn_equalizer setAlternateImage: [NSImage imageNamed: @"equalizerdrawer_blue"]];
}
if( b_playing )
[o_btn_play setAlternateImage: o_img_play_pressed];
else
[o_btn_play setAlternateImage: o_img_pause_pressed];
#ifdef UPDATE_CHECK
/* Check for update silently on startup */
if( !nib_update_loaded )
nib_update_loaded = [NSBundle loadNibNamed:@"Update" owner:self];
if([o_update shouldCheckForUpdate])
[NSThread detachNewThreadSelector:@selector(checkForUpdate) toTarget:o_update withObject:nil];
#endif
/* Handle sleep notification */
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(computerWillSleep:)
name:NSWorkspaceWillSleepNotification object:nil];
[NSThread detachNewThreadSelector:@selector(lookForCrashLog) toTarget:self withObject:nil];
}
- (void)initStrings
......@@ -785,100 +634,221 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl";
[o_crashrep_desc_txt setStringValue: _NS("Do you want to send details on the crash to VLC's development team?\n\nIf you want, you can enter a few lines on what you did before VLC crashed along with other helpful information: a link to download a sample file, a URL of a network stream, ...")];
}
- (void)applicationWillFinishLaunching:(NSNotification *)o_notification
{
o_msg_lock = [[NSLock alloc] init];
o_msg_arr = [[NSMutableArray arrayWithCapacity: 200] retain];
#pragma mark -
#pragma mark Termination
/* FIXME: don't poll */
interfaceTimer = [[NSTimer scheduledTimerWithTimeInterval: 0.5
target: self selector: @selector(manageIntf:)
userInfo: nil repeats: FALSE] retain];
- (void)applicationWillTerminate:(NSNotification *)notification
{
playlist_t * p_playlist;
vout_thread_t * p_vout;
int returnedValue = 0;
msg_Dbg( p_intf, "Terminating" );
/* Note: we use the pthread API to support pre-10.5 */
pthread_create( &manage_thread, NULL, ManageThread, self );
/* Make sure the manage_thread won't call -terminate: again */
pthread_cancel( manage_thread );
[o_controls setupVarMenuItem: o_mi_add_intf target: (vlc_object_t *)p_intf
var: "intf-add" selector: @selector(toggleVar:)];
/* Make sure the intf object is getting killed */
vlc_object_kill( p_intf );
/* check whether the user runs a valid version of OSX; alert is auto-released */
if( MACOS_VERSION < 10.4f )
/* Make sure our manage_thread ends */
pthread_join( manage_thread, NULL );
/* Make sure the interfaceTimer is destroyed */
[interfaceTimer invalidate];
[interfaceTimer release];
interfaceTimer = nil;
/* make sure that the current volume is saved */
config_PutInt( p_intf->p_libvlc, "volume", i_lastShownVolume );
returnedValue = config_SaveConfigFile( p_intf->p_libvlc, "main" );
if( returnedValue != 0 )
msg_Err( p_intf,
"error while saving volume in osx's terminate method (%i)",
returnedValue );
/* save the prefs if they were changed in the extended panel */
if(o_extended && [o_extended getConfigChanged])
{
NSAlert *ourAlert;
int i_returnValue;
ourAlert = [NSAlert alertWithMessageText: _NS("Your version of Mac OS X is not supported")
defaultButton: _NS("Quit")
alternateButton: NULL
otherButton: NULL
informativeTextWithFormat: _NS("VLC media player requires Mac OS X 10.4 or higher.")];
[ourAlert setAlertStyle: NSCriticalAlertStyle];
i_returnValue = [ourAlert runModal];
[NSApp terminate: self];
[o_extended savePrefs];
}
p_intf->b_interaction = false;
var_DelCallback( p_intf, "interaction", InteractCallback, self );
vlc_thread_set_priority( p_intf, VLC_THREAD_PRIORITY_LOW );
}
- (BOOL)application:(NSApplication *)o_app openFile:(NSString *)o_filename
{
BOOL b_autoplay = config_GetInt( VLCIntf, "macosx-autoplay" );
NSDictionary *o_dic = [NSDictionary dictionaryWithObjectsAndKeys: o_filename, @"ITEM_URL", nil];
if( b_autoplay )
[o_playlist appendArray: [NSArray arrayWithObject: o_dic] atPos: -1 enqueue: NO];
else
[o_playlist appendArray: [NSArray arrayWithObject: o_dic] atPos: -1 enqueue: YES];
/* remove global observer watching for vout device changes correctly */
[[NSNotificationCenter defaultCenter] removeObserver: self];
return( TRUE );
}
/* release some other objects here, because it isn't sure whether dealloc
* will be called later on */
- (NSString *)localizedString:(const char *)psz
{
NSString * o_str = nil;
if( nib_about_loaded )
[o_about release];
if( psz != NULL )
if( nib_prefs_loaded )
{
o_str = [[[NSString alloc] initWithUTF8String: psz] autorelease];
[o_sprefs release];
[o_prefs release];
}
if( o_str == NULL )
{
msg_Err( VLCIntf, "could not translate: %s", psz );
return( @"" );
}
if( nib_open_loaded )
[o_open release];
if( nib_extended_loaded )
{
[o_extended release];
}
else
if( nib_bookmarks_loaded )
[o_bookmarks release];
if( o_info )
{
msg_Warn( VLCIntf, "can't translate empty strings" );
return( @"" );
[o_info stopTimers];
[o_info release];
}
return( o_str );
if( nib_wizard_loaded )
[o_wizard release];
[crashLogURLConnection cancel];
[crashLogURLConnection release];
[o_embedded_list release];
[o_interaction_list release];
[o_eyetv release];
[o_img_pause_pressed release];
[o_img_play_pressed release];
[o_img_pause release];
[o_img_play release];
[o_msg_arr removeAllObjects];
[o_msg_arr release];
[o_msg_lock release];
/* write cached user defaults to disk */
[[NSUserDefaults standardUserDefaults] synchronize];
/* Kill the playlist, so that it doesn't accept new request
* such as the play request from vlc.c (we are a blocking interface). */
p_playlist = pl_Yield( p_intf );
vlc_object_kill( p_playlist );
pl_Release( p_intf );
vlc_object_kill( p_intf->p_libvlc );
/* Go back to Run() and make libvlc exit properly */
if( jmpbuffer )
longjmp( jmpbuffer, 1 );
/* not reached */
}
/* When user click in the Dock icon our double click in the finder */
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)hasVisibleWindows
{
if(!hasVisibleWindows)
[o_window makeKeyAndOrderFront:self];
#pragma mark -
#pragma mark Toolbar delegate
return YES;
/* Our item identifiers */
static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl";
- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar
{
return [NSArray arrayWithObjects:
// NSToolbarCustomizeToolbarItemIdentifier,
// NSToolbarFlexibleSpaceItemIdentifier,
// NSToolbarSpaceItemIdentifier,
// NSToolbarSeparatorItemIdentifier,
VLCToolbarMediaControl,
nil ];
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar
{
#ifdef UPDATE_CHECK
/* Check for update silently on startup */
if( !nib_update_loaded )
nib_update_loaded = [NSBundle loadNibNamed:@"Update" owner:self];
return [NSArray arrayWithObjects:
VLCToolbarMediaControl,
nil ];
}
if([o_update shouldCheckForUpdate])
[NSThread detachNewThreadSelector:@selector(checkForUpdate) toTarget:o_update withObject:nil];
#endif
- (NSToolbarItem *) toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
{
NSToolbarItem *toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier] autorelease];
/* Handle sleep notification */
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(computerWillSleep:)
name:NSWorkspaceWillSleepNotification object:nil];
if( [itemIdentifier isEqual: VLCToolbarMediaControl] )
{
[toolbarItem setLabel:@"Media Controls"];
[toolbarItem setPaletteLabel:@"Media Controls"];
[NSThread detachNewThreadSelector:@selector(lookForCrashLog) toTarget:self withObject:nil];
NSSize size = toolbarMediaControl.frame.size;
[toolbarItem setView:toolbarMediaControl];
[toolbarItem setMinSize:size];
size.width += 1000.;
[toolbarItem setMaxSize:size];
// Hack: For some reason we need to make sure
// that the those element are on top
// Add them again will put them frontmost
[toolbarMediaControl addSubview:o_scrollfield];
[toolbarMediaControl addSubview:o_timeslider];
[toolbarMediaControl addSubview:o_timefield];
[toolbarMediaControl addSubview:o_main_pgbar];
/* TODO: setup a menu */
}
else
{
/* itemIdentifier referred to a toolbar item that is not
* provided or supported by us or Cocoa
* Returning nil will inform the toolbar
* that this kind of item is not supported */
toolbarItem = nil;
}
return toolbarItem;
}
#pragma mark -
#pragma mark Other notification
- (void)controlTintChanged
{
BOOL b_playing = NO;
if( [o_btn_play alternateImage] == o_img_play_pressed )
b_playing = YES;
if( [NSColor currentControlTint] == NSGraphiteControlTint )
{
o_img_play_pressed = [NSImage imageNamed: @"play_graphite"];
o_img_pause_pressed = [NSImage imageNamed: @"pause_graphite"];
[o_btn_prev setAlternateImage: [NSImage imageNamed: @"previous_graphite"]];
[o_btn_rewind setAlternateImage: [NSImage imageNamed: @"skip_previous_graphite"]];
[o_btn_stop setAlternateImage: [NSImage imageNamed: @"stop_graphite"]];
[o_btn_ff setAlternateImage: [NSImage imageNamed: @"skip_forward_graphite"]];
[o_btn_next setAlternateImage: [NSImage imageNamed: @"next_graphite"]];
[o_btn_fullscreen setAlternateImage: [NSImage imageNamed: @"fullscreen_graphite"]];
[o_btn_playlist setAlternateImage: [NSImage imageNamed: @"playlistdrawer_graphite"]];
[o_btn_equalizer setAlternateImage: [NSImage imageNamed: @"equalizerdrawer_graphite"]];
}
else
{
o_img_play_pressed = [NSImage imageNamed: @"play_blue"];
o_img_pause_pressed = [NSImage imageNamed: @"pause_blue"];
[o_btn_prev setAlternateImage: [NSImage imageNamed: @"previous_blue"]];
[o_btn_rewind setAlternateImage: [NSImage imageNamed: @"skip_previous_blue"]];
[o_btn_stop setAlternateImage: [NSImage imageNamed: @"stop_blue"]];
[o_btn_ff setAlternateImage: [NSImage imageNamed: @"skip_forward_blue"]];
[o_btn_next setAlternateImage: [NSImage imageNamed: @"next_blue"]];
[o_btn_fullscreen setAlternateImage: [NSImage imageNamed: @"fullscreen_blue"]];
[o_btn_playlist setAlternateImage: [NSImage imageNamed: @"playlistdrawer_blue"]];
[o_btn_equalizer setAlternateImage: [NSImage imageNamed: @"equalizerdrawer_blue"]];
}
if( b_playing )
[o_btn_play setAlternateImage: o_img_play_pressed];
else
[o_btn_play setAlternateImage: o_img_pause_pressed];
}
/* Listen to the remote in exclusive mode, only when VLC is the active
......@@ -904,6 +874,33 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl";
}
}
#pragma mark -
#pragma mark File opening
- (BOOL)application:(NSApplication *)o_app openFile:(NSString *)o_filename
{
BOOL b_autoplay = config_GetInt( VLCIntf, "macosx-autoplay" );
NSDictionary *o_dic = [NSDictionary dictionaryWithObjectsAndKeys: o_filename, @"ITEM_URL", nil];
if( b_autoplay )
[o_playlist appendArray: [NSArray arrayWithObject: o_dic] atPos: -1 enqueue: NO];
else
[o_playlist appendArray: [NSArray arrayWithObject: o_dic] atPos: -1 enqueue: YES];
return( TRUE );
}
/* When user click in the Dock icon our double click in the finder */
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)hasVisibleWindows
{
if(!hasVisibleWindows)
[o_window makeKeyAndOrderFront:self];
return YES;