Evidenzia la posizione corrente del mouse


18

Sto eseguendo una configurazione a doppio schermo e il mio trackpad è disabilitato per la maggior parte del tempo (incluso nascondere il mouse per mouse). Quando riattivo il trackpad (e visualizzo di nuovo il puntatore del mouse), ho perso traccia di dove era il puntatore prima.

Sto cercando uno strumento per evidenziare la posizione corrente del mouse (ad es. Con un cerchio). Idealmente questo sarebbe un singolo comando che fa lampeggiare il cerchio per un breve periodo di tempo.

Sono consapevole che xdotoolpuò trovare la posizione corrente, ma non c'è evidenziazione; inoltre, key-monnon fornisce questa funzionalità. Ho anche letto che cairo composition managerfornisce tale funzionalità, ma mi chiedo se esiste uno strumento più piccolo per raggiungere questo obiettivo.

Nel caso in cui non esistano tali strumenti: qual è il modo più semplice per visualizzare un tale cerchio attorno al cursore usando i dati forniti da xdotool getmouselocation ?

Nel caso sia rilevante: non utilizzo un ambiente desktop, ma solo il xmonadgestore di finestre.

Risposte:


18

Mentre mi piace la risposta di Mikeserv per intelligenza, ha il rovescio della medaglia che creerà una finestra che "ruba" la messa a fuoco e deve essere scartata. Trovo anche che ci voglia solo un po 'troppo a lungo per iniziare: da circa 0,2 a 0,3 secondi, che è solo leggermente troppo lento per un'esperienza "fluida".

Alla fine sono riuscito a scavare in XLib e ho combinato un programma C di base per farlo. L'effetto visivo è approssimativamente simile a quello di Windows (XP) (dalla memoria). Non è molto bello, ma funziona ;-) Non "ruba" la messa a fuoco, inizia quasi istantaneamente e puoi fare clic su "attraverso".

inserisci qui la descrizione dell'immagine

Puoi compilarlo con cc find-cursor.c -o find-cursor -lX11 -lXext -lXfixes. Ci sono alcune variabili in alto che puoi modificare per cambiare dimensione, velocità, ecc.

L'ho rilasciato come programma all'indirizzo http://code.arp242.net/find-cursor . Ti consiglio di utilizzare questa versione, in quanto presenta alcuni miglioramenti che lo script seguente non ha (come gli argomenti della riga di comando e la possibilità di fare clic "attraverso" la finestra). Ho lasciato il seguente così com'è per la sua semplicità.

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

Quanto sarebbe facile trasformarlo in una finestra sagomata con un buco nel mezzo per far passare gli eventi del mouse? Ho provato a trasformare il tuo esempio in qualcosa di simile a ciò che l'OP sta cercando qui , ma non avendo esperienza con xlib, ho finito irrimediabilmente perso ..
gandalf3

FTR: Come compilarlo sotto Ubuntu: askubuntu.com/q/801252/31300
Grzegorz Wierzowiecki

@ gandalf3 Quasi un anno dopo sono finalmente riuscito a implementarlo :-) Non ho modificato lo snippet di cui sopra in modo che potesse mantenerne la semplicità, ho solo modificato la versione su github.com/Carpetsmoker/find-cursor .
Martin Tournoij,

@Carpetsmoker Funziona come un fascino, geniale! Grazie per questo :) Ora per avere la posizione di aggiornamento per seguire il mouse ..
gandalf3

1
L'applicazione mostra il cerchio e quindi esce da @AquariusPower, quindi questo è il comportamento previsto. Il modo per usarlo è mappare una combinazione di tasti per avviarlo. L' -fopzione significa che seguirà il cursore del mouse mentre è in esecuzione , ma in realtà non cambia quel concetto di base (questo non è compatibile con tutti i gestori di finestre, motivo per cui è un'opzione).
Martin Tournoij,

6

Quanto segue probabilmente funzionerà per te:

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

Dipende dalle tre utility xv, xwde xdotool. Le prime due sono Xutility molto comuni , e la terza sono ragionevolmente sicura che tu l'abbia già fatto.

Dopo sleepun secondo, xdotoolscrive le coordinate correnti del mouse sul suo stdout in un -shellformato intuitivo come:

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

evalimposta le variabili di shell di conseguenza, e la forsottrae anello metà della dimensione dell'immagine procinto di essere-visualizzate da ciascuna $Xe $Y's valori o, se entrambi i valori è inferiore a 25, insiemi li a 0.

xwdscarica la finestra principale su una pipe xv, che si ritaglia intorno alla posizione del mouse fino a una dimensione dell'immagine di 50x50 e visualizza un negativo dell'immagine sotto il cursore del mouse corrente in una piccola finestra senza alcuna decorazione del gestore finestre.

Il risultato finale è qualcosa del genere:

findmouse

... anche se immagino che il mio cursore del mouse non si mostri nelle schermate. State tranquilli, però, era proprio sopra la scatola bianca lì quando ho scattato la foto.

Puoi vedere nell'immagine come l'ho anche scritto come funzione shell e come sfondo. È principalmente per questo motivo che c'è un sleepdentro - premendo il RETURNtasto scorrerai il terminale se sei già in fondo, ed è xwdstato abbastanza veloce da catturare la sua immagine dello schermo prima che il terminale scorresse - il che compenserebbe il mio negativo nell'immagine un po 'e non mi è piaciuto.

Ad ogni modo, poiché xvviene eseguito con entrambi i pulsanti -viewonlye -quit, scomparirà non appena si fa clic su un pulsante del mouse o si preme un tasto della tastiera, ma rimarrà fino a quando non lo si fa.

Indubbiamente potresti fare cose molto più elaborate con ImageMagicko anche xvda solo - ma ho appena fatto una piccola casella negativa sotto il cursore del mouse. Puoi trovare i xvdocumenti qui e i documenti per xwdin man xwd.


1
Questo sembra buono, tranne per il fatto che la mia distro (debian) non fornisce xv. Se possibile, vorrei evitare di compilare xvda solo e aptgestire la gestione dei pacchetti.
deshtop,

1
@deshtop: ecco un repository, se lo desideri. Probabilmente puoi anche fare cose simili con l' displayutilità ImageMagick . E ovviamente c'è sempre feh. Al momento non l'ho fehinstallato al momento della stesura di questo, e, anche se ho provato una o due volte, non sono riuscito a capire facilmente come displayaprire senza i bordi gestiti dalla finestra.
Mikeserv,

Grazie per il repository, ma sono un po 'cauto con i repository non ufficiali. Vedrò se posso usare ImageMagick
deshtop il

1
@deshtop - probabilmente puoi. Per lo meno puoi configurare di xmonad non decorare la displayfinestra che questo si lancerebbe, oppure potresti lanciarlo displaycome -iconicpoi usare xdotoolper rimuovere le sue decorazioni e slegarlo (o come si chiama) .
Mikeserv,

sembra davvero interessante, ma xvsembra non andare su Ubuntu 14.04 (non è stato compilato nonostante siano stati forniti tutti i deps), e displaysta aprendo una grande finestra, e non ho ancora idea di come usarlo, fehho appena scansionato tutti i file di casa mia (percorso attuale) alla ricerca di immagini, divertente .. hehe è un catalogatore.
Aquarius Power,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.