Terminal: [Conpty] Tambahkan dukungan untuk input mouse

Dibuat pada 18 Feb 2019  ·  48Komentar  ·  Sumber: microsoft/terminal

Pada: Microsoft Windows [Version 10.0.17763.134]

Saya telah mengimplementasikan conpty di emulator terminal saya:
https://github.com/wez/wezterm

Saya berhasil menjalankan target\debug\wezterm.exe untuk menelurkan aplikasi konsol seperti cmd.exe powershell.exe dan bash .

Masalah yang saya lihat adalah ketika saya meluncurkan bash, baik secara tidak langsung melalui cmd.exe atau langsung melalui peluncur bash, conpty tampaknya menelan mouse yang melaporkan urutan pelarian; Saya tidak melihat mereka diterima oleh parser terminal saya, dan karenanya vim tidak memiliki dukungan mouse yang efektif meskipun dikonfigurasi dengan set mouse=a .

Menjalankan instalasi WSL yang sama melalui wsl-terminal memang memiliki dukungan mouse yang berfungsi, dan wezterm telah menjadi driver harian saya di Linux selama sekitar satu tahun dengan dukungan mouse yang berfungsi, jadi kami dapat mengesampingkan kesalahan konfigurasi yang jelas dengan vim dan pengurai di wezterm .

Saya juga mencoba echo -e "\e[?1000h" untuk mengaktifkan pelaporan mouse secara manual dari shell; biasanya (di linux dan melalui wsl-terminal) ini menyebabkan klik di terminal untuk mengirim data ke Shell (yang muncul sebagai input sampah), tetapi ketika menjalankan terminal saya dengan conpty, ini juga tertelan di suatu tempat.

Apakah ada sesuatu yang khusus diperlukan untuk aplikasi yang saya masukkan ke pty saya untuk dapat bekerja dengan mouse?

Jika Anda ingin memeriksa ulang bagian kunci dari kode, file yang relevan adalah:
https://github.com/wez/wezterm/blob/master/src/winpty.rs
Alurnya adalah ke CreatePipe sepasang pipa, CreatePseudoConsole , dan kemudian meneruskannya ke anak yang muncul melalui atribut threadproc, seperti yang dilakukan oleh sampel dalam dokumen MSDN dan repo ini.

Area-Interop Issue-Feature Product-Conpty

Komentar yang paling membantu

Sekedar informasi untuk setiap anggota komunitas yang mungkin telah melihat ini (/cc @SamuelEnglard!) Kami telah secara resmi memesan pekerjaan di tim pengembang untuk melakukan ini. Saya harap kami tidak menginjak kaki Anda!

Semua 48 komentar

Hai @wez ,
Sayangnya, ConPTY tidak akan mengirimkan laporan mouse (atau, dari aplikasi yang dihosting, _permintaan untuk pelaporan mouse_). Kami memiliki item backlog yang melacak ini yang kami harap akan segera kami dapatkan.

Sayangnya, kita tidak bisa begitu saja melewatkan peristiwa mouse yang disandikan melalui: karena ConPTY dapat meng-host aplikasi konsol windows standar, yang sejenisnya akan mengharapkan MOUSE_EVENT s masuk melalui ReadConsoleInput , kita akan perlu melakukan beberapa terjemahan.

Namun, dalam semua hal lain, sepertinya Anda mengatur pseudoconsole dengan benar.


Pelacakan: MSFT:20469462

@DHowett-MSFT terima kasih atas tanggapannya!
Agak mengecewakan bahwa pelaporan mouse belum ada, tetapi masih bagus bahwa hal-hal pty lainnya dimungkinkan sekarang!

Saya tidak punya apa-apa untuk ditambahkan selain benar-benar menginginkan dukungan mouse dengan ConPTY. Dengan alacritty sekarang memiliki dukungan ConPTY menggunakan alacritty + ssh + tmux adalah terminal linux yang luar biasa di Windows, hanya dukungan mouse yang kurang sekarang.

Saya adalah pengguna berat komandan tengah malam di shell bash Ubuntu saya di mana ia bekerja HEBAT. Sayangnya, tab shell Ubuntu di Windows Terminal 0.3.2171.0 tampaknya tidak mengirimkan event mouse APAPUN ke aplikasi mc, sehingga sangat sulit untuk saya gunakan. Saya akan memposting bug, tetapi saya ini akan menduplikasi ini.

Untuk penggunaan saya, mengirim acara mouse sangat penting untuk pengalaman yang baik dengan vim dan tmux.

Hanya menjatuhkan dukungan saya untuk ini di sini, ditambah sedikit konteks. Selama sebulan terakhir saya telah menghentikan dual boot dan mulai menggunakan Windows 10 insider build ring "cepat" sebagai mesin pribadi utama saya. Pada itu saya memiliki wsl2 bekerja dengan sempurna, x410 bekerja dengan sempurna, terminal microsoft bekerja dengan baik, interop kode studio visual wsl2 bekerja dengan sempurna, dan interop explorer.exe bekerja dengan sempurna.

Tiket input mouse ini adalah satu-satunya hal yang menghentikan saya untuk memanggil wsl2 / microsoft terminal pengganti yang masuk akal untuk memiliki partisi / kotak pengembangan yang terpisah. Karena beberapa tempat di sini adalah open source, apakah ada petunjuk tentang cara melihat input perangkat mouse dari suatu tempat di /dev atau haruskah saya bersabar?

Terima kasih untuk semua ini! Saya sangat suka sebaliknya :)

Satu suara lagi untuk mengatakan/meminta bahwa dukungan mouse akan sangat manis, dan sangat dirindukan oleh siapa pun yang menggunakan tmux, meskipun dapat bertahan tanpa itu.

Tolong tolong tolong aktifkan dukungan mouse

@DHowett-MSFT, maaf tentang cerewetnya, apakah ada rencana untuk memperbaikinya dalam waktu dekat? Melihat label/prioritas yang ditetapkan pada masalah lain, tetapi ini bukan salah satunya, jadi periksa saja. Terima kasih.

@damnskippy Prioritas ditugaskan untuk hal-hal yang perlu kami perbaiki di host konsol windows dalam kotak (karena tenggat waktu bug internal). Ini adalah fitur _huge_ (dan memerlukan spesifikasi skala yang tepat) dan sementara kami tahu kami membutuhkannya untuk v1.0, kami tidak secara aktif mengerjakannya hari ini.

Jika kita bisa "memperbaikinya" seperti bug, saya akan menyukainya -- tetapi ini membutuhkan lebih dari sekadar perbaikan.

Terima kasih atas pembaruannya. Pekerjaan Anda dihargai.

Saya suka apa yang Anda lakukan di sini, saya suka, tetapi sampai kami mendapatkan dukungan mouse, kami harus melengkapi terminal ini dengan terminal lain, yang agak mengalahkan tujuan terminal ini.

Midnight Commander tanpa ini adalah mimpi buruk.

Input Mouse secara umum dapat berguna, misalnya jika seseorang di komunitas, membuat add-in dan profil DosBox yang dapat dijalankan di Terminal Windows.

Saya pengguna vim berat; bahkan saya merindukan dukungan mouse

Saya baru saja membaca pembaruan blog @cinnamon-msft, sepertinya tim menargetkan 1.0 pada akhir tahun ini? Apakah ini berarti kami mendapatkan dukungan mouse pada akhir tahun? Jika ya, apakah saat ini sedang aktif digarap?

Apakah ini berarti kami mendapatkan dukungan mouse pada akhir tahun?

Mungkin, tapi tidak ada komitmen keras. Memperkirakan berapa lama waktu yang dibutuhkan perangkat lunak untuk menyelesaikannya sama sulitnya dengan membuktikan P==NP. Saya akan mengatakan bahwa terminal tidak akan siap 1.0 tanpa ini.

Jika ya, apakah saat ini sedang aktif digarap?

Tidak saat ini. Tidak ada yang ditugaskan untuk tugas itu, dan biasanya ketika seseorang di tim menggigit tugas, mereka akan menetapkannya sendiri.

Karena penasaran, apakah semuanya diperlukan untuk melakukan ini di sini? Bisakah pengembang yang ambisius (baca: gila) mengambilnya dan membuat PR?

Tentu, seseorang yang ambisius benar-benar dapat mencoba ini sendiri. Di mana untuk memulai?

Pertama, mari kita garis besar beberapa ruang lingkup. Ada banyak pekerjaan yang harus dilakukan dengan input mouse, jadi sebaiknya mulai dari yang kecil, dan kerjakan beberapa bagian untuk mendapatkan solusi yang lengkap. Saya pikir hal pertama yang harus kita lakukan hanyalah urutan naik/turun mouse yang disandikan SGR sederhana. Kami dapat mengerjakan acara roda mouse, lalu mungkin mengarahkan kursor, setelah itu, tetapi mengklik saya pikir akan menyelesaikan _sebagian besar_ kasus penggunaan.

Mulailah dengan melihat InputStateMachineEngine.cpp . InputStateMachineEngine bertanggung jawab untuk mengurai input yang dikirim melalui conpty, dan menerjemahkannya ke dalam INPUT_RECORD s. Pengembang muda yang giat ingin memodifikasi kelas itu agar dapat juga menguraikan urutan mouse tersebut, dan menerjemahkannya ke dalam INPUT_RECORD s. Setelah Anda memiliki INPUT_RECORD s, panggil InteractDispatch::WriteInput . Ini akan menambahkan INPUT_RECORD s itu ke buffer input. Setelah mereka berada di buffer input, mereka akan dikirimkan ke aplikasi klien konsol terlampir secara normal.

Hal-hal yang saya perhatikan:

  • conhost mungkin tidak memasukkan MouseEvents ke dalam buffer sama sekali kecuali kita dalam mode input mouse. Jika itu masalahnya, maka kita harus memastikan untuk mengabaikan urutan ini juga.
  • Aplikasi yang menginginkan input mouse dari VT tidak akan mendapatkan aliran INPUT_RECORD s, tetapi aliran karakter. Di beberapa titik di conhost, kami mencoba menerjemahkan mouse tersebut INPUT_RECORD s ke dalam aliran karakter, jika aplikasi yang dilampirkan dalam mode mouse VT. Jika kita melakukan terjemahan itu _before_ event mouse berada di buffer, maka melakukan hal di atas mungkin tidak bekerja untuk aplikasi VT (baca: wsl ). Jika demikian halnya, maka kita perlu memastikan bahwa terjemahan dari mouse INPUT_RECORD ke event mouse yang dikodekan VT dilakukan secara manual untuk event mouse yang dihasilkan oleh InputStateMachineEngine .

    • Melihat lebih jauh, itu memang terlihat seperti kasusnya. Sayangnya, kami hanya menerjemahkan input mouse untuk acara yang diprakarsai oleh jendela. Lihat kode ini:

      https://github.com/microsoft/terminal/blob/2c8b3243dca0c48dd05ecd7b420a7a03b3e19c93/src/interactivity/win32/windowio.cpp#L113 -L129

      terminalMouseInput.HandleMouse akan mensintesis urutan VT untuk aplikasi klien, tetapi sayangnya hanya dipanggil dari jendela proc. Jadi, entah bagaimana kita perlu mengekspos cara InputStateMachineEngine untuk memanggil itu (melalui metode baru pada InteractDispatch ), dan jika metode itu gagal, maka hasilkan INPUT_RECORD s.

    • Secara teknis, seseorang dapat memindahkan panggilan terminalMouseInput.HandleMouse alih-alih ke pembacaan InputBuffer, dan memintanya untuk mencoba menerjemahkan INPUT_RECORD s tepat saat sedang dibaca, tetapi itu mungkin lebih rumit.

Apa hubungannya dengan masalah ini? Mouse bekerja dengan sempurna di dalam Konsol Windows kuno. Apakah itu berarti saya harus terjebak dengan konsol sampai ini diperbaiki?

Jika Anda membutuhkan dukungan mouse VT, ya.

Sekedar informasi untuk setiap anggota komunitas yang mungkin telah melihat ini (/cc @SamuelEnglard!) Kami telah secara resmi memesan pekerjaan di tim pengembang untuk melakukan ini. Saya harap kami tidak menginjak kaki Anda!

Saya memikirkannya, tetapi belum dapat memesan waktu saya sendiri dengan sangat sempurna lol!

Saya baru saja bermain dengan VSCode dengan ekstensi pengembangan jarak jauh dan menemukan bahwa terminal terintegrasi di dalamnya sebenarnya mendukung mode mouse di tmux! Pemilihan panel, pemilihan jendela, pengubahan ukuran panel, dan dukungan roda gulir semuanya berfungsi. Saya baru dalam proyek ini, jadi saya tidak tahu apakah terminal adalah bagian dari open source VS Codium dan dapat digunakan sebagai titik awal... maaf jika info ini tidak terlalu berguna

Sekedar informasi untuk setiap anggota komunitas yang mungkin telah melihat ini (/cc @SamuelEnglard!) Kami telah secara resmi memesan pekerjaan di tim pengembang untuk melakukan ini. Saya harap kami tidak menginjak kaki Anda!

@DHowett-MSFT @zadjii-msft @bitcrazed Komunikasi Anda tentang masalah ini di sini dan di tempat lain sangat bagus; ini adalah contoh untuk berhasil melibatkan komunitas dalam membangun perangkat lunak Anda dan itu terlihat. Tim Anda (console/WSL/msft-linux) secara pribadi bertanggung jawab atas bisnis saya yang memiliki instalasi Windows (non-nix), sama sekali. Pertahankan karya yang luar biasa

@thinkjrs Banyak terima kasih atas kata-kata baik Anda.

Dan terima kasih kami yang tulus kepada Anda dan semua orang di komunitas kami yang menjalankan & menguji / mengajukan bug / mengirimkan pertanyaan, ide, dan permintaan tarik untuk Terminal, Cascadia Code, WSL, dll. Umpan balik Anda secara langsung memengaruhi kami saat kami memprioritaskan pekerjaan, dan rencana dan fitur desain.

Kami tidak bercanda ketika kami mengatakan bahwa kami membangun fitur ini untuk dan dengan komunitas kami

Apa prosesnya? Apakah ada mouse fungsional di WSL? Yaitu tmux panel switching, klik untuk mengubah saluran/server di weechat & irssi , (n)vim klik, aptitude klik, htop mengklik, dll.

Apa prosesnya? Apakah ada mouse fungsional di WSL? Yaitu tmux panel switching, klik untuk mengubah saluran/server di weechat & irssi , (n)vim klik, aptitude klik, htop mengklik, dll.

@dmxt Saat ini saya menggunakan wsltty yang paling kompatibel dari semua opsi terminal untuk saya. Saya berharap untuk beralih ke Terminal setelah beberapa fitur ini muncul.

Apa prosesnya? Apakah ada mouse fungsional di WSL? Yaitu tmux panel switching, klik untuk mengubah saluran/server di weechat & irssi , (n)vim klik, aptitude klik, htop mengklik, dll.

@dmxt Saat ini saya menggunakan wsltty yang paling kompatibel dari semua opsi terminal untuk saya. Saya berharap untuk beralih ke Terminal setelah beberapa fitur ini muncul.

Saya setuju dengan komentar Anda, setelah mencoba semua emulator terminal yang dikenal publik untuk Windows dalam beberapa tahun terakhir, untuk saat ini pada saat penulisan, wsltty adalah yang terbaik di luar sana. Repo resmi mereka juga bagus, mereka memiliki panduan yang luar biasa bagi saya untuk memulai dengan cepat. Anda tidak dapat meminta lebih baik dengan jenaka, itu mendapat dukungan mouse penuh tanpa cegukan di berbagai alur kerja dan alat yang berbeda.

Saya melihat sedikit latency di I/O dan saya pikir itu adalah hambatan dari sistem WSL1. Saya menggunakan Linux bare-metal dan ada latensi 0ms dengan input mouse.

@dmxt @offero Saya telah sukses dengan XShell (baris perintah nyata dari fitur eksperimental, atau ssh ke WSL) - memiliki dukungan mouse dll, hanya FYI. Juga aplikasi yang sangat membutuhkan dukungan mouse adalah komandan tengah malam dan editor mikro

Silakan lihat bagaimana itu diselesaikan di ConEmu

Adakah peta jalan atau garis waktu kapan tepatnya ini diharapkan akan dilaksanakan? Sepertinya fitur yang cukup penting untuk dirilis. Agak mengejutkan bagi saya bahwa v1.0 dirilis tanpa penyelesaian ini. Saya kira versi tidak berarti apa-apa saat ini.

@kvnxiao dalam versi Microsoft Store terbaru dari input mouse Terminal Windows didukung (setidaknya di Vim), sejauh yang saya tahu

@fat0troll Sejauh yang saya tahu, ini jelas bukan masalahnya. Bahkan dalam vim dengan set mouse=a , input mouse berfungsi pada conhost lama tetapi tidak pada Terminal Windows 1.0.1401.0.

set nocompatible
syntax on
set number
set mouse=a
set backspace=indent,eol,start

Dengan konfigurasi vim itu saya bisa mengklik di dalam jendela vim dan kursor akan pindah ke tempat yang saya klik. 1.0.1401.0, Windows build 18368.836 (jika ada pengaruhnya).

@kvnxiao Saya kira Anda menggunakan OpenSSH_For_Windows_7.7. Ada bug di dalamnya (diselesaikan di 8.x) yang mencegahnya bekerja untuk mode mouse.

Kami secara eksplisit menerapkan ini untuk semua aplikasi VT yang ingin menerima input mouse.

Saya kira versi tidak berarti apa-apa saat ini.

Tidak perlu bersikap tidak ramah.

Mengenai vim, saya sudah mencobanya menggunakan neovim yang dibuat untuk windows sebagai windows yang dapat dieksekusi. Jika orang lain mengatakan bahwa dukungan mouse berfungsi untuk vim (misalnya melalui ssh / wsl, dll.), maka saya tidak meragukan Anda, tetapi ini menunjukkan bahwa dukungan "penuh" belum ada, yang menimbulkan lebih spesifik pertanyaan:

Apa yang tersisa di peta jalan untuk dukungan mouse "penuh" dibandingkan dengan kemampuan conhost saat ini?

Saya berbicara dalam hal ingin meluncurkan aplikasi berbasis terminal generik yang mendukung input mouse (dan berfungsi di conhost) melalui WT. Misalnya, menjalankan beberapa aplikasi antarmuka pengguna berbasis teks/terminal yang dibangun langsung sebagai executable windows. Ini berfungsi dengan baik ketika mengklik dua kali untuk menjalankan, yang menggunakan conhost, tetapi ketika dijalankan melalui Terminal Windows mereka berakhir dengan hanya mouse yang memilih teks yang ditampilkan.

@niklaskorz Apa gunanya upvoting dan downvoting komentar tersebut ketika orang-orang seperti saya memiliki pertanyaan yang relevan yang berkaitan dengan topik ini, yang mungkin atau mungkin masih belum terselesaikan?

Anda benar sekali. Item kerja ini, yang telah Anda identifikasi dengan benar untuk aplikasi konsol Win32 yang menerima aktivitas mouse dari terminal mana pun, dijadwalkan untuk "terminal 1.x" (tonggak sejarah), yang menunjukkan bahwa kami ingin menanganinya antara sekarang dan 2.0. Saya tidak memiliki perkiraan yang lebih halus dari itu.

Terimakasih atas klarifikasinya! Agak sedih workitem ini tidak bisa dikompetisikan untuk 1.0 tapi saya sangat menunggu kapan itu terjadi, dan semoga tidak terlalu lama menunggu .

FIWW, jika Anda tidak menyadarinya, Powershell baru Out-ConsoleGridView (https://github.com/PowerShell/GraphicalTools) adalah kasus uji pembunuh untuk ini. Lihat bug pelacakan terkait Mouse di sana: https://github.com/PowerShell/GraphicalTools/issues/95

Itu dibangun di atas Terminal.Gui (https://github.com/tig/gui.cs).

Selain itu, kami baru saja membuat aplikasi sampel baru untuk Terminal.Gui yang harus dapat Anda gunakan untuk menguji dukungan mouse saat hadir di WT.

Benar-benar menantikannya!

Apakah ada cara saya dapat membantu memperbaiki masalah ini? Ini benar-benar mengecewakan untuk aplikasi konsol GUI yang dibangun dengan Terminal.Gui (https://github.com/tig/gui.cs).

@kvnxiao Saya kira Anda menggunakan OpenSSH_For_Windows_7.7. Ada bug di dalamnya (diselesaikan di 8.x) yang mencegahnya bekerja untuk mode mouse.

Kami secara eksplisit menerapkan ini untuk semua aplikasi VT yang ingin menerima input mouse.

Saya kira versi tidak berarti apa-apa saat ini.

Tidak perlu bersikap tidak ramah.

Bagaimana saya bisa memperbarui build-in openssh ke versi terbaru?

@kvnxiao Saya kira Anda menggunakan OpenSSH_For_Windows_7.7. Ada bug di dalamnya (diselesaikan di 8.x) yang mencegahnya bekerja untuk mode mouse.
Kami secara eksplisit menerapkan ini untuk semua aplikasi VT yang ingin menerima input mouse.

Saya kira versi tidak berarti apa-apa saat ini.

Tidak perlu bersikap tidak ramah.

Bagaimana saya bisa memperbarui build-in openssh ke versi terbaru?

Saya kira Anda sedang mencari sesuatu yang dijelaskan dalam posting blog ini (Instal Openssh dari cokelat): https://blog.frankfu.com.au/2019/03/21/moving-from-windows-1809s-openssh-to- openssh-portabel/

Saya kira Anda menggunakan OpenSSH_For_Windows_7.7. Ada bug di dalamnya (diselesaikan di 8.x) yang mencegahnya bekerja untuk mode mouse.

Kami secara eksplisit menerapkan ini untuk semua aplikasi VT yang ingin menerima input mouse.

@DHowett dari konteks ini, sepertinya menggunakan OpenSSH_for_Windows_8.0p1, LibreSSL 2.6.5 diharapkan berfungsi?

Saya menggunakan build pratinjau Terminal ke SSH ke mesin Ubuntu dengan mode mouse tmux diaktifkan, tetapi input mouse saya sepertinya masih hanya mengendalikan terminal itu sendiri.

Saya juga mencoba memutakhirkan server ke OpenSSH 8.0, tetapi itu juga tidak membantu.

Apakah masalah ini masih menghalangi hal semacam itu agar tidak berfungsi?

Ah, x di 8.x mungkin 1. Saya tidak menyadari bahwa mereka merilis versi 8.0.

Ah, x di 8.x mungkin 1. Saya tidak menyadari bahwa mereka merilis build 8.0.

Aku akan mencobanya.

Berhasil! Luar biasa, terima kasih!

Saya mulai memahami masalah ini.

Sayangnya, MS belum mengimplementasikan fungsi input mouse dari Win32 API di Terminal Windows.
(Hanya urutan escape VT yang didukung.)

Saya mencoba mengganti ReadConsoleInputW dan PeekConsoleInputW di aplikasi saya
untuk bekerja dengan mouse di Terminal Windows.

Pertama, saya menjalankan kode berikut.

SetConsoleMode(hin,  ENABLE_VIRTUAL_TERMINAL_INPUT);
SetConsoleMode(hout, ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
char *vt_mouse_input_enable_cmd  = "\x1b[?1000h\x1b[?1003h\x1b[?1006h";
DWORD written;
WriteConsoleA(hout, vt_mouse_input_enable_cmd, strlen(vt_mouse_input_enable_cmd), &written, NULL);

Kemudian, input mouse dapat diterima sebagai urutan escape VT (sgr-1006) (misalnya \x1b[<0;10;20M ).

Tapi, masalah lain terjadi.

Beberapa input kunci (seperti tombol panah) juga diterima sebagai urutan escape VT (misalnya \x1b[A ).

Saya mencoba mengonversi urutan pelarian VT yang tidak diinginkan ini ke acara kunci dari win32 API,
tapi ini tidak lengkap.
(kode kunci virtual dan kode pindai virtual dengan santai menjadi nol, dll.)

Kode saya di sini.
https://Gist.github.com/Hamayama/6add968870269f2426716fad79724b31
( PDC_read_console_input_w dan PDC_peek_console_input_w adalah fungsi alternatif.)

Saya ingin metode untuk menonaktifkan urutan pelarian VT kecuali untuk input mouse.

Misalnya

char *vt_key_input_disable_cmd = "\x1b[?9XXXl";
DWORD written;
WriteConsoleA(hout, vt_key_input_disable_cmd, strlen(vt_key_input_disable_cmd), &written, NULL);

atau

SetConsoleMode(hin, ENABLE_VIRTUAL_TERMINAL_MOUSE_INPUT_ONLY);

Tapi, ini mungkin ide yang salah untuk masa depan ...

Saya menemukan bahwa tidak ada pelacakan gerakan mouse di src/terminal/parser/InputStateMachineEngine.cpp: 391 (terjemahan SGR VT-sequences menjadi INPUT_RECORD s).

Dengan kata lain, Terminal mengirimkan urutan VT untuk ConPTY, tetapi ConPTY hanya memantau status tombol mouse. Perubahan koordinat mouse diabaikan:

src/terminal/parser/InputStateMachineEngine.cpp: 391 :

success = _UpdateSGRMouseButtonState(id, firstParameter, buttonState, eventFlags);
success = success && _WriteMouseEvent(parameters.at(1), parameters.at(2), buttonState, modifierState, eventFlags);

Dengan status dukungan saat ini untuk input mouse, opsi berikut dimungkinkan.

Anda dapat menambahkan pelacakan koordinat dan gerakan mouse akan mulai bekerja di aplikasi konsol klasik.

src/terminal/parser/InputStateMachineEngine.hpp: 172 :

+ size_t _mouseColumn = 0;
+ size_t _mouseLine = 0;

src/terminal/parser/InputStateMachineEngine.cpp: 391 :

- success = success && _WriteMouseEvent(parameters.at(1), parameters.at(2), buttonState, modifierState, eventFlags);
+ auto mouseColumn = parameters.at(1).value_or(0);
+ auto mouseLine = parameters.at(2).value_or(0);
+ auto isMoved = mouseColumn! = _mouseColumn || mouseLine! = _mouseLine;
+ if (isMoved)
+ {
+     _mouseColumn = mouseColumn;
+     _mouseLine = mouseLine;
+ }
+ success = (success || isMoved) && _WriteMouseEvent(mouseColumn, mouseLine, buttonState, modifierState, eventFlags);

Catatan: Sebelum memulai aplikasi konsol klasik, Anda perlu meminta pelacakan mouse dalam format SGR:

Windows PowerShell

PS C:\Users> [char]0x1b + "[?1003;1004;1006h"

Prompt Perintah

C:\Users> echo Ctrl+[ [?1003;1004;1006h

Parameter
  • 1003 - ANY_EVENT_MOUSE_MODE
  • 1004 - semua mode yang tidak didukung (misalnya 1001 atau 9999 ) untuk meneruskan urutan melalui ConPTY ke Terminal itu sendiri
  • 1006 - SGR_EXTENDED_MODE

sebagai hasilnya, Terminal akan mulai mengirimkan event mouse ke ConpTY, yang akan mulai menghasilkan INPUT_RECORD s untuk aplikasi konsol klasik.

Tangkapan yang bagus. Kita harus memastikan bahwa kita memperbaikinya ketika kita benar-benar bergerak untuk mendukung ini :senyum:

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

TayYuanGeng picture TayYuanGeng  ·  3Komentar

miniksa picture miniksa  ·  3Komentar

alabuzhev picture alabuzhev  ·  3Komentar

wkbrd picture wkbrd  ·  3Komentar

DieselMeister picture DieselMeister  ·  3Komentar