Created login helper app
|
|
@ -130,7 +130,7 @@
|
|||
}
|
||||
|
||||
- (BOOL) isRunning;
|
||||
- (iTunesEPlS) playerState;
|
||||
- (NSInteger) playerState;
|
||||
|
||||
@property (assign, nonatomic) double currentVolume;
|
||||
@property (assign, nonatomic) double oldVolume;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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 player’s 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?
|
||||
|
|
|
|||
|
|
@ -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 player’s 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
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"colors" : [
|
||||
{
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 245 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 9.7 KiB |
|
After Width: | Height: | Size: 245 KiB |
|
After Width: | Height: | Size: 687 KiB |
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||