Tôi đang tạo một ứng dụng nhỏ cần biết người dùng đã nghỉ bao lâu - như trong, không sử dụng bàn phím hoặc chuột. Cả XCB và Xlib hứa hẹn sẽ cho tôi thời gian rảnh thông qua các phần mở rộng bảo vệ màn hình tương ứng. Đây là nơi tôi có thời gian rảnh với XCB:Với X11, làm cách nào để có được thời gian của người dùng "cách xa bàn phím" trong khi bỏ qua các sự kiện nhất định?
#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;
}
Tuy nhiên, điều này hoạt động rất khác với "ms_since_user_input" gợi ý. Nếu tôi đang xem video (được thử nghiệm với Totem), thời gian không hoạt động sẽ được đặt lại về 0 trong vòng 30 giây mà không có ngoại lệ. Điều tương tự cũng xảy ra với một số trò chơi, điều này gây ra ngay cả khi chúng bị tạm dừng! Sử dụng XLib, tôi nhận được hành vi giống hệt nhau.
Tôi có thể cải thiện mã sử dụng thời gian rảnh nên hành vi này không phải là vấn đề, nhưng tôi thực sự muốn loại bỏ hoàn toàn vấn đề. Tôi thích nếu tôi chỉ nhận được thời gian từ sự kiện đầu vào người dùng cuối cùng (và chỉ sự kiện người dùng nhập cuối cùng). Tôi sẽ không nhớ sử dụng một số thư viện khác để đến đó, miễn là chương trình của tôi không tạo ra nhiều lưu lượng truy cập.
Bạn có ý tưởng nào về cách thực hiện việc này không?
Bạn muốn thời gian rảnh rỗi để làm gì? Nếu nó thực hiện AFK trong một số ứng dụng khách IRC/IM, có thể thời gian không gửi đầu vào cho khách hàng được đề cập sẽ tốt hơn? – ninjalj
Nó dành cho ứng dụng "nghỉ ngơi". Nó nằm ở chế độ nền, xem người dùng đang sử dụng máy tính trong bao lâu. Tất cả bây giờ và sau đó nó thực thi nghỉ ngơi hoặc nghỉ ngơi vi mô. Nó không cần phải chính xác, nhưng kế hoạch của tôi ở đây là không gây phiền nhiễu. Vì vậy, nếu ai đó đang xem một video, tôi muốn nó ở lại trên đường đi. Nó không phải là kết thúc của thế giới để xem cho một vài trường hợp đặc biệt và nói với giao diện người dùng để giảm bớt, nhưng nó sẽ được tốt đẹp để xử lý này duyên dáng hơn :) –