현재 마우스 위치 강조 표시

현재 마우스 위치 강조 표시

저는 듀얼 화면 설정을 실행하고 있으며 대부분의 경우 트랙패드를 비활성화했습니다(마우스 포인터 숨기기 포함). 트랙패드를 다시 활성화하면(마우스 포인터가 다시 나타남) 포인터가 이전에 있던 위치가 사라집니다.

현재 마우스 위치를 강조 표시하는 도구를 찾고 있습니다.(예: 원을 통해) 이상적으로 이것은 짧은 시간 동안 원을 깜박이는 명령입니다.

xdotool현재 위치를 찾을 수는 있지만 강조 표시되지는 않습니다. 이 key-mon기능은 제공되지 않습니다. 또한 이러한 기능을 제공한다는 내용을 읽었 cairo composition manager지만 이를 달성할 수 있는 더 작은 도구가 있는지 궁금합니다.

해당 도구가 없는 경우:제공된 데이터를 사용하여 커서 주위에 이와 같은 원을 표시하는 가장 간단한 방법은 무엇입니까? xdotool getmouselocation?

해당되는 경우: 데스크탑 환경을 사용하지 않고 xmonad창 관리자만 사용합니다.

답변1

내가 좋아하지만맥사이프이것이 현명한 답변입니다. 단점은 포커스를 "훔치는" 창을 생성하고 클릭해야 한다는 것입니다. 저도 필요성을 느꼈어요오직시작 시간이 약간 너무 깁니다. 약 0.2~0.3초로 "부드러운" 경험을 하기에는 약간 너무 느립니다.

나는 마침내 XLib을 파헤치기 시작했고 이를 수행하기 위해 기본 C 프로그램을 함께 엮었습니다. 시각적인 부분은 Windows(XP)와 거의 유사합니다(메모리에서 이동). 예쁘지는 않지만 작동합니다 ;-) 초점을 "훔치지" 않고 거의 즉시 시작되며 클릭하여 "통과"할 수 있습니다.

여기에 이미지 설명을 입력하세요.

를 사용하여 컴파일할 수 있습니다 cc find-cursor.c -o find-cursor -lX11 -lXext -lXfixes. 상단의 일부 변수를 조정하여 크기, 속도 등을 변경할 수 있습니다.

프로그램으로 올렸어요https://github.com/arp242/find-cursor. 다음 스크립트에는 없는 몇 가지 개선 사항(예: 명령줄 인수 및 창을 "통과"하는 클릭 기능)이 있으므로 이 버전을 사용하는 것이 좋습니다. 단순성 때문에 다음 내용은 그대로 두었습니다.

/*
 * https://github.com/arp242/find-cursor
 * Copyright © 2015 Martin Tournoij <[email protected]>
 * 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;
    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.
 */

답변2

다음 사항이 귀하에게 적용될 수 있습니다.

#!/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

이는 세 가지 유틸리티 및 에 따라 다릅니다 xv. 처음 두 개는 매우 일반적인 유틸리티이고, 세 번째는 이미 갖고 있을 것입니다.xwdxdotoolX

sleep1초 후 xdotool마우스의 현재 좌표가 -shell다음과 같이 평가하기 쉬운 형식으로 표준 출력에 기록됩니다.

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

eval그에 따라 쉘 변수가 설정되고, 루프는 for각 합의 값에서 표시할 이미지 크기의 절반을 빼거나, 값 중 하나가 25보다 작으면 0으로 설정합니다.$X$Y

xwd루트 창을 파이프에 덤프하고 xv이미지 크기를 마우스 위치 주변에서 50x50으로 자르고 창 관리자 장식 없이 작은 창에 현재 마우스 커서 아래에 이미지의 네거티브를 표시합니다.

최종 결과는 다음과 같습니다.

마우스 찾기

...하지만 내 마우스 커서가 스크린샷에 표시되지 않는 것 같아요. 하지만 걱정하지 마십시오. 제가 사진을 찍을 때 그것은 흰색 상자 바로 위에 있었습니다.

쉘 함수로 작성하고 배경으로 설정한 방법을 그림에서 볼 수 있습니다. 주로 이러한 이유 때문에 이미 맨 아래에 sleep있는 RETURN경우 해당 키를 누르면 터미널이 스크롤되고 xwd터미널이 스크롤되기 전에 충분히 빠르게 화면 그림을 캡처할 수 있습니다. 이는 나에게 약간 부정적인 이미지를 상쇄합니다. , 마음에 들지 않습니다.

어쨌든 xv둘 다 사용되고 스위치가 실행 중이므로 마우스 버튼 -viewonly-quit클릭하거나 키보드 키를 누르는 즉시 사라지지만 해당 작업 중 하나를 수행할 때까지는 그대로 유지됩니다.

ImageMagick의심할 바 없이 더 복잡한 작업을 단독으로 또는 단독으로 수행할 수 있습니다 xv. 하지만 마우스 커서 아래에 작은 네거티브 상자를 만들었습니다. 당신은 찾을 수 있습니다xv여기 문서xwd및 의 문서입니다 man xwd.

관련 정보