2017-10-08 15 views
0

私のxterm.js端末では、スワイプでカーソルキーを送信するtouchmoveイベントがあり、左端と下端をスワイプしてスクロール/ホイール操作をしています(端末 'アプリケーションモード'の場合)。カーソルキースワイプは素晴らしいですが、マウスホイールやスクロールの効果的なコードを見つけることができません。今のところ私は2つまたは4つのカーソルキーコードを逆の方向に使ってホイール/スクロールのエッジを模倣しています。行単位でスクロールする必要があります。カーソルを移動するのではなく、テキストを垂直方向に移動するだけです。(マウス)ホイールとスクロールの正しいXTERM/ANSIシーケンスは何ですか?X、Y座標は必要ありません。

私が探している動作の例は、Android用Termux端末アプリです。これは、「アプリケーションモード」で上下にスワイプしたときにマウスホイールのxterm/ansiコードを送信します。詳細...

テスト・セットアップは、非のPrintablesのためのビジュアルを取得するためにxterm.jsとTermux、「猫の-A」または「sedの-n L」を使用して、bashで真夜中の司令官です。

Termuxでは、MCがインストールされているサーバにsshをインストールします。 'mc'を実行します。 Wi-Fiまたはその他の方法をオフにして突然切断します。 'cat -A'または 'sed -n l'を実行します。上下にスワイプします。マウスホイール 'ANSI'コード(実際にはxtermプロトコル)のシンボルを取得する必要があります。これらのような:; 82; 14M ^ [[< 64; 83; 12M

私の理解では、これが意味するべきである

^[[< 65 "の\ X1Bを[< 65; 82; 14M"、および " \ x1b [< 64; 83; 12M "、2番目と3番目の数字はX、Y 'ポインタ'座標( '文字')です。しかし、カットアンドペーストしても、 '^ ['をリテラルエスケープに置き換えてもうまくいきません。

私はANSIとXtermのコードをホイールやスクロールのために大量に見てきましたが、動作するものが見つからないようです。

私はここで何が欠けていますか?ワニ口金はリテラルですか?それは何かを象徴していますか?つまり、私はxterm.jsから明らかな反応を得られません。それを取り出して、イベントが発生するたびに残りのコードが出力されます。

多くの端末タイプからスクロール、先行/否定行インデックス/ LFのためのさまざまなシーケンスを試しましたが、ミッドナイトコマンダーや 'アプリケーションモード'や '代替画面バッファ'を使用するその他のユーティリティではスクロールしません'

答えて

0

最後に、ボタン4と5のリリースイベントのライブセル座標(行と列による)でマウススクロールのxterm-sequencesを指定する必要があることがわかりました。すなわち:

sock.send("\x1b[<65;"+xcol+';'+yrow+'M'); // SCROLL UP '[<65' 

または

sock.send("\x1b[<64;"+xcol+';'+yrow+'M'); // SCROLL DN '[<64' 

私は、スクロール動作のために他の作業のコードが見つかりましたが、彼らは、アプリケーションモードの外で主に働きます。 "\ x1b"、 "\ u001b"、 "\ 033"はすべてEscapeと同じです()。 xcolとyrowは、ピクセルではなく、セル内のターミナル上のライブ "ポインタ"座標でなければなりません。静的座標の送信は機能していないようです。ベンチマークテストにはMidnight Commander、mcedit、less、およびbashでのマウスホイールの応答の確認が含まれていました。

xterm.jsソースには、実際のマウスでこれを行うためのコードがあります。私はtouchmoveのイベント座標を取得し、これをバリエーションを使用して文字セル座標に変換し、スワイプジェスチャーに沿った位置に基づいて、これらの2つのコードの1つを介してwebsocketに定期的に送りました。これは、サーバー上でマウスホイールイベントを効果的にエミュレートし、xtermの「アプリケーションモード」でタッチをスクロールできるようにしました。

さらに、アプリケーションモードを検出し、その中にいないときには上下の矢印を送信することもできます。

座標変換セルにピクセルを強調実際の作業コードのスクリーンショット、およびxtermのマウスホイールの配列: enter image description here

補遺:スクリーンとURLのxterm SGRマウスイベントを送信するためCOL /行にpageX/pageY変換用。

http://docs.xtermjs.org/src_xterm.js.html enter image description here

1

いくつかの質問です:

  • "ワニブラケットは" リテラルではありません。それはASCII エスケープは、一般的に^[として印刷されているため、2つの文字は、[エスケープです。
  • 別の画面では、端末は、xtermのSGRモードではなく、上/下カーソルエスケープだけを送信することがあります(シーケンスはMで終わります)。
  • は、マウスの動作に影響を与えてはいけませんが、一部のアプリケーションではその変数に基づいて動作をハードコードすることが知られています。
+0

はい、効果的に( "\のX1B" + '[<65; 82; 14M')、サーバへの実際のエスケープ文字を送信します。 '<'は実際の '<'でした。私はアルゴリズムを追加してセルでタッチ移動位置を取得し、エスケープシーケンスで送信しなければなりませんでした( "\ x1b [<65;" + touchmoveXcol + ';' + touchmoveYrow + 'M')。それはちょっとだけ多くのコードを必要とするので、pxからセルに変換する必要があります。私はいくつかの短い静的シーケンスを望んでいました。それは実際にはより良いです。 xtermのマウスコードを送信するのは、実際のマウスを使用するのと同じです。遠隔のcliアプリは、タッチで起動したときに同じように応答します。 – jdmayfield

+0

私は以下を参照しています:** '<' **はプロトコルの一部であり、*プライベート*コントロールシーケンスとしてのシーケンスを示します。その "[XTerm Control Sequences](https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Extended-coordinates)の" CSI ** <**に従う> "は誤字ではありません。 –

+0

はい、正確です。 Xtermは、小さなansiスタイルの制御シーケンスミニプロトコルを介してマウスイベントを送信します。基本的に、ボタン番号、クリックまたはリリース、およびセル座標を示します。この場合、マウスホイールはボタン4と5とみなされ、解放されます。 "\ x1b [上向きの場合は<<65、下の場合は\ x1b [<64")。一度私はそれをシームレスに生きている細胞に接続しました。 – jdmayfield

関連する問題