Compare commits

...

2 Commits

Author SHA1 Message Date
Patrick Wardle c5ae162dcd Update AVMonitor.m 2023-11-07 18:19:29 -10:00
Patrick Wardle 0c2436afcf improved status bar menu and notifications
camera off notification now includes which camera
device status now (re)enumerated when menu is opened
2023-11-07 17:48:37 -10:00
3 changed files with 33 additions and 61 deletions

View File

@ -89,15 +89,6 @@ extern os_log_t logHandle;
//per device events
self.deviceEvents = [NSMutableDictionary dictionary];
//enumerate active devices
// then update status menu (on main thread)
dispatch_async(dispatch_get_main_queue(), ^{
//update status menu
[((AppDelegate*)[[NSApplication sharedApplication] delegate]).statusBarItemController setActiveDevices:[self enumerateActiveDevices]];
});
//find built-in mic
self.builtInMic = [self findBuiltInMic];
@ -241,21 +232,6 @@ extern os_log_t logHandle;
return;
}
//(re)enumerate active devices
// delayed need as device deactiavation
// then update status menu (on main thread)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
//update on on main thread
dispatch_async(dispatch_get_main_queue(), ^{
//update status menu
[((AppDelegate*)[[NSApplication sharedApplication] delegate]).statusBarItemController setActiveDevices:[self enumerateActiveDevices]];
});
}); //dispatch for delay
}
}];
@ -314,21 +290,6 @@ extern os_log_t logHandle;
//save
self.lastCameraClient = pid;
//(re)enumerate active devices
// delayed need as device deactiavation
// then update status menu (on main thread)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
//update on on main thread
dispatch_async(dispatch_get_main_queue(), ^{
//update status menu
[((AppDelegate*)[[NSApplication sharedApplication] delegate]).statusBarItemController setActiveDevices:[self enumerateActiveDevices]];
});
}); //dispatch for delay
}
}];
@ -494,21 +455,7 @@ extern os_log_t logHandle;
[self processAttributions:newAudioAttributions newCameraAttributions:newCameraAttributions];
}//sync
//(re)enumerate active devices
// delayed need as device deactiavation
// then update status menu (on main thread)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
{
//update on on main thread
dispatch_async(dispatch_get_main_queue(), ^{
//update status menu
[((AppDelegate*)[[NSApplication sharedApplication] delegate]).statusBarItemController setActiveDevices:[self enumerateActiveDevices]];
});
}); //dispatch for delay
}];
}
@ -813,7 +760,7 @@ extern os_log_t logHandle;
//delay
// need time for logging to grab responsible process
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//client
Client* client = nil;
@ -914,7 +861,7 @@ bail:
}
//camera on?
// macOS 13.3, use this as trigger
// macOS 13.3+, use this as trigger
// older version send event via log monitor
if (@available(macOS 13.3, *)) {
@ -932,7 +879,7 @@ bail:
//delay
// need time for logging to grab responsible process
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//client
Client* client = nil;
@ -965,7 +912,7 @@ bail:
//init event
// process (client) and device are nil
event = [[Event alloc] init:nil device:nil deviceType:Device_Camera state:NSControlStateValueOff];
event = [[Event alloc] init:nil device:device deviceType:Device_Camera state:NSControlStateValueOff];
//handle event
[self handleEvent:event];
@ -1363,13 +1310,13 @@ bail:
//ignore if last event was same state
if( (deviceLastEvent.state == event.state) &&
([event.timestamp timeIntervalSinceDate:deviceLastEvent.timestamp] < 2.0f) )
([event.timestamp timeIntervalSinceDate:deviceLastEvent.timestamp] < 1.0f) )
{
//set result
result = NOTIFICATION_SPURIOUS;
//dbg msg
os_log_debug(logHandle, "ignoring event as it was same state as last (%ld), and happened <2.0s ago", (long)event.state);
os_log_debug(logHandle, "ignoring event as it was same state as last (%ld), and happened <1.0s ago", (long)event.state);
//bail
goto bail;

View File

@ -10,7 +10,7 @@
@import Cocoa;
@interface StatusBarItem : NSObject <NSPopoverDelegate>
@interface StatusBarItem : NSObject <NSPopoverDelegate, NSMenuDelegate>
{
}

View File

@ -89,6 +89,9 @@ enum menuItems
//set menu
self.statusItem.menu = menu;
//set delegate
self.statusItem.menu.delegate = self;
//set action handler for all menu items
for(int i=toggle; i<end; i++)
{
@ -445,4 +448,26 @@ bail:
return;
}
//menu delegate method
// menu will open: update active devices
-(void)menuWillOpen:(NSMenu *)menu
{
//av monitor
AVMonitor* avMonitor = nil;
//status bar item controller
StatusBarItem* statusBarItemController = nil;
//grab
avMonitor = ((AppDelegate*)[[NSApplication sharedApplication] delegate]).avMonitor;
//grab
statusBarItemController = ((AppDelegate*)[[NSApplication sharedApplication] delegate]).statusBarItemController;
//enumerate and update
[statusBarItemController setActiveDevices:[avMonitor enumerateActiveDevices]];
return;
}
@end