当DPMS主动消隐屏幕时,我试图阻止函数XNextEvent
返回,这样当屏幕为黑色时,我就不会收到键盘或鼠标输入。
我想阻止函数完全返回,因为我已经尝试在函数返回后查询DPMS的状态,但DPMS系统似乎在X接收到输入之前以某种方式处理了我的所有输入,因为XNextEvent
中的每个查询都告诉我DPMS不再为空:
while (running && !XNextEvent(dpy, &ev))
{
if (!DPMSInfo(dpy, &pwr, &state))
{
fprintf(stderr, "%s: DPMSInfo failed!n", argv[0]);
running = 0;
}
else if (!state || pwr == DPMSModeOn)
{
// sans a critical error, this will ALWAYS return true
// regardless of the current state of the screen
if (ev.type == KeyPress)
{
// now I am handling keyboard input
// while the screen is still potentially blank
}
}
}
DPMS或X是否有一些潜在功能会在屏蔽时阻止所有输入,并且在继续收听之前需要至少一个输入来唤醒显示器?
我找到了一种通过读取xssstart
程序的代码来使用XScreenSaver扩展的方法:
if (!XScreenSaverQueryExtension(dpy, &evbase, &errbase))
die("failed to query XScreenSaver extension!n");
XScreenSaverSelectInput(dpy, DefaultRootWindow(dpy), ScreenSaverNotifyMask);
int ready = 1;
while (running && !XNextEvent(dpy, &ev))
{
if (((XScreenSaverNotifyEvent *) &ev)->state == ScreenSaverOn)
{
ready = 0; // DPMS is now blanking
XUngrabKeyboard(dpy, CurrentTime);
}
else if (((XScreenSaverNotifyEvent *) &ev)->state == ScreenSaverOff)
{
ready = 1; // DPMS is no longer blanking
XGrabKeyboard(dpy, win, True, GrabModeAsync, GrabModeAsync, CurrentTime);
}
if (ready && ev.type == KeyPress)
{
// now I am only handling keyboard input when not blanked
}
}
注意,该解决方案的主要缺点是,当放弃键盘时,键盘输入将被馈送到后台的任何其他随机应用程序中(在诸如slock
的屏幕锁定器的情况下(。不过,这最终是另一个问题的主题。我也许可以专注于一个假窗口并清除那里的输入。。。