X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fmacosx%2Fintf.m;h=712031c948e7d302981be95fc8e83aac7f7ce1c0;hb=efd8144e169d0cc9b71e1d90ccc329e75753361f;hp=28cef2c7b410124c4db944173e8d642bbb64c9d2;hpb=30437c6554296510b9a8a04c41033c4cef8b9f4d;p=vlc diff --git a/modules/gui/macosx/intf.m b/modules/gui/macosx/intf.m index 28cef2c7b4..712031c948 100644 --- a/modules/gui/macosx/intf.m +++ b/modules/gui/macosx/intf.m @@ -34,7 +34,6 @@ #include #include #include /* execl() */ -#import #import "intf.h" #import "fspanel.h" @@ -50,7 +49,6 @@ #import "bookmarks.h" #import "coredialogs.h" #import "embeddedwindow.h" -#import "update.h" #import "AppleRemote.h" #import "eyetv.h" #import "simple_prefs.h" @@ -58,6 +56,7 @@ #import /* for crashlog send mechanism */ #import /* for the media key support */ +#import /* we're the update delegate */ /***************************************************************************** * Local prototypes. @@ -279,6 +278,37 @@ bool checkProgressPanel (void *priv) [o_pool release]; } +#pragma mark - +#pragma mark Helpers + +input_thread_t *getInput(void) +{ + intf_thread_t *p_intf = VLCIntf; + if (!p_intf) + return NULL; + return pl_CurrentInput(p_intf); +} + +vout_thread_t *getVout(void) +{ + input_thread_t *p_input = getInput(); + if (!p_input) + return NULL; + vout_thread_t *p_vout = input_GetVout(p_input); + vlc_object_release(p_input); + return p_vout; +} + +aout_instance_t *getAout(void) +{ + input_thread_t *p_input = getInput(); + if (!p_input) + return NULL; + aout_instance_t *p_aout = input_GetAout(p_input); + vlc_object_release(p_input); + return p_aout; +} + #pragma mark - #pragma mark Private @@ -314,7 +344,7 @@ static VLCMain *_o_sharedMainInstance = nil; p_intf = NULL; o_msg_lock = [[NSLock alloc] init]; - o_msg_arr = [[NSMutableArray arrayWithCapacity: 200] retain]; + o_msg_arr = [[NSMutableArray arrayWithCapacity: 600] retain]; /* subscribe to LibVLC's debug messages as early as possible (for us) */ [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(libvlcMessageReceived:) name: @"VLCCoreMessageReceived" object: nil]; @@ -328,9 +358,6 @@ static VLCMain *_o_sharedMainInstance = nil; o_embedded_list = [[VLCEmbeddedList alloc] init]; o_coredialogs = [[VLCCoreDialogProvider alloc] init]; o_info = [[VLCInfo alloc] init]; -#ifdef UPDATE_CHECK - o_update = [[VLCUpdate alloc] init]; -#endif i_lastShownVolume = -1; @@ -369,30 +396,6 @@ static VLCMain *_o_sharedMainInstance = nil; because VLCMain is the owner */ if( nib_main_loaded ) return; - /* check whether the user runs a valid version of OS X */ - if( MACOS_VERSION < 10.5f ) - { - NSAlert *ourAlert; - int i_returnValue; - NSString *o_blabla; - if( MACOS_VERSION == 10.4f ) - o_blabla = _NS("VLC's last release for your OS is the 0.9 series." ); - else if( MACOS_VERSION == 10.3f ) - o_blabla = _NS("VLC's last release for your OS is VLC 0.8.6i, which is prone to known security issues." ); - else // 10.2 and 10.1, still 3% of the OS X market share - o_blabla = _NS("VLC's last release for your OS is VLC 0.7.2, which is highly out of date and prone to " \ - "known security issues. We recommend you to update your Mac to a modern version of Mac OS X."); - ourAlert = [NSAlert alertWithMessageText: _NS("Your version of Mac OS X is no longer supported") - defaultButton: _NS("Quit") - alternateButton: NULL - otherButton: NULL - informativeTextWithFormat: _NS("VLC media player %s requires Mac OS X 10.5 or higher.\n\n%@"), VLC_Version(), o_blabla]; - [ourAlert setAlertStyle: NSCriticalAlertStyle]; - i_returnValue = [ourAlert runModal]; - [NSApp performSelectorOnMainThread: @selector(terminate:) withObject:nil waitUntilDone:NO]; - return; - } - [self initStrings]; [o_window setExcludedFromWindowsMenu: YES]; @@ -523,8 +526,10 @@ static VLCMain *_o_sharedMainInstance = nil; nib_coredialogs_loaded = [NSBundle loadNibNamed:@"CoreDialogs" owner: NSApp]; /* subscribe to various interactive dialogues */ - var_Create( p_intf, "dialog-fatal", VLC_VAR_ADDRESS ); - var_AddCallback( p_intf, "dialog-fatal", DialogCallback, self ); + var_Create( p_intf, "dialog-error", VLC_VAR_ADDRESS ); + var_AddCallback( p_intf, "dialog-error", DialogCallback, self ); + var_Create( p_intf, "dialog-critical", VLC_VAR_ADDRESS ); + var_AddCallback( p_intf, "dialog-critical", DialogCallback, self ); var_Create( p_intf, "dialog-login", VLC_VAR_ADDRESS ); var_AddCallback( p_intf, "dialog-login", DialogCallback, self ); var_Create( p_intf, "dialog-question", VLC_VAR_ADDRESS ); @@ -578,15 +583,6 @@ static VLCMain *_o_sharedMainInstance = nil; [self _removeOldPreferences]; -#ifdef UPDATE_CHECK - /* Check for update silently on startup */ - if( !nib_update_loaded ) - nib_update_loaded = [NSBundle loadNibNamed:@"Update" owner: NSApp]; - - 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]; @@ -658,6 +654,7 @@ static VLCMain *_o_sharedMainInstance = nil; [o_mi_random setTitle: _NS("Random")]; [o_mi_repeat setTitle: _NS("Repeat One")]; [o_mi_loop setTitle: _NS("Repeat All")]; + [o_mi_quitAfterPB setTitle: _NS("Quit after Playback")]; [o_mi_fwd setTitle: _NS("Step Forward")]; [o_mi_bwd setTitle: _NS("Step Backward")]; @@ -817,7 +814,8 @@ static VLCMain *_o_sharedMainInstance = nil; /* unsubscribe from the interactive dialogues */ dialog_Unregister( p_intf ); - var_DelCallback( p_intf, "dialog-fatal", DialogCallback, self ); + var_DelCallback( p_intf, "dialog-error", DialogCallback, self ); + var_DelCallback( p_intf, "dialog-critical", DialogCallback, self ); var_DelCallback( p_intf, "dialog-login", DialogCallback, self ); var_DelCallback( p_intf, "dialog-question", DialogCallback, self ); var_DelCallback( p_intf, "dialog-progress-bar", DialogCallback, self ); @@ -825,10 +823,6 @@ static VLCMain *_o_sharedMainInstance = nil; /* remove global observer watching for vout device changes correctly */ [[NSNotificationCenter defaultCenter] removeObserver: self]; -#ifdef UPDATE_CHECK - [o_update end]; -#endif - /* release some other objects here, because it isn't sure whether dealloc * will be called later on */ if( nib_about_loaded ) @@ -902,6 +896,19 @@ static VLCMain *_o_sharedMainInstance = nil; /* not reached */ } +#pragma mark - +#pragma mark Sparkle delegate +/* received directly before the update gets installed, so let's shut down a bit */ +- (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update +{ + [o_remote stopListening: self]; + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_STOP ); + + /* Close the window directly, because we do know that there + * won't be anymore video. It's currently waiting a bit. */ + [[[o_controls voutView] window] orderOut:self]; +} + #pragma mark - #pragma mark Toolbar delegate @@ -1609,7 +1616,10 @@ static void manage_cleanup( void * args ) - (void)manageVolumeSlider { audio_volume_t i_volume; - aout_VolumeGet( p_intf, &i_volume ); + playlist_t * p_playlist = pl_Hold( p_intf ); + + aout_VolumeGet( p_playlist, &i_volume ); + pl_Release( p_intf ); if( i_volume != i_lastShownVolume ) { @@ -1915,7 +1925,7 @@ end: var: "video-device" selector: @selector(toggleVar:)]; [o_controls setupVarMenuItem: o_mi_deinterlace target: (vlc_object_t *)p_vout - var: "deinterlace" selector: @selector(toggleVar:)]; + var: "deinterlace-mode" selector: @selector(toggleVar:)]; #if 1 [o_controls setupVarMenuItem: o_mi_ffmpeg_pp target: @@ -1932,11 +1942,9 @@ end: - (void)refreshVoutDeviceMenu:(NSNotification *)o_notification { - int x,y = 0; - vout_thread_t * p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, - FIND_ANYWHERE ); - - if(! p_vout ) + int x, y = 0; + vout_thread_t * p_vout = getVout(); + if( !p_vout ) return; /* clean the menu before adding new entries */ @@ -2227,21 +2235,6 @@ end: [o_sprefs showSimplePrefs]; } -#pragma mark - -#pragma mark Update - -- (IBAction)checkForUpdate:(id)sender -{ -#ifdef UPDATE_CHECK - if( !nib_update_loaded ) - nib_update_loaded = [NSBundle loadNibNamed:@"Update" owner: NSApp]; - [o_update showUpdateWindow]; -#else - msg_Err( VLCIntf, "Update checker wasn't enabled in this build" ); - dialog_FatalWait( VLCIntf, _("Update check failed"), _("Checking for updates was not enabled in this build.") ); -#endif -} - #pragma mark - #pragma mark Help and Docs @@ -2345,9 +2338,6 @@ end: - (void)connectionDidFinishLoading:(NSURLConnection *)connection { - NSRunInformationalAlertPanel(_NS("Crash Report successfully sent"), - _NS("Thanks for your report!"), - _NS("OK"), nil, nil, nil); [crashLogURLConnection release]; crashLogURLConnection = nil; } @@ -2856,61 +2846,81 @@ end: - (void)awakeFromNib { - b_mediaKeySupport = config_GetInt( VLCIntf, "macosx-mediakeys" ); + b_active = b_mediaKeySupport = config_GetInt( VLCIntf, "macosx-mediakeys" ); + b_activeInBackground = config_GetInt( VLCIntf, "macosx-mediakeys-background" ); + [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(coreChangedMediaKeySupportSetting:) name: @"VLCMediaKeySupportSettingChanged" object: nil]; + [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appGotActiveOrInactive:) name: @"NSApplicationDidBecomeActiveNotification" object: nil]; + [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appGotActiveOrInactive:) name: @"NSApplicationWillResignActiveNotification" object: nil]; } -- (void)enableMediaKeySupport:(BOOL)b_value +- (void)dealloc { - b_mediaKeySupport = b_value; + [[NSNotificationCenter defaultCenter] removeObserver: self]; + [super dealloc]; } +- (void)appGotActiveOrInactive: (NSNotification *)o_notification +{ + if(( [[o_notification name] isEqualToString: @"NSApplicationWillResignActiveNotification"] && !b_activeInBackground ) || !b_mediaKeySupport) + b_active = NO; + else + b_active = YES; +} + +- (void)coreChangedMediaKeySupportSetting: (NSNotification *)o_notification +{ + b_active = b_mediaKeySupport = config_GetInt( VLCIntf, "macosx-mediakeys" ); + b_activeInBackground = config_GetInt( VLCIntf, "macosx-mediakeys-background" ); +} + + - (void)sendEvent: (NSEvent*)event { - if( b_mediaKeySupport ) + if( b_active ) { - if( [event type] == NSSystemDefined && [event subtype] == 8 ) - { - int keyCode = (([event data1] & 0xFFFF0000) >> 16); - int keyFlags = ([event data1] & 0x0000FFFF); - int keyState = (((keyFlags & 0xFF00) >> 8)) == 0xA; - int keyRepeat = (keyFlags & 0x1); - - if( keyCode == NX_KEYTYPE_PLAY && keyState == 0 ) - var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PLAY_PAUSE ); - - if( keyCode == NX_KEYTYPE_FAST && !b_justJumped ) - { - if( keyState == 0 && keyRepeat == 0 ) - { - var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_NEXT ); - } - else if( keyRepeat == 1 ) - { - var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_SHORT ); - b_justJumped = YES; - [self performSelector:@selector(resetJump) - withObject: NULL - afterDelay:0.25]; - } - } - - if( keyCode == NX_KEYTYPE_REWIND && !b_justJumped ) - { - if( keyState == 0 && keyRepeat == 0 ) - { - var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PREV ); - } - else if( keyRepeat == 1 ) - { - var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_SHORT ); - b_justJumped = YES; - [self performSelector:@selector(resetJump) - withObject: NULL - afterDelay:0.25]; - } - } - } - } + if( [event type] == NSSystemDefined && [event subtype] == 8 ) + { + int keyCode = (([event data1] & 0xFFFF0000) >> 16); + int keyFlags = ([event data1] & 0x0000FFFF); + int keyState = (((keyFlags & 0xFF00) >> 8)) == 0xA; + int keyRepeat = (keyFlags & 0x1); + + if( keyCode == NX_KEYTYPE_PLAY && keyState == 0 ) + var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PLAY_PAUSE ); + + if( keyCode == NX_KEYTYPE_FAST && !b_justJumped ) + { + if( keyState == 0 && keyRepeat == 0 ) + { + var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_NEXT ); + } + else if( keyRepeat == 1 ) + { + var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_FORWARD_SHORT ); + b_justJumped = YES; + [self performSelector:@selector(resetJump) + withObject: NULL + afterDelay:0.25]; + } + } + + if( keyCode == NX_KEYTYPE_REWIND && !b_justJumped ) + { + if( keyState == 0 && keyRepeat == 0 ) + { + var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_PREV ); + } + else if( keyRepeat == 1 ) + { + var_SetInteger( VLCIntf->p_libvlc, "key-action", ACTIONID_JUMP_BACKWARD_SHORT ); + b_justJumped = YES; + [self performSelector:@selector(resetJump) + withObject: NULL + afterDelay:0.25]; + } + } + } + } [super sendEvent: event]; }