【问题标题】:PTY runs with smaller sizePTY 以较小的尺寸运行
【发布时间】:2019-09-03 19:03:31
【问题描述】:

我正在编写一个简单的应用程序来使用 ptys 并运行诸如 vi 之类的命令。当它们运行时,无论我的终端仿真器的大小如何,pty 都会在一个非常小的窗口上运行;这是一个截图:https://imgur.com/a/DdRG2Ib 光标就在 pty 外面(屏幕是空白的,外面什么都没有写)。

将终端模拟器保持在最大尺寸,我的目标是“扩展” pty 的尺寸并使用全屏。

我的方法是获取标准输出的大小并将其设置在终端的主大小上,遵循我在此处阅读的内容:Can't change terminal size on pty/N (works on ttyN)

#define err(x) { if((x)==-1) exit(1); }
int set(int masterfd) {
    float k = 0;
    struct winsize w;
    err(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w));
    printf("wsz: r:%d c:%d\n", w.ws_row, w.ws_col);
    w.ws_row *= k; w.ws_col *= k;
    err(ioctl(masterfd, TIOCSWINSZ, &w));
    return 1;
}

k 不为零时,整个屏幕都混乱了。只有当行和列都为零时,终端很小但可以工作。

打开master后,我期待用master fd调用set()来调整终端的大小。对printf() 的调用显示STDOUT_FILENO 上的行和列是我的显示大小,在主fd 上它们是0。

如何让 pty 使用我的全屏模式?

【问题讨论】:

    标签: c linux terminal pty


    【解决方案1】:

    您的问题几乎肯定不在您显示的代码中,而是在您没有显示的代码中。另外,您的问题不清楚,但我怀疑它不仅适用于k=0,而且适用于所有非负kk<=1

    大概您正在将 pty 上运行的程序的输出传递到您的进程作为其标准输出的终端,无论是按原样还是以某种方式修改。一般来说,这是行不通的。相反,您必须实际模拟(某种特定类型的)终端,在内存中维护您自己的逻辑终端内容,然后将其渲染到真实终端,将其剪辑到您想要显示的区域。这是相当不平凡的。请注意,screen 至少可以做到这一点,而无需您编写任何新代码。

    【讨论】:

    • "对于所有非负 kfloat 尝试了 0.1、0.5、1、2、4 - 它们不会产生所有非负数,但会产生良好的样本。你能解释一下为什么它不能工作吗?当您说“将其剪辑到要显示的区域”时,我是在尝试“扩展/扩展”视图,而不是对其进行剪辑。旁注:我尝试使用screen,但出现了同样的问题
    • @bicup:我不明白你所说的“扩展/扩展”是什么意思;我最好的猜测是你的意思是你想要一个比实际终端更大的虚拟尺寸(在这种情况下显示它需要剪辑)。但也许我误解了你想要什么。
    • 在屏幕截图中,看到鼠标指针,在 vim 区域之外。我正在尝试让 vim 使用完整的可用屏幕。据我了解,您可能正在考虑相反的方式
    猜你喜欢
    • 2019-04-13
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多