Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions README.es-ES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@


# swcursor

![captura de pantalla de ejemplo de swcursor](screenshot.png)

Este es un cursor de software sencillo para entornos X11; crea una ventana superpuesta con una imagen (grande) que sigue al cursor. Deberás configurar tu cursor normal para que se oculte, o grabar la pantalla usando `kmsgrab` de ffmpeg, que a menudo no captura los cursores de hardware en absoluto.

Esto es principalmente para grabaciones de pantalla donde deseas un cursor muy grande que destaque visualmente al hacer clic. Además, al grabar la pantalla directamente desde el búfer de escaneo KMS usando `kmsgrab` con ffmpeg, los cursores de hardware no aparecerán, por lo que al ejecutar este programa obtendrás un cursor grande y claro.


## Instalación y Uso

Necesitarás tener las bibliotecas de desarrollo funcionales para gtk-3.0, gdk y xlib.

```
$ make
$ ./swcursor

# Puedes mostrar cualquier imagen PNG transparente que desees para el cursor
$ ./swcursor grumpy-cat.png
```


## Implementación

Es sorprendentemente difícil encontrar documentación sobre la interacción entre GTK, GDK y X11, y existen algunos obstáculos; este es un ejemplo razonablemente mínimo de cómo crear una ventana de GTK y luego manipularla con comandos de nivel inferior de GDK y Xlib. Las partes no triviales son:

* hacer que la ventana sea transparente
* eliminar toda decoración, y
* ocultar la ventana al administrador de ventanas;
* usar la extensión de forma de X11 para que la ventana sea atravesable por clics.

El otro truco es integrarse con el ciclo de vida de GTK/GDK. Aquí está el orden que encontré mediante prueba y error guiado:

* `window_init`
+ `gtk_widget_set_app_paintable`
+ `gdk_screen_get_rgba_visual` / `gtk_widget_set_visual`
* `window_realize`
+ `gtk_window_set_decorated` / `gdk_window_set_decorations` etc.
+ `gdk_window_set_override_redirect`
* `window_map`
+ `XShapeCombineRegion(..., ShapeInput, ...)`

Con la perspectiva del tiempo, podría haber sido más fácil usar Xlib directamente. Pero también quería aprender más sobre GTK y GDK cuando comencé este proyecto.


## Grabación de Pantalla con FFMPEG

A continuación se muestra el comando que uso para grabar mi pantalla con `ffmpeg` cuando uso `swcursor`. Debería funcionar en un chipset Intel reciente que ejecute un kernel de Linux actualizado, con VAAPI instalado. Lee más sobre [ffmpeg y VAAPI aquí](https://trac.ffmpeg.org/wiki/Hardware/VAAPI).

```shell
#!/bin/sh

ffmpeg \
-v verbose \
-thread_queue_size 128 \
-f pulse -i default \
-device /dev/dri/card0 \
-crtc_id 0 -plane_id 0 -framerate 30 \
-f kmsgrab -i - \
-af "asetpts=N/SR/TB" \
-vf "hwmap=derive_device=vaapi,scale_vaapi=w=1920:h=1080:format=nv12" \
-c:a aac \
-c:v h264_vaapi -b:v 3200k \
-- out.mp4
```

Esta configuración es excelente porque lee toda la pantalla desde la memoria de video y la comprime directamente en hardware; puedo grabar mi escritorio 4K a 30 fps con muy pocos fotogramas perdidos y un 20% de uso de CPU en un solo núcleo.

Necesitarás establecer la capacidad de administrador en `ffmpeg` (o usar sudo):

```shell
$ sudo setcap cap_sys_admin+ep /usr/bin/ffmpeg
```

Si deseas realizar transmisión en vivo o tienes una tarjeta gráfica NVIDIA, quizás quieras revisar [este gist](https://gist.github.com/Brainiarc7/7b6049aac3145927ae1cfeafc8f682c1) y la [página del wiki de ffmpeg sobre aceleración por hardware](https://trac.ffmpeg.org/wiki/HWAccelIntro).