スクリーンセーバーが実行されているかどうかを検出しようとしています。
これまでに得たコードは次のとおりです。
/* LDFLAGS='-L/usr/X11R6/lib/ -lX11 -lXext -lXss' make xidle */
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/scrnsaver.h>
int
main(int argc, char *argv[])
{
XScreenSaverInfo info;
Display *dpy = XOpenDisplay(NULL);
if(NULL == dpy) {
fprintf(stderr, "failed to open display\n");
return 1;
}
int a = 0;
int b = 0;
XScreenSaverQueryExtension(dpy, &a, &b);
printf("%d %d\n", a, b);
XScreenSaverQueryInfo(dpy, RootWindow(dpy, DefaultScreen(dpy)), &info);
printf("%d %d %d %d\n", info.state, info.til_or_since, info.idle, info.kind);
return 0;
}
ただし、info.state は常に 3 (ScreenSaverDisabled) です。これを xscreensaver と gnome-screensaver でテストしました。
出力例を次に示します。
92 0
3 0 9903 0
スクリーンセーバーを実行していてもしていなくても同じです (もちろん、info.idle を除く)。
追加情報:
$ X -version
X.Org X Server 1.13.0
Release Date: 2012-09-05
X Protocol Version 11, Revision 0
ウィンドウマネージャ: i3
ディストリビューション: Arch Linux
編集: [this][1] の助けを借りて、xcb バージョンを作成しましたが、これも機能しません。テスト手順でエラーを除外するには、次のようにします。xscreensaver をバックグラウンドで実行している間に、このコードを無限ループで実行しています。実際にスクリーンセーバーを有効にするには、 xscreensaver-command --activate を使用します
#include <stdlib.h>
#include <stdio.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_state () {
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);
int state = info->state;
return state;
}
int main(int arc, char *argv[])
{
magic_begin();
int state = magic_get_state();
printf("state: %d\n", state);
}
[1]: http://stackoverflow.com/questions/9049087/with-x11-how-can-i-get-the-users-time-away-from-keyboard-while-ignoring-cert