title: With X11, how can I get the user's time "away from keyboard" while ignoring certain events?
body: <p>I'm making a little application that needs to know how long the user has been idle — as in, not using a keyboard or a mouse. Both XCB and Xlib promise to give me idle time through their respective screensaver extensions. Here is where I get idle time with XCB:</p>
  
  <pre><code>#include &lt;stdlib.h&gt;
  #include &lt;xcb/xcb.h&gt;
  #include &lt;xcb/screensaver.h&gt;
  
  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-&gt;root);
      info = xcb_screensaver_query_info_reply (connection, cookie, NULL);
  
      uint32_t idle = info-&gt;ms_since_user_input;
      free (info);
  
      return idle;
  }
  </code></pre>
  
  <p>However, this is behaving very differently than "ms_since_user_input" suggests. If I am watching a video (tested with Totem), the idle time resets to 0 within 30 seconds, without exception. The same thing happens with a number of games, which cause this even when they are paused!
  Using XLib, I get the exact same behaviour.</p>
  
  <p>I might be able to improve the code that <em>uses</em> the idle time so this behaviour isn't as much of a problem, but I'd really like to get rid of the problem completely. I would prefer if I was only getting the time since the last user input event (and only the last user input event). I wouldn't mind using some other libraries to get there, as long as my program doesn't generate a lot of traffic.</p>
  
  <p>Do you have any ideas for how this can be done?</p>