diff --git a/app/NativeMacReceiverSelector/AppDelegate.swift b/app/NativeMacReceiverSelector/AppDelegate.swift index aa2e50c..f461cff 100644 --- a/app/NativeMacReceiverSelector/AppDelegate.swift +++ b/app/NativeMacReceiverSelector/AppDelegate.swift @@ -2,21 +2,47 @@ import Cocoa class AppDelegate : NSObject, NSApplicationDelegate { + var initData: InitData! + var mainWindow: NSWindow? var mainWindowController: NSWindowController? var mainWindowViewController: ViewController? func applicationDidFinishLaunching (_ aNotification: Notification) { + if (CommandLine.argc < 2) { + fputs("Error: Not enough args\n", stderr) + exit(1) + } + + guard let data = CommandLine.arguments[1].data(using: .utf8) else { + fputs("Error: Failed to convert input to data\n", stderr) + exit(1) + } + + do { + // Decode and store initialization JSON data + self.initData = try JSONDecoder().decode(InitData.self, from: data) + } catch { + fputs("Error: Failed to parse input data\n", stderr) + exit(1) + } + + let window = NSWindow( contentRect: NSZeroRect , styleMask: [ .titled, .closable ] , backing: .buffered , defer: false) + let screenHeight = NSScreen.main!.frame.height + window.titleVisibility = .hidden + window.isMovableByWindowBackground = true window.orderFrontRegardless() - window.center() + window.setFrameTopLeftPoint(NSPoint( + x: self.initData.windowPositionX + , y: Int(screenHeight - CGFloat(self.initData.windowPositionY)))) let windowController = NSWindowController(window: window) windowController.showWindow(window) diff --git a/app/NativeMacReceiverSelector/ViewController.swift b/app/NativeMacReceiverSelector/ViewController.swift index a09dd30..6512102 100644 --- a/app/NativeMacReceiverSelector/ViewController.swift +++ b/app/NativeMacReceiverSelector/ViewController.swift @@ -21,24 +21,7 @@ class ViewController : NSViewController { override func viewDidLoad () { super.viewDidLoad() - if (CommandLine.argc < 2) { - fputs("Error: Not enough args\n", stderr) - exit(1) - } - - guard let data = CommandLine.arguments[1].data(using: .utf8) else { - fputs("Error: Failed to convert input to data\n", stderr) - exit(1) - } - - do { - // Decode and store initialization JSON data - self.initData = try JSONDecoder().decode(InitData.self, from: data) - } catch { - fputs("Error: Failed to parse input data\n", stderr) - exit(1) - } - + self.initData = (NSApplication.shared.delegate as! AppDelegate).initData /** * View Hierarchy diff --git a/app/NativeMacReceiverSelector/models/InitData.swift b/app/NativeMacReceiverSelector/models/InitData.swift index 647aad7..7bec638 100644 --- a/app/NativeMacReceiverSelector/models/InitData.swift +++ b/app/NativeMacReceiverSelector/models/InitData.swift @@ -3,6 +3,9 @@ struct InitData : Codable { let defaultMediaType: MediaType let availableMediaTypes: Int + let windowPositionX: Int + let windowPositionY: Int + let i18n_extensionName: String let i18n_castButtonTitle: String let i18n_mediaTypeApp: String diff --git a/ext/src/receiver_selectors/NativeMacReceiverSelector.ts b/ext/src/receiver_selectors/NativeMacReceiverSelector.ts index c6bc071..488cd65 100644 --- a/ext/src/receiver_selectors/NativeMacReceiverSelector.ts +++ b/ext/src/receiver_selectors/NativeMacReceiverSelector.ts @@ -6,6 +6,7 @@ import options from "../lib/options"; import ReceiverSelector, { ReceiverSelectorMediaType } from "./ReceiverSelector"; +import { getWindowCenteredProps } from "../lib/utils"; import { Message, Receiver } from "../types"; import { NativeReceiverSelectorCloseMessage @@ -58,6 +59,11 @@ export default class NativeMacReceiverSelector this.bridgePortDisconnected = true; }); + + // Current window to base centered position on + const openerWindow = await browser.windows.getCurrent(); + const centeredProps = getWindowCenteredProps(openerWindow, 350, 0); + this.bridgePort.postMessage({ subject: "bridge:/receiverSelector/open" , data: JSON.stringify({ @@ -65,6 +71,9 @@ export default class NativeMacReceiverSelector , defaultMediaType , availableMediaTypes + , windowPositionX: centeredProps.left + , windowPositionY: centeredProps.top + , i18n_extensionName: _("extensionName") , i18n_castButtonTitle: _("popupCastButtonTitle") , i18n_mediaTypeApp: _("popupMediaTypeApp")