首页 > 解决方案 > ncurses 检测鼠标何时离开窗口

问题描述

当我研究鼠标与 ncurses 的接口时,我看到了很多选项,但我没有看到任何方法来检测鼠标何时离开程序窗口。该窗口是终端仿真器的窗口,而不是 ncurses 窗口。

标签: c++linuxconsolencursesxterm

解决方案


这不在ncurses的鼠标界面中,但对于某些终端,您可以将它们设置为发送 xterm 的离开和进入窗口控制序列,您的程序可以使用 逐字节读取getch,或者使用define_key关联响应作为“功能键”。

FocusIn/FocusOut部分中的XTerm 控制序列列表:

FocusIn/FocusOut 可以与任何鼠标事件组合,因为它使用不同的协议。设置后,它会导致 xterm 在终端获得焦点和 失去焦点时发送。CSI ICSI O

这是启用的

CSI ? Pm h
          DEC Private Mode Set (DECSET).
...
            Ps = 1 0 0 4  -> Send FocusIn/FocusOut events, xterm.

例如,

printf("\033[?1004h");
fflush(stdout);

(其他一些终端实现了这一点,但由于它们没有记录它们的行为,您必须尝试确定这是否适用于您碰巧使用的终端)。

在 ncurses 中,您可以将响应与define_key,例如,

#define KEY_FOCUS_IN     1001
#define KEY_FOCUS_OUT    1002

define_key("\033[I", KEY_FOCUS_IN);
define_key("\033[O", KEY_FOCUS_OUT);

并且(如果keypad已启用),将程序中的这些值检测为来自getch.


推荐阅读