Поддержка событий от мышки в терминальных программах
Нередко разработчики и проектировщики
сталкиваются с тем, что отсутствует поддержка
мышки обыкновенной в CHUI-программах
OpenEdge на платформах UNIX/Linux.
Дмитрий Кайдалов
Небольшие танцы с «бубном» – и всё работает.
Очень часто при наблюдении за операторами, которые работают на рабочих станциях под управлением Windows можно наблюдать ситуацию, когда он (оператор) тщетно пытается мышкой кликнуть на терминальную кнопку или выбрать нужную строчку в списке или меню. И в тоже время другие терминальные приложения – Midnight Commander, Joe – превосходно справляются с мышкой и обрабатывают события от неё.
Первое, что необходимо сделать, это перевести терминал в режим, в котором меняется поведение мышки для сессии. Все эксперименты проводятся на эмуляторе терминала PuTTY. Так как исходники доступны и есть подопытные программы, то и узнать специальную ESC-последовательность несложно. В итоге получаем две строки кода, которые включают и выключают такой режим. PUT SCREEN CHR(27) + "[?1000h". /*включение мышки*/ PUT SCREEN CHR(27) + "[?1000l" + CHR(27) + "%m". /*выключение мышки*/
После первой строки, если всё сделано правильно, курсор мышки должен поменяться на стрелочку. А после второй – обратно на курсор выбора текста.
При этом необходимо обратить внимание, чтобы в настройках PuTTY не стояла галочка, которая установлена на картинке!
Далее необходимо внести изменения в protermcap. Добавляем следующие строки к описанию терминала xterm: :GOTO(MOUSE-SELECT-DOWN)=\E[M :\ :GOTO(MOUSE-MENU-DOWN)=\E[M":\ :GOTO(MOUSE-EXTEND-DOWN)=\E[M!:\ :GOTO(MOUSE-SELECT-UP)=\E[M#:\ :GOTO(MOUSE-MOVE-UP)=\E[M`:\ :GOTO(MOUSE-MOVE-DOWN)=\E[Ma:\
Данным действием привязываем последовательности, которые передаёт мышка, к нажатию клавиши GOTO. А для каждого вида активности присваиваем свой KEY-LABEL.
Почему GOTO? Данная функция у нас никак не была задействована. Можно выбрать и другие значения, если есть необходимость.
Теперь при нажатии на кнопки мышки будем в ABL получать событие «GOTO». Однако легко сразу заметить, что после нажатия на клавишу мышки проскакивают два лишних символа. То есть в зависимости от положения курсора мышки, она посылает свои координаты. Так как событие «GOTO» больше никаким образом не может быть вызвано, то и после его возникновения необходимо эти два лишних символа считать. Причём для того, чтобы программа не зависла (а вдруг эти символы не придут?) считываем их без задержки. readkey pause 0. x = lastkey - 32. readkey pause 0. y = lastkey - 32.
А вот теперь кульминация. Запускаем редактор pro. И в нём запускаем следующую программу: on goto anywhere do: def var evt as char no-undo. def var x as integer no-undo. def var y as integer no-undo. evt = keylabel(lastkey). readkey pause 0. x = lastkey - 32. readkey pause 0. y = lastkey - 32. message evt x y. end. put screen chr(27) + "[?1000h". wait-for end-error,window-close of current-window. put screen chr(27) + "[?1000l" + chr(27) + "%m". quit.
Пробуем нажимать на мышке различные кнопки в разных местах экрана. А дальнейшее уже зависит от разработчика, как он это упакует и обработает.
Безусловно, у этого метода есть и свои недостатки.
Первый – необходимо самому заботиться о том – работает ли программа с мышкой или не работает – соответственно включать и выключать режим обработки мышки, так как в случае включения этого режима для программ, которые не знают про мышку, может вылиться в сбой программы или в неправильно введённые данные. И если, к примеру, программа, с включённым режимом мышки, вылетела по ошибке, а верхняя программа мышку не умеет обрабатывать, то и получиться конфликт. Данное поведение можно побороть следующими действиями либо переключать режим до и после запуска программы с мышкой, либо добавить в protermcap в строки инициализации и прекращения сессии соответствующие управляющие коды.
Второй недостаток побороть так и не получилось – из-за невозможности перехватывать события во время view-as alert-box невозможно нажать мышкой на кнопки на экране.
Однако, не смотря на эти недостатки, всё же есть возможность порадовать не только себя, а ещё и пользователей новыми возможностями (мы же для них и существуем).
Автор: Дмитрий Кайдалов
|