6

私は、キーボードやマウスを使用していないなど、ユーザーがアイドル状態であった時間を知る必要がある小さなアプリケーションを作成しています。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 を使用すると、まったく同じ動作が得られます。

アイドル時間を使用するコードを改善して、この動作がそれほど問題にならないようにできるかもしれませんが、問題を完全に取り除きたいと思っています。最後のユーザー入力イベント (および最後のユーザー入力イベントのみ) からの時間のみを取得していればよいと思います。私のプログラムが大量のトラフィックを生成しない限り、そこに到達するために他のライブラリを使用してもかまいません。

これをどのように行うことができるかについてのアイデアはありますか?

4

1 に答える 1

7

トーテムで見ているのは、スクリーンセーバーが作動するのを回避しようとしていることです。これは、定期的にキー イベントを送信することによって行われます。

ここでそれを行うコードを見つけることができます: http://git.gnome.org/browse/totem/tree/lib/totem-scrsaver.c#n318

また、スクリーンセーバーは使用しているのと同じ拡張子を使用するため、カウンターがゼロになります。

于 2012-02-19T18:10:22.203 に答える