From a046ba902236ac1f1a7bea34268a707797345cd9 Mon Sep 17 00:00:00 2001 From: hensm Date: Fri, 26 Jul 2019 03:39:13 +0100 Subject: [PATCH] Add options checks for waitForConnection and closeIfFocusLost --- .../AppDelegate.swift | 6 ++++-- .../models/InitData.swift | 2 ++ ext/src/createShim.ts | 10 +++++++++- ext/src/lib/options.ts | 2 +- .../NativeMacReceiverSelector.ts | 18 +++++++++++++++--- .../PopupReceiverSelector.ts | 14 +++++++++++--- 6 files changed, 42 insertions(+), 10 deletions(-) diff --git a/app/NativeMacReceiverSelector/AppDelegate.swift b/app/NativeMacReceiverSelector/AppDelegate.swift index f461cff..43b26bf 100644 --- a/app/NativeMacReceiverSelector/AppDelegate.swift +++ b/app/NativeMacReceiverSelector/AppDelegate.swift @@ -10,7 +10,7 @@ class AppDelegate : NSObject, NSApplicationDelegate { func applicationDidFinishLaunching (_ aNotification: Notification) { - if (CommandLine.argc < 2) { + if CommandLine.argc < 2 { fputs("Error: Not enough args\n", stderr) exit(1) } @@ -59,7 +59,9 @@ class AppDelegate : NSObject, NSApplicationDelegate { } func applicationDidResignActive (_ aNotification: Notification) { - self.mainWindow?.performClose(aNotification) + if self.initData.closeIfFocusLost { + self.mainWindow?.performClose(aNotification) + } } func applicationShouldTerminateAfterLastWindowClosed ( diff --git a/app/NativeMacReceiverSelector/models/InitData.swift b/app/NativeMacReceiverSelector/models/InitData.swift index 7bec638..e616e75 100644 --- a/app/NativeMacReceiverSelector/models/InitData.swift +++ b/app/NativeMacReceiverSelector/models/InitData.swift @@ -3,6 +3,8 @@ struct InitData : Codable { let defaultMediaType: MediaType let availableMediaTypes: Int + let closeIfFocusLost: Bool + let windowPositionX: Int let windowPositionY: Int diff --git a/ext/src/createShim.ts b/ext/src/createShim.ts index 7331d31..5d20752 100644 --- a/ext/src/createShim.ts +++ b/ext/src/createShim.ts @@ -129,9 +129,17 @@ export default async function createShim ( break; } + /** + * TODO: If we're closing a selector, make sure it's the + * same one that caused the session creation. + */ case "main:/sessionCreated": { const selector = await SelectorManager.getSharedSelector(); - if (selector.isOpen) { + + const shouldClose = await options.get( + "receiverSelectorWaitForConnection"); + + if (selector.isOpen && shouldClose) { selector.close(); } diff --git a/ext/src/lib/options.ts b/ext/src/lib/options.ts index bda10db..56c0b5d 100644 --- a/ext/src/lib/options.ts +++ b/ext/src/lib/options.ts @@ -2,7 +2,7 @@ import defaultOptions from "../defaultOptions"; -import { ReceiverSelectorType } from "../receiver_selectors"; +import { ReceiverSelectorType } from "../receiver_selectors/"; import { Message } from "../types"; import { TypedEventTarget } from "./typedEvents"; diff --git a/ext/src/receiver_selectors/NativeMacReceiverSelector.ts b/ext/src/receiver_selectors/NativeMacReceiverSelector.ts index e78e193..34b46ba 100644 --- a/ext/src/receiver_selectors/NativeMacReceiverSelector.ts +++ b/ext/src/receiver_selectors/NativeMacReceiverSelector.ts @@ -83,6 +83,9 @@ export default class NativeMacReceiverSelector const openerWindow = await browser.windows.getCurrent(); const centeredProps = getWindowCenteredProps(openerWindow, 350, 0); + const closeIfFocusLost = await options.get( + "receiverSelectorCloseIfFocusLost"); + this.bridgePort.postMessage({ subject: "bridge:/receiverSelector/open" , data: JSON.stringify({ @@ -90,6 +93,8 @@ export default class NativeMacReceiverSelector , defaultMediaType , availableMediaTypes + , closeIfFocusLost + , windowPositionX: centeredProps.left , windowPositionY: centeredProps.top @@ -118,20 +123,27 @@ export default class NativeMacReceiverSelector } - private onBridgePortMessageSelected ( + private async onBridgePortMessageSelected ( message: NativeReceiverSelectorSelectedMessage) { + this.wasReceiverSelected = true; + this.dispatchEvent(new CustomEvent("selected", { detail: message.data })); + + if (!(await options.get("receiverSelectorWaitForConnection"))) { + this.close(); + } } - private onBridgePortMessageError ( + private async onBridgePortMessageError ( message: NativeReceiverSelectorErrorMessage) { + this.dispatchEvent(new CustomEvent("error")); } - private onBridgePortMessageClose ( + private async onBridgePortMessageClose ( message: NativeReceiverSelectorCloseMessage) { if (!this.wasReceiverSelected) { diff --git a/ext/src/receiver_selectors/PopupReceiverSelector.ts b/ext/src/receiver_selectors/PopupReceiverSelector.ts index dca46f3..8b110e9 100644 --- a/ext/src/receiver_selectors/PopupReceiverSelector.ts +++ b/ext/src/receiver_selectors/PopupReceiverSelector.ts @@ -4,6 +4,8 @@ import ReceiverSelector, { ReceiverSelectorEvents , ReceiverSelectorMediaType } from "./ReceiverSelector"; +import options from "../lib/options"; + import { TypedEventTarget } from "../lib/typedEvents"; import { getWindowCenteredProps } from "../lib/utils"; import { Message, Receiver } from "../types"; @@ -107,9 +109,15 @@ export default class PopupReceiverSelector ...centeredProps }); - // Add focus listener - browser.windows.onFocusChanged.addListener( - this.onWindowsFocusChanged); + + const closeIfFocusLost = await options.get( + "receiverSelectorCloseIfFocusLost"); + + if (closeIfFocusLost) { + // Add focus listener + browser.windows.onFocusChanged.addListener( + this.onWindowsFocusChanged); + } } public async close (): Promise {