Terminal: [فارغ] أضف دعمًا لإدخال الماوس

تم إنشاؤها على ١٨ فبراير ٢٠١٩  ·  48تعليقات  ·  مصدر: microsoft/terminal

تشغيل: Microsoft Windows [Version 10.0.17763.134]

لقد قمت بتنفيذ conpty في محاكي Terminal الخاص بي:
https://github.com/wez/wezterm

يمكنني بنجاح تشغيل target\debug\wezterm.exe لنشر تطبيقات وحدة التحكم مثل cmd.exe powershell.exe و bash .

المشكلة التي أراها هي أنه عندما أقوم بتشغيل bash ، إما بشكل غير مباشر عبر cmd.exe أو مباشرة عبر قاذفة bash ، يبدو أن Conpty يبتلع تسلسلات هروب تقارير الماوس ؛ لا أرى أنهم يتلقونها من المحلل اللغوي الطرفي ، وبالتالي فإن vim ليس لديه دعم فعال للماوس على الرغم من تكوينه بـ set mouse=a .

تشغيل تثبيت WSL نفسه عبر wsl-terminal يحتوي على دعم الماوس العامل ، و wezterm كان برنامج التشغيل اليومي الخاص بي على Linux لمدة عام تقريبًا مع دعم الماوس العامل ، لذلك يمكننا استبعاد خطأ واضح في التكوين باستخدام vim والمحلل اللغوي بـ wezterm .

لقد جربت أيضًا echo -e "\e[?1000h" لتمكين تقارير الماوس يدويًا من الغلاف ؛ عادةً (على نظام التشغيل Linux وعبر wsl-terminal) يتسبب هذا في نقرات في الجهاز لإرسال البيانات إلى الغلاف (الذي يظهر كمدخلات قمامة) ، ولكن عند تشغيل الجهاز الطرفي فارغًا ، يتم ابتلاعها أيضًا في مكان ما.

هل هناك شيء خاص مطلوب للتطبيقات التي أفرزها في pty لتتمكن من العمل مع الماوس؟

في حالة رغبتك في مضاعفة التحقق من الجزء الرئيسي من الكود ، يكون الملف ذي الصلة:
https://github.com/wez/wezterm/blob/master/src/winpty.rs
التدفق إلى CreatePipe زوج من الأنابيب ، CreatePseudoConsole ، ثم تمرير ذلك إلى طفل تم إنتاجه عبر سمات threadproc ، كما تفعل العينات الموجودة في مستندات MSDN وهذا الريبو أيضًا.

Area-Interop Issue-Feature Product-Conpty

التعليق الأكثر فائدة

فقط لمعلوماتك لأي من أعضاء المجتمع الذين ربما كانوا يبحثون في هذا (/ ccSamuelEnglard!) لقد حجزنا رسميًا العمل في فريق التطوير للقيام بذلك. آمل ألا ندوس على أصابع قدميك!

ال 48 كومينتر

مرحبًا wez ،
لسوء الحظ ، لن يقوم ConPTY بنقل تقارير الماوس (أو ، من تطبيق مستضاف ، _طلبات الإبلاغ عن الماوس_). لدينا عنصر متراكم يتتبع هذا الأمر الذي نأمل في الوصول إليه قريبًا.

لسوء الحظ ، لا يمكننا فقط تمرير أحداث الماوس المشفرة من خلال: نظرًا لأن ConPTY يمكنه استضافة تطبيقات Windows القياسية لوحدات التحكم ، فمن المتوقع أن تصل أمثالها إلى MOUSE_EVENT s من خلال ReadConsoleInput ، سنقوم بحاجة إلى القيام ببعض الترجمة.

من ناحية أخرى ، يبدو أنك تقوم بإعداد وحدة التحكم الزائفة بشكل صحيح.


التتبع: MSFT: 20469462

@ DHowett-MSFT شكرا على الاستجابة!
إنه لأمر مزعج أن تقرير الماوس لم يكن موجودًا بعد ، ولكن لا يزال من الجيد أن بقية الأشياء pty أصبحت ممكنة الآن!

ليس لدي أي شيء لأضيفه بخلاف الرغبة حقًا في دعم الماوس مع ConPTY. مع وجود دعم ConPTY الآن باستخدام alacritty + ssh + tmux ، فهو عبارة عن محطة طرفية رائعة لنظام التشغيل Windows ، ولا يتوفر الآن سوى دعم الماوس.

أنا مستخدم كثيف لقائد منتصف الليل في غلاف Ubuntu bash حيث يعمل بشكل رائع. لسوء الحظ ، لا يبدو أن علامة تبويب Ubuntu shell في Windows Terminal 0.3.2171.0 ترسل أي أحداث ماوس عبر تطبيق mc ، مما يجعل من الصعب جدًا علي استخدامها. كنت سأقوم بنشر خطأ ، لكن هذا سيكرر هذا.

لاستخدامي ، يعد إرسال أحداث الماوس أمرًا في غاية الأهمية للحصول على تجربة جيدة مع vim و tmux.

فقط أسقط دعمي لهذا هنا ، بالإضافة إلى القليل من السياق. على مدار الشهر الماضي ، أوقفت التمهيد المزدوج وبدأت في استخدام حلقة Windows 10 الداخلية لإنشاء حلقة "سريعة" كجهازي الشخصي الأساسي. على ذلك ، لدي wsl2 يعمل بشكل مثالي ، x410 يعمل بشكل مثالي ، محطة مايكروسوفت تعمل بشكل رائع ، كود الاستوديو المرئي wsl2 يعمل بشكل مثالي ، ويعمل المتداخل explorer.exe بشكل مثالي.

بطاقة إدخال الماوس هذه هي الشيء الوحيد الذي يمنعني من استدعاء wsl2 / microsoft terminal كبديل معقول لوجود قسم منفصل / مربع تطوير. نظرًا لأن بعض المواقع هنا مفتوحة المصدر ، فهل هناك أي مؤشرات حول كيفية رؤية مدخلات جهاز الماوس من مكان ما في /dev أم يجب أن أتوقف قليلاً؟

شكرا على كل هذا بالرغم من ذلك! أنا حقا أحب ذلك على خلاف ذلك :)

صوت واحد آخر لقول / طلب أن دعم الماوس سيكون حلوًا للغاية ، ويفتقده بشدة أي شخص يستخدم tmux ، على الرغم من أنه يمكن نوعًا ما الحصول عليه بدونه.

يرجى من فضلك تمكين دعم الماوس 😄

@ DHowett-MSFT ، آسف بشأن تذمر ، هل هناك أي خطة لإصلاح هذا في أي وقت قريب؟ رؤية الملصقات / الأولويات المخصصة لقضايا أخرى ، ولكن هذه ليست واحدة منها ، لذا تحقق فقط. شكرا لك.

يتم تعيين أولوية damnskippy للأشياء التي نحتاج إلى إصلاحها في مضيف وحدة تحكم Windows (بسبب المواعيد النهائية للأخطاء الداخلية). هذه ميزة ضخمة (وتتطلب مواصفات ذات مقياس مناسب) وبينما نعلم أننا بحاجة إليها للإصدار 1.0 ، فإننا لا نعمل بنشاط عليها اليوم.

إذا تمكنا من "إصلاحه" مثل خطأ ، فأنا أحب ذلك - لكنه يحتاج إلى أكثر من مجرد إصلاح.

شكرا للتحديث. عملك موضع تقدير.

أنا أحب ما تفعله هنا ، وأنا أفعل ، ولكن حتى نحصل على دعم الماوس ، علينا أن نكمل هذه المحطة الطرفية بطرف آخر ، مما يهزم إلى حد ما الغرض من هذه المحطة.

قائد منتصف الليل بدون هذا كابوس.

يمكن أن يكون إدخال الماوس مفيدًا بشكل عام ، على سبيل المثال إذا قام شخص ما في المجتمع بإنشاء وظيفة إضافية DosBox وملف تعريف يمكن تشغيلهما في Windows Terminal.

أنا مستخدم هائج ثقيل ؛ حتى أفتقد دعم الماوس

لقد قرأت للتو تحديث مدونة @ cinnamon-msft ، يبدو أن الفريق يهدف إلى 1.0 بنهاية هذا العام ؟ هل هذا يعني أننا سنحصل على دعم الماوس بنهاية العام؟ إذا كان الأمر كذلك ، فهل يجري العمل به بنشاط الآن؟

هل هذا يعني أننا سنحصل على دعم الماوس بنهاية العام؟

ربما ، ولكن لا يرتكب بجد. إن تقدير الوقت الذي يستغرقه البرنامج لإنجازه هو بنفس صعوبة إثبات P == NP. سأذهب إلى حد القول إن المحطة لن تكون جاهزة 1.0 بدون هذا.

إذا كان الأمر كذلك ، فهل يجري العمل به بنشاط الآن؟

ليس حاليا. لا يتم تكليف أي شخص بالمهمة ، وعادةً عندما يقوم شخص ما في الفريق بضرب مهمة يقوم بتعيينها بنفسه.

بدافع الفضول ، هل كل شيء مطلوب للقيام بذلك هنا؟ هل يمكن لمطور طموح (اقرأ: مجنون) أن يتولى الأمر ويقوم بعمل علاقات عامة؟

بالتأكيد ، يمكن لأي شخص طموح تمامًا تجربة ذلك بمفرده. من أين نبدأ؟

أولاً ، دعنا نلخص بعض النطاق. هناك الكثير من العمل الذي يجب القيام به فيما يتعلق بإدخال الماوس ، لذلك من الأفضل أن تبدأ صغيرًا ، وتعمل على قطع للوصول إلى حل كامل. أعتقد أن أول شيء يجب أن نبدأ العمل به هو مجرد تسلسلات بسيطة لأعلى / لأسفل للفأرة مشفرة بـ SGR . يمكننا العمل على أحداث عجلة الماوس ، ثم ربما تحوم ، بعد ذلك ، ولكن النقر على ما أعتقد سيحل _ أكثر_ حالات الاستخدام.

ابدأ بإلقاء نظرة على InputStateMachineEngine.cpp . InputStateMachineEngine مسؤول عن تحليل المدخلات المرسلة الفارغة ، وترجمتها إلى INPUT_RECORD s. قد يرغب مطور شاب مغامر في تعديل هذه الفئة ليتمكن أيضًا من تحليل تسلسلات الماوس تلك ، وترجمتها إلى INPUT_RECORD s. بمجرد حصولك على INPUT_RECORD s ، اتصل بـ InteractDispatch::WriteInput . سيؤدي هذا إلى إضافة تلك INPUT_RECORD s إلى مخزن الإدخال المؤقت. بمجرد أن يكونوا في مخزن الإدخال المؤقت ، سيتم تسليمهم إلى تطبيق عميل وحدة التحكم المرفق بشكل طبيعي.

الأشياء التي كنت سأنتبه لها:

  • قد لا يقوم conhost بإدراج MouseEvents في المخزن المؤقت على الإطلاق إلا إذا كنا في وضع إدخال الماوس. إذا كان الأمر كذلك ، فعلينا أن نتأكد من تجاهل هذه التسلسلات أيضًا.
  • لن تحصل التطبيقات التي تريد إدخال الماوس من VT على دفق INPUT_RECORD s ، ولكن ستحصل على دفق من الأحرف. في مرحلة ما في conhost ، نحاول ترجمة تلك الماوس INPUT_RECORD s إلى سلسلة من الأحرف ، إذا كان التطبيق المرفق في وضع الماوس VT. إذا قمنا بهذه الترجمة _ قبل_ تكون أحداث الماوس في المخزن المؤقت ، فإن القيام بما ورد أعلاه قد لا يعمل مع تطبيقات VT (اقرأ: wsl ). إذا كان الأمر كذلك ، فسنحتاج إلى التأكد من أن الترجمة من الماوس INPUT_RECORD إلى أحداث الماوس المشفرة VT تتم يدويًا لأحداث الماوس التي تم إنشاؤها بواسطة InputStateMachineEngine .

    • بالنظر إلى الأمر أكثر ، يبدو الأمر كذلك. نترجم فقط إدخال الماوس للأحداث التي بدأتها النافذة للأسف. انظر هذا الرمز:

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

      سيقوم terminalMouseInput.HandleMouse بتجميع تسلسلات VT لتطبيق العميل ، ولكن يتم استدعاؤها فقط من نافذة proc للأسف. لذلك ، سنحتاج إلى كشف طريقة ما لـ InputStateMachineEngine لاستدعاء ذلك (عبر طريقة جديدة على InteractDispatch ) ، وإذا فشلت هذه الطريقة ، فقم بإنشاء INPUT_RECORD المناسب

    • من الناحية الفنية ، يمكن لأي شخص نقل المكالمة terminalMouseInput.HandleMouse بدلاً من ذلك إلى قراءة InputBuffer ، وجعله يحاول ترجمة INPUT_RECORD s بشكل صحيح أثناء قراءته ، ولكن قد يكون ذلك أكثر تعقيدًا.

ما التعامل مع هذه القضية؟ يعمل الماوس بشكل مثالي في وحدة تحكم Windows القديمة. هل هذا يعني أنني يجب أن أعلق مع وحدة التحكم حتى يتم إصلاح ذلك؟

إذا كنت بحاجة إلى دعم VT mouse ، نعم.

فقط لمعلوماتك لأي من أعضاء المجتمع الذين ربما كانوا يبحثون في هذا (/ ccSamuelEnglard!) لقد حجزنا رسميًا العمل في فريق التطوير للقيام بذلك. آمل ألا ندوس على أصابع قدميك!

فكرت في الأمر ، لكن لم أتمكن من حجز وقتي الخاص لول!

كنت ألعب للتو باستخدام VSCode مع امتدادات التطوير عن بُعد واكتشفت أن الجهاز المدمج فيه يدعم بالفعل وضع الماوس في tmux! اختيار اللوحة واختيار النافذة وتغيير حجم اللوحة ودعم عجلة التمرير كل العمل. أنا جديد في هذه المشاريع على الرغم من أنني لا أعرف ما إذا كانت المحطة الطرفية جزءًا من المصدر المفتوح VS Codium ويمكن استخدامها كنقطة انطلاق ... آسف إذا لم تكن هذه معلومات مفيدة حقًا

فقط لمعلوماتك لأي من أعضاء المجتمع الذين ربما كانوا يبحثون في هذا (/ ccSamuelEnglard!) لقد حجزنا رسميًا العمل في فريق التطوير للقيام بذلك. آمل ألا ندوس على أصابع قدميك!

@ DHowett-MSFT @ zadjii-msftbitcrazed كانت اتصالاتك بشأن هذه المسألة هنا وفي أي مكان آخر رائعة ؛ هذا نموذج لإشراك المجتمع بنجاح في بناء برنامجك وهذا يظهر. فريقك (فرقك) (وحدة التحكم / WSL / msft-linux) مسؤول شخصيًا عن عملي الذي لديه تثبيتات Windows (غير nix) ، على الإطلاق. استمروا في العمل المتميز 🥇

thinkjrs شكرا جزيلا

وشكرنا الصادق لك ولجميع الأشخاص في مجتمعنا الذين يديرون ويختبرون / يقدمون الأخطاء / يقدمون الأسئلة والأفكار وطلبات السحب الخاصة بـ Terminal و Cascadia Code و WSL وما إلى ذلك. وميزات التصميم.

لم نكن نمزح عندما نقول إننا نبني هذه الميزات لمجتمعنا ومعه 😜

ما هي العملية؟ هل توجد أية فأرة وظيفية في WSL؟ أي tmux تبديل اللوحة ، النقر لتغيير القناة / الخادم في weechat & irssi ، (n)vim نقرات ، aptitude النقر ، htop النقر فوق

ما هي العملية؟ هل توجد أية فأرة وظيفية في WSL؟ أي tmux تبديل اللوحة ، النقر لتغيير القناة / الخادم في weechat & irssi ، (n)vim نقرات ، aptitude النقر ، htop النقر فوق

dmxt حاليًا أستخدم wsltty الذي كان الأكثر توافقًا بين جميع خيارات المحطة الطرفية بالنسبة لي. أتطلع إلى التبديل إلى Terminal بمجرد ظهور بعض هذه الميزات.

ما هي العملية؟ هل توجد أية فأرة وظيفية في WSL؟ أي tmux تبديل اللوحة ، النقر لتغيير القناة / الخادم في weechat & irssi ، (n)vim نقرات ، aptitude النقر ، htop النقر فوق

dmxt حاليًا أستخدم wsltty الذي كان الأكثر توافقًا بين جميع خيارات المحطة الطرفية بالنسبة لي. أتطلع إلى التبديل إلى Terminal بمجرد ظهور بعض هذه الميزات.

أتفق مع تعليقك ، بعد تجربة جميع المحاكيات الطرفية المعروفة للجمهور لنظام Windows في السنوات العديدة الماضية ، في الوقت الحالي في وقت كتابة هذا التقرير ، فإن wsltty هو الأفضل على الإطلاق. يعد الريبو الرسمي رائعًا أيضًا ، ولديهم دليل رائع بالنسبة لي للبدء بطريقة سريعة. لا يمكنك أن تطلب ما هو أفضل مع بارع ، فقد حصلت على دعم كامل للماوس دون أي عوائق خلال مختلف مهام سير العمل والأدوات.

لقد لاحظت تأخيرًا طفيفًا في الإدخال / الإخراج وأعتقد أنه عنق الزجاجة لنظام WSL1. أنا أستخدم نظام Linux غير العادي وهناك زمن انتقال قدره 0 مللي ثانية مع إدخال الماوس.

@ dmxtoffero لقد نجحت مع XShell (سطر أوامر حقيقي من الميزات التجريبية ، أو ssh إلى WSL) - لديه دعم الماوس وما إلى ذلك ، فقط لمعلوماتك. أيضًا التطبيقات التي تحتاج إلى دعم الماوس بشكل سيئ هي قائد منتصف الليل والمحرر الصغير

يرجى إلقاء نظرة على كيفية حلها في ConEmu

هل هناك أي خارطة طريق أو جدول زمني لموعد تنفيذ ذلك بالضبط؟ يبدو أنه ميزة مهمة للغاية للإفراج عنها. إنه نوع من المفاجئ بالنسبة لي أن الإصدار 1.0 يتم إصداره دون حل هذه المشكلة. أعتقد أن الإصدار لا يعني أي شيء في الوقت الحاضر.

kvnxiao في أحدث إصدار من Microsoft Store من Windows Terminal إدخال الماوس مدعوم (على الأقل في Vim) ، بقدر ما أستطيع أن أقول

@ fat0troll بقدر ما أستطيع أن أقول ، هذا بالتأكيد ليس هو الحال. حتى في vim مع set mouse=a ، يعمل إدخال الماوس على مضيف قديم ولكن ليس Windows Terminal 1.0.1401.0.

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

باستخدام هذا التكوين vim ، يمكنني النقر داخل نافذة vim وسينتقل المؤشر إلى المكان الذي نقرت فيه. 1.0.1401.0 ، إصدار Windows 18368.836 (إذا كان له أي تأثير على ذلك).

kvnxiao سأخمن أنك تستخدم OpenSSH_For_Windows_7.7. هناك خطأ فيه (تم حله في 8.x) يمنعه من العمل في وضع الماوس.

لقد طبقنا هذا صراحة لجميع تطبيقات VT التي تريد تلقي مدخلات الماوس.

أعتقد أن الإصدار لا يعني أي شيء في الوقت الحاضر.

لا داعي لأن تكون قاسياً.

فيما يتعلق بـ vim ، لقد حاولت استخدام neovim المبني للنوافذ كنوافذ قابلة للتنفيذ. إذا قال الآخرون إن دعم الماوس يعمل من أجل vim (على سبيل المثال من خلال ssh / wsl ، وما إلى ذلك) ، فأنا لا أشك فيك ، ولكن هذا يوضح أن الدعم "الكامل" غير موجود حتى الآن ، مما يشكل عنصرًا أكثر تحديدًا سؤال:

ما الذي سيتم تركه في خارطة الطريق للدعم "الكامل" للماوس مقارنة بما يمكن لـ conhost القيام به حاليًا؟

إنني أتحدث من حيث الرغبة في إطلاق التطبيقات العامة القائمة على المحطة الطرفية التي تدعم إدخال الماوس (وتعمل في conhost) من خلال WT. على سبيل المثال ، تشغيل العديد من تطبيقات واجهة المستخدم المستندة إلى النص / المحطة الطرفية والتي تم إنشاؤها مباشرةً كنوافذ قابلة للتنفيذ. تعمل هذه بشكل جيد عند النقر عليها نقرًا مزدوجًا للتشغيل ، والتي تلجأ إلى استخدام conhost ، ولكن عندما يتم تشغيلها من خلال Windows Terminal ، ينتهي بها الأمر مع تحديد الماوس فقط للنص المعروض.

niklaskorz @ ما هو الهدف من التصويت المؤيّد والتخفيض على التعليقات المذكورة أعلاه عندما يكون لدى أشخاص مثلي أسئلة ذات صلة بهذا الموضوع ، والتي قد تكون أو لا تزال بدون حل؟

انت محق كليا. عنصر العمل هذا ، الذي حددته بشكل صحيح على أنه مخصص لتطبيقات وحدة التحكم Win32 التي تستقبل أحداث الماوس من أي محطة طرفية ، تم تحديده لـ "المحطة 1.x" (حدث رئيسي) ، مما يشير إلى أننا نريد معالجته بين الآن و 2.0. ليس لدي تقدير أكثر دقة من ذلك.

شكرا على التوضيح! من المحزن بعض الشيء أن عنصر العمل هذا لم يكن قادرًا على المنافسة على الإصدار 1.0 لكنني أنتظر بفارغ الصبر متى يحدث ذلك ، وآمل ألا يمر وقت طويل جدًا من الانتظار 😀.

FIWW ، في حال لم تكن على علم بذلك ، فإن Powershell الجديدة Out-ConsoleGridView (https://github.com/PowerShell/GraphicalTools) هي حالة اختبار قاتلة لهذا الغرض. شاهد خطأ التتبع المتعلق بالماوس هناك: https://github.com/PowerShell/GraphicalTools/issues/95

تم إنشاؤه على رأس Terminal.Gui (https://github.com/tig/gui.cs).

بالإضافة إلى ذلك ، أنشأنا للتو تطبيقًا نموذجيًا جديدًا مقابل Terminal.Gui والذي يجب أن تكون قادرًا على استخدامه لاختبار دعم الماوس عندما يأتي إلى الحياة في WT.

أتطلع إليها!

هل هناك أي طريقة يمكنني من خلالها المساعدة في حل هذه المشكلة؟ إنها مشكلة حقيقية لتطبيقات وحدة التحكم في واجهة المستخدم الرسومية التي تم إنشاؤها باستخدام Terminal.Gui (https://github.com/tig/gui.cs).

kvnxiao سأخمن أنك تستخدم OpenSSH_For_Windows_7.7. هناك خطأ فيه (تم حله في 8.x) يمنعه من العمل في وضع الماوس.

لقد طبقنا هذا صراحة لجميع تطبيقات VT التي تريد تلقي مدخلات الماوس.

أعتقد أن الإصدار لا يعني أي شيء في الوقت الحاضر.

لا داعي لأن تكون قاسياً.

كيف يمكنني تحديث opensh المدمج إلى أحدث إصدار؟

kvnxiao سأخمن أنك تستخدم OpenSSH_For_Windows_7.7. هناك خطأ فيه (تم حله في 8.x) يمنعه من العمل في وضع الماوس.
لقد طبقنا هذا صراحة لجميع تطبيقات VT التي تريد تلقي مدخلات الماوس.

أعتقد أن الإصدار لا يعني أي شيء في الوقت الحاضر.

لا داعي لأن تكون قاسياً.

كيف يمكنني تحديث opensh المدمج إلى أحدث إصدار؟

أعتقد أنك تبحث عن شيء موصوف في منشور المدونة هذا (التثبيت المفتوح من chocolatey): https://blog.frankfu.com.au/2019/03/21/moving-from-windows-1809s-openssh-to- opensh- المحمولة /

سأخمن أنك تستخدم OpenSSH_For_Windows_7.7. هناك خطأ فيه (تم حله في 8.x) يمنعه من العمل في وضع الماوس.

لقد طبقنا هذا صراحة لجميع تطبيقات VT التي تريد تلقي مدخلات الماوس.

DHowett من هذا السياق ، يبدو أن استخدام OpenSSH_for_Windows_8.0p1, LibreSSL 2.6.5 من المتوقع أن يعمل؟

أنا أستخدم بناء معاينة المحطة الطرفية إلى SSH إلى جهاز Ubuntu مع تمكين وضع الماوس tmux ، ولكن يبدو أن مدخلات الماوس الخاصة بي تتحكم فقط في الجهاز نفسه.

لقد حاولت أيضًا ترقية الخادم إلى OpenSSH 8.0 ، لكن ذلك لم يساعد أيضًا.

هل ما زالت هذه المشكلة تمنع هذا النوع من العمل؟

آه ، قد يكون x في 8.x 1. لم أكن أعلم أنهم أصدروا إصدار 8.0.

آه ، قد يكون x في 8.x 1. لم أكن أعلم أنهم أصدروا إصدار 8.0.

سأعطي ذلك فرصة.

إنها تعمل! مذهل شكرا لك!

بدأت أفهم هذه القضية.

للأسف ، لم تنفذ MS وظيفة إدخال الماوس في Win32 API على Windows Terminal حتى الآن.
(يتم دعم تسلسل هروب VT فقط.)

حاولت استبدال ReadConsoleInputW و PeekConsoleInputW في طلبي
للعمل مع الماوس على Windows Terminal.

أولاً ، أقوم بتشغيل الكود التالي.

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);

بعد ذلك ، يمكن تلقي إدخال الماوس كتسلسل هروب VT (sgr-1006) (على سبيل المثال \x1b[<0;10;20M ).

لكن حدثت مشكلة أخرى.

يتم أيضًا استلام بعض مدخلات المفاتيح (مثل مفاتيح الأسهم) كتسلسل هروب VT (على سبيل المثال \x1b[A ).

حاولت تحويل تسلسل هروب VT غير المرغوب فيه إلى حدث رئيسي في win32 API ،
لكن هذا غير مكتمل.
(رمز المفتاح الظاهري ورمز المسح الظاهري يصبحان صفرًا ، وما إلى ذلك)

الكود الخاص بي هنا.
https://gist.github.com/Hamayama/6add968870269f2426716fad79724b31
(PDC_read_console_input_w و PDC_peek_console_input_w هي وظائف بديلة.)

أريد طريقة لتعطيل تسلسل هروب VT باستثناء إدخال الماوس.

على سبيل المثال

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);

أو

SetConsoleMode(hin, ENABLE_VIRTUAL_TERMINAL_MOUSE_INPUT_ONLY);

لكن ، قد تكون هذه فكرة خاطئة للمستقبل ...

لقد وجدت أنه لا يوجد تتبع لحركة الماوس في src/terminal/parser/InputStateMachineEngine.cpp: 391 (ترجمة SGR VT-Sequences إلى INPUT_RECORD s).

بمعنى آخر ، يرسل الجهاز الطرفي تسلسلات VT لـ ConPTY ، لكن ConPTY يراقب فقط حالة أزرار الماوس. يتم تجاهل التغييرات في إحداثيات الماوس:

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

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

مع حالة الدعم الحالية لإدخال الماوس ، يكون الخيار التالي ممكنًا.

يمكنك إضافة تتبع منسق وستبدأ حركة الماوس في العمل في تطبيقات وحدة التحكم الكلاسيكية.

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);

ملاحظة: قبل بدء تطبيق وحدة التحكم الكلاسيكية ، تحتاج إلى طلب تتبع الماوس بتنسيق SGR:

نوافذ بوويرشيل

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

موجه الأمر

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

العوامل
  • 1003 - ANY_EVENT_MOUSE_MODE
  • 1004 - أي وضع غير مدعوم (مثل 1001 أو 9999 ) لإعادة توجيه التسلسل عبر ConPTY إلى Terminal نفسها
  • 1006 - SGR_EXTENDED_MODE

نتيجة لذلك ، ستبدأ المحطة الطرفية في إرسال أحداث الماوس إلى ConpTY ، والتي ستبدأ في توليد INPUT_RECORD s لتطبيق وحدة التحكم الكلاسيكية.

مسكة جيدة. سيتعين علينا التأكد من أننا نصلح ذلك عندما نتحرك بالفعل لدعم هذا: ابتسامة:

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

dev-logan picture dev-logan  ·  3تعليقات

TayYuanGeng picture TayYuanGeng  ·  3تعليقات

wkbrd picture wkbrd  ·  3تعليقات

alabuzhev picture alabuzhev  ·  3تعليقات

zadjii-msft picture zadjii-msft  ·  3تعليقات