¿Cómo ocultas el puntero del mouse en Linux/X11?
(9)
una alternativa para despejar
Unclutter no funcionó para mí, ya que no funciona bien con las superficies aceleradas por hardware (como, por ejemplo, las producidas por VA-API de intels cuando se decodifica video). Así que encontré un programa que ocultaba el puntero del mouse de forma menos indirecta, hhp , y lo reescribió en C con mínimas dependencias, el resultado es hhpc . Hice esto para obviar la necesidad de tener haskell para compilarlo y porque hhp a veces dejaba de ocultar el puntero del mouse.
hhpc , se basa solo en glibc
y xlib
, por lo que es fácil de compilar, solo make release
. Puede obtener el código y las instrucciones de hhpc . Es muy eficiente en memoria y CPU (porque no hace casi nada).
¿Cómo oculto el puntero del mouse debajo de 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 mouse debe estar oculto sin importar la ubicación del puntero, no solo en su propia ventana.
¡Todo bien!
Supongo que esta publicación puede estar un poco vieja, pero si lo que encontré 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 intenté lograr, fue un poco de ingeniería excesiva).
Asi que:
Todo lo que necesita es el comando "xsetroot", con los argumentos / parámetros adecuados:
-> para ocultar el cursor del mouse, necesitas un pequeño archivo extra (llamé 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 comandos siguientes:
-> para ocultar el cursor del puntero del mouse:
xsetroot -cursor blnk_ptr.xbm blnk_ptr.xbm
-> para volver a mostrar el cursor del puntero del mouse:
xsetroot -cursor_name left_ptr
(puede usar un cursor de puntero del mouse que no sea "left_ptr", pero este parece estar ampliamente disponible en los sistemas * nix (..)
Btw-> No sé todavía cómo obtener el nombre del puntero que actualmente usa el sistema usando xsetroot -> Supongo que [como de costumbre] también lo haré, pero me encantaría tener a alguien que sabe cómo hacerlo dándome la respuesta (sería bueno;))
Disfrutar? ;pag
Aquí hay una description cómo la utilidad unclutter
hace.
Unclutter es un programa que se ejecuta permanentemente en el fondo de una sesión X11. Comprueba la posición del puntero (cursor) X11 cada pocos segundos, y cuando encuentra que no se ha movido (y no se presiona ningún botón en el mouse, y el cursor no está en la ventana raíz) crea una pequeña ventana secundaria como un elemento secundario 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 en que debería distraer 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 los botones se pasan de forma transparente a la ventana principal. Por lo general, hará que el cursor vuelva a aparecer porque el programa realizará una captura activa mientras el botón está abajo, por lo que el puntero aparentemente saldrá de la ventana, aunque su posición xy no cambie.
Esta es mi solución. Coloca el cursor donde no se puede ver (en mi caso, en la esquina inferior izquierda); luego, desactiva el mouse, por lo que no puede moverlo.
Nota Puede analizar datos de xrandr
, o poner esos datos en un entorno en el inicio de sesión, y luego usarlos; De esa manera, no tendrás que tenerlo codificado. Pero, en lo que a mí respecta, 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
}
Hay una opción de -no-cursor
para Xorg 1.7 y versiones posteriores. https://www.x.org/wiki/AdvancedTopicsFAQ/
xinit -- -nocursor
o startx -- -nocursor
podría funcionar.
Prefiero usar un método más simple:
unclutter -idle 0
Usted casi no ve el cursor, todavía está disponible. Para desactivar el mouse:
rmmod psmouse
O deshabilite el módulo del mouse permanentemente en algún lugar en / etc /. Consulte su manual de distribución.
Terminé usando XDefineCursor como lo mencionó efímero. La aplicación de control cambió el cursor predeterminado de la ventana raíz y las otras aplicaciones (que están bajo mi control) lo heredaron.
Los detalles del código se ven así:
// 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 termine.
// 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 zurdo de X (ya que es la ventana raíz y no quiero que permanezca invisible. No estoy seguro, pero también puedo usar
XUndefineCursor(display, window);
Utilice xbanish! Se "destierra el cursor del ratón al escribir"! Comience con
xbanish &
¡y disfrutar!
Puede crear y establecer un tema de cursor invisible. Este truco es usado por maemo , porque no tiene sentido tener un cursor en un dispositivo de pantalla táctil.
Lamentablemente, la capacidad de cambiar el tema del cursor global en el tiempo de ejecución no es uniforme en todas las aplicaciones y kits de X11. Puede cambiar el recurso del servidor Xcursor.theme
, y nadie lo notará (generalmente solo se consulta al inicio); puede informar a xsettings que solo parece afectar a los programas Gtk +; KDE usa algún 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 seguirlo.