Created login helper app

This commit is contained in:
Andrea Alberti 2025-09-28 23:50:49 +02:00
parent 7a6ff17a59
commit 8f23c05e97
24 changed files with 375 additions and 117 deletions

View File

@ -130,7 +130,7 @@
}
- (BOOL) isRunning;
- (iTunesEPlS) playerState;
- (NSInteger) playerState;
@property (assign, nonatomic) double currentVolume;
@property (assign, nonatomic) double oldVolume;

View File

@ -185,7 +185,7 @@ CGEventRef event_tap_callback(CGEventTapProxy proxy, CGEventType type, CGEventRe
return [musicPlayer isRunning];
}
- (iTunesEPlS) playerState
- (NSInteger) playerState
{
return [musicPlayer playerState];
}
@ -233,9 +233,9 @@ CGEventRef event_tap_callback(CGEventTapProxy proxy, CGEventType type, CGEventRe
@synthesize statusMenu = _statusMenu;
static NSTimeInterval volumeRampTimeInterval=0.01f;
static NSTimeInterval statusBarHideDelay=3.0f;
static NSTimeInterval statusBarHideDelay=10.0f;
static NSTimeInterval checkPlayerTimeout=0.3f;
static NSTimeInterval volumeLockSyncInterval=1.0f;
//static NSTimeInterval volumeLockSyncInterval=1.0f;
static NSTimeInterval updateSystemVolumeInterval=0.1f;
- (IBAction)terminate:(id)sender
@ -278,61 +278,48 @@ static NSTimeInterval updateSystemVolumeInterval=0.1f;
}
// In AppDelegate.m -> setStartAtLogin:
- (void)setStartAtLogin:(bool)enabled savePreferences:(bool)savePreferences
{
// NSMenuItem* menuItem = [self.statusMenu itemWithTag:START_AT_LOGIN_ID];
// [menuItem setState:enabled ? NSControlStateValueOn : NSControlStateValueOff];
//
// if (!savePreferences) {
// return;
// }
//
// NSString *helperBundleID = @"io.alberti42.VolumeControl.VolumeControlHelper"; // <-- CHANGE THIS
//
// if (@available(macOS 13.0, *)) {
// SMAppService *service = [SMAppService loginItemServiceWithIdentifier:helperBundleID];
// NSError *error = nil;
//
// if (enabled) {
// // Only attempt to register if it's not already enabled.
// if (service.status == SMAppServiceStatusNotRegistered) {
// if (![service registerAndReturnError:&error]) {
// NSLog(@"[Volume Control] Error registering login item: %@", error.localizedDescription);
// }
// }
// } else {
// // Only attempt to unregister if it is currently enabled.
// if (service.status == SMAppServiceStatusEnabled) {
// if (![service unregisterAndReturnError:&error]) {
// NSLog(@"[Volume Control] Error unregistering login item: %@", error.localizedDescription);
// }
// }
// }
// } else {
// // Fallback for older systems
// if (!SMLoginItemSetEnabled((__bridge CFStringRef)helperBundleID, enabled)) {
// NSLog(@"[Volume Control] SMLoginItemSetEnabled failed.");
// }
// }
NSMenuItem* menuItem = [self.statusMenu itemWithTag:START_AT_LOGIN_ID];
[menuItem setState:enabled ? NSControlStateValueOn : NSControlStateValueOff];
if (!savePreferences) return;
NSString *helperBundleID = @"io.alberti42.VolumeControlHelper";
if (@available(macOS 13.0, *)) {
SMAppService *service = [SMAppService loginItemServiceWithIdentifier:helperBundleID];
NSError *error = nil;
if (enabled) {
if (service.status != SMAppServiceStatusEnabled) {
if (![service registerAndReturnError:&error]) {
NSLog(@"[Volume Control] Error registering login item: %@", error.localizedDescription);
}
}
} else {
if (service.status == SMAppServiceStatusEnabled) {
if (![service unregisterAndReturnError:&error]) {
NSLog(@"[Volume Control] Error unregistering login item: %@", error.localizedDescription);
}
}
}
} else {
// Legacy fallback
NSLog(@"[Volume Control] loginItemServiceWithIdentifier not supported by this version of macOS.");
}
}
- (bool)StartAtLogin
{
// NSString *helperBundleID = @"io.alberti42.VolumeControl.VolumeControlHelper";
//
// if (@available(macOS 13.0, *)) {
// SMAppService *service = [SMAppService loginItemServiceWithIdentifier:helperBundleID];
// // On macOS 13+, the status can be checked directly.
// return service.status == SMAppServiceStatusEnabled;
// } else {
// // There is no simple, official way to check the status on older systems.
// // The common practice is to store the user's choice in NSUserDefaults
// // and trust that it reflects the actual state.
// // We will read from a preference you save in `toggleStartAtLogin:`.
// return [preferences boolForKey:@"StartAtLoginPreference"];
// }
return true;
NSString *helperBundleID = @"io.alberti42.VolumeControl.VolumeControlHelper";
if (@available(macOS 13.0, *)) {
SMAppService *service = [SMAppService loginItemServiceWithIdentifier:helperBundleID];
return service.status == SMAppServiceStatusEnabled;
} else {
return [preferences boolForKey:@"StartAtLoginPreference"];
}
}
- (void)wasAuthorized
@ -586,7 +573,7 @@ static NSTimeInterval updateSystemVolumeInterval=0.1f;
// Initiate hiding it
if([self hideFromStatusBar]) {
NSLog(@"Started hiding from status bar");
// NSLog(@"Started hiding from status bar");
[self setHideFromStatusBar:YES];
}
}];
@ -965,11 +952,11 @@ static NSTimeInterval updateSystemVolumeInterval=0.1f;
{
currentPlayer = iTunes;
}
else if([_spotifyBtn state] && [spotify isRunning] && [spotify playerState] == SpotifyEPlSPlaying)
else if([_spotifyBtn state] && [spotify isRunning] && (SpotifyEPlS)[spotify playerState] == SpotifyEPlSPlaying)
{
currentPlayer = spotify;
}
else if([_dopplerBtn state] && [doppler isRunning] && [doppler playerState] == DopplerEPlSPlaying)
else if([_dopplerBtn state] && [doppler isRunning] && (DopplerEPlS)[doppler playerState] == DopplerEPlSPlaying)
{
currentPlayer = doppler;
}
@ -1187,7 +1174,7 @@ static NSTimeInterval updateSystemVolumeInterval=0.1f;
[self setHideFromStatusBarHintLabelWithSeconds:statusBarHideDelay];
_statusBarHideTimer = [NSTimer timerWithTimeInterval:statusBarHideDelay target:self selector:@selector(doHideFromStatusBar:) userInfo:nil repeats:NO];
[[NSRunLoop mainRunLoop] addTimer:_statusBarHideTimer forMode:NSRunLoopCommonModes];
_hideFromStatusBarHintPopoverUpdateTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateHideFromStatusBarHintPopover:) userInfo:nil repeats:YES];
_hideFromStatusBarHintPopoverUpdateTimer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(updateHideFromStatusBarHintPopover:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_hideFromStatusBarHintPopoverUpdateTimer forMode:NSRunLoopCommonModes];
}
}
@ -1282,7 +1269,7 @@ static NSTimeInterval updateSystemVolumeInterval=0.1f;
NSTimeInterval remaining = [[_statusBarHideTimer fireDate] timeIntervalSinceDate:now];
NSUInteger rounded = (NSUInteger)ceil(remaining);
[self setHideFromStatusBarHintLabelWithSeconds:rounded];
NSLog(@"Timer remaining: %lu s", (unsigned long)rounded);
// NSLog(@"Timer remaining: %lu s", (unsigned long)rounded);
}
- (void)setHideFromStatusBarHintLabelWithSeconds:(NSUInteger)seconds

View File

@ -40,7 +40,7 @@ typedef enum DopplerEPlS DopplerEPlS;
@interface DopplerApplication : SBApplication
@property (copy, readonly) DopplerTrack *currentTrack; // the currently playing track
@property (readonly) DopplerEPlS playerState; // the current state of the audio player
@property (readonly) NSInteger playerState; // the current state of the audio player
@property BOOL shuffleEnabled; // are songs played in random order?
@property NSInteger soundVolume; // the sound output volume (0 = minimum, 100 = maximum)

View File

@ -26,7 +26,7 @@ typedef enum SpotifyEPlS SpotifyEPlS;
@property (copy, readonly) SpotifyTrack *currentTrack; // The current playing track.
@property NSInteger soundVolume; // The sound output volume (0 = minimum, 100 = maximum)
@property (readonly) SpotifyEPlS playerState; // Is Spotify stopped, paused, or playing?
@property (readonly) NSInteger playerState; // Is Spotify stopped, paused, or playing?
@property double playerPosition; // The players position within the currently playing track in seconds.
@property (readonly) BOOL repeatingEnabled; // Is repeating enabled in the current playback context?
@property BOOL repeating; // Is repeating on or off?

View File

@ -200,7 +200,7 @@ typedef enum iTunesEClS iTunesEClS;
@property (copy, readonly) NSString *name; // the name of the application
@property BOOL mute; // has the sound output been muted?
@property double playerPosition; // the players position within the currently playing track in seconds.
@property (readonly) iTunesEPlS playerState; // is iTunes stopped, paused, or playing?
@property (readonly) NSInteger playerState; // is iTunes stopped, paused, or playing?
@property (copy, readonly) SBObject *selection; // the selection visible to the user
@property BOOL shuffleEnabled; // are songs played in random order?
@property iTunesEShM shuffleMode; // the playback shuffle mode

View File

@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,68 @@
{
"images" : [
{
"filename" : "icon_16x16.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"filename" : "icon_16x16@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"filename" : "icon_32x32.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"filename" : "icon_32x32@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"filename" : "icon_128x128.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"filename" : "icon_128x128@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"filename" : "icon_256x256.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"filename" : "icon_256x256@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"filename" : "icon_512x512.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"filename" : "icon_512x512@2x.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 687 KiB

View File

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -2,14 +2,34 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!--
Info.plist
Volume Control
Volume Control Helper
Created by Andrea Alberti on 27.09.25.
Copyright (c) 2025 ___ORGANIZATIONNAME___. All rights reserved.
-->
<plist version="1.0">
<dict>
<key>SUEnableAutomaticChecks</key>
<false/>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>LSUIElement</key>
<true/>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>

View File

@ -5,12 +5,33 @@
// Created by Andrea Alberti on 27.09.25.
//
#import <Foundation/Foundation.h>
@import Cocoa;
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
// Path to helper bundle
NSString *helperPath = [[NSBundle mainBundle] bundlePath];
// Step up to the main app bundle (4 levels)
NSString *mainAppBundlePath = [[[[helperPath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] stringByDeletingLastPathComponent]; // Volume Control.app
NSURL *mainAppURL = [NSURL fileURLWithPath:mainAppBundlePath];
// Use the modern configuration object
NSWorkspaceOpenConfiguration *config = [NSWorkspaceOpenConfiguration configuration];
[[NSWorkspace sharedWorkspace] openApplicationAtURL:mainAppURL
configuration:config
completionHandler:^(NSRunningApplication * _Nullable app, NSError * _Nullable error) {
if (!app) {
NSLog(@"[Volume Control Helper] Failed to launch main app: %@", error);
}
// Quit helper immediately after launching
[NSApp terminate:nil];
}];
// Run the runloop briefly to allow async launch to complete
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
return EXIT_SUCCESS;
}

View File

@ -22,21 +22,12 @@
65996E09267EB0FF0080A9A5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 65996E08267EB0FF0080A9A5 /* main.m */; };
65996E1A267EB14F0080A9A5 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 65996E13267EB14F0080A9A5 /* AppDelegate.m */; };
65996E1B267EB14F0080A9A5 /* SystemVolume.m in Sources */ = {isa = PBXBuildFile; fileRef = 65996E16267EB14F0080A9A5 /* SystemVolume.m */; };
65DBBEEF2E89E08100752329 /* Volume Control Helper.app in Embed Login Items */ = {isa = PBXBuildFile; fileRef = 65DBBEDA2E89DE1800752329 /* Volume Control Helper.app */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
65EF8F5A2E888C9500AAE7B7 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65EF8F582E888C6B00AAE7B7 /* Sparkle.framework */; };
65EF8F5B2E888C9500AAE7B7 /* Sparkle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 65EF8F582E888C6B00AAE7B7 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
65EF8F5F2E8896B800AAE7B7 /* VolumeControlHelper in Embed Login Items */ = {isa = PBXBuildFile; fileRef = 65EF8F4D2E88769F00AAE7B7 /* VolumeControlHelper */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
65EF8F4B2E88769F00AAE7B7 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = /usr/share/man/man1/;
dstSubfolderSpec = 0;
files = (
);
runOnlyForDeploymentPostprocessing = 1;
};
65EF8F5C2E888C9500AAE7B7 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@ -54,7 +45,7 @@
dstPath = Contents/Library/LoginItems;
dstSubfolderSpec = 1;
files = (
65EF8F5F2E8896B800AAE7B7 /* VolumeControlHelper in Embed Login Items */,
65DBBEEF2E89E08100752329 /* Volume Control Helper.app in Embed Login Items */,
);
name = "Embed Login Items";
runOnlyForDeploymentPostprocessing = 0;
@ -128,13 +119,13 @@
65996E16267EB14F0080A9A5 /* SystemVolume.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SystemVolume.m; sourceTree = "<group>"; };
65996E17267EB14F0080A9A5 /* ISSoundAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISSoundAdditions.h; sourceTree = "<group>"; };
65996E1C267EB3030080A9A5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = VolumeControl/Info.plist; sourceTree = "<group>"; };
65EF8F4D2E88769F00AAE7B7 /* VolumeControlHelper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = VolumeControlHelper; sourceTree = BUILT_PRODUCTS_DIR; };
65DBBEDA2E89DE1800752329 /* Volume Control Helper.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Volume Control Helper.app"; sourceTree = BUILT_PRODUCTS_DIR; };
65EF8F582E888C6B00AAE7B7 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = "<group>"; };
BC20FAA128902EF500CF5CAF /* Doppler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Doppler.h; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFileSystemSynchronizedRootGroup section */
65EF8F4E2E88769F00AAE7B7 /* Volume Control Helper */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = "Volume Control Helper"; sourceTree = "<group>"; };
65DBBEDB2E89DE1800752329 /* Volume Control Helper */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = "Volume Control Helper"; sourceTree = "<group>"; };
/* End PBXFileSystemSynchronizedRootGroup section */
/* Begin PBXFrameworksBuildPhase section */
@ -151,7 +142,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
65EF8F4A2E88769F00AAE7B7 /* Frameworks */ = {
65DBBED72E89DE1800752329 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
@ -168,8 +159,8 @@
65996D03267EAC1F0080A9A5 /* Sources */,
65996D1C267EADAA0080A9A5 /* Resources */,
65996E1C267EB3030080A9A5 /* Info.plist */,
65DBBEDB2E89DE1800752329 /* Volume Control Helper */,
65996D0C267EACE30080A9A5 /* Frameworks */,
65EF8F4E2E88769F00AAE7B7 /* Volume Control Helper */,
65996C56267EA86A0080A9A5 /* Products */,
);
sourceTree = "<group>";
@ -178,7 +169,7 @@
isa = PBXGroup;
children = (
65996C55267EA86A0080A9A5 /* Volume Control.app */,
65EF8F4D2E88769F00AAE7B7 /* VolumeControlHelper */,
65DBBEDA2E89DE1800752329 /* Volume Control Helper.app */,
);
name = Products;
sourceTree = "<group>";
@ -379,27 +370,27 @@
productReference = 65996C55267EA86A0080A9A5 /* Volume Control.app */;
productType = "com.apple.product-type.application";
};
65EF8F4C2E88769F00AAE7B7 /* VolumeControlHelper */ = {
65DBBED92E89DE1800752329 /* Volume Control Helper */ = {
isa = PBXNativeTarget;
buildConfigurationList = 65EF8F532E88769F00AAE7B7 /* Build configuration list for PBXNativeTarget "VolumeControlHelper" */;
buildConfigurationList = 65DBBEE22E89DE1A00752329 /* Build configuration list for PBXNativeTarget "Volume Control Helper" */;
buildPhases = (
65EF8F492E88769F00AAE7B7 /* Sources */,
65EF8F4A2E88769F00AAE7B7 /* Frameworks */,
65EF8F4B2E88769F00AAE7B7 /* CopyFiles */,
65DBBED62E89DE1800752329 /* Sources */,
65DBBED72E89DE1800752329 /* Frameworks */,
65DBBED82E89DE1800752329 /* Resources */,
);
buildRules = (
);
dependencies = (
);
fileSystemSynchronizedGroups = (
65EF8F4E2E88769F00AAE7B7 /* Volume Control Helper */,
65DBBEDB2E89DE1800752329 /* Volume Control Helper */,
);
name = VolumeControlHelper;
name = "Volume Control Helper";
packageProductDependencies = (
);
productName = VolumeControlHelper;
productReference = 65EF8F4D2E88769F00AAE7B7 /* VolumeControlHelper */;
productType = "com.apple.product-type.tool";
productName = "Volume Control Helper";
productReference = 65DBBEDA2E89DE1800752329 /* Volume Control Helper.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
@ -408,12 +399,13 @@
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastSwiftUpdateCheck = 2600;
LastUpgradeCheck = 2600;
TargetAttributes = {
65996C54267EA86A0080A9A5 = {
CreatedOnToolsVersion = 12.5;
};
65EF8F4C2E88769F00AAE7B7 = {
65DBBED92E89DE1800752329 = {
CreatedOnToolsVersion = 26.0;
};
};
@ -432,7 +424,7 @@
projectRoot = "";
targets = (
65996C54267EA86A0080A9A5 /* Volume Control */,
65EF8F4C2E88769F00AAE7B7 /* VolumeControlHelper */,
65DBBED92E89DE1800752329 /* Volume Control Helper */,
);
};
/* End PBXProject section */
@ -451,6 +443,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
65DBBED82E89DE1800752329 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@ -465,7 +464,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
65EF8F492E88769F00AAE7B7 /* Sources */ = {
65DBBED62E89DE1800752329 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
@ -622,7 +621,7 @@
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 14.6;
MACOSX_DEPLOYMENT_TARGET = 13.5;
PRODUCT_BUNDLE_IDENTIFIER = io.alberti42.VolumeControl;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -661,7 +660,7 @@
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 14.6;
MACOSX_DEPLOYMENT_TARGET = 13.5;
PRODUCT_BUNDLE_IDENTIFIER = io.alberti42.VolumeControl;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@ -674,39 +673,102 @@
};
name = Release;
};
65EF8F512E88769F00AAE7B7 /* Debug */ = {
65DBBEE32E89DE1A00752329 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 9V3X7C8VCK;
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
ENABLE_USER_SELECTED_FILES = readonly;
GCC_C_LANGUAGE_STANDARD = gnu17;
INSTALL_PATH = "";
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "Volume Control Login Helper";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MACOSX_DEPLOYMENT_TARGET = 15.6;
MACOSX_DEPLOYMENT_TARGET = 13.5;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = io.alberti42.VolumeControlHelper;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = NO;
REGISTER_APP_GROUPS = YES;
SDKROOT = auto;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,7";
XROS_DEPLOYMENT_TARGET = 26.0;
};
name = Debug;
};
65EF8F522E88769F00AAE7B7 /* Release */ = {
65DBBEE42E89DE1A00752329 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 9V3X7C8VCK;
ENABLE_APP_SANDBOX = YES;
ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES;
ENABLE_USER_SELECTED_FILES = readonly;
GCC_C_LANGUAGE_STANDARD = gnu17;
INSTALL_PATH = "";
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "Volume Control Login Helper";
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
"INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
"INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
"LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MACOSX_DEPLOYMENT_TARGET = 15.6;
MACOSX_DEPLOYMENT_TARGET = 13.5;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = io.alberti42.VolumeControlHelper;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = NO;
REGISTER_APP_GROUPS = YES;
SDKROOT = auto;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx xros xrsimulator";
SWIFT_APPROACHABLE_CONCURRENCY = YES;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,7";
XROS_DEPLOYMENT_TARGET = 26.0;
};
name = Release;
};
@ -731,11 +793,11 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
65EF8F532E88769F00AAE7B7 /* Build configuration list for PBXNativeTarget "VolumeControlHelper" */ = {
65DBBEE22E89DE1A00752329 /* Build configuration list for PBXNativeTarget "Volume Control Helper" */ = {
isa = XCConfigurationList;
buildConfigurations = (
65EF8F512E88769F00AAE7B7 /* Debug */,
65EF8F522E88769F00AAE7B7 /* Release */,
65DBBEE32E89DE1A00752329 /* Debug */,
65DBBEE42E89DE1A00752329 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2600"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "65DBBED92E89DE1800752329"
BuildableName = "Volume Control Helper.app"
BlueprintName = "Volume Control Helper"
ReferencedContainer = "container:Volume Control.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "65DBBED92E89DE1800752329"
BuildableName = "Volume Control Helper.app"
BlueprintName = "Volume Control Helper"
ReferencedContainer = "container:Volume Control.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "65DBBED92E89DE1800752329"
BuildableName = "Volume Control Helper.app"
BlueprintName = "Volume Control Helper"
ReferencedContainer = "container:Volume Control.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -4,6 +4,11 @@
<dict>
<key>SchemeUserState</key>
<dict>
<key>Volume Control Helper.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>Volume Control.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
@ -14,11 +19,6 @@
<key>orderHint</key>
<integer>0</integer>
</dict>
<key>VolumeControlHelper.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
@ -27,6 +27,11 @@
<key>primary</key>
<true/>
</dict>
<key>65DBBED92E89DE1800752329</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

File diff suppressed because one or more lines are too long