1 pontos por GN⁺ 2024-10-15 | 1 comentários | Compartilhar no WhatsApp
  • O clipscreen é um aplicativo X11 simples que cria um monitor virtual espelhando uma área específica da tela e marca essa área com um retângulo verde
  • Em ferramentas de compartilhamento de tela como Google Meet, Microsoft Teams e Jitsi Meet, é possível compartilhar o monitor virtual em vez da tela inteira ou de uma janela individual
  • Como basta mover a janela que você quer compartilhar para dentro da borda verde, diminui a necessidade de compartilhar várias janelas separadamente ou alternar o alvo de compartilhamento
  • A execução segue o formato ./clipscreen <width>x<height>+<x>+<y>; usando junto com hacksaw ou slop, também é possível fazer seleção interativa de área
  • Foi testado apenas em Linux e xorg, e não há garantia de que funcione em outros sistemas

O que o clipscreen faz

  • clipscreen é um aplicativo que cria um monitor virtual que replica uma parte da tela
  • A área especificada da tela é destacada com um retângulo verde
  • O usuário pode compartilhar esse monitor virtual em ferramentas comuns de compartilhamento de tela para videoconferências
    • Ex.: Google Meet
    • Microsoft Teams
    • Jitsi Meet

Como funciona o compartilhamento de tela

  • Em vez de compartilhar a tela inteira ou janelas individuais separadamente, compartilha-se o monitor virtual criado pelo clipscreen
  • A janela a ser compartilhada deve ser movida para dentro da borda verde
  • É uma forma de evitar ficar alternando a janela compartilhada ao lidar com várias janelas

Requisitos de build

  • O sistema precisa dos seguintes itens
    • Bibliotecas de desenvolvimento X11

      • Biblioteca gráfica Cairo
      • Compilador C, por exemplo gcc
      • No Ubuntu 24.04, as bibliotecas necessárias podem ser instaladas com o comando abaixo
apt-get install libx11-dev xserver-xorg-dev xorg-dev libcairo2-dev gcc
- O build é executado com o comando abaixo
make
- O aplicativo foi testado apenas em **Linux e xorg**, e não está claro se funcionará em outros sistemas

Uso

  • O executável compilado é executado no formato abaixo
./clipscreen <width>x<height>+<x>+<y>
  • Os argumentos especificam a posição e o tamanho do overlay e do monitor virtual
    • <width>: largura do overlay e do monitor virtual
    • <height>: altura do overlay e do monitor virtual
    • <x>: coordenada x do canto superior esquerdo do overlay e do monitor virtual
    • <y>: coordenada y do canto superior esquerdo do overlay e do monitor virtual
  • O exemplo é o seguinte
./clipscreen 800x600+100+100
  • Esse comando cria uma janela de overlay 800x600 começando na posição (100, 100) da tela

Seleção interativa de área e encerramento

  • Para selecionar uma área de forma interativa, é possível executar junto com hacksaw ou slop
./clipscreen $(hacksaw)
./clipscreen $(slop)
  • Ferramentas relacionadas
  • Para encerrar, pressione Ctrl+C no terminal em que o aplicativo está em execução

1 comentários

 
GN⁺ 2024-10-15
Comentários no Hacker News
  • O compartilhamento de tela do Google Meet era inconveniente em um monitor ultrawide de 49 polegadas. Isso porque só dava para compartilhar uma janela ou a tela inteira, mas não uma região parcial da tela
    Então criei uma pequena ferramenta que usa a extensão xrandr para espelhar uma região específica como um monitor virtual, e permite compartilhar esse monitor virtual
    Mais detalhes estão no post do blog: https://www.splitbrain.org/blog/2024-10/11-introducing_clips...
    • Parece realmente útil quando se pode usar uma tela grande. Uma tela de 27 polegadas não tem tanto espaço de trabalho quanto uma de 49, então uso um script que abre uma janela Xephyr separada no DISPLAY 9 e coloca várias janelas nessa tela
      Uso assim como ambiente de demonstração: https://gist.github.com/radupotop/d77a47767e2e65a7e7d40d1ea8...
  • Gosto de como isto é simples. Tirando os comentários, são pouco mais de 100 linhas de C++, e é por coisas assim que acabo preferindo X11 a Wayland
    • O código é meio estranho. Não há loop de eventos da XLib, e ele chama sleep(100) dentro de um loop até receber SIGINT
      Por causa disso, pode gerar uso alto de CPU sem muito motivo
    • No Wayland, ao iniciar a captura pela API xdg-desktop-portal, ela mostra uma notificação ao usuário e permite escolher a região a capturar
    • Criar um display Xrandr virtual sobreposto a um display físico existente é quase um número de exibicionismo elegante do X.org que poucos outros sistemas de janelas conseguem fazer facilmente
      Se ele encerrar de uma forma que não seja por SIGINT, a saída virtual pode ficar sobrando e a janela de overlay pode desaparecer, o que é um pouco esquisito, mas não é um grande problema. Ainda assim, é melhor não tratar demais o número de linhas de código como medida de qualidade ou elegância
      Esse método não é possível do mesmo jeito no Wayland. Em compensação, no Wayland talvez esta ferramenta nem seja necessária. O modo padrão para um processo sem privilégios capturar a tela é o portal de desktop, e pelo menos o KDE oferece várias opções de captura, incluindo captura de um retângulo da tela. Mesmo executando apps X.org, parece que deve funcionar graças ao XWaylandVideoBridge
      Não me agrada muito o fato de D-Bus ser usado por toda parte, mas é bom que, ao trocar a implementação de org.freedesktop.impl.portal.ScreenCast, dê para substituir praticamente o comportamento desejado de captura de tela. Acho melhor do que cada app implementar do seu próprio jeito a seleção do alvo de captura
    • O código é muito pequeno porque quase não há tratamento de erros nem verificações de sanidade
      Isso não quer dizer que o X11 não seja legal e bom para hacks, mas, se você não quiser presumir apenas o uso perfeito, o código fica maior e mais complexo, e com isso mais robusto
      Por exemplo, basta executar ./clipscreen 1 2 3 4
    • Não estou tentando negar décadas de discussões sobre seus muitos defeitos, mas é surpreendente que o X11 hoje pareça ser o ambiente gráfico de desktop mais simples e fácil de hackear entre os utilizáveis
      Se você quiser aprontar alguma coisa, dá para fazer na hora. O ICCCM foi muito criticado no começo dos anos 90, mas do outro lado não existe algo equivalente, e ainda hoje continuam surgindo novas tentativas na área de gerenciadores de janelas
  • Lembro que no Zoom dava para compartilhar várias coisas, não só uma tela ou uma janela. Bastava segurar a tecla SHFT ao clicar nas janelas que queria compartilhar
    • Como alguém descobre uma funcionalidade dessas?
  • Isso dá para fazer literalmente só com xrandr
    xrandr --setmonitor screenshare 2560/1x1440/1+0+0 none
    • Para tornar a seleção interativa, dá para fazer assim
      geo=$(slop -f '%w/1x%h/1+%x+%y') && xrandr --setmonitor screenshare "$geo" none
    • Para ser justo, esta ferramenta basicamente faz isso e o overlay em C++
      Ainda assim, é uma bela linha de comando
  • Não daria para fazer isso com OBS em qualquer plataforma, incluindo Wayland? Lendo vários comentários, fico com a impressão de que muita gente não conhece o OBS, ou então eu estou superestimando os recursos dele
    • Provavelmente dá. Nunca usei OBS, mas imagino que ele seja um pouco maior que um binário de 20 KB
    • Dá, mas exige um pouco mais de trabalho. É preciso passar por várias etapas na GUI, e, se tiver que ajustar tudo antes de cada reunião, fica bem chato
    • O OBS permite compartilhar uma janela ou apenas a área cliente de um app
  • Em um monitor de 49 polegadas, combino OBS, um script que segue o mouse e a janela de pré-visualização do OBS na tela do notebook, e compartilho a tela inteira do notebook
    Assim dá para saber se a janela tem um tamanho adequado para outra pessoa ver no notebook, e a prévia segue o mouse enquanto permite ajustar na hora o nível de zoom e os limites do mouse
    Gosto do fato de que a janela de pré-visualização do OBS abre sem a janela principal do OBS ao iniciar; depois disso, não preciso ver nem mexer na janela principal do OBS ou no app, então ela parece quase independente
    https://github.com/BlankSourceCode/obs-zoom-to-mouse
  • No KDE 6.1, Wayland e Chromium, ao clicar no botão de compartilhamento de serviços como o Jitsi, primeiro aparece a opção de compartilhar a Entire Screen e, em seguida, surge uma caixa de diálogo com Full Workspace, New Virtual Output, Rectangular Region e a lista de displays
    Rectangular Region permite compartilhar uma parte selecionada da tela, e New Virtual Output cria imediatamente uma tela virtual que aparece na KDE Display Configuration. Essa tela virtual pode ou não ser posicionada sobreposta a um display físico existente
  • Realmente excelente. No Linux, exatamente por causa desse caso de uso, nossa empresa escolheu o Zoom em vez do Meet
    • Depois de compilar eu mesmo, tirei uma captura de tela inteira com o GIMP para descobrir a largura, altura e coordenadas x/y desejadas, e testei no Google Meet. Funcionou perfeitamente
  • Também dá para fazer isso com xzoom, e ainda ampliar mais de 1x; há alguma vantagem que eu esteja deixando passar?
  • Fico me perguntando por que essa necessidade ainda não foi atendida nas plataformas atuais de videoconferência. Monitores gigantes estão cada vez mais comuns, especialmente entre os desenvolvedores que criariam ferramentas como esta
    • Talvez seja porque a alternativa via OBS não seja tão difícil