Adapter für alles inklusive Browser, AppleScript für Spotify und Musik, Medientasten als letzte Reserve. Die Reihenfolge ist keine Vorliebe, sondern Absicherung: Apple hat die Now-Playing-Schnittstelle in macOS 15.4 schon einmal zugemacht. Fällt der Adapter aus, verliert das Widget seine Anzeige — aber nicht seine Funktion. Deshalb bleiben die Transporttasten auch dann bedienbar, wenn gar keine Metadaten da sind. Der Fortschritt zählt zwischen den Ereignissen selbst hoch. Spike B hatte gezeigt, dass elapsedTime nicht laufend nachgeliefert wird: ein Scrubber, der stur den letzten Wert anzeigt, steht still, während der Titel läuft. Gerechnet wird aus asOf und playbackRate, begrenzt auf die Titellänge — sonst zeigt die Anzeige nach dem Ende weiter steigende Zahlen. Teilmeldungen (diff = true) ergänzen den Stand, statt ihn zu ersetzen. Eine Meldung mit nur der Position würde sonst Titel, Interpret und Cover löschen. In AnyDecodable wird Bool vor Double geprüft. Andernfalls wird "playing": true zu 1 und die Wiedergabe gilt für immer als angehalten. Play/Pause schaltet sofort um, statt auf das nächste Ereignis zu warten. Ein Knopf, der eine halbe Sekunde später reagiert, fühlt sich kaputt an; das echte Ereignis korrigiert den Stand ohnehin. Der Adapter liegt als Quellcode unter Vendor/ (BSD-3, Stand in ONYX-VERSION.txt) und wird beim Bauen kompiliert, statt als fertige Binary eingecheckt zu werden. Er wird bewusst nicht gelinkt: geladen wird er von /usr/bin/perl, im eigenen Prozess greift Apples Entitlement-Prüfung. 124 Tests grün.
50 lines
1.1 KiB
YAML
50 lines
1.1 KiB
YAML
---
|
|
BasedOnStyle: LLVM
|
|
IndentWidth: 4
|
|
---
|
|
Language: Cpp
|
|
AccessModifierOffset: -4
|
|
PointerAlignment: Left
|
|
BreakBeforeBraces: Custom
|
|
BraceWrapping:
|
|
AfterCaseLabel: false
|
|
AfterClass: true
|
|
AfterControlStatement: Never
|
|
AfterEnum: true
|
|
AfterFunction: true
|
|
AfterNamespace: true
|
|
AfterStruct: true
|
|
AfterUnion: true
|
|
AfterExternBlock: false
|
|
BeforeCatch: true
|
|
AlignAfterOpenBracket: DontAlign
|
|
Cpp11BracedListStyle: false
|
|
IncludeBlocks: Regroup
|
|
IncludeCategories:
|
|
- Regex: "<httplib\\.h>"
|
|
Priority: 3
|
|
- Regex: "<[^Q][[:alnum:]_.]+>"
|
|
Priority: 1
|
|
- Regex: "<Q.+>"
|
|
Priority: 2
|
|
- Regex: "<[^Q].+>"
|
|
Priority: 3
|
|
- Regex: ".*"
|
|
Priority: 4
|
|
SeparateDefinitionBlocks: Always
|
|
AllowShortLambdasOnASingleLine: Empty
|
|
AlwaysBreakTemplateDeclarations: true
|
|
AlignOperands: DontAlign
|
|
AlignEscapedNewlines: Left
|
|
BinPackParameters: true
|
|
AlignTrailingComments:
|
|
Kind: Never
|
|
---
|
|
Language: JavaScript
|
|
SpacesInContainerLiterals: false
|
|
JavaScriptQuotes: Single
|
|
JavaScriptWrapImports: true
|
|
---
|
|
# Notes:
|
|
# Designated initializer list formatting: Write a ',' after the last item.
|