Bien que j'aime la réponse de Mikeserv pour son intelligence, elle a l'inconvénient de créer une fenêtre qui "vole" le focus et doit être cliquée. Je trouve également que le démarrage prend un peu trop de temps: environ 0,2 à 0,3 seconde, ce qui est juste un peu trop lent pour une expérience "fluide".
Je me suis finalement mis à creuser dans XLib et à assembler un programme C de base pour le faire. L'effet visuel est à peu près similaire à celui de Windows (XP) (de la mémoire). Ce n'est pas très beau, mais ça marche ;-) Il ne "vole" pas le focus, démarre presque instantanément, et vous pouvez cliquer "à travers".
Vous pouvez le compiler avec cc find-cursor.c -o find-cursor -lX11 -lXext -lXfixes
. Il y a quelques variables en haut que vous pouvez modifier pour changer la taille, la vitesse, etc.
J'ai publié cela en tant que programme sur http://code.arp242.net/find-cursor . Je vous recommande d'utiliser cette version, car elle présente des améliorations que le script ci-dessous n'a pas (comme des arguments de ligne de commande et la possibilité de cliquer "à travers" la fenêtre). J'ai laissé le ci-dessous tel quel en raison de sa simplicité.
/*
* http://code.arp242.net/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 = { .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
option signifie qu'elle suivra le curseur de la souris pendant l'exécution , mais ne change pas réellement ce concept de base (ce n'est pas compatible avec tous les gestionnaires de fenêtres, c'est pourquoi c'est une option).Les éléments suivants fonctionneront probablement pour vous:
Cela dépend des trois services publics
xv
,xwd
etxdotool
. Les deux premiers sont desX
utilitaires très courants , et le troisième, je suis raisonnablement sûr que vous l'avez déjà.Après
sleep
une seconde,xdotool
écrit les coordonnées actuelles de la souris dans sa sortie standard dans un-shell
format convivial comme:eval
définit les variables shell en conséquence, et lafor
soustrait de la boucle de la moitié de la taille de l'image dès-à-être-affichée à partir de chacun des$X
et$Y
les valeurs de » ou, si l'une ou l' autre valeur est inférieure à 25, les met à 0.xwd
vide la fenêtre racine sur un tuyauxv
, qui recadre autour de l'emplacement de la souris à une taille d'image de 50x50 et affiche un négatif de l'image sous le curseur de souris actuel dans une petite fenêtre sans aucune décoration de gestionnaire de fenêtres.Le résultat final est quelque chose comme ceci:
... même si je suppose que le curseur de ma souris n'apparaît pas dans les captures d'écran. Rassurez-vous, cependant, c'était juste au-dessus de la boîte blanche lorsque j'ai pris la photo.
Vous pouvez voir dans l'image comment je l'ai également écrit en tant que fonction shell et mis en arrière-plan. C'est principalement pour cette raison qu'il y a un
sleep
dedans du tout - appuyer sur laRETURN
touche fera défiler le terminal si vous êtes déjà en bas, etxwd
était assez rapide pour saisir sa photo de l'écran avant que le terminal ne défile - ce qui compenserait ma négatif dans l'image un peu et je n'ai pas aimé.Quoi qu'il en soit, parce qu'il
xv
est exécuté avec les commutateurs-viewonly
et-quit
, il disparaîtra dès qu'un bouton de la souris est cliqué ou une touche du clavier est enfoncée - mais restera jusqu'à ce que vous fassiez l'un ou l'autre.Sans aucun doute, vous pourriez faire des choses beaucoup plus élaborées avec
ImageMagick
ou mêmexv
seul - mais je viens de faire une petite case négative sous le curseur de la souris. Vous pouvez trouver lesxv
documents ici et les documents pourxwd
enman xwd
.la source
xv
. Si possible, je voudrais éviter de compilerxv
moi-même et laisserapt
gérer la gestion des paquets.display
utilitaire ImageMagick . Et bien sûr, il y en a toujoursfeh
. Je n'avais pasfeh
installé au moment où j'écris cela, et, bien que j'aie essayé une ou deux fois, je ne pouvais pas facilement comprendre commentdisplay
ouvrir sans bordures de fenêtres.xmonad
ne pas décorer ladisplay
fenêtre que cela lancerait - ou bien vous pourriez lancerdisplay
comme-iconic
ensuite utiliserxdotool
pour supprimer ses décorations et la désiconifier (ou quel que soit son nom) .xv
semble un non sur ubuntu 14.04 (il ne compilait pas malgré tous les deps fournis), etdisplay
ouvre une grande fenêtre, et je n'ai encore aucune idée de comment l'utiliserfeh
juste scanné tous les fichiers sur ma maison (chemin actuel) à la recherche d'images, drôle .. hehe est catalogueur.