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.

Mario walking

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).

MarioMeetsMenuBar App Preview
Natürlich läuft Mario in der App linearer, das GIF sollte nur eine kleine Demonstration sein.

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

Previous post

Xcode Retro Theme

Next post

Zweite Auflage und Swift 2.0

The Author

Stefan Mayer-Popp

Stefan Mayer-Popp

Stefan Mayer-Popp ist leidenschaftlicher Softwareentwickler, Fachbuchautor, Trainer und Berater aus dem Münchner Umland. Als passionierter IT- und Apple-Profi hat Mayer-Popp unzählige IT-Projekte in verschiedensten Branchen erfolgreich umsetzen und unterstützen können. Neben seiner Tätigkeit als Teamleiter bei CHECK24 teilt Mayer-Popp seine Erfahrungen auf IT-Veranstaltungen und propagiert Swift aktiv auf verschiedenen Meetups.

2 Comments

  1. 28. Juli 2015 at 8:48 — Antworten

    Vielen Dank für diese witzige App!

  2. M4RWiN
    30. August 2015 at 17:39 — Antworten

    Geniale Idee und sehr gute Umsetzung! 😀

Leave a reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.