¿Cómo se oculta el puntero del ratón bajo Linux / X11?


¿Cómo oculto el puntero del ratón bajo X11? Me gustaría usar las bibliotecas integradas para hacer esto y no algo como SDL (SDL_ShowCursor(0)) o glut (glutSetCursor(GLUT_CURSOR_NONE)). Además, el puntero del ratón debe estar oculto sin importar la ubicación del puntero, no solo en su propia ventana.

Author: rck, 2009-03-19

9 answers

Puede crear y establecer un tema de cursor invisible. Este truco es utilizado por maemo , porque es bastante inútil tener un cursor en un dispositivo de pantalla táctil.

Lamentablemente, la capacidad de cambiar el tema del cursor global en tiempo de ejecución no es uniforme en las aplicaciones X11 y los kits de herramientas. Puede cambiar el recurso del servidor Xcursor.theme, y nadie se dará cuenta (generalmente solo se consulta al inicio); puede informar xsettings que solo parece afectar a los programas Gtk+; KDE usa algunos tipo de comunicación a través de propiedades en la ventana raíz; etc.

Al menos cambiar el cursor para su propia aplicación es tan fácil como XDefineCursor, y si lo hace en la ventana raíz, algunas aplicaciones podrían seguir.

 14
Author: ephemient,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-19 01:54:43

Aquí hay una descripción cómo lo hace la utilidad unclutter.

Unclutter es un programa que se ejecuta permanentemente en el fondo de un X11 sesion. Comprueba la posición del puntero X11 (cursor) cada pocos segundos, y cuando se encuentra que no se ha movido (y no hay botones se presionan con el ratón, y el cursor no está en la ventana raíz) crea una pequeña sub-ventana como hija de la ventana en la que se encuentra el cursor. La nueva ventana instala un cursor de tamaño 1x1 pero una máscara de todo 0, es decir, un cursor invisible. Esto le permite ver todo el texto en un xterm o xedit, por ejemplo. La multitud de factores humanos estaría de acuerdo debería distraer menos las cosas.

Una vez creado, el programa espera a que el puntero salga de la ventana y luego lo destruye, restaurando la situación original. Los eventos de botón se pasan de forma transparente a la ventana principal. Por lo general, harán que el cursor reaparezca porque una captura activa se hará por el programa mientras el botón está abajo, por lo que el puntero aparentemente saldrá de la ventana, aunque su posición x y no cambie.

 33
Author: Eugene Morozov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-26 19:05:28

Prefiero usar un método más simple:

unclutter -idle 0

Casi no ves el cursor, todavía está disponible. Para desactivar el ratón:

rmmod psmouse

O desactivar el módulo del ratón de forma permanente en algún lugar de /etc/. Consulte el manual de distribución.

 18
Author: sevenfourk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-10 09:35:38

Una alternativa a unclutter

Unclutter no funcionó para mí, ya que no funciona bien con superficies aceleradas por hardware (como, por ejemplo, las producidas por VA-API de intels al decodificar video). Así que encontré un programa que escondía el puntero del ratón de una manera menos indirecta, hhp, y lo reescribió en C con dependencias mínimas, el resultado es hhpc. Hice esto para obviar la necesidad de tener haskell para compilarlo y porque hhp a veces dejó de ocultar el puntero del ratón.

Hhpc, se basa solo en glibc y xlib, por lo que es fácil de construir, solo haga make release. Puede obtener el código y las instrucciones de mi repositorio. Es muy eficiente en memoria y CPU (porque no hace casi nada).

 15
Author: Aktau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-17 15:26:35

Terminé usando XDefineCursor como ephemient mencionado. La aplicación control cambió el cursor de la ventana raíz por defecto y las otras aplicaciones (que están bajo mi control) lo heredaron.

Los detalles del código se ven como:

// 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);

Con el fin de ocultar el cursor y luego después de que haya terminado

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

Para restaurar el cursor izquierdo de X (Ya que es la ventana raíz y no quiero que permanezca invisible. No estoy seguro, pero también podría usar

XUndefineCursor(display, window);
 14
Author: rck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-22 15:59:29

Hay una opción -no-cursor para Xorg 1.7 y posteriores. https://www.x.org/wiki/AdvancedTopicsFAQ /

xinit -- -nocursor o startx -- -nocursor podría funcionar.

 12
Author: rmarscher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-15 19:27:49

¡Usa xbanish! Es "desterrar el cursor del ratón al escribir"! Iniciarlo con

Xbanish &

Y disfrutar!

 6
Author: ILUXA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-05 02:47:49

Esta es mi solución. Coloca el cursor donde no se puede ver ( en mi caso, en la esquina inferior izquierda) - entonces, desactiva el ratón, por lo que no se puede mover.

Nota Puede analizar datos de xrandr, o poner esos datos en un entorno al iniciar sesión, y luego usarlos; de esa manera, no tendrá que tenerlo codificado. Pero, en cuanto a mí, nunca cambio la resolución de mi pantalla, por lo que 768 está bien:)

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
Author: Emanuel Berg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-24 03:27:31

¡Muy bien!

Supongo que este post puede ser un poco viejo, pero si lo que he encontrado puede ayudar a algunos de nosotros, definitivamente tengo que publicarlo aquí;)

Me encontré con una solución limpia y simple que funciona bien, sin usar "xcb" ( para lo que traté de lograr, fue una pequeña sobreingeniería (..)

Así que:

Todo lo que necesita es el comando "xsetroot", con los argumentos/parámetros apropiados:

- > para ocultar el cursor del ratón, necesita un pequeño archivo extra (I llamado mío " blnk_ptr.xbm")

El contenido de este archivo:

#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 };

Entonces, podemos usar los dos siguientes comandos:

- > para ocultar el cursor del puntero del ratón:

xsetroot -cursor blnk_ptr.xbm blnk_ptr.xbm

- > para mostrar de nuevo el cursor del puntero del ratón:

xsetroot -cursor_name left_ptr

(puede usar un puntero del ratón que no sea "left_ptr", pero este parece estar ampliamente disponible en los sistemas * nix (..)

Por cierto - > Todavía no se como obtener el nombre del puntero actualmente usado por el sistema usando xsetroot > > Supongo que voy a [como de costumbre] digg eso también, pero estaría feliz de tener a alguien que sabe cómo darme la respuesta (Sería bueno;))

Disfrutar ? ; p

 4
Author: StephaneAG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-13 15:53:48