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
|
@ -20,3 +20,4 @@ xcuserdata/
|
|||
# Carthage
|
||||
Carthage/Build/
|
||||
Carthage/Checkouts
|
||||
Application/Uninstaller/
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
CDC60991263CBD36006D1332 /* AVMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = CDC60990263CBD36006D1332 /* AVMonitor.m */; };
|
||||
CDC60994263CBEE7006D1332 /* Client.m in Sources */ = {isa = PBXBuildFile; fileRef = CDC60993263CBEE7006D1332 /* Client.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 */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
|
@ -97,6 +98,7 @@
|
|||
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>"; };
|
||||
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 */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
@ -132,6 +134,7 @@
|
|||
7D7755DA1F02E05B00D0017D = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CDE09AF12919829000561CFF /* Uninstaller */,
|
||||
7D3B75201F13356900568828 /* Shared */,
|
||||
7D7755E51F02E05B00D0017D /* Source */,
|
||||
CDAFF434203E55F300F27635 /* Frameworks */,
|
||||
|
@ -212,6 +215,14 @@
|
|||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CDE09AF12919829000561CFF /* Uninstaller */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CDE09AF629198BA800561CFF /* OverSight Installer.app */,
|
||||
);
|
||||
path = Uninstaller;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
|
@ -285,6 +296,7 @@
|
|||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
CD8FD5D523BAE2D200EFE0FB /* Preferences.xib in Resources */,
|
||||
CDE09AF729198BA800561CFF /* OverSight Installer.app in Resources */,
|
||||
CD6836682391DB6F00CF19C1 /* security.plist in Resources */,
|
||||
CD2F800C24455333009C3D77 /* AboutWindow.xib in Resources */,
|
||||
7D16D6951F64E43300DB3161 /* UpdateWindow.xib in Resources */,
|
||||
|
@ -457,7 +469,7 @@
|
|||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;
|
||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 2.0.2;
|
||||
CURRENT_PROJECT_VERSION = 2.1.0;
|
||||
DEVELOPMENT_TEAM = VBG97UB4TA;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
||||
|
@ -465,8 +477,8 @@
|
|||
INFOPLIST_FILE = Application/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
MARKETING_VERSION = 2.0.2;
|
||||
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight";
|
||||
PRODUCT_NAME = OverSight;
|
||||
|
@ -481,7 +493,7 @@
|
|||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;
|
||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 2.0.2;
|
||||
CURRENT_PROJECT_VERSION = 2.1.0;
|
||||
DEVELOPMENT_TEAM = VBG97UB4TA;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
||||
|
@ -489,8 +501,8 @@
|
|||
INFOPLIST_FILE = Application/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(LD_RUNPATH_SEARCH_PATHS_$(IS_MACCATALYST)) @executable_path/../Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = "";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
MARKETING_VERSION = 2.0.2;
|
||||
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight";
|
||||
PRODUCT_NAME = OverSight;
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
enableAddressSanitizer = "YES"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
|
@ -50,6 +51,18 @@
|
|||
ReferencedContainer = "container:Application.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
<AdditionalOptions>
|
||||
<AdditionalOption
|
||||
key = "NSZombieEnabled"
|
||||
value = "YES"
|
||||
isEnabled = "YES">
|
||||
</AdditionalOption>
|
||||
<AdditionalOption
|
||||
key = "MallocScribble"
|
||||
value = ""
|
||||
isEnabled = "YES">
|
||||
</AdditionalOption>
|
||||
</AdditionalOptions>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#import <CoreMedia/CoreMedia.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <CoreMediaIO/CMIOHardware.h>
|
||||
#import <AVFoundation/AVCaptureDevice.h>
|
||||
|
||||
#import "Event.h"
|
||||
#import "LogMonitor.h"
|
||||
|
@ -21,35 +22,54 @@
|
|||
|
||||
@interface AVMonitor : NSObject <UNUserNotificationCenterDelegate>
|
||||
|
||||
//video log monitor
|
||||
@property(nonatomic, retain)LogMonitor* videoLogMonitor;
|
||||
//log monitor
|
||||
@property(nonatomic, retain)LogMonitor* logMonitor;
|
||||
|
||||
//audio log monitor
|
||||
@property(nonatomic, retain)LogMonitor* audioLogMonitor;
|
||||
//camera attributions
|
||||
@property(nonatomic, retain)NSMutableArray* cameraAttributions;
|
||||
|
||||
//clients
|
||||
@property(nonatomic, retain)NSMutableArray* videoClients;
|
||||
//audio attributions
|
||||
@property(nonatomic, retain)NSMutableArray* audioAttributions;
|
||||
|
||||
//audio clients
|
||||
@property(nonatomic, retain)NSMutableArray* audioClients;
|
||||
//built in mic
|
||||
@property(nonatomic, retain)AVCaptureDevice* builtInMic;
|
||||
|
||||
//audio (mic) callback
|
||||
@property(nonatomic, copy)AudioObjectPropertyListenerBlock listenerBlock;
|
||||
//built in camera
|
||||
@property(nonatomic, retain)AVCaptureDevice* builtInCamera;
|
||||
|
||||
//camera state
|
||||
@property NSControlStateValue cameraState;
|
||||
//inital mic state
|
||||
@property NSControlStateValue initialMicState;
|
||||
|
||||
//microphone state
|
||||
@property NSControlStateValue microphoneState;
|
||||
//initial camera state
|
||||
@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 */
|
||||
|
||||
//start
|
||||
-(void)start;
|
||||
|
||||
//enumerate active devices
|
||||
-(NSMutableArray*)enumerateActiveDevices;
|
||||
|
||||
//stop
|
||||
-(void)stop;
|
||||
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
<?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>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
||||
|
@ -53,7 +52,7 @@
|
|||
</menu>
|
||||
</menuItem>
|
||||
</items>
|
||||
<point key="canvasLocation" x="67" y="135"/>
|
||||
<point key="canvasLocation" x="-168" y="153"/>
|
||||
</menu>
|
||||
<menu id="2P0-OI-hGc">
|
||||
<items>
|
||||
|
@ -61,22 +60,29 @@
|
|||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
</menuItem>
|
||||
<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"/>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="Y5x-j1-ofU"/>
|
||||
<menuItem title="Preferences..." tag="103" id="Zao-2v-WyJ">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
</menuItem>
|
||||
<menuItem title="Allowed Items..." tag="102" id="i2A-ax-9ff">
|
||||
<menuItem title="Allowed Items..." tag="104" id="i2A-ax-9ff">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
</menuItem>
|
||||
<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"/>
|
||||
</menuItem>
|
||||
</items>
|
||||
<point key="canvasLocation" x="55" y="10"/>
|
||||
<point key="canvasLocation" x="55" y="-1.5"/>
|
||||
</menu>
|
||||
</objects>
|
||||
</document>
|
||||
|
|
|
@ -15,12 +15,6 @@
|
|||
//pid
|
||||
@property(nonatomic, retain)NSNumber* pid;
|
||||
|
||||
//message count
|
||||
@property unsigned long long msgCount;
|
||||
|
||||
//client id
|
||||
@property(nonatomic, retain)NSNumber* clientID;
|
||||
|
||||
//path
|
||||
@property(nonatomic, retain)NSString* path;
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
-(NSString*)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
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
@import Cocoa;
|
||||
@import Foundation;
|
||||
|
||||
#import <AVFoundation/AVCaptureDevice.h>
|
||||
|
||||
#import "Client.h"
|
||||
|
||||
@interface Event : NSObject
|
||||
|
@ -16,20 +18,23 @@
|
|||
/* METHODS */
|
||||
|
||||
//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 */
|
||||
|
||||
//client
|
||||
@property(nonatomic, retain)Client* client;
|
||||
|
||||
//time stamp
|
||||
@property(nonatomic, retain)NSDate* timestamp;
|
||||
//device
|
||||
@property(nonatomic, retain)AVCaptureDevice* device;
|
||||
|
||||
//device
|
||||
@property int device;
|
||||
@property int deviceType;
|
||||
|
||||
//state
|
||||
@property NSControlStateValue state;
|
||||
|
||||
//time stamp
|
||||
@property(nonatomic, retain)NSDate* timestamp;
|
||||
|
||||
@end
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
@implementation Event
|
||||
|
||||
//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
|
||||
self = [super init];
|
||||
|
@ -23,6 +23,9 @@
|
|||
//set device
|
||||
self.device = device;
|
||||
|
||||
//set device type
|
||||
self.deviceType = deviceType;
|
||||
|
||||
//set state
|
||||
self.state = state;
|
||||
|
||||
|
@ -33,6 +36,4 @@
|
|||
return self;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@end
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
<outlet property="browseButton" destination="gVP-Ih-dFA" id="j7F-V3-hEq"/>
|
||||
<outlet property="executeArgsButton" destination="YqA-7j-gYp" id="tbC-AW-etO"/>
|
||||
<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="toolbar" destination="V8g-Ya-LK4" id="SH2-6E-QST"/>
|
||||
<outlet property="updateButton" destination="Mtn-pi-zIl" id="Oe1-Jy-nMH"/>
|
||||
|
@ -25,14 +26,14 @@
|
|||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
|
||||
<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"/>
|
||||
<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"/>
|
||||
<subviews>
|
||||
<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"/>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyDown" image="OverSight" id="m7R-HO-YMp"/>
|
||||
</imageView>
|
||||
|
@ -75,14 +76,14 @@
|
|||
<connections>
|
||||
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="-823" y="488.5"/>
|
||||
<point key="canvasLocation" x="-823" y="519"/>
|
||||
</window>
|
||||
<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"/>
|
||||
<subviews>
|
||||
<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"/>
|
||||
<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"/>
|
||||
|
@ -93,7 +94,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<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"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Start at Login" id="JVI-Or-h0u">
|
||||
<font key="font" size="13" name="Menlo-Bold"/>
|
||||
|
@ -102,7 +103,7 @@
|
|||
</textFieldCell>
|
||||
</textField>
|
||||
<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"/>
|
||||
<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"/>
|
||||
|
@ -111,7 +112,7 @@
|
|||
</textFieldCell>
|
||||
</textField>
|
||||
<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"/>
|
||||
<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"/>
|
||||
|
@ -122,7 +123,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<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"/>
|
||||
<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"/>
|
||||
|
@ -131,7 +132,7 @@
|
|||
</textFieldCell>
|
||||
</textField>
|
||||
<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"/>
|
||||
<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"/>
|
||||
|
@ -142,25 +143,54 @@
|
|||
</connections>
|
||||
</button>
|
||||
<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"/>
|
||||
<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"/>
|
||||
<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="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"/>
|
||||
<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"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<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"/>
|
||||
<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"/>
|
||||
|
@ -171,7 +201,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<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"/>
|
||||
<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"/>
|
||||
|
@ -180,14 +210,14 @@
|
|||
</textFieldCell>
|
||||
</textField>
|
||||
</subviews>
|
||||
<point key="canvasLocation" x="-166" y="391.5"/>
|
||||
<point key="canvasLocation" x="-167" y="510"/>
|
||||
</customView>
|
||||
<customView id="Jpg-nC-dWd" userLabel="Action">
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="275"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<button fixedFrame="YES" tag="4" translatesAutoresizingMaskIntoConstraints="NO" id="vh6-KZ-8sT">
|
||||
<rect key="frame" x="39" y="223" width="29" height="18"/>
|
||||
<button fixedFrame="YES" tag="5" translatesAutoresizingMaskIntoConstraints="NO" id="vh6-KZ-8sT">
|
||||
<rect key="frame" x="39" y="224" 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="egz-lN-TtL">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
|
@ -198,7 +228,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<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"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Execute" id="ncJ-bF-dAA">
|
||||
<font key="font" size="13" name="Menlo-Bold"/>
|
||||
|
@ -206,7 +236,7 @@
|
|||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</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"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="egX-c0-Flf">
|
||||
|
@ -237,9 +267,9 @@
|
|||
</textFieldCell>
|
||||
</textField>
|
||||
<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"/>
|
||||
<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"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
|
@ -249,7 +279,7 @@
|
|||
</connections>
|
||||
</textField>
|
||||
<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>
|
||||
<constraint firstAttribute="width" constant="75" id="0GJ-HY-4cb"/>
|
||||
<constraint firstAttribute="height" constant="21" id="J0H-v3-Re0"/>
|
||||
|
@ -263,7 +293,7 @@
|
|||
</connections>
|
||||
</button>
|
||||
<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"/>
|
||||
<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"/>
|
||||
|
@ -274,16 +304,16 @@
|
|||
</subviews>
|
||||
<constraints>
|
||||
<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"/>
|
||||
</constraints>
|
||||
<point key="canvasLocation" x="-166" y="738.5"/>
|
||||
<point key="canvasLocation" x="384" y="887"/>
|
||||
</customView>
|
||||
<customView id="1OV-sl-cSe" userLabel="Update">
|
||||
<rect key="frame" x="0.0" y="0.0" width="618" height="275"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<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"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="check" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="ljs-bE-JTP">
|
||||
|
@ -337,7 +367,7 @@
|
|||
</textFieldCell>
|
||||
</textField>
|
||||
</subviews>
|
||||
<point key="canvasLocation" x="694" y="708.5"/>
|
||||
<point key="canvasLocation" x="673" y="436"/>
|
||||
</customView>
|
||||
</objects>
|
||||
<resources>
|
||||
|
|
|
@ -33,28 +33,28 @@
|
|||
@property(nonatomic, retain)NSDictionary* preferences;
|
||||
|
||||
//toolbar
|
||||
@property (weak) IBOutlet NSToolbar *toolbar;
|
||||
|
||||
//rules prefs view
|
||||
@property (weak) IBOutlet NSView *rulesView;
|
||||
@property (weak) IBOutlet NSToolbar* toolbar;
|
||||
|
||||
//modes view
|
||||
@property (strong) IBOutlet NSView *modesView;
|
||||
@property (strong) IBOutlet NSView* modesView;
|
||||
|
||||
//action view
|
||||
@property (strong) IBOutlet NSView *actionView;
|
||||
@property (strong) IBOutlet NSView* actionView;
|
||||
|
||||
//execute path button
|
||||
@property (weak) IBOutlet NSButton* executePathButton;
|
||||
|
||||
//path to action
|
||||
@property (weak) IBOutlet NSTextField *executePath;
|
||||
@property (weak) IBOutlet NSSearchField* executePath;
|
||||
|
||||
//browse button
|
||||
@property (weak) IBOutlet NSButton *browseButton;
|
||||
@property (weak) IBOutlet NSButton* browseButton;
|
||||
|
||||
//execute args button
|
||||
@property (weak) IBOutlet NSButton *executeArgsButton;
|
||||
@property (weak) IBOutlet NSButton* executeArgsButton;
|
||||
|
||||
//update view
|
||||
@property (weak) IBOutlet NSView *updateView;
|
||||
@property (weak) IBOutlet NSView* updateView;
|
||||
|
||||
//update button
|
||||
@property (weak) IBOutlet NSButton *updateButton;
|
||||
|
|
|
@ -23,7 +23,6 @@ extern os_log_t logHandle;
|
|||
|
||||
@synthesize toolbar;
|
||||
@synthesize modesView;
|
||||
@synthesize rulesView;
|
||||
@synthesize actionView;
|
||||
@synthesize updateView;
|
||||
@synthesize updateWindowController;
|
||||
|
@ -34,17 +33,20 @@ extern os_log_t logHandle;
|
|||
//'no-icon mode' button
|
||||
#define BUTTON_NO_ICON_MODE 2
|
||||
|
||||
//no external devices mode
|
||||
#define BUTTON_NO_EXTERNAL_DEVICES_MODE 3
|
||||
|
||||
//'disable inactive' button
|
||||
#define BUTTON_DISABLE_INACTIVE_MODE 3
|
||||
#define BUTTON_DISABLE_INACTIVE_MODE 4
|
||||
|
||||
//action
|
||||
#define BUTTON_EXECUTE_ACTION 4
|
||||
#define BUTTON_EXECUTE_ACTION 5
|
||||
|
||||
//args for action
|
||||
#define BUTTON_EXECUTE_ACTION_ARGS 5
|
||||
#define BUTTON_EXECUTE_ACTION_ARGS 6
|
||||
|
||||
//'update mode' button
|
||||
#define BUTTON_NO_UPDATE_MODE 6
|
||||
#define BUTTON_NO_UPDATE_MODE 7
|
||||
|
||||
//init 'general' view
|
||||
// add it, and make it selected
|
||||
|
@ -59,6 +61,7 @@ extern os_log_t logHandle;
|
|||
//set rules prefs as default
|
||||
[self.toolbar setSelectedItemIdentifier:TOOLBAR_MODES_ID];
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -92,6 +95,9 @@ extern os_log_t logHandle;
|
|||
//no icon
|
||||
((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
|
||||
((NSButton*)[view viewWithTag:BUTTON_DISABLE_INACTIVE_MODE]).state = [NSUserDefaults.standardUserDefaults boolForKey:PREF_DISABLE_INACTIVE];
|
||||
|
||||
|
@ -206,6 +212,14 @@ bail:
|
|||
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
|
||||
case BUTTON_DISABLE_INACTIVE_MODE:
|
||||
{
|
||||
|
@ -236,6 +250,18 @@ bail:
|
|||
[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;
|
||||
}
|
||||
|
||||
|
@ -276,7 +302,6 @@ bail:
|
|||
return;
|
||||
}
|
||||
|
||||
//TODO: supported OS
|
||||
//'check for update' button handler
|
||||
-(IBAction)check4Update:(id)sender
|
||||
{
|
||||
|
@ -378,7 +403,6 @@ bail:
|
|||
break;
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -396,6 +420,7 @@ bail:
|
|||
[((AppDelegate*)[[NSApplication sharedApplication] delegate]) setActivationPolicy];
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
return;
|
||||
|
@ -432,9 +457,17 @@ bail:
|
|||
//show it
|
||||
response = [panel runModal];
|
||||
|
||||
//ignore cancel
|
||||
//cancel?
|
||||
// uncheck if path is blank
|
||||
if(NSModalResponseCancel == response)
|
||||
{
|
||||
//blank?
|
||||
if(0 == self.executePath.stringValue.length)
|
||||
{
|
||||
//uncheck
|
||||
self.executePathButton.state = NSControlStateValueOff;
|
||||
}
|
||||
|
||||
//bail
|
||||
goto bail;
|
||||
}
|
||||
|
|
|
@ -29,6 +29,9 @@
|
|||
//init
|
||||
-(id)init:(NSMenu*)menu;
|
||||
|
||||
//update status item menu
|
||||
-(void)setActiveDevices:(NSArray*)activeDevices;
|
||||
|
||||
//remove status item
|
||||
-(void)removeStatusItem;
|
||||
|
||||
|
|
|
@ -22,13 +22,18 @@ extern os_log_t logHandle;
|
|||
enum menuItems
|
||||
{
|
||||
status = 100,
|
||||
devices,
|
||||
toggle,
|
||||
rules,
|
||||
prefs,
|
||||
rules,
|
||||
quit,
|
||||
uninstall,
|
||||
end
|
||||
};
|
||||
|
||||
//tag for active device
|
||||
#define TAG_ACTIVE_DEVICE 1000
|
||||
|
||||
@implementation StatusBarItem
|
||||
|
||||
@synthesize isDisabled;
|
||||
|
@ -100,6 +105,96 @@ enum menuItems
|
|||
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
|
||||
-(void)removeStatusItem
|
||||
{
|
||||
|
@ -246,6 +341,59 @@ enum menuItems
|
|||
|
||||
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:
|
||||
|
||||
break;
|
||||
|
|
|
@ -1,8 +1,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>
|
||||
<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"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
|
|
|
@ -10,6 +10,40 @@
|
|||
//FOR LOGGING:
|
||||
// % 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 OSLog;
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 46;
|
||||
objectVersion = 54;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
|
@ -323,6 +323,7 @@
|
|||
/* Begin PBXShellScriptBuildPhase section */
|
||||
CD17D55F20115E5E00F798D7 /* ShellScript */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
alwaysOutOfDate = 1;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
|
@ -332,7 +333,7 @@
|
|||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
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 */
|
||||
|
||||
|
@ -383,14 +384,14 @@
|
|||
CODE_SIGN_ENTITLEMENTS = "";
|
||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 2.0.2;
|
||||
CURRENT_PROJECT_VERSION = 2.1.0;
|
||||
DEVELOPMENT_TEAM = VBG97UB4TA;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
|
||||
INFOPLIST_FILE = Helper/Info.plist;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
MARKETING_VERSION = 2.0.2;
|
||||
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
OTHER_CODE_SIGN_FLAGS = "";
|
||||
OTHER_LDFLAGS = (
|
||||
|
@ -418,14 +419,14 @@
|
|||
CODE_SIGN_ENTITLEMENTS = "";
|
||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
CURRENT_PROJECT_VERSION = 2.0.2;
|
||||
CURRENT_PROJECT_VERSION = 2.1.0;
|
||||
DEVELOPMENT_TEAM = VBG97UB4TA;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
|
||||
INFOPLIST_FILE = Helper/Info.plist;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
MARKETING_VERSION = 2.0.2;
|
||||
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
OTHER_CODE_SIGN_FLAGS = "";
|
||||
OTHER_LDFLAGS = (
|
||||
|
@ -454,16 +455,19 @@
|
|||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 2.0.2;
|
||||
CURRENT_PROJECT_VERSION = 2.1.0;
|
||||
DEVELOPMENT_TEAM = VBG97UB4TA;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
|
||||
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 = "";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
MARKETING_VERSION = 2.0.2;
|
||||
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
OTHER_CODE_SIGN_FLAGS = "";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight.installer";
|
||||
PRODUCT_NAME = "OverSight Installer";
|
||||
|
@ -480,16 +484,19 @@
|
|||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 2.0.2;
|
||||
CURRENT_PROJECT_VERSION = 2.1.0;
|
||||
DEVELOPMENT_TEAM = VBG97UB4TA;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../Carthage/Build/Mac";
|
||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
|
||||
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 = "";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
MARKETING_VERSION = 2.0.2;
|
||||
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||
MARKETING_VERSION = 2.1.0;
|
||||
OTHER_CODE_SIGN_FLAGS = "";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.objective-see.oversight.installer";
|
||||
PRODUCT_NAME = "OverSight Installer";
|
||||
|
@ -542,7 +549,7 @@
|
|||
GCC_WARN_UNUSED_LABEL = YES;
|
||||
GCC_WARN_UNUSED_PARAMETER = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
PROVISIONING_PROFILE = "";
|
||||
RUN_CLANG_STATIC_ANALYZER = YES;
|
||||
|
@ -592,7 +599,7 @@
|
|||
GCC_WARN_UNUSED_LABEL = YES;
|
||||
GCC_WARN_UNUSED_PARAMETER = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||
MACOSX_DEPLOYMENT_TARGET = 12.0;
|
||||
ONLY_ACTIVE_ARCH = NO;
|
||||
PROVISIONING_PROFILE = "";
|
||||
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" : [
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"filename" : "darkMode.png"
|
||||
"filename" : "darkMode.png",
|
||||
"idiom" : "mac"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"filename" : "lightMode.png",
|
||||
"appearances" : [
|
||||
{
|
||||
"appearance" : "luminosity",
|
||||
"value" : "light"
|
||||
}
|
||||
]
|
||||
],
|
||||
"filename" : "lightMode.png",
|
||||
"idiom" : "mac"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"filename" : "darkMode.png",
|
||||
"appearances" : [
|
||||
{
|
||||
"appearance" : "luminosity",
|
||||
"value" : "dark"
|
||||
}
|
||||
]
|
||||
],
|
||||
"filename" : "darkMode.png",
|
||||
"idiom" : "mac"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"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()];
|
||||
|
||||
//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?
|
||||
// enable 'uninstall' button
|
||||
// change 'install' button to say 'upgrade'
|
||||
if(YES == isInstalled)
|
||||
else if(YES == isInstalled)
|
||||
{
|
||||
//enable 'uninstall'
|
||||
self.uninstallButton.enabled = YES;
|
||||
|
|
|
@ -1,8 +1,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>
|
||||
<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"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
|
@ -96,7 +96,7 @@
|
|||
<point key="canvasLocation" x="216.5" y="-225.5"/>
|
||||
</window>
|
||||
<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"/>
|
||||
<subviews>
|
||||
<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"/>
|
||||
</box>
|
||||
<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"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="Support OverSight?" id="hLy-Nm-ajB">
|
||||
<font key="font" size="32" name="AvenirNextCondensed-Regular"/>
|
||||
|
@ -142,12 +142,12 @@
|
|||
</textFieldCell>
|
||||
</textField>
|
||||
<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"/>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="Love" id="KDa-FN-bji"/>
|
||||
</imageView>
|
||||
<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"/>
|
||||
<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"/>
|
||||
|
@ -155,42 +155,8 @@
|
|||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</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">
|
||||
<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"/>
|
||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Show some love? " id="Hvk-zS-1VC">
|
||||
<font key="font" size="40" name="AvenirNextCondensed-Regular"/>
|
||||
|
@ -198,16 +164,62 @@
|
|||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</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>
|
||||
<point key="canvasLocation" x="686" y="1350"/>
|
||||
<point key="canvasLocation" x="686" y="1393.5"/>
|
||||
</customView>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="FriendsFleet" width="236" height="96"/>
|
||||
<image name="FriendsJamf" width="328" height="114"/>
|
||||
<image name="FriendsKandji" width="500" height="127"/>
|
||||
<image name="FriendsKollide" width="636" height="216"/>
|
||||
<image name="FriendsKandji" width="1944" height="494"/>
|
||||
<image name="FriendsKolide" width="636" height="216"/>
|
||||
<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="Love" width="256" height="256"/>
|
||||
<image name="OverSight" width="1301" height="227"/>
|
||||
|
|
|
@ -1,8 +1,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>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication"/>
|
||||
|
|
|
@ -62,13 +62,13 @@
|
|||
#define SIGNING_AUTH @"Developer ID Application: Objective-See, LLC (VBG97UB4TA)"
|
||||
|
||||
//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
|
||||
#define PRODUCT_URL @"https://objective-see.com/products/oversight.html"
|
||||
#define PRODUCT_URL @"https://objective-see.org/products/oversight.html"
|
||||
|
||||
//error(s) url
|
||||
#define ERRORS_URL @"https://objective-see.com/errors.html"
|
||||
#define ERRORS_URL @"https://objective-see.org/errors.html"
|
||||
|
||||
//os major
|
||||
#define SUPPORTED_OS_MAJOR @"OSMajor"
|
||||
|
@ -134,6 +134,10 @@
|
|||
// icon mode
|
||||
#define PREF_NO_ICON_MODE @"noIconMode"
|
||||
|
||||
//prefs
|
||||
// no external devices mode
|
||||
#define PREF_NO_EXTERNAL_DEVICES_MODE @"noExternalDevicesMode"
|
||||
|
||||
//prefs
|
||||
// update mode
|
||||
#define PREF_NO_UPDATE_MODE @"noupdateMode"
|
||||
|
@ -142,7 +146,7 @@
|
|||
#define PREFS_ALLOWED_ITEMS @"allowedItems"
|
||||
|
||||
//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
|
||||
#define EXIT_CODE @"exitCode"
|
||||
|
@ -177,6 +181,9 @@
|
|||
//cmdline flag to uninstall
|
||||
#define ACTION_UNINSTALL @"-uninstall"
|
||||
|
||||
//uninstall via UI
|
||||
#define CMD_UNINSTALL_VIA_UI @"-uninstallViaUI"
|
||||
|
||||
//flag to uninstall
|
||||
#define ACTION_UNINSTALL_FLAG 0
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
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:
|
||||
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
|
||||
|
|