我正在制作一个小应用程序,它需要知道用户空闲了多长时间——例如,不使用键盘或鼠标。XCB 和 Xlib 都承诺通过它们各自的屏幕保护程序扩展程序给我空闲时间。这是我使用 XCB 获得空闲时间的地方:
#include <stdlib.h>
#include <xcb/xcb.h>
#include <xcb/screensaver.h>
static xcb_connection_t * connection;
static xcb_screen_t * screen;
/**
* Connects to the X server (via xcb) and gets the screen
*/
void magic_begin () {
connection = xcb_connect (NULL, NULL);
screen = xcb_setup_roots_iterator (xcb_get_setup (connection)).data;
}
/**
* Asks X for the time the user has been idle
* @returns idle time in milliseconds
*/
unsigned long magic_get_idle_time () {
xcb_screensaver_query_info_cookie_t cookie;
xcb_screensaver_query_info_reply_t *info;
cookie = xcb_screensaver_query_info (connection, screen->root);
info = xcb_screensaver_query_info_reply (connection, cookie, NULL);
uint32_t idle = info->ms_since_user_input;
free (info);
return idle;
}
但是,这与“ms_since_user_input”建议的行为非常不同。如果我正在观看视频(使用 Totem 测试),空闲时间会在 30 秒内重置为 0,无一例外。许多游戏也会发生同样的事情,即使它们被暂停也会导致这种情况!使用 XLib,我得到了完全相同的行为。
我也许可以改进使用空闲时间的代码,所以这种行为不是什么大问题,但我真的很想完全摆脱这个问题。如果我只获得自上次用户输入事件(并且只有最后一次用户输入事件)以来的时间,我会更喜欢。只要我的程序不会产生大量流量,我不介意使用其他一些库来到达那里。
您对如何做到这一点有任何想法吗?