2012-01-06 41 views
9

Tôi phải theo dõi Bảng tạm X11.X11 Nhận nội dung Clipboard

Hiện tại, tôi yêu cầu Lựa chọn Clipboard mỗi 5 giây, sau đó tôi băm văn bản được trả về từ khay nhớ tạm và tôi so sánh nó với phép tính băm từ lần kiểm tra cuối cùng. Nếu băm không giống nhau, tôi phân tích nội dung văn bản và thực hiện một số nội dung ...

Tôi không thích phương pháp của mình. Tôi đến từ Windows, và với winapi, đó là hạt nhân thông báo cho chương trình của bạn khi clipboard đã thay đổi, và nó hiệu quả hơn!

Tôi chỉ muốn biết liệu X11 có thể thông báo cho chương trình của bạn là winapi khi clipboard đã thay đổi không? Cách hiệu quả hơn để kiểm tra sửa đổi clipboard bằng X11 là gì?

Trả lời

2
  1. Find cửa sổ với lựa chọn sử dụng GetSelectionOwner (PRIMARY và Clipboard)
  2. get bản sao của lựa chọn bằng cách gửi SelectionRequest, thông báo cho ứng dụng của bạn
  3. xem cho SelectionClear kiện
  4. cửa sổ cập nhật có lựa chọn sử dụng id từ SelectionClear sự kiện, goto bước 2
+0

Bạn sẽ làm gì khi chủ sở hữu lựa chọn bị đóng? – retroj

1

Sử dụng XFixesSelectSelectionInput() từ số Xfixes gia hạn và chờ sự kiện XFixesSelectionNotify.

Ví dụ:

// gcc -o xclipwatch xclipwatch.c -lX11 -lXfixes 
... 
#include <X11/extensions/Xfixes.h> 
... 
void WatchSelection(Display *display, Window window, const char *bufname) 
{ 
    int event_base, error_base; 
    XEvent event; 
    Atom bufid = XInternAtom(display, bufname, False); 

    assert(XFixesQueryExtension(display, &event_base, &error_base)); 
    XFixesSelectSelectionInput(display, DefaultRootWindow(display), bufid, XFixesSetSelectionOwnerNotifyMask); 

    while (True) 
    { 
    XNextEvent(display, &event); 

    if (event.type == event_base + XFixesSelectionNotify && 
     ((XFixesSelectionNotifyEvent*)&event)->selection == bufid) 
    { 
     if (!PrintSelection(display, window, bufname, "UTF8_STRING")) 
     PrintSelection(display, window, bufname, "STRING"); 

     fflush(stdout); 
    } 
    } 
} 
... 

này hoạt động cho cả bufname == "CLIPBOARD"bufname == "PRIMARY" lựa chọn.

Cũng xem PrintSelection() chức năng in this answer.

Các vấn đề liên quan