Hallo lieber Leser,
in den letzten Tagen sah ich einige Videos des Youtuber’s bisqwit und war sehr angetan von seinem Editor E. Dieser selbst entwickelte Editor hatte nämlich diesen kleinen Mario in der Menuleiste. Ein kleines Detail welches ich auch unter OS X haben wollte.
Leider gibt es kaum Wege, OS X großartig zu modifizieren und auch zukünftige Versionen von OS X erschweren dies zunehmend. Jüngst wurde das Projekt Flavours von Interacto Labs Inc. aufgegeben, da El Capitan das eingreifen in Systemdateien in Übermaßen erschwert.
Nichtsdestotrotz möchte auch ich nicht in einem total einheitlichen System leben und bin froh, ein wenig aus der Masse herauszubrechen.
Aus diesem Grunde suchte ich nach Möglichkeiten und Wegen diesen kleinen Mario auch bei mir herum laufen zu lassen. Heraus kam dabei MarioMeetsMenuBar.
MarioMeetsMenuBar
Diese kleine App, so sinnlos und ablenkend wie sie für viele nur sein kann, zaubert einen kleinen Mario auf die Menüleiste von OS X. Hierbei läuft Mario den ganzen lieben Tag nur von links nach rechts. Später vielleicht auch mal wieder zurück =)
Die Applikation läuft bei mir nun seit mehr als 2 Tagen permanent und ich bekomme Mario während meiner normalen Arbeit kaum noch mit. Umso schöner und begeisterter bin ich, wenn ich in Phasen der Langeweile nach oben schaue und ihn flitzen sehe.
Stolpersteine in der Entwicklung
Einer meiner größten Hürden war es heraus zu finden, wie ich ein Fenster über der Menubar platzieren kann. Mir ist bekannt, dass es verschiedene level für NSWindow gibt mit denen ich die Präsenz steuern kann. Leider war ich zu doof, diesen Level korrekt zu setzen in Swift und dies kostete mich sicherlich 4-6 Stunden.
Performance und Animationen
Zudem hatte ich mit Problemen bei der Performance zu kämpfen. Mir war zunächst kein Weg bekannt, den Frame eines NSImageView mit einer CABasicAnimation zu verschieben ohne dabei hässliche Nebeneffekte wie Verzerrungen zu vermeiden. Daher entschloss ich mich, zunächst einen NSAnimationContext für das Frame verschieben zu nutzen. Leider habe ich hierdurch eine CPU Auslastung von 5% auf meinem i7 2.6GHz gehabt. Ausserdem lag der Energy Impact bei Low. Für eine so billige Animation mit 2 Bildern überhaupt nicht vertretbar! Mit viel Spielerei und dem Probieren von vielen Techniken habe ich dann einen eleganten Weg gefunden meinen Frame ebenfalls mit einer CABasicAnimation zu verschieben. Die schönen Nebeneffekte waren neben der Verringerung der CPU Last auf 0%,dass ich meine Animationen jetzt gruppieren konnte. Damit sind die Animationen nicht nur besser zu kontrollieren, mit nur einem Befehl und ohne hick-hack kann ich die Animationen auch stoppen und entfernen.
Um die Bilder für die Laufanimation zu wechseln, benutzte ich von Anfang an eine CAKeyFrameAnimation . Leider sind die im Projekt genutzten Sprites nicht alle 32×32, daher kann Mario ein wenig aufgebläht beim laufen wirken. Ich empfand es aber als nicht so wild.
Auflösungsänderungen und Workspace-Wechsel
Das Verändern von Auflösungen während der Animation ist etwas sehr Unschönes. Nicht nur, dass Mario plötzlich irgendwo rum läuft, kann es beim Wechsel des Workspaces vorkommen, dass er gänzlich verschwindet. Aber das kann und wird passieren, wenn ein Benutzer die Applikation nutzt. Hierbei reicht es nur ein Spiel zu starten oder den Desktop zu wechseln.
Glücklicherweise gibt es im NSAppDelegate die Methode applicationDidChangeScreenParameters die im Falle einer Auflösungsänderung aufgerufen wird. Nicht so einfach war jedoch der Fall, wenn man den Workspace geändert hat mit Mission Control. Zunächst muss man für das NSWindow ein collectionBehavior festlegen, welches definiert, was im Fall eines Wechsels der Workspaces passiert. In meinem Fall soll die App auf jedem Workspace verschoben werden. Ausserdem muss man das richtige level für NSWindow finden, damit nach einem Wechsel Mario fleißig weiter flitzt.
App-Größe
Mit 4,3MB ist die App nicht wirklich schlank. Grund ist leider, wie bei allen Apps mit Swift, dass die Swift Runtime immer noch in das App Bundle mit beigelegt wird. Dieses macht immerhin 3,9MB aus! Für viele sind 4,3MB geradezu lächerlich, aber da ich in einer Zeit mit wenig Speicher begonnen habe, ist es mir immer noch wichtig, meine Apps schmal zu halten.
Limitierungen
Aktuell kann Mario noch nicht auf mehreren Workspaces in der Menubar laufen.
Diese App kann nur mit Xcode 6.3+ unter OS X 10.10 kompiliert werden. Die Ausführung der App ist erst ab OS X 10.10 möglich.
Download
Dieses Projekt ist Open Source und steht zum freien Download. Den Quelltext bekommt ihr von Github und Version 1.0.1 könnt ihr über die folgenden Links herunterladen. Die Lizenz für dieses Projekt ist die MIT Lizenz. Ausgenommen davon sind nur die Grafiken Dritter (siehe Readme).
Empfohlen zur Installation ist der App Download. Dieser enthält einen Installer und einen Uninstaller. Zusätzlich installiert dieser ein Preference Pane in die Systemeinstellungen, worüber die App gekillt werden kann. Ausserdem findet ihr eine Checkbox mit der die App automatisch beim einloggen gestartet werden kann.
Github Projektseite App Download v1.0.1
Viel Spaß und 1up!
Foto: Flickr – Mike Schmid – CC2.0
2 Comments
Vielen Dank für diese witzige App!
Geniale Idee und sehr gute Umsetzung! 😀