저는 듀얼 화면 설정을 실행하고 있으며 대부분의 경우 트랙패드를 비활성화했습니다(마우스 포인터 숨기기 포함). 트랙패드를 다시 활성화하면(마우스 포인터가 다시 나타남) 포인터가 이전에 있던 위치가 사라집니다.
현재 마우스 위치를 강조 표시하는 도구를 찾고 있습니다.(예: 원을 통해) 이상적으로 이것은 짧은 시간 동안 원을 깜박이는 명령입니다.
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
. 처음 두 개는 매우 일반적인 유틸리티이고, 세 번째는 이미 갖고 있을 것입니다.xwd
xdotool
X
sleep
1초 후 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
.