From b34d1ceccf89dc131728a2b3fef9f006219a48be Mon Sep 17 00:00:00 2001 From: Mark Gregory Date: Fri, 23 Oct 2026 10:56:12 +0100 Subject: [PATCH] updates to launcer --- .../oriontoolbar_fix_services_foreground.py | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 patches/oriontoolbar_fix_services_foreground.py diff --git a/patches/oriontoolbar_fix_services_foreground.py b/patches/oriontoolbar_fix_services_foreground.py new file mode 100644 index 0000000..c09fb0d --- /dev/null +++ b/patches/oriontoolbar_fix_services_foreground.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +from pathlib import Path +from datetime import datetime +import shutil + +root = Path.cwd() +controller = root / 'OrionToolbar/OrionVMController.swift' +view = root / 'OrionToolbar/OrionMenuView.swift' +if not controller.exists() or not view.exists(): + raise SystemExit('Run from the OrionToolbar project root. No changes made.') +c = controller.read_text() +v = view.read_text() + +# Verify all expected anchors before writing anything. +checks = [ + (c, 'await discoverVMs()\n await refreshAll()', 1), + (c, 'await self.discoverVMs(); await self.refreshAll()', 1), + (c, 'func refreshServiceAvailability() async {', 1), + (c, 'func openSSH(_ s: ServerDefinition) {', 1), + (c, 'func openMailpit(_ s: ServerDefinition) { if let p = s.mailpitPort, let url = URL(string: "http://\\(s.host):\\(p)") { NSWorkspace.shared.open(url) } }', 1), + (v, 'if !server.host.isEmpty && !server.sshUser.isEmpty {', 2), + (v, 'if !server.host.isEmpty && server.mailpitPort != nil {', 2), +] +for src, anchor, count in checks: + if src.count(anchor) != count: + raise SystemExit(f'Expected {count} occurrence(s) of {anchor!r}, found {src.count(anchor)}. No changes made.') + +c = c.replace('await discoverVMs()\n await refreshAll()', 'await discoverVMs()\n await refreshAll()\n await refreshServiceAvailability()', 1) +c = c.replace('await self.discoverVMs(); await self.refreshAll()', 'await self.discoverVMs(); await self.refreshAll(); await self.refreshServiceAvailability()', 1) + +# Dismiss the menu bar panel before activating external apps. This must happen +# at the click site; delayed activation alone leaves the panel in front. +helper = ''' private func dismissMenuPanelAndActivate(_ application: NSRunningApplication?) { + NSApp.keyWindow?.orderOut(nil) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { + application?.activate(options: [.activateAllWindows]) + } + } + +''' +if 'private func dismissMenuPanelAndActivate(' not in c: + c = c.replace(' func openSSH(_ s: ServerDefinition) {', helper + ' func openSSH(_ s: ServerDefinition) {', 1) + +old = ''' NSWorkspace.shared.open([scriptURL], withApplicationAt: terminalURL, configuration: configuration) { _, error in + Task { @MainActor in + if let error { self.lastError = "Could not open Terminal: \\(error.localizedDescription)" } + } + }''' +new = ''' NSApp.keyWindow?.orderOut(nil) + NSWorkspace.shared.open([scriptURL], withApplicationAt: terminalURL, configuration: configuration) { app, error in + Task { @MainActor in + if let error { + self.lastError = "Could not open Terminal: \\(error.localizedDescription)" + } else { + self.dismissMenuPanelAndActivate(app) + } + } + }''' +if c.count(old) != 1: + raise SystemExit('SSH open completion differs from expected. No changes made.') +c = c.replace(old, new, 1) + +old_mail = ' func openMailpit(_ s: ServerDefinition) { if let p = s.mailpitPort, let url = URL(string: "http://\\(s.host):\\(p)") { NSWorkspace.shared.open(url) } }' +new_mail = ''' func openMailpit(_ s: ServerDefinition) { + guard let port = s.mailpitPort, + let url = URL(string: "http://\\(s.host):\\(port)") else { return } + NSApp.keyWindow?.orderOut(nil) + NSWorkspace.shared.open(url) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) { + if let browser = NSWorkspace.shared.frontmostApplication, + browser.bundleIdentifier != Bundle.main.bundleIdentifier { + browser.activate(options: [.activateAllWindows]) + } + } + }''' +c = c.replace(old_mail, new_mail, 1) + +v = v.replace('if !server.host.isEmpty && !server.sshUser.isEmpty {', 'if !server.host.isEmpty && !server.sshUser.isEmpty && vm.reachableSSH.contains(server.id) {') +v = v.replace('if !server.host.isEmpty && server.mailpitPort != nil {', 'if !server.host.isEmpty && server.mailpitPort != nil && vm.reachableMailpit.contains(server.id) {') + +backup = root / 'backups' / ('service-foreground-' + datetime.now().strftime('%Y%m%d-%H%M%S')) +for path, content in [(controller, c), (view, v)]: + dest = backup / path.relative_to(root) + dest.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(path, dest) + path.write_text(content) + print('Updated:', path.relative_to(root)) +print('Backup:', backup)