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 @@ ...@@ -64,30 +64,13 @@
*****************************************************************************/ *****************************************************************************/
static void Run ( intf_thread_t *p_intf ); static void Run ( intf_thread_t *p_intf );
/* Quick hack */ static void * ManageThread( void *user_data );
/*****************************************************************************
* 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 unichar VLCKeyToCocoa( unsigned int i_key );
static unsigned int VLCModifiersToCocoa( unsigned int i_key );
@implementation VLCApplication #pragma mark VLC -
- (void)setVLC: (libvlc_int_t *) p_libvlc #pragma mark VLC Interface Object Callbacks
{
o_libvlc = p_libvlc;
}
- (void)terminate: (id)sender
{
vlc_object_kill( o_libvlc );
[super terminate: sender];
}
@end
/***************************************************************************** /*****************************************************************************
* OpenIntf: initialize interface * OpenIntf: initialize interface
...@@ -168,17 +151,8 @@ static void Run( intf_thread_t *p_intf ) ...@@ -168,17 +151,8 @@ static void Run( intf_thread_t *p_intf )
[o_pool release]; [o_pool release];
} }
/***************************************************************************** #pragma mark -
* ManageThread: An ugly thread that polls #pragma mark Variables Callback
*****************************************************************************/
static void * ManageThread( void *user_data )
{
id self = user_data;
[self manage];
return NULL;
}
/***************************************************************************** /*****************************************************************************
* playlistChanged: Callback triggered by the intf-change playlist * playlistChanged: Callback triggered by the intf-change playlist
...@@ -239,90 +213,16 @@ static int InteractCallback( vlc_object_t *p_this, const char *psz_variable, ...@@ -239,90 +213,16 @@ static int InteractCallback( vlc_object_t *p_this, const char *psz_variable,
return VLC_SUCCESS; return VLC_SUCCESS;
} }
static struct #pragma mark -
{
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;
}
/***************************************************************************** /*****************************************************************************
* VLCMain implementation * VLCMain implementation
*****************************************************************************/ *****************************************************************************/
@implementation VLCMain @implementation VLCMain
#pragma mark -
#pragma mark Initialization
static VLCMain *_o_sharedMainInstance = nil; static VLCMain *_o_sharedMainInstance = nil;
+ (VLCMain *)sharedInstance + (VLCMain *)sharedInstance
...@@ -526,107 +426,56 @@ static VLCMain *_o_sharedMainInstance = nil; ...@@ -526,107 +426,56 @@ static VLCMain *_o_sharedMainInstance = nil;
nib_main_loaded = TRUE; nib_main_loaded = TRUE;
} }
#pragma mark Toolbar delegate - (void)applicationWillFinishLaunching:(NSNotification *)o_notification
/* 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
{ {
NSToolbarItem *toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier] autorelease]; o_msg_lock = [[NSLock alloc] init];
o_msg_arr = [[NSMutableArray arrayWithCapacity: 200] retain];
if( [itemIdentifier isEqual: VLCToolbarMediaControl] ) /* FIXME: don't poll */
{ interfaceTimer = [[NSTimer scheduledTimerWithTimeInterval: 0.5
[toolbarItem setLabel:@"Media Controls"]; target: self selector: @selector(manageIntf:)
[toolbarItem setPaletteLabel:@"Media Controls"]; userInfo: nil repeats: FALSE] retain];
NSSize size = toolbarMediaControl.frame.size; /* Note: we use the pthread API to support pre-10.5 */
[toolbarItem setView:toolbarMediaControl]; pthread_create( &manage_thread, NULL, ManageThread, self );
[toolbarItem setMinSize:size];
size.width += 1000.;
[toolbarItem setMaxSize:size];
// Hack: For some reason we need to make sure [o_controls setupVarMenuItem: o_mi_add_intf target: (vlc_object_t *)p_intf
// that the those element are on top var: "intf-add" selector: @selector(toggleVar:)];
// 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 */ /* check whether the user runs a valid version of OSX; alert is auto-released */
} if( MACOS_VERSION < 10.4f )
else
{ {
/* itemIdentifier referred to a toolbar item that is not NSAlert *ourAlert;
* provided or supported by us or Cocoa int i_returnValue;
* Returning nil will inform the toolbar ourAlert = [NSAlert alertWithMessageText: _NS("Your version of Mac OS X is not supported")
* that this kind of item is not supported */ defaultButton: _NS("Quit")
toolbarItem = nil; 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; #ifdef UPDATE_CHECK
/* Check for update silently on startup */
if( [o_btn_play alternateImage] == o_img_play_pressed ) if( !nib_update_loaded )
b_playing = YES; nib_update_loaded = [NSBundle loadNibNamed:@"Update" owner:self];
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"]]; if([o_update shouldCheckForUpdate])
[o_btn_rewind setAlternateImage: [NSImage imageNamed: @"skip_previous_graphite"]]; [NSThread detachNewThreadSelector:@selector(checkForUpdate) toTarget:o_update withObject:nil];
[o_btn_stop setAlternateImage: [NSImage imageNamed: @"stop_graphite"]]; #endif
[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"]]; /* Handle sleep notification */
[o_btn_rewind setAlternateImage: [NSImage imageNamed: @"skip_previous_blue"]]; [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(computerWillSleep:)
[o_btn_stop setAlternateImage: [NSImage imageNamed: @"stop_blue"]]; name:NSWorkspaceWillSleepNotification object:nil];
[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 ) [NSThread detachNewThreadSelector:@selector(lookForCrashLog) toTarget:self withObject:nil];
[o_btn_play setAlternateImage: o_img_play_pressed];
else
[o_btn_play setAlternateImage: o_img_pause_pressed];
} }
- (void)initStrings - (void)initStrings
...@@ -785,100 +634,221 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl"; ...@@ -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, ...")]; [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 #pragma mark -
#pragma mark Termination
- (void)applicationWillTerminate:(NSNotification *)notification
{ {
o_msg_lock = [[NSLock alloc] init]; playlist_t * p_playlist;
o_msg_arr = [[NSMutableArray arrayWithCapacity: 200] retain]; vout_thread_t * p_vout;
int returnedValue = 0;
/* FIXME: don't poll */ msg_Dbg( p_intf, "Terminating" );
interfaceTimer = [[NSTimer scheduledTimerWithTimeInterval: 0.5
target: self selector: @selector(manageIntf:)
userInfo: nil repeats: FALSE] retain];
/* Note: we use the pthread API to support pre-10.5 */ /* Make sure the manage_thread won't call -terminate: again */
pthread_create( &manage_thread, NULL, ManageThread, self ); pthread_cancel( manage_thread );
[o_controls setupVarMenuItem: o_mi_add_intf target: (vlc_object_t *)p_intf /* Make sure the intf object is getting killed */
var: "intf-add" selector: @selector(toggleVar:)]; vlc_object_kill( p_intf );
/* check whether the user runs a valid version of OSX; alert is auto-released */ /* Make sure our manage_thread ends */
if( MACOS_VERSION < 10.4f ) pthread_join( manage_thread, NULL );
{
NSAlert *ourAlert; /* Make sure the interfaceTimer is destroyed */
int i_returnValue; [interfaceTimer invalidate];
ourAlert = [NSAlert alertWithMessageText: _NS("Your version of Mac OS X is not supported") [interfaceTimer release];
defaultButton: _NS("Quit") interfaceTimer = nil;
alternateButton: NULL
otherButton: NULL /* make sure that the current volume is saved */
informativeTextWithFormat: _NS("VLC media player requires Mac OS X 10.4 or higher.")]; config_PutInt( p_intf->p_libvlc, "volume", i_lastShownVolume );
[ourAlert setAlertStyle: NSCriticalAlertStyle]; returnedValue = config_SaveConfigFile( p_intf->p_libvlc, "main" );
i_returnValue = [ourAlert runModal]; if( returnedValue != 0 )
[NSApp terminate: self]; 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])
{
[o_extended savePrefs];
} }
vlc_thread_set_priority( p_intf, VLC_THREAD_PRIORITY_LOW ); p_intf->b_interaction = false;
var_DelCallback( p_intf, "interaction", InteractCallback, self );
/* remove global observer watching for vout device changes correctly */
[[NSNotificationCenter defaultCenter] removeObserver: self];
/* release some other objects here, because it isn't sure whether dealloc
* will be called later on */
if( nib_about_loaded )
[o_about release];
if( nib_prefs_loaded )
{
[o_sprefs release];
[o_prefs release];
}
if( nib_open_loaded )
[o_open release];
if( nib_extended_loaded )
{
[o_extended release];
}
if( nib_bookmarks_loaded )
[o_bookmarks release];
if( o_info )
{
[o_info stopTimers];
[o_info release];
}
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 */
} }
- (BOOL)application:(NSApplication *)o_app openFile:(NSString *)o_filename #pragma mark -
#pragma mark Toolbar delegate
/* Our item identifiers */
static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl";
- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar
{ {
BOOL b_autoplay = config_GetInt( VLCIntf, "macosx-autoplay" ); return [NSArray arrayWithObjects:
NSDictionary *o_dic = [NSDictionary dictionaryWithObjectsAndKeys: o_filename, @"ITEM_URL", nil]; // NSToolbarCustomizeToolbarItemIdentifier,
if( b_autoplay ) // NSToolbarFlexibleSpaceItemIdentifier,
[o_playlist appendArray: [NSArray arrayWithObject: o_dic] atPos: -1 enqueue: NO]; // NSToolbarSpaceItemIdentifier,
else // NSToolbarSeparatorItemIdentifier,
[o_playlist appendArray: [NSArray arrayWithObject: o_dic] atPos: -1 enqueue: YES]; VLCToolbarMediaControl,
nil ];
}
return( TRUE ); - (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar
{
return [NSArray arrayWithObjects:
VLCToolbarMediaControl,
nil ];
} }
- (NSString *)localizedString:(const char *)psz - (NSToolbarItem *) toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
{ {
NSString * o_str = nil; NSToolbarItem *toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier] autorelease];
if( psz != NULL )
{
o_str = [[[NSString alloc] initWithUTF8String: psz] autorelease];
if( o_str == NULL ) if( [itemIdentifier isEqual: VLCToolbarMediaControl] )
{ {
msg_Err( VLCIntf, "could not translate: %s", psz ); [toolbarItem setLabel:@"Media Controls"];
return( @"" ); [toolbarItem setPaletteLabel:@"Media Controls"];
}
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 else
{ {
msg_Warn( VLCIntf, "can't translate empty strings" ); /* itemIdentifier referred to a toolbar item that is not
return( @"" ); * 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;
return( o_str );
} }
/* When user click in the Dock icon our double click in the finder */ #pragma mark -
- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)hasVisibleWindows #pragma mark Other notification
- (void)controlTintChanged
{ {
if(!hasVisibleWindows) BOOL b_playing = NO;
[o_window makeKeyAndOrderFront:self];
return YES; if( [o_btn_play alternateImage] == o_img_play_pressed )
} b_playing = YES;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification if( [NSColor currentControlTint] == NSGraphiteControlTint )
{ {
#ifdef UPDATE_CHECK o_img_play_pressed = [NSImage imageNamed: @"play_graphite"];
/* Check for update silently on startup */ o_img_pause_pressed = [NSImage imageNamed: @"pause_graphite"];
if( !nib_update_loaded )
nib_update_loaded = [NSBundle loadNibNamed:@"Update" owner:self];
if([o_update shouldCheckForUpdate]) [o_btn_prev setAlternateImage: [NSImage imageNamed: @"previous_graphite"]];
[NSThread detachNewThreadSelector:@selector(checkForUpdate) toTarget:o_update withObject:nil]; [o_btn_rewind setAlternateImage: [NSImage imageNamed: @"skip_previous_graphite"]];
#endif [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"];
/* Handle sleep notification */ [o_btn_prev setAlternateImage: [NSImage imageNamed: @"previous_blue"]];
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(computerWillSleep:) [o_btn_rewind setAlternateImage: [NSImage imageNamed: @"skip_previous_blue"]];
name:NSWorkspaceWillSleepNotification object:nil]; [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"]];
}
[NSThread detachNewThreadSelector:@selector(lookForCrashLog) toTarget:self withObject:nil]; 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 /* Listen to the remote in exclusive mode, only when VLC is the active
...@@ -904,6 +874,33 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl"; ...@@ -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;
}
#pragma mark -
#pragma mark Apple Remote Control
/* Helper method for the remote control interface in order to trigger forward/backward and volume /* Helper method for the remote control interface in order to trigger forward/backward and volume
increase/decrease as long as the user holds the left/right, plus/minus button */ increase/decrease as long as the user holds the left/right, plus/minus button */
- (void) executeHoldActionForRemoteButton: (NSNumber*) buttonIdentifierNumber - (void) executeHoldActionForRemoteButton: (NSNumber*) buttonIdentifierNumber
...@@ -983,6 +980,35 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl"; ...@@ -983,6 +980,35 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl";
} }
} }
#pragma mark -
#pragma mark String utility
// FIXME: this has nothing to do here
- (NSString *)localizedString:(const char *)psz
{
NSString * o_str = nil;
if( psz != NULL )
{
o_str = [[[NSString alloc] initWithUTF8String: psz] autorelease];
if( o_str == NULL )
{
msg_Err( VLCIntf, "could not translate: %s", psz );
return( @"" );
}
}
else
{
msg_Warn( VLCIntf, "can't translate empty strings" );
return( @"" );
}
return( o_str );
}
- (char *)delocalizeString:(NSString *)id - (char *)delocalizeString:(NSString *)id
{ {
NSData * o_data = [id dataUsingEncoding: NSUTF8StringEncoding NSData * o_data = [id dataUsingEncoding: NSUTF8StringEncoding
...@@ -1053,6 +1079,88 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl"; ...@@ -1053,6 +1079,88 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl";
} }
#pragma mark -
#pragma mark Key Shortcuts
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}
};
static 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;
}
static 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;
}
/***************************************************************************** /*****************************************************************************
* hasDefinedShortcutKey: Check to see if the key press is a defined VLC * hasDefinedShortcutKey: Check to see if the key press is a defined VLC
* shortcut key. If it is, pass it off to VLC for handling and return YES, * shortcut key. If it is, pass it off to VLC for handling and return YES,
...@@ -1111,6 +1219,10 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl"; ...@@ -1111,6 +1219,10 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl";
return NO; return NO;
} }
#pragma mark -
#pragma mark Other objects getters
// FIXME: this is ugly and does not respect cocoa naming scheme
- (id)getControls - (id)getControls
{ {
if( o_controls ) if( o_controls )
...@@ -1217,6 +1329,21 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl"; ...@@ -1217,6 +1329,21 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl";
return nil; return nil;
} }
#pragma mark -
#pragma mark Polling
/*****************************************************************************
* ManageThread: An ugly thread that polls
*****************************************************************************/
static void * ManageThread( void *user_data )
{
id self = user_data;
[self manage];
return NULL;
}
- (void)manage - (void)manage
{ {
playlist_t * p_playlist; playlist_t * p_playlist;
...@@ -1294,6 +1421,18 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl"; ...@@ -1294,6 +1421,18 @@ static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl";
[NSApp performSelectorOnMainThread: @selector(terminate:) withObject:nil waitUntilDone:NO]; [NSApp performSelectorOnMainThread: @selector(terminate:) withObject:nil waitUntilDone:NO];
} }
- (void)manageVolumeSlider
{
audio_volume_t i_volume;
aout_VolumeGet( p_intf, &i_volume );
if( i_volume != i_lastShownVolume )
{
i_lastShownVolume = i_volume;
p_intf->p_sys->b_volume_update = TRUE;
}
}
- (void)manageIntf:(NSTimer *)o_timer - (void)manageIntf:(NSTimer *)o_timer
{ {
vlc_value_t val; vlc_value_t val;
...@@ -1499,6 +1638,9 @@ end: ...@@ -1499,6 +1638,9 @@ end:
userInfo: nil repeats: FALSE] retain]; userInfo: nil repeats: FALSE] retain];
} }
#pragma mark -
#pragma mark Interface update
- (void)setupMenus - (void)setupMenus
{ {
playlist_t * p_playlist = pl_Yield( p_intf ); playlist_t * p_playlist = pl_Yield( p_intf );
...@@ -1605,99 +1747,36 @@ end: ...@@ -1605,99 +1747,36 @@ end:
- (void)setScrollField:(NSString *)o_string stopAfter:(int)timeout - (void)setScrollField:(NSString *)o_string stopAfter:(int)timeout
{ {
if( timeout != -1 ) if( timeout != -1 )
i_end_scroll = mdate() + timeout; i_end_scroll = mdate() + timeout;
else else
i_end_scroll = -1; i_end_scroll = -1;
[o_scrollfield setStringValue: o_string]; [o_scrollfield setStringValue: o_string];
} }
- (void)resetScrollField
{
playlist_t * p_playlist = pl_Yield( p_intf );
input_thread_t * p_input = playlist_CurrentInput( p_playlist );
i_end_scroll = -1;
if( p_input && vlc_object_alive (p_input) )
{
NSString *o_temp;
if( input_item_GetNowPlaying ( p_playlist->status.p_item->p_input ) )
o_temp = [NSString stringWithUTF8String:
input_item_GetNowPlaying ( p_playlist->status.p_item->p_input )];
else
o_temp = [NSString stringWithUTF8String:
p_playlist->status.p_item->p_input->psz_name];
[self setScrollField: o_temp stopAfter:-1];
[[[self getControls] getFSPanel] setStreamTitle: o_temp];
vlc_object_release( p_input );
pl_Release( p_intf );
return;
}
pl_Release( p_intf );
[self setScrollField: _NS("VLC media player") stopAfter:-1];
}
- (void)updateMessageArray
{
int i_start, i_stop;
vlc_mutex_lock( p_intf->p_sys->p_sub->p_lock );
i_stop = *p_intf->p_sys->p_sub->pi_stop;
vlc_mutex_unlock( p_intf->p_sys->p_sub->p_lock );
if( p_intf->p_sys->p_sub->i_start != i_stop )
{
NSColor *o_white = [NSColor whiteColor];
NSColor *o_red = [NSColor redColor];
NSColor *o_yellow = [NSColor yellowColor];
NSColor *o_gray = [NSColor grayColor];
NSColor * pp_color[4] = { o_white, o_red, o_yellow, o_gray };
static const char * ppsz_type[4] = { ": ", " error: ",
" warning: ", " debug: " };
for( i_start = p_intf->p_sys->p_sub->i_start;
i_start != i_stop;
i_start = (i_start+1) % VLC_MSG_QSIZE )
{
NSString *o_msg;
NSDictionary *o_attr;
NSAttributedString *o_msg_color;
int i_type = p_intf->p_sys->p_sub->p_msg[i_start].i_type;
[o_msg_lock lock];
if( [o_msg_arr count] + 2 > 400 )
{
unsigned rid[] = { 0, 1 };
[o_msg_arr removeObjectsFromIndices: (unsigned *)&rid
numIndices: sizeof(rid)/sizeof(rid[0])];
}
o_attr = [NSDictionary dictionaryWithObject: o_gray
forKey: NSForegroundColorAttributeName];
o_msg = [NSString stringWithFormat: @"%s%s",
p_intf->p_sys->p_sub->p_msg[i_start].psz_module,
ppsz_type[i_type]];
o_msg_color = [[NSAttributedString alloc]
initWithString: o_msg attributes: o_attr];
[o_msg_arr addObject: [o_msg_color autorelease]];
o_attr = [NSDictionary dictionaryWithObject: pp_color[i_type]
forKey: NSForegroundColorAttributeName];
o_msg = [[NSString stringWithUTF8String: p_intf->p_sys->p_sub->p_msg[i_start].psz_msg] stringByAppendingString: @"\n"];
o_msg_color = [[NSAttributedString alloc]
initWithString: o_msg attributes: o_attr];
[o_msg_arr addObject: [o_msg_color autorelease]];
[o_msg_lock unlock]; - (void)resetScrollField
} {
playlist_t * p_playlist = pl_Yield( p_intf );
input_thread_t * p_input = playlist_CurrentInput( p_playlist );
vlc_mutex_lock( p_intf->p_sys->p_sub->p_lock ); i_end_scroll = -1;
p_intf->p_sys->p_sub->i_start = i_start; if( p_input && vlc_object_alive (p_input) )
vlc_mutex_unlock( p_intf->p_sys->p_sub->p_lock ); {
NSString *o_temp;
if( input_item_GetNowPlaying ( p_playlist->status.p_item->p_input ) )
o_temp = [NSString stringWithUTF8String:
input_item_GetNowPlaying ( p_playlist->status.p_item->p_input )];
else
o_temp = [NSString stringWithUTF8String:
p_playlist->status.p_item->p_input->psz_name];
[self setScrollField: o_temp stopAfter:-1];
[[[self getControls] getFSPanel] setStreamTitle: o_temp];
vlc_object_release( p_input );
pl_Release( p_intf );
return;
} }
pl_Release( p_intf );
[self setScrollField: _NS("VLC media player") stopAfter:-1];
} }
- (void)playStatusUpdated:(int)i_status - (void)playStatusUpdated:(int)i_status
...@@ -1742,18 +1821,6 @@ end: ...@@ -1742,18 +1821,6 @@ end:
[o_mi_crop setEnabled: b_enabled]; [o_mi_crop setEnabled: b_enabled];
} }
- (void)manageVolumeSlider
{
audio_volume_t i_volume;
aout_VolumeGet( p_intf, &i_volume );
if( i_volume != i_lastShownVolume )
{
i_lastShownVolume = i_volume;
p_intf->p_sys->b_volume_update = TRUE;
}
}
- (IBAction)timesliderUpdate:(id)sender - (IBAction)timesliderUpdate:(id)sender
{ {
float f_updated; float f_updated;
...@@ -1795,114 +1862,8 @@ end: ...@@ -1795,114 +1862,8 @@ end:
pl_Release( p_intf ); pl_Release( p_intf );
} }
- (void)applicationWillTerminate:(NSNotification *)notification #pragma mark -
{ #pragma mark Recent Items
playlist_t * p_playlist;
vout_thread_t * p_vout;
int returnedValue = 0;
msg_Dbg( p_intf, "Terminating" );
/* Make sure the manage_thread won't call -terminate: again */
pthread_cancel( manage_thread );
/* Make sure the intf object is getting killed */
vlc_object_kill( p_intf );
/* 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])
{
[o_extended savePrefs];
}
p_intf->b_interaction = false;
var_DelCallback( p_intf, "interaction", InteractCallback, self );
/* remove global observer watching for vout device changes correctly */
[[NSNotificationCenter defaultCenter] removeObserver: self];
/* release some other objects here, because it isn't sure whether dealloc
* will be called later on */
if( nib_about_loaded )
[o_about release];
if( nib_prefs_loaded )
{
[o_sprefs release];
[o_prefs release];
}
if( nib_open_loaded )
[o_open release];
if( nib_extended_loaded )
{
[o_extended release];
}
if( nib_bookmarks_loaded )
[o_bookmarks release];
if( o_info )
{
[o_info stopTimers];
[o_info release];
}
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 */
}
- (IBAction)clearRecentItems:(id)sender - (IBAction)clearRecentItems:(id)sender
{ {
...@@ -1915,6 +1876,9 @@ end: ...@@ -1915,6 +1876,9 @@ end:
[self application: nil openFile: [sender title]]; [self application: nil openFile: [sender title]];
} }
#pragma mark -
#pragma mark Panels
- (IBAction)intfOpenFile:(id)sender - (IBAction)intfOpenFile:(id)sender
{ {
if( !nib_open_loaded ) if( !nib_open_loaded )
...@@ -2015,22 +1979,6 @@ end: ...@@ -2015,22 +1979,6 @@ end:
[o_bookmarks showBookmarks]; [o_bookmarks showBookmarks];
} }
- (IBAction)viewAbout:(id)sender
{
if( !nib_about_loaded )
nib_about_loaded = [NSBundle loadNibNamed:@"About" owner:self];
[o_about showAbout];
}
- (IBAction)showLicense:(id)sender
{
if( !nib_about_loaded )
nib_about_loaded = [NSBundle loadNibNamed:@"About" owner:self];
[o_about showGPL: sender];
}
- (IBAction)viewPreferences:(id)sender - (IBAction)viewPreferences:(id)sender
{ {
if( !nib_prefs_loaded ) if( !nib_prefs_loaded )
...@@ -2043,6 +1991,9 @@ end: ...@@ -2043,6 +1991,9 @@ end:
[o_sprefs showSimplePrefs]; [o_sprefs showSimplePrefs];
} }
#pragma mark -
#pragma mark Update
- (IBAction)checkForUpdate:(id)sender - (IBAction)checkForUpdate:(id)sender
{ {
#ifdef UPDATE_CHECK #ifdef UPDATE_CHECK
...@@ -2055,6 +2006,25 @@ end: ...@@ -2055,6 +2006,25 @@ end:
#endif #endif
} }
#pragma mark -
#pragma mark Help and Docs
- (IBAction)viewAbout:(id)sender
{
if( !nib_about_loaded )
nib_about_loaded = [NSBundle loadNibNamed:@"About" owner:self];
[o_about showAbout];
}
- (IBAction)showLicense:(id)sender
{
if( !nib_about_loaded )
nib_about_loaded = [NSBundle loadNibNamed:@"About" owner:self];
[o_about showGPL: sender];
}
- (IBAction)viewHelp:(id)sender - (IBAction)viewHelp:(id)sender
{ {
if( !nib_about_loaded ) if( !nib_about_loaded )
...@@ -2104,6 +2074,7 @@ end: ...@@ -2104,6 +2074,7 @@ end:
[[NSWorkspace sharedWorkspace] openURL: o_url]; [[NSWorkspace sharedWorkspace] openURL: o_url];
} }
#pragma mark -
#pragma mark Crash Log #pragma mark Crash Log
- (void)sendCrashLog:(NSString *)crashLog withUserComment:(NSString *)userComment - (void)sendCrashLog:(NSString *)crashLog withUserComment:(NSString *)userComment
{ {
...@@ -2238,6 +2209,7 @@ end: ...@@ -2238,6 +2209,7 @@ end:
} }
#pragma mark - #pragma mark -
#pragma mark Errors, warnings and messages
- (IBAction)viewErrorsAndWarnings:(id)sender - (IBAction)viewErrorsAndWarnings:(id)sender
{ {
...@@ -2279,6 +2251,70 @@ end: ...@@ -2279,6 +2251,70 @@ end:
} }
} }
- (void)updateMessageArray
{
int i_start, i_stop;
vlc_mutex_lock( p_intf->p_sys->p_sub->p_lock );
i_stop = *p_intf->p_sys->p_sub->pi_stop;
vlc_mutex_unlock( p_intf->p_sys->p_sub->p_lock );
if( p_intf->p_sys->p_sub->i_start != i_stop )
{
NSColor *o_white = [NSColor whiteColor];
NSColor *o_red = [NSColor redColor];
NSColor *o_yellow = [NSColor yellowColor];
NSColor *o_gray = [NSColor grayColor];
NSColor * pp_color[4] = { o_white, o_red, o_yellow, o_gray };
static const char * ppsz_type[4] = { ": ", " error: ",
" warning: ", " debug: " };
for( i_start = p_intf->p_sys->p_sub->i_start;
i_start != i_stop;
i_start = (i_start+1) % VLC_MSG_QSIZE )
{
NSString *o_msg;
NSDictionary *o_attr;
NSAttributedString *o_msg_color;
int i_type = p_intf->p_sys->p_sub->p_msg[i_start].i_type;
[o_msg_lock lock];
if( [o_msg_arr count] + 2 > 400 )
{
unsigned rid[] = { 0, 1 };
[o_msg_arr removeObjectsFromIndices: (unsigned *)&rid
numIndices: sizeof(rid)/sizeof(rid[0])];
}
o_attr = [NSDictionary dictionaryWithObject: o_gray
forKey: NSForegroundColorAttributeName];
o_msg = [NSString stringWithFormat: @"%s%s",
p_intf->p_sys->p_sub->p_msg[i_start].psz_module,
ppsz_type[i_type]];
o_msg_color = [[NSAttributedString alloc]
initWithString: o_msg attributes: o_attr];
[o_msg_arr addObject: [o_msg_color autorelease]];
o_attr = [NSDictionary dictionaryWithObject: pp_color[i_type]
forKey: NSForegroundColorAttributeName];
o_msg = [[NSString stringWithUTF8String: p_intf->p_sys->p_sub->p_msg[i_start].psz_msg] stringByAppendingString: @"\n"];
o_msg_color = [[NSAttributedString alloc]
initWithString: o_msg attributes: o_attr];
[o_msg_arr addObject: [o_msg_color autorelease]];
[o_msg_lock unlock];
}
vlc_mutex_lock( p_intf->p_sys->p_sub->p_lock );
p_intf->p_sys->p_sub->i_start = i_start;
vlc_mutex_unlock( p_intf->p_sys->p_sub->p_lock );
}
}
#pragma mark -
#pragma mark Playlist toggling #pragma mark Playlist toggling
- (IBAction)togglePlaylist:(id)sender - (IBAction)togglePlaylist:(id)sender
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment