С X11 , как я могу получить время пользователя «вне клавиатуры», игнорируя определенные события?

Я делаю небольшое приложение, которое должно знать, как долго пользователь бездействует - например, без использования клавиатуры или мыши. И 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), время простоя сбрасывается до 0 в течение 30 секунд без исключения. То же самое происходит с некоторыми играми, которые вызывают это, даже когда они приостановлены! Используя XLib, я получаю точно такое же поведение.

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

Есть ли у вас идеи, как это можно сделать?

5
задан Dylan McCall 28 January 2012 в 22:12
поделиться