macos
Swift
EasterEgg

俺も自作のMac用アプリにイースターエッグを入れたい!!

tl;dr

自作のmacOS用のアプリケーションに秘密のモードをつけてワクワクした人向けの記事です。

秘密のキーコンビネーションを押しながらアプリを起動したら…??? じゃじゃーん!

イースターエッグ!!🐣

コンピューターの世界では昔からプログラマーがソフトウェアの中に✨秘密の何か✨を組み込むのが大好きだ。

それがゲームであれ、重要なソフトであれ、プログラマーはみんな隠し続けてきた歴史がある。

以下ではそれをちょっとだけ紹介する

めくるめくイースターエッグの数々

Windows 95

あの有名なWindows95には、フォルダー名をある一定の名前に変更していくと現れるイースターエッグが存在した。
軽快なサウンドとともに開発者の名前が横にスクロールしていく。

hqdefault.jpg

https://www.youtube.com/watch?v=dtfBBNYdcPc

Excel 95

ExcelといえばMSの稼ぎ頭。こんな真面目なソフトウェアによもやダンジョンが存在するなど誰が想像しただろう。おっこちたら最初からやり直しだ!

images-1.jpg

https://www.youtube.com/watch?v=nwg9eLHZZRo

ResEdit

昔のMac OS(OS X以前)のアプリケーションには実際に走るバイナリなどを扱うデータフォーク、アイコンや画像などを扱うリソースフォークという形でアプリケーションが構成されていた。アイコンやその他のリソースをいじるためにResEditは存在した。こいつは古から存在するAboutメニューをShiftキーを押しながら選択すると以下のようなダイアログを表示するものであった。

http://www.mackido.com/EasterEggs/PR-ResEdit.html

ResEditPigMode.gif

俺もStart Pig-mode したい!

僕らのアプリにもこの古のブタちゃんを実装したい!というわけで、あるキーコンビネーションを押しながらAboutメニューを押したらStart pig-modeのダイアログを出すようにしてみる。

swiftでキーコンビネーションを得る

手始めにCommand & Shift & Option キーのコンビネーションが押されているかを調べるコードを書く。

キーコンビネーションを取得するにはNSEvent.modifierFlags.containsを利用し、ほしいキーの名前を渡す。

let cmdOptShift = NSEvent.modifierFlags.contains([
    NSEvent.ModifierFlags.command,
    NSEvent.ModifierFlags.option,
    NSEvent.ModifierFlags.shift
])

一度applicationDidFinishLaunching等に貼り付けて、Run時にcmd+opt+shiftを押しっぱなしにして結果を見てもらえるとわかります。

これを踏まえてAppDelegateに以下を用意。Storyboard中にあるメニューバーの、First Responderに接続されているAbout [アプリ名]のアクションを外し、このfuncに接続。

AppDelegate.swift
    @IBAction func showAbout(_ sender: Any) {
        if (NSEvent.modifierFlags.contains([NSEvent.ModifierFlags.command, NSEvent.ModifierFlags.option,  NSEvent.ModifierFlags.shift])) {
            let alert = NSAlert()
            alert.messageText = ""
            alert.informativeText = "Start pig-mode?"
            alert.icon = NSImage(named: NSImage.Name(rawValue: "pig"))
            alert.addButton(withTitle: "OK")
            alert.addButton(withTitle: "Cancel")
            alert.runModal()
        } else {
            NSApp.orderFrontStandardAboutPanel(sender)
        }
    }

豚さんの画像はAssets.xcassetsにご自分でご用意ください。

あとはビルドしてRun、その後Cmd+Opt+Shiftを押しながらAbout[アプリ名]をクリック。すると・・・

スクリーンショット 2018-02-03 18.08.32.png

じゃじゃーん!

さてマジレスです。

なんでこんな記事を書いているかというと、アプリケーションを立ち上げる際にあるキーコンビネーションを押しながら立ち上げることで、設定画面に通常ならば見えないパネルを表示したいからでした。

Obj-Cのころは以下のようなコードでキーコンビネーションを調べていました。

BOOL optKeyDown = ((GetCurrentKeyModifiers() & (optionKey | rightOptionKey)) != 0) ? YES : NO;

が、GetCurrentKeyModifiersが利用不可能になっているのでやり方を調べていたところ、上のコードが出てきたのでメモがてら残しておきました。

最後に

イースターエッグだいすき!