今使ってるマウスの具合が悪い。ニッケル水素の電池を入れてるんですが、充電したばかりなのにすぐ使えなくなる。予備で同型のマウスがあるんで、それに電池を入れたら無問題。てなわけで電池は無実。開腹してテスタを当ててみると、どぅも電源スイッチが悪いような...。ってのが数週間前にありまして。3pinスライドスイッチを交換するかなー、でもこんな小さいの売ってるかなー?........あ、こんなのむか〜〜〜〜〜〜し買ったような........あ、持ってた。ってのが数日前に発覚しまして。なんか涼しくなった気がするから半田付けするかなーって思ったんですが、めんどくさくなったんでダメモトでダメなスイッチをガチャガチャガチャ!って動かしてたら復活したみたいです。めでたしめでたし。めでたいので、それはさておき。
気が向いたのでスクリーンセーバの件を再検討。startAnimation:
でNSViewDidUpdateTrackingAreasNotification
の通知を登録をして、stopAnimation:
で通知の登録を削除すれば、余計なフラグなんて要らないのか。それで通知が届いたらstopAnimation:
が呼ばれなかったってことだから、自前でstopAnimation:
を呼んでやると。これでanimateOneFrame:
は呼ばれなくなるけど、プロセス「legacyScreenSaver(壁紙)」は残ったままなのよね。自前でstopAnimation:
を呼んだ後に[NSApp terminate:self]
を唱えれば無事終了するけど....んー....。
なんかモヤモヤするなー。どーしよーかなー。
今使ってるマウスの具合が悪かったのが直ってめでたしめでたし。だったのが、チルトホイールの左側のスイッチが無反応になっちゃいまして。まぁ以前から怪しかったんですが...。使われているタクトスイッチは2本足なんですよねぇ。前に秋葉で物色したときは、売られているのはほぼ4本足。マルツで見たのは大きさ違ったんだよなー。てなわけで、手持ちの4本足でナントカするかなー。まぁそれはさておき。
LupinSaverをmacOS Sonoma用にゴニョゴニョして動作確認してたんですが、あれ? なんか速くない!? 厳密に測定したわけぢゃないっすけど、体感的に、なんか速い。よく見たら文字の表示がときどきすっ飛ばされてる。用いた機種はMacBook Air (M1, 2020)ね。macOS Venturaで起動して確認したら、Sonomaよりはちょっと遅いかな。文字の表示はちゃんと....あ、極稀に飛ばされてるわw。開発はかなり前だからなー。当時はいかに描画速度を上げるかで悩んでたのにねぇ。
さて、どーしよー。
今使ってるマウスのチルトホイールの左側のスイッチが無反応になっちゃった件。その後、開腹してテスタ当てながらカチカチしてたら導通して直った。 軸で固定されたホイールを傾けて押下するってゆー動作は、スイッチの特定の箇所しか接触しない....のかな?。まぁとにかくめでたしめでたし。
んで今日、秋葉に行ったら2本足のタクトスイッチはいっぱい売ってるぢゃないですか。私は節穴さんだなー。高さは合わないけど削ればいいかな。とりあえず買い。
sonomaのスクリーンセーバはどんなアプリで動いているのかしらん? てなわけで /System/Library/CoreServices/ を見たら、ScreenSaverEngine.app がありまして。え? これって従来と同じアプリ? と起動してみたら、システム設定で指定しているスクリーンセーバが動くぢゃないですか。んー、アクティビティモニタに出るプロセス名が違うから別物だと思ってましたよ。んで、ScreenSaverEngine.app を直接動かしたその後は、レガシーなスクリーンセーバも復帰できちんと終了するようになっちゃいました。んんんーー?
まぁ直ったから、これでイイのだ。<イイのかよ
スクリーンセーバから復帰しても、モジュールによっては終了してないや。LupinSaverは終了するようになったんだけどな。もぅナニがナニやら。
sonomaを入れ直して再検証するか?
自前のアプリのウインドウにScreenSaverViewを、ってのはどーなるのかな? モジュールを読むにはNSBundleを使うのか...必要そうな機能は...。で、こんなの。
Apple純正Arabesque.saverを一時停止ちう、の図。
その時その時のanimationTimeIntervalの値でタイマーを設定してanimateOneFrameを呼んでやる、と。速度を変えたり、一時停止やコマ送りとか。そんな感じでいろいろ試したんですよ。ウインドウを縦長にしたら、LissajousSaverは縦長に対応してなかったwww。LupinSaverは画面サイズが重要なので、きちんと対応してます。なんて。
以上はmacOS Mojaveの話。sonomaでヤってみたら、ん?一時停止やらが効かないやん。各OSで動作確認してみると、Mojaveの次のCatalinaからは、ScreenSaverViewのタイマーがstartAnimationを呼んだ時点で始動しちゃうぢゃないですか。ScreenSaverViewの仕様を考えれば、まぁそれが普通なんですけどね。実行/停止だけぢゃ面白く無い。困ったな。
ScreenSaverViewをカテゴリ使って...。話が長くなるんで、つづく(?)。
前回のつづき。ScreenSaverViewのプライベート変数_timeIntervalはinitWithFrame:isPreview:
の時点で設定されちゃうのかな。startAnimation
で設定されるタイマーの時間は_timeIntervalを直接参照ではなくてanimationTimeInterval
を見ているので、メソッドanimationTimeInterval
とsetAnimationTimeInterval:
をカテゴリで上書きするのが良さげですか。元のメソッドの中身が何をしているのか分からないから、上書きはヤりたくないけど...他に思いつかん。animationTimeIntervalの値って、設定はしても読むことなんてしないでしょ? だからanimationTimeIntervalの返り値は、初回はstartAnimationの参照であろうから最大値(DBL_MAX)にして、以降は念の為setAnimationTimeInterval:での値にしてやる、と。DBL_MAXを喰らったタイマーは無限の旅に出る...。邪魔者は去ったので独自制御も有効に。こんな対応でとりあえず問題無さげな感じ...。
macOS MojaveのArabesque.saverやその他のApple純正スクリーンセーバモジュールを見ると、親クラスがScreenSaverViewではなくて、CIScreenSaverViewなんてのだったりする。ナニそのCIって。CoreImageの略? ScreenSaverViewとドー違うの? CIScreenSaverViewをググっても情報皆無でわからんちん。むむぅ。
macOS Sonomaでは、Apple純正スクリーンセーバのファイルって何処に格納されてるんですかね? /System/Library/CoreServices/Screen Savers/ にはFloatingMessage.saverとRandom.saverしか無いし。他のArabesqueやらHelloやらは一体何処に...? むむぅ。
つづく(?)。
macOS SonomaのApple純正スクリーンセーバのファイルは、/System/Library/ExtensionKit/Extensions/ にありました。拡張子は appex って、ナニ? あぁ、機能拡張ってヤツですか>App Extensionの概要。んー、ん? スクリーンセーバの紹介が無いんですけど?? NSExtensionPointIdentifier を見ても com.apple.screensaver は出てこないし。なんで非公開なの???。
Apple純正スクリーンセーバの中の info.plist に ScreenSaverViewControllerClass って項があったのでググったら、当たったのがこちら>App Extension 式 Screen Saver。appex なスクリーンセーバの作り方を紹介されてます。素晴らしいー。スクリーンセーバの中身は従来の ScreenSaverView で良くて、App Extension 用にガワを整える感じですかね。時間があれば、そのうち試してみますか。
いやしかしなんでAppleは公開しないんだろ? 私みたいに「なんかよくわからんけど、動いたからそれでイイのだ」みたいな輩が出てきて良くないんぢゃないかなー。