Я реализовал эмулятор терминала и соответствующую запись в terminfo, которая позволяет мне запускать программы ncurses, такие как emacs, mc (midnight commander) или < em> tig (браузер git). Я хочу добавить поддержку мыши в терминал, в первую очередь, чтобы поместить курсор в emacs, щелкнув окно. После долгих поисков в Google и некоторой помощи по stackoverflow я узнал о необходимых полях terminfo (в первую очередь kmous
) и последовательностях управления (например, \E[?1000h
) и «key» (\E[M...
) и реализовал события кнопок мыши в моем терминале. Я написал небольшую программу ncurses, которая выглядит примерно так:
initscr ();
clear ();
noecho ();
cbreak ();
keypad (stdscr, TRUE);
mousemask (ALL_MOUSE_EVENT, NULL);
if (has_mouse ())
{
while (1)
{
switch (getch ())
{
case KEY_MOUSE:
if (getmouse (&event) == OK)
{
printf ("mouse event 0x%x at %i,%i\n", event.bstate, event.x, event.y);
Эта программа отлично работает на xterm и моем терминале, поэтому и мой терминал, и его запись terminfo не могут быть полностью неправильными.
Однако mc, похоже, не распознает поддержку мыши в моем терминале, даже не выдает никакой \E[?1000h
последовательности для ее активации и, следовательно, совершенно сбит с толку событиями кнопки мыши, которые мой терминал отправляет (даже без \E[?1000h
активации).
Что мне не хватает?
console_codes(4)
иctlseqs
от xterm (в дистрибутивах Linux обычно есть копия по адресу/usr/share/doc/xterm/
) могут помочь. - person ninjalj   schedule 21.11.2013has_mouse()
,getch() == KEY_MOUSE
иgetmouse()
из ncurses. Он отлично работает как под xterm, так и под моим терминалом. Тем не менее, mc и aptitude правильно используют мышь только под xterm, но не в моем терминале. Что мне не хватает? - person tesche   schedule 21.11.2013CSI ?1000h
(h
, а неm
) для включения отслеживания мыши.mc
имеет следующее жестко запрограммировано:CSI?1001s
(сохранить старое отслеживание выделения мыши) _6 _ / _ 7_ (включить отслеживание мыши)CSI?1015h
(включить расширенный отчет о координатах мыши urxvt). (Где CSI - это 7-битный CSI, т.е.ESC [
) - person ninjalj   schedule 26.11.2013TERM
, а не на функцию ncurseshas_mouse()
. Если он не запущен в xterm, он должен быть вызван сmc -x
. Мой терминал все время был исправен. - person tesche   schedule 03.12.2013