configura o ToggleShowDesktop no Openbox para agir somente na camada especificada

6

Eu tenho um atalho para ToggleShowDesktop . Quando pressiono Menu , todas as janelas são minimizadas e vejo meu papel de parede (como esperado):

<keybind key="Menu">
  <action name="ToggleShowDesktop"/>
</keybind>

Agora o problema é que não quero ver meu papel de parede. Estou usando terminator como meu papel de parede, ou seja, quando eu inicio terminator , ele é colocado na camada abaixo:

<application name="terminator">
  <focus>yes</focus>
  <layer>below</layer>
  <desktop>1</desktop>
  <position>
    <y>0</y>  
    <x>0</x>
  </position> 
  <skip_taskbar>yes</skip_taskbar>
  <maximized>true</maximized>
</application>

É possível configurar ToggleShowDesktop para que a camada "abaixo" não seja afetada? Ou seja, quero que apenas as janelas normais sejam minimizadas, mas não terminator . Em outras palavras, quero que o terminator se comporte como um papel de parede normal - não seja afetado por ToggleShowDesktop .

Estou usando Debian Wheezy com LXDE .

UPDATE (usando o método sugerido por @Suchipi):

Deixei de fora alguns detalhes da minha pergunta original, e agora esses detalhes parecem ser relevantes, afinal:

Minha configuração tem 2 monitores e 4 desktops virtuais. Então eu tenho "8 wallpapers" para preencher com terminator . Pelo que li anteriormente, presumi que essas 8 janelas teriam que ser distinguíveis, então eu criei 8 symliks para terminator , .i.e.:

/usr/bin/terminator-wallpaper-1a  -> terminator
/usr/bin/terminator-wallpaper-1b  -> terminator
/usr/bin/terminator-wallpaper-2a  -> terminator
...

De fato, criou 8 aplicativos diferentes (com nomes diferentes).

Da mesma forma, em .config/openbox/lxde-rc.xml não tenho 1, mas 8 definições:

<application name="terminator-wallpaper-1a">
  <desktop>1</desktop>
  <position>
    <monitor>1</monitor>
  </position>
  ...
</application>

<application name="terminator-wallpaper-1b">
  <desktop>1</desktop>
  <position> 
    <monitor>2</monitor>
  </position>
  ...
</application>

<application name="terminator-wallpaper-2a">
  <desktop>2</desktop>  
  <position> 
    <monitor>1</monitor>
  </position>
  ...
</application>

E, por último, em /.config/autostart tenho 8% de arquivos*.desktop, para serem iniciados automaticamente após o login:

/.config/autostar/terminator-wallpaper-1a.desktop
/.config/autostar/terminator-wallpaper-1b.desktop
/.config/autostar/terminator-wallpaper-2a.desktop

Isso me parece muito complicado e deselegante, mas não vi nenhuma maneira melhor de fazê-lo.

Agora, quando eu sigo as instruções do @Suchipi, acontece o seguinte:

1) a parte com devilspie funciona OK. Acontece que preciso apenas de uma definição que cubra todas as minhas 8 janelas (substituindo matches por is ):

$ cat .devilspie/terminator.ds 
(if
(matches (application_name) "terminator-wallpaper")
(begin
(wintype "desktop")
)
)

E eu posso ver com obxprop que funciona como esperado.

$ obxprop | egrep '(_OB_APP|_NET_WM_WINDOW_TYPE)'
_OB_APP_TYPE(UTF8_STRING) = "normal"
_OB_APP_TITLE(UTF8_STRING) = "None"
_OB_APP_CLASS(UTF8_STRING) = "Terminator-wallpaper-1"
_OB_APP_NAME(UTF8_STRING) = "terminator-wallpaper-1"
_OB_APP_ROLE(UTF8_STRING) = 
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP

2) agora a parte com xdotool é mais complicada:  Primeiro de tudo, usando 100% para a resolução não funciona, ou seja, a janela desaparece (não vejo isso). Ao usar estática:

xdotool search --class "Terminator-wallpaper-1a" windowunmap --sync windowmap windowsize %1 1920 1056

isso funciona para o monitor desktop 1. Mas quando eu o executo para outros desktops, ele não tem efeito, por exemplo:

xdotool search --class "Terminator-wallpaper-2a" windowunmap --sync windowmap windowsize %1 1920 1056

UPDATE2:

Na verdade, também funciona para outras áreas de trabalho, mas apenas se eu executar o comando xdotool na área de trabalho específica, o que quero afetar. ou seja, eu tenho que mudar para a área de trabalho 2 e executar xdotool search --class "Terminator-wallpaper-2a" e então funciona.

Além disso, fiquei me perguntando se o windowsize %1 desempenha algum papel aqui.

    
por Martin Vegter 25.06.2014 / 16:33

3 respostas

7

O Openbox fornecerá a funcionalidade que você está procurando para o Windows, cuja propriedade _OB_APP_TYPE está definida como "desktop" (você pode usar obxprop para verificar as propriedades de uma janela). Então, precisamos definir o _OB_APP_TYPE da sua janela de terminação como "desktop" para que isso aconteça.

Lendo o código-fonte da caixa aberta, em client.c , vi que _OB_APP_TYPE é herdado de _NET_WM_WINDOW_TYPE . Então eu procurei por um aplicativo que poderia alterar _NET_WM_WINDOW_TYPE . A aplicação que encontrei chama-se devilspie .

Primeiro, instale-o:

sudo apt-get install devilspie

Em seguida, criaremos a pasta para os arquivos de configuração devilspie :

mkdir ~/.devilspie

Agora, adicionaremos um arquivo de configuração que informe devilspie para procurar aplicativos com o nome terminator e defina o tipo de janela deles para desktop . Coloque o seguinte em ~/.devilspie/terminator.ds :

(if
(is (application_name) "terminator")
(begin
(wintype "desktop")
)
)

Agora, se você executar devilspie (ou devilspie -a para afetar as janelas existentes em vez de apenas as recém-criadas), você perceberá se usar obxprop no terminador que _NET_WM_WINDOW_TYPE foi alterado, mas _OB_APP_TYPE ainda não. Vamos usar xdotool para desmapear e remapear a janela (na terminologia do X11, isso significa que pararemos de desenhar e começaremos a desenhar a janela), o que deve forçar o openbox a perceber o valor.

Instale o xdotool:

sudo apt-get install xdotool

Em seguida, executamos o seguinte script para encontrar a janela terminator , desmapear, aguardar até que ela não seja mapeada e, em seguida, remapear. Também redimensionamos a janela porque, quando ela foi desmapeada e remapeada, ela perdeu sua maximização:

xdotool search --class "terminator" windowunmap --sync windowmap windowsize %1 1024 768

Substitua 1024 768 pela sua resolução. Observe também que versões mais recentes de xdotool do que aquelas encontradas no repositório apt do Debian suportam o uso de 100% 100% ao invés de uma resolução estática. Você pode encontrar .deb packages para versões mais recentes de xdotool em página googlecode do xdotool.

A janela do terminador ficará imediatamente não decorada e, se você usar agora obxprop , verá que ambos os valores foram definidos corretamente. Se você pressionar a tecla que você ligou ToggleShowDesktop algumas vezes, a janela do terminador permanecerá sempre ativa.

Para tornar isso persistente, você desejará executar esses comandos no login. A Página do LXDE Wiki para o LXSession mostra várias maneiras diferentes de fazer isso (global, por usuário, por perfil, etc). Supondo que você queira essas configurações apenas para seu usuário e sob o perfil LXDE (o padrão), você vai querer editar ~/.config/lxsession/LXDE/autostart e adicionar os comandos que nós executamos, lembrando que o comando xdotool precisa ser executado após a janela do terminador foi processado, então faça algo como (sleep 1s & xdotool ...) . Você também pode configurar esses comandos como keybinds no openbox, se desejar.

    
por 28.06.2014 / 07:47
2

Eu criei o seguinte script que parece resolver seus problemas.

#!/bin/sh

make_wid_desktop_app() {
    # set the type of the window to 
    xprop -id $1 -f _NET_WM_WINDOW_TYPE 32a -set _NET_WM_WINDOW_TYPE _NET_WM_WINDOW_TYPE_DESKTOP
    xprop -id $1 -f _MOTIF_WM_HINTS 32c -set _MOTIF_WM_HINTS 0
    xprop -id $1 -remove _MOTIF_WM_HINTS
}

get_wids() {
    xdotool search --class $1
}

for id in $(get_wids $1); do
    make_wid_desktop_app $id;
done

Você pode usá-lo assim.

desktop_terminal terminator-wallpaper

Ele procura todas as janelas que têm a classe terminator-wallpaper com xdotools e alteram o _NET_WM_WINDOW_TYPE para _NET_WM_WINDOW_TYPE_DESKTOP com xprop .

Como o Openbox não verifica se esse tipo foi alterado após a criação de uma janela, precisamos fazer com que o Openbox faça isso. Isso é feito definindo o _MOTIF_WM_HINTS e removendo-os.

A mesma coisa pode ser obtida com devilspie quando você adiciona

(if
   (matches (application_name) "terminator-wallpaper")
   (begin
       (wintype "desktop")
       (undecorate)
   )
)

desde que definir a janela como (undecorate) também está usando o truque _MOTIF_WM_HINTS .

    
por 30.06.2014 / 14:07
0

Se eu obtiver a pergunta corretamente, sua pergunta será a seguinte: sempre que você clicar em ToggleShowDesktop , desejará que todo o aplicativo aberto seja minimizado, exceto terminator .

Se for assim, então você pode conseguir isso escrevendo um script wrapper, que internamente chamará dois comandos

#!/bin/sh
xdotool key "super+d" 
wmctrl -a "terminator"

Substitua o binário / script ToggleShowDesktop real pelo script wrapper mencionado acima

Pode parecer sujo, mas funciona.

    
por 04.07.2014 / 11:11

Tags