c - ncurses 仅在 bstate 非零时报告鼠标移动
问题描述
我正在关注来自的代码
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-terminal 或 konsole 上,我可以看到所有报告的鼠标移动,而无需按下任何按钮!
那么这里发生了什么?如何说服 gnome-terminal 和 konsole 表现得像 xterm?或者甚至在他们处于 bash 模式时表现得像他们自己?
编辑:附加线索:
如果我滚动鼠标滚轮,此代码似乎适用于所有终端。这很可能是我最初在 xterm 中测试时发生的情况,因为即使 xterm 也需要按下按钮或滚动鼠标才能使其工作。
因此:我的问题变成了为什么终端只bstate
在以某种方式修改后才报告鼠标移动,即使终端在 bash 模式下报告转义序列?
解决方案
推荐阅读
- google-cloud-platform - 谷歌云视觉:命名空间 Google\Cloud\Samples\Vision 错误 500
- jhipster - 在 jhipster 上创建新实体时无法选择类型枚举
- flutter - Flutter:使用 MaterialPageRoute 从无状态小部件到有状态小部件
- php - spatie/pdf-to-image 1.8.2 在 composer install 中需要 ext-imagick 错误
- bash - 在给定维度的情况下,使用 /、\ 和 _ 在 bash 中打印三角形
- php - 在“不能将 PDOStatement 类型的对象用作数组”的语句上显示错误
- python - 如何进行功能组合
- jenkins - Jenkins 插件管理器 - 需要通过命令更新代理设置下的密码
- javascript - 更改媒体大小:Blogger RSS Feed 上的缩略图
- node.js - 无法使用邮递员通过表单数据将数组发送到 mongoDB