Программно перейти на tty из встроенного приложения qt, работающего на QWS framebuffer?
Мне интересно, как программно перейти на один из доступных терминалов из встроенного приложения 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
- Buildroot 2011.11
- Busybox 1.19
- uClibc 2.21
Я подозреваю, но не уверен, что причина того, что ctrl+alt+fX не работает в первую очередь, может быть причиной того, что изменение tty не работает программно согласно chvt.
Я должен указать на этом этапе, что, запутанно, клавиши zap (ctrl + alt + backspace) работают как положено.