v2.1
Improved path/execution action (#31) Improved monitoring + of external devices (#12) Improved compatibility for recent versions of macOS (#30) Shows active devices in status bar menu
|
@ -19,4 +19,5 @@ xcuserdata/
|
||||||
|
|
||||||
# Carthage
|
# Carthage
|
||||||
Carthage/Build/
|
Carthage/Build/
|
||||||
Carthage/Checkouts
|
Carthage/Checkouts
|
||||||
|
Application/Uninstaller/
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
CDC60991263CBD36006D1332 /* AVMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = CDC60990263CBD36006D1332 /* AVMonitor.m */; };
|
CDC60991263CBD36006D1332 /* AVMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = CDC60990263CBD36006D1332 /* AVMonitor.m */; };
|
||||||
CDC60994263CBEE7006D1332 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = CDC60993263CBEE7006D1332 /* Client.m */; };
|
CDC60994263CBEE7006D1332 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = CDC60993263CBEE7006D1332 /* Client.m */; };
|
||||||
CDCBF0DE26499DFF001D9F9A /* Event.m in Sources */ = {isa = PBXBuildFile; fileRef = CDCBF0DD26499DFF001D9F9A /* Event.m */; };
|
CDCBF0DE26499DFF001D9F9A /* Event.m in Sources */ = {isa = PBXBuildFile; fileRef = CDCBF0DD26499DFF001D9F9A /* Event.m */; };
|
||||||
|
CDE09AF729198BA800561CFF /* OverSight Installer.app in Resources */ = {isa = PBXBuildFile; fileRef = CDE09AF629198BA800561CFF /* OverSight Installer.app */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
|
@ -97,6 +98,7 @@
|
||||||
CDC60993263CBEE7006D1332 /* Client.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Client.m; sourceTree = "<group>"; };
|
CDC60993263CBEE7006D1332 /* Client.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Client.m; sourceTree = "<group>"; };
|
||||||
CDCBF0DC26499DFF001D9F9A /* Event.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Event.h; sourceTree = "<group>"; };
|
CDCBF0DC26499DFF001D9F9A /* Event.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Event.h; sourceTree = "<group>"; };
|
||||||
CDCBF0DD26499DFF001D9F9A /* Event.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Event.m; sourceTree = "<group>"; };
|
CDCBF0DD26499DFF001D9F9A /* Event.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Event.m; sourceTree = "<group>"; };
|
||||||
|
CDE09AF629198BA800561CFF /* OverSight Installer.app */ = {isa = PBXFileReference; lastKnownFileType = wrapper.application; path = "OverSight Installer.app"; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
@ -132,6 +134,7 @@
|
||||||
7D7755DA1F02E05B00D0017D = {
|
7D7755DA1F02E05B00D0017D = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
CDE09AF12919829000561CFF /* Uninstaller */,
|
||||||
7D3B75201F13356900568828 /* Shared */,
|
7D3B75201F13356900568828 /* Shared */,
|
||||||
7D7755E51F02E05B00D0017D /* Source */,
|
7D7755E51F02E05B00D0017D /* Source */,
|
||||||
CDAFF434203E55F300F27635 /* Frameworks */,
|
CDAFF434203E55F300F27635 /* Frameworks */,
|
||||||
|
@ -212,6 +215,14 @@
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
CDE09AF12919829000561CFF /* Uninstaller */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
CDE09AF629198BA800561CFF /* OverSight Installer.app */,
|
||||||
|
);
|
||||||
|
path = Uninstaller;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
|
@ -285,6 +296,7 @@
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
CD8FD5D523BAE2D200EFE0FB /* Preferences.xib in Resources */,
|
CD8FD5D523BAE2D200EFE0FB /* Preferences.xib in Resources */,
|
||||||
|
CDE09AF729198BA800561CFF /* OverSight Installer.app in Resources */,
|
||||||
CD6836682391DB6F00CF19C1 /* security.plist in Resources */,
|
CD6836682391DB6F00CF19C1 /* security.plist in Resources */,
|
||||||
CD2F800C24455333009C3D77 /* AboutWindow.xib in Resources */,
|
CD2F800C24455333009C3D77 /* AboutWindow.xib in Resources */,
|
||||||
7D16D6951F64E43300DB3161 /* UpdateWindow.xib in Resources */,
|
7D16D6951F64E43300DB3161 /* UpdateWindow.xib in Resources */,
|
||||||
|
@ -457,7 +469,7 @@
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;
|
||||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 2.0.2;
|
CURRENT_PROJECT_VERSION = 2.1.0;
|
||||||
DEVELOPMENT_TEAM = VBG97UB4TA;
|
DEVELOPMENT_TEAM = VBG97UB4TA;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
||||||
|
@ -465,8 +477,8 @@
|
||||||
INFOPLIST_FILE = Application/Info.plist;
|
INFOPLIST_FILE = Application/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
|
||||||
LIBRARY_SEARCH_PATHS = "";
|
LIBRARY_SEARCH_PATHS = "";
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||||
MARKETING_VERSION = 2.0.2;
|
MARKETING_VERSION = 2.1.0;
|
||||||
ONLY_ACTIVE_ARCH = NO;
|
ONLY_ACTIVE_ARCH = NO;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight";
|
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight";
|
||||||
PRODUCT_NAME = OverSight;
|
PRODUCT_NAME = OverSight;
|
||||||
|
@ -481,7 +493,7 @@
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;
|
||||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 2.0.2;
|
CURRENT_PROJECT_VERSION = 2.1.0;
|
||||||
DEVELOPMENT_TEAM = VBG97UB4TA;
|
DEVELOPMENT_TEAM = VBG97UB4TA;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
||||||
|
@ -489,8 +501,8 @@
|
||||||
INFOPLIST_FILE = Application/Info.plist;
|
INFOPLIST_FILE = Application/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
|
||||||
LIBRARY_SEARCH_PATHS = "";
|
LIBRARY_SEARCH_PATHS = "";
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||||
MARKETING_VERSION = 2.0.2;
|
MARKETING_VERSION = 2.1.0;
|
||||||
ONLY_ACTIVE_ARCH = NO;
|
ONLY_ACTIVE_ARCH = NO;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight";
|
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight";
|
||||||
PRODUCT_NAME = OverSight;
|
PRODUCT_NAME = OverSight;
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Debug"
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
enableAddressSanitizer = "YES"
|
||||||
launchStyle = "0"
|
launchStyle = "0"
|
||||||
useCustomWorkingDirectory = "NO"
|
useCustomWorkingDirectory = "NO"
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
@ -50,6 +51,18 @@
|
||||||
ReferencedContainer = "container:Application.xcodeproj">
|
ReferencedContainer = "container:Application.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
|
<AdditionalOptions>
|
||||||
|
<AdditionalOption
|
||||||
|
key = "NSZombieEnabled"
|
||||||
|
value = "YES"
|
||||||
|
isEnabled = "YES">
|
||||||
|
</AdditionalOption>
|
||||||
|
<AdditionalOption
|
||||||
|
key = "MallocScribble"
|
||||||
|
value = ""
|
||||||
|
isEnabled = "YES">
|
||||||
|
</AdditionalOption>
|
||||||
|
</AdditionalOptions>
|
||||||
</LaunchAction>
|
</LaunchAction>
|
||||||
<ProfileAction
|
<ProfileAction
|
||||||
buildConfiguration = "Release"
|
buildConfiguration = "Release"
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#import <CoreMedia/CoreMedia.h>
|
#import <CoreMedia/CoreMedia.h>
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
#import <CoreMediaIO/CMIOHardware.h>
|
#import <CoreMediaIO/CMIOHardware.h>
|
||||||
|
#import <AVFoundation/AVCaptureDevice.h>
|
||||||
|
|
||||||
#import "Event.h"
|
#import "Event.h"
|
||||||
#import "LogMonitor.h"
|
#import "LogMonitor.h"
|
||||||
|
@ -21,35 +22,54 @@
|
||||||
|
|
||||||
@interface AVMonitor : NSObject <UNUserNotificationCenterDelegate>
|
@interface AVMonitor : NSObject <UNUserNotificationCenterDelegate>
|
||||||
|
|
||||||
//video log monitor
|
//log monitor
|
||||||
@property(nonatomic, retain)LogMonitor* videoLogMonitor;
|
@property(nonatomic, retain)LogMonitor* logMonitor;
|
||||||
|
|
||||||
//audio log monitor
|
//camera attributions
|
||||||
@property(nonatomic, retain)LogMonitor* audioLogMonitor;
|
@property(nonatomic, retain)NSMutableArray* cameraAttributions;
|
||||||
|
|
||||||
//clients
|
//audio attributions
|
||||||
@property(nonatomic, retain)NSMutableArray* videoClients;
|
@property(nonatomic, retain)NSMutableArray* audioAttributions;
|
||||||
|
|
||||||
//audio clients
|
//built in mic
|
||||||
@property(nonatomic, retain)NSMutableArray* audioClients;
|
@property(nonatomic, retain)AVCaptureDevice* builtInMic;
|
||||||
|
|
||||||
//audio (mic) callback
|
//built in camera
|
||||||
@property(nonatomic, copy)AudioObjectPropertyListenerBlock listenerBlock;
|
@property(nonatomic, retain)AVCaptureDevice* builtInCamera;
|
||||||
|
|
||||||
//camera state
|
//inital mic state
|
||||||
@property NSControlStateValue cameraState;
|
@property NSControlStateValue initialMicState;
|
||||||
|
|
||||||
//microphone state
|
//initial camera state
|
||||||
@property NSControlStateValue microphoneState;
|
@property NSControlStateValue initialCameraState;
|
||||||
|
|
||||||
|
//audio listeners
|
||||||
|
@property(nonatomic, retain)NSMutableDictionary* audioListeners;
|
||||||
|
|
||||||
|
//per device events
|
||||||
|
@property(nonatomic, retain)NSMutableDictionary* deviceEvents;
|
||||||
|
|
||||||
|
//audio event queue
|
||||||
|
@property(nonatomic, retain)dispatch_queue_t audioEventQueue;
|
||||||
|
|
||||||
|
//audio event timer
|
||||||
|
@property(nonatomic, retain)dispatch_source_t audioEventTimer;
|
||||||
|
|
||||||
|
//camera event queue
|
||||||
|
@property(nonatomic, retain)dispatch_queue_t cameraEventQueue;
|
||||||
|
|
||||||
|
//camera event timer
|
||||||
|
@property(nonatomic, retain)dispatch_source_t cameraEventTimer;
|
||||||
|
|
||||||
//last microphone state
|
|
||||||
@property(nonatomic, retain)Event* lastMicEvent;
|
|
||||||
|
|
||||||
/* METHODS */
|
/* METHODS */
|
||||||
|
|
||||||
//start
|
//start
|
||||||
-(void)start;
|
-(void)start;
|
||||||
|
|
||||||
|
//enumerate active devices
|
||||||
|
-(NSMutableArray*)enumerateActiveDevices;
|
||||||
|
|
||||||
//stop
|
//stop
|
||||||
-(void)stop;
|
-(void)stop;
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21225" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
||||||
|
@ -53,7 +52,7 @@
|
||||||
</menu>
|
</menu>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
</items>
|
</items>
|
||||||
<point key="canvasLocation" x="67" y="135"/>
|
<point key="canvasLocation" x="-168" y="153"/>
|
||||||
</menu>
|
</menu>
|
||||||
<menu id="2P0-OI-hGc">
|
<menu id="2P0-OI-hGc">
|
||||||
<items>
|
<items>
|
||||||
|
@ -61,22 +60,29 @@
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem isSeparatorItem="YES" id="WQ3-qz-mIN"/>
|
<menuItem isSeparatorItem="YES" id="WQ3-qz-mIN"/>
|
||||||
<menuItem title="Disable" tag="101" id="p8u-9L-hFY">
|
<menuItem title="Active Devices" tag="101" id="HRl-aW-6nn">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem isSeparatorItem="YES" id="arN-5E-2Bv"/>
|
||||||
|
<menuItem title="Disable" tag="102" id="p8u-9L-hFY">
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem isSeparatorItem="YES" id="Y5x-j1-ofU"/>
|
<menuItem isSeparatorItem="YES" id="Y5x-j1-ofU"/>
|
||||||
<menuItem title="Preferences..." tag="103" id="Zao-2v-WyJ">
|
<menuItem title="Preferences..." tag="103" id="Zao-2v-WyJ">
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem title="Allowed Items..." tag="102" id="i2A-ax-9ff">
|
<menuItem title="Allowed Items..." tag="104" id="i2A-ax-9ff">
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem isSeparatorItem="YES" id="xGL-in-U11"/>
|
<menuItem isSeparatorItem="YES" id="xGL-in-U11"/>
|
||||||
<menuItem title="Quit OverSight" tag="104" id="FkZ-L3-H8o">
|
<menuItem title="Quit OverSight" tag="105" id="FkZ-L3-H8o">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
</menuItem>
|
||||||
|
<menuItem title="Uninstall OverSight..." tag="106" id="amL-48-7OW">
|
||||||
<modifierMask key="keyEquivalentModifierMask"/>
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
</items>
|
</items>
|
||||||
<point key="canvasLocation" x="55" y="10"/>
|
<point key="canvasLocation" x="55" y="-1.5"/>
|
||||||
</menu>
|
</menu>
|
||||||
</objects>
|
</objects>
|
||||||
</document>
|
</document>
|
||||||
|
|
|
@ -15,12 +15,6 @@
|
||||||
//pid
|
//pid
|
||||||
@property(nonatomic, retain)NSNumber* pid;
|
@property(nonatomic, retain)NSNumber* pid;
|
||||||
|
|
||||||
//message count
|
|
||||||
@property unsigned long long msgCount;
|
|
||||||
|
|
||||||
//client id
|
|
||||||
@property(nonatomic, retain)NSNumber* clientID;
|
|
||||||
|
|
||||||
//path
|
//path
|
||||||
@property(nonatomic, retain)NSString* path;
|
@property(nonatomic, retain)NSString* path;
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
-(NSString*)description
|
-(NSString*)description
|
||||||
{
|
{
|
||||||
//description
|
//description
|
||||||
return [NSString stringWithFormat:@"CLIENT: pid: %@, path: %@, clientID: %@", self.pid, self.path, self.clientID];
|
return [NSString stringWithFormat:@"CLIENT: pid: %@, path: %@", self.pid, self.path];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
@import Cocoa;
|
@import Cocoa;
|
||||||
@import Foundation;
|
@import Foundation;
|
||||||
|
|
||||||
|
#import <AVFoundation/AVCaptureDevice.h>
|
||||||
|
|
||||||
#import "Client.h"
|
#import "Client.h"
|
||||||
|
|
||||||
@interface Event : NSObject
|
@interface Event : NSObject
|
||||||
|
@ -16,20 +18,23 @@
|
||||||
/* METHODS */
|
/* METHODS */
|
||||||
|
|
||||||
//init
|
//init
|
||||||
-(id)init:(Client*)client device:(int)device state:(NSControlStateValue)state;
|
-(id)init:(Client*)client device:(AVCaptureDevice*)device deviceType:(int)deviceType state:(NSControlStateValue)state;
|
||||||
|
|
||||||
/* PROPERTIES */
|
/* PROPERTIES */
|
||||||
|
|
||||||
//client
|
//client
|
||||||
@property(nonatomic, retain)Client* client;
|
@property(nonatomic, retain)Client* client;
|
||||||
|
|
||||||
//time stamp
|
//device
|
||||||
@property(nonatomic, retain)NSDate* timestamp;
|
@property(nonatomic, retain)AVCaptureDevice* device;
|
||||||
|
|
||||||
//device
|
//device
|
||||||
@property int device;
|
@property int deviceType;
|
||||||
|
|
||||||
//state
|
//state
|
||||||
@property NSControlStateValue state;
|
@property NSControlStateValue state;
|
||||||
|
|
||||||
|
//time stamp
|
||||||
|
@property(nonatomic, retain)NSDate* timestamp;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
@implementation Event
|
@implementation Event
|
||||||
|
|
||||||
//init
|
//init
|
||||||
-(id)init:(Client*)client device:(int)device state:(NSControlStateValue)state
|
-(id)init:(Client*)client device:(AVCaptureDevice*)device deviceType:(int)deviceType state:(NSControlStateValue)state
|
||||||
{
|
{
|
||||||
//super
|
//super
|
||||||
self = [super init];
|
self = [super init];
|
||||||
|
@ -23,6 +23,9 @@
|
||||||
//set device
|
//set device
|
||||||
self.device = device;
|
self.device = device;
|
||||||
|
|
||||||
|
//set device type
|
||||||
|
self.deviceType = deviceType;
|
||||||
|
|
||||||
//set state
|
//set state
|
||||||
self.state = state;
|
self.state = state;
|
||||||
|
|
||||||
|
@ -33,6 +36,4 @@
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
<outlet property="browseButton" destination="gVP-Ih-dFA" id="j7F-V3-hEq"/>
|
<outlet property="browseButton" destination="gVP-Ih-dFA" id="j7F-V3-hEq"/>
|
||||||
<outlet property="executeArgsButton" destination="YqA-7j-gYp" id="tbC-AW-etO"/>
|
<outlet property="executeArgsButton" destination="YqA-7j-gYp" id="tbC-AW-etO"/>
|
||||||
<outlet property="executePath" destination="z32-0s-dpb" id="HAL-Mg-ygB"/>
|
<outlet property="executePath" destination="z32-0s-dpb" id="HAL-Mg-ygB"/>
|
||||||
|
<outlet property="executePathButton" destination="vh6-KZ-8sT" id="VIP-AV-Nf6"/>
|
||||||
<outlet property="modesView" destination="K6i-xr-27e" id="DOb-L3-eeR"/>
|
<outlet property="modesView" destination="K6i-xr-27e" id="DOb-L3-eeR"/>
|
||||||
<outlet property="toolbar" destination="V8g-Ya-LK4" id="SH2-6E-QST"/>
|
<outlet property="toolbar" destination="V8g-Ya-LK4" id="SH2-6E-QST"/>
|
||||||
<outlet property="updateButton" destination="Mtn-pi-zIl" id="Oe1-Jy-nMH"/>
|
<outlet property="updateButton" destination="Mtn-pi-zIl" id="Oe1-Jy-nMH"/>
|
||||||
|
@ -25,14 +26,14 @@
|
||||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
|
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
|
||||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
|
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
|
||||||
<rect key="contentRect" x="196" y="240" width="600" height="365"/>
|
<rect key="contentRect" x="196" y="240" width="600" height="426"/>
|
||||||
<rect key="screenRect" x="0.0" y="0.0" width="3440" height="1415"/>
|
<rect key="screenRect" x="0.0" y="0.0" width="3440" height="1415"/>
|
||||||
<view key="contentView" wantsLayer="YES" id="se5-gp-TjO">
|
<view key="contentView" wantsLayer="YES" id="se5-gp-TjO">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="365"/>
|
<rect key="frame" x="0.0" y="0.0" width="600" height="426"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Tx4-yW-fcJ">
|
<imageView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Tx4-yW-fcJ">
|
||||||
<rect key="frame" x="138" y="2" width="325" height="65"/>
|
<rect key="frame" x="138" y="13" width="325" height="65"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyDown" image="OverSight" id="m7R-HO-YMp"/>
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyDown" image="OverSight" id="m7R-HO-YMp"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
|
@ -75,14 +76,14 @@
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
|
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
|
||||||
</connections>
|
</connections>
|
||||||
<point key="canvasLocation" x="-823" y="488.5"/>
|
<point key="canvasLocation" x="-823" y="519"/>
|
||||||
</window>
|
</window>
|
||||||
<customView id="K6i-xr-27e" userLabel="Modes">
|
<customView id="K6i-xr-27e" userLabel="Modes">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="275"/>
|
<rect key="frame" x="0.0" y="0.0" width="600" height="376"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button fixedFrame="YES" tag="1" translatesAutoresizingMaskIntoConstraints="NO" id="4sq-mb-bci">
|
<button fixedFrame="YES" tag="1" translatesAutoresizingMaskIntoConstraints="NO" id="4sq-mb-bci">
|
||||||
<rect key="frame" x="39" y="223" width="29" height="18"/>
|
<rect key="frame" x="39" y="324" width="29" height="18"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="RwL-kA-7QL">
|
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="RwL-kA-7QL">
|
||||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||||
|
@ -93,7 +94,7 @@
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="156" translatesAutoresizingMaskIntoConstraints="NO" id="xbe-1S-lpy">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="156" translatesAutoresizingMaskIntoConstraints="NO" id="xbe-1S-lpy">
|
||||||
<rect key="frame" x="72" y="224" width="114" height="15"/>
|
<rect key="frame" x="72" y="326" width="114" height="15"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Start at Login" id="JVI-Or-h0u">
|
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Start at Login" id="JVI-Or-h0u">
|
||||||
<font key="font" size="13" name="Menlo-Bold"/>
|
<font key="font" size="13" name="Menlo-Bold"/>
|
||||||
|
@ -102,7 +103,7 @@
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="tFB-E4-zbp">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="tFB-E4-zbp">
|
||||||
<rect key="frame" x="72" y="207" width="475" height="15"/>
|
<rect key="frame" x="72" y="309" width="475" height="15"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Automatically (re)start each time you login." id="E0T-Ug-P8f">
|
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Automatically (re)start each time you login." id="E0T-Ug-P8f">
|
||||||
<font key="font" size="13" name="Menlo-Regular"/>
|
<font key="font" size="13" name="Menlo-Regular"/>
|
||||||
|
@ -111,7 +112,7 @@
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<button fixedFrame="YES" tag="2" translatesAutoresizingMaskIntoConstraints="NO" id="Bog-hz-gcd">
|
<button fixedFrame="YES" tag="2" translatesAutoresizingMaskIntoConstraints="NO" id="Bog-hz-gcd">
|
||||||
<rect key="frame" x="39" y="161" width="29" height="18"/>
|
<rect key="frame" x="39" y="262" width="29" height="18"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="Aaw-XT-TEt">
|
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="Aaw-XT-TEt">
|
||||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||||
|
@ -122,7 +123,7 @@
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="156" translatesAutoresizingMaskIntoConstraints="NO" id="Kjh-jc-STu">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="156" translatesAutoresizingMaskIntoConstraints="NO" id="Kjh-jc-STu">
|
||||||
<rect key="frame" x="72" y="162" width="98" height="15"/>
|
<rect key="frame" x="72" y="264" width="98" height="15"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="No Icon Mode" id="4EN-j2-enV">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="No Icon Mode" id="4EN-j2-enV">
|
||||||
<font key="font" size="13" name="Menlo-Bold"/>
|
<font key="font" size="13" name="Menlo-Bold"/>
|
||||||
|
@ -131,7 +132,7 @@
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<button fixedFrame="YES" tag="3" translatesAutoresizingMaskIntoConstraints="NO" id="vQ5-vs-uTC">
|
<button fixedFrame="YES" tag="3" translatesAutoresizingMaskIntoConstraints="NO" id="vQ5-vs-uTC">
|
||||||
<rect key="frame" x="39" y="99" width="29" height="18"/>
|
<rect key="frame" x="39" y="200" width="29" height="18"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="RC0-1U-dH3">
|
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="RC0-1U-dH3">
|
||||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||||
|
@ -142,25 +143,54 @@
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="262" translatesAutoresizingMaskIntoConstraints="NO" id="Enr-tn-mwG">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="262" translatesAutoresizingMaskIntoConstraints="NO" id="Enr-tn-mwG">
|
||||||
<rect key="frame" x="72" y="100" width="200" height="15"/>
|
<rect key="frame" x="72" y="201" width="318" height="15"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Disable 'Inactive' Alerts" id="a5n-tt-65v">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Ignore External Device 'Activate' Alerts" id="a5n-tt-65v">
|
||||||
<font key="font" size="13" name="Menlo-Bold"/>
|
<font key="font" size="13" name="Menlo-Bold"/>
|
||||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="AAL-QY-azK">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="AAL-QY-azK">
|
||||||
<rect key="frame" x="72" y="83" width="522" height="15"/>
|
<rect key="frame" x="72" y="184" width="522" height="15"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Do not show an alert when the camera/microphone is deactivated. " id="SYJ-Qv-cRq">
|
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Do not show an alert when external devices are activated." id="SYJ-Qv-cRq">
|
||||||
|
<font key="font" size="13" name="Menlo-Regular"/>
|
||||||
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
|
<button fixedFrame="YES" tag="4" translatesAutoresizingMaskIntoConstraints="NO" id="d0Y-aN-pCK">
|
||||||
|
<rect key="frame" x="39" y="148" width="29" height="18"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="Gok-kO-tp5">
|
||||||
|
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||||
|
<font key="font" metaFont="menu" size="14"/>
|
||||||
|
</buttonCell>
|
||||||
|
<connections>
|
||||||
|
<action selector="togglePreference:" target="-2" id="jST-9U-viK"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="262" translatesAutoresizingMaskIntoConstraints="NO" id="K3U-Od-Xdy">
|
||||||
|
<rect key="frame" x="72" y="149" width="200" height="15"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Disable 'Inactive' Alerts" id="Gsa-fn-iag">
|
||||||
|
<font key="font" size="13" name="Menlo-Bold"/>
|
||||||
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="5xo-jp-5qA">
|
||||||
|
<rect key="frame" x="72" y="132" width="522" height="15"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Do not show an alert when the camera/microphone is deactivated. " id="1A2-j2-kqG">
|
||||||
<font key="font" size="13" name="Menlo-Regular"/>
|
<font key="font" size="13" name="Menlo-Regular"/>
|
||||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DuP-BJ-gMJ">
|
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DuP-BJ-gMJ">
|
||||||
<rect key="frame" x="212" y="13" width="176" height="32"/>
|
<rect key="frame" x="212" y="59" width="176" height="32"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<buttonCell key="cell" type="push" title="View Allowed Items" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="KsW-is-XrR">
|
<buttonCell key="cell" type="push" title="View Allowed Items" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="KsW-is-XrR">
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
|
@ -171,7 +201,7 @@
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="xaO-g8-rdS">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="xaO-g8-rdS">
|
||||||
<rect key="frame" x="72" y="145" width="475" height="15"/>
|
<rect key="frame" x="72" y="247" width="475" height="15"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Run without showing an icon in the status menu bar." id="SG5-YM-BoV">
|
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Run without showing an icon in the status menu bar." id="SG5-YM-BoV">
|
||||||
<font key="font" size="13" name="Menlo-Regular"/>
|
<font key="font" size="13" name="Menlo-Regular"/>
|
||||||
|
@ -180,14 +210,14 @@
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
</subviews>
|
</subviews>
|
||||||
<point key="canvasLocation" x="-166" y="391.5"/>
|
<point key="canvasLocation" x="-167" y="510"/>
|
||||||
</customView>
|
</customView>
|
||||||
<customView id="Jpg-nC-dWd" userLabel="Action">
|
<customView id="Jpg-nC-dWd" userLabel="Action">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="275"/>
|
<rect key="frame" x="0.0" y="0.0" width="600" height="275"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button fixedFrame="YES" tag="4" translatesAutoresizingMaskIntoConstraints="NO" id="vh6-KZ-8sT">
|
<button fixedFrame="YES" tag="5" translatesAutoresizingMaskIntoConstraints="NO" id="vh6-KZ-8sT">
|
||||||
<rect key="frame" x="39" y="223" width="29" height="18"/>
|
<rect key="frame" x="39" y="224" width="29" height="18"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="egz-lN-TtL">
|
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="egz-lN-TtL">
|
||||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||||
|
@ -198,7 +228,7 @@
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="117" translatesAutoresizingMaskIntoConstraints="NO" id="8Tb-Ih-SsC">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="117" translatesAutoresizingMaskIntoConstraints="NO" id="8Tb-Ih-SsC">
|
||||||
<rect key="frame" x="72" y="224" width="59" height="15"/>
|
<rect key="frame" x="72" y="226" width="59" height="15"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Execute" id="ncJ-bF-dAA">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Execute" id="ncJ-bF-dAA">
|
||||||
<font key="font" size="13" name="Menlo-Bold"/>
|
<font key="font" size="13" name="Menlo-Bold"/>
|
||||||
|
@ -206,7 +236,7 @@
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<button fixedFrame="YES" tag="5" translatesAutoresizingMaskIntoConstraints="NO" id="YqA-7j-gYp">
|
<button fixedFrame="YES" tag="6" translatesAutoresizingMaskIntoConstraints="NO" id="YqA-7j-gYp">
|
||||||
<rect key="frame" x="39" y="151" width="29" height="18"/>
|
<rect key="frame" x="39" y="151" width="29" height="18"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="egX-c0-Flf">
|
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="egX-c0-Flf">
|
||||||
|
@ -237,9 +267,9 @@
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<textField verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="382" translatesAutoresizingMaskIntoConstraints="NO" id="z32-0s-dpb">
|
<textField verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="382" translatesAutoresizingMaskIntoConstraints="NO" id="z32-0s-dpb">
|
||||||
<rect key="frame" x="143" y="221" width="437" height="20"/>
|
<rect key="frame" x="143" y="223" width="437" height="20"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" allowsUndo="NO" state="on" borderStyle="bezel" placeholderString="path" drawsBackground="YES" id="Oe0-3Y-Srk">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" allowsUndo="NO" state="on" borderStyle="bezel" placeholderString="Path..." drawsBackground="YES" id="Oe0-3Y-Srk">
|
||||||
<font key="font" size="13" name="Menlo-Regular"/>
|
<font key="font" size="13" name="Menlo-Regular"/>
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
@ -249,7 +279,7 @@
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gVP-Ih-dFA">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gVP-Ih-dFA">
|
||||||
<rect key="frame" x="498" y="187" width="89" height="33"/>
|
<rect key="frame" x="498" y="190" width="89" height="33"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" constant="75" id="0GJ-HY-4cb"/>
|
<constraint firstAttribute="width" constant="75" id="0GJ-HY-4cb"/>
|
||||||
<constraint firstAttribute="height" constant="21" id="J0H-v3-Re0"/>
|
<constraint firstAttribute="height" constant="21" id="J0H-v3-Re0"/>
|
||||||
|
@ -263,7 +293,7 @@
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="GyI-og-F35">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" preferredMaxLayoutWidth="471" translatesAutoresizingMaskIntoConstraints="NO" id="GyI-og-F35">
|
||||||
<rect key="frame" x="72" y="181" width="427" height="30"/>
|
<rect key="frame" x="72" y="185" width="427" height="30"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Execute a script or binary when an event is detected." id="bky-MW-yBn">
|
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Execute a script or binary when an event is detected." id="bky-MW-yBn">
|
||||||
<font key="font" size="13" name="Menlo-Regular"/>
|
<font key="font" size="13" name="Menlo-Regular"/>
|
||||||
|
@ -274,16 +304,16 @@
|
||||||
</subviews>
|
</subviews>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="trailing" secondItem="gVP-Ih-dFA" secondAttribute="trailing" constant="20" symbolic="YES" id="CvO-h8-LQr"/>
|
<constraint firstAttribute="trailing" secondItem="gVP-Ih-dFA" secondAttribute="trailing" constant="20" symbolic="YES" id="CvO-h8-LQr"/>
|
||||||
<constraint firstItem="gVP-Ih-dFA" firstAttribute="top" secondItem="Jpg-nC-dWd" secondAttribute="top" constant="60" id="nxN-h0-hTd"/>
|
<constraint firstItem="gVP-Ih-dFA" firstAttribute="top" secondItem="Jpg-nC-dWd" secondAttribute="top" constant="57" id="nxN-h0-hTd"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="gVP-Ih-dFA" secondAttribute="trailing" constant="20" symbolic="YES" id="wdb-4c-5GF"/>
|
<constraint firstAttribute="trailing" secondItem="gVP-Ih-dFA" secondAttribute="trailing" constant="20" symbolic="YES" id="wdb-4c-5GF"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<point key="canvasLocation" x="-166" y="738.5"/>
|
<point key="canvasLocation" x="384" y="887"/>
|
||||||
</customView>
|
</customView>
|
||||||
<customView id="1OV-sl-cSe" userLabel="Update">
|
<customView id="1OV-sl-cSe" userLabel="Update">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="618" height="275"/>
|
<rect key="frame" x="0.0" y="0.0" width="618" height="275"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button fixedFrame="YES" tag="6" translatesAutoresizingMaskIntoConstraints="NO" id="dml-JS-liI">
|
<button fixedFrame="YES" tag="7" translatesAutoresizingMaskIntoConstraints="NO" id="dml-JS-liI">
|
||||||
<rect key="frame" x="39" y="223" width="29" height="18"/>
|
<rect key="frame" x="39" y="223" width="29" height="18"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="ljs-bE-JTP">
|
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="ljs-bE-JTP">
|
||||||
|
@ -337,7 +367,7 @@
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
</subviews>
|
</subviews>
|
||||||
<point key="canvasLocation" x="694" y="708.5"/>
|
<point key="canvasLocation" x="673" y="436"/>
|
||||||
</customView>
|
</customView>
|
||||||
</objects>
|
</objects>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
|
@ -33,28 +33,28 @@
|
||||||
@property(nonatomic, retain)NSDictionary* preferences;
|
@property(nonatomic, retain)NSDictionary* preferences;
|
||||||
|
|
||||||
//toolbar
|
//toolbar
|
||||||
@property (weak) IBOutlet NSToolbar *toolbar;
|
@property (weak) IBOutlet NSToolbar* toolbar;
|
||||||
|
|
||||||
//rules prefs view
|
|
||||||
@property (weak) IBOutlet NSView *rulesView;
|
|
||||||
|
|
||||||
//modes view
|
//modes view
|
||||||
@property (strong) IBOutlet NSView *modesView;
|
@property (strong) IBOutlet NSView* modesView;
|
||||||
|
|
||||||
//action view
|
//action view
|
||||||
@property (strong) IBOutlet NSView *actionView;
|
@property (strong) IBOutlet NSView* actionView;
|
||||||
|
|
||||||
|
//execute path button
|
||||||
|
@property (weak) IBOutlet NSButton* executePathButton;
|
||||||
|
|
||||||
//path to action
|
//path to action
|
||||||
@property (weak) IBOutlet NSTextField *executePath;
|
@property (weak) IBOutlet NSSearchField* executePath;
|
||||||
|
|
||||||
//browse button
|
//browse button
|
||||||
@property (weak) IBOutlet NSButton *browseButton;
|
@property (weak) IBOutlet NSButton* browseButton;
|
||||||
|
|
||||||
//execute args button
|
//execute args button
|
||||||
@property (weak) IBOutlet NSButton *executeArgsButton;
|
@property (weak) IBOutlet NSButton* executeArgsButton;
|
||||||
|
|
||||||
//update view
|
//update view
|
||||||
@property (weak) IBOutlet NSView *updateView;
|
@property (weak) IBOutlet NSView* updateView;
|
||||||
|
|
||||||
//update button
|
//update button
|
||||||
@property (weak) IBOutlet NSButton *updateButton;
|
@property (weak) IBOutlet NSButton *updateButton;
|
||||||
|
|
|
@ -23,7 +23,6 @@ extern os_log_t logHandle;
|
||||||
|
|
||||||
@synthesize toolbar;
|
@synthesize toolbar;
|
||||||
@synthesize modesView;
|
@synthesize modesView;
|
||||||
@synthesize rulesView;
|
|
||||||
@synthesize actionView;
|
@synthesize actionView;
|
||||||
@synthesize updateView;
|
@synthesize updateView;
|
||||||
@synthesize updateWindowController;
|
@synthesize updateWindowController;
|
||||||
|
@ -34,17 +33,20 @@ extern os_log_t logHandle;
|
||||||
//'no-icon mode' button
|
//'no-icon mode' button
|
||||||
#define BUTTON_NO_ICON_MODE 2
|
#define BUTTON_NO_ICON_MODE 2
|
||||||
|
|
||||||
|
//no external devices mode
|
||||||
|
#define BUTTON_NO_EXTERNAL_DEVICES_MODE 3
|
||||||
|
|
||||||
//'disable inactive' button
|
//'disable inactive' button
|
||||||
#define BUTTON_DISABLE_INACTIVE_MODE 3
|
#define BUTTON_DISABLE_INACTIVE_MODE 4
|
||||||
|
|
||||||
//action
|
//action
|
||||||
#define BUTTON_EXECUTE_ACTION 4
|
#define BUTTON_EXECUTE_ACTION 5
|
||||||
|
|
||||||
//args for action
|
//args for action
|
||||||
#define BUTTON_EXECUTE_ACTION_ARGS 5
|
#define BUTTON_EXECUTE_ACTION_ARGS 6
|
||||||
|
|
||||||
//'update mode' button
|
//'update mode' button
|
||||||
#define BUTTON_NO_UPDATE_MODE 6
|
#define BUTTON_NO_UPDATE_MODE 7
|
||||||
|
|
||||||
//init 'general' view
|
//init 'general' view
|
||||||
// add it, and make it selected
|
// add it, and make it selected
|
||||||
|
@ -58,6 +60,7 @@ extern os_log_t logHandle;
|
||||||
|
|
||||||
//set rules prefs as default
|
//set rules prefs as default
|
||||||
[self.toolbar setSelectedItemIdentifier:TOOLBAR_MODES_ID];
|
[self.toolbar setSelectedItemIdentifier:TOOLBAR_MODES_ID];
|
||||||
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -92,6 +95,9 @@ extern os_log_t logHandle;
|
||||||
//no icon
|
//no icon
|
||||||
((NSButton*)[view viewWithTag:BUTTON_NO_ICON_MODE]).state = [NSUserDefaults.standardUserDefaults boolForKey:PREF_NO_ICON_MODE];
|
((NSButton*)[view viewWithTag:BUTTON_NO_ICON_MODE]).state = [NSUserDefaults.standardUserDefaults boolForKey:PREF_NO_ICON_MODE];
|
||||||
|
|
||||||
|
//no external device monitoring
|
||||||
|
((NSButton*)[view viewWithTag:BUTTON_NO_EXTERNAL_DEVICES_MODE]).state = [NSUserDefaults.standardUserDefaults boolForKey:PREF_NO_EXTERNAL_DEVICES_MODE];
|
||||||
|
|
||||||
//disable inactive alerts
|
//disable inactive alerts
|
||||||
((NSButton*)[view viewWithTag:BUTTON_DISABLE_INACTIVE_MODE]).state = [NSUserDefaults.standardUserDefaults boolForKey:PREF_DISABLE_INACTIVE];
|
((NSButton*)[view viewWithTag:BUTTON_DISABLE_INACTIVE_MODE]).state = [NSUserDefaults.standardUserDefaults boolForKey:PREF_DISABLE_INACTIVE];
|
||||||
|
|
||||||
|
@ -205,6 +211,14 @@ bail:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//no icon mode
|
||||||
|
case BUTTON_NO_EXTERNAL_DEVICES_MODE:
|
||||||
|
{
|
||||||
|
//set
|
||||||
|
[NSUserDefaults.standardUserDefaults setBool:state forKey:PREF_NO_EXTERNAL_DEVICES_MODE];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
//disable inactive mode
|
//disable inactive mode
|
||||||
case BUTTON_DISABLE_INACTIVE_MODE:
|
case BUTTON_DISABLE_INACTIVE_MODE:
|
||||||
|
@ -236,6 +250,18 @@ bail:
|
||||||
[self browseButtonHandler:nil];
|
[self browseButtonHandler:nil];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//disabled?
|
||||||
|
// reset path
|
||||||
|
if(NSControlStateValueOff == state)
|
||||||
|
{
|
||||||
|
//reset
|
||||||
|
self.executePath.stringValue = @"";
|
||||||
|
|
||||||
|
//save path & sync
|
||||||
|
[NSUserDefaults.standardUserDefaults setObject:nil forKey:PREF_EXECUTE_PATH];
|
||||||
|
[NSUserDefaults.standardUserDefaults synchronize];
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,7 +302,6 @@ bail:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: supported OS
|
|
||||||
//'check for update' button handler
|
//'check for update' button handler
|
||||||
-(IBAction)check4Update:(id)sender
|
-(IBAction)check4Update:(id)sender
|
||||||
{
|
{
|
||||||
|
@ -378,7 +403,6 @@ bail:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -395,7 +419,8 @@ bail:
|
||||||
//set activation policy
|
//set activation policy
|
||||||
[((AppDelegate*)[[NSApplication sharedApplication] delegate]) setActivationPolicy];
|
[((AppDelegate*)[[NSApplication sharedApplication] delegate]) setActivationPolicy];
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -432,9 +457,17 @@ bail:
|
||||||
//show it
|
//show it
|
||||||
response = [panel runModal];
|
response = [panel runModal];
|
||||||
|
|
||||||
//ignore cancel
|
//cancel?
|
||||||
|
// uncheck if path is blank
|
||||||
if(NSModalResponseCancel == response)
|
if(NSModalResponseCancel == response)
|
||||||
{
|
{
|
||||||
|
//blank?
|
||||||
|
if(0 == self.executePath.stringValue.length)
|
||||||
|
{
|
||||||
|
//uncheck
|
||||||
|
self.executePathButton.state = NSControlStateValueOff;
|
||||||
|
}
|
||||||
|
|
||||||
//bail
|
//bail
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,9 @@
|
||||||
//init
|
//init
|
||||||
-(id)init:(NSMenu*)menu;
|
-(id)init:(NSMenu*)menu;
|
||||||
|
|
||||||
|
//update status item menu
|
||||||
|
-(void)setActiveDevices:(NSArray*)activeDevices;
|
||||||
|
|
||||||
//remove status item
|
//remove status item
|
||||||
-(void)removeStatusItem;
|
-(void)removeStatusItem;
|
||||||
|
|
||||||
|
|
|
@ -22,13 +22,18 @@ extern os_log_t logHandle;
|
||||||
enum menuItems
|
enum menuItems
|
||||||
{
|
{
|
||||||
status = 100,
|
status = 100,
|
||||||
|
devices,
|
||||||
toggle,
|
toggle,
|
||||||
rules,
|
|
||||||
prefs,
|
prefs,
|
||||||
|
rules,
|
||||||
quit,
|
quit,
|
||||||
|
uninstall,
|
||||||
end
|
end
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//tag for active device
|
||||||
|
#define TAG_ACTIVE_DEVICE 1000
|
||||||
|
|
||||||
@implementation StatusBarItem
|
@implementation StatusBarItem
|
||||||
|
|
||||||
@synthesize isDisabled;
|
@synthesize isDisabled;
|
||||||
|
@ -100,6 +105,96 @@ enum menuItems
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//update status item menu
|
||||||
|
-(void)setActiveDevices:(NSArray*)activeDevices
|
||||||
|
{
|
||||||
|
//active menu item
|
||||||
|
NSMenuItem* activeDeviceMenuItem = nil;
|
||||||
|
|
||||||
|
//start index
|
||||||
|
NSInteger menuIndex = -1;
|
||||||
|
|
||||||
|
//string for device name/emoji
|
||||||
|
NSMutableString* deviceDetails = nil;
|
||||||
|
|
||||||
|
//get menu item
|
||||||
|
activeDeviceMenuItem = [self.statusItem.menu itemWithTag:devices];
|
||||||
|
|
||||||
|
//get menu item index start
|
||||||
|
menuIndex = [self.statusItem.menu indexOfItemWithTag:devices];
|
||||||
|
|
||||||
|
//iterate over menu
|
||||||
|
// remove all (prev) active devices
|
||||||
|
for(NSInteger i = self.statusItem.menu.itemArray.count-1; i>= 0; --i)
|
||||||
|
{
|
||||||
|
//remove active devices
|
||||||
|
if(TAG_ACTIVE_DEVICE == [[self.statusItem.menu itemAtIndex:i] tag])
|
||||||
|
{
|
||||||
|
//remove
|
||||||
|
[self.statusItem.menu removeItemAtIndex:i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//no active devices?
|
||||||
|
// set title and then bail
|
||||||
|
if(0 == activeDevices.count)
|
||||||
|
{
|
||||||
|
//set title
|
||||||
|
activeDeviceMenuItem.title = @"No Active Devices";
|
||||||
|
|
||||||
|
//gone
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
|
||||||
|
//set title
|
||||||
|
activeDeviceMenuItem.title = @"Active Devices:";
|
||||||
|
|
||||||
|
//inc
|
||||||
|
menuIndex++;
|
||||||
|
|
||||||
|
//add each
|
||||||
|
for(AVCaptureDevice* activeDevice in activeDevices)
|
||||||
|
{
|
||||||
|
//menu item
|
||||||
|
NSMenuItem* item = nil;
|
||||||
|
|
||||||
|
//init string for name/etc
|
||||||
|
deviceDetails = [NSMutableString string];
|
||||||
|
|
||||||
|
//mic?
|
||||||
|
if(YES == [activeDevice isKindOfClass:NSClassFromString(@"AVCaptureHALDevice")])
|
||||||
|
{
|
||||||
|
//add
|
||||||
|
[deviceDetails appendString:@" 🎙️ "];
|
||||||
|
}
|
||||||
|
//camera
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//add
|
||||||
|
[deviceDetails appendString:@" 📸 "];
|
||||||
|
}
|
||||||
|
|
||||||
|
//add name
|
||||||
|
[deviceDetails appendString:activeDevice.localizedName];
|
||||||
|
|
||||||
|
//init item
|
||||||
|
item = [[NSMenuItem alloc] initWithTitle:deviceDetails action:nil keyEquivalent:@""];
|
||||||
|
|
||||||
|
//set tag
|
||||||
|
item.tag = TAG_ACTIVE_DEVICE;
|
||||||
|
|
||||||
|
//add item to menu
|
||||||
|
[self.statusItem.menu insertItem:item atIndex:menuIndex];
|
||||||
|
|
||||||
|
//inc
|
||||||
|
menuIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
bail:
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//remove status item
|
//remove status item
|
||||||
-(void)removeStatusItem
|
-(void)removeStatusItem
|
||||||
{
|
{
|
||||||
|
@ -246,6 +341,59 @@ enum menuItems
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
//uninstall
|
||||||
|
case uninstall:
|
||||||
|
{
|
||||||
|
//uninstaller path
|
||||||
|
NSURL* uninstaller = nil;
|
||||||
|
|
||||||
|
//config options
|
||||||
|
NSWorkspaceOpenConfiguration* configuration = nil;
|
||||||
|
|
||||||
|
//init path to uninstaller
|
||||||
|
uninstaller = [NSBundle.mainBundle URLForResource:@"OverSight Installer" withExtension:@".app"];
|
||||||
|
if(nil == uninstaller)
|
||||||
|
{
|
||||||
|
//err msg
|
||||||
|
os_log_debug(logHandle, "failed to find uninstaller");
|
||||||
|
|
||||||
|
//bail
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
|
||||||
|
//init configuration
|
||||||
|
configuration = [[NSWorkspaceOpenConfiguration alloc] init];
|
||||||
|
|
||||||
|
//set args
|
||||||
|
configuration.arguments = @[CMD_UNINSTALL_VIA_UI];
|
||||||
|
|
||||||
|
//dbg msg
|
||||||
|
os_log_debug(logHandle, "launching uninstaller %{public}@", uninstaller);
|
||||||
|
|
||||||
|
@try
|
||||||
|
{
|
||||||
|
|
||||||
|
//launch (in)/(un)installer
|
||||||
|
[NSWorkspace.sharedWorkspace openApplicationAtURL:uninstaller configuration:configuration completionHandler:^(NSRunningApplication * _Nullable app, NSError * _Nullable error) {
|
||||||
|
|
||||||
|
//dbg msg
|
||||||
|
os_log_debug(logHandle, "launched uninstaller: %{public}@ (error: %{public}@)", app, error);
|
||||||
|
|
||||||
|
}];
|
||||||
|
|
||||||
|
}
|
||||||
|
@catch(NSException *exception)
|
||||||
|
{
|
||||||
|
//err msg
|
||||||
|
os_log_debug(logHandle, "failed to launch task (%{public}@)", exception);
|
||||||
|
|
||||||
|
//bail
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21225" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
|
|
|
@ -10,6 +10,40 @@
|
||||||
//FOR LOGGING:
|
//FOR LOGGING:
|
||||||
// % log stream --level debug --predicate="subsystem='com.objective-see.oversight'"
|
// % log stream --level debug --predicate="subsystem='com.objective-see.oversight'"
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Server data changed for media domain: <STMediaStatusDomainData: 0x12db069e0> {
|
||||||
|
audioAttributions = <STActivityAttributionCatalog: 0x12db05cf0> {
|
||||||
|
};
|
||||||
|
cameraAttributions = <STListData: 0x12db05290> {
|
||||||
|
<STMediaStatusDomainCameraCaptureAttribution: 0x12da088c0> {
|
||||||
|
cameraDescriptor = <STMediaStatusDomainCameraDescriptor: 0x12da088e0; cameraIdentifier: EAB7A68F-EC2B-4487-AADF-D8A91C1CB782; eligibleForPrivacyIndicator: NO>;
|
||||||
|
activityAttribution = <STActivityAttribution: 0x12da08850> {
|
||||||
|
attributedEntity = <STAttributedEntity: 0x12da092a0> {
|
||||||
|
executableIdentity = <STExecutableIdentity: 0x12da08fc0> {
|
||||||
|
auditToken = <BSAuditToken: 0x12da092e0; AUID: 501; EUID: 501; EGID: 20; RUID: 501; RGID: 20; PID: 72414; ASID: 100004; PIDVersion: 445476>;
|
||||||
|
};
|
||||||
|
websiteNonNil = NO;
|
||||||
|
systemService = NO;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
<STMediaStatusDomainCameraCaptureAttribution: 0x12db06370> {
|
||||||
|
cameraDescriptor = <STMediaStatusDomainCameraDescriptor: 0x12db06390; cameraIdentifier: EAB7A68F-EC2B-4487-AADF-D8A91C1CB782; eligibleForPrivacyIndicator: NO>;
|
||||||
|
activityAttribution = <STActivityAttribution: 0x12db056f0> {
|
||||||
|
attributedEntity = <STAttributedEntity: 0x12db04ed0> {
|
||||||
|
executableIdentity = <STExecutableIdentity: 0x12db04f10> {
|
||||||
|
auditToken = <BSAuditToken: 0x12db06470; AUID: 501; EUID: 501; EGID: 20; RUID: 501; RGID: 20; PID: 72396; ASID: 100004; PIDVersion: 445425>;
|
||||||
|
};
|
||||||
|
websiteNonNil = NO;
|
||||||
|
systemService = NO;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
@import Cocoa;
|
@import Cocoa;
|
||||||
@import OSLog;
|
@import OSLog;
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
archiveVersion = 1;
|
archiveVersion = 1;
|
||||||
classes = {
|
classes = {
|
||||||
};
|
};
|
||||||
objectVersion = 46;
|
objectVersion = 54;
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
@ -323,6 +323,7 @@
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
CD17D55F20115E5E00F798D7 /* ShellScript */ = {
|
CD17D55F20115E5E00F798D7 /* ShellScript */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
alwaysOutOfDate = 1;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
);
|
);
|
||||||
|
@ -332,7 +333,7 @@
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "if [[ $BUILT_PRODUCTS_DIR = *\"ArchiveIntermediates\"* ]]; then\n cp -R -f \"$PROJECT_TEMP_ROOT/UninstalledProducts/macosx/OverSight.app\" \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Resources\"\n \n#normal build\nelse\n\nrm -rf \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Resources/OverSight.app\"\n\n#cp daemon/app\ncp -R -f \"$BUILT_PRODUCTS_DIR/OverSight.app\" \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Resources\"\n\nfi\n";
|
shellScript = "#Note: To build uninstaller for app (menu)\n# 1. Delete this script and build installer\n# 2. *Copy* into App \"Uninstaller\" folder\n# 3. Re-add script, and clean rebuild \n\nif [[ $BUILT_PRODUCTS_DIR = *\"ArchiveIntermediates\"* ]]; then\n cp -R -f \"$PROJECT_TEMP_ROOT/UninstalledProducts/macosx/OverSight.app\" \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Resources\"\n \n#normal build\nelse\n\nrm -rf \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Resources/OverSight.app\"\n\n#cp daemon/app\ncp -R -f \"$BUILT_PRODUCTS_DIR/OverSight.app\" \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Resources\"\n\nfi\n\n";
|
||||||
};
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
|
@ -383,14 +384,14 @@
|
||||||
CODE_SIGN_ENTITLEMENTS = "";
|
CODE_SIGN_ENTITLEMENTS = "";
|
||||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||||
CODE_SIGN_STYLE = Manual;
|
CODE_SIGN_STYLE = Manual;
|
||||||
CURRENT_PROJECT_VERSION = 2.0.2;
|
CURRENT_PROJECT_VERSION = 2.1.0;
|
||||||
DEVELOPMENT_TEAM = VBG97UB4TA;
|
DEVELOPMENT_TEAM = VBG97UB4TA;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
||||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
|
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
|
||||||
INFOPLIST_FILE = Helper/Info.plist;
|
INFOPLIST_FILE = Helper/Info.plist;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||||
MARKETING_VERSION = 2.0.2;
|
MARKETING_VERSION = 2.1.0;
|
||||||
ONLY_ACTIVE_ARCH = NO;
|
ONLY_ACTIVE_ARCH = NO;
|
||||||
OTHER_CODE_SIGN_FLAGS = "";
|
OTHER_CODE_SIGN_FLAGS = "";
|
||||||
OTHER_LDFLAGS = (
|
OTHER_LDFLAGS = (
|
||||||
|
@ -418,14 +419,14 @@
|
||||||
CODE_SIGN_ENTITLEMENTS = "";
|
CODE_SIGN_ENTITLEMENTS = "";
|
||||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||||
CODE_SIGN_STYLE = Manual;
|
CODE_SIGN_STYLE = Manual;
|
||||||
CURRENT_PROJECT_VERSION = 2.0.2;
|
CURRENT_PROJECT_VERSION = 2.1.0;
|
||||||
DEVELOPMENT_TEAM = VBG97UB4TA;
|
DEVELOPMENT_TEAM = VBG97UB4TA;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
||||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
|
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
|
||||||
INFOPLIST_FILE = Helper/Info.plist;
|
INFOPLIST_FILE = Helper/Info.plist;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||||
MARKETING_VERSION = 2.0.2;
|
MARKETING_VERSION = 2.1.0;
|
||||||
ONLY_ACTIVE_ARCH = NO;
|
ONLY_ACTIVE_ARCH = NO;
|
||||||
OTHER_CODE_SIGN_FLAGS = "";
|
OTHER_CODE_SIGN_FLAGS = "";
|
||||||
OTHER_LDFLAGS = (
|
OTHER_LDFLAGS = (
|
||||||
|
@ -454,16 +455,19 @@
|
||||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||||
CODE_SIGN_STYLE = Manual;
|
CODE_SIGN_STYLE = Manual;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 2.0.2;
|
CURRENT_PROJECT_VERSION = 2.1.0;
|
||||||
DEVELOPMENT_TEAM = VBG97UB4TA;
|
DEVELOPMENT_TEAM = VBG97UB4TA;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
||||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
|
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
|
||||||
INFOPLIST_FILE = Source/Info.plist;
|
INFOPLIST_FILE = Source/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST))",
|
||||||
|
"@executable_path/../Frameworks",
|
||||||
|
);
|
||||||
LIBRARY_SEARCH_PATHS = "";
|
LIBRARY_SEARCH_PATHS = "";
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||||
MARKETING_VERSION = 2.0.2;
|
MARKETING_VERSION = 2.1.0;
|
||||||
OTHER_CODE_SIGN_FLAGS = "";
|
OTHER_CODE_SIGN_FLAGS = "";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight.installer";
|
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight.installer";
|
||||||
PRODUCT_NAME = "OverSight Installer";
|
PRODUCT_NAME = "OverSight Installer";
|
||||||
|
@ -480,16 +484,19 @@
|
||||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||||
CODE_SIGN_STYLE = Manual;
|
CODE_SIGN_STYLE = Manual;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
CURRENT_PROJECT_VERSION = 2.0.2;
|
CURRENT_PROJECT_VERSION = 2.1.0;
|
||||||
DEVELOPMENT_TEAM = VBG97UB4TA;
|
DEVELOPMENT_TEAM = VBG97UB4TA;
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
ENABLE_HARDENED_RUNTIME = YES;
|
||||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
||||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
|
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
|
||||||
INFOPLIST_FILE = Source/Info.plist;
|
INFOPLIST_FILE = Source/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST))",
|
||||||
|
"@executable_path/../Frameworks",
|
||||||
|
);
|
||||||
LIBRARY_SEARCH_PATHS = "";
|
LIBRARY_SEARCH_PATHS = "";
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||||
MARKETING_VERSION = 2.0.2;
|
MARKETING_VERSION = 2.1.0;
|
||||||
OTHER_CODE_SIGN_FLAGS = "";
|
OTHER_CODE_SIGN_FLAGS = "";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight.installer";
|
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight.installer";
|
||||||
PRODUCT_NAME = "OverSight Installer";
|
PRODUCT_NAME = "OverSight Installer";
|
||||||
|
@ -542,7 +549,7 @@
|
||||||
GCC_WARN_UNUSED_LABEL = YES;
|
GCC_WARN_UNUSED_LABEL = YES;
|
||||||
GCC_WARN_UNUSED_PARAMETER = YES;
|
GCC_WARN_UNUSED_PARAMETER = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||||
ONLY_ACTIVE_ARCH = NO;
|
ONLY_ACTIVE_ARCH = NO;
|
||||||
PROVISIONING_PROFILE = "";
|
PROVISIONING_PROFILE = "";
|
||||||
RUN_CLANG_STATIC_ANALYZER = YES;
|
RUN_CLANG_STATIC_ANALYZER = YES;
|
||||||
|
@ -592,7 +599,7 @@
|
||||||
GCC_WARN_UNUSED_LABEL = YES;
|
GCC_WARN_UNUSED_LABEL = YES;
|
||||||
GCC_WARN_UNUSED_PARAMETER = YES;
|
GCC_WARN_UNUSED_PARAMETER = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||||
ONLY_ACTIVE_ARCH = NO;
|
ONLY_ACTIVE_ARCH = NO;
|
||||||
PROVISIONING_PROFILE = "";
|
PROVISIONING_PROFILE = "";
|
||||||
RUN_CLANG_STATIC_ANALYZER = YES;
|
RUN_CLANG_STATIC_ANALYZER = YES;
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "darkMode.png",
|
||||||
|
"idiom" : "mac"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "light"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"filename" : "lightMode.png",
|
||||||
|
"idiom" : "mac"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"filename" : "darkMode.png",
|
||||||
|
"idiom" : "mac"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"preserves-vector-representation" : true
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 28 KiB |
|
@ -0,0 +1,35 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "darkMode.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "lightMode.png",
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "light"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "darkMode.png",
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "xcode"
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"preserves-vector-representation" : true
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 16 KiB |
|
@ -1,33 +1,33 @@
|
||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"idiom" : "mac",
|
"filename" : "darkMode.png",
|
||||||
"filename" : "darkMode.png"
|
"idiom" : "mac"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "lightMode.png",
|
|
||||||
"appearances" : [
|
"appearances" : [
|
||||||
{
|
{
|
||||||
"appearance" : "luminosity",
|
"appearance" : "luminosity",
|
||||||
"value" : "light"
|
"value" : "light"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"filename" : "lightMode.png",
|
||||||
|
"idiom" : "mac"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"idiom" : "mac",
|
|
||||||
"filename" : "darkMode.png",
|
|
||||||
"appearances" : [
|
"appearances" : [
|
||||||
{
|
{
|
||||||
"appearance" : "luminosity",
|
"appearance" : "luminosity",
|
||||||
"value" : "dark"
|
"value" : "dark"
|
||||||
}
|
}
|
||||||
]
|
],
|
||||||
|
"filename" : "darkMode.png",
|
||||||
|
"idiom" : "mac"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info" : {
|
"info" : {
|
||||||
"version" : 1,
|
"author" : "xcode",
|
||||||
"author" : "xcode"
|
"version" : 1
|
||||||
},
|
},
|
||||||
"properties" : {
|
"properties" : {
|
||||||
"preserves-vector-representation" : true
|
"preserves-vector-representation" : true
|
||||||
|
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 14 KiB |
|
@ -0,0 +1,35 @@
|
||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "darkMode.png",
|
||||||
|
"idiom" : "mac"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "light"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"filename" : "lightMode.png",
|
||||||
|
"idiom" : "mac"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appearances" : [
|
||||||
|
{
|
||||||
|
"appearance" : "luminosity",
|
||||||
|
"value" : "dark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"filename" : "darkMode.png",
|
||||||
|
"idiom" : "mac"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"preserves-vector-representation" : true
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 20 KiB |
|
@ -78,12 +78,32 @@ extern os_log_t logHandle;
|
||||||
[self window].title = [NSString stringWithFormat:@"version %@", getAppVersion()];
|
[self window].title = [NSString stringWithFormat:@"version %@", getAppVersion()];
|
||||||
|
|
||||||
//init status msg
|
//init status msg
|
||||||
[self.statusMsg setStringValue:@"...protects your webcam and microphone!"];
|
[self.statusMsg setStringValue:@"...protects your webcam & microphone!"];
|
||||||
|
|
||||||
|
//uninstall via app?
|
||||||
|
// just enable uinstall button
|
||||||
|
if(YES == [NSProcessInfo.processInfo.arguments containsObject:CMD_UNINSTALL_VIA_UI])
|
||||||
|
{
|
||||||
|
//enable uninstall
|
||||||
|
self.uninstallButton.enabled = YES;
|
||||||
|
|
||||||
|
//disable install
|
||||||
|
self.installButton.enabled = NO;
|
||||||
|
|
||||||
|
//make uninstall button first responder
|
||||||
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (100 * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
|
||||||
|
|
||||||
|
//set first responder
|
||||||
|
[self.window makeFirstResponder:self.uninstallButton];
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
//app already installed?
|
//app already installed?
|
||||||
// enable 'uninstall' button
|
// enable 'uninstall' button
|
||||||
// change 'install' button to say 'upgrade'
|
// change 'install' button to say 'upgrade'
|
||||||
if(YES == isInstalled)
|
else if(YES == isInstalled)
|
||||||
{
|
{
|
||||||
//enable 'uninstall'
|
//enable 'uninstall'
|
||||||
self.uninstallButton.enabled = YES;
|
self.uninstallButton.enabled = YES;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="20037" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21225" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="20037"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
|
@ -96,7 +96,7 @@
|
||||||
<point key="canvasLocation" x="216.5" y="-225.5"/>
|
<point key="canvasLocation" x="216.5" y="-225.5"/>
|
||||||
</window>
|
</window>
|
||||||
<customView id="bkk-rY-ALC" userLabel="Support">
|
<customView id="bkk-rY-ALC" userLabel="Support">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="812" height="454"/>
|
<rect key="frame" x="0.0" y="0.0" width="812" height="500"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<box fixedFrame="YES" boxType="custom" borderType="none" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="8QY-YW-R4a">
|
<box fixedFrame="YES" boxType="custom" borderType="none" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="8QY-YW-R4a">
|
||||||
|
@ -133,7 +133,7 @@
|
||||||
<color key="fillColor" red="0.52700018810602922" green="0.69087679927512946" blue="0.21211786802009008" alpha="0.9959562059859155" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="fillColor" red="0.52700018810602922" green="0.69087679927512946" blue="0.21211786802009008" alpha="0.9959562059859155" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
</box>
|
</box>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Lq7-rg-Vi8">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Lq7-rg-Vi8">
|
||||||
<rect key="frame" x="12" y="392" width="367" height="54"/>
|
<rect key="frame" x="12" y="438" width="367" height="54"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Support OverSight?" id="hLy-Nm-ajB">
|
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Support OverSight?" id="hLy-Nm-ajB">
|
||||||
<font key="font" size="32" name="AvenirNextCondensed-Regular"/>
|
<font key="font" size="32" name="AvenirNextCondensed-Regular"/>
|
||||||
|
@ -142,12 +142,12 @@
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2VU-bI-F6R">
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2VU-bI-F6R">
|
||||||
<rect key="frame" x="13" y="235" width="128" height="128"/>
|
<rect key="frame" x="13" y="281" width="128" height="128"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="Love" id="KDa-FN-bji"/>
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="Love" id="KDa-FN-bji"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" preferredMaxLayoutWidth="660" translatesAutoresizingMaskIntoConstraints="NO" id="5tM-5c-KKa">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" preferredMaxLayoutWidth="660" translatesAutoresizingMaskIntoConstraints="NO" id="5tM-5c-KKa">
|
||||||
<rect key="frame" x="151" y="244" width="636" height="110"/>
|
<rect key="frame" x="151" y="290" width="636" height="110"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="It's free, open-source, and written by a single (mac-loving) coder!" id="WLJ-8f-ExO">
|
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="It's free, open-source, and written by a single (mac-loving) coder!" id="WLJ-8f-ExO">
|
||||||
<font key="font" size="40" name="AvenirNextCondensed-Regular"/>
|
<font key="font" size="40" name="AvenirNextCondensed-Regular"/>
|
||||||
|
@ -155,42 +155,8 @@
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" alphaValue="0.59999999999999998" id="hcK-0X-K04">
|
|
||||||
<rect key="frame" x="290" y="105" width="233" height="29"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<textFieldCell key="cell" lineBreakMode="clipping" alignment="center" title="Mahalo to the "Friends Objective-See"" id="x7K-o7-Ccb">
|
|
||||||
<font key="font" size="15" name="AvenirNextCondensed-Regular"/>
|
|
||||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
</textFieldCell>
|
|
||||||
</textField>
|
|
||||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.90000000000000002" id="sGr-d7-8XJ">
|
|
||||||
<rect key="frame" x="23" y="57" width="104" height="34"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
|
||||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsJamf" id="Y3P-IW-QqH"/>
|
|
||||||
</imageView>
|
|
||||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.90000000000000002" id="3xq-LX-eQC">
|
|
||||||
<rect key="frame" x="162" y="57" width="127" height="36"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
|
||||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsMosyle" id="tYt-qP-78Y"/>
|
|
||||||
</imageView>
|
|
||||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.59999999999999998" id="hQo-Iv-Tqu">
|
|
||||||
<rect key="frame" x="322" y="57" width="123" height="35"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
|
||||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsKandji" id="Wvj-lw-Sj1"/>
|
|
||||||
</imageView>
|
|
||||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.69999999999999996" id="jRS-B1-EGC">
|
|
||||||
<rect key="frame" x="674" y="61" width="123" height="35"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
|
||||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsKollide" id="aMp-cA-4ja"/>
|
|
||||||
</imageView>
|
|
||||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.75" id="RsF-Dm-R74">
|
|
||||||
<rect key="frame" x="477" y="42" width="181" height="65"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
|
||||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsMacPaw" id="sSW-HX-Kg7"/>
|
|
||||||
</imageView>
|
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" preferredMaxLayoutWidth="660" translatesAutoresizingMaskIntoConstraints="NO" id="mL7-9q-jrx">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" preferredMaxLayoutWidth="660" translatesAutoresizingMaskIntoConstraints="NO" id="mL7-9q-jrx">
|
||||||
<rect key="frame" x="520" y="173" width="274" height="57"/>
|
<rect key="frame" x="520" y="219" width="274" height="57"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Show some love? " id="Hvk-zS-1VC">
|
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Show some love? " id="Hvk-zS-1VC">
|
||||||
<font key="font" size="40" name="AvenirNextCondensed-Regular"/>
|
<font key="font" size="40" name="AvenirNextCondensed-Regular"/>
|
||||||
|
@ -198,16 +164,62 @@
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.90000000000000002" id="Zyf-mO-fF5">
|
||||||
|
<rect key="frame" x="137" y="104" width="84" height="29"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsJamf" id="tGS-D3-Ik3"/>
|
||||||
|
</imageView>
|
||||||
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.69999999999999996" id="3mq-qv-h8l">
|
||||||
|
<rect key="frame" x="350" y="56" width="114" height="30"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsKandji" id="e6d-In-kuf"/>
|
||||||
|
</imageView>
|
||||||
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" alphaValue="0.59999999999999998" id="MWL-4T-Xv3">
|
||||||
|
<rect key="frame" x="306" y="152" width="203" height="29"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<textFieldCell key="cell" lineBreakMode="clipping" alignment="center" title="Mahalo to the "Friends Objective-See"" id="OYn-6J-Cfb">
|
||||||
|
<font key="font" size="15" name="AvenirNextCondensed-Regular"/>
|
||||||
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.75" id="fJC-IE-PH9">
|
||||||
|
<rect key="frame" x="137" y="52" width="169" height="39"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsMacPaw" id="08t-7Z-gUk"/>
|
||||||
|
</imageView>
|
||||||
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.66000000000000003" id="GTI-Em-kfn">
|
||||||
|
<rect key="frame" x="425" y="107" width="98" height="33"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsFleet" id="RBg-Sd-ADQ"/>
|
||||||
|
</imageView>
|
||||||
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.66000000000000003" id="9c2-Co-4Ql">
|
||||||
|
<rect key="frame" x="528" y="49" width="148" height="46"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsPANW" id="dHd-yp-fGA"/>
|
||||||
|
</imageView>
|
||||||
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.66000000000000003" id="3nY-gD-7cS">
|
||||||
|
<rect key="frame" x="546" y="102" width="130" height="36"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsKolide" id="wBR-4L-PRo"/>
|
||||||
|
</imageView>
|
||||||
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" alphaValue="0.66000000000000003" id="KTw-zc-RYn">
|
||||||
|
<rect key="frame" x="268" y="100" width="127" height="37"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="FriendsMosyle" id="xZu-49-45r"/>
|
||||||
|
</imageView>
|
||||||
</subviews>
|
</subviews>
|
||||||
<point key="canvasLocation" x="686" y="1350"/>
|
<point key="canvasLocation" x="686" y="1393.5"/>
|
||||||
</customView>
|
</customView>
|
||||||
</objects>
|
</objects>
|
||||||
<resources>
|
<resources>
|
||||||
|
<image name="FriendsFleet" width="236" height="96"/>
|
||||||
<image name="FriendsJamf" width="328" height="114"/>
|
<image name="FriendsJamf" width="328" height="114"/>
|
||||||
<image name="FriendsKandji" width="500" height="127"/>
|
<image name="FriendsKandji" width="1944" height="494"/>
|
||||||
<image name="FriendsKollide" width="636" height="216"/>
|
<image name="FriendsKolide" width="636" height="216"/>
|
||||||
<image name="FriendsMacPaw" width="2034" height="335"/>
|
<image name="FriendsMacPaw" width="2034" height="335"/>
|
||||||
<image name="FriendsMosyle" width="925" height="242"/>
|
<image name="FriendsMosyle" width="963" height="265"/>
|
||||||
|
<image name="FriendsPANW" width="1312" height="240"/>
|
||||||
<image name="Icon" width="512" height="512"/>
|
<image name="Icon" width="512" height="512"/>
|
||||||
<image name="Love" width="256" height="256"/>
|
<image name="Love" width="256" height="256"/>
|
||||||
<image name="OverSight" width="1301" height="227"/>
|
<image name="OverSight" width="1301" height="227"/>
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21225" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"/>
|
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"/>
|
||||||
|
|
|
@ -62,13 +62,13 @@
|
||||||
#define SIGNING_AUTH @"Developer ID Application: Objective-See, LLC (VBG97UB4TA)"
|
#define SIGNING_AUTH @"Developer ID Application: Objective-See, LLC (VBG97UB4TA)"
|
||||||
|
|
||||||
//product version url
|
//product version url
|
||||||
#define PRODUCT_VERSIONS_URL @"https://objective-see.com/products.json"
|
#define PRODUCT_VERSIONS_URL @"https://objective-see.org/products.json"
|
||||||
|
|
||||||
//product url
|
//product url
|
||||||
#define PRODUCT_URL @"https://objective-see.com/products/oversight.html"
|
#define PRODUCT_URL @"https://objective-see.org/products/oversight.html"
|
||||||
|
|
||||||
//error(s) url
|
//error(s) url
|
||||||
#define ERRORS_URL @"https://objective-see.com/errors.html"
|
#define ERRORS_URL @"https://objective-see.org/errors.html"
|
||||||
|
|
||||||
//os major
|
//os major
|
||||||
#define SUPPORTED_OS_MAJOR @"OSMajor"
|
#define SUPPORTED_OS_MAJOR @"OSMajor"
|
||||||
|
@ -134,6 +134,10 @@
|
||||||
// icon mode
|
// icon mode
|
||||||
#define PREF_NO_ICON_MODE @"noIconMode"
|
#define PREF_NO_ICON_MODE @"noIconMode"
|
||||||
|
|
||||||
|
//prefs
|
||||||
|
// no external devices mode
|
||||||
|
#define PREF_NO_EXTERNAL_DEVICES_MODE @"noExternalDevicesMode"
|
||||||
|
|
||||||
//prefs
|
//prefs
|
||||||
// update mode
|
// update mode
|
||||||
#define PREF_NO_UPDATE_MODE @"noupdateMode"
|
#define PREF_NO_UPDATE_MODE @"noupdateMode"
|
||||||
|
@ -142,7 +146,7 @@
|
||||||
#define PREFS_ALLOWED_ITEMS @"allowedItems"
|
#define PREFS_ALLOWED_ITEMS @"allowedItems"
|
||||||
|
|
||||||
//general error URL
|
//general error URL
|
||||||
#define FATAL_ERROR_URL @"https://objective-see.com/errors.html"
|
#define FATAL_ERROR_URL @"https://objective-see.org/errors.html"
|
||||||
|
|
||||||
//key for exit code
|
//key for exit code
|
||||||
#define EXIT_CODE @"exitCode"
|
#define EXIT_CODE @"exitCode"
|
||||||
|
@ -177,6 +181,9 @@
|
||||||
//cmdline flag to uninstall
|
//cmdline flag to uninstall
|
||||||
#define ACTION_UNINSTALL @"-uninstall"
|
#define ACTION_UNINSTALL @"-uninstall"
|
||||||
|
|
||||||
|
//uninstall via UI
|
||||||
|
#define CMD_UNINSTALL_VIA_UI @"-uninstallViaUI"
|
||||||
|
|
||||||
//flag to uninstall
|
//flag to uninstall
|
||||||
#define ACTION_UNINSTALL_FLAG 0
|
#define ACTION_UNINSTALL_FLAG 0
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
Patrons (2^6+):
|
Patrons (2^6+):
|
||||||
Jan Koum, Christian Blümlein, MikeyH
|
Jan Koum, Nick, Shain Singh, Christian Blümlein, Rocky Zadok, Cane Juice, M S
|
||||||
|
|
||||||
Friends of Objective-See:
|
Friends of Objective-See:
|
||||||
Jamf, Mosyle, Kandji, CleanMyMac X, Kollide, SmugMug, Guardian Mobile Firewall, iVerify, Halo Privacy, uberAgent
|
Kandji, Jamf, Mosyle, CleanMyMac X, Kolide, Fleet, Palo Alto Networks, SmugMug, Guardian Mobile Firewall, iVerify, Halo Privacy
|
||||||
|
|