2012-01-28 8 views
5

Sto facendo una piccola applicazione che deve sapere per quanto tempo l'utente è rimasto inattivo - come in, non usando una tastiera o un mouse. Sia XCB che Xlib promettono di darmi tempo di inattività attraverso le rispettive estensioni salvaschermo. Qui è dove ho il tempo di inattività con XCB:Con X11, come posso ottenere il tempo dell'utente "lontano dalla tastiera" mentre ignoro determinati eventi?

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

Tuttavia, questo si comporta in modo molto diverso rispetto "ms_since_user_input" suggerisce. Se sto guardando un video (testato con Totem), il tempo di inattività resetta a 0 entro 30 secondi, senza eccezioni. La stessa cosa accade con un numero di giochi, che causano questo anche quando sono in pausa! Utilizzando XLib, ottengo lo stesso identico comportamento.

Potrei essere in grado di migliorare il codice che utilizza il tempo di inattività, quindi questo comportamento non è tanto un problema, ma mi piacerebbe davvero eliminare completamente il problema. Preferirei se ricevessi solo il tempo trascorso dall'ultimo evento di input dell'utente (e solo l'ultimo evento di input dell'utente). Non mi dispiacerebbe usare altre librerie per arrivarci, a patto che il mio programma non generi molto traffico.

Avete qualche idea su come questo può essere fatto?

+0

Per cosa si desidera il tempo di inattività? Se è necessario implementare l'AFK in alcuni client IRC/IM, forse il tempo di non inviare input al client in questione sarebbe meglio? – ninjalj

+0

È per (ancora un'altra) applicazione "prendi una pausa". Si trova sullo sfondo, osservando per quanto tempo l'utente sta attivamente utilizzando il computer. Ogni tanto applica una pausa di riposo o una micro pausa. Non ha bisogno di essere preciso, ma il mio piano qui è di non essere noioso. Quindi, se qualcuno sta guardando un video, vorrei che rimanesse fuori dai piedi. Non è la fine del mondo a guardare per alcuni casi speciali e dire all'interfaccia utente di andarsene, ma sarebbe bello gestirlo con più grazia :) –

risposta

6

Quello che stai vedendo con il totem è cercare di evitare lo screensaver che si avvia. Lo fa inviando l'evento chiave a intervalli regolari.

È possibile trovare il codice che fa questo qui: http://git.gnome.org/browse/totem/tree/lib/totem-scrsaver.c#n318

E poiché lo screensaver utilizza la stessa estensione, come si sta utilizzando questo si traduce in vostro contatore colpire zero.

+0

Ah, grazie per averlo visto. Quindi, sembra che Totem alterni falsi eventi chiave Alt. Avevo sperato che ci fosse qualche evento speciale in modo che potessi (nel peggiore dei casi) fare in modo che l'applicazione guardasse l'input da solo, ma questo rende le cose più complicate. Pensi che la chiave di Alt sia qualcosa di una convenzione? Non sarebbe male ignorare proprio questo. –

+2

Credo che l'estensione 'XRecord' sia qualcosa per cui possa farlo. Workrave lo usa per monitorare l'oziosità sul sistema: http://workrave.svn.sourceforge.net/viewvc/workrave/workrave/trunk/backend/src/unix/X11InputMonitor.cc?revision=1676&view=markup –

+0

Sembra interessante. Grazie, Rob! –

Problemi correlati