Tirar screenshots de todos os desktops / espaços de trabalho virtuais (ou específicos) (ou: janelas além / maiores que a área de trabalho atual)?

3

Muitas vezes preciso tirar screenshots de janelas maiores do que a área de trabalho mostrada atualmente. Estou no Ubuntu 11.04, gnome-about diz a versão: 2.32.1; compiz --version diz Compiz 0.9.4.0 - e eu tenho quatro desktops virtuais / espaços de trabalho, que são organizados como tal:


As imagens acima foram obtidas movendo-se em cada espaço de trabalho separado e tirando uma captura de tela através da tecla PrintScreen - ou seja, gnome-screenshot . (Estou ciente de que existem maneiras melhores de obter firefox tiros, como o addon "Page Saver" - o exemplo acima é tomado simplesmente como um exemplo de uma janela genérica de tamanho grande).

EDIT: Eu estou aparentemente usando a nomenclatura errada aqui ( encontrado via xorg - Obtém o Virtual Desktop atual - número / nome / tag / id? - Unix e Linux ) - no exemplo acima, eu ainda <<> / em> tem apenas um espaço de trabalho; o que é alterado, em vez disso, é a viewport - é isso que o wmctrl -d mostra em cada um dos "desktops virtuais":

$ wmctrl -d
0  * DG: 2048x1200  VP: 0,0  WA: 0,1 1024x598  Workspace 1
$ wmctrl -d
0  * DG: 2048x1200  VP: 0,600  WA: 0,1 1024x598  Workspace 1
$ wmctrl -d
0  * DG: 2048x1200  VP: 1024,0  WA: 0,1 1024x598  Workspace 1
$ wmctrl -d
0  * DG: 2048x1200  VP: 1024,600  WA: 0,1 1024x598  Workspace 1

Então, para alternar entre "áreas de trabalho virtuais" da linha de comando, eu deveria, de fato, alterar o "viewport", como em: wmctrl -o 1024,0

Obviamente, mover para cada desktop virtual, fazer uma captura de tela e juntá-las - e finalmente cortar a janela do aplicativo - é um pouco entediante, então eu estava vagando se houvesse uma ferramenta (preferencialmente linha de comando) que me permitisse escolha uma janela maior que a atual e faça uma captura de tela de todo o seu conteúdo, de uma só vez. Pode haver dois cenários aqui também:

  • Uma janela maior do que a área de trabalho é movida para ocupar espaço em vários desktops virtuais ( como as imagens acima mostram )
  • Uma janela maior do que a área de trabalho é movida fora do tamanho total de todos os desktops virtuais ( da perspectiva da área de trabalho superior esquerda na composição acima, imagine mover a janela do aplicativo para o canto superior esquerdo e o lado de fora da área de trabalho - ao contrário de ser movido no canto inferior direito como mostrado acima )

O primeiro caso é possível, se não de qualquer outra forma, então manualmente (como eu fiz acima) - e para o segundo caso, eu acho que deveria ser possível para uma aplicação "mover" a janela brevemente para a área total de todos os desktops - ou crie um contexto gráfico "virtual" não mostrado na tela, e renderize a janela lá (embora eu não saiba detalhes suficientes para saber com certeza).

Já experimentei as seguintes ferramentas:

  • gnome-screenshot
  • xwd
  • scrot
  • import (ImageMagick)

e todos eles irão capturar apenas um "canto" de toda a janela do aplicativo, que é mostrado na área de trabalho atual (em uma situação como mostrado acima). Ao tentar capturar "root" ou "tela inteira", todos eles capturam apenas a área de trabalho atualmente renderizada (não a área total de todas as áreas de trabalho virtuais).

Eu também tentei shutter (0.87.2 Rev.1071), e enquanto eu encontrei informações que a partir da versão 0.86.4, "você pode capturar todos os desktops virtuais agora. O obturador vai passar por todos eles, tire uma foto de cada uma delas e as componha em uma grande tela "- Eu tentei clicar em" Capture all Workspaces "- mas ela só tira uma foto da área de trabalho / área de trabalho atual; capturas de janela são cortadas da mesma forma nos limites da área de trabalho atual (ou falha com " Erro ao capturar a captura de tela: Talvez o ponteiro do mouse não possa ser capturado ou a área selecionada seja inválida. " se a janela estiver totalmente um desktop virtual diferente do atual).

Então eu li que há um plugin de captura de tela para compiz - e como aqui compiz gerencia os desktops virtuais, pensei que poderia lidar com a área total - mas não há configurações lá (no gerenciador de configurações do CompizConfig) mas: "Ativar plugin", um diretório de saída e um botão para ativar e definir teclas de atalho para "Iniciar captura de retângulo" - e como aparentemente só você pode arrastar com o mouse para especificar uma área retangular, duvido que o plugin ajudaria a capturar a área total de uma só vez.

Assim, gostaria de pedir algumas sugestões sobre ferramentas, que podem:

  • Capture a área total (todos os espaços de trabalho / desktops virtuais) de uma só vez; ou
  • Capture a área total da janela selecionada, mesmo que ela seja empurrada para fora da área de trabalho atualmente renderizada (também de uma só vez)

Eu preferiria algo que lida com essas coisas na memória - eu mesmo poderia inventar algo pior: como um script bash que envia pressionamentos de tecla para alterar áreas de trabalho ( ou apenas por meio de wmctrl ), e leva screenshots individuais lá - mas isso seria uma dor de usar, especialmente desde que eu estaria visualmente exposto ao "desktop switching", enquanto a captura de tela está sendo capturado ... Se não houver nenhum programa completo, sugestões para As APIs do C / Perl / Python que podem acessar dados de bitmap em todos / quaisquer desktops virtuais também seriam ótimas.

    
por sdaau 04.11.2012 / 13:38

2 respostas

3

Ok, achei isso para o X Window:

FVWM Fóruns • View topic - Miniatura de uma janela em outra janela de visualização

  

Por que você não pode acessar uma janela (isto é, tirar uma foto dela quando não está na mesma mesa / página que a viewport atual) é porque as janelas que não estão na página atual não estão mapeadas. Isso é verdade quando alguém altera páginas / mesas - as janelas não são mapeadas e as janelas na viewport atual são remapeadas.

Então, eu acho que isso significa que o que eu quero é impossível? Embora haja duas soluções alternativas:

  • use xrandr para aumentar o tamanho virtual de (cada uma das quatro) viewports

Isso é o que funciona para mim - primeira consulta para ver qual saída você deseja e, em seguida, executar:

$ xrandr -q
Screen 0: minimum 320 x 200, current 1024 x 600, maximum 4096 x 4096
LVDS1 connected 1024x600+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1024x600       60.0*+
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)

$ xrandr --output LVDS1 --panning 1600x768

... veja também X / Config / Resolution - Wiki do Ubuntu

  • Use xvfb para renderização virtual

Entendi por x11 - Renderização remota fora da tela - Falha do servidor , veja também Xvfb - Wikipedia, a enciclopédia livre para exemplos. Isto é o que funcionou para mim - cada comando vai no próprio terminal (como alguns deles são destinados a ser serviços)

# start xvfb as display 1 - note the "screen 0" there refers to "its own" screen 0; should set it to 24-bit color

Xvfb :1 -screen 0 1600x1200x24 -pixdepths 3 -fp /usr/share/fonts/X11/Type1

# start metacity on display 1 (would start gdm, but [Bug #598848: gdm no longer works with xvfb](https://bugs.launchpad.net/bugs/598848)
# needed to we have title bars, and possibility to move windows around 

DISPLAY=:1 metacity

# start application (here web-browser arora) again on display 1

DISPLAY=:1 arora

# start vnc server, which will bridge display 1 to port 5900
# note - this command exists, however starts a server in background 

x11vnc -display :1 -bg -nopw -listen localhost -xkb

# start vnc viewer on port 5900 - so we can see display 1:
# note also - when vncviewer exits, it also will kill the x11vnc server

vncviewer -FullColor=1 localhost:5900

O problema aqui é que nem todas as partes do sistema operacional são inicializadas - portanto, não há decoração de janelas e apenas fontes X básicas; embora, os aplicativos possam encontrar suas próprias fontes, como visto abaixo:

xvfb parece quase ideal para mim - desde que eu poderia basicamente configurar um ambiente "invisível", tão grande quanto eu quero, e tirar screenshots diretamente dele (usando xwd ). O problema é que eu não posso ter uma janela no "meu" DISPLAY =: 0, em seguida, mude para o "virtual" DISPLAY =: 1 para captura de tela, em seguida, traga de volta para DISPLAY =: 0. Em seguida, é preciso configurar um aplicativo especificamente para xvfb ; e se isso acontecer você precisa de mais tamanho - então toda a cadeia acima precisa ser reiniciada.

Por outro lado, acho que trabalhar com 4 espaços de trabalho e grandes viewports (onde o mouse o movimenta dentro de uma porta de visualização) é um pouco confuso - então, novamente, pode alterar o tamanho e nada precisa ser reiniciado; e mais eu posso usar qualquer uma das ferramentas de captura de tela usuais (mas eu ainda tenho que mudar de viewports).

Escusado será dizer que ainda adoraria ouvir sobre uma possível solução de linha de comando que poderia fazer esse tipo de captura de tela de uma só vez :)

    
por sdaau 04.11.2012 / 16:11
2

Na minha estação de trabalho do FreeBSD eu criei um script bash para fazer as capturas de múltiplos espaços de trabalho virtuais e então executar os resultados através da 'montagem' do ImageMagic para costurá-los. Aqui está o script bash:

#!/usr/local/bin/bash
dnum=$(xdotool get_num_desktops)
desk=0
while [[ "$desk" -lt "$dnum" ]];
     do
          xdotool set_desktop $desk;
          sleep 2;
          maim --format png /dev/stdout > ~/capture/desktop$desk.png;
          desk=$((desk+1));
     done

Aqui está o comando que eu executo no diretório ~ / capture / para juntá-los:

montage  desktop*.png  -tile 10x1 -geometry 1920x2160+1+1 workspaces.png

Obviamente, uma pessoa mudaria a estrutura e a geometria para o próprio sistema. ;)

É necessário ter instalado o bash, o maim (ou equivalente), o xdotool e o ImageMagick para esta solução. HTH

    
por Gene 30.08.2017 / 22:34