Skip to content

Commit

Permalink
fix(client/cordova/apple/macos): fix popover click and location issues (
Browse files Browse the repository at this point in the history
#1845)

* chore(www): upgrade `server-list` to Lit

* Fix the "floating" location of the popover on initial load.

* Use the `NSPopover`'s native behavior to close the popover for us, instead of assuming responsibility for closing the popover in the app.
  • Loading branch information
sbruens authored Feb 22, 2024
1 parent 93f2ecd commit 3bf9d6d
Showing 1 changed file with 11 additions and 8 deletions.
19 changes: 11 additions & 8 deletions src/cordova/apple/xcode/macos/Outline/Classes/AppDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -85,16 +85,10 @@ - (void)applicationDidFinishLaunching:(NSNotification*)aNotification {
self.statusItem.button.action = @selector(togglePopover);
[self setAppIcon:@"StatusBarButtonImage"];
self.popover = [[NSPopover alloc] init];
self.popover.behavior = NSPopoverBehaviorTransient;
self.popover.contentViewController = [[NSViewController alloc] initWithNibName:@"MainViewController"
bundle:[NSBundle mainBundle]];
self.popover.contentViewController.view = self.window.contentView;
// Monitor clicks outside the popover in order to close it.
NSEventMask eventMask = NSEventMaskLeftMouseDown|NSEventMaskRightMouseDown;
self.eventMonitor = [[EventMonitor alloc] initWithMask:eventMask handler:^(NSEvent* event) {
if (self.popover.isShown) {
[self closePopover];
}
}];

if ([self wasStartedByLauncherApp]) {
[OutlineVpn.shared startLastSuccessfulTunnel:^(enum ErrorCode errorCode) {
Expand All @@ -103,7 +97,16 @@ - (void)applicationDidFinishLaunching:(NSNotification*)aNotification {
}
}];
} else {
[self showPopover];
// The rendering of the popover is relative to the app's status item in the status bar.
// Even though we've already created the status bar above, the popover is being created
// before the status item has been rendered in the UI. This causes the initial popover
// load to be "floating" and ends up aligned at the bottom of the screen. For this initial
// load we add a small artificial delay to prevent that from happening.
double delayInSeconds = 0.5;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self showPopover];
});
}
[self setAppLauncherEnabled:true]; // Enable app launcher to start on boot.
}
Expand Down

0 comments on commit 3bf9d6d

Please sign in to comment.