]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/intf.m
macosx: typo s/pthread_test_cancel/pthread_testcancel/
[vlc] / modules / gui / macosx / intf.m
index 256f6a23318c4b55f082cdcad2829cb73caa2a61..250981ffbefc31bd9269ebbf21f28e4cf7e85e8c 100644 (file)
@@ -31,6 +31,7 @@
 #include <sys/param.h>                                    /* for MAXPATHLEN */
 #include <string.h>
 #include <vlc_keys.h>
+#include <unistd.h> /* execl() */
 
 #ifdef HAVE_CONFIG_H
 #   include "config.h"
@@ -212,6 +213,11 @@ static int InteractCallback( vlc_object_t *p_this, const char *psz_variable,
 }
 
 #pragma mark -
+#pragma mark Private
+
+@interface VLCMain ()
+- (void)_removeOldPreferences;
+@end
 
 /*****************************************************************************
  * VLCMain implementation
@@ -460,6 +466,8 @@ static VLCMain *_o_sharedMainInstance = nil;
 
 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
 {
+    [self _removeOldPreferences];
+
 #ifdef UPDATE_CHECK
     /* Check for update silently on startup */
     if( !nib_update_loaded )
@@ -582,6 +590,13 @@ static VLCMain *_o_sharedMainInstance = nil;
     [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")];
@@ -630,6 +645,8 @@ static VLCMain *_o_sharedMainInstance = nil;
     [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 -
@@ -659,11 +676,6 @@ static VLCMain *_o_sharedMainInstance = 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])
@@ -677,6 +689,8 @@ static VLCMain *_o_sharedMainInstance = nil;
     /* 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 */
 
@@ -1344,13 +1358,39 @@ static void * ManageThread( void *user_data )
     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 );
 
@@ -1362,12 +1402,12 @@ static void * ManageThread( void *user_data )
     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 )
@@ -1400,20 +1440,13 @@ static void * ManageThread( void *user_data )
 
         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" );
 
@@ -2084,11 +2117,16 @@ end:
     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",
@@ -2208,6 +2246,61 @@ end:
     }
 }
 
+#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