pointer lock

Pointer Lock (Web)

[83] Pointer Lock は、マウスカーソルを非表示とし、 特定の要素のみがマウスの移動量や各種操作のイベントを受信できる状態 (固定状態) とする機能群です。

[84] ゲーム3次元モデルの表示などで通常のマウスによる操作を無効化し、 特別な動作モードを実現したい場合に使うことができます。

仕様書

API

メソッドと属性

[30]

イベント

[22] pointerlockchange イベントは、 Pointer Lock の状態変更を通知するために使われます >>21

[24] 利用者エージェントは、 Pointer Lock の開始時と終了時に、 pointerlockchange イベントを送信しなければなりません >>21

[87] スクリプトは、 pointerlockchange イベントを受信したら、 pointerLockElement IDL属性を確認することで、 要求した要素に関する固定状態への移行に成功したしたかを判断できます。


[23] pointerlockerror イベントは、 Pointer Lock の状態変更の誤りを通知するために使われます >>21


[60] Document インターフェイスは、 onpointerlockchange, onpointerlockerrorIDL属性を持ちます。それぞれ、 pointerlockchange, pointerlockerrorイベントイベントハンドラーIDL属性です。 >>59

処理

固定状態への移行

[32] requestPointerLock メソッドは、 次のようにしなければなりません >>31

  1. [35]
    ... のいずれかを満たす場合、
    1. [42] pointerlockerror イベント文脈オブジェクトについて通知 (>>25) します。
  2. [33] それ以外の場合、
    1. [49] 対象null でないなら、
      1. [50] pointerlockchange イベント対象について通知 (>>25) します。
    2. [66] それ以外の場合、
      1. [67] 元のマウスカーソル位置を、現在のマウスカーソルの位置に設定します。
    3. [34] 対象を、文脈オブジェクトに設定します。
    4. [41] pointerlockchange イベント文脈オブジェクトについて通知 (>>25) します。

[44] 文書は、Pointer Lock要求不能フラグを持ちます。初期値はです。

[46] engagement gesture発火される際は、 影を含む根Pointer Lock要求不能フラグをに設定しなければなりません >>31

[47] Pointer Lock要求不能フラグにより、利用者Pointer Lock 状態を解除した場合にスクリプトから再度 Pointer Lock を開始することは拒否されます。これによって、むやみやたらに Pointer Lock 状態に入らせようとするのを拒み、利用者に他の動作を行う機会を与えます。 (exitPointerLock により解除からの requestPointerLock は拒絶されないので、自動的に解除と再設定を繰り返す必要がある場合はこの制限にかかりません。) >>31

[51] 対象が他の要素に変わる場合、新旧両要素pointerlockchange発火しなければならないことになりますが、 その順序は不明です。また新旧が同じ場合にどうするべきなのかも不明です。

[69] 利用者エージェントは、元のマウスカーソル位置を持ちます。 固定状態が終了すると、開始前の位置で再度マウスカーソルが表示されるようになります >>62座標の他、マルチディスプレイの場合はどの画面に表示されていたかも復元されることが当然に期待されるものと思われます。 元のマウスカーソル位置は、他に固定状態下でのマウスイベントの座標値の決定にも使われます。

固定状態

[52] 利用者エージェント対象 (target) を持ちます。 初期状態は null です。これが非 null の値なら、 固定状態 (locked state) です。

[53] 固定状態では、利用者の動作に起因して利用者エージェント発火するすべてのマウスイベント対象は、 対象としなければなりません >>31

[57] 合成マウスイベントには適用されません >>31

[54] 固定状態では、マウスカーソルを隠さなければなりません >>31

[58] 固定状態では、利用者エージェントマウスカーソルの概念が必要なマウスイベント (mouseover, mouseout, drag, drop など) を発火してはなりません >>31

[55] 固定状態では、マウス押下移動によってフォーカスを失ってはなりません >>31

[56] プラットフォームがそのような機能を提供していることが前提ですが、 一般的なウィンドウマネージャーはそのような API が提供されているようです。

固定状態の終了

[74] 次の場合に、固定状態を終了しなければなりません

[75] 終了方法の規定は、なぜか exitPointerLock にしかありませんが、 他の方法での終了時も同様と思われます。

[78] navigate などで活性文書ではなくなったときも終了する必要がありそうですが、 なぜか規定がありません。

[79] ダイアログ表示時の扱いは不明です。 最低でも、モーダルダイアログが操作できなくなってしまわないような配慮が必要です。

[80] 全画面表示に入ったり、解除されたりしたこと自体を理由に終了してはなりません。 しかし default unlock gesture などで同時に終了することはあり得ます。 >>71


[77] 固定状態の終了は、次のようにしなければなりません >>62

  1. [65] pointerlockchange イベント対象について通知 (>>25) します。
  2. [45] default unlock user gesture からの呼び出しの場合、
    1. [81] 対象節点文書影を含む根Pointer Lock要求不能フラグをに設定します >>31
  3. [64] 対象を、 null に設定します。
  4. [68] マウスカーソルの位置を、元のマウスカーソル位置に設定します。


[61] exitPointerLock は、次のようにしなければなりません >>62

  1. [63] 対象null ではなく、 対象影を含む根文脈オブジェクトなら、
    1. [76] 固定状態を終了させます。


[70] 利用者エージェントは、利用者default unlock gesture を常に提供しなければなりません。これは、固定状態を終了させるものです。 >>71

[72] 鍵盤入力が利用できる場合、 ESCdefault unlock gesture とするべきです >>71

[73] default unlock gesture全画面の終了の方法を同じとするべきです >>71

イベントの発火

[25]イベントの通知は、イベント型対象について、 次のようにしなければなりません >>21

  1. [26] タスクをキューに追加します。
    [27] タスク
    処理
    1. [28] イベントを発火します。
      名前
      イベント型
      対象
      対象節点文書
    タスク源
    ?

[29] 画面の拡大鏡ソフトウェアは、普通マウスの移動によって画面上の拡大範囲を変更しますが、 Pointer Lock が有効な間は鍵盤操作で変更するようにしなければならず、 Webブラウザーとそのようなソフトウェアとで協調が必要です >>21

砂箱化との関係

[85] sandbox により、Pointer Lock の利用を拒否できます。

[86] allow-pointer-lock により、 砂箱化時に例外的に Pointer Lock を許可することを記述できます。

歴史

Mouse Lock

Pointer Lock

[7] Webapps/PointerLockFeatures - W3C Wiki ( 版) <https://www.w3.org/wiki/Webapps/PointerLockFeatures>

[8] Moving XHR, DOM Parsing and Pointer Lock to Github (Arthur Barstow 著, 版) <https://lists.w3.org/Archives/Public/www-archive/2015Aug/0001.html>

[9] Pointer Lock ( 版) <https://w3c.github.io/pointerlock/>

[10] Create FeatureRequests.md. · w3c/pointerlock@7aebdfc ( 版) <https://github.com/w3c/pointerlock/commit/7aebdfcb7b1aa6bef190acee1a0a170e3d118edd>

[11] [pointerlock] Oct 2015 Pointer Lock Status (Vincent Scheib 著, 版) <https://lists.w3.org/Archives/Public/public-webapps/2015OctDec/0116.html>

[12] CFC: Republish Pointer Lock as CR ( (Léonie Watson著, )) <https://lists.w3.org/Archives/Public/public-webapps/2016AprJun/0127.html>

[13] Pointer Lock () <https://www.w3.org/TR/2016/CR-pointerlock-20160705/>

[14] CfC: Pointer Lock to Proposed Recommendation; deadline August 20 (Xiaoqian Wu著, ) <https://lists.w3.org/Archives/Public/public-webapps/2016JulSep/0054.html>

[15] Pointer Lock () <https://www.w3.org/TR/2016/PR-pointerlock-20160830/>

[16] Fwd: Pointer Lock is a W3C Proposed Recommendation (Call for Review) (Léonie Watson著, ) <https://lists.w3.org/Archives/Public/public-webapps/2016JulSep/0083.html>

[17] w3c/pointerlock: Pointer Lock () <https://github.com/w3c/pointerlock>

[18] Fwd: Pointer Lock is now a W3C Recommendation (chaals@yandex-team.ru著, ) <https://lists.w3.org/Archives/Public/public-webapps/2016OctDec/0015.html>

[19] Pointer Lock () <https://www.w3.org/TR/2016/REC-pointerlock-20161027/>

[82] Pointer Lock 仕様書は、未だに10年以上前の、アルゴリズム的でない方法で規定されていて、 その意図する動作は非常に曖昧です。同じく曖昧な UI Events を暗黙裡に猿パッチする形になっていて、 とても曖昧です。

[88] Update Summary of changes: Now relative to W3C Recommendation 27 Octo… (scheib著, ) <https://github.com/w3c/pointerlock/commit/01fefaa0d264189eae831fc099a45610208d58df>

[89] CFC notification: Publish FPWD of Pointer Lock 2.0 (closes 14th Nov 2016) (Léonie Watson著, ) <https://lists.w3.org/Archives/Public/public-webapps/2016OctDec/0024.html>

[90] Pointer Lock 2.0 () <https://www.w3.org/TR/2016/WD-pointerlock-2-20161122/>

[91] FPWD of Pointer Lock 2.0 (Léonie Watson著, ) <https://lists.w3.org/Archives/Public/public-webapps/2016OctDec/0030.html>

[92] Update ED to pointerlock-2 (scheib著, ) <https://github.com/w3c/pointerlock/commit/5caaf81899b5e6157dee4e7f63b4870d6a37b552>

[93] Record published v2 FPWD. (scheib著, ) <https://github.com/w3c/pointerlock/commit/a2af723e21146205f17cf9876f56f87ef32cb1ad>

[94] Record published v1 REC. (scheib著, ) <https://github.com/w3c/pointerlock/commit/7ca1b4a26ebf593a2b85371deaaf214b051ce57b>

[95] Ask for web-platform-tests in CONTRIBUTING.md (#20) (foolip著, ) <https://github.com/w3c/pointerlock/commit/0f1eaa16bdf681505e9f52ccc5f2e1bbfa271873>

[96] 455882 - Treat file:// URLs as having unique origin - chromium - Monorail ( ()) <https://bugs.chromium.org/p/chromium/issues/detail?id=455882>

[97] Change of editor for Pointer Lock (Léonie Watson著, ) <https://lists.w3.org/Archives/Public/public-webapps/2018JanMar/0000.html>

[98] Update the editor (NavidZ著, ) <https://github.com/w3c/pointerlock/commit/b0b9773999c0845b23c7fa1f532b189f9f06efa1>

[99] Update the editor by NavidZ · Pull Request #30 · w3c/pointerlock () <https://github.com/w3c/pointerlock/pull/30>

[100] Update the editor (NavidZ著, ) <https://github.com/w3c/pointerlock/commit/b0b9773999c0845b23c7fa1f532b189f9f06efa1>