현재 마우스 위치 강조


18

이중 화면 설정을 실행 중이며 트랙 패드가 대부분 비활성화되어 있습니다 (마우스 포인터 숨기기 포함). 트랙 패드를 다시 활성화하고 마우스 포인터를 다시 표시하면 포인터가 있던 위치를 잃어 버렸습니다.

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

나는 알고 있어요 xdotool현재 위치를 찾을 수 있습니다, 아직 강조가 없다; 또한 key-mon이 기능을 제공하지 않습니다. 나는 또한 cairo composition manager그러한 기능 을 제공 하는 것을 읽었 지만 이것을 달성하기위한 더 작은 도구가 있는지 궁금합니다.

그러한 도구가없는 경우 : ?에서 제공하는 데이터를 사용하여 커서 주위에 원을 표시하는 가장 쉬운 방법은 무엇입니까 xdotool getmouselocation ?

이것이 관련된 경우 : 나는 데스크톱 환경을 사용하지 않고 xmonad창 관리자 만 사용합니다 .

답변:


18

나는 영리함에 대한 Mikeserv 의 대답을 좋아하지만 초점을 "훔치는"창을 만들고 클릭해야한다는 단점이 있습니다. 또한 걸리는 찾을 단지 는 "부드럽게"경험을 너무 느린 단지 약간 0.2 0.3 초에 대해 : 시작하는 데 시간이 너무 오래 약간.

나는 마침내 XLib를 파고 들어가기 위해 기본 C 프로그램을 함께 사용했습니다. 시각적 효과는 Windows (XP)의 메모리와 거의 비슷합니다. 매우 아름답지는 않지만 작동합니다. ;-) 초점을 "훔치지"않고 거의 즉각적으로 시작하며 "클릭"할 수 있습니다.

여기에 이미지 설명을 입력하십시오

로 컴파일 할 수 있습니다 cc find-cursor.c -o find-cursor -lX11 -lXext -lXfixes. 상단에는 크기, 속도 등을 변경하기 위해 조정할 수있는 몇 가지 변수가 있습니다.

나는 이것을 http://code.arp242.net/find-cursor 에서 프로그램으로 발표했다 . 아래 스크립트에는없는 개선 사항이 있으므로이 버전을 사용하는 것이 좋습니다 (예 : 명령 줄 인수 및 창을 "클릭"하는 기능 등). 나는 단순함 때문에 아래를 그대로 두었습니다.

/*
 * 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.
 */

어떻게 쉽게 그것은이 점을 설정하는 것입니다 모양의 창마우스 이벤트를 통과하기 위해 중간에 구멍? 나는 영업 이익은 무엇을 찾고 같은으로 예를 설정하려고 시도 여기 지만, Xlib를 가진 경험이없는, 내가 길을 잃었다 .. 결국
gandalf3을

FTR : 우분투에서 컴파일하는 방법 : askubuntu.com/q/801252/31300
Grzegorz Wierzowiecki

@ gandalf3 거의 1 년 후 나는 마침내 그것을 구현할 수 있었습니다 .
Martin Tournoij

@Carpetsmoker 화려한 매력처럼 작동합니다! 이것에 감사드립니다 :) 이제 마우스를 따라 위치를 업데이트합니다 ..
gandalf3

1
응용 프로그램은 원을 표시 한 다음 @AquariusPower를 종료하므로 예상되는 동작입니다. 그것을 사용하는 방법은 그것을 시작하기 위해 키 조합을 매핑하는 것입니다. 이 -f옵션은 실행 중에 마우스 커서를 따라 가지만 실제로 기본 개념을 변경하지는 않습니다 (모든 창 관리자와 호환되지 않으므로 옵션입니다).
Martin Tournoij

6

다음은 아마도 당신을 위해 일할 것입니다 :

#!/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, xwd그리고 xdotool. 처음 두 가지는 매우 일반적인 X유틸리티이며, 세 번째는 이미 당신이 이미 가지고 있다고 확신합니다.

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

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

eval쉘 변수를 적절하게 설정하고 for루프는 각각의 $X$Y값 에서 표시 될 이미지의 크기의 절반을 빼 거나 값이 25보다 작 으면 0으로 설정합니다.

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

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

Findmouse

... 마우스 커서가 스크린 샷에 나타나지 않는 것 같습니다. 그러나 내가 사진을 찍었을 때 그것은 바로 흰색 상자 위에 있었다.

이미지에서 어떻게 쉘 함수로 작성하고 배경을했는지 알 수 있습니다. 그것은 주로 그 이유가 있습니다 sleep- RETURN이미 바닥에있는 경우 키를 누르면 터미널이 스크롤되며 터미널이 스크롤 xwd되기 전에 화면의 그림을 잡을만큼 빠릅니다. 이미지에 약간 부정적이며 나는 그것을 좋아하지 않았습니다.

어쨌든, 스위치 와 스위치 xv를 모두 사용 하기 때문에 마우스 버튼을 누르거나 키보드 키를 누르 자마자 사라지지만 둘 중 하나를 유지할 때까지 유지됩니다.-viewonly-quit

의심 할 여지없이 당신은 훨씬 더 정교한 일을 할 수 ImageMagick또는 xv단독으로뿐만 아니라 -하지만 난 그냥 마우스 커서 아래에 약간의 부정적인 상자를했다. 당신은 찾을 수 있습니다 xv여기에 문서 과 워드 프로세서 xwd에서 man xwd.


1
내 배포판 (데비안)이을 제공하지 않는다는 사실을 제외하고는 좋아 보입니다 xv. 가능하면 xv스스로 컴파일하지 apt않고 패키지 관리를 처리 하고 싶습니다 .
deshtop

1
@deshtop - 여기 당신이 그것을 원하는 경우 환매 특약은. ImageMagick display유틸리티를 사용하여 비슷한 작업을 수행 할 수도 있습니다 . 물론 항상 feh있습니다. 나는 그것을 feh쓸 때 현재 설치 하지 않았으며 한두 번 시도했지만 display창에 테두리가없는 테두리를 여는 방법을 쉽게 알 수 없었습니다 .
mikeserv

리포지토리에 감사하지만 비공식 리포지토리에는 약간 신중합니다. 내가 ImageMagick을 사용할 수 있는지 볼 것이다
deshtop

1
@deshtop-아마도 가능합니다. 최소한 당신은 구성 할 수 xmonad 없습니다 장식 display이 시작할 것이라고 창 - 그렇지 않으면 당신은 시작할 수 display-iconic다음 사용 xdotool의 장식과 제거 uniconify (또는 무엇이든 그 불렀다) 을.
mikeserv 2012

이 정말 흥미로운 소리지만, xvA는 더 (이 모든 deps가 제공되었다에도 불구하고 컴파일되지 않았다), 그리고 우분투 14.04을 갈 것 같다 display큰 창을 여는, 나는 아무 생각이 아직 사용 방법 feh그냥 내 집에있는 모든 파일을 스캔 (현재 경로) 재미있는 사진을 찾고 있습니다. hehe는 cataloguer입니다.
물병 자리 힘
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.