Điểm:1

Lập trình C: Phát hiện chuyển động con trỏ chuột

lá cờ pt

Tôi đang thực hiện một dự án mà tôi chỉ cần đặt cờ khi con trỏ chuột không di chuyển trong một khoảng thời gian (ví dụ: 30 giây): nếu chuột không hoạt động trong 30 giây, hãy đặt no_movement (no_movement=true;).

Cho đến nay, tôi biết máy chủ cửa sổ X là phụ trợ cho nhiều môi trường máy tính để bàn và tôi biết có tài liệu toàn diện về nó trên x.orgtroche.com (Tôi đã hiểu từ đó rằng có một sự kiện cho con trỏ được gọi là thông báo chuyển động).

sử dụng apt show xserver-xorg | Phiên bản grep Tôi phát hiện ra phiên bản Xserver được cài đặt trên hệ thống của mình là 1:7.7+22ubuntu1 (trên Ubuntu 21.04)

Cách được khuyến nghị để nhận phản hồi chuyển động của con trỏ chuột là gì?

Đánh giá cao thời gian của bạn trả lời tôi.

HuHa avatar
lá cờ es
Tại sao tôi có mùi khó chịu "nhân viên văn phòng tại nhà của tôi đang làm việc?" phần mềm ở đây?
Shobeira avatar
lá cờ pt
Tôi đang cố gắng tính thời gian của tôi thực sự. Tôi cần biết mình đã làm việc bao nhiêu trong một dự án vì chúng tôi đang phải đối mặt với đợt phong tỏa lần thứ 5 và vẫn phải làm việc tại nhà.
Điểm:0
lá cờ in

X11 được ghi lại khá tốt cho 'Mặt nạ sự kiện'

https://tronche.com/gui/x/xlib/events/mask.html

Hoặc luôn có XQueryPulum)..

// Hãy thử chương trình C này làm cơ sở cho những gì bạn muốn làm..

    #include <stdio.h>
#include <khẳng định.h>
#include <X11/Xlib.h>
#include <X11/extensions/XInput2.h>

int chính(int argc, char **argv)
{
    Hiển thị * hiển thị;
    Cửa sổ root_window;

    /* Khởi tạo (FIXME: không kiểm tra lỗi). */
    màn hình = XOpenDisplay(0);
    root_window = XRootWindow(hiển thị, 0);

    /* kiểm tra XInput */
    int xi_opcode, sự kiện, lỗi;
    if (!XQueryExtension(display, "XInputExtension", &xi_opcode, &event, &error)) {
        fprintf(stderr, "Lỗi: Phần mở rộng XInput không được hỗ trợ!\n");
        trả lại 1;
    }

    /* Kiểm tra XInput 2.0 */
    int chính = 2;
    int nhỏ = 0;
    int retval = XIQueryVersion(hiển thị, &chính, &phụ);
    if (retval != Thành công) {
        fprintf(stderr, "Lỗi: XInput 2.0 không được hỗ trợ (X11 cổ đại?)\n");
        trả lại 1;
    }

    /*
     * Đặt mặt nạ để nhận các sự kiện XI_RawMotion. Bởi vì nó là thô,
     * Các sự kiện XWarpPulum() không được bao gồm, bạn có thể sử dụng XI_Motion
     * thay thế.
     */
    ký tự không dấu mask_bytes[(XI_LASTEVENT + 7) / 8] = {0}; /* phải bằng 0! */
    XISetMask(mask_bytes, XI_RawMotion);

    /* Đặt mặt nạ để nhận các sự kiện từ tất cả các thiết bị chính */
    XIEventMask evmasks[1];
    /* Bạn có thể sử dụng XIAllDevices cho XWarpPulum() */
    evmasks[0].deviceid = XIAllMasterDevices;
    evmasks[0].mask_len = sizeof(mask_bytes);
    evmasks[0].mask = mask_bytes;
    XISelectEvents(hiển thị, root_window, evmasks, 1);

    XEvent xevent;
    trong khi (1) {
        XNextEvent(hiển thị, &xevent);

        if (xevent.xcookie.type != GenericEvent || xevent.xcookie.extension != xi_opcode) {
            /* không phải là sự kiện XInput */
            tiếp tục;
        }
        XGetEventData(hiển thị, &xevent.xcookie);
        if (xevent.xcookie.evtype != XI_RawMotion) {
            /*
             * Không phải sự kiện XI_RawMotion (bạn có thể muốn phát hiện
             * XI_Motion cũng vậy, xem nhận xét ở trên).
             */
            XFreeEventData(hiển thị, &xevent.xcookie);
            tiếp tục;
        }
        XFreeEventData(hiển thị, &xevent.xcookie);

        Cửa sổ root_return, child_return;
        int root_x_return, root_y_return;
        int win_x_return, win_y_return;
        không dấu int mask_return;
        /*
         * Chúng tôi cần:
         * child_return - cửa sổ đang hoạt động dưới con trỏ
         * win_{x,y}_return - tọa độ con trỏ đối với cửa sổ gốc
         */
        int retval = XQueryPulum(hiển thị, root_window, &root_return, &child_return,
                                   &root_x_return, &root_y_return,
                                   &win_x_return, &win_y_return,
                                   &mask_return);
        nếu (!retval) {
            /* con trỏ không ở cùng màn hình, bỏ qua */
            tiếp tục;
        }

        /* Chúng ta đã sử dụng cửa sổ gốc làm tham chiếu nên cả hai phải giống nhau */
        khẳng định (root_x_return == win_x_return);
        khẳng định (root_y_return == win_y_return);

        printf("root: x %d y %d\n", root_x_return, root_y_return);

        nếu (con_return) {
            int local_x, local_y;
            XTranslateCoordins(hiển thị, root_window, child_return,
                                  root_x_return, root_y_return,
                                  &local_x, &local_y, &child_return);
            printf("cục bộ: x %d y %d\n\n", local_x, local_y);
        }
    }

    XCloseDisplay(hiển thị);

    trả về 0;
}
Shobeira avatar
lá cờ pt
Đánh giá cao câu trả lời của bạn. Vì vậy, tôi đang đi đúng hướng? Cửa sổ X là một cách tiếp cận tốt? Khi tôi đang xem các mặt nạ sự kiện, tôi đã tìm thấy MotionNotify mặt nạ phù hợp nhất vì tôi cần trả về boolean cho sự cố. Những gì tôi đang nghĩ là có một cấu trúc X có liên quan, khởi tạo nó và sau đó đánh giá nó dựa trên mặt nạ sự kiện. Tôi cần chuyển động/không chuyển động..
lá cờ in
Không vấn đề gì, tôi nghĩ nếu bạn chỉ muốn phát hiện chuyển động thì khá dễ dàng... Chỉ cần theo dõi X\Y của vị trí chuột và nếu chúng thay đổi thì bạn có chuyển động.. Bước đầu tiên là nhận các sự kiện con trỏ ở vị trí đầu tiên..

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.