вывод терминала "заморозить" (/ dev / tty1) - PullRequest
0 голосов
/ 24 июня 2011

Я пишу приложение (в Java), которое напрямую работает с кадровым буфером (/dev/fb0).

Когда я запускаю свое приложение, курсор текущей активной консоли все еще мигает, и если я использую клавиши клавиатуры, такие как вверх / вниз, консоль отобразит недавно использованные команды и перезапишет содержимое кадрового буфера.

Мне удалось остановить мигание только курсора:

setterm -cursor off > /dev/tty1

Есть ли способ полностью заморозить (а затем разморозить) консоль?

Похоже, X-сервер делает то же самое. Если процесс загрузки выполняется на GraphicsCard-1 и X-Server на GraphicsCard-2, вывод на GraphicsCard-1 остановится (без мигания курсора) сразу же после запуска X. Я полагаю, что mplayer делает это тоже, если настраивает вывод видео на кадровый буфер.

спасибо за любые идеи:)

Ответы [ 3 ]

0 голосов
/ 25 июня 2011

openvt(1) позволяет открыть программу в новом виртуальном терминале, а chvt(1) позволяет переключиться на другой виртуальный терминал.

0 голосов
/ 25 июня 2011

было немного сложнее получить то, что я точно хотел:

Я должен выполнить (из оболочки) 2 команды, чтобы заставить терминал работать тихо:

chvt 9
setterm -cursor > /dev/tty9

позже однамогу переключиться обратно на терминал 1:

setterm cursor > /dev/tty9
chvt 1

Я выбираю номер терминала 9, но любое число выше 7 должно быть в порядке.Эти вызовы также работают, если они выполняются из Java-приложения (как сказал JdeBP, только один виртуальный терминал во всей системе).Только команда setterm требует некоторых дополнительных шагов для передачи вывода в / dev / tty9:

Runtime.getRuntime().exec("chvt 9");
pipe("setterm -cursor off", "/dev/tty9");

private static void pipe(String cmd, String file) {
    FileOutputStream fos = new FileOutputStream(file);
    Process p = Runtime.getRuntime().exec(cmd);
    InputStream is = p.getInputStream();
    int i;
    while ( (i = is.read()) != -1 ) {fos.write(i);}
    p.waitFor();
    fos.close();
    is.close();
}

возможно, метод pipe () не является оптимальным, но он работал для меня таким, какой он есть.

0 голосов
/ 25 июня 2011

Строго говоря, наблюдаемое вами поведение является скорее ошибкой, чем функцией.Дело в том, что Linux не многоголовый.То, что вы видите, - это эффект переключения X-сервера своего собственного выделенного виртуального терминала на консоль.Это, конечно, потому что только один виртуальный терминал может быть активным одновременно для всей системы - отключает виртуальный терминал, который отображался, даже если он отображался на другом дисплееполностью адаптер.

Вы должны сделать кое-что из того, что делает X-сервер, и переключить свой виртуальный терминал на консоль.

...