2012-01-28 24 views
5

Kullanıcının ne kadar süre boşta kaldığını bilmesi gereken küçük bir uygulama yapıyorum - klavye veya fare kullanmadığı gibi. Hem XCB hem de Xlib, ilgili ekran koruyucu uzantıları aracılığıyla boş zamanlarımı vermeye söz veriyor.X11 ile belirli olayları göz ardı ederek kullanıcının "klavyeden" kalma süresini nasıl alabilirim?

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

Ancak bu çok farklı "ms_since_user_input" den davranıyor öneriyor: Ben XCB ile boşta zaman olsun burasıdır. Bir video izliyorsam (Totem ile test edildi), boşta kalma süresi istisna olmaksızın 30 saniye içinde 0'a resetlenir. Aynı şey, duraklatıldıklarında bile buna neden olan bir takım oyunlarla olur! XLib kullanarak, aynı davranışı alıyorum.

'un boşta kalma süresini kullandığı kodu geliştirmem mümkün olabilir, bu nedenle bu davranış sorun değil, sorunun tamamen ortadan kaldırılmasını isterim. Son kullanıcı giriş olayından beri sadece zaman almayı tercih edersem (ve sadece son kullanıcı giriş olayı). Programım çok fazla trafik üretmediği sürece, oraya ulaşmak için başka kütüphaneleri kullanmamaya gerek yok.

Bunun nasıl yapılabileceği hakkında bir fikriniz var mı?

+0

Ne için boş zaman istiyorsun? Bazı IRC/IM istemcisinde AFK'yi uygulamak gerekirse, söz konusu istemciye girdi göndermeme zamanı daha iyi olabilir mi? – ninjalj

+0

(Bir başka) için "bir mola" uygulaması içindir. Arka planda oturur ve kullanıcının bilgisayarı ne kadar süreyle aktif olarak kullandığını izler. Her şimdi ve sonra bir dinlenme molası veya mikro bir mola zorlar. Kesin olması gerekmiyor, ama benim planım sinir bozucu olmamak. Yani, birisi bir video izliyorsa, yoldan uzak durmasını isterim. Bazı özel durumları izlemek ve kullanıcı arayüzünü rahatlatmak için dünyanın sonu değil, ama bunu daha incelikle kullanmak güzel olurdu :) –

cevap

6

Ekran koruyucusundan kurtulmaktan kaçınmaya çalışmak totem ile ne görüyorsanız, bunu düzenli aralıklarla anahtar olayı göndererek yapar.

Burada bunu yapmaz kodunu bulabilirsiniz: Bu senin sayaç sıfıra isabet sonuçlanır kullandığınız olarak

Ve ekran koruyucu beri http://git.gnome.org/browse/totem/tree/lib/totem-scrsaver.c#n318 aynı uzantıyı kullanır.

+0

Ah, bunu gördüğünüz için teşekkürler. Yani, Totem, sahte Alt anahtar olaylarını değiştiriyor gibi görünüyor. Özel bir olay olduğunu umuyordum, bu yüzden (en kötü durumda), kendi uygulamalarımın kendi başına izlenmesini sağlayabiliyordum ama bu, işleri daha da zorlaştırıyor. Alt anahtar yolunun bir kongre olduğunu mu düşünüyorsun? Sadece bunu görmezden gelmek zarar vermez. –

+2

"XRecord" uzantısının bunu yapmak için bakabilecek bir şey olduğuna inanıyorum. Workrave, sistemdeki boşluğu izlemek için bunu kullanır: http://workrave.svn.sourceforge.net/viewvc/workrave/workrave/trunk/backend/src/unix/X11InputMonitor.cc?revision=1676&view=markup –

+0

Bu ilginç görünüyor. Sağol Rob! –