mtgto/macSKK

macOS 14 Sonomaで入力メニューからアプリ設定が開けなくなった

mtgto opened this issue · 3 comments

mtgto commented

入力メニューに表示されるメニュー項目は InputController#menu が返しているもので、NSMenu + NSMenuItemで作成しています。
macSKK v0.9.1現在、UI設定画面をSwiftUIのAppやSettingsを使っているため、公開APIで設定画面を表示することができず、非公開APIである showSettingsWindow: を使っていました。

NSApp.sendAction(Selector(("showSettingsWindow:")), to: nil, from: nil)

ところがmacOS 14 Sonomaで上記のコードは動かなくなりました。
このためmacOS 14 Sonomaでv0.9.1以下のバージョンを使っている場合、設定画面を開けなくなりました。

設定画面を開く方法としてmacOS 14では非公開APIの代わりにSwiftUIのViewに SettingsLink が用意されましたが、入力メニューは素のNSMenuItemしか受け付けていないためSettingsLinkを使うのは難しいです (無理ではないのかもしれないけど、入力メニューに表示するNSMenuItemにアイコンをセットしても無視されるし、たぶんかなり難しい)。

ひとまず暫定対応としては変換候補などと同様にNSWindow + NSHostingControllerで設定ウィンドウをSwiftUIのSettingsとは別に開く形式で回避するのがよさそうかなと考えました。

ちなみに試しにSwiftUIのWindowやWindowGroupを使って設定画面の代わりに使えないかも考えましたが、起動時にウィンドウを開かないアプリを作ることができなさそうなのであきらめました。

アプリのエントリーポイントまで全部SwiftUIでやることに無理が生じているのは元からだったんですが、さすがに限界を感じたので起動回りはNSApplicationDelegateを使ったSwiftUI以前の起動方法に戻そうと思います。
設定画面や変換候補パネルなどビュー自体はSwiftUIにしてNSHostingControllerを使うことは今後もやっていくつもり。

mtgto commented

Xcode 14 + macOS 13 SDKでビルドした場合は showSettingsWindow: 呼べるっぽい (条件は未確定だけどたぶんそう)
https://twitter.com/Kyomesuke/status/1713554009066483744

mtgto commented

https://www.reddit.com/r/SwiftUI/comments/16ibgy3/settingslink_on_macos_14_why_it_sucks_and_how_i/ が詳しい。
Environmentで使えるOpenSettingsActionというものをSettingsLinkは使っているらしいが、非公開なため使用できない。

// ほんとうなら例えばこんなかんじで設定を開くActionを書きたいがそんなkeyPathはもってないとCompile Error
struct HogeView: View {
    @Environment(\._openSettings) private var openSettings // Compile Error

    var body: some Scene {
        Button("Open Settings") {
            openSettings()
        }
    }
}
mtgto commented

ひとまず暫定対応をした v0.10.0 をリリースしたので閉じる。