【问题标题】:ncurses detect when mouse leaves windowncurses 检测鼠标何时离开窗口
【发布时间】:2019-02-01 03:22:41
【问题描述】:

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

【问题讨论】:

  • 终端程序或应用程序的整个宇宙,就像curses一样,被小字符占据,到处跑。终端程序对一种叫做“老鼠”的奇怪生物一无所知。为了让终端程序知道那是什么,必须有一个字符序列指示鼠标指针进入或离开终端窗口。查看 terminfo 手册页,我找不到任何类似的东西,所以我不相信有任何这样的东西。
  • @SamVarshavchik 我意识到转义序列是如何工作的。我也找不到任何东西,这就是我在这里问的原因。
  • 在其文档中似乎非常缺乏对终端应用程序中鼠标指针的支持。在 terminfo 的手册页中,我能找到的最接近的是提到了一些名为 req_mouse_pos 的序列,但它是什么以及它的含义似乎有点缺乏描述,谷歌搜索除了引用相同的手册页。

标签: c++ linux console ncurses xterm


【解决方案1】:

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

XTerm Control SequencesFocusIn/FocusOut 部分列出

FocusIn/FocusOut 可以与任何鼠标事件组合,因为它 使用不同的协议。设置后,它会导致 xterm 发送 CSI I 当终端获得焦点时,CSI 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 的返回值。

【讨论】:

    猜你喜欢
    • 2015-09-03
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多