2012-01-28 5 views
5

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?

+0

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

+0

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 :) –

Trả lời

6

Những gì bạn đang thấy với totem là cố gắng tránh trình bảo vệ màn hình khởi động. Nó thực hiện điều này bằng cách gửi sự kiện quan trọng trong khoảng thời gian đều đặn.

Bạn có thể tìm thấy mã nào đó ở đây: http://git.gnome.org/browse/totem/tree/lib/totem-scrsaver.c#n318

Và vì bảo vệ màn hình sử dụng phần mở rộng giống như bạn đang sử dụng kết quả này trong truy cập của bạn đánh zero.

+0

Ah, cảm ơn vì đã tìm kiếm điều đó. Vì vậy, có vẻ như Totem thay thế các sự kiện phím Alt giả. Tôi đã hy vọng có một số sự kiện đặc biệt để tôi có thể (trong trường hợp xấu nhất) làm cho ứng dụng của tôi xem đầu vào ngày của riêng mình, nhưng điều đó làm cho mọi thứ phức tạp hơn. Bạn có nghĩ rằng chìa khóa Alt là một cái gì đó của một công ước? Nó sẽ không làm tổn thương để bỏ qua điều đó. –

+2

Tôi tin rằng phần mở rộng 'XRecord' là một cái gì đó mà có thể nhìn vào để làm điều đó. Workrave sử dụng nó để giám sát sự nhàn rỗi trên hệ thống: http://workrave.svn.sourceforge.net/viewvc/workrave/workrave/trunk/backend/src/unix/X11InputMonitor.cc?revision=1676&view=markup –

+0

Điều đó có vẻ thú vị. Cảm ơn, Rob! –