2012-01-28 10 views
5

मैं एक छोटा सा एप्लीकेशन बना रहा हूं जिसे जानने के लिए कि उपयोगकर्ता कितना समय निष्क्रिय है - जैसा कि कीबोर्ड या माउस का उपयोग नहीं कर रहा है। एक्ससीबी और एक्सलिब दोनों ने मुझे अपने संबंधित स्क्रीनसेवर एक्सटेंशन के माध्यम से निष्क्रिय समय देने का वादा किया है।एक्स 11 के साथ, कुछ घटनाओं को अनदेखा करते समय मैं उपयोगकर्ता का समय "कीबोर्ड से दूर" कैसे प्राप्त कर सकता हूं?

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

हालांकि, इस "ms_since_user_input" की तुलना में बहुत अलग बर्ताव कर रही है पता चलता है: यहाँ मैं कहाँ XCB साथ निष्क्रिय समय मिलता है। अगर मैं एक वीडियो देख रहा हूं (टोटेम के साथ परीक्षण किया गया है, तो निष्क्रिय समय बिना किसी अपवाद के 30 सेकंड के भीतर 0 पर रीसेट हो जाता है। एक ही चीज कई खेलों के साथ होती है, जो तब भी होती है जब उन्हें रोक दिया जाता है! एक्सएलआईबी का उपयोग करके, मुझे वही व्यवहार मिलता है।

मैं कोड को बेहतर बनाने में सक्षम हो सकता हूं जो निष्क्रिय समय का उपयोग करता है, इसलिए यह व्यवहार किसी समस्या का अधिक नहीं है, लेकिन मैं वास्तव में समस्या से पूरी तरह से छुटकारा पाना चाहता हूं। मैं पसंद करूंगा कि अगर मुझे अंतिम उपयोगकर्ता इनपुट ईवेंट (और केवल अंतिम उपयोगकर्ता इनपुट ईवेंट) के बाद से समय मिल रहा था। जब तक मेरा कार्यक्रम बहुत अधिक ट्रैफिक उत्पन्न नहीं करता है, तब तक मुझे वहां जाने के लिए कुछ अन्य पुस्तकालयों का उपयोग करने में कोई फर्क नहीं पड़ता।

क्या आपके पास कोई विचार है कि यह कैसे किया जा सकता है?

+0

आप के लिए निष्क्रिय समय क्या चाहते हैं? यदि यह कुछ आईआरसी/आईएम क्लाइंट में एएफके को कार्यान्वित करना है, तो शायद ग्राहक को इनपुट में इनपुट न भेजने का समय बेहतर होगा? – ninjalj

+0

यह (अभी तक एक और) "ब्रेक लेना" एप्लिकेशन के लिए है। यह पृष्ठभूमि में बैठता है, यह देखते हुए कि उपयोगकर्ता कंप्यूटर का सक्रिय रूप से उपयोग कर रहा है। हर अब और फिर यह एक आराम तोड़ या एक माइक्रो ब्रेक लागू करता है। इसे सटीक होने की आवश्यकता नहीं है, लेकिन मेरी योजना यहां परेशान नहीं है। इसलिए, अगर कोई वीडियो देख रहा है, तो मैं इसे रास्ते से बाहर रहना चाहता हूं। यह कुछ विशेष मामलों को देखने के लिए दुनिया का अंत नहीं है और यूआई को आसानी से बताने के लिए कहता है, लेकिन यह अधिक सुन्दर तरीके से संभालना अच्छा होगा :) –

उत्तर

6

आप टोटेम के साथ क्या देख रहे हैं यह स्क्रीनसेवर को लात मारने से बचने की कोशिश कर रहा है। यह नियमित अंतराल पर महत्वपूर्ण घटना भेजकर ऐसा करता है।

आप कोड है कि यहाँ मिल नहीं कर सकते हैं: के रूप में उपयोग किए जा रहे इस शून्य से टकराने के अपने काउंटर में जो परिणाम http://git.gnome.org/browse/totem/tree/lib/totem-scrsaver.c#n318

और स्क्रीनसेवर के बाद से ही एक्सटेंशन का उपयोग करता।

+0

आह, इसे देखने के लिए धन्यवाद। तो, लगता है कि टोटेम नकली Alt कुंजी घटनाओं को बदलता है। मैंने आशा की थी कि कुछ विशेष घटनाएं थीं इसलिए मैं (सबसे बुरे मामले में) अपने आवेदन को अपने आप इनपुट इनपुट कर सकता था, लेकिन इससे चीजें कठिन हो जाती हैं। क्या आपको लगता है कि Alt कुंजी तरीका एक सम्मेलन का कुछ है? यह सिर्फ उस पर ध्यान नहीं देगा। –

+2

मेरा मानना ​​है कि 'एक्सआरकॉर्ड' एक्सटेंशन ऐसा कुछ है जो ऐसा करने के लिए देख सकता है। वर्क्रेव सिस्टम पर आलस्य की निगरानी के लिए इसका उपयोग करता है: http://workrave.svn.sourceforge.net/viewvc/workrave/workrave/trunk/backend/src/unix/X11InputMonitor.cc?revision=1676&view=markup –

+0

यह दिलचस्प लग रहा है। धन्यवाद, रोब! –

संबंधित मुद्दे

 संबंधित मुद्दे