vlc | branch: master | Felix Paul Kühne <[email protected]> | Tue Jan 29 18:47:42 2019 +0100| [9609740bfa5dd79d87130f8a3bfe4a72b1c3f819] | committer: Felix Paul Kühne
macosx/coreinteraction: split apple remote, media key and video filter handling as those don't belong there > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=9609740bfa5dd79d87130f8a3bfe4a72b1c3f819 --- .../package/macosx/VLC.xcodeproj/project.pbxproj | 22 +- modules/gui/macosx/Makefile.am | 2 + modules/gui/macosx/VLCClickerManager.h | 27 ++ modules/gui/macosx/VLCClickerManager.m | 301 +++++++++++++ modules/gui/macosx/VLCCoreInteraction.h | 11 +- modules/gui/macosx/VLCCoreInteraction.m | 472 ++------------------- modules/gui/macosx/VLCMain+OldPrefs.m | 3 +- modules/gui/macosx/VLCMain.h | 1 + modules/gui/macosx/VLCMain.m | 17 - modules/gui/macosx/VLCMainMenu.m | 11 +- modules/gui/macosx/VLCSimplePrefsController.m | 15 +- modules/gui/macosx/VLCStringUtility.h | 5 + modules/gui/macosx/VLCStringUtility.m | 33 ++ .../VLCTrackSynchronizationWindowController.m | 4 +- .../gui/macosx/VLCVideoEffectsWindowController.m | 175 ++++---- modules/gui/macosx/VLCVideoFilterHelper.h | 31 ++ modules/gui/macosx/VLCVideoFilterHelper.m | 177 ++++++++ modules/gui/macosx/prefs.m | 2 +- 18 files changed, 723 insertions(+), 586 deletions(-) diff --git a/extras/package/macosx/VLC.xcodeproj/project.pbxproj b/extras/package/macosx/VLC.xcodeproj/project.pbxproj index 08d0ad2f97..4df4f3c775 100644 --- a/extras/package/macosx/VLC.xcodeproj/project.pbxproj +++ b/extras/package/macosx/VLC.xcodeproj/project.pbxproj @@ -122,6 +122,8 @@ 6BF5C5041EFE66EF008A9C12 /* VLCHUDTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BF5C5031EFE66EF008A9C12 /* VLCHUDTableView.m */; }; 7D2E0EDB20CD204D0033A221 /* VLCWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D2E0ED920CD204D0033A221 /* VLCWindow.m */; }; 7D2E0EDE20CD206F0033A221 /* VLCVideoWindowCommon.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D2E0EDD20CD206F0033A221 /* VLCVideoWindowCommon.m */; }; + 7D66D4362200BC340040D04A /* VLCClickerManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D66D4352200BC340040D04A /* VLCClickerManager.m */; }; + 7D66D4392200C5B80040D04A /* VLCVideoFilterHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D66D4382200C5B80040D04A /* VLCVideoFilterHelper.m */; }; 7DB40D2A20CBCEB500F63173 /* VLCMainMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DB40D2920CBCEB500F63173 /* VLCMainMenu.m */; }; 7DB40D2D20CBCEC200F63173 /* VLCStatusBarIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DB40D2B20CBCEC200F63173 /* VLCStatusBarIcon.m */; }; 7DB7F1EC20CC036D00C2CAED /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7DB7F1EB20CC036D00C2CAED /* AudioUnit.framework */; }; @@ -437,6 +439,10 @@ 7D5678EC1D5BA1DC002698F3 /* VLCApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCApplication.m; sourceTree = "<group>"; }; 7D5678EE1D5BA397002698F3 /* VLCMainWindowControlsBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCMainWindowControlsBar.h; sourceTree = "<group>"; }; 7D5678EF1D5BA397002698F3 /* VLCMainWindowControlsBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCMainWindowControlsBar.m; sourceTree = "<group>"; }; + 7D66D4342200BC340040D04A /* VLCClickerManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCClickerManager.h; sourceTree = "<group>"; }; + 7D66D4352200BC340040D04A /* VLCClickerManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCClickerManager.m; sourceTree = "<group>"; }; + 7D66D4372200C5B80040D04A /* VLCVideoFilterHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCVideoFilterHelper.h; sourceTree = "<group>"; }; + 7D66D4382200C5B80040D04A /* VLCVideoFilterHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCVideoFilterHelper.m; sourceTree = "<group>"; }; 7D871D371B5E6844000B56C0 /* VLCMain+OldPrefs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "VLCMain+OldPrefs.h"; sourceTree = "<group>"; }; 7D871D381B5E6844000B56C0 /* VLCMain+OldPrefs.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "VLCMain+OldPrefs.m"; sourceTree = "<group>"; }; 7D871D391B5E684D000B56C0 /* helpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = helpers.h; sourceTree = "<group>"; }; @@ -998,6 +1004,8 @@ 6B397C4E216C8EB200403ED0 /* NSString+Helpers.m */, 6B7F1FDD1F07DA920002BDD8 /* VLCHexNumberFormatter.h */, 6B7F1FDE1F07DA920002BDD8 /* VLCHexNumberFormatter.m */, + 7D66D4372200C5B80040D04A /* VLCVideoFilterHelper.h */, + 7D66D4382200C5B80040D04A /* VLCVideoFilterHelper.m */, ); name = Helpers; sourceTree = "<group>"; @@ -1051,6 +1059,8 @@ 7D349C9820CBC881003359A1 /* Core Dialog Provider */, CC448A6013B68A0B009F72E0 /* VLCCoreInteraction.h */, CC448A6113B68A0B009F72E0 /* VLCCoreInteraction.m */, + 7D66D4342200BC340040D04A /* VLCClickerManager.h */, + 7D66D4352200BC340040D04A /* VLCClickerManager.m */, 7DF812ED1B555A340052293C /* VLCInputManager.h */, 7DF812EE1B555A340052293C /* VLCInputManager.m */, ); @@ -1551,7 +1561,7 @@ }; }; }; - buildConfigurationList = C2F2A6EA09588F1B00018C74 /* Build configuration list for PBXProject "vlc" */; + buildConfigurationList = C2F2A6EA09588F1B00018C74 /* Build configuration list for PBXProject "VLC" */; compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 1; @@ -1587,6 +1597,7 @@ 1CCC88F42078A3D500E5626F /* Bookmarks.xib in Sources */, 1CCC88F52078A3D500E5626F /* SyncTracks.xib in Sources */, 1CCC88F62078A3D500E5626F /* MediaInfo.xib in Sources */, + 7D66D4392200C5B80040D04A /* VLCVideoFilterHelper.m in Sources */, 1CCC88F72078A3D500E5626F /* ConvertAndSave.xib in Sources */, 1CCC88F82078A3D500E5626F /* CoreDialogs.xib in Sources */, 1CCC88F92078A3D500E5626F /* DetachedVideoWindow.xib in Sources */, @@ -1648,6 +1659,7 @@ 1C3113AB1E508C6900D4DD76 /* VLCExtensionsDialogProvider.m in Sources */, 1C3113AD1E508C6900D4DD76 /* VLCExtensionsManager.m in Sources */, 1C3113AF1E508C6900D4DD76 /* VLCFSPanelController.m in Sources */, + 7D66D4362200BC340040D04A /* VLCClickerManager.m in Sources */, 1C3113B11E508C6900D4DD76 /* VLCFSPanelDraggableView.m in Sources */, 1C3113B41E508C6900D4DD76 /* VLCInputManager.m in Sources */, 1C3113B61E508C6900D4DD76 /* VLCMain+OldPrefs.m in Sources */, @@ -1855,7 +1867,7 @@ ONLY_ACTIVE_ARCH = YES; PATH = $VLC_PATH; PRODUCT_NAME = VLC; - VLC_BUILD_TRIPLET = "x86_64-apple-darwin17"; + VLC_BUILD_TRIPLET = "x86_64-apple-darwin18"; VLC_PATH = "${VLC_SRC_DIR}/contrib/${VLC_BUILD_TRIPLET}/bin:${VLC_SRC_DIR}/extras/tools/build/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"; VLC_SRC_DIR = "$(PROJECT_DIR)/../../.."; }; @@ -1903,7 +1915,7 @@ MACOSX_DEPLOYMENT_TARGET = 10.11; PATH = $VLC_PATH; PRODUCT_NAME = VLC; - VLC_BUILD_TRIPLET = "x86_64-apple-darwin17"; + VLC_BUILD_TRIPLET = "x86_64-apple-darwin18"; VLC_PATH = "${VLC_SRC_DIR}/contrib/${VLC_BUILD_TRIPLET}/bin:${VLC_SRC_DIR}/extras/tools/build/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"; VLC_SRC_DIR = "$(PROJECT_DIR)/../../.."; }; @@ -1951,7 +1963,7 @@ MACOSX_DEPLOYMENT_TARGET = 10.11; PATH = $VLC_PATH; PRODUCT_NAME = VLC; - VLC_BUILD_TRIPLET = "x86_64-apple-darwin17"; + VLC_BUILD_TRIPLET = "x86_64-apple-darwin18"; VLC_PATH = "${VLC_SRC_DIR}/contrib/${VLC_BUILD_TRIPLET}/bin:${VLC_SRC_DIR}/extras/tools/build/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"; VLC_SRC_DIR = "$(PROJECT_DIR)/../../.."; }; @@ -1970,7 +1982,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Default; }; - C2F2A6EA09588F1B00018C74 /* Build configuration list for PBXProject "vlc" */ = { + C2F2A6EA09588F1B00018C74 /* Build configuration list for PBXProject "VLC" */ = { isa = XCConfigurationList; buildConfigurations = ( C2F2A6EB09588F1B00018C74 /* Development */, diff --git a/modules/gui/macosx/Makefile.am b/modules/gui/macosx/Makefile.am index fde34dcdc2..4d543ae115 100644 --- a/modules/gui/macosx/Makefile.am +++ b/modules/gui/macosx/Makefile.am @@ -38,6 +38,8 @@ libmacosx_plugin_la_SOURCES = \ gui/macosx/VLCMainWindowControlsBar.m gui/macosx/VLCMainWindowControlsBar.h \ gui/macosx/VLCConvertAndSaveWindowController.h gui/macosx/VLCConvertAndSaveWindowController.m \ gui/macosx/VLCCoreInteraction.h gui/macosx/VLCCoreInteraction.m \ + gui/macosx/VLCClickerManager.h gui/macosx/VLCClickerManager.m \ + gui/macosx/VLCVideoFilterHelper.h gui/macosx/VLCVideoFilterHelper.m \ gui/macosx/VLCErrorWindowController.h gui/macosx/VLCErrorWindowController.m \ gui/macosx/VLCExtensionsDialogProvider.h gui/macosx/VLCExtensionsDialogProvider.m \ gui/macosx/VLCExtensionsManager.h gui/macosx/VLCExtensionsManager.m \ diff --git a/modules/gui/macosx/VLCClickerManager.h b/modules/gui/macosx/VLCClickerManager.h new file mode 100644 index 0000000000..13f09de528 --- /dev/null +++ b/modules/gui/macosx/VLCClickerManager.h @@ -0,0 +1,27 @@ +/***************************************************************************** + * VLCClickerManager.h: MacOS X interface module + ***************************************************************************** + * Copyright (C) 2011-2019 Felix Paul Kühne + * + * Authors: Felix Paul Kühne <fkuehne -at- videolan -dot- org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#import <Foundation/Foundation.h> + +@interface VLCClickerManager : NSObject + +@end diff --git a/modules/gui/macosx/VLCClickerManager.m b/modules/gui/macosx/VLCClickerManager.m new file mode 100644 index 0000000000..2682d066b5 --- /dev/null +++ b/modules/gui/macosx/VLCClickerManager.m @@ -0,0 +1,301 @@ +/***************************************************************************** + * VLCClickerManager.m: MacOS X interface module + ***************************************************************************** + * Copyright (C) 2011-2019 Felix Paul Kühne + * + * Authors: Felix Paul Kühne <fkuehne -at- videolan -dot- org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#import "VLCClickerManager.h" +#import "SPMediaKeyTap.h" +#import "AppleRemote.h" +#import "VLCMain.h" +#import "VLCPlaylist.h" +#import "VLCInputManager.h" +#import "VLCCoreInteraction.h" +#import "NSSound+VLCAdditions.h" +#import <vlc_actions.h> + +@interface VLCClickerManager() +{ + /* media key support */ + BOOL b_mediaKeySupport; + BOOL b_mediakeyJustJumped; + SPMediaKeyTap *_mediaKeyController; + BOOL b_mediaKeyTrapEnabled; + + AppleRemote *_remote; + BOOL b_remote_button_hold; /* true as long as the user holds the left,right,plus or minus on the remote control */ +} +@end + +@implementation VLCClickerManager + +- (instancetype)init +{ + self = [super init]; + if (self) { + /* init media key support */ + b_mediaKeySupport = var_InheritBool(getIntf(), "macosx-mediakeys"); + if (b_mediaKeySupport) { + _mediaKeyController = [[SPMediaKeyTap alloc] initWithDelegate:self]; + } + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter addObserver:self + selector:@selector(coreChangedMediaKeySupportSetting:) + name:VLCMediaKeySupportSettingChangedNotification + object:nil]; + [notificationCenter addObserver:self + selector:@selector(coreChangedAppleRemoteSetting:) + name:VLCAppleRemoteSettingChangedNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(startListeningWithAppleRemote) + name:NSApplicationDidBecomeActiveNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(stopListeningWithAppleRemote) + name:NSApplicationDidResignActiveNotification + object:nil]; + + /* init Apple Remote support */ + _remote = [[AppleRemote alloc] init]; + [_remote setClickCountEnabledButtons: kRemoteButtonPlay]; + [_remote setDelegate: self]; + } + return self; +} + +- (void)dealloc +{ + _mediaKeyController = nil; + _remote = nil; + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +#pragma mark - +#pragma mark Media Key support + +- (void)resetMediaKeyJump +{ + b_mediakeyJustJumped = NO; +} + +- (void)coreChangedMediaKeySupportSetting: (NSNotification *)o_notification +{ + intf_thread_t *p_intf = getIntf(); + if (!p_intf) + return; + + b_mediaKeySupport = var_InheritBool(p_intf, "macosx-mediakeys"); + if (b_mediaKeySupport && !_mediaKeyController) + _mediaKeyController = [[SPMediaKeyTap alloc] initWithDelegate:self]; + + VLCMain *main = [VLCMain sharedInstance]; + if (b_mediaKeySupport && ([[[main playlist] model] hasChildren] || + [[main inputManager] hasInput])) { + if (!b_mediaKeyTrapEnabled) { + msg_Dbg(p_intf, "Enabling media key support"); + if ([_mediaKeyController startWatchingMediaKeys]) { + b_mediaKeyTrapEnabled = YES; + } else { + msg_Warn(p_intf, "Failed to enable media key support, likely " + "app needs to be whitelisted in Security Settings."); + } + } + } else { + if (b_mediaKeyTrapEnabled) { + b_mediaKeyTrapEnabled = NO; + msg_Dbg(p_intf, "Disabling media key support"); + [_mediaKeyController stopWatchingMediaKeys]; + } + } +} + +-(void)mediaKeyTap:(SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event +{ + if (b_mediaKeySupport) { + assert([event type] == NSSystemDefined && [event subtype] == SPSystemDefinedEventMediaKeys); + + 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) + [[VLCCoreInteraction sharedInstance] playOrPause]; + + if ((keyCode == NX_KEYTYPE_FAST || keyCode == NX_KEYTYPE_NEXT) && !b_mediakeyJustJumped) { + if (keyState == 0 && keyRepeat == 0) + [[VLCCoreInteraction sharedInstance] next]; + else if (keyRepeat == 1) { + [[VLCCoreInteraction sharedInstance] forwardShort]; + b_mediakeyJustJumped = YES; + [self performSelector:@selector(resetMediaKeyJump) + withObject: NULL + afterDelay:0.25]; + } + } + + if ((keyCode == NX_KEYTYPE_REWIND || keyCode == NX_KEYTYPE_PREVIOUS) && !b_mediakeyJustJumped) { + if (keyState == 0 && keyRepeat == 0) + [[VLCCoreInteraction sharedInstance] previous]; + else if (keyRepeat == 1) { + [[VLCCoreInteraction sharedInstance] backwardShort]; + b_mediakeyJustJumped = YES; + [self performSelector:@selector(resetMediaKeyJump) + withObject: NULL + afterDelay:0.25]; + } + } + } +} + +#pragma mark - +#pragma mark Apple Remote Control + +- (void)coreChangedAppleRemoteSetting: (NSNotification *)notification +{ + if (var_InheritBool(getIntf(), "macosx-appleremote") == YES) { + [_remote startListening: self]; + } else { + [_remote stopListening:self]; + } +} + +- (void)startListeningWithAppleRemote +{ + if (var_InheritBool(getIntf(), "macosx-appleremote") == YES) + [_remote startListening: self]; +} + +- (void)stopListeningWithAppleRemote +{ + [_remote stopListening:self]; +} + +/* 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 */ +- (void) executeHoldActionForRemoteButton: (NSNumber*) buttonIdentifierNumber +{ + intf_thread_t *p_intf = getIntf(); + if (!p_intf) + return; + + if (b_remote_button_hold) { + switch([buttonIdentifierNumber intValue]) { + case kRemoteButtonRight_Hold: + [[VLCCoreInteraction sharedInstance] forwardShort]; + break; + case kRemoteButtonLeft_Hold: + [[VLCCoreInteraction sharedInstance] backwardShort]; + break; + case kRemoteButtonVolume_Plus_Hold: + if (p_intf) + var_SetInteger(p_intf->obj.libvlc, "key-action", ACTIONID_VOL_UP); + break; + case kRemoteButtonVolume_Minus_Hold: + if (p_intf) + var_SetInteger(p_intf->obj.libvlc, "key-action", ACTIONID_VOL_DOWN); + break; + } + if (b_remote_button_hold) { + /* trigger event */ + [self performSelector:@selector(executeHoldActionForRemoteButton:) + withObject:buttonIdentifierNumber + afterDelay:0.25]; + } + } +} + +/* Apple Remote callback */ +- (void) appleRemoteButton: (AppleRemoteEventIdentifier)buttonIdentifier + pressedDown: (BOOL) pressedDown + clickCount: (unsigned int) count +{ + intf_thread_t *p_intf = getIntf(); + if (!p_intf) + return; + + switch(buttonIdentifier) { + case k2009RemoteButtonFullscreen: + [[VLCCoreInteraction sharedInstance] toggleFullscreen]; + break; + case k2009RemoteButtonPlay: + [[VLCCoreInteraction sharedInstance] playOrPause]; + break; + case kRemoteButtonPlay: + if (count >= 2) + [[VLCCoreInteraction sharedInstance] toggleFullscreen]; + else + [[VLCCoreInteraction sharedInstance] playOrPause]; + break; + case kRemoteButtonVolume_Plus: + if (config_GetInt("macosx-appleremote-sysvol")) + [NSSound increaseSystemVolume]; + else + if (p_intf) + var_SetInteger(p_intf->obj.libvlc, "key-action", ACTIONID_VOL_UP); + break; + case kRemoteButtonVolume_Minus: + if (config_GetInt("macosx-appleremote-sysvol")) + [NSSound decreaseSystemVolume]; + else + if (p_intf) + var_SetInteger(p_intf->obj.libvlc, "key-action", ACTIONID_VOL_DOWN); + break; + case kRemoteButtonRight: + if (config_GetInt("macosx-appleremote-prevnext")) + [[VLCCoreInteraction sharedInstance] forwardShort]; + else + [[VLCCoreInteraction sharedInstance] next]; + break; + case kRemoteButtonLeft: + if (config_GetInt("macosx-appleremote-prevnext")) + [[VLCCoreInteraction sharedInstance] backwardShort]; + else + [[VLCCoreInteraction sharedInstance] previous]; + break; + case kRemoteButtonRight_Hold: + case kRemoteButtonLeft_Hold: + case kRemoteButtonVolume_Plus_Hold: + case kRemoteButtonVolume_Minus_Hold: + /* simulate an event as long as the user holds the button */ + b_remote_button_hold = pressedDown; + if (pressedDown) { + NSNumber* buttonIdentifierNumber = [NSNumber numberWithInt:buttonIdentifier]; + [self performSelector:@selector(executeHoldActionForRemoteButton:) + withObject:buttonIdentifierNumber]; + } + break; + case kRemoteButtonMenu: + [[VLCCoreInteraction sharedInstance] showPosition]; + break; + case kRemoteButtonPlay_Sleep: + { + NSAppleScript * script = [[NSAppleScript alloc] initWithSource:@"tell application \"System Events\" to sleep"]; + [script executeAndReturnError:nil]; + break; + } + default: + /* Add here whatever you want other buttons to do */ + break; + } +} + +@end diff --git a/modules/gui/macosx/VLCCoreInteraction.h b/modules/gui/macosx/VLCCoreInteraction.h index b51c48ebd8..0521477f35 100644 --- a/modules/gui/macosx/VLCCoreInteraction.h +++ b/modules/gui/macosx/VLCCoreInteraction.h @@ -1,7 +1,7 @@ /***************************************************************************** * CoreInteraction.h: MacOS X interface module ***************************************************************************** - * Copyright (C) 2011-2018 Felix Paul Kühne + * Copyright (C) 2011-2019 Felix Paul Kühne * * Authors: Felix Paul Kühne <fkuehne -at- videolan -dot- org> * @@ -45,8 +45,6 @@ - (void)toggleRecord; - (void)next; - (void)previous; -- (void)forward; //LEGACY SUPPORT -- (void)backward; //LEGACY SUPPORT - (void)forwardExtraShort; - (void)backwardExtraShort; - (void)forwardShort; @@ -69,8 +67,6 @@ - (void)volumeDown; - (void)toggleMute; - (void)showPosition; -- (void)startListeningWithAppleRemote; -- (void)stopListeningWithAppleRemote; - (void)menuFocusActivate; - (void)moveMenuFocusLeft; @@ -84,11 +80,6 @@ - (void)toggleFullscreen; -- (BOOL)fixIntfSettings; - -- (void)setVideoFilter: (const char *)psz_name on:(BOOL)b_on; -- (void)setVideoFilterProperty: (const char *)psz_property forFilter: (const char *)psz_filter withValue: (vlc_value_t)value; - - (BOOL)keyEvent:(NSEvent *)o_event; - (void)updateCurrentlyUsedHotkeys; - (BOOL)hasDefinedShortcutKey:(NSEvent *)o_event force:(BOOL)b_force; diff --git a/modules/gui/macosx/VLCCoreInteraction.m b/modules/gui/macosx/VLCCoreInteraction.m index a32e8b4d60..037e1e184c 100644 --- a/modules/gui/macosx/VLCCoreInteraction.m +++ b/modules/gui/macosx/VLCCoreInteraction.m @@ -1,7 +1,7 @@ /***************************************************************************** * CoreInteraction.m: MacOS X interface module ***************************************************************************** - * Copyright (C) 2011-2018 Felix Paul Kühne + * Copyright (C) 2011-2019 Felix Paul Kühne * * Authors: Felix Paul Kühne <fkuehne -at- videolan -dot- org> * @@ -27,7 +27,6 @@ #import <math.h> #import <vlc_playlist_legacy.h> #import <vlc_input.h> -#import <vlc_actions.h> #import <vlc_aout.h> #import <vlc_vout.h> #import <vlc_vout_osd.h> @@ -35,13 +34,10 @@ #import <vlc_strings.h> #import <vlc_url.h> #import <vlc_modules.h> -#import <vlc_charset.h> -#include <vlc_plugin.h> -#import "SPMediaKeyTap.h" -#import "AppleRemote.h" +#import <vlc_plugin.h> +#import <vlc_actions.h> #import "VLCInputManager.h" - -#import "NSSound+VLCAdditions.h" +#import "VLCClickerManager.h" static int BossCallback(vlc_object_t *p_this, const char *psz_var, vlc_value_t oldval, vlc_value_t new_val, void *param) @@ -63,16 +59,9 @@ static int BossCallback(vlc_object_t *p_this, const char *psz_var, float f_maxVolume; - /* media key support */ - BOOL b_mediaKeySupport; - BOOL b_mediakeyJustJumped; - SPMediaKeyTap *_mediaKeyController; - BOOL b_mediaKeyTrapEnabled; - - AppleRemote *_remote; - BOOL b_remote_button_hold; /* true as long as the user holds the left,right,plus or minus on the remote control */ - NSArray *_usedHotkeys; + + VLCClickerManager *_clickerManager; } @end @@ -98,45 +87,34 @@ static int BossCallback(vlc_object_t *p_this, const char *psz_var, if (self) { intf_thread_t *p_intf = getIntf(); - /* init media key support */ - b_mediaKeySupport = var_InheritBool(p_intf, "macosx-mediakeys"); - if (b_mediaKeySupport) { - _mediaKeyController = [[SPMediaKeyTap alloc] initWithDelegate:self]; - } - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(coreChangedMediaKeySupportSetting:) - name:VLCMediaKeySupportSettingChangedNotification - object:nil]; + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter addObserver:self + selector:@selector(applicationWillTerminate:) + name:NSApplicationWillTerminateNotification + object:nil]; - /* init Apple Remote support */ - _remote = [[AppleRemote alloc] init]; - [_remote setClickCountEnabledButtons: kRemoteButtonPlay]; - [_remote setDelegate: self]; + _clickerManager = [[VLCClickerManager alloc] init]; var_AddCallback(pl_Get(p_intf), "intf-boss", BossCallback, (__bridge void *)self); } return self; } -- (void)dealloc +- (void)applicationWillTerminate:(NSNotification *)notification { - #warning BUG! This class is a singleton, so dealloc is never called! - // Dealloc is never called, which not only means the below code is never - // run, but it means that the SPMediaKeyTap object and the AppleRemote object - // is not deallocated properly either. - + // Dealloc is never called because this is a singleton, so we should cleanup manually before termination intf_thread_t *p_intf = getIntf(); var_DelCallback(pl_Get(p_intf), "intf-boss", BossCallback, (__bridge void *)self); [[NSNotificationCenter defaultCenter] removeObserver: self]; + _clickerManager = nil; + _usedHotkeys = nil; } - #pragma mark - Playback Controls - (void)play { playlist_t *p_playlist = pl_Get(getIntf()); - playlist_Play(p_playlist); } @@ -148,20 +126,19 @@ static int BossCallback(vlc_object_t *p_this, const char *psz_var, if (p_input) { playlist_TogglePause(p_playlist); vlc_object_release(p_input); - } else { PLRootType root = [[[[VLCMain sharedInstance] playlist] model] currentRootType]; - if ([[[VLCMain sharedInstance] playlist] isSelectionEmpty] && (root == ROOT_TYPE_PLAYLIST)) - [[[VLCMain sharedInstance] open] openFileGeneric]; + VLCMain *mainInstance = [VLCMain sharedInstance]; + if ([[mainInstance playlist] isSelectionEmpty] && (root == ROOT_TYPE_PLAYLIST)) + [[mainInstance open] openFileGeneric]; else - [[[VLCMain sharedInstance] playlist] playItem:nil]; + [[mainInstance playlist] playItem:nil]; } } - (void)pause { playlist_t *p_playlist = pl_Get(getIntf()); - playlist_Pause(p_playlist); } @@ -223,9 +200,7 @@ static int BossCallback(vlc_object_t *p_this, const char *psz_var, if (p_input) { f_rate = var_GetFloat(p_input, "rate"); vlc_object_release(p_input); - } - else - { + } else { playlist_t * p_playlist = pl_Get(getIntf()); f_rate = var_GetFloat(p_playlist, "rate"); } @@ -321,7 +296,7 @@ static int BossCallback(vlc_object_t *p_this, const char *psz_var, return nil; } - NSString *o_name = @""; + NSString *o_name; char *format = var_InheritString(getIntf(), "input-title-format"); if (format) { char *formated = vlc_strfinput(p_input, NULL, format); @@ -333,7 +308,7 @@ static int BossCallback(vlc_object_t *p_this, const char *psz_var, NSURL * o_url = [NSURL URLWithString:toNSStr(psz_uri)]; free(psz_uri); - if ([o_name isEqualToString:@""]) { + if (!o_name) { if ([o_url isFileURL]) o_name = [[NSFileManager defaultManager] displayNameAtPath:[o_url path]]; else @@ -343,18 +318,6 @@ static int BossCallback(vlc_object_t *p_this, const char *psz_var, return o_name; } -- (void)forward -{ - //LEGACY SUPPORT - [self forwardShort]; -} - -- (void)backward -{ - //LEGACY SUPPORT - [self backwardShort]; -} - - (void)jumpWithValue:(char *)p_value forward:(BOOL)b_value { input_thread_t *p_input = pl_CurrentInput(getIntf()); @@ -632,7 +595,6 @@ static int BossCallback(vlc_object_t *p_this, const char *psz_var, return; NSUInteger count = [paths count]; - for (int i = 0; i < count ; i++) { char *mrl = vlc_path2uri([[[paths objectAtIndex:i] path] UTF8String], NULL); if (!mrl) @@ -641,7 +603,7 @@ static int BossCallback(vlc_object_t *p_this, const char *psz_var, int i_result = input_AddSlave(p_input, SLAVE_TYPE_SPU, mrl, true, true, true); if (i_result != VLC_SUCCESS) - msg_Warn(getIntf(), "unable to load subtitles from '%s'", mrl); + msg_Err(getIntf(), "unable to load subtitles from '%s'", mrl); free(mrl); } vlc_object_release(p_input); @@ -702,280 +664,6 @@ static int BossCallback(vlc_object_t *p_this, const char *psz_var, } } -#pragma mark - uncommon stuff - -- (BOOL)fixIntfSettings -{ - NSMutableString * o_workString; - NSRange returnedRange; - NSRange fullRange; - BOOL b_needsRestart = NO; - - #define fixpref(pref) \ - o_workString = [[NSMutableString alloc] initWithFormat:@"%s", config_GetPsz(pref)]; \ - if ([o_workString length] > 0) \ - { \ - returnedRange = [o_workString rangeOfString:@"macosx" options: NSCaseInsensitiveSearch]; \ - if (returnedRange.location != NSNotFound) \ - { \ - if ([o_workString isEqualToString:@"macosx"]) \ - [o_workString setString:@""]; \ - fullRange = NSMakeRange(0, [o_workString length]); \ - [o_workString replaceOccurrencesOfString:@":macosx" withString:@"" options: NSCaseInsensitiveSearch range: fullRange]; \ - fullRange = NSMakeRange(0, [o_workString length]); \ - [o_workString replaceOccurrencesOfString:@"macosx:" withString:@"" options: NSCaseInsensitiveSearch range: fullRange]; \ - \ - config_PutPsz(pref, [o_workString UTF8String]); \ - b_needsRestart = YES; \ - } \ - } - - fixpref("control"); - fixpref("extraintf"); - #undef fixpref - - return b_needsRestart; -} - -#pragma mark - video filter handling - -- (const char *)getFilterType:(const char *)psz_name -{ - module_t *p_obj = module_find(psz_name); - if (!p_obj) { - return NULL; - } - - if (module_provides(p_obj, "video splitter")) { - return "video-splitter"; - } else if (module_provides(p_obj, "video filter")) { - return "video-filter"; - } else if (module_provides(p_obj, "sub source")) { - return "sub-source"; - } else if (module_provides(p_obj, "sub filter")) { - return "sub-filter"; - } else { - msg_Err(getIntf(), "Unknown video filter type."); - return NULL; - } -} - -- (void)setVideoFilter: (const char *)psz_name on:(BOOL)b_on -{ - intf_thread_t *p_intf = getIntf(); - if (!p_intf) - return; - playlist_t *p_playlist = pl_Get(p_intf); - char *psz_string, *psz_parser; - - const char *psz_filter_type = [self getFilterType:psz_name]; - if (!psz_filter_type) { - msg_Err(p_intf, "Unable to find filter module \"%s\".", psz_name); - return; - } - - msg_Dbg(p_intf, "will turn filter '%s' %s", psz_name, b_on ? "on" : "off"); - - psz_string = var_InheritString(p_playlist, psz_filter_type); - - if (b_on) { - if (psz_string == NULL) { - psz_string = strdup(psz_name); - } else if (strstr(psz_string, psz_name) == NULL) { - char *psz_tmp = strdup([[NSString stringWithFormat: @"%s:%s", psz_string, psz_name] UTF8String]); - free(psz_string); - psz_string = psz_tmp; - } - } else { - if (!psz_string) - return; - - psz_parser = strstr(psz_string, psz_name); - if (psz_parser) { - if (*(psz_parser + strlen(psz_name)) == ':') { - memmove(psz_parser, psz_parser + strlen(psz_name) + 1, - strlen(psz_parser + strlen(psz_name) + 1) + 1); - } else { - *psz_parser = '\0'; - } - - /* Remove trailing : : */ - if (strlen(psz_string) > 0 && *(psz_string + strlen(psz_string) -1) == ':') - *(psz_string + strlen(psz_string) -1) = '\0'; - } else { - free(psz_string); - return; - } - } - var_SetString(p_playlist, psz_filter_type, psz_string); - - /* Try to set non splitter filters on the fly */ - if (strcmp(psz_filter_type, "video-splitter")) { - NSArray<NSValue *> *vouts = getVouts(); - if (vouts) - for (NSValue * val in vouts) { - vout_thread_t *p_vout = [val pointerValue]; - var_SetString(p_vout, psz_filter_type, psz_string); - vlc_object_release(p_vout); - } - } - - free(psz_string); -} - -- (void)setVideoFilterProperty: (char const *)psz_property - forFilter: (char const *)psz_filter - withValue: (vlc_value_t)value -{ - NSArray<NSValue *> *vouts = getVouts(); - intf_thread_t *p_intf = getIntf(); - if (!p_intf) - return; - - playlist_t *p_playlist = pl_Get(p_intf); - - int i_type = 0; - bool b_is_command = false; - char const *psz_filter_type = [self getFilterType: psz_filter]; - if (!psz_filter_type) { - msg_Err(p_intf, "Unable to find filter module \"%s\".", psz_filter); - return; - } - - if (vouts && [vouts count]) - { - i_type = var_Type((vout_thread_t *)[[vouts firstObject] pointerValue], psz_property); - b_is_command = i_type & VLC_VAR_ISCOMMAND; - } - if (!i_type) - i_type = config_GetType(psz_property); - - i_type &= VLC_VAR_CLASS; - if (i_type == VLC_VAR_BOOL) - var_SetBool(p_playlist, psz_property, value.b_bool); - else if (i_type == VLC_VAR_INTEGER) - var_SetInteger(p_playlist, psz_property, value.i_int); - else if (i_type == VLC_VAR_FLOAT) - var_SetFloat(p_playlist, psz_property, value.f_float); - else if (i_type == VLC_VAR_STRING) - var_SetString(p_playlist, psz_property, EnsureUTF8(value.psz_string)); - else - { - msg_Err(p_intf, - "Module %s's %s variable is of an unsupported type ( %d )", - psz_filter, psz_property, i_type); - b_is_command = false; - } - - if (b_is_command) - if (vouts) - for (NSValue *ptr in vouts) - { - vout_thread_t *p_vout = [ptr pointerValue]; - var_SetChecked(p_vout, psz_property, i_type, value); -#ifndef NDEBUG - int i_cur_type = var_Type(p_vout, psz_property); - assert((i_cur_type & VLC_VAR_CLASS) == i_type); - assert(i_cur_type & VLC_VAR_ISCOMMAND); -#endif - } - - if (vouts) - for (NSValue *ptr in vouts) - vlc_object_release((vout_thread_t *)[ptr pointerValue]); -} - -#pragma mark - -#pragma mark Media Key support - -- (void)resetMediaKeyJump -{ - b_mediakeyJustJumped = NO; -} - -- (void)coreChangedMediaKeySupportSetting: (NSNotification *)o_notification -{ - intf_thread_t *p_intf = getIntf(); - if (!p_intf) - return; - - b_mediaKeySupport = var_InheritBool(p_intf, "macosx-mediakeys"); - if (b_mediaKeySupport && !_mediaKeyController) - _mediaKeyController = [[SPMediaKeyTap alloc] initWithDelegate:self]; - - VLCMain *main = [VLCMain sharedInstance]; - if (b_mediaKeySupport && ([[[main playlist] model] hasChildren] || - [[main inputManager] hasInput])) { - if (!b_mediaKeyTrapEnabled) { - msg_Dbg(p_intf, "Enabling media key support"); - if ([_mediaKeyController startWatchingMediaKeys]) { - b_mediaKeyTrapEnabled = YES; - } else { - msg_Warn(p_intf, "Failed to enable media key support, likely " - "app needs to be whitelisted in Security Settings."); - } - } - } else { - if (b_mediaKeyTrapEnabled) { - b_mediaKeyTrapEnabled = NO; - msg_Dbg(p_intf, "Disabling media key support"); - [_mediaKeyController stopWatchingMediaKeys]; - } - } -} - --(void)mediaKeyTap:(SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event -{ - if (b_mediaKeySupport) { - assert([event type] == NSSystemDefined && [event subtype] == SPSystemDefinedEventMediaKeys); - - 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) - [self playOrPause]; - - if ((keyCode == NX_KEYTYPE_FAST || keyCode == NX_KEYTYPE_NEXT) && !b_mediakeyJustJumped) { - if (keyState == 0 && keyRepeat == 0) - [self next]; - else if (keyRepeat == 1) { - [self forwardShort]; - b_mediakeyJustJumped = YES; - [self performSelector:@selector(resetMediaKeyJump) - withObject: NULL - afterDelay:0.25]; - } - } - - if ((keyCode == NX_KEYTYPE_REWIND || keyCode == NX_KEYTYPE_PREVIOUS) && !b_mediakeyJustJumped) { - if (keyState == 0 && keyRepeat == 0) - [self previous]; - else if (keyRepeat == 1) { - [self backwardShort]; - b_mediakeyJustJumped = YES; - [self performSelector:@selector(resetMediaKeyJump) - withObject: NULL - afterDelay:0.25]; - } - } - } -} - -#pragma mark - -#pragma mark Apple Remote Control - -- (void)startListeningWithAppleRemote -{ - [_remote startListening: self]; -} - -- (void)stopListeningWithAppleRemote -{ - [_remote stopListening:self]; -} - #pragma mark - menu navigation - (void)menuFocusActivate { @@ -1027,115 +715,6 @@ static int BossCallback(vlc_object_t *p_this, const char *psz_var, vlc_object_release(p_input_thread); } -/* 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 */ -- (void) executeHoldActionForRemoteButton: (NSNumber*) buttonIdentifierNumber -{ - intf_thread_t *p_intf = getIntf(); - if (!p_intf) - return; - - if (b_remote_button_hold) { - switch([buttonIdentifierNumber intValue]) { - case kRemoteButtonRight_Hold: - [self forward]; - break; - case kRemoteButtonLeft_Hold: - [self backward]; - break; - case kRemoteButtonVolume_Plus_Hold: - if (p_intf) - var_SetInteger(p_intf->obj.libvlc, "key-action", ACTIONID_VOL_UP); - break; - case kRemoteButtonVolume_Minus_Hold: - if (p_intf) - var_SetInteger(p_intf->obj.libvlc, "key-action", ACTIONID_VOL_DOWN); - break; - } - if (b_remote_button_hold) { - /* trigger event */ - [self performSelector:@selector(executeHoldActionForRemoteButton:) - withObject:buttonIdentifierNumber - afterDelay:0.25]; - } - } -} - -/* Apple Remote callback */ -- (void) appleRemoteButton: (AppleRemoteEventIdentifier)buttonIdentifier - pressedDown: (BOOL) pressedDown - clickCount: (unsigned int) count -{ - intf_thread_t *p_intf = getIntf(); - if (!p_intf) - return; - - switch(buttonIdentifier) { - case k2009RemoteButtonFullscreen: - [self toggleFullscreen]; - break; - case k2009RemoteButtonPlay: - [self playOrPause]; - break; - case kRemoteButtonPlay: - if (count >= 2) - [self toggleFullscreen]; - else - [self playOrPause]; - break; - case kRemoteButtonVolume_Plus: - if (config_GetInt("macosx-appleremote-sysvol")) - [NSSound increaseSystemVolume]; - else - if (p_intf) - var_SetInteger(p_intf->obj.libvlc, "key-action", ACTIONID_VOL_UP); - break; - case kRemoteButtonVolume_Minus: - if (config_GetInt("macosx-appleremote-sysvol")) - [NSSound decreaseSystemVolume]; - else - if (p_intf) - var_SetInteger(p_intf->obj.libvlc, "key-action", ACTIONID_VOL_DOWN); - break; - case kRemoteButtonRight: - if (config_GetInt("macosx-appleremote-prevnext")) - [self forward]; - else - [self next]; - break; - case kRemoteButtonLeft: - if (config_GetInt("macosx-appleremote-prevnext")) - [self backward]; - else - [self previous]; - break; - case kRemoteButtonRight_Hold: - case kRemoteButtonLeft_Hold: - case kRemoteButtonVolume_Plus_Hold: - case kRemoteButtonVolume_Minus_Hold: - /* simulate an event as long as the user holds the button */ - b_remote_button_hold = pressedDown; - if (pressedDown) { - NSNumber* buttonIdentifierNumber = [NSNumber numberWithInt:buttonIdentifier]; - [self performSelector:@selector(executeHoldActionForRemoteButton:) - withObject:buttonIdentifierNumber]; - } - break; - case kRemoteButtonMenu: - [self showPosition]; - break; - case kRemoteButtonPlay_Sleep: - { - NSAppleScript * script = [[NSAppleScript alloc] initWithSource:@"tell application \"System Events\" to sleep"]; - [script executeAndReturnError:nil]; - break; - } - default: - /* Add here whatever you want other buttons to do */ - break; - } -} - #pragma mark - #pragma mark Key Shortcuts @@ -1226,7 +805,8 @@ static int BossCallback(vlc_object_t *p_this, const char *psz_var, val.i_int |= CocoaKeyToVLC(key); BOOL b_found_key = NO; - for (NSUInteger i = 0; i < [_usedHotkeys count]; i++) { + NSUInteger numberOfUsedHotkeys = [_usedHotkeys count]; + for (NSUInteger i = 0; i < numberOfUsedHotkeys; i++) { NSString *str = [_usedHotkeys objectAtIndex:i]; unsigned int i_keyModifiers = [[VLCStringUtility sharedInstance] VLCModifiersToCocoa: str]; diff --git a/modules/gui/macosx/VLCMain+OldPrefs.m b/modules/gui/macosx/VLCMain+OldPrefs.m index 41d811b5a9..c382d10ff9 100644 --- a/modules/gui/macosx/VLCMain+OldPrefs.m +++ b/modules/gui/macosx/VLCMain+OldPrefs.m @@ -25,6 +25,7 @@ #import "VLCMain+OldPrefs.h" #import "VLCCoreInteraction.h" #import "VLCSimplePrefsController.h" +#import "VLCStringUtility.h" #include <unistd.h> /* execl() */ @@ -73,7 +74,7 @@ static const int kCurrentPreferencesVersion = 4; [defaults setInteger:kCurrentPreferencesVersion forKey:kVLCPreferencesVersion]; [defaults synchronize]; - if (![[VLCCoreInteraction sharedInstance] fixIntfSettings]) + if (!fixIntfSettings()) return; else config_SaveConfigFile(getIntf()); // we need to do manually, since we won't quit libvlc cleanly diff --git a/modules/gui/macosx/VLCMain.h b/modules/gui/macosx/VLCMain.h index efc12e71be..e3395aa103 100644 --- a/modules/gui/macosx/VLCMain.h +++ b/modules/gui/macosx/VLCMain.h @@ -52,6 +52,7 @@ intf_thread_t *getIntf(void); static NSString * VLCInputChangedNotification = @"VLCInputChangedNotification"; static NSString * VLCConfigurationChangedNotification = @"VLCConfigurationChangedNotification"; static NSString * VLCMediaKeySupportSettingChangedNotification = @"VLCMediaKeySupportSettingChangedNotification"; +static NSString * VLCAppleRemoteSettingChangedNotification = @"VLCAppleRemoteSettingChangedNotification"; /***************************************************************************** * VLCMain interface diff --git a/modules/gui/macosx/VLCMain.m b/modules/gui/macosx/VLCMain.m index 09da04c009..631239d25c 100644 --- a/modules/gui/macosx/VLCMain.m +++ b/modules/gui/macosx/VLCMain.m @@ -363,7 +363,6 @@ static VLCMain *sharedInstance = nil; - (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update { [NSApp activateIgnoringOtherApps:YES]; - [_coreinteraction stopListeningWithAppleRemote]; [_coreinteraction stop]; } @@ -380,22 +379,6 @@ static VLCMain *sharedInstance = nil; #pragma mark - #pragma mark Other notification -/* Listen to the remote in exclusive mode, only when VLC is the active - application */ -- (void)applicationDidBecomeActive:(NSNotification *)aNotification -{ - if (!p_intf) - return; - if (var_InheritBool(p_intf, "macosx-appleremote") == YES) - [_coreinteraction startListeningWithAppleRemote]; -} -- (void)applicationDidResignActive:(NSNotification *)aNotification -{ - if (!p_intf) - return; - [_coreinteraction stopListeningWithAppleRemote]; -} - /* Triggered when the computer goes to sleep */ - (void)computerWillSleep: (NSNotification *)notification { diff --git a/modules/gui/macosx/VLCMainMenu.m b/modules/gui/macosx/VLCMainMenu.m index fc062f7458..de811e52eb 100644 --- a/modules/gui/macosx/VLCMainMenu.m +++ b/modules/gui/macosx/VLCMainMenu.m @@ -50,6 +50,7 @@ #import "VLCTimeSelectionPanelController.h" #import "NSScreen+VLCAdditions.h" #import "VLCRendererMenuController.h" +#import "VLCVideoFilterHelper.h" #ifdef HAVE_SPARKLE #import <Sparkle/Sparkle.h> @@ -761,12 +762,12 @@ - (IBAction)forward:(id)sender { - [[VLCCoreInteraction sharedInstance] forward]; + [[VLCCoreInteraction sharedInstance] forwardShort]; } - (IBAction)backward:(id)sender { - [[VLCCoreInteraction sharedInstance] backward]; + [[VLCCoreInteraction sharedInstance] backwardShort]; } - (IBAction)volumeUp:(id)sender @@ -984,12 +985,12 @@ - (void)_disablePostProcessing { - [[VLCCoreInteraction sharedInstance] setVideoFilter:"postproc" on:false]; + [VLCVideoFilterHelper setVideoFilter:"postproc" on:false]; } - (void)_enablePostProcessing { - [[VLCCoreInteraction sharedInstance] setVideoFilter:"postproc" on:true]; + [VLCVideoFilterHelper setVideoFilter:"postproc" on:true]; } - (void)togglePostProcessing:(id)sender @@ -1005,7 +1006,7 @@ [self _enablePostProcessing]; [sender setState:NSOnState]; - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty:"postproc-q" forFilter:"postproc" withValue:(vlc_value_t){ .i_int = [sender tag] }]; + [VLCVideoFilterHelper setVideoFilterProperty:"postproc-q" forFilter:"postproc" withValue:(vlc_value_t){ .i_int = [sender tag] }]; } } diff --git a/modules/gui/macosx/VLCSimplePrefsController.m b/modules/gui/macosx/VLCSimplePrefsController.m index 6387e3439a..96b1d62833 100644 --- a/modules/gui/macosx/VLCSimplePrefsController.m +++ b/modules/gui/macosx/VLCSimplePrefsController.m @@ -35,7 +35,6 @@ #import "misc.h" #import "VLCMain.h" #import "VLCMain+OldPrefs.h" -#import "AppleRemote.h" #import "VLCCoreInteraction.h" #import "NSScreen+VLCAdditions.h" @@ -911,12 +910,6 @@ static inline void save_string_list(intf_thread_t * p_intf, id object, const cha SaveIntList(_intf_pauseitunesPopup, "macosx-control-itunes"); SaveIntList(_intf_continueplaybackPopup, "macosx-continue-playback"); - - /* activate stuff without restart */ - if ([_intf_appleremoteCheckbox state] == YES) - [[VLCCoreInteraction sharedInstance] startListeningWithAppleRemote]; - else - [[VLCCoreInteraction sharedInstance] stopListeningWithAppleRemote]; _intfSettingChanged = NO; } @@ -1036,13 +1029,15 @@ static inline void save_string_list(intf_thread_t * p_intf, id object, const cha _hotkeyChanged = NO; } - [[VLCCoreInteraction sharedInstance] fixIntfSettings]; + fixIntfSettings(); /* okay, let's save our changes to vlcrc */ config_SaveConfigFile(p_intf); - [[NSNotificationCenter defaultCenter] postNotificationName:VLCMediaKeySupportSettingChangedNotification object:nil]; - [[NSNotificationCenter defaultCenter] postNotificationName:VLCConfigurationChangedNotification object:nil]; + NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; + [notificationCenter postNotificationName:VLCMediaKeySupportSettingChangedNotification object:nil]; + [notificationCenter postNotificationName:VLCConfigurationChangedNotification object:nil]; + [notificationCenter postNotificationName:VLCAppleRemoteSettingChangedNotification object:nil]; } - (void)showSettingsForCategory:(NSView *)categoryView diff --git a/modules/gui/macosx/VLCStringUtility.h b/modules/gui/macosx/VLCStringUtility.h index cc1802e8c2..9efd7cf26c 100644 --- a/modules/gui/macosx/VLCStringUtility.h +++ b/modules/gui/macosx/VLCStringUtility.h @@ -53,6 +53,11 @@ unsigned int CocoaKeyToVLC(unichar i_key); */ NSImage *imageFromRes(NSString *name); +/** + * Fix certain settings strings before saving + */ +bool fixIntfSettings(void); + @interface VLCStringUtility : NSObject + (VLCStringUtility *)sharedInstance; diff --git a/modules/gui/macosx/VLCStringUtility.m b/modules/gui/macosx/VLCStringUtility.m index dae6cc0a4e..b0169266ff 100644 --- a/modules/gui/macosx/VLCStringUtility.m +++ b/modules/gui/macosx/VLCStringUtility.m @@ -360,3 +360,36 @@ NSImage *imageFromRes(NSString *name) { return [NSImage imageNamed:name]; } + +bool fixIntfSettings(void) +{ + NSMutableString * o_workString; + NSRange returnedRange; + NSRange fullRange; + BOOL b_needsRestart = NO; + + #define fixpref(pref) \ + o_workString = [[NSMutableString alloc] initWithFormat:@"%s", config_GetPsz(pref)]; \ + if ([o_workString length] > 0) \ + { \ + returnedRange = [o_workString rangeOfString:@"macosx" options: NSCaseInsensitiveSearch]; \ + if (returnedRange.location != NSNotFound) \ + { \ + if ([o_workString isEqualToString:@"macosx"]) \ + [o_workString setString:@""]; \ + fullRange = NSMakeRange(0, [o_workString length]); \ + [o_workString replaceOccurrencesOfString:@":macosx" withString:@"" options: NSCaseInsensitiveSearch range: fullRange]; \ + fullRange = NSMakeRange(0, [o_workString length]); \ + [o_workString replaceOccurrencesOfString:@"macosx:" withString:@"" options: NSCaseInsensitiveSearch range: fullRange]; \ + \ + config_PutPsz(pref, [o_workString UTF8String]); \ + b_needsRestart = YES; \ + } \ + } + + fixpref("control"); + fixpref("extraintf"); +#undef fixpref + + return b_needsRestart; +} diff --git a/modules/gui/macosx/VLCTrackSynchronizationWindowController.m b/modules/gui/macosx/VLCTrackSynchronizationWindowController.m index ac7f522e7e..1883ac9627 100644 --- a/modules/gui/macosx/VLCTrackSynchronizationWindowController.m +++ b/modules/gui/macosx/VLCTrackSynchronizationWindowController.m @@ -25,7 +25,7 @@ #import "VLCMain.h" #import <vlc_common.h> #import "VLCTrackSynchronizationWindowController.h" -#import "VLCCoreInteraction.h" +#import "VLCVideoFilterHelper.h" #define SUBSDELAY_CFG_MODE "subsdelay-mode" #define SUBSDELAY_CFG_FACTOR "subsdelay-factor" @@ -205,7 +205,7 @@ var_SetFloat(p_vout, SUBSDELAY_CFG_FACTOR, f_factor); vlc_object_release(p_vout); } - [[VLCCoreInteraction sharedInstance] setVideoFilter: "subsdelay" on: f_factor > 0]; + [VLCVideoFilterHelper setVideoFilter: "subsdelay" on: f_factor > 0]; vlc_object_release(p_input); } diff --git a/modules/gui/macosx/VLCVideoEffectsWindowController.m b/modules/gui/macosx/VLCVideoEffectsWindowController.m index 7953c021f4..e93898aec8 100644 --- a/modules/gui/macosx/VLCVideoEffectsWindowController.m +++ b/modules/gui/macosx/VLCVideoEffectsWindowController.m @@ -25,7 +25,7 @@ #import "VLCVideoEffectsWindowController.h" #import "VLCPopupPanelController.h" #import "VLCTextfieldPanelController.h" -#import "VLCCoreInteraction.h" +#import "VLCVideoFilterHelper.h" #import "VLCHexNumberFormatter.h" #import "NSString+Helpers.h" @@ -88,7 +88,6 @@ { intf_thread_t *p_intf = getIntf(); playlist_t *p_playlist = pl_Get(p_intf); - VLCCoreInteraction *vci_si = [VLCCoreInteraction sharedInstance]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSInteger profileIndex = [self currentProfileIndex]; @@ -139,37 +138,37 @@ /* try to set filter values on-the-fly and store them appropriately */ // index 3 is deprecated - [vci_si setVideoFilterProperty: "contrast" forFilter: "adjust" withValue: getWidgetFloatValue([items objectAtIndex:4])]; - [vci_si setVideoFilterProperty: "brightness" forFilter: "adjust" withValue: getWidgetFloatValue([items objectAtIndex:5])]; - [vci_si setVideoFilterProperty: "saturation" forFilter: "adjust" withValue: getWidgetFloatValue([items objectAtIndex:6])]; - [vci_si setVideoFilterProperty: "gamma" forFilter: "adjust" withValue: getWidgetFloatValue([items objectAtIndex:7])]; - [vci_si setVideoFilterProperty: "sharpen-sigma" forFilter: "sharpen" withValue: getWidgetFloatValue([items objectAtIndex:8])]; - [vci_si setVideoFilterProperty: "gradfun-radius" forFilter: "gradfun" withValue: getWidgetIntValue([items objectAtIndex:9])]; - [vci_si setVideoFilterProperty: "grain-variance" forFilter: "grain" withValue: getWidgetFloatValue([items objectAtIndex:10])]; - [vci_si setVideoFilterProperty: "transform-type" forFilter: "transform" withValue: (vlc_value_t){ .psz_string = (char *)[B64DecNSStr([items objectAtIndex:11]) UTF8String] }]; - [vci_si setVideoFilterProperty: "puzzle-rows" forFilter: "puzzle" withValue: getWidgetIntValue([items objectAtIndex:12])]; - [vci_si setVideoFilterProperty: "puzzle-cols" forFilter: "puzzle" withValue: getWidgetIntValue([items objectAtIndex:13])]; - [vci_si setVideoFilterProperty: "colorthres-color" forFilter: "colorthres" withValue: getWidgetIntValue([items objectAtIndex:14])]; - [vci_si setVideoFilterProperty: "colorthres-saturationthres" forFilter: "colorthres" withValue: getWidgetIntValue([items objectAtIndex:15])]; - [vci_si setVideoFilterProperty: "colorthres-similaritythres" forFilter: "colorthres" withValue: getWidgetIntValue([items objectAtIndex:16])]; - [vci_si setVideoFilterProperty: "sepia-intensity" forFilter: "sepia" withValue: getWidgetIntValue([items objectAtIndex:17])]; - [vci_si setVideoFilterProperty: "gradient-mode" forFilter: "gradient" withValue: (vlc_value_t){ .psz_string = (char *)[B64DecNSStr([items objectAtIndex:18]) UTF8String] }]; - [vci_si setVideoFilterProperty: "gradient-cartoon" forFilter: "gradient" withValue: (vlc_value_t){ .b_bool = [[items objectAtIndex:19] intValue] }]; - [vci_si setVideoFilterProperty: "gradient-type" forFilter: "gradient" withValue: getWidgetIntValue([items objectAtIndex:20])]; - [vci_si setVideoFilterProperty: "extract-component" forFilter: "extract" withValue: getWidgetIntValue([items objectAtIndex:21])]; - [vci_si setVideoFilterProperty: "posterize-level" forFilter: "posterize" withValue: getWidgetIntValue([items objectAtIndex:22])]; - [vci_si setVideoFilterProperty: "blur-factor" forFilter: "motionblur" withValue: getWidgetIntValue([items objectAtIndex:23])]; - [vci_si setVideoFilterProperty: "marq-marquee" forFilter: "marq" withValue: (vlc_value_t){ .psz_string = (char *)[B64DecNSStr([items objectAtIndex:24]) UTF8String] }]; - [vci_si setVideoFilterProperty: "marq-position" forFilter: "marq" withValue: getWidgetIntValue([items objectAtIndex:25])]; - [vci_si setVideoFilterProperty: "logo-file" forFilter: "logo" withValue: (vlc_value_t){ .psz_string = (char *)[B64DecNSStr([items objectAtIndex:26]) UTF8String] }]; - [vci_si setVideoFilterProperty: "logo-position" forFilter: "logo" withValue: getWidgetIntValue([items objectAtIndex:27])]; - [vci_si setVideoFilterProperty: "logo-opacity" forFilter: "logo" withValue: getWidgetIntValue([items objectAtIndex:28])]; - [vci_si setVideoFilterProperty: "clone-count" forFilter: "clone" withValue: getWidgetIntValue([items objectAtIndex:29])]; - [vci_si setVideoFilterProperty: "wall-rows" forFilter: "wall" withValue: getWidgetIntValue([items objectAtIndex:30])]; - [vci_si setVideoFilterProperty: "wall-cols" forFilter: "wall" withValue: getWidgetIntValue([items objectAtIndex:31])]; + [VLCVideoFilterHelper setVideoFilterProperty: "contrast" forFilter: "adjust" withValue: getWidgetFloatValue([items objectAtIndex:4])]; + [VLCVideoFilterHelper setVideoFilterProperty: "brightness" forFilter: "adjust" withValue: getWidgetFloatValue([items objectAtIndex:5])]; + [VLCVideoFilterHelper setVideoFilterProperty: "saturation" forFilter: "adjust" withValue: getWidgetFloatValue([items objectAtIndex:6])]; + [VLCVideoFilterHelper setVideoFilterProperty: "gamma" forFilter: "adjust" withValue: getWidgetFloatValue([items objectAtIndex:7])]; + [VLCVideoFilterHelper setVideoFilterProperty: "sharpen-sigma" forFilter: "sharpen" withValue: getWidgetFloatValue([items objectAtIndex:8])]; + [VLCVideoFilterHelper setVideoFilterProperty: "gradfun-radius" forFilter: "gradfun" withValue: getWidgetIntValue([items objectAtIndex:9])]; + [VLCVideoFilterHelper setVideoFilterProperty: "grain-variance" forFilter: "grain" withValue: getWidgetFloatValue([items objectAtIndex:10])]; + [VLCVideoFilterHelper setVideoFilterProperty: "transform-type" forFilter: "transform" withValue: (vlc_value_t){ .psz_string = (char *)[B64DecNSStr([items objectAtIndex:11]) UTF8String] }]; + [VLCVideoFilterHelper setVideoFilterProperty: "puzzle-rows" forFilter: "puzzle" withValue: getWidgetIntValue([items objectAtIndex:12])]; + [VLCVideoFilterHelper setVideoFilterProperty: "puzzle-cols" forFilter: "puzzle" withValue: getWidgetIntValue([items objectAtIndex:13])]; + [VLCVideoFilterHelper setVideoFilterProperty: "colorthres-color" forFilter: "colorthres" withValue: getWidgetIntValue([items objectAtIndex:14])]; + [VLCVideoFilterHelper setVideoFilterProperty: "colorthres-saturationthres" forFilter: "colorthres" withValue: getWidgetIntValue([items objectAtIndex:15])]; + [VLCVideoFilterHelper setVideoFilterProperty: "colorthres-similaritythres" forFilter: "colorthres" withValue: getWidgetIntValue([items objectAtIndex:16])]; + [VLCVideoFilterHelper setVideoFilterProperty: "sepia-intensity" forFilter: "sepia" withValue: getWidgetIntValue([items objectAtIndex:17])]; + [VLCVideoFilterHelper setVideoFilterProperty: "gradient-mode" forFilter: "gradient" withValue: (vlc_value_t){ .psz_string = (char *)[B64DecNSStr([items objectAtIndex:18]) UTF8String] }]; + [VLCVideoFilterHelper setVideoFilterProperty: "gradient-cartoon" forFilter: "gradient" withValue: (vlc_value_t){ .b_bool = [[items objectAtIndex:19] intValue] }]; + [VLCVideoFilterHelper setVideoFilterProperty: "gradient-type" forFilter: "gradient" withValue: getWidgetIntValue([items objectAtIndex:20])]; + [VLCVideoFilterHelper setVideoFilterProperty: "extract-component" forFilter: "extract" withValue: getWidgetIntValue([items objectAtIndex:21])]; + [VLCVideoFilterHelper setVideoFilterProperty: "posterize-level" forFilter: "posterize" withValue: getWidgetIntValue([items objectAtIndex:22])]; + [VLCVideoFilterHelper setVideoFilterProperty: "blur-factor" forFilter: "motionblur" withValue: getWidgetIntValue([items objectAtIndex:23])]; + [VLCVideoFilterHelper setVideoFilterProperty: "marq-marquee" forFilter: "marq" withValue: (vlc_value_t){ .psz_string = (char *)[B64DecNSStr([items objectAtIndex:24]) UTF8String] }]; + [VLCVideoFilterHelper setVideoFilterProperty: "marq-position" forFilter: "marq" withValue: getWidgetIntValue([items objectAtIndex:25])]; + [VLCVideoFilterHelper setVideoFilterProperty: "logo-file" forFilter: "logo" withValue: (vlc_value_t){ .psz_string = (char *)[B64DecNSStr([items objectAtIndex:26]) UTF8String] }]; + [VLCVideoFilterHelper setVideoFilterProperty: "logo-position" forFilter: "logo" withValue: getWidgetIntValue([items objectAtIndex:27])]; + [VLCVideoFilterHelper setVideoFilterProperty: "logo-opacity" forFilter: "logo" withValue: getWidgetIntValue([items objectAtIndex:28])]; + [VLCVideoFilterHelper setVideoFilterProperty: "clone-count" forFilter: "clone" withValue: getWidgetIntValue([items objectAtIndex:29])]; + [VLCVideoFilterHelper setVideoFilterProperty: "wall-rows" forFilter: "wall" withValue: getWidgetIntValue([items objectAtIndex:30])]; + [VLCVideoFilterHelper setVideoFilterProperty: "wall-cols" forFilter: "wall" withValue: getWidgetIntValue([items objectAtIndex:31])]; if ([items count] >= 33) { // version >=2 of profile string - [vci_si setVideoFilterProperty: "brightness-threshold" forFilter: "adjust" withValue: (vlc_value_t){ .b_bool = [[items objectAtIndex:32] intValue] }]; + [VLCVideoFilterHelper setVideoFilterProperty: "brightness-threshold" forFilter: "adjust" withValue: (vlc_value_t){ .b_bool = [[items objectAtIndex:32] intValue] }]; } vlc_value_t hueValue; @@ -180,7 +179,7 @@ // convert to new scale ([0,360] --> [-180,180]) hueValue.f_float -= 180; } - [vci_si setVideoFilterProperty: "hue" forFilter: "adjust" withValue: hueValue]; + [VLCVideoFilterHelper setVideoFilterProperty: "hue" forFilter: "adjust" withValue: hueValue]; } - (void)windowDidLoad @@ -897,16 +896,15 @@ [_adjustHueSlider setToolTip: [NSString stringWithFormat:@"%.0f", 0.0]]; [_adjustSaturationSlider setToolTip: [NSString stringWithFormat:@"%0.3f", 1.0]]; - VLCCoreInteraction *vci_si = [VLCCoreInteraction sharedInstance]; - [vci_si setVideoFilterProperty: "brightness" forFilter: "adjust" withValue: (vlc_value_t){ .f_float = 1.f }]; - [vci_si setVideoFilterProperty: "contrast" forFilter: "adjust" withValue: (vlc_value_t){ .f_float = 1.f }]; - [vci_si setVideoFilterProperty: "gamma" forFilter: "adjust" withValue: (vlc_value_t){ .f_float = 1.f }]; - [vci_si setVideoFilterProperty: "hue" forFilter: "adjust" withValue: (vlc_value_t){ .f_float = .0f }]; - [vci_si setVideoFilterProperty: "saturation" forFilter: "adjust" withValue: (vlc_value_t){ .f_float = 1.f }]; + [VLCVideoFilterHelper setVideoFilterProperty: "brightness" forFilter: "adjust" withValue: (vlc_value_t){ .f_float = 1.f }]; + [VLCVideoFilterHelper setVideoFilterProperty: "contrast" forFilter: "adjust" withValue: (vlc_value_t){ .f_float = 1.f }]; + [VLCVideoFilterHelper setVideoFilterProperty: "gamma" forFilter: "adjust" withValue: (vlc_value_t){ .f_float = 1.f }]; + [VLCVideoFilterHelper setVideoFilterProperty: "hue" forFilter: "adjust" withValue: (vlc_value_t){ .f_float = .0f }]; + [VLCVideoFilterHelper setVideoFilterProperty: "saturation" forFilter: "adjust" withValue: (vlc_value_t){ .f_float = 1.f }]; } else { BOOL b_state = [_adjustCheckbox state]; - [[VLCCoreInteraction sharedInstance] setVideoFilter: "adjust" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "adjust" on: b_state]; [_adjustBrightnessSlider setEnabled: b_state]; [_adjustBrightnessCheckbox setEnabled: b_state]; [_adjustBrightnessLabel setEnabled: b_state]; @@ -937,7 +935,7 @@ psz_property = "saturation"; assert(psz_property); - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: psz_property forFilter: "adjust" withValue: getWidgetFloatValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: psz_property forFilter: "adjust" withValue: getWidgetFloatValue(sender)]; if (sender == _adjustHueSlider) [_adjustHueSlider setToolTip: [NSString stringWithFormat:@"%.0f", [_adjustHueSlider floatValue]]]; @@ -947,7 +945,7 @@ - (IBAction)enableAdjustBrightnessThreshold:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "brightness-threshold" + [VLCVideoFilterHelper setVideoFilterProperty: "brightness-threshold" forFilter: "adjust" withValue: getWidgetBoolValue(sender)]; } @@ -956,14 +954,14 @@ { BOOL b_state = [_sharpenCheckbox state]; - [[VLCCoreInteraction sharedInstance] setVideoFilter: "sharpen" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "sharpen" on: b_state]; [_sharpenSlider setEnabled: b_state]; [_sharpenLabel setEnabled: b_state]; } - (IBAction)sharpenSliderChanged:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "sharpen-sigma" forFilter: "sharpen" withValue: getWidgetFloatValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "sharpen-sigma" forFilter: "sharpen" withValue: getWidgetFloatValue(sender)]; [sender setToolTip: [NSString stringWithFormat:@"%0.3f", [sender floatValue]]]; } @@ -971,14 +969,14 @@ { BOOL b_state = [_bandingCheckbox state]; - [[VLCCoreInteraction sharedInstance] setVideoFilter: "gradfun" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "gradfun" on: b_state]; [_bandingSlider setEnabled: b_state]; [_bandingLabel setEnabled: b_state]; } - (IBAction)bandingSliderChanged:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "gradfun-radius" forFilter: "gradfun" withValue: getWidgetIntValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "gradfun-radius" forFilter: "gradfun" withValue: getWidgetIntValue(sender)]; [sender setToolTip: [NSString stringWithFormat:@"%i", [sender intValue]]]; } @@ -986,14 +984,14 @@ { BOOL b_state = [_grainCheckbox state]; - [[VLCCoreInteraction sharedInstance] setVideoFilter: "grain" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "grain" on: b_state]; [_grainSlider setEnabled: b_state]; [_grainLabel setEnabled: b_state]; } - (IBAction)grainSliderChanged:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "grain-variance" forFilter: "grain" withValue: getWidgetFloatValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "grain-variance" forFilter: "grain" withValue: getWidgetFloatValue(sender)]; [sender setToolTip: [NSString stringWithFormat:@"%0.3f", [sender floatValue]]]; } @@ -1032,26 +1030,26 @@ #pragma mark geometry - (IBAction)enableTransform:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilter: "transform" on: [_transformCheckbox state]]; + [VLCVideoFilterHelper setVideoFilter: "transform" on: [_transformCheckbox state]]; [_transformPopup setEnabled: [_transformCheckbox state]]; } - (IBAction)transformModifierChanged:(id)sender { vlc_value_t value = { .psz_string = (char *)[[[_transformPopup selectedItem] representedObject] UTF8String] }; - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "transform-type" forFilter: "transform" withValue: value]; + [VLCVideoFilterHelper setVideoFilterProperty: "transform-type" forFilter: "transform" withValue: value]; } - (IBAction)enableZoom:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilter: "magnify" on: [_zoomCheckbox state]]; + [VLCVideoFilterHelper setVideoFilter: "magnify" on: [_zoomCheckbox state]]; } - (IBAction)enablePuzzle:(id)sender { BOOL b_state = [_puzzleCheckbox state]; - [[VLCCoreInteraction sharedInstance] setVideoFilter: "puzzle" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "puzzle" on: b_state]; [_puzzleColumnsTextField setEnabled: b_state]; [_puzzleColumnsStepper setEnabled: b_state]; [_puzzleColumnsLabel setEnabled: b_state]; @@ -1063,9 +1061,9 @@ - (IBAction)puzzleModifierChanged:(id)sender { if (sender == _puzzleColumnsTextField || sender == _puzzleColumnsStepper) - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "puzzle-cols" forFilter: "puzzle" withValue: getWidgetIntValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "puzzle-cols" forFilter: "puzzle" withValue: getWidgetIntValue(sender)]; else - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "puzzle-rows" forFilter: "puzzle" withValue: getWidgetIntValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "puzzle-rows" forFilter: "puzzle" withValue: getWidgetIntValue(sender)]; } - (IBAction)enableClone:(id)sender @@ -1077,7 +1075,7 @@ [self enableWall:_wallCheckbox]; } - [[VLCCoreInteraction sharedInstance] setVideoFilter: "clone" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "clone" on: b_state]; [_cloneNumberLabel setEnabled: b_state]; [_cloneNumberTextField setEnabled: b_state]; [_cloneNumberStepper setEnabled: b_state]; @@ -1085,7 +1083,7 @@ - (IBAction)cloneModifierChanged:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "clone-count" forFilter: "clone" withValue: getWidgetIntValue(_cloneNumberTextField)]; + [VLCVideoFilterHelper setVideoFilterProperty: "clone-count" forFilter: "clone" withValue: getWidgetIntValue(_cloneNumberTextField)]; } - (IBAction)enableWall:(id)sender @@ -1097,7 +1095,7 @@ [self enableClone:_cloneCheckbox]; } - [[VLCCoreInteraction sharedInstance] setVideoFilter: "wall" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "wall" on: b_state]; [_wallNumberOfColumnsTextField setEnabled: b_state]; [_wallNumberOfColumnsStepper setEnabled: b_state]; [_wallNumberOfColumnsLabel setEnabled: b_state]; @@ -1114,7 +1112,7 @@ psz_property = "wall-cols"; else psz_property = "wall-rows"; - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: psz_property forFilter: "wall" withValue: getWidgetIntValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: psz_property forFilter: "wall" withValue: getWidgetIntValue(sender)]; } #pragma mark - @@ -1123,7 +1121,7 @@ { BOOL b_state = [_thresholdCheckbox state]; - [[VLCCoreInteraction sharedInstance] setVideoFilter: "colorthres" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "colorthres" on: b_state]; [_thresholdColorTextField setEnabled: b_state]; [_thresholdColorLabel setEnabled: b_state]; [_thresholdSaturationSlider setEnabled: b_state]; @@ -1135,12 +1133,12 @@ - (IBAction)thresholdModifierChanged:(id)sender { if (sender == _thresholdColorTextField) - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "colorthres-color" forFilter: "colorthres" withValue: getWidgetIntValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "colorthres-color" forFilter: "colorthres" withValue: getWidgetIntValue(sender)]; else if (sender == _thresholdSaturationSlider) { - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "colorthres-saturationthres" forFilter: "colorthres" withValue: getWidgetIntValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "colorthres-saturationthres" forFilter: "colorthres" withValue: getWidgetIntValue(sender)]; [_thresholdSaturationSlider setToolTip: [NSString stringWithFormat:@"%i", [_thresholdSaturationSlider intValue]]]; } else { - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "colorthres-similaritythres" forFilter: "colorthres" withValue: getWidgetIntValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "colorthres-similaritythres" forFilter: "colorthres" withValue: getWidgetIntValue(sender)]; [_thresholdSimilaritySlider setToolTip: [NSString stringWithFormat:@"%i", [_thresholdSimilaritySlider intValue]]]; } } @@ -1149,7 +1147,7 @@ { BOOL b_state = [_sepiaCheckbox state]; - [[VLCCoreInteraction sharedInstance] setVideoFilter: "sepia" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "sepia" on: b_state]; [_sepiaTextField setEnabled: b_state]; [_sepiaStepper setEnabled: b_state]; [_sepiaLabel setEnabled: b_state]; @@ -1157,14 +1155,14 @@ - (IBAction)sepiaModifierChanged:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "sepia-intensity" forFilter: "sepia" withValue: getWidgetIntValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "sepia-intensity" forFilter: "sepia" withValue: getWidgetIntValue(sender)]; } - (IBAction)enableGradient:(id)sender { BOOL b_state = [_gradientCheckbox state]; - [[VLCCoreInteraction sharedInstance] setVideoFilter: "gradient" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "gradient" on: b_state]; [_gradientModePopup setEnabled: b_state]; [_gradientModeLabel setEnabled: b_state]; [_gradientColorCheckbox setEnabled: b_state]; @@ -1175,36 +1173,36 @@ { if (sender == _gradientModePopup) { vlc_value_t value = { .psz_string = (char *)[[[sender selectedItem] representedObject] UTF8String] }; - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "gradient-mode" forFilter: "gradient" withValue: value]; + [VLCVideoFilterHelper setVideoFilterProperty: "gradient-mode" forFilter: "gradient" withValue: value]; } else if (sender == _gradientColorCheckbox) - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "gradient-type" forFilter: "gradient" withValue: getWidgetBoolValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "gradient-type" forFilter: "gradient" withValue: getWidgetBoolValue(sender)]; else - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "gradient-cartoon" forFilter: "gradient" withValue: getWidgetBoolValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "gradient-cartoon" forFilter: "gradient" withValue: getWidgetBoolValue(sender)]; } - (IBAction)enableExtract:(id)sender { BOOL b_state = [_extractCheckbox state]; - [[VLCCoreInteraction sharedInstance] setVideoFilter: "extract" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "extract" on: b_state]; [_extractTextField setEnabled: b_state]; [_extractLabel setEnabled: b_state]; } - (IBAction)extractModifierChanged:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "extract-component" forFilter: "extract" withValue: getWidgetIntValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "extract-component" forFilter: "extract" withValue: getWidgetIntValue(sender)]; } - (IBAction)enableInvert:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilter: "invert" on: [_invertCheckbox state]]; + [VLCVideoFilterHelper setVideoFilter: "invert" on: [_invertCheckbox state]]; } - (IBAction)enablePosterize:(id)sender { BOOL b_state = [_posterizeCheckbox state]; - [[VLCCoreInteraction sharedInstance] setVideoFilter: "posterize" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "posterize" on: b_state]; [_posterizeTextField setEnabled: b_state]; [_posterizeStepper setEnabled: b_state]; [_posterizeLabel setEnabled: b_state]; @@ -1212,42 +1210,42 @@ - (IBAction)posterizeModifierChanged:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "posterize-level" forFilter: "posterize" withValue: getWidgetIntValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "posterize-level" forFilter: "posterize" withValue: getWidgetIntValue(sender)]; } - (IBAction)enableBlur:(id)sender { BOOL b_state = [_blurCheckbox state]; - [[VLCCoreInteraction sharedInstance] setVideoFilter: "motionblur" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "motionblur" on: b_state]; [_blurSlider setEnabled: b_state]; [_blurLabel setEnabled: b_state]; } - (IBAction)blurModifierChanged:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "blur-factor" forFilter: "motionblur" withValue: getWidgetIntValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "blur-factor" forFilter: "motionblur" withValue: getWidgetIntValue(sender)]; [sender setToolTip: [NSString stringWithFormat:@"%i", [sender intValue]]]; } - (IBAction)enableMotionDetect:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilter: "motiondetect" on: [_motiondetectCheckbox state]]; + [VLCVideoFilterHelper setVideoFilter: "motiondetect" on: [_motiondetectCheckbox state]]; } - (IBAction)enableWaterEffect:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilter: "ripple" on: [_watereffectCheckbox state]]; + [VLCVideoFilterHelper setVideoFilter: "ripple" on: [_watereffectCheckbox state]]; } - (IBAction)enableWaves:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilter: "wave" on: [_wavesCheckbox state]]; + [VLCVideoFilterHelper setVideoFilter: "wave" on: [_wavesCheckbox state]]; } - (IBAction)enablePsychedelic:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilter: "psychedelic" on: [_psychedelicCheckbox state]]; + [VLCVideoFilterHelper setVideoFilter: "psychedelic" on: [_psychedelicCheckbox state]]; } #pragma mark - @@ -1255,23 +1253,22 @@ - (IBAction)enableAddText:(id)sender { BOOL b_state = [_addTextCheckbox state]; - VLCCoreInteraction *vci_si = [VLCCoreInteraction sharedInstance]; [_addTextPositionPopup setEnabled: b_state]; [_addTextPositionLabel setEnabled: b_state]; [_addTextTextLabel setEnabled: b_state]; [_addTextTextTextField setEnabled: b_state]; - [vci_si setVideoFilter: "marq" on: b_state]; - [vci_si setVideoFilterProperty: "marq-marquee" forFilter: "marq" withValue: getWidgetStringValue(_addTextTextTextField)]; - [vci_si setVideoFilterProperty: "marq-position" forFilter: "marq" withValue: (vlc_value_t){ .i_int = [[_addTextPositionPopup selectedItem] tag] }]; + [VLCVideoFilterHelper setVideoFilter: "marq" on: b_state]; + [VLCVideoFilterHelper setVideoFilterProperty: "marq-marquee" forFilter: "marq" withValue: getWidgetStringValue(_addTextTextTextField)]; + [VLCVideoFilterHelper setVideoFilterProperty: "marq-position" forFilter: "marq" withValue: (vlc_value_t){ .i_int = [[_addTextPositionPopup selectedItem] tag] }]; } - (IBAction)addTextModifierChanged:(id)sender { if (sender == _addTextTextTextField) - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "marq-marquee" forFilter: "marq" withValue: getWidgetStringValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "marq-marquee" forFilter: "marq" withValue: getWidgetStringValue(sender)]; else - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "marq-position" forFilter: "marq" withValue: (vlc_value_t){ .i_int = [[sender selectedItem] tag] }]; + [VLCVideoFilterHelper setVideoFilterProperty: "marq-position" forFilter: "marq" withValue: (vlc_value_t){ .i_int = [[sender selectedItem] tag] }]; } - (IBAction)enableAddLogo:(id)sender @@ -1284,24 +1281,24 @@ [_addLogoLogoLabel setEnabled: b_state]; [_addLogoTransparencySlider setEnabled: b_state]; [_addLogoTransparencyLabel setEnabled: b_state]; - [[VLCCoreInteraction sharedInstance] setVideoFilter: "logo" on: b_state]; + [VLCVideoFilterHelper setVideoFilter: "logo" on: b_state]; } - (IBAction)addLogoModifierChanged:(id)sender { if (sender == _addLogoLogoTextField) - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "logo-file" forFilter: "logo" withValue: getWidgetStringValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "logo-file" forFilter: "logo" withValue: getWidgetStringValue(sender)]; else if (sender == _addLogoPositionPopup) - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "logo-position" forFilter: "logo" withValue: (vlc_value_t){ .i_int = [[_addLogoPositionPopup selectedItem] tag] }]; + [VLCVideoFilterHelper setVideoFilterProperty: "logo-position" forFilter: "logo" withValue: (vlc_value_t){ .i_int = [[_addLogoPositionPopup selectedItem] tag] }]; else { - [[VLCCoreInteraction sharedInstance] setVideoFilterProperty: "logo-opacity" forFilter: "logo" withValue: getWidgetIntValue(sender)]; + [VLCVideoFilterHelper setVideoFilterProperty: "logo-opacity" forFilter: "logo" withValue: getWidgetIntValue(sender)]; [_addLogoTransparencySlider setToolTip: [NSString stringWithFormat:@"%i", [_addLogoTransparencySlider intValue]]]; } } - (IBAction)enableAnaglyph:(id)sender { - [[VLCCoreInteraction sharedInstance] setVideoFilter: "anaglyph" on: [_anaglyphCheckbox state]]; + [VLCVideoFilterHelper setVideoFilter: "anaglyph" on: [_anaglyphCheckbox state]]; } @end diff --git a/modules/gui/macosx/VLCVideoFilterHelper.h b/modules/gui/macosx/VLCVideoFilterHelper.h new file mode 100644 index 0000000000..6e69938346 --- /dev/null +++ b/modules/gui/macosx/VLCVideoFilterHelper.h @@ -0,0 +1,31 @@ +/***************************************************************************** + * VLCVideoFilterHelper.h: MacOS X interface module + ***************************************************************************** + * Copyright (C) 2006-2019 VLC authors and VideoLAN + * + * Authors: Felix Paul Kühne <fkuehne at videolan dot org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#import <Foundation/Foundation.h> +#import <vlc_common.h> + +@interface VLCVideoFilterHelper : NSObject + ++ (void)setVideoFilter: (const char *)psz_name on:(BOOL)b_on; ++ (void)setVideoFilterProperty: (const char *)psz_property forFilter: (const char *)psz_filter withValue: (vlc_value_t)value; + +@end diff --git a/modules/gui/macosx/VLCVideoFilterHelper.m b/modules/gui/macosx/VLCVideoFilterHelper.m new file mode 100644 index 0000000000..e0ecc41139 --- /dev/null +++ b/modules/gui/macosx/VLCVideoFilterHelper.m @@ -0,0 +1,177 @@ +/***************************************************************************** + * VLCVideoFilterHelper.h: MacOS X interface module + ***************************************************************************** + * Copyright (C) 2006-2019 VLC authors and VideoLAN + * + * Authors: Felix Paul Kühne <fkuehne at videolan dot org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#import "VLCVideoFilterHelper.h" +#import <vlc_modules.h> +#import <vlc_charset.h> +#import "VLCMain.h" + +@implementation VLCVideoFilterHelper + ++ (const char *)getFilterType:(const char *)psz_name +{ + module_t *p_obj = module_find(psz_name); + if (!p_obj) { + return NULL; + } + + if (module_provides(p_obj, "video splitter")) { + return "video-splitter"; + } else if (module_provides(p_obj, "video filter")) { + return "video-filter"; + } else if (module_provides(p_obj, "sub source")) { + return "sub-source"; + } else if (module_provides(p_obj, "sub filter")) { + return "sub-filter"; + } else { + msg_Err(getIntf(), "Unknown video filter type."); + return NULL; + } +} + ++ (void)setVideoFilter: (const char *)psz_name on:(BOOL)b_on +{ + intf_thread_t *p_intf = getIntf(); + if (!p_intf) + return; + playlist_t *p_playlist = pl_Get(p_intf); + char *psz_string, *psz_parser; + + const char *psz_filter_type = [self getFilterType:psz_name]; + if (!psz_filter_type) { + msg_Err(p_intf, "Unable to find filter module \"%s\".", psz_name); + return; + } + + msg_Dbg(p_intf, "will turn filter '%s' %s", psz_name, b_on ? "on" : "off"); + + psz_string = var_InheritString(p_playlist, psz_filter_type); + + if (b_on) { + if (psz_string == NULL) { + psz_string = strdup(psz_name); + } else if (strstr(psz_string, psz_name) == NULL) { + char *psz_tmp = strdup([[NSString stringWithFormat: @"%s:%s", psz_string, psz_name] UTF8String]); + free(psz_string); + psz_string = psz_tmp; + } + } else { + if (!psz_string) + return; + + psz_parser = strstr(psz_string, psz_name); + if (psz_parser) { + if (*(psz_parser + strlen(psz_name)) == ':') { + memmove(psz_parser, psz_parser + strlen(psz_name) + 1, + strlen(psz_parser + strlen(psz_name) + 1) + 1); + } else { + *psz_parser = '\0'; + } + + /* Remove trailing : : */ + if (strlen(psz_string) > 0 && *(psz_string + strlen(psz_string) -1) == ':') + *(psz_string + strlen(psz_string) -1) = '\0'; + } else { + free(psz_string); + return; + } + } + var_SetString(p_playlist, psz_filter_type, psz_string); + + /* Try to set non splitter filters on the fly */ + if (strcmp(psz_filter_type, "video-splitter")) { + NSArray<NSValue *> *vouts = getVouts(); + if (vouts) + for (NSValue * val in vouts) { + vout_thread_t *p_vout = [val pointerValue]; + var_SetString(p_vout, psz_filter_type, psz_string); + vlc_object_release(p_vout); + } + } + + free(psz_string); +} + ++ (void)setVideoFilterProperty: (char const *)psz_property + forFilter: (char const *)psz_filter + withValue: (vlc_value_t)value +{ + NSArray<NSValue *> *vouts = getVouts(); + intf_thread_t *p_intf = getIntf(); + if (!p_intf) + return; + + playlist_t *p_playlist = pl_Get(p_intf); + + int i_type = 0; + bool b_is_command = false; + char const *psz_filter_type = [self getFilterType: psz_filter]; + if (!psz_filter_type) { + msg_Err(p_intf, "Unable to find filter module \"%s\".", psz_filter); + return; + } + + if (vouts && [vouts count]) + { + i_type = var_Type((vout_thread_t *)[[vouts firstObject] pointerValue], psz_property); + b_is_command = i_type & VLC_VAR_ISCOMMAND; + } + if (!i_type) + i_type = config_GetType(psz_property); + + i_type &= VLC_VAR_CLASS; + if (i_type == VLC_VAR_BOOL) + var_SetBool(p_playlist, psz_property, value.b_bool); + else if (i_type == VLC_VAR_INTEGER) + var_SetInteger(p_playlist, psz_property, value.i_int); + else if (i_type == VLC_VAR_FLOAT) + var_SetFloat(p_playlist, psz_property, value.f_float); + else if (i_type == VLC_VAR_STRING) + var_SetString(p_playlist, psz_property, EnsureUTF8(value.psz_string)); + else + { + msg_Err(p_intf, + "Module %s's %s variable is of an unsupported type ( %d )", + psz_filter, psz_property, i_type); + b_is_command = false; + } + + if (b_is_command) + if (vouts) + for (NSValue *ptr in vouts) + { + vout_thread_t *p_vout = [ptr pointerValue]; + var_SetChecked(p_vout, psz_property, i_type, value); +#ifndef NDEBUG + int i_cur_type = var_Type(p_vout, psz_property); + assert((i_cur_type & VLC_VAR_CLASS) == i_type); + assert(i_cur_type & VLC_VAR_ISCOMMAND); +#endif + } + + if (vouts) + for (NSValue *ptr in vouts) + vlc_object_release((vout_thread_t *)[ptr pointerValue]); +} + + +@end diff --git a/modules/gui/macosx/prefs.m b/modules/gui/macosx/prefs.m index 047ca9093a..0893ad480b 100644 --- a/modules/gui/macosx/prefs.m +++ b/modules/gui/macosx/prefs.m @@ -214,7 +214,7 @@ { /* TODO: call savePrefs on Root item */ [_rootTreeItem applyChanges]; - [[VLCCoreInteraction sharedInstance] fixIntfSettings]; + fixIntfSettings(); config_SaveConfigFile(getIntf()); [self.window orderOut:self]; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
