Я следую вместе с кодом из
https://gist.github.com/sylt/93d3f7b77e7f3a881603
Вот оно, в случае 404
#include <curses.h>
#include <stdio.h>
int main()
{
initscr();
cbreak();
noecho();
// Enables keypad mode. This makes (at least for me) mouse events getting
// reported as KEY_MOUSE, instead as of random letters.
keypad(stdscr, TRUE);
// Don't mask any mouse events
mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL);
printf("\033[?1003h\n"); // Makes the terminal report mouse movement events
fflush(stdout);
for (;;) {
int c = wgetch(stdscr);
// Exit the program on new line fed
if (c == '\n')
break;
char buffer[512];
size_t max_size = sizeof(buffer);
if (c == ERR) {
snprintf(buffer, max_size, "Nothing happened.");
}
else if (c == KEY_MOUSE) {
MEVENT event;
if (getmouse(&event) == OK) {
snprintf(buffer, max_size, "Mouse at row=%d, column=%d bstate=0x%08lx",
event.y, event.x, event.bstate);
}
else {
snprintf(buffer, max_size, "Got bad mouse event.");
}
}
else {
snprintf(buffer, max_size, "Pressed key %d (%s)", c, keyname(c));
}
move(0, 0);
insertln();
addstr(buffer);
clrtoeol();
move(0, 0);
}
printf("\033[?1003l\n"); // Disable mouse movement events, as l = low
endwin();
return 0;
}
Когда я помещаю это вфайл и скомпилируйте его (gcc -o test test.c -lncurses
), в xterm о движениях мыши сообщается без нажатия кнопки.В gnome-terminal и Konsole о событиях движения сообщается только в том случае, если нажата кнопка на моей мыши!
Обычно я бы сказал, что это просто совместимость / стандарты, НО, когда я выполняю:
printf '\033[?1003h'
на терминале gnome или на консоли я могу видеть все сообщения о движениях мыши без нажатия кнопок!
Так что здесь происходит?Как мне убедить gnome-терминал и консоль вести себя как xterm?Или даже вести себя как они, когда они находятся в режиме bash?
РЕДАКТИРОВАТЬ: Дополнительные подсказки:
Похоже, этот код работает на всех терминалах, если я прокручиваю колесо мыши.Скорее всего, именно это и произошло, когда я первоначально тестировал в xterm, поскольку даже для xterm требуется либо нажатие кнопки, либо прокрутка мыши, чтобы это работало.
Поэтому: у меня возникает вопрос, почему терминалсообщать только о перемещении мыши после того, как bstate
был каким-либо образом изменен, даже когда терминал сообщает escape-последовательности в режиме bash?