Avec X11, comment puis-je laisser le temps de l’utilisateur “loin du clavier” tout en ignorant certains événements?

Je fais une petite application qui doit savoir combien de temps l’utilisateur a été inactif – comme dans, sans clavier ni souris. XCB et Xlib promettent de me laisser du temps libre grâce à leurs extensions d’écran de veille respectives. Voici où je suis inactif avec XCB:

#include  #include  #include  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; } 

Cependant, cela se comporte très différemment de “ms_since_user_input” suggère. Si je regarde une vidéo (testée avec Totem), le temps d’inactivité se réinitialise à 0 dans les 30 secondes, sans exception. La même chose se produit avec un certain nombre de jeux, qui provoquent cela même quand ils sont en pause! En utilisant XLib, j’obtiens exactement le même comportement.

Je pourrais peut-être améliorer le code qui utilise le temps d’inactivité, ce comportement n’est donc pas un problème, mais j’aimerais vraiment éliminer complètement le problème. Je préférerais que je ne reçoive que le temps écoulé depuis le dernier événement d’entrée utilisateur (et uniquement le dernier événement d’entrée utilisateur). Cela ne me dérangerait pas d’utiliser d’autres bibliothèques pour y arriver, tant que mon programme ne génère pas beaucoup de trafic.

Avez-vous des idées sur la façon dont cela peut être fait?

Ce que vous voyez avec totem, c’est d’essayer d’éviter que l’écran de veille ne se déclenche. Il le fait en envoyant des événements clés à intervalles réguliers.

Vous pouvez trouver le code qui fait cela ici: http://git.gnome.org/browse/totem/tree/lib/totem-scrsaver.c#n318

Et puisque l’écran de veille utilise la même extension que celle que vous utilisez, les résultats de votre compteur atteignent zéro.