【问题标题】:How to detect screen resize events coming from ncurses in QNX?如何检测来自 QNX 中 ncurses 的屏幕调整大小事件?
【发布时间】:2019-02-13 08:07:02
【问题描述】:

我无法配置接收有关使用 ncurses QNX Momentics 更改终端大小的事件。 我用的是Putyy作为终端,数据是通过COM口传输的。

我的问题是使用远程终端时如何实现换屏事件的接收?

FILE* fcons = fopen("/dev/ser1", "r+");
SCREEN* term = newterm("xterm-r5", fcons, fcons);
int y = 0, x = 0;
//if(y < 24 || x < 80)
//  resizeterm(24, 80);
flushinp();
main_scr = newwin(24, 80, 0, 0);
head_scr = subwin(main_scr, 3, 80, 0, 0);
prompt_scr = subwin(main_scr, 1, 9, 3, 2);
cursor_scr = newwin(1, 60, 3, 6);
output_scr = subwin(main_scr, 18, 76, 5, 2);
keypad(cursor_scr, TRUE);

int f = mousemask(ALL_MOUSE_EVENTS, NULL);

chtype temp_ch = 0;
while(KEY_RESIZE == temp_ch)
   temp_ch = wgetch(cursor_scr);
return 0;

【问题讨论】:

    标签: terminal ncurses uart qnx


    【解决方案1】:

    像这样的普通串行端口连接不会发送SIGWINCH。在其他配置中,例如telnet,这是由于 NAWS 完成的(关于窗口大小的协商——我不知道see a duplicate)。您的应用程序可以通过执行 resize 程序的操作以及更多操作来轮询,例如,

    • 保存光标位置
    • 将光标移动到非常远的右下角
    • 询问终端光标的真正位置
    • 等待响应,获取实际屏幕尺寸
    • 使用系统调用设置终端的屏幕尺寸
    • 恢复光标位置
    • 给自己发送SIGWINCH

    resize 不同,这将在您的程序中完成,因此它必须保存/恢复光标位置(以避免混淆 ncurses)。请记住,ncurses 已将终端设置为 原始模式,因此不需要部分初始化。

    【讨论】:

    • 奇怪的是鼠标点击对我有用。但是捕捉终端的大小是行不通的。虽然这两个事件在使用鼠标时都会发生。
    • resize-events 与鼠标无关(它们的处理方式也不相同)。 ncurses 要求 PuTTY 在鼠标事件上发送转义序列,但没有定义在终端调整大小时发送转义的协议。
    猜你喜欢
    • 2011-12-26
    • 2023-04-09
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2021-10-11
    • 2018-03-03
    • 1970-01-01
    • 2015-07-16
    相关资源
    最近更新 更多