私のアプリケーションに問題があります。 Dosemu2が-dumb -td -kt
モードになっていて、MATE端末ウィンドウをめちゃくちゃにしています。 (MATE端末ウィンドウから直接またはその間にGNU画面を使用します。)killall -v dosemu.bin
signal()を使用してアプリケーションを終了またはクラッシュした後、このウィンドウで実行され続けるbashシェルはMATE端末に多くのテキストデータを受け取ります。ウィンドウはマウスカーソル移動データを受け取ります。
コマンドを実行し、reset
時にはtset
。常にマウス入力をリセットしますが、避けたい画面も常に消去されます。画面が消去されず、マウス入力の問題が解決されませんでした。tset
reset
reset -I
reset
表示される画面領域を消去せずにマウス入力を無効にする方法はありますか?
私は以前Dosemu2ディスカッションでこの問題について次のように書きました。https://github.com/dosemu2/dosemu2/discussions/2061
下の画像は、テキストとして入力された最後のマウスデータを示しています。
答え1
このreset
コマンドはのショートカットですtput reset
。このコマンドのドキュメントには次のように記載されています。
reset
[...]存在する場合、端末のリセット文字列が出力されます(rs1
、、、、)。リセット文字列はありませんが、初期化文字列がある場合は、初期化文字列が出力されます。それ以外の場合、リセットはinitと同じ効果を持ちます。rs2
rs3
rf
したがって、さまざまなモードで端末を切り替えるために実際に端末に送信されるコマンドの順序を調べるには、およびの設定を確認する必要がありますreset
。rs1
rs2
rs3
rf
この時点で、、、、およびその代わりに画面が消去されずに問題を解決していることを確認reset
できます。tput rs1
tput rs2
tput rs3
tput rf
しかし、ダイビングを続けてください。man terminfo
ドキュメントには簡単に次のように記載されています。
reset_1string rs1 r1 reset string reset_2string rs2 r2 reset string reset_3string rs3 r3 reset string reset_file rf rf name of reset file
これは、terminfoデータベースに直接復元する必要があることを意味します。
infocmp | grep -Po '\w+=[^,]*' | grep -E '^(rs[123]|rf)='
私にとって、これは2つの項目を返します。
rs1=\Ec
rs2=\E[!p\E[?3;4l\E[4l\E>
\E
これは表現で直接読み取ることができ、シーケンスEscapeで書き直すことができます。printf
printf '\ec'
printf '\e[!p'; printf '\e[?3;4l'; printf '\e[4l'; printf '\e>'
エスケープシーケンスが実際に何を意味するのかを理解するのは、おそらくこの回答の範囲外ですが、以下はいくつかあります。
ESC c # Reset and clear screen
ESC [!p
ESC [?e;4l
ESC [4l
ESC >
最後に、以下があることに注目する価値があります。最近送信されましたdosemu
必要なリセットを直接行ってください。
# disable xterm mouse tracking printf '\033[?1006l\033[?1003l\033[?1002l\033[?1000l\033[?9l' # disable xterm cursor keys printf '\033[?1l'
つまり
ESC [?1006l ESC [?1003l ESC [?1002l ESC [?1001l ESC ?9l
ESC [?1l