С X11, как я могу получить время пользователя "вдали от клавиатуры", игнорируя определенные события? - PullRequest
5 голосов
/ 29 января 2012

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

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

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

1 Ответ

6 голосов
/ 19 февраля 2012

То, что вы видите с тотемом, это то, что он пытается избежать появления скринсейвера. Он делает это, отправляя событие ключа через регулярные интервалы.

Вы можете найти код, который делает это здесь: http://git.gnome.org/browse/totem/tree/lib/totem-scrsaver.c#n318

И поскольку экранная заставка использует то же расширение, что и вы, это приводит к тому, что ваш счетчик достигает нуля.

...