iPhoneのタップがMacのクリックになる仕組み
クリックを1回送るのは簡単です。悪い接続で何千回も、順序を守って、カーソルを遅らせずに送るところに、リモート操作のおもしろさがあります。
位置はピクセルではなく割合
映像に触れたとき、iPhoneは「ピクセル812、640」とは送りません。表示しているソースを基準に、各軸で0から1の間の点を送ります。 Macはそれを、キャプチャしているディスプレイまたはウィンドウの実際の座標に変換します。 そのため、映像が画面に収まっていても拡大されていても、縦向きでも横向きでも、RetinaパネルでもiPhoneの形をした仮想ディスプレイでも、 タップは正しい位置に当たります。どちらの側も、解像度を合意しておく必要がありません。
すべてのメッセージが同じ扱いではない
入力は、暗号化された制御用の接続で、小さなJSONコマンドとして届きます。アプリは種類ごとに扱いを変えています。
- マウスの移動は最新のものだけ残す。ネットワークが止まっている間に3回の移動がたまったら、最初の2つは無意味です。最新のものがそれらを置き換え、移動は毎秒約60回に制限されます。
- スクロールは足し合わせる。一緒にたまった2つのスクロールイベントは、合計を持つ1つのイベントになるので、移動量は失われません。
- クリックとキーは、捨てず、並べ替えない。マウスダウンより先にマウスアップが届けば、目に見えるバグになります。
この小さな方針が、滑らかに動くカーソルと、途切れたあとにぎくしゃくするカーソルとの違いのほとんどです。 また、接続が悪くなってもポインターが少し滑らかでなくなるだけで、間違った操作にはならないということでもあります。
キーはmacOSのキーコード
キー入力は、macOSの仮想キーコードに、shift、control、option、commandの修飾ビットを加えたものです。 Macアプリはそれを本物のキーボードイベントに変換してシステムに送ります。アクセシビリティの権限が必要なのはそのためです。 ショートカットは、使っているアプリに合わせて変わります。上のパネルが示しているのは、固定の一覧ではなく、前面にあるエディタのコマンドです。
キーを物理キーボードと同じように動かすには、意外な落とし穴があります。本物の矢印キーには、ファンクションフラグとテンキーフラグという2つの追加フラグが付きますが、 単純に作った合成イベントにはそれがありません。それがないと、正しいキーコードが届いていても、Controlと上矢印はMission Controlを開かずに、Macでは何も起きませんでした。 Peeringは今は、本物のキーボードと同じように両方のフラグを設定しています。
テキストはキー入力ではない
絵文字、アクセント付きの文字、ラテン文字以外の文字は、キーコードに対応しません。それらについては、iPhoneが文字そのものをテキストとして送り、Macがそれを入力します。 キーボードがどんな言語でも動くのはそのためで、このモードでは一部のMacのショートカットが動かないのもそのためです。 これは設定で切り替えられる、トレードオフです。
同期を保つ
iPhoneは毎秒Macにpingを送り、Macはそのpingをそのまま返します。これはそのままライブの遅延の測定値にもなります。 iPhoneがバックグラウンドに移るときは、先にそう伝えます。iOSは接続を閉じずにアプリを凍結することがあり、Macはその間、アプリが戻るまでiPhoneへの映像の送信を止めるからです。 セッションを観察のみに設定することもでき、その場合、映像は流れ続けますが、Macは入力を無視します。
このループのもう一方の方向は、映像がiPhoneに届く仕組みです。 両方が合わさって、全体の反応の良さが決まります。
よくある質問
Peeringは絵文字や英語以外のキーボードに対応していますか?
はい。キー入力でないテキストは文字として送られ、Mac側で入力されるので、絵文字もどんな言語も使えます。Macのショートカットは、キーコードを送るモードでのみ送られます。
接続が弱くても、カーソルが滑らかなのはなぜですか?
マウスの移動は最新の位置だけを残すようにまとめられ、スクロールは足し合わされます。クリックとキーは、常に順序どおりに届きます。