%3A.png)
Eu tenho um atalho de teclado para ToggleShowDesktop
. Quando pressiono Menu, todas as janelas são minimizadas e vejo meu papel de parede da área de trabalho (conforme esperado):
<keybind key="Menu">
<action name="ToggleShowDesktop"/>
</keybind>
Agora o problema é que não quero ver meu papel de parede. Estou usando terminator
como papel de parede, ou seja, quando 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 terminador se comporte como um papel de parede normal - não seja afetado por ToggleShowDesktop
.
Estou usando Debian Wheezy
com LXDE
.
(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 possui 2 monitores e 4 desktops virtuais. Portanto, tenho "8 papéis de parede" para preencher terminator
. Pelo que li anteriormente, presumi que essas 8 janelas terão que ser distinguíveis, então criei 8 símbolos para terminator
, .ie:
/usr/bin/terminator-wallpaper-1a -> terminator
/usr/bin/terminator-wallpaper-1b -> terminator
/usr/bin/terminator-wallpaper-2a -> terminator
...
Com efeito foram criados 8 aplicativos diferentes (com nomes diferentes).
Da mesma forma, .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, /.config/autostart
tenho 8 *.desktop
arquivos, 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 maneira melhor de fazer isso.
Agora, quando sigo as instruções do @Suchipi, acontece o seguinte:
1) a parte com devilspie
funciona bem. Acontece que preciso apenas de uma definição que cubra todas as minhas 8 janelas (substituindo matches
) is
:
$ cat .devilspie/terminator.ds
(if
(matches (application_name) "terminator-wallpaper")
(begin
(wintype "desktop")
)
)
E posso ver obxprop
que funciona conforme o 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: antes de mais nada, usar 100%
para a resolução não funciona, ou seja, a janela desaparece (não vejo). Ao usar estática:
xdotool search --class "Terminator-wallpaper-1a" windowunmap --sync windowmap windowsize %1 1920 1056
isso funciona para o monitor 1 da área de trabalho 1. Mas quando executo para outros desktops, não tem efeito, ou seja:
xdotool search --class "Terminator-wallpaper-2a" windowunmap --sync windowmap windowsize %1 1920 1056
Na verdade, funciona também para outras áreas de trabalho, mas apenas se eu executar o xdotool
comando na área de trabalho específica que desejo afetar. ou seja, tenho que mudar para a área de trabalho 2
e executar xdotool search --class "Terminator-wallpaper-2a"
e então funciona.
Além disso, eu queria saber se windowsize %1
desempenha algum papel aqui.
ATUALIZAÇÃO 07/12/2019:
então, agora estou tentando configurar o mesmo sistema no Debian Buster (Openbox 3.6) e estou enfrentando um novo problema. Suspeito que alguma propriedade tenha mudado na nova versão do openbox.
Tudo parece como antes, ou seja:
terminator-wallpaper-1a --profile wallpaper -b &
terminator-wallpaper-1b --profile wallpaper -b &
xdotool search --class 'Terminator-wallpaper-1a' windowunmap --sync windowmap windowsize %1 1920 1180
xdotool search --class 'Terminator-wallpaper-1b' windowunmap --sync windowmap windowsize %1 1920 1180
Recebo dois terminais como papel de parede. Mas o problema é que apenas um desses terminais é realmente utilizável. O outro está "desfocado" e mesmo quando clico nele com o mouse, não consigo focalizá-lo. Ou seja, consigo ver o terminal, mas não consigo digitar nele.
Este problema não existia antes, na versão mais antiga do Openbox
Como posso resolver este problema ?
Responder1
O Openbox dará a funcionalidade que você procura às janelas cuja _OB_APP_TYPE
propriedade esteja definida como "desktop" (você pode usar obxprop
para verificar as propriedades de uma janela). Portanto, precisamos definir a _OB_APP_TYPE
janela do seu terminador como "desktop" para que isso aconteça.
Lendo o código-fonte do openbox, client.c
pude ver que _OB_APP_TYPE
é herdado de _NET_WM_WINDOW_TYPE
. Então procurei um aplicativo que pudesse mudar o _NET_WM_WINDOW_TYPE
. O aplicativo que encontrei se chama devilspie
.
Primeiro, instale-o:
sudo apt-get install devilspie
A seguir, criaremos a pasta para devilspie
os arquivos de configuração:
mkdir ~/.devilspie
Agora adicionaremos um arquivo de configuração que informa devilspie
para procurar aplicativos nomeados terminator
e definir o tipo de janela deles como desktop
. Coloque o seguinte em ~/.devilspie/terminator.ds
:
(if
(is (application_name) "terminator")
(begin
(wintype "desktop")
)
)
Agora, se você executar devilspie
(ou devilspie -a
afetar as janelas existentes em vez das recém-criadas), notará se usar obxprop
um terminador que _NET_WM_WINDOW_TYPE
mudou, mas _OB_APP_TYPE
ainda não. Vamos usar xdotool
para desmapear e remapear a janela (na terminologia X11 isso significa que vamos parar de desenhar e começar 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 script a seguir para encontrar a terminator
janela, desmapeá-la, esperar até que ela seja desmapeada e, em seguida, remapeá-la. 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 xdotool
daquelas encontradas no repositório apt do Debian suportam o uso 100% 100%
de uma resolução estática. Você pode encontrar .deb
pacotes para versões mais recentes xdotool
emPágina googlecode do xdotool.
A janela do terminador ficará imediatamente sem decoração e, se você usar agora obxprop
, verá que ambos os valores foram definidos corretamente. Se você pressionar a tecla vinculada ToggleShowDesktop
algumas vezes, a janela do terminador sempre permanecerá ativa.
Para tornar isso persistente, você desejará executar esses comandos no login. OPágina Wiki do LXDE para LXSessionmostra várias maneiras diferentes de fazer isso (global, por usuário, por perfil, etc.). Supondo que você queira essas configurações apenas para o seu usuário e no perfil LXDE (o padrão), você desejará editar ~/.config/lxsession/LXDE/autostart
e adicionar os comandos que executamos, tendo em mente que o comando xdotool precisa ser executado após a renderização da janela do terminador, então faça algo como (sleep 1s & xdotool ...)
. Você também pode configurar esses comandos como atalhos de teclado no openbox, se desejar.
Responder2
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 possuem a classe terminator-wallpaper
with xdotools
e muda _NET_WM_WINDOW_TYPE
para _NET_WM_WINDOW_TYPE_DESKTOP
with xprop
.
Como o Openbox não verifica se esse tipo foi alterado após a criação de uma janela, precisamos enganar o Openbox para fazer isso. Isso é feito configurando _MOTIF_WM_HINTS
e removendo-os.
A mesma coisa pode ser alcançada devilspie
quando você adiciona
(if
(matches (application_name) "terminator-wallpaper")
(begin
(wintype "desktop")
(undecorate)
)
)
já que definir a janela (undecorate)
também está usando o _MOTIF_WM_HINTS
truque.
Responder3
Se eu entendi a pergunta corretamente, então sua pergunta é assim: sempre que você clicar em ToggleShowDesktop
, você deseja que todos os aplicativos abertos sejam minimizados, exceto terminator
.
Se for assim, você pode conseguir isso escrevendo um script wrapper, que chamará internamente 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 um truque sujo, mas funciona.