मैं एक छोटा सा एप्लीकेशन बना रहा हूं जिसे जानने के लिए कि उपयोगकर्ता कितना समय निष्क्रिय है - जैसा कि कीबोर्ड या माउस का उपयोग नहीं कर रहा है। एक्ससीबी और एक्सलिब दोनों ने मुझे अपने संबंधित स्क्रीनसेवर एक्सटेंशन के माध्यम से निष्क्रिय समय देने का वादा किया है।एक्स 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 पर रीसेट हो जाता है। एक ही चीज कई खेलों के साथ होती है, जो तब भी होती है जब उन्हें रोक दिया जाता है! एक्सएलआईबी का उपयोग करके, मुझे वही व्यवहार मिलता है।
मैं कोड को बेहतर बनाने में सक्षम हो सकता हूं जो निष्क्रिय समय का उपयोग करता है, इसलिए यह व्यवहार किसी समस्या का अधिक नहीं है, लेकिन मैं वास्तव में समस्या से पूरी तरह से छुटकारा पाना चाहता हूं। मैं पसंद करूंगा कि अगर मुझे अंतिम उपयोगकर्ता इनपुट ईवेंट (और केवल अंतिम उपयोगकर्ता इनपुट ईवेंट) के बाद से समय मिल रहा था। जब तक मेरा कार्यक्रम बहुत अधिक ट्रैफिक उत्पन्न नहीं करता है, तब तक मुझे वहां जाने के लिए कुछ अन्य पुस्तकालयों का उपयोग करने में कोई फर्क नहीं पड़ता।
क्या आपके पास कोई विचार है कि यह कैसे किया जा सकता है?
आप के लिए निष्क्रिय समय क्या चाहते हैं? यदि यह कुछ आईआरसी/आईएम क्लाइंट में एएफके को कार्यान्वित करना है, तो शायद ग्राहक को इनपुट में इनपुट न भेजने का समय बेहतर होगा? – ninjalj
यह (अभी तक एक और) "ब्रेक लेना" एप्लिकेशन के लिए है। यह पृष्ठभूमि में बैठता है, यह देखते हुए कि उपयोगकर्ता कंप्यूटर का सक्रिय रूप से उपयोग कर रहा है। हर अब और फिर यह एक आराम तोड़ या एक माइक्रो ब्रेक लागू करता है। इसे सटीक होने की आवश्यकता नहीं है, लेकिन मेरी योजना यहां परेशान नहीं है। इसलिए, अगर कोई वीडियो देख रहा है, तो मैं इसे रास्ते से बाहर रहना चाहता हूं। यह कुछ विशेष मामलों को देखने के लिए दुनिया का अंत नहीं है और यूआई को आसानी से बताने के लिए कहता है, लेकिन यह अधिक सुन्दर तरीके से संभालना अच्छा होगा :) –