Виділіть поточне положення миші


18

Я працюю у режимі подвійного екрана і більшу частину часу відключаю трекпад (що включає приховування покажчика миші). Коли я повторно ввімкнув трекпад (і знову покажу вказівник миші), я втратив трек, де раніше був вказівник.

Я шукаю інструмент для виділення поточного положення миші (наприклад, по колу). В ідеалі це була б одна команда, що прошиває коло за короткий проміжок часу.

Я знаю, що xdotoolможна знайти поточну позицію, але виділення немає; також key-monне забезпечує цю функціональність. Я також читав, що cairo composition managerзабезпечує таку функціональність, але мені цікаво, чи є менший інструмент для досягнення цього.

Якщо такого інструменту немає: Який найпростіший спосіб відобразити таке коло навколо курсора за допомогою даних, наданих xdotool getmouselocation ?

У випадку, якщо це доречно: я не використовую робоче середовище, а лише xmonadменеджер вікон.

Відповіді:


18

Хоча мені подобається відповідь Мікесерва за кмітливість, але є недоліком, що він створить вікно, яке «вкраде» фокус і його потрібно натиснути. Я також вважаю , що потрібно просто трохи занадто довго , щоб почати: близько 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.
 */

Як легко було б перетворити це на фігурне вікно з отвором посередині, щоб пройшли події миші? Я спробував перетворити ваш приклад у щось на кшталт того , що OP шукає тут , але , не маючи досвіду роботи з Xlib я опинився безнадійно втраченим ..
gandalf3

FTR: Як скласти його під Ubuntu: askubuntu.com/q/801252/31300
Grzegorz Wierzowiecki

@ gandalf3 Майже через рік я нарешті зіткнувся з реалізацією цього :-) Я не змінив описаний вище фрагмент, щоб він міг підтримувати його простоту, я лише змінив версію на сайті github.com/Carpetsmoker/find-cursor .
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утиліти, а третій я, напевно, впевнений у вас.

Провівши sleepодну секунду, xdotoolзаписує поточні координати миші на її stdout у зручному -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
Це виглядає добре, за винятком того, що мій дистрибутив (debian) не забезпечує xv. Якщо можливо, я б хотів уникнути компіляції xvсамостійно і дозволити aptобробляти управління пакетом.
дешто

1
@deshtop - ось репо, якщо ви цього хочете. Можливо, ви також можете робити подібні речі за допомогою displayутиліти ImageMagick . І звичайно, завжди є feh. Я не fehвстановлював цього моменту, коли писав це, і, хоч намагався раз чи два, я не міг легко зрозуміти, як зробити displayвідкрите без оброблених віконних меж.
mikeserv

Дякую за репо, але я трохи обережний з неофіційними сховищами. Я побачу, чи можу я використовувати ImageMagick
deshtop

1
@deshtop - напевно, можеш. По крайней мере, ви можете налаштувати xmonad не прикрашати displayвікно, яке воно запустить, - інакше ви можете запустити, displayяк -iconicтоді використовувати xdotoolдля видалення його прикрас і об'єднати (або все, що називається) .
mikeserv

це звучить дуже цікаво, але, xvсхоже, не йдеться на ubuntu 14.04 (він не збирався, незважаючи на те, що всі деп були поставлені), і displayвідкриває велике вікно, і я ще не маю уявлення, як fehним користуватися, просто відсканував усі файли в моєму будинку (поточний шлях) шукає фотографії, смішно .. hehe - це каталог.
Сила Водолія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.