我正在编写一个直接在framebuffer(/ dev / fb0)上运行的应用程序(在java中)。
当我启动我的应用程序时,当前活动控制台的光标仍然闪烁,如果我使用上/下键盘键,控制台将显示最近使用的命令并覆盖帧缓冲区的内容。
我只能阻止光标闪烁:
setterm -cursor off > /dev/tty1
有没有办法完全冻结(后来解冻)控制台?
似乎X-Server做同样的事情。如果启动过程在GraphicsCard-1和GraphicsCard-2上的X-Server上运行,则当X启动时,GraphicsCard-1上的输出将立即停止(没有闪烁的光标)。我想mplayer也会这样做,如果将视频输出设置为帧缓冲区。
感谢任何想法:)
答案 0 :(得分:0)
严格来说,您观察到的行为更多的是错误,而不是功能。这是因为Linux并不适合多头。您所看到的是X服务器将其自己的已分配virtual terminal切换到控制台的效果。这当然 - 因为只有一个虚拟终端可以一次处于活动状态系统范围 - 切换出正在显示的虚拟终端,即使它正在显示完全是另一个显示适配器。
答案 1 :(得分:0)
openvt(1)
允许您在新的虚拟终端中打开程序,chvt(1)
允许您切换到另一个虚拟终端。
答案 2 :(得分:0)
我必须执行(从shell)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()方法不是最优的,但它对我来说就像它一样。