web-dev-qa-db-fra.com

Comment cacher le pointeur de la souris sous Linux / X11?

Comment masquer le pointeur de la souris sous X11? Je voudrais utiliser les bibliothèques intégrées pour ce faire et non quelque chose comme SDL (SDL_ShowCursor (0)) ou glut (glutSetCursor (GLUT_CURSOR_NONE)). En outre, le pointeur de la souris doit être masqué quel que soit l'emplacement du pointeur, pas seulement dans sa propre fenêtre.

28
rck

Vous pouvez créer et définir un thème de curseur invisible. Cette astuce est utilisée par maemo , car il est plutôt inutile d'avoir un curseur sur un appareil à écran tactile.

Malheureusement, la possibilité de modifier le thème du curseur global au moment de l'exécution n'est pas uniforme dans les applications et kits d'outils X11. Vous pouvez modifier la ressource du serveur Xcursor.theme, et personne ne le remarquera (généralement, il n'est interrogé qu'au démarrage); vous pouvez informer xsettings qui ne semble affecter que les programmes Gtk +; KDE utilise une sorte de communication via les propriétés de la fenêtre racine; etc.

Changer au moins le curseur de votre propre application est aussi simple que XDefineCursor , et si vous le faites sur la fenêtre racine, certains les applications pourraient suivre.

14
ephemient

Voici un description comment l'utilitaire unclutter le fait.

Unclutter est un programme qui s'exécute en permanence en arrière-plan d'une session X11. Il vérifie la position du pointeur (curseur) X11 toutes les quelques secondes, et lorsqu'il trouve qu'il n'a pas bougé (et qu'aucun bouton n'est enfoncé sur la souris et que le curseur n'est pas dans la fenêtre racine), il crée une petite sous-fenêtre comme un enfant de la fenêtre dans laquelle se trouve le curseur. La nouvelle fenêtre installe un curseur de taille 1x1 mais un masque de tous les 0, c'est-à-dire un curseur invisible. Cela vous permet de voir tout le texte dans un xterm ou xedit, par exemple. La foule des facteurs humains conviendrait que cela devrait rendre les choses moins distrayantes.

Une fois créé, le programme attend que le pointeur quitte la fenêtre puis la détruit, rétablissant la situation d'origine. Les événements de bouton sont transmis de manière transparente à la fenêtre parent. Ils font généralement réapparaître le curseur car une capture active sera effectuée par le programme pendant que le bouton est enfoncé, donc le pointeur quittera apparemment la fenêtre, même si sa position x y ne change pas.

34
Eugene Morozov

Je préfère utiliser une méthode plus simple:

unclutter -idle 0

Vous ne voyez presque pas le curseur, il est toujours disponible. Pour désactiver la souris:

rmmod psmouse

Ou désactivez définitivement le module de la souris quelque part dans/etc /. Voir votre manuel de distribution.

19
sevenfourk

une alternative au désencombrement

Unclutter n'a pas fonctionné pour moi, car il ne fonctionne pas bien avec les surfaces accélérées par le matériel (comme par exemple celles produites par VA-API d'Intel) lors du décodage vidéo). J'ai donc trouvé un programme qui a caché le pointeur de la souris de manière moins détournée, hhp, et l'a réécrit en C avec un minimum dépendances, le résultat est hhpc. J'ai fait cela pour éviter d'avoir à utiliser haskell pour le compiler et parce que hhp a parfois cessé de cacher le pointeur de la souris.

hhpc, repose uniquement sur glibc et xlib, il est donc facile à construire, fais juste make release. Vous pouvez obtenir le code et les instructions de mon référentiel . Il est très efficace en mémoire et en CPU (car il ne fait presque rien).

17
Aktau

Il y a un -no-cursor option pour Xorg 1.7 et versions ultérieures. https://www.x.org/wiki/AdvancedTopicsFAQ/

xinit -- -nocursor ou startx -- -nocursor pourrait fonctionner.

14
rmarscher

J'ai fini par utiliser XDefineCursor comme l'éphémient mentionné. L'application de contrôle a modifié le curseur de la fenêtre racine par défaut et les autres applications (qui sont sous mon contrôle) en ont hérité.

Les détails du code ressemblent à ceci:

// Hide the cursor

if (NULL==(display=XOpenDisplay(NULL))) 
{
   printf("Unable to open NULL display\n");
   exit(1);
}
window = DefaultRootWindow(display);

Cursor invisibleCursor;
Pixmap bitmapNoData;
XColor black;
static char noData[] = { 0,0,0,0,0,0,0,0 };
black.red = black.green = black.blue = 0;

bitmapNoData = XCreateBitmapFromData(display, window, noData, 8, 8);
invisibleCursor = XCreatePixmapCursor(display, bitmapNoData, bitmapNoData, 
                                     &black, &black, 0, 0);
XDefineCursor(display,window, invisibleCursor);
XFreeCursor(display, invisibleCursor);
XFreePixmap(display, bitmapNoData);

Afin de masquer le curseur, puis après avoir terminé

// Restore the X left facing cursor
Cursor cursor;
cursor=XCreateFontCursor(display,XC_left_ptr);
XDefineCursor(display, window, cursor);
XFreeCursor(display, cursor);

Pour restaurer le curseur gaucher de X (Puisque c'est la fenêtre racine et je ne veux pas qu'elle reste invisible. Je ne suis pas sûr, mais je pourrais aussi être en mesure d'utiliser

XUndefineCursor(display, window);
14
rck

Utilisez xbanish! Il "bannit le curseur de la souris lors de la frappe"! Commencez avec

xbanish &

et apprécie!

6
ILUXA

D'accord!

Je suppose que ce message peut devenir un peu vieux, mais si ce que j'ai trouvé peut aider certains d'entre nous, je dois certainement le poster ici;)

Je me suis trouvé une solution propre et simple qui fonctionne bien, sans utiliser "xcb" (pour ce que j'ai essayé de réaliser, c'était une petite ingénierie (..)

Alors:

Tout ce dont vous avez besoin est la commande "xsetroot", avec les arguments/paramètres appropriés:

-> pour cacher le curseur de la souris, vous avez besoin d'un petit fichier supplémentaire (j'ai appelé le mien "blnk_ptr.xbm")

le contenu de ce fichier:

#define blnk_ptr_width 1
#define blnk_ptr_height 1
#define blnk_ptr_x_hot 0
#define blnk_ptr_y_hot 0
static unsigned char blnk_ptr_bits[] = {
   0x00 };

Ensuite, nous pouvons utiliser les deux commandes suivantes:

-> pour masquer le curseur du pointeur de la souris:

xsetroot -cursor blnk_ptr.xbm blnk_ptr.xbm

-> pour afficher à nouveau le curseur du pointeur de la souris:

xsetroot -cursor_name left_ptr

(vous pouvez utiliser un curseur de pointeur de souris autre que "left_ptr", mais celui-ci semble être largement disponible sur les systèmes * nix (..)

Btw-> Je ne sais pas encore comment obtenir le nom du pointeur actuellement utilisé par le système en utilisant xsetroot -> Je suppose que je vais [comme d'habitude] le creuser aussi, mais je serais heureux d'avoir quelqu'un qui sait comment me donner la réponse (ce serait bien;))

Prendre plaisir ? ; p

4
StephaneAG

C'est ma solution. Il place le curseur là où vous ne pouvez pas le voir (dans mon cas, dans le coin inférieur gauche) - puis, il désactive la souris, vous ne pouvez donc pas le déplacer.

Remarque Vous pouvez analyser les données de xrandr, ou mettre ces données dans un environnement lors de la connexion, puis les utiliser; de cette façon, vous n'aurez pas à le coder en dur. Mais moi, je ne change jamais la résolution de mon écran, donc 768 c'est OK :)

setmouse () {
   DISPLAY=":0" xinput $1 `DISPLAY=":0" xinput | grep Mouse |
           tr -d " " | tr "\t" " " |
           cut -d" " -f2 | cut -d"=" -f2`
}

offmouse () {
   DISPLAY=":0" xdotool mousemove 0 768 # use xrandr to find out
   setmouse disable
}

onmouse () {
   setmouse enable
}
4
Emanuel Berg