1 puntos por GN⁺ 2024-10-15 | 1 comentarios | Compartir por WhatsApp
  • clipscreen es una aplicación X11 sencilla que crea un monitor virtual que refleja una zona específica de la pantalla y marca esa zona con un rectángulo verde
  • En herramientas para compartir pantalla como Google Meet, Microsoft Teams y Jitsi Meet, permite compartir el monitor virtual en lugar de toda la pantalla o ventanas individuales
  • Basta con mover la ventana que quieres compartir dentro del borde verde, lo que reduce la necesidad de compartir varias ventanas por separado o cambiar el objetivo de uso compartido
  • Se ejecuta con el formato ./clipscreen <width>x<height>+<x>+<y>, y si se usa junto con hacksaw o slop, también permite la selección interactiva de área
  • Solo se probó en Linux y xorg, y no se garantiza que funcione en otros sistemas

Qué hace clipscreen

  • clipscreen es una aplicación que crea un monitor virtual que duplica una parte de la pantalla
  • El área de pantalla especificada se resalta con un rectángulo verde
  • El usuario puede compartir este monitor virtual en herramientas comunes de videoconferencia para compartir pantalla
    • Por ejemplo: Google Meet
    • Microsoft Teams
    • Jitsi Meet

Forma de compartir pantalla

  • En lugar de compartir toda la pantalla o ventanas individuales por separado, se comparte el monitor virtual creado por clipscreen
  • La ventana que se quiere compartir se mueve dentro del borde verde
  • Es una forma de evitar tener que cambiar constantemente la ventana compartida al manejar varias ventanas

Requisitos de compilación

  • El sistema necesita lo siguiente
    • Bibliotecas de desarrollo de X11

      • Biblioteca gráfica Cairo
      • Compilador de C, por ejemplo gcc
      • En Ubuntu 24.04 se pueden instalar las bibliotecas necesarias con el siguiente comando
apt-get install libx11-dev xserver-xorg-dev xorg-dev libcairo2-dev gcc
- La compilación se ejecuta con el siguiente comando
make
- La aplicación solo se probó en **Linux y xorg**, y no está claro si funcionará en otros sistemas

Uso

  • El ejecutable compilado se ejecuta con el siguiente formato
./clipscreen <width>x<height>+<x>+<y>
  • Los argumentos especifican la posición y el tamaño de la superposición y del monitor virtual
    • <width>: ancho de la superposición y del monitor virtual
    • <height>: alto de la superposición y del monitor virtual
    • <x>: coordenada x de la esquina superior izquierda de la superposición y del monitor virtual
    • <y>: coordenada y de la esquina superior izquierda de la superposición y del monitor virtual
  • Un ejemplo es el siguiente
./clipscreen 800x600+100+100
  • Este comando crea una ventana de superposición de 800x600 que empieza en la posición (100, 100) de la pantalla

Selección interactiva de área y cierre

  • Para seleccionar el área de forma interactiva, se puede ejecutar junto con hacksaw o slop
./clipscreen $(hacksaw)
./clipscreen $(slop)
  • Herramientas relacionadas
  • Para salir, presiona Ctrl+C en la terminal donde se está ejecutando la aplicación

1 comentarios

 
GN⁺ 2024-10-15
Opiniones de Hacker News
  • Compartir pantalla en Google Meet era incómodo en un monitor ultrawide de 49 pulgadas, porque solo se puede compartir una ventana o la pantalla completa, pero no una zona parcial de la pantalla.
    Así que creé una pequeña herramienta que usa la extensión xrandr para reflejar una zona específica como monitor virtual, y luego permite compartir ese monitor virtual.
    Hay más detalles en la publicación del blog: https://www.splitbrain.org/blog/2024-10/11-introducing_clips...
    • Se ve realmente útil cuando puedes usar una pantalla grande. Una pantalla de 27 pulgadas no tiene tanto espacio de trabajo como una de 49, así que uso un script que abre una ventana de Xephyr separada en DISPLAY 9 y pone varias ventanas en esa pantalla.
      Lo uso así como entorno de demo: https://gist.github.com/radupotop/d77a47767e2e65a7e7d40d1ea8...
  • Me gusta lo simple que es. Sin contar los comentarios, son apenas unas 100 líneas de C++, y por cosas así termino prefiriendo X11 sobre Wayland.
    • El código es un poco raro. No hay bucle de eventos de XLib, y llama a sleep(100) dentro de un bucle hasta recibir SIGINT.
      Por eso podría aumentar el uso de CPU sin una razón particular.
    • En Wayland, si inicias una captura con la API xdg-desktop-portal, se le muestra una notificación al usuario y se le permite elegir el área a capturar.
    • Crear una pantalla virtual de Xrandr que se superponga con una pantalla física existente es casi un elegante truco característico de X.org, algo que en otros sistemas de ventanas difícilmente se puede hacer con facilidad.
      Si se cierra de una forma que no sea SIGINT, puede quedar la salida virtual y desaparecer la ventana superpuesta, lo cual es un poco incómodo, pero no es un gran problema. Aun así, conviene no tomar demasiado la cantidad de líneas de código como medida de calidad o elegancia.
      Este enfoque no es posible tal cual en Wayland. En cambio, en Wayland quizá esta herramienta ni siquiera sea necesaria. La forma estándar de que un proceso sin permisos capture la pantalla es el portal de escritorio, y al menos KDE admite varias opciones de captura, incluida la captura de un rectángulo de la pantalla. Parece que también funcionaría aunque estés ejecutando una app de X.org, gracias a XWaylandVideoBridge.
      No me entusiasma mucho que D-Bus se use por todos lados, pero me gusta que, cambiando la implementación de org.freedesktop.impl.portal.ScreenCast, se pueda reemplazar casi cualquier comportamiento de captura de pantalla que uno quiera. Me parece una dirección mejor que hacer que cada app implemente por su cuenta la selección del objetivo de captura.
    • Hay muy poco código porque casi no hay manejo de errores ni validaciones de cordura.
      Eso no quiere decir que X11 no sea genial y fácil de hackear, pero si no quieres asumir solo el uso perfecto, el código se vuelve más grande y complejo, y por lo mismo más robusto.
      Por ejemplo, prueba ejecutar ./clipscreen 1 2 3 4.
    • No intento negar décadas de discusiones sobre sus muchos defectos, pero me sorprende hasta qué punto X11 ahora parece el entorno gráfico de escritorio más simple y hackeable entre los que se pueden usar.
      Si quieres hacer alguna travesura, puedes hacerlo de inmediato. ICCCM recibió muchísimas críticas a principios de los 90, pero del otro lado no hay un equivalente, y todavía siguen apareciendo nuevos experimentos en el área de gestores de ventanas.
  • Recuerdo que en Zoom se podían compartir varias cosas, no solo una pantalla o una ventana. Había que mantener presionada la tecla SHFT al hacer clic en las ventanas que querías compartir.
    • ¿Cómo demonios descubre uno una función así?
  • Esto se puede hacer literalmente solo con xrandr.
    xrandr --setmonitor screenshare 2560/1x1440/1+0+0 none
    • Si quieres que la selección sea interactiva, puedes hacer esto:
      geo=$(slop -f '%w/1x%h/1+%x+%y') && xrandr --setmonitor screenshare "$geo" none
    • Para ser justos, esta herramienta al final hace eso mismo y el overlay en C++.
      Igual es un comando de una línea muy bueno.
  • ¿No se puede hacer esto con OBS en cualquier plataforma, incluido Wayland? Leyendo varios comentarios, me da la impresión de que mucha gente no conoce OBS, o quizá yo estoy sobreestimando sus capacidades.
    • Probablemente se pueda. Nunca he usado OBS, pero seguramente es algo más grande que un binario de 20 KB.
    • Se puede, pero requiere un poco más de trabajo. Hay que pasar por varios pasos en la GUI, y si tienes que ajustarlo cada vez antes de una reunión, se vuelve bastante molesto.
    • OBS permite compartir una sola ventana o el área cliente de una app.
  • En un monitor de 49 pulgadas combino OBS, un script para seguir el mouse y una ventana de vista previa de OBS en la pantalla de la laptop, y comparto toda la pantalla de la laptop.
    Así puedo saber si el tamaño de la ventana es adecuado para que otros la vean en una laptop, y la vista previa sigue al mouse mientras puedo ajustar sobre la marcha el nivel de zoom y los límites del mouse.
    Me gusta que la ventana de vista previa de OBS se abra al ejecutarse sin la ventana principal de OBS, así que después no necesito ver ni manipular la ventana principal de OBS ni la app, y se siente como algo independiente.
    https://github.com/BlankSourceCode/obs-zoom-to-mouse
  • En KDE 6.1, Wayland y Chromium, cuando presionas el botón de compartir en un servicio como Jitsi, primero aparece la opción para compartir Entire Screen, y luego se abre un diálogo con Full Workspace, New Virtual Output, Rectangular Region y una lista de pantallas.
    Rectangular Region permite compartir una parte seleccionada de la pantalla, y New Virtual Output crea al instante una pantalla virtual visible en KDE Display Configuration. Esa pantalla virtual puede quedar superpuesta sobre una pantalla física existente, o no.
  • Realmente excelente. En Linux, justamente por este caso de uso, en nuestra empresa elegimos Zoom en vez de Meet.
    • Lo compilé yo mismo, luego tomé una captura de pantalla completa con GIMP para averiguar el ancho, alto y las coordenadas x/y deseadas, y lo probé en Google Meet. Funciona perfecto.
  • Con xzoom también se puede hacer esto, e incluso ampliar más de 1x. ¿Hay alguna ventaja que se me esté escapando?
  • Me pregunto por qué las plataformas actuales de videoconferencia todavía no cubren esta necesidad. Los monitores enormes son cada vez más comunes, especialmente entre los desarrolladores que crearían herramientas como esta.
    • Tal vez sea porque la solución alternativa con OBS no es tan difícil.