Хотя мне нравится ответ 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.
*/
-f
означает вариант будет следовать за курсором мыши вокруг во время работы , но на самом деле не изменить эту основную концепцию (это не совместимо со всеми оконными менеджерами, поэтому это вариант).Следующее, вероятно, будет работать для вас:
Это зависит от трех коммунальных услуг
xv
,xwd
иxdotool
. Первые два - очень распространенныеX
утилиты, а третье, я уверен, у вас уже есть.Через
sleep
одну секундуxdotool
записывает текущие координаты мыши в стандартный вывод в удобном для ознакомления-shell
формате, например:eval
соответственно устанавливает переменные оболочки, иfor
цикл вычитает половину размера изображения, которое должно отображаться в ближайшее время, из каждого из значений$X
and$Y
и, или, если любое из значений меньше 25, устанавливает их в 0.xwd
создает дамп корневого окна по каналуxv
, который обрезает область расположения мыши до размера изображения 50x50 и отображает негатив изображения под текущим курсором мыши в небольшом окне без каких-либо украшений диспетчера окон.Конечный результат примерно такой:
... хотя я думаю, что мой курсор мыши не появляется на снимках экрана. Будьте уверены, однако, это было прямо над белой коробкой, когда я сделал снимок.
Вы можете видеть на изображении, как я также написал это как функцию оболочки и создал фон. Это в основном по той причине, что там вообще
sleep
есть - нажатиеRETURN
клавиши прокручивает терминал, если вы уже внизу, иxwd
был достаточно быстрым, чтобы захватить его изображение экрана перед прокруткой терминала - что сместило бы мой негатива на изображении немного и мне это не понравилось.Во всяком случае, так как
xv
выполняется с обоими-viewonly
и-quit
коммутаторами, она исчезнет , как только кнопка мыши нажата или клавиша клавиатуры нажата - но будет оставаться до тех пор , пока сделать что- либо.Несомненно, вы могли бы сделать намного более сложные вещи с помощью
ImageMagick
или даже вxv
одиночку, но я просто сделал небольшой отрицательный блок под курсором мыши. Вы можете найтиxv
документы здесь и документы дляxwd
вman xwd
.источник
xv
. Если возможно, я бы хотел избежать компиляцииxv
самостоятельно и разрешитьapt
управление пакетами.display
утилиты ImageMagick . И конечно всегда естьfeh
. Я неfeh
установил в тот момент, когда писал это, и, хотя я пытался один или два раза, я не мог легко понять, какdisplay
открыть без оконных рамок.xmonad
не украшатьdisplay
окно, которое это запустит - или вы могли бы запуститьdisplay
как-iconic
затем использовать,xdotool
чтобы удалить его украшения и uniconify (или как там это называется) .xv
кажется, что нет ubuntu 14.04 (он не компилировался, несмотря на то, что все deps были поставлены), иdisplay
открывает большое окно, и я пока не знаю, как его использовать,feh
просто отсканировал все файлы у себя дома (текущий путь) ищу картинки, смешно .. хе-хе это каталогизатор.