Skip to content

SteamVR 未接続では登録と解除を押せなくする - #43

Merged
limit7412 merged 4 commits into
masterfrom
claude/steamvr-offline-register
Aug 29, 2026
Merged

SteamVR 未接続では登録と解除を押せなくする#43
limit7412 merged 4 commits into
masterfrom
claude/steamvr-offline-register

Conversation

@limit7412

@limit7412 limit7412 commented Aug 29, 2026

Copy link
Copy Markdown
Owner

方針

SteamVR が動いていない間は、登録の操作そのものを行えないようにします。

当初は設定ファイルへ直に書いて非起動時でも登録できるようにしていましたが、指示により方針を変えました。その実装は 5b64f4c の 1 つ前で revert してあるので、この PR の差分は下の 3 ファイルだけです。

何が問題だったか

登録も解除も OpenVR の IVRApplications を通るため、SteamVR につながっていなければ必ず失敗します。

トレイのメニューは以前から steamvr_available で無効にしていましたが、設定ウィンドウのボタンは押せたままでした。 押すと黙って失敗し、「SteamVR への登録」というエラー通知が出るだけで、何が足りないのかが画面から読めません。

同じ操作が、置き場所によって押せたり押せなかったりする状態でもありました。

どう直したか

設定ウィンドウの登録・解除ボタンを、SteamVR につながっていない間は無効にします。トレイと同じ条件になります。

connected = @steamvr_connected.call
{@steamvr_register_button, @steamvr_unregister_button}.each do |control|
  control.try { |target| connected ? target.enable : target.disable }
end

押せるかどうかは refresh_status が一定間隔(2 秒)で映し直すので、画面を開いたまま SteamVR を起動すれば、その場で押せるようになります。

初期状態は押せない形で作ります。build_steamvr_tab の時点では接続状態が分からず、refresh_status が来るまで一瞬押せて見えてしまうためです(情報タブの更新ボタンと同じ扱いです)。

設定ファイルを直に書く案を採らない理由

docs/architecture.md へ記録しました。「検討して採らなかった」ことが残らないと、次に同じ課題へ当たった人が同じ調査からやり直します。

  • SteamVR は設定をメモリに持ち終了時に書き戻すため、動いている間に書いても消える(ValveSoftware/openvr#1537
  • 動いていない間に限れば書けるが、appconfig.json には他のアプリの登録も入っており、形式を読み違えるとそれらを巻き添えにする
  • 文書化されていない私有の設定ファイルを書く危険に対して、得られるのは「SteamVR を起動する前に登録できる」ことだけ

確かめたこと

  • crystal spec 242 examples, 0 failures
  • crystal tool format --check src spec
  • x86_64-pc-windows-msvc へのクロスコンパイル
  • revert 後に master との差分が空であること(=残っているのは今回の 3 ファイルだけ)

確かめられていないこと

描画は実機でしか見られません。

  • SteamVR を止めた状態で設定ウィンドウを開き、登録・解除のボタンが灰色になっていること
  • そのまま SteamVR を起動すると、数秒で押せるようになること
  • 押せる状態で登録すると、これまでどおり動くこと

ブランチ名は claude/steamvr-offline-register のままです。 方針が変わって内容と合わなくなりましたが、付け替えると PR を立て直すことになるためそのままにしています。

OpenVR の IVRApplications は vrserver が動いていないと使えない。
#12 で Background 初期化へ変えてから、SteamVR を起動していない手動起動が
想定された使い方になり、そのあいだ登録も解除もできなかった。
トレイのメニュー項目も押せないままだった。

SteamVR が動いていないときは、その設定ファイルへ直に書く。

- <config>/appconfig.json の manifest_paths
- <config>/vrappconfig/<app_key>.vrappconfig の autolaunch

どちらも AddApplicationManifest と SetApplicationAutoLaunch が書き込む先で、
SteamVR は起動時にここから読み直す。置き場所は openvrpaths.vrpath の
config 配列から取り、読めなければ既定のインストール先を試す。

SteamVR が動いている間はこの経路を使わない。あちらは設定をメモリに持ち
終了時に書き戻すため、後ろから書いても消される。裏を返せば動いていない間は
安全に書けて、次の起動でそれが読まれる。

appconfig.json が読めない内容だったときは書き換えを諦める。空として
扱って書き直すと、入っている他のアプリの登録を巻き添えで消す。
書き込みは一時ファイルへ書いてからの改名で行う。

登録できる状態かはトレイへ steamvr_configurable として別に渡す。
steamvr_available をそのまま使うと、ツールチップの「接続していません」と
メニューの押せなさが連動し、片方を直すともう片方が壊れる。

start_steamvr は open の成否ではなく configurable? で進むかを決める。
届く先がまったく無いときだけ何もしない。毎回試すと、SteamVR を入れて
いない環境で 60 秒ごとに同じ失敗を書き続けることになる。
claude added 2 commits August 29, 2026 15:28
This reverts commit f347cbd.

方針を変える指示があったため戻す。SteamVR の設定ファイルを直に書くのは
やめ、SteamVR が動いていない間は登録の操作そのものを行えないようにする。
登録も解除も OpenVR の IVRApplications を通るため、SteamVR に
つながっていなければ必ず失敗する。トレイのメニューは以前から
steamvr_available で無効にしていたが、設定ウィンドウのボタンは
押せたままだった。押すと黙って失敗し、エラー通知が出るだけで、
何が足りないのかが画面から読めない。

両方を同じ条件で無効にする。押せるかどうかは refresh_status が
一定間隔で映し直すので、SteamVR を起動すればその場で押せるようになる。
初期状態は押せない形で作る。開いた直後に一瞬押せて見えるのを避ける。

設定ファイルを直に書けば非起動時でも登録できるが、採らない理由を
docs/architecture.md へ記録する。
@limit7412 limit7412 changed the title SteamVR 非起動時にも登録と解除をできるようにする SteamVR 未接続では登録と解除を押せなくする Aug 29, 2026
@limit7412
limit7412 marked this pull request as ready for review August 29, 2026 15:32
@limit7412
limit7412 merged commit 87ed26a into master Aug 29, 2026
2 checks passed
@limit7412
limit7412 deleted the claude/steamvr-offline-register branch August 29, 2026 15:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants