#include <sys/param.h> /* for MAXPATHLEN */
#include <string.h>
#include <vlc_keys.h>
+#include <unistd.h> /* execl() */
#ifdef HAVE_CONFIG_H
# include "config.h"
}
#pragma mark -
+#pragma mark Private
+
+@interface VLCMain ()
+- (void)_removeOldPreferences;
+@end
/*****************************************************************************
* VLCMain implementation
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
+ [self _removeOldPreferences];
+
#ifdef UPDATE_CHECK
/* Check for update silently on startup */
if( !nib_update_loaded )
[o_mu_deinterlace setTitle: _NS("Deinterlace")];
[o_mi_ffmpeg_pp setTitle: _NS("Post processing")];
[o_mu_ffmpeg_pp setTitle: _NS("Post processing")];
+ [o_mi_teletext setTitle: _NS("Teletext")];
+ [o_mi_teletext_transparent setTitle: _NS("Transparent")];
+ [o_mi_teletext_index setTitle: _NS("Index")];
+ [o_mi_teletext_red setTitle: _NS("Red")];
+ [o_mi_teletext_green setTitle: _NS("Green")];
+ [o_mi_teletext_yellow setTitle: _NS("Yellow")];
+ [o_mi_teletext_blue setTitle: _NS("Blue")];
[o_mu_window setTitle: _NS("Window")];
[o_mi_minimize setTitle: _NS("Minimize Window")];
[o_crashrep_title_txt setStringValue: _NS("VLC crashed previously")];
[o_crashrep_win setTitle: _NS("VLC crashed previously")];
[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_includeEmail_ckb setTitle: _NS("I agree to be possibly contacted about this bugreport.")];
+ [o_crashrep_includeEmail_txt setStringValue: _NS("Only your default E-Mail address will be submitted, including no further information.")];
}
#pragma mark -
/* 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])
/* remove global observer watching for vout device changes correctly */
[[NSNotificationCenter defaultCenter] removeObserver: self];
+ [o_update end];
+
/* release some other objects here, because it isn't sure whether dealloc
* will be called later on */
return NULL;
}
+struct manage_cleanup_stack {
+ intf_thread_t * p_intf;
+ input_thread_t ** p_input;
+ playlist_t * p_playlist;
+ id self;
+};
+
+static void * manage_cleanup( void * args )
+{
+ struct manage_cleanup_stack * manage_cleanup_stack = args;
+ intf_thread_t * p_intf = manage_cleanup_stack->p_intf;
+ input_thread_t * p_input = *manage_cleanup_stack->p_input;
+ id self = manage_cleanup_stack->self;
+ playlist_t * p_playlist = manage_cleanup_stack->p_playlist;
+
+ var_AddCallback( p_playlist, "playlist-current", PlaylistChanged, self );
+ var_AddCallback( p_playlist, "intf-change", PlaylistChanged, self );
+ var_AddCallback( p_playlist, "item-change", PlaylistChanged, self );
+ var_AddCallback( p_playlist, "item-append", PlaylistChanged, self );
+ var_AddCallback( p_playlist, "item-deleted", PlaylistChanged, self );
+
+ pl_Release( p_intf );
+
+ if( p_input ) vlc_object_release( p_input );
+ return NULL;
+}
+
- (void)manage
{
playlist_t * p_playlist;
input_thread_t * p_input = NULL;
/* new thread requires a new pool */
- NSAutoreleasePool * o_pool = [[NSAutoreleasePool alloc] init];
vlc_thread_set_priority( p_intf, VLC_THREAD_PRIORITY_LOW );
var_AddCallback( p_playlist, "item-append", PlaylistChanged, self );
var_AddCallback( p_playlist, "item-deleted", PlaylistChanged, self );
- pl_Release( p_intf );
-
- vlc_object_lock( p_intf );
+ struct manage_cleanup_stack stack = { p_intf, &p_input, p_playlist, self };
+ pthread_cleanup_push(manage_cleanup, &stack);
- while( vlc_object_alive( p_intf ) )
+ while( true )
{
+ NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
vlc_mutex_lock( &p_intf->change_lock );
if( !p_input )
vlc_mutex_unlock( &p_intf->change_lock );
- vlc_object_timedwait( p_intf, 100000 + mdate());
- }
- vlc_object_unlock( p_intf );
- [o_pool release];
+ pthread_testcancel(); /* In 10.5 nanosleep is not a cancellation point */
+ msleep( INTF_IDLE_SLEEP );
- if( p_input ) vlc_object_release( p_input );
-
- var_DelCallback( p_playlist, "playlist-current", PlaylistChanged, self );
- var_DelCallback( p_playlist, "intf-change", PlaylistChanged, self );
- var_DelCallback( p_playlist, "item-change", PlaylistChanged, self );
- var_DelCallback( p_playlist, "item-append", PlaylistChanged, self );
- var_DelCallback( p_playlist, "item-deleted", PlaylistChanged, self );
+ [pool release];
+ }
- pthread_testcancel(); /* If we were cancelled stop here */
+ pthread_cleanup_pop(1);
msg_Dbg( p_intf, "Killing the Mac OS X module" );
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
[req setHTTPMethod:@"POST"];
- ABPerson * contact = [[ABAddressBook sharedAddressBook] me];
-
- ABMultiValue *emails = [contact valueForProperty:kABEmailProperty];
- NSString * email = [emails valueAtIndex:[emails indexForIdentifier:
- [emails primaryIdentifier]]];
+ NSString * email;
+ if( [o_crashrep_includeEmail_ckb state] == NSOnState )
+ {
+ ABPerson * contact = [[ABAddressBook sharedAddressBook] me];
+ ABMultiValue *emails = [contact valueForProperty:kABEmailProperty];
+ email = [emails valueAtIndex:[emails indexForIdentifier:
+ [emails primaryIdentifier]]];
+ }
+ else
+ email = [NSString string];
NSString *postBody;
postBody = [NSString stringWithFormat:@"CrashLog=%@&Comment=%@&Email=%@\r\n",
}
}
+#pragma mark -
+#pragma mark Remove old prefs
+
+- (void)_removeOldPreferences
+{
+ static NSString * kVLCPreferencesVersion = @"VLCPreferencesVersion";
+ static const int kCurrentPreferencesVersion = 1;
+ int version = [[NSUserDefaults standardUserDefaults] integerForKey:kVLCPreferencesVersion];
+ if( version >= kCurrentPreferencesVersion ) return;
+
+ NSArray *libraries = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
+ NSUserDomainMask, YES);
+ if( !libraries || [libraries count] == 0) return;
+ NSString * preferences = [[libraries objectAtIndex:0] stringByAppendingPathComponent:@"Preferences"];
+
+ /* File not found, don't attempt anything */
+ if(![[NSFileManager defaultManager] fileExistsAtPath:[preferences stringByAppendingPathComponent:@"VLC"]] &&
+ ![[NSFileManager defaultManager] fileExistsAtPath:[preferences stringByAppendingPathComponent:@"org.videolan.vlc.plist"]] )
+ {
+ [[NSUserDefaults standardUserDefaults] setInteger:kCurrentPreferencesVersion forKey:kVLCPreferencesVersion];
+ return;
+ }
+
+ int res = NSRunInformationalAlertPanel(_NS("Remove old preferences?"),
+ _NS("We just found an older version of VLC's preferences files."),
+ _NS("Move To Trash and Relaunch VLC"), _NS("Ignore"), nil, nil);
+ if( res != NSOKButton )
+ {
+ [[NSUserDefaults standardUserDefaults] setInteger:kCurrentPreferencesVersion forKey:kVLCPreferencesVersion];
+ return;
+ }
+
+ NSArray * ourPreferences = [NSArray arrayWithObjects:@"org.videolan.vlc.plist", @"VLC"];
+
+ /* Move the file to trash so that user can find them later */
+ [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation source:preferences destination:nil files:ourPreferences tag:0];
+
+ /* really reset the defaults from now on */
+ [NSUserDefaults resetStandardUserDefaults];
+
+ [[NSUserDefaults standardUserDefaults] setInteger:kCurrentPreferencesVersion forKey:kVLCPreferencesVersion];
+ [[NSUserDefaults standardUserDefaults] synchronize];
+
+ /* Relaunch now */
+ const char * path = [[[NSBundle mainBundle] executablePath] UTF8String];
+
+ /* For some reason we need to fork(), not just execl(), which reports a ENOTSUP then. */
+ if(fork() != 0)
+ {
+ exit(0);
+ return;
+ }
+ execl(path, path, NULL);
+}
+
#pragma mark -
#pragma mark Errors, warnings and messages