Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Some cosmetic improvements #1110

Open
froloffw7 opened this issue Oct 20, 2021 · 43 comments
Open

Some cosmetic improvements #1110

froloffw7 opened this issue Oct 20, 2021 · 43 comments

Comments

@froloffw7
Copy link

Предложения:

  1. При работе в сессии xterm и им подобным определять состояние нажатых модификаторов аналогично как это делается в mc через вызов XQueryPointer. Особенно актуально при работе через ssh.
  2. Переустанавливать перменную окружения HISTFILE, например: /tmp//.far_history, чтобы не забивать историю shell командами Far, бесполезными для последующего повтора в sh.
  3. В Far WX GUI восстановить WX диалоги запроса пароля root и подтверждения.

Возможные реализации этих предложении в приложенных файлах в архиве.

usefull.tar.gz

@elfmz
Copy link
Owner

elfmz commented Oct 20, 2021

  1. пересекается с Bring tty version to functional parity with wx version as close as possible #1101 и я все еще не понимаю этой идеи скрещивать ужа с ежом - типа быть консольной аппликухой, но дергать иксовые функции тут и там. Почему просто не быть честно иксовой апликухой? Ну и проблема с XQueryPointer в том что она иксовая, а иксов ведь может не быть (например, wayland). Хотя можно конечно сказать - ну нету так нету, но это приводит к так сказать фрагментации user experience.
  2. Можно, но покажите сценарий когда воспроизводится проблема. Сейчас far2l при посылке своей команды в шелл начинает ее с пробела - специально чтобы она в хистори не добавлялась. Хотя это при желании можно сломать - https://unix.stackexchange.com/questions/115917/why-is-bash-not-storing-commands-that-start-with-spaces
  3. Но почему?

@froloffw7
Copy link
Author

froloffw7 commented Oct 20, 2021

  1. Весьма актуально для удалённой работы через ssh. X-овая сессия тормозит, а в терминальной без модификаторв весьма неудобно. Если не будет X11, значит определяем (пытаемся определить) состояние через ioctl(). Wayland способ тоже можно прикрутить.

  2. Вот, к примеру, что у меня сыплется в историю:

vim boxdraw.c
exit
 . /tmp/far2l_3e8_0/vtcmd/26f7_1;echo -ne $'\x1b'"_far2l_8D03r2W7s:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_2;echo -ne $'\x1b'"_far2l_5lnPP74OkC4N9U:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_3;echo -ne $'\x1b'"_far2l_JTS3Zf4f9R:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_4;echo -ne $'\x1b'"_far2l_wq4E6Z5Kl87P5:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_5;echo -ne $'\x1b'"_far2l_g96KYdC183:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_6;echo -ne $'\x1b'"_far2l_U9Y1ZGgpt6Ls5:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_7;echo -ne $'\x1b'"_far2l_HDmx9Yl780WGl1Uw:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_8;echo -ne $'\x1b'"_far2l_73oVuo1YLeMO:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_9;echo -ne $'\x1b'"_far2l_R2X6uFk1O78o:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_10;echo -ne $'\x1b'"_far2l_8X4UGH22BJJ:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_11;echo -ne $'\x1b'"_far2l_3j6B0F9S13I:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_12;echo -ne $'\x1b'"_far2l_8NpKtd3obQW157j:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_13;echo -ne $'\x1b'"_far2l_9EB00ZZ14z4:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_14;echo -ne $'\x1b'"_far2l_2J5xtuN8s5u:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_15;echo -ne $'\x1b'"_far2l_cijDs5YE6f4fOEm7:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_16;echo -ne $'\x1b'"_far2l_HRuY3r9SeYA:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_17;echo -ne $'\x1b'"_far2l_4DR3r2dN:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_18;echo -ne $'\x1b'"_far2l_UfpCGwXu0FCqNB0:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_19;echo -ne $'\x1b'"_far2l_7AqrJOx5W:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_20;echo -ne $'\x1b'"_far2l_N712mO27VGW3:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_21;echo -ne $'\x1b'"_far2l_s6HLe5T866w44E9f:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_22;echo -ne $'\x1b'"_far2l_3qjaO0X0i4Ckl:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_23;echo -ne $'\x1b'"_far2l_7mlb7KH4NmoDy4:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_24;echo -ne $'\x1b'"_far2l_sY2003h914Uz:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_25;echo -ne $'\x1b'"_far2l_95nc2co01dm:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_26;echo -ne $'\x1b'"_far2l_q46guiSM74W75:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_27;echo -ne $'\x1b'"_far2l_sW8nv3y2:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_28;echo -ne $'\x1b'"_far2l_Z3T2rscy:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_29;echo -ne $'\x1b'"_far2l_3W6ffKck5H719l7:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_30;echo -ne $'\x1b'"_far2l_mbOmGqKZ0T3xs46:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_31;echo -ne $'\x1b'"_far2l_566QlZhZoN0KP:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/26f7_32;echo -ne $'\x1b'"_far2l_xt6uNJJTt80:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/5b8a_1;echo -ne $'\x1b'"_far2l_8D03r2W7s:$FARVTRESULT"$'\x07'
EXIT
exit
 . /tmp/far2l_3e8_0/vtcmd/5baa_1;echo -ne $'\x1b'"_far2l_8D03r2W7s:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/5baa_2;echo -ne $'\x1b'"_far2l_5lnPP74OkC4N9U:$FARVTRESULT"$'\x07'
 . /tmp/far2l_3e8_0/vtcmd/5baa_3;echo -ne $'\x1b'"_far2l_JTS3Zf4f9R:$FARVTRESULT"$'\x07'
export
cd /tmp/st
vim boxdraw.c
cd work/

  1. Чисто эсттические предпочтения. WX диалоги выглядят поприятнее.

@elfmz
Copy link
Owner

elfmz commented Oct 20, 2021

  1. Я может чтото не понимаю, но если у вас удаленное подключение по ssh открытом в обычном иксовом терминале и вы запустите far2l на той стороне, но исковые функции тому far2l не будут доступны, потому что иксы - тут , а far2l - там. Впрочем решение проблемы есть - можно тут запустить wx-овый far2l, потом в NetRocks создать sftp или scp подключение туда, зайти в то подключение и запустить в командной строке (которая в случае активного подключения NetRocks/sftp исполняет по SSH команды там ) far2l - то будет сюрприз)
  2. А что выводит echo $HISTCONTROL ?
  3. Точно не скажу, но вроде в то время когда диалоги были гуишными, были баги на то чтобы сделать их текстовыми) - оно так консистнее както. Хотя в принципе можно сделать настройку опционально возвращающую гуишный sudo диалог, просто даже не думал что так комуто будет нравится больше.

@froloffw7
Copy link
Author

froloffw7 commented Oct 20, 2021

  1. Как я понимаю, в этом случае Far2 запускается на удалённой стороне, а функция XQueryPointer определяет состояние модификаторов на рабочем месте.
  2. Переменная окружения HISTCONTROL у меня не определена, система Ubuntu 20.04 LTS.
  3. В коде, что я приложил, эти диалоги дёргаются из far2_gui.so. Если Far2 запускается из терминала, то соответственно отображаются текстовые.

@froloffw7
Copy link
Author

froloffw7 commented Oct 20, 2021

Дополнение к 1. Я безусловно в курсе про возможность удалённого исполнения команд в Far2 через NetRocks. Но, эмулятор терминала в Far2 в текущей версии неполный. Например, редактировать файл в Vim скорее всего толком не получится. В общем этого и не требуется, поэтому и нет смысла тратить время на доведение его до уровня xterm или st.

@elfmz
Copy link
Owner

elfmz commented Oct 20, 2021

1

  • Дело тут не только в возможности удаленного исполнения, но еще в том что эмулятор терминала far2l имеет расширения терминала, позволяющие запущенному внутри far2l работать как гуишному.
  • XQueryPointer максимум сможет определить положение модификаторов лишь на той стороне, где она сама исполняется. То есть на той стороне где работает SSH сервер, а не там где надо, или я все еще чегото не допонимаю.
  • Если чтото в vim не работает - пишите баги) Эмулятор далеко не идеальный конечно, но проблемы у него больше в области поддержки символов двойной ширины и режимов с виртуальной шириной терминала большей чем физическое окно, и это все ортогонально vim-у.
  1. Ага, понятно, то есть такое все таки бывает.

@froloffw7
Copy link
Author

froloffw7 commented Oct 20, 2021

  • Круто, что ещё могу сказать.
  • С этим кодом у меня при работе через ssh состояние модификаторов определяется, с точностью до Shift, Alt и Control. Левые и правые не различаются. Как оно внутри происходит, точно сказать не могу. Раньше было очень некомфортно работать, особенно из-за того, что для <Enter> и <BS> терминал всегда передаёт одинаковые keycodes независимо от состояния модификаторов. Набираешь командную строку, по привычке жмёшь <Control-Enter>, чтобы вставить имя файла, а оно запускается на исполнение.
  • Вы уверены, что Вам это нужно?
  1. Увы

@elfmz
Copy link
Owner

elfmz commented Oct 20, 2021

1
.
. Посмотрю подробнее. В целом, про улучшение качества жизни в терминале, самым правильным решением мне видится #641 - в принципе тоже расширения протокола ESC-последовательностей, просто более общепринятое, но правда и менее функциональное/гибкое. Ну хоть чтото.
. Баги про чтото неработающее в вим? Нужны конечно.

2 А можете проверить - сделайте export HISTCONTROL=ignorespace или ignoreboth (в моей убунте 18.04 именно ignoreboth), потом запустите far2l с такой переменной установленной, и проверьте что он не будет гадить в хистори? Если поможет - то я просто добавлю приведение HISTCONTROL к адекватному состоянию при запуске far2l.

@froloffw7
Copy link
Author

froloffw7 commented Oct 20, 2021

  1. Относительно Vim.
  • Я не смотрел код, поэтому уточню, как реализовано у Вас переключение экранных буферов? Vim переключается в режим Alternate. В нём размер буфера равняется размеру экрана и скроллинг запрещён. В xterm/st команды скролинга передаются vim. В терминале Far2l экран скролится мышкой, хотя сам Far2l при запуске в терминале в этот режим переключается.
  • запустите vim, дальше :sp или :vsp и попробуйте переключиться мышкой в другую часть экрана.
  • Выделение сразу копируется в буфер обмена и сбрасывается. Это скорее особенность Far2l. В обычном Far не так. Но из-за этого функция выделения мышью --VISUAL-- в vim не работает.
  • Какие-то проблемы с подсветкой синтаксиса. У меня отображается только серый, белый и зелёный цвета. Возможно у меня специфические настройки .vimrc.
  1. В первом приближении, export HISTCONTROL=ignorespace убирает проблему с загаживанием истории.

@elfmz
Copy link
Owner

elfmz commented Oct 20, 2021

Alternate реализован, а вот до мышки руки все еще не дошли :) Мышка в терминале работает только на adhoc-copy, событий приложениям при этом никаких не посылается - все обрабатывается на уровне терминала. В принципе надо бы сделать.

@froloffw7
Copy link
Author

Дополнение. Для проверки подключился к Ubuntu Desktop через ssh и в нем ещё один ssh на Ubuntu Server console only, На серверной Ubuntu DM не установлен. В Far2l с вызовом XQueryPointer() <Control-Enter> работает и в такой конфигурации.

@elfmz
Copy link
Owner

elfmz commented Oct 20, 2021

Магия. Ну я попробую, попозже. Может там есть какието ESC последовательности, и XQueryPointer их шлет, видя что работает без иксов.
Чтоб уточнить, что я правильно понимаю, как происходит проверка - юзер запускает gnome terminal, в нем - ssh на какой то другой сервер, запускает там far2l собранный с твиком на основе XQueryPointer, и тот за счет этого твика начинает различать Enter от Ctrl+Enter, нажатые в изначальном гном терминале?

@froloffw7
Copy link
Author

froloffw7 commented Oct 20, 2021

Установленного Gnome нет под рукой, пробовал xterm, mate-terminal и st.
ssh запускается с ключом -X из терминала.
И далее far2l --ee=1
PS чтобы заработал colorer потребовалось подкинуть libxerces-c-3.2.so.
PPS С твиком Far2l корректно работает даже в linux-putty терминале. vim нет - putty не отрабатывает модификаторы.

@elfmz
Copy link
Owner

elfmz commented Oct 20, 2021

АААА, то есть запускаете с X11 форвардингом и XQueryPointer юзает его. Хмм, может в этом и есть чтото..

@elfmz
Copy link
Owner

elfmz commented Oct 20, 2021

Насчет putty - есть твикнутая версия, которая умеет в far2l extensions про которые я в самом начале писал - https://github.com/unxed/putty4far2l

@unxed
Copy link
Contributor

unxed commented Oct 20, 2021

с #641 есть проблемка: ни гном, ни кде не хотят его целиком поддерживать из соображений безопасности (как они её понимают). типа записать в клипборд — пожалуйста, а вот читать оттуда — ни-ни

@unxed
Copy link
Contributor

unxed commented Oct 20, 2021

аргумент про фрагментацию user expirience мне кажется вполне легитимным. к примеру, если к существующим средствам работы с clipboard добавить ещё и xclip и osc 52, на вопрос "почему не работает буфер обмена" пользователь получает миллион вариантов ответа:

  • а вы как far2l запускали? локально или удалённо? а из какого терминала? а ssh с форвардингом иксов или нет? а иксклип установлен? а на удалённой машинке?

такое положение вещей, конечно, дичь)

при этом на все вопросы можно отвечать "юзайте wxовый, в нём всё просто работает из коробки". ну типа как firefox и всякие там palemoon: каждый может форкнуть, но торговая марка за mozilla foundation, и все знают, куда ходить за идеальным user expirience'ом

а кому нужны специфические конфигурации или кто фанат конкретной терминалки, те уж разберутся. то есть всякими такими твиками типа поддержки xclip или XQueryPointer мы собираем "длинный хвост" "не мейнстримных" пользователей, которых в мире линукса, надо полагать, полно

@unxed
Copy link
Contributor

unxed commented Oct 21, 2021

То есть, wx'овая версия — это basic, default, и она «на гарантии». Хотите гонять в терминале без экстеншнов — на здоровье, такая возможность есть, но никакие претензии не принимаются, саппорт не предоставляется: чудо что там вообще что-то работает, и мы вас предупреждали! Можно хотя бы даже плашку такую показывать при запуске в терминале без экстеншнов: мол, тут работает не всё, рекомендованный способ запуска — через wx, делается это так-то.

Совсем идеальный вариант: стать настолько популярными, чтоб ВСЕ терминалы добавили поддержку экстеншнов :)

@unxed
Copy link
Contributor

unxed commented Oct 21, 2021

Так много кто делает, к слову. Скажем, hashcat рассчитан на проприетарные OpenCL драйвера. Он работает и на Mesa, но поддержка не предоставляется.

@elfmz
Copy link
Owner

elfmz commented Oct 21, 2021

ни гном, ни кде не хотят его целиком поддерживать из соображений безопасности (как они её понимают). типа записать в клипборд — пожалуйста, а вот читать оттуда — ни-ни

Соображения валидные, far2l из таких же соображений позволяет читать клипборд только если в течении ближайших 5 сек юзер нажимал Ctrl+C или щелкал правой кнопкой мышки. То есть если клипборд будет пытаться прочитать какой нить скрипт по своей инициативе - получит шиш.

@elfmz
Copy link
Owner

elfmz commented Oct 21, 2021

X11 форвардинг кстати может быть неплохой альтернативой этим сторонним расширениям. Есть подозрение, что помимо опроса состояния модификаторов - еще и клипборд можно пробрасывать таким способом. Вот только keyup/keydown в реальном времени получать не получится.

@froloffw7
Copy link
Author

Чтобы получать нажатия в реальном времени нужно запускать обработчик events

        XNextEvent( dpy, &e );

и обрабатывать нажатия и отпускания

      switch (e.type) {
           case ButtonPress:
           case ButtonRelease:

@froloffw7
Copy link
Author

froloffw7 commented Oct 21, 2021

По поводу установки цветов в режиме терминала. Чтобы не заморачиваться с RGB, можно просто менять цвета в палитре. Например. В этом примере цвета меняются для всех запущенных терминалов. Для Far2l достаточно будет сгенерированные OSC записать в stdout.

Цвета в терминале по умолчанию
Цвета в терминале по умолчанию

Цвета помягче с изменённой палитрой по образцу палитры WX
Цвета помягче с изменённой палитрой по образцу палитры WX

Простенький скрипт вывода цветов палитры терминала (в Far2l не работает)

#!/bin/bash
for((i=0; i<16; i++)); do
    printf "\e[48;5;${i}m%03d" $i;
    printf '\e[0m';
done
printf '\n'

и результат

Screenshot3

@elfmz
Copy link
Owner

elfmz commented Oct 21, 2021

Но ведь нажатия будут приходить в терминальное окошко, не получится их перехватывать не перехватывая фокус ввода, а это чревато новыми забавными спецэффектами и костылями

@froloffw7
Copy link
Author

Как я понимаю, если окно не активно (no Focus), то события клавиш ему не присылаются

@unxed
Copy link
Contributor

unxed commented Oct 21, 2021

X11 форвардинг кстати может быть неплохой альтернативой этим сторонним расширениям

Ну расширения только не надо выпиливать, пожалуйста :) Расширения очень даже ок! :) На винде вот нет никаких иксов, которые можно было бы форвардить, а патченная путти чудесным образом работает через расширения.

@unxed
Copy link
Contributor

unxed commented Oct 21, 2021

far2l из таких же соображений позволяет читать клипборд только если в течении ближайших 5 сек юзер нажимал Ctrl+C или щелкал правой кнопкой мышки

Написал об этом в тикетах гнома и кде по OSC 52, может, так же сделают

@unxed
Copy link
Contributor

unxed commented Dec 12, 2021

При работе в сессии xterm и им подобным определять состояние нажатых модификаторов аналогично как это делается в mc через вызов XQueryPointer. Особенно актуально при работе через ssh.

А вот это готово у нас же, да?

И, кстати, про это же у нас #1126 есть.

@elfmz
Copy link
Owner

elfmz commented Dec 12, 2021

Готово да. От оригинального бага осталось только GUI диалоги пароля, но чета я в раздумьях и реальной пользы такой фичи и если ее таки делать - как ее включать? Не хочется замусоривать настройки, оставить как опцию конфигура сборки?

@unxed
Copy link
Contributor

unxed commented Dec 12, 2021

Кстати, у меня на десктопе по Alt таки не появляются подсказки в tty версии.

@elfmz
Copy link
Owner

elfmz commented Dec 12, 2021

И не должны, так как это просто опрос модификаторов по нажатию кнопки, сами события нажатия модификаторов не приходят

@unxed
Copy link
Contributor

unxed commented Dec 12, 2021

И не должны, так как это просто опрос модификаторов по нажатию кнопки, сами события нажатия модификаторов не приходят

а как бы тогда проверить, что оно вообще работает? все сочетания клавиш, кроме контрол цифр, работали, вроде бы, и до. а контрол цифры не работают и сейчас

UPD: а, <Control-Enter>, вижу. работает, ага :) а вот <Control-BS> у меня и так работал, странно

@unxed
Copy link
Contributor

unxed commented Dec 12, 2021

Вот только keyup/keydown в реальном времени получать не получится.

Придумали же, как :) #1126

@elfmz
Copy link
Owner

elfmz commented Dec 12, 2021

боюсь много проблем будет в связи с нечетким отслеживанием фокуса - когда реагировать на нажатия, а когда нет, но пока не попробуешь точно не узнаешь

@unxed
Copy link
Contributor

unxed commented Dec 12, 2021

Добавляем в заголовок окна некий случайный токен. При получении события клавиатуры спрашиваем у иксов название заголовка активного окна. Ищем там строки «Far» и этот токен. Если находим — событие «наше».

xdotool getactivewindow getwindowname

@elfmz
Copy link
Owner

elfmz commented Dec 12, 2021

Тут в соседних темах писали про запуск в терминалках а-ля quake console, я сомневаюсь что там с окнами все будет так однозначно.

@unxed
Copy link
Contributor

unxed commented Dec 12, 2021

В guake всё будет работать, если включить установку заголовка окна в заголовок таба:
Preferences — Main Window — Set window title to current tab name

В yakuake всё будет работать, если:
— Создать новый профиль
— Вкладки - Формат заголовка вкладки - %w
— Сделать новый профиль основным

Я прям вот только что проверил.

Если есть какие-то другие — можно попросить их авторов сделать как в этих двух.

@unxed
Copy link
Contributor

unxed commented Dec 12, 2021

Придётся, конечно, написать FAQ, и туда прописать чеклисты для типичных кейсов: не работает буфер обмена, не подхватывается полностью клавиатура, не работают перехваченные DE или терминалкой хоткеи, что делать? И в хелп этот FAQ запихнуть.

@unxed
Copy link
Contributor

unxed commented Dec 12, 2021

И если даже терминалка не хочет устанавливать заголовок окна правильно, мы же можем делать это и сами: wmctrl -r ':ACTIVE:' -N "your_unique_window_name" (в момент прихода любого клавиатурного символа в консоль, например).

@elfmz
Copy link
Owner

elfmz commented Dec 12, 2021

Вот это вот момент - это отдельный пункт для беспокойства, сетевая задержка может быть сотни мсек, round-trip ее удваивает. В результате будут неприятные баги типа альтабнулся и сразу начал печатать - а оно печатает куда не надо или не печатает куда надо. По факту надо делать привязку к классическим сообщениям терминала, а с помощью клавиатурного хука лишь их корректировать, это избавит от таких косяков, но реализация такого двухканального ввода мягко говоря обещает быть нетривиальной.

@unxed
Copy link
Contributor

unxed commented Dec 12, 2021

О, оказывается, можно просто попросить терминалку сообщать о получении/потере фокуса escape последовательностями:

https://unix.stackexchange.com/a/480138/422943

Работает в GNOME Terminal, Konsole, Guake, Yauake — короче, во всём, в чём пробовал. В tmux, возможно, с ними сложно, но это не точно, да и Far в tmux это уж совсем экзотика. И, в любом случае, «режим хука» можно же включать только при получении первого события получения фокуса, а по умолчанию работать как сейчас. В терминалке GNOME и всём на его основе, кстати, текущий статус приходит сразу при включении (попросил впилить в Konsole такое тоже).

echo -ne '\e[?1004h'
showkey -a

и альт-табнуться несколько раз

@unxed
Copy link
Contributor

unxed commented Dec 14, 2021

  1. В tmux события фокуса таки работают (ну, у меня на Mint, по крайней мере), но надо включать специально:
    https://vi.stackexchange.com/a/18529

  2. Как определить текущий статус фокуса для Konsole, xterm и прочих терминалок, у которых сразу в ответ на включение событий фокуса не приходит текущий его статус? А очень просто :)
    xdotool getwindowfocus — узнаём айди текущего окна с фокусом, допустим это 1234
    xdotool windowfocus 1 && xdotool windowfocus 1234 — убираем фокус с окна и тут же возвращаем обратно.
    Вуаля! Если на терминалке был фокус, в неё падает соответствующая последовательность. Если не было — не падает.

Вот демка xchecktermfocus.sh.tar.gz, можно погонять её в разных терминалах с фокусом и без. У меня везде корректно определяет :)

Этот приём, правда, не позволяет различать ситуации «мы не в фокусе» и «события фокуса не поддерживаются». Поэтому нужна чуть более хитрая эвристика:

  1. включаем события фокуса
  2. если сразу пришло ^[[I — ура, мы в терминалке гнома или её потомке, включаем режим хука и считаем, что мы в фокусе, конец алгоритма.
  3. при первом приходе любого нажатия клавиши в терминал:
    3.1. проделываем трюк с потерей и возвращением фокуса активного окна, как описано выше
    3.2. если нам упало в терминал ^[[O^[[I, значит, события фокуса поддерживаются.
    включаем режим хука и считаем, что мы в фокусе
    3.3. если не упало ничего, значит, события фокуса не поддерживаются, работаем в обычном режиме

@unxed
Copy link
Contributor

unxed commented Nov 23, 2022

Придумал таки относительно надёжный способ определения фокуса на окне терминала:

#!/bin/bash
uuid=$(uuidgen)
echo -ne "\033]0;${uuid}\007"
xid=$(xdotool search --name ${uuid})
echo "Current terminal's window X11 id: $xid"
activeid=$(xdotool getactivewindow)
echo "Active window X11 id: $activeid"
if [ "$xid" == "$activeid" ]; then
    echo "Terminal is active"
else
    echo "Terminal is NOT active"
fi
read

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants