我想知道如何以编程方式从嵌入式 Qt 应用程序更改为可用终端之一。
该应用程序通过 调用application -qws
。从图形上看,它配置了 Linux 帧缓冲区(支持编译到内核中)并启用了 tty 驱动程序。
以编程方式执行此操作的原因是 Ctrl+Alt+FX 无法切换 ttys。
首先,我尝试了明显的作弊机制 -keyPressEvent
我添加了覆盖system("chvt 2");
不幸的是,这不起作用。
相反,我直接查看了chvt.c
在busybox中的来源。从本质上讲,这归结为:
fd = open("/dev/console", O_RDRW);
ioctl(fd, VT_ACTIVATE, vt_num);
ioctl(fd, VT_WAITACTIVE, vt_num);
忽略使用xioctl
和检测正确的 tty - 我知道/dev/console
存在,我可以得到一个 RW 文件句柄。
再次,没有运气。
因此,chvt.c
我决定迭代所有存在的帧缓冲设备,直到找到一个正在接收键盘输入的设备。然后我跑了
fd = open("/dev/fb1", O_RDRW);
ioctl(fd, VT_ACTIVATE, vt_num);
ioctl(fd, VT_WAITACTIVE, vt_num);
根据任何正常的 tty 更改,这都会导致黑屏,除了帧缓冲区设备随后返回,将我的应用程序带回来。
所以 - 我的问题 - 在不退出我的应用程序的情况下,我希望能够以编程方式切换到我选择的 tty,然后能够使用通常的 ctrl+alt+fX 机制切换回来。
环境:
- Qt 4.7.4
- Linux 3.3.3
- 构建根 2011.11
- 忙箱 1.19
- uClibc 2.21
我怀疑但不确定,ctrl+alt+fX 最初不起作用的原因可能是 tty 更改无法按照 chvt 以编程方式工作的原因。
在这个阶段我应该指出,令人困惑的是,zap 键(ctrl+alt+backspace)确实按预期工作。