我有一个在Raspberry Pi(linux)上运行的OpenVG数字标牌应用程序。不幸的是,让它在循环中显示全屏.jpg背景会减慢很多东西。
所以我去了透明背景,我的OpenVG程序在第1层运行。然后,我也启动了FBI(一个在framebuffer中显示图像的shell程序)。这样我就有了相同的视觉效果,但在OpenVG程序中也有很大的加速,就像覆盖层一样,在我的情况下非常重要。要同时启动两个程序,我使用以下命令:
fbi -noverbose bg.jpg | ./digital-signage
( - noverbose参数使fbi不显示UI,只显示全屏图像)
问题是,我希望能够在我的OpenVG应用程序中捕获和处理按键。它的代码如下所示:
void changemode(int dir) {
static struct termios oldt, newt;
if (dir == 1) {
tcgetattr( STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt);
} else {
tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
}
}
int kbhit(void) {
struct timeval tv;
fd_set rdfs;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&rdfs);
FD_SET(STDIN_FILENO, &rdfs);
select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
return FD_ISSET(STDIN_FILENO, &rdfs);
}
int main(int argc, char **argv) {
char key = 0;
changemode(1);
while (!kbhit()) {
// do the rendering here until a key is pressed
}
key = getchar();
changemode(0);
finish();
printf("%c", key);
return 0;
}
正如您所看到的,程序将循环直到检测到按键,然后它会回显键并退出。当我只运行OpenVG应用程序时,它工作正常:
./digital-signage
但是当我这样做的时候......
fbi -noverbose bg.jpg | ./digital-signage
密钥总是错误的,因为fbi似乎捕获了输入(并且它正确,因为它对键盘快捷键做出反应)。 程序退出但检测到错误的密钥。
我的问题是我不需要联邦调查局对任何事情做出反应。我需要我的OpenVG应用程序来正确处理按键。有没有办法实现它?