Làm nổi bật vị trí chuột hiện tại


18

Tôi đang chạy một thiết lập màn hình kép và phần lớn trackpad của tôi bị vô hiệu hóa (bao gồm cả việc ẩn con trỏ chuột). Khi tôi kích hoạt bàn di chuột (và hiển thị lại con trỏ chuột), tôi đã mất dấu vết nơi con trỏ trước đó.

Tôi đang tìm kiếm một công cụ để làm nổi bật vị trí chuột hiện tại (ví dụ: bằng một vòng tròn). Lý tưởng nhất sẽ là một lệnh duy nhất nhấp nháy vòng tròn trong một khoảng thời gian ngắn.

Tôi biết rằng xdotoolcó thể tìm thấy vị trí hiện tại, nhưng không có điểm nổi bật; Ngoài ra, key-monkhông cung cấp chức năng này. Tôi cũng đã đọc cairo composition managercung cấp chức năng như vậy, nhưng tôi tự hỏi liệu có một công cụ nhỏ hơn để đạt được điều này.

Trong trường hợp không có công cụ như vậy: Cách dễ nhất để hiển thị một vòng tròn như vậy xung quanh con trỏ bằng cách sử dụng dữ liệu được cung cấp bởi xdotool getmouselocation ?

Trong trường hợp điều này có liên quan: Tôi không sử dụng môi trường máy tính để bàn, chỉ có trình xmonadquản lý cửa sổ.

Câu trả lời:


18

Mặc dù tôi thích câu trả lời của Mikeserv về sự thông minh, nhưng có một nhược điểm là nó sẽ tạo ra một cửa sổ "đánh cắp" trọng tâm và phải được bấm đi. Tôi cũng thấy chỉ mất một chút thời gian để bắt đầu: khoảng 0,2 đến 0,3 giây, hơi chậm một chút để có trải nghiệm "mượt mà".

Cuối cùng tôi cũng đã tìm được cách đào sâu vào XLib và kết hợp với một chương trình C cơ bản để thực hiện điều này. Hiệu ứng hình ảnh gần giống với những gì Windows (XP) có (từ bộ nhớ). Nó không đẹp lắm, nhưng nó hoạt động ;-) Nó không "đánh cắp" tiêu điểm, bắt đầu gần như tức thời và bạn có thể nhấp "qua" nó.

nhập mô tả hình ảnh ở đây

Bạn có thể biên dịch nó với cc find-cursor.c -o find-cursor -lX11 -lXext -lXfixes. Có một số biến ở đầu bạn có thể điều chỉnh để thay đổi kích thước, tốc độ, v.v.

Tôi đã phát hành nó dưới dạng một chương trình tại http://code.arp242.net/find-coder . Tôi khuyên bạn nên sử dụng phiên bản này, vì nó có một số cải tiến mà tập lệnh bên dưới không có (chẳng hạn như đối số dòng lệnh và khả năng nhấp "qua" cửa sổ). Tôi đã để lại dưới đây như là vì sự đơn giản của nó.

/*
 * http://code.arp242.net/find-cursor
 * Copyright © 2015 Martin Tournoij <martin@arp242.net>
 * See below for full copyright
 */

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>


// Some variables you can play with :-)
int size = 220;
int step = 40;
int speed = 400;
int line_width = 2;
char color_name[] = "black";


int main(int argc, char* argv[]) {
    // Setup display and such
    char *display_name = getenv("DISPLAY");
    if (!display_name) {
        fprintf(stderr, "%s: cannot connect to X server '%s'\n", argv[0], display_name);
        exit(1);
    }

    Display *display = XOpenDisplay(display_name);
    int screen = DefaultScreen(display);

    // Get the mouse cursor position
    int win_x, win_y, root_x, root_y = 0;
    unsigned int mask = 0;
    Window child_win, root_win;
    XQueryPointer(display, XRootWindow(display, screen),
        &child_win, &root_win,
        &root_x, &root_y, &win_x, &win_y, &mask);

    // Create a window at the mouse position
    XSetWindowAttributes window_attr;
    window_attr.override_redirect = 1;
    Window window = XCreateWindow(display, XRootWindow(display, screen),
        root_x - size/2, root_y - size/2,   // x, y position
        size, size,                         // width, height
        0,                                  // border width
        DefaultDepth(display, screen),      // depth
        CopyFromParent,                     // class
        DefaultVisual(display, screen),     // visual
        CWOverrideRedirect,                 // valuemask
        &window_attr                        // attributes
    );
    XMapWindow(display, window);
    XStoreName(display, window, "find-cursor");

    XClassHint *class = XAllocClassHint();
    class->res_name = "find-cursor";
    class->res_class = "find-cursor";
    XSetClassHint(display, window, class);
    XFree(class);

    // Keep the window on top
    XEvent e;
    memset(&e, 0, sizeof(e));
    e.xclient.type = ClientMessage;
    e.xclient.message_type = XInternAtom(display, "_NET_WM_STATE", False);
    e.xclient.display = display;
    e.xclient.window = window;
    e.xclient.format = 32;
    e.xclient.data.l[0] = 1;
    e.xclient.data.l[1] = XInternAtom(display, "_NET_WM_STATE_STAYS_ON_TOP", False);
    XSendEvent(display, XRootWindow(display, screen), False, SubstructureRedirectMask, &e);

    XRaiseWindow(display, window);
    XFlush(display);

    // Prepare to draw on this window
    XGCValues values = { .graphics_exposures = False };
    unsigned long valuemask = 0;
    GC gc = XCreateGC(display, window, valuemask, &values);

    Colormap colormap = DefaultColormap(display, screen);
    XColor color;
    XAllocNamedColor(display, colormap, color_name, &color, &color);
    XSetForeground(display, gc, color.pixel);
    XSetLineAttributes(display, gc, line_width, LineSolid, CapButt, JoinBevel);

    // Draw the circles
    for (int i=1; i<=size; i+=step) { 
        XDrawArc(display, window, gc,
            size/2 - i/2, size/2 - i/2,   // x, y position
            i, i,                         // Size
            0, 360 * 64);                 // Make it a full circle

        XSync(display, False);
        usleep(speed * 100);
    }
    XFreeGC(display, gc);
    XCloseDisplay(display);
}


/*
 *  The MIT License (MIT)
 * 
 *  Copyright © 2015 Martin Tournoij
 * 
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to
 *  deal in the Software without restriction, including without limitation the
 *  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 *  sell copies of the Software, and to permit persons to whom the Software is
 *  furnished to do so, subject to the following conditions:
 * 
 *  The above copyright notice and this permission notice shall be included in
 *  all copies or substantial portions of the Software.
 * 
 *  The software is provided "as is", without warranty of any kind, express or
 *  implied, including but not limited to the warranties of merchantability,
 *  fitness for a particular purpose and noninfringement. In no event shall the
 *  authors or copyright holders be liable for any claim, damages or other
 *  liability, whether in an action of contract, tort or otherwise, arising
 *  from, out of or in connection with the software or the use or other dealings
 *  in the software.
 */

Làm thế nào dễ dàng để biến điều này thành một cửa sổ hình với một lỗ ở giữa cho các sự kiện chuột đi qua? Tôi đã cố gắng biến ví dụ của bạn thành một cái gì đó giống như những gì OP đang tìm kiếm ở đây , nhưng không có kinh nghiệm với xlib, cuối cùng tôi đã mất một cách vô vọng ..
gandalf3

FTR: Cách biên dịch nó trong Ubuntu: askubfox.com/q/801252/31300
Grzegorz Wierzowiecki

@ gandalf3 Gần một năm sau tôi cuối cùng cũng thực hiện được điều đó :-) Tôi đã không sửa đổi đoạn trích trên để nó có thể duy trì sự đơn giản của nó, tôi chỉ sửa đổi phiên bản tại github.com/Carpetsmoker/find-coder .
Martin Tournoij

@Carpetsmoker Hoạt động như một sự quyến rũ, rực rỡ! Cảm ơn vì điều này :) Bây giờ để nó cập nhật vị trí để theo dõi chuột ..
gandalf3

1
Ứng dụng hiển thị vòng tròn và sau đó thoát @AquariusPower, vì vậy đó là hành vi được mong đợi. Cách sử dụng là ánh xạ tổ hợp phím để khởi động nó. Các -fphương tiện tùy chọn nó sẽ theo sau con trỏ chuột xung quanh trong khi chạy , nhưng không thực sự thay đổi điều đó khái niệm cơ bản (điều này là không tương thích với tất cả các nhà quản lý cửa sổ, đó là lý do tại sao nó là một tùy chọn).
Martin Tournoij

6

Những điều sau đây có thể sẽ làm việc cho bạn:

#!/bin/sh
unset X Y; sleep 1
eval "$(xdotool getmouselocation -shell 2>/dev/null)"
for n in X Y; do  : "$(($n-=$n>25?25:$n))"; done
xwd -root -silent |
xv -    -crop "$X" "$Y" 50 50 \
        -geometry "50x50+$X+$Y" \
        -nodecor -viewonly -rv -quit

Nó phụ thuộc vào ba tiện ích xv, xwdxdotool. Hai cái đầu tiên là những Xtiện ích rất phổ biến và thứ ba tôi chắc chắn là bạn đã có.

Sau sleepmột giây, xdotoolghi tọa độ hiện tại của chuột vào thiết bị xuất chuẩn của nó theo -shellđịnh dạng thân thiện như:

X=[num]
Y=[num]
windowID=[num]

evalcài đặt các biến shell cho phù hợp, và fortrừ vòng một nửa kích thước hình ảnh sớm-to-be-hiển thị của từ mỗi $X$Ygiá trị 's hoặc, nếu một trong hai giá trị nhỏ hơn 25, bộ họ 0.

xwdĐặt cửa sổ gốc qua một đường ống tới xv, cắt xung quanh vị trí chuột thành kích thước hình ảnh 50x50 và hiển thị âm bản của hình ảnh dưới con trỏ chuột hiện tại trong một cửa sổ nhỏ không cho phép trang trí trình quản lý cửa sổ.

Kết quả cuối cùng là như thế này:

người tìm

... mặc dù tôi đoán con trỏ chuột của tôi không xuất hiện trong ảnh chụp màn hình. Tuy nhiên, hãy yên tâm, nó nằm ngay trên cái hộp màu trắng ở đó khi tôi chụp ảnh.

Bạn có thể thấy trong hình ảnh tôi cũng đã viết nó như một hàm shell và làm nền cho nó. Chủ yếu là vì lý do đó có một cái sleepở đó - nhấn RETURNphím sẽ cuộn thiết bị đầu cuối nếu bạn đã ở dưới đáy và xwdđủ nhanh để lấy hình ảnh của màn hình trước khi thiết bị đầu cuối cuộn - sẽ bù cho tôi tiêu cực trong hình ảnh một chút và tôi không thích nó.

Dù sao, vì xvđược chạy bằng cả công tắc -viewonly-quitcông tắc, nó sẽ biến mất ngay khi nhấp vào nút chuột hoặc nhấn phím bàn phím - nhưng sẽ duy trì cho đến khi bạn thực hiện.

Không còn nghi ngờ gì nữa, bạn có thể làm những việc phức tạp hơn nhiều với ImageMagickhoặc thậm chí xvlà một mình - nhưng tôi chỉ làm một hộp âm nhỏ dưới con trỏ chuột. Bạn có thể tìm xvtài liệu ở đây và các tài liệu cho xwdtrong man xwd.


1
Điều này có vẻ tốt, ngoại trừ thực tế là distro của tôi (debian) không cung cấp xv. Nếu có thể tôi muốn tránh tự biên dịch xvvà để aptxử lý việc quản lý gói.
deshtop

1
@deshtop - đây là một repo, nếu bạn muốn nó. Bạn cũng có thể làm những điều tương tự với displaytiện ích ImageMagick . Và tất nhiên là luôn có feh. Tôi đã không fehcài đặt vào lúc này khi viết nó lên, và mặc dù tôi đã thử một hoặc hai lần, tôi không thể dễ dàng tìm ra cách displaymở mà không có viền cửa sổ.
mikeerv

Cảm ơn về repo, nhưng tôi hơi thận trọng với các kho không chính thức. Tôi sẽ xem liệu tôi có thể sử dụng ImageMagick
deshtop

1
@deshtop - bạn có thể có thể. Ít nhất bạn có thể cấu hình xmonad không trang trí displaycửa sổ mà cửa sổ này sẽ khởi chạy - hoặc nếu không bạn có thể khởi chạy displaykhi -iconicsử dụng xdotoolđể loại bỏ các trang trí của nó và không thể xác định (hoặc bất cứ thứ gì được gọi là) .
mikeerv

Điều này nghe có vẻ rất thú vị, nhưng xvdường như không có gì trên Ubuntu 14.04 (nó không được biên dịch mặc dù đã cung cấp tất cả các kho) và tôi displayđang mở một cửa sổ lớn và tôi không biết làm thế nào để sử dụng fehnó chỉ quét tất cả các tệp trong nhà tôi (đường dẫn hiện tại) đang tìm kiếm hình ảnh, hài hước .. hehe là một cataloguer.
Sức mạnh Bảo Bình
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.