なぜ「シンプル時計」を作ったのか——大画面のPCでも見失わない、常に最前面の時計が欲しかった

大画面のPCで作業していると、メニューバーの時計をふと確認したくなっても、視界の隅すぎて見えづらいことがあります。目を動かして探す一手間が、地味に気になっていました。背景を透過させて、常に最前面に置けるシンプルな時計があればいいのに——探しても、ちょうどよいものが見つからなかったので、自分で作りました。

メニューバーの時計は、大画面だと「隅すぎる」

メニューバーの時計は、画面の端にひっそりと表示されます。ノートPCの小さな画面なら視界に収まりますが、大きな外部ディスプレイで作業していると、作業中の視線からはずいぶん離れた位置になります。

かといって、見るたびに視線を大きく動かすほどのことでもありません。ちらっと見えるところに、常に置いておきたい——そのくらいの、ささやかな要望でした。

見つからなかったのは「透過して常に最前面」の一点

時計アプリ自体は探せばいくつも見つかります。ただ、私が欲しかった条件に合うものには行き当たりませんでした。

「透過していて、常に最前面で、余計な機能がない」——この組み合わせだけを満たすものが見つからなかったので、自分で作ることにしました。

作ったもの: シンプル時計

シンプル時計 は、Mac用のネイティブアプリです。SwiftUIとAppKitで作った、モノクロ・枠なしの小さな時計です。

シンプル時計のスクリーンショット。黒背景に白抜きの大きな数字で時刻と日付が表示されている

使い方は、GitHub Releases から .app をダウンロードして /Applications に置くだけです。登録不要・広告なし・完全無料で、Apple SiliconとIntelの両方のMacで動きます。

初回起動時、Appleに登録していない開発元として警告が出ます。.app を右クリックして「開く」を選ぶか、ターミナルで xattr -dr com.apple.quarantine を実行すれば起動できます。

手順は README にも書いています。

作ってみて分かったこと

小さなアプリですが、作る過程でいくつかつまずきました。技術的な話なので、興味のある方だけどうぞ。

SwiftUIのcontextMenuは、生のNSViewを渡すとdisabled表示になる

透過度の調整にスライダーを使いたくて、SwiftUIの.contextMenuにスライダーを組み込んだところ、灰色のまま操作できない状態になりました。

調べていくと、.contextMenuはSwiftUI標準のコントロール(ToggleButton)は問題なく扱える一方、NSViewRepresentableで包んだ生のNSViewは disabled 表示になってしまう制約があるようでした。

最終的に、右クリックメニューそのものをAppKitのNSMenuで手組みし、rightMouseDownを直接オーバーライドしてポップアップする方式に切り替えました。遠回りに見えますが、こちらのほうが結果的に確実でした。

独自のkeyDownオーバーライドが、標準の全画面のEsc処理を止めていた

枠なしウィンドウでもEscキーでウィンドウ最大化を解除できるようにしようと、NSWindowkeyDownをオーバーライドしました。ところがこれを実装した直後、macOS標準の全画面表示に入るとEscキーで抜けられなくなる不具合が出ました。

原因は単純で、keyDownが受け取ったキー入力を無条件に消費し、superに渡していなかったことでした。macOSの標準の全画面表示は、自前でEscキーによる解除処理を持っています。それを黙って握りつぶしてしまっていたわけです。

未処理のキー入力は必ずsuper.keyDownに委譲するよう直し、解決しました。

ほかにも、日本語ロケールの環境では12時間表示のAM/PMが自動で「午後」に差し替わってしまうDateFormatterの癖に足をすくわれたり、自宅にある別のMac(Intel機)でも動かすためにUniversalバイナリでビルドしたりと、小さなつまずきはいくつかありました。

使ってみてください

シンプル時計 は登録不要・無料で、ダウンロードしてすぐ使えます。「大画面でも、ちらっと見えるところに時計を置いておきたい」——そんな方に届くとうれしいです。


筆者:yokafolio。「シンプルなアプリと、余白のある暮らし。」をテーマに、登録不要で開いてすぐ使えるWebアプリを作っています。

← 記事一覧へ