Eine Statusbar-App für Mac OS X mittels Mono und Xamarin Studio entwickeln

Bei Mac OS X befindet sich oben am Bildschirmrand die Menü- und Statusbar. In diesem Artikel soll es darum gehen, eine solche Statusbar-App in Mono mittels des Xamarin Studios zu erstellen. Im ersten Schritt wird dazu ein neues MonoMac-Projekt im Xamarin-Studio angelegt. Wenn man dieses Projekt startet, findet man ein leeres Mac OS X-Fenster vor.

Ein neues MonoMac Projekt wird angelegt

Ein neues MonoMac Projekt wird angelegt

In dem neu angelegten Projekt wird eine neue Klasse mit dem Namen AppController angelegt. Diese wird mit folgendem Inhalt gefüllt:

using System;
using MonoMac.Foundation;
using MonoMac.AppKit;

namespace StatusBarApp
{
    [Register("AppController")]
    public partial class AppController : NSObject
    {
        public AppController()
        {
        }

        public override void AwakeFromNib()
        {
            var statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem(30);
            statusItem.Menu = statusMenu;
            statusItem.Image = NSImage.ImageNamed("status");
            statusItem.HighlightMode = true;

            mcQuit.Activated+=(object sender, EventArgs e) =>
            {
                NSApplication.SharedApplication.Terminate(this);
            };
        }
    }
}

Damit die Anwendung kein Menü und kein Dock-Icon mehr besitzt, müssen wir die Info.plist bearbeiten. In dieser Datei muss ein neuer Schlüssel mit dem Namen Application is agent (UIElement) und dem Typ Boolean angelegt werden. Der Wert des neuen Schlüssels wird dabei auf YES gesetzt.

Der neue Schlüssel wird mit dem PList-Editor des Xamarin Studios hinzugefügt

Der neue Schlüssel wird mit dem PList-Editor des Xamarin Studios hinzugefügt

Nun öffnen wir die Datei MainMenu.xib, welche von Xamarin Studio in Xcode geöffnet wird. Hier ziehen wir ein neues Objekt vom Typ Menu in den Designer und entfernen alle Einträge bis auf einen. Dem verbliebenen Eintrag geben wir die Beschriftung Quit. Anschließend fügen wir ein Object hinzu und begeben uns in den Identity Inspector. Dort tragen wir bei Custom Class unter Class den Namen AppController ein. Das vorhandene Hauptmenü kann anschließend entfernt werden.

Das Design unter Xcode

Das Design unter Xcode

Nun muss das Menü mit dem Quellcode verbunden werden, dazu wird der Assistance Editor in Xcode geöffnet. Als Quelltext wird auf der rechten Seite des Editors die Datei AppController.h ausgewählt. Nun wird das Menü mittels gedrückter Steuerungstaste (Strg/Ctrl) in die Headerdatei gezogen. Damit legen wir ein Outlet an. Dieses bekommt den Namen statusMenu. Das gleiche wird anschließend mit dem Menüeintrag Quit gemacht. In diesem Fall wird dabei eine Action definiert, welche den Namen mcQuit bekommt. Nun kann Xcode wieder geschlossen werden.

Dem Projekt muss nun noch eine 29×22 Pixel große Grafik hinzugefügt werden. Die Grafik (in diesem Fall status.png) wird beim Laden als Icon für die Statusleiste genutzt. Als letzten Schritt können die Dateien MainWindow.cs, MainWindow.xib und MainWindowController.cs entfernt werden. Nachdem diese Objekte auch im AppDelegate entfernt wurden, ist die Anwendung fertig. Der Quelltext des Projektes kann sich auch heruntergeladen werden. Er kann dabei von jedermann frei verwendet (Public Domain) werden.

Search and Replace

Manchmal ist es nötig unter WordPress bestimmte Dinge in der gesamten Datenbasis zu ändern. Hierbei kann es sich um eine geänderte URL, einen geänderten Projektnamen oder ähnliches handeln. Natürlich macht es nun kein Spaß alle Seiten und Beiträge zu durchsuchen. Bei größeren Blogs und Webseiten können durchaus einige tausend Beiträge vorhanden sein.

Ein Teil der Nutzeroberfläche von Search and Replace

Ein Teil der Nutzeroberfläche von Search and Replace

Hier steht das Plugin Search and Replace hilfreich zur Seite. Mit Hilfe dieses Plugins ist es möglich bestimmte Ausdrücke systemweit zu ersetzen. Natürlich sollte man bei so einem mächtigen Tool vorsichtig sein und es nur nach einem Backup der WordPress-Datenbank nutzen. Bezogen werden kann das Plugin direkt über die Pluginverwaltung sowie über das Plugin Repository. Lizenziert ist Search and Replace unter der GPL und damit freie Software.

Templates für Init-Skripte

Wenn man ein Init-Skript schreibt, kann man natürlich jedesmal von Neuem beginnen. Einfacher ist es wenn man sich eines Templates bedient. Felix H. Dahlke stellt ein solches bereit. Bei diesem Template muss nur noch das Verzeichnis der Anwendung, der Nutzername und das Kommando selbst definiert werden. Der Rest wird vom Template bereitgestellt. Nachdem man sich auf Basis des Templates ein passendes Skript unter /etc/init.d/ definiert hat, muss das ganze nur noch mit den passenden Attributen versehen werden und, auf Wunsch zu den defaults hinzugefügt werden:

chmod a+x /etc/init.d/newservice
update-rc.d newservice defaults

Lizenziert ist das Template unter der MIT-Lizenz und damit freie Software. Denn passenden Template-Quellcode findet man auf GitHub.

Geforktes Git-Repository vom Original aktualisieren

Auf Plattformen wie GitHub ist es ganz einfach bestehende Projekte zu forken, sie bei sich weiterzuentwickeln und die Änderungen an das Original-Projekt zurückzugeben. Ein klein wenig komplizierter ist es das geforkte Git-Repository wieder vom Original aus zu aktualisieren. Im ersten Schritt muss dabei im geforkten Repository ein Upstream definiert werden. Dies geschieht im Terminal mit dem Befehl (in diesem Falle auf GitHub bezogen):

git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git

Mittels des Befehls git remote -v kann anschließend überprüft werden ob der Eintrag vorgenommen wurde. Nun können die Änderungen vom Remote upstream in das lokale Git-Repository mittels:

git pull upstream master

übernommen werden. Anschließend kann man das ganze noch mittels git push auf den entfernten Server übertragen.