Como determinar qual gerenciador de janelas está sendo executado


180

Existe alguma maneira (como um comando ou variável ambiental) de determinar qual gerenciador de janelas é o que está sendo executado ativamente na sessão atual?

Respostas:


145

Se você wmctrlinstalou, a primeira linha de saída do comando

    wmctrl -m

irá mostrar o nome do gerenciador de janelas. Se você não tiver wmctrlinstalado, use o seguinte comando para instalá-lo:

    sudo apt-get install wmctrl

Observe man wmctrl(isto é, a manpágina para wmctrl) diz em parte:

-m Exibe informações sobre o gerenciador de janelas ...

No meu sistema Ubuntu 11.10 / Linux 3.0.0-14-generic # 23-Ubuntu x86_64 / metacity 2.34.1, a primeira linha de saída wmctrl -mfoi: Name: Metacity
enquanto echo $DESKTOP_SESSIONmostrada ubuntu-2de echo $XDG_CURRENT_DESKTOPmostrada Unity.

Em um novo Ubuntu 15.10 instalação do Ubuntu desktopsoftware em um laptop antigo, a primeira linha de saída de wmctrl -mera: Name: Compiz
enquanto os DESKTOP_SESSIONe XDG_CURRENT_DESKTOPvalores foram ubuntueUnity


4
Infelizmente, isso não funciona com o ssh, mesmo se o X11 estiver ativado.
Sridhar Sarnobat

1
@ Sridhar-Sarnobat no ubuntu 15.04, a execução ssh -Y {host} 'wmctrl -m'retorna alguns valores (por exemplo, "Name: Compiz" e vários N / A), mas faz sentido que sshhaja informações limitadas sobre o gerenciador de janelas.
Michael

no debian executando canela, isso não funciona. saída de wmctrl -m é Name: Mutter (Muffin) enquanto $ XDG_CURRENT_DESKTOP = X-Cinnamon
Floyd

No Xubuntu Wily, executando o Window Maker 0.95.6 - o wmctrl reporta N / A para todas as entradas. GDMSESSION está definido como wmaker-common, mas XDG_CURRENT_DESKTOP não está definido.
Mei

@ Mei, você tem o Window Maker em execução em outros sistemas que você pode comparar? Além disso, wmctrl -d(Liste todos os desktops gerenciados pelo gerenciador de janelas) ou wmctrl -l(Liste as janelas gerenciadas pelo gerenciador de janelas) funcionam bem no Xubuntu Wily com o Window Maker?
James Waldby - jwpat7

102

Em sistemas Linux Eu testei variáveis de ambiente XDG_CURRENT_DESKTOPe GDMSESSIONe obteve os seguintes resultados.

Você pode usar esta linha para obter a saída:

printf 'Desktop: %s\nSession: %s\n' "$XDG_CURRENT_DESKTOP" "$GDMSESSION"

Ubuntu 18.04 (Ubuntu)

  • XDG_CURRENT_DESKTOP=ubuntu:GNOME
  • GDMSESSION=ubuntu

Ubuntu 18.04 (Ubuntu em Wayland)

  • XDG_CURRENT_DESKTOP=ubuntu:GNOME
  • GDMSESSION=ubuntu-wayland

Ubuntu 16.04


Unidade (7)

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Ubuntu 14.04


Unidade rodando com Mir

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Nota MIR_SERVER_NAME também está definido

  • MIR_SERVER_NAME=session-$NUMBER

Unidade rodando sem Mir

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

XFCE

  • XDG_CURRENT_DESKTOP=XFCE
  • GDMSESSION=xfce

Ubuntu 12.04


KDE

  • XDG_CURRENT_DESKTOP=
  • GDMSESSION=kde-plasma

Unidade 3d

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Unidade 2d

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu-2d

Gnomo

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-shell

Gnome Classic

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-classic

Gnome Classic (sem efeitos)

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-fallback

Outras distribuições baseadas no Ubuntu


Hortelã 13 (Canela)

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=cinnamon

Mint 16 (edição KDE)

  • XDG_CURRENT_DESKTOP=KDE
  • GDMSESSION=default

Hortelã 17 (Canela)

  • XDG_CURRENT_DESKTOP=X-Cinnamon
  • GDMSESSION=default

Lubuntu 12.04

  • XDG_CURRENT_DESKTOP=LXDE
  • GDMSESSION=Lubuntu

Wasta 14.04 / 18.04

  • XDG_CURRENT_DESKTOP=X-Cinnamon
  • GDMSESSION=cinnamon

Wasta 14.04 usando a área de trabalho do Gnome.

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome

Ubuntu Mate 18.04

  • XDG_CURRENT_DESKTOP=MATE
  • GDMSESSION=mate

Xubuntu 18.04

  • XDG_CURRENT_DESKTOP=XFCE
  • GDMSESSION=xubuntu

4
Hortelã 13 (canela): XDG_CURRENT_DESKTOP = GNOME, GDMSESSION = canela
rik-shaw

1
Lubuntu 12.04: XDG_CURRENT_DESKTOP = LXDE, GDMSESSION = Lubuntu
rik-shaw

E quanto a $ DESKTOP_SESSION? Como uma solução de backup :)
Savvas Radevic

1
E se eu não usar o GDM?
Robert Siemer 13/03

6
Além disso, ele não responde qual gerenciador de janelas eu uso!
Robert Siemer

42

No tipo de terminal, envpara ver todas as variáveis ​​de ambiente. Alguns deles são:

XDG_CURRENT_DESKTOP - Informa qual ambiente de desktop você está usando

GDMSESSION - Informa qual opção você selecionou no greet lightdm para efetuar login.

Para usá-los, vá para o terminal e digite:

echo $XDG_CURRENT_DESKTOP

(Produzirá, por exemplo, 'unity' se você estiver usando o Unity)

ou

echo $GDMSESSION  

(Produzirá, por exemplo, 'ubuntu' se você selecionou o ubuntu no logon ou 'ubuntu-2d' se você selecionou aquele no logon.)

Você tem outros se você olhar mais de perto a saída de envcomo DESKTOP_SESSION e COMPIZ_CONFIG_PROFILE

Como o que você está procurando é o nome do que o Window Manager está em uso, a única maneira de ver como obter isso é consultando a lista de processos. Para fazer isso, existe um comando chamado pgrep( Wikipedia ). Fiz o seguinte para obter o nome, pois o parâmetro -l adiciona o ID do processo:

pgrep -l compiz |cut -d " " -f2como o processo está sendo executado pelo mesmo usuário, não há necessidade de prefixar a parte sudo. Você pode usar isso para criar um script que executa uma ação baseada no Gerenciador de Janelas.

Para procurar outros tipos, basta alterar a palavra compiza outro como mutter, kwin, etc ..


2
Aqueles apenas me dizem o nome da sessão e o ambiente da área de trabalho. Exemplo: "GNOME", que é um ambiente de área de trabalho que pode usar Metacity, Mutter, Compiz ou outros gerenciadores de janelas. Diz "gnome-classic", que é um nome de sessão, não existe um gerenciador de janelas com esse nome.
Anônimo

1
Ai está. Encontrou um comando que pode ajudar com a lista de processos. pgrep. Chegou a essa parte, pelo menos mostra o nome do gerenciador de janelas, se encontrado. Tentando verificar se posso adicionar todos eles lá. Sua pergunta é muito boa, pois o Ubuntu 11.10 confunde um pouco usando o Compiz (ou murmure se estiver no Gnome 3.x); portanto, seria bom ressaltar o atual Gerenciador de Janelas usado no Unity.
Luis Alvarado

$XDG_CURRENT_DESKTOPé o ambiente de desktop atual, NÃO o gerenciador de janelas.
22618 Ken Sharp

24

Eu achei pstreeuma grande ajuda.

Instalação

sudo apt-get install pstree

resultado

Isto é o que eu tenho.

 ├─lightdm─┬─Xorg───2*[{Xorg}]
 │         ├─lightdm─┬─gnome-session─┬─bluetooth-apple───2*[{bluetooth-apple}]
 │         │         │               ├─compiz─┬─sh───gtk-window-deco───2*[{gtk-window-deco}]
 │         │         │               │        └─5*[{compiz}]
 │         │         │               ├─deja-dup-monito───2*[{deja-dup-monito}]
 │         │         │               ├─gnome-fallback-───2*[{gnome-fallback-}]
 │         │         │               ├─gnome-screensav───2*[{gnome-screensav}]
 │         │         │               ├─gnome-settings-───2*[{gnome-settings-}]
 │         │         │               ├─nautilus───2*[{nautilus}]
 │         │         │               ├─nm-applet───2*[{nm-applet}]
 │         │         │               ├─polkit-gnome-au───2*[{polkit-gnome-au}]
 │         │         │               ├─ssh-agent
 │         │         │               ├─telepathy-indic───2*[{telepathy-indic}]
 │         │         │               ├─update-notifier───2*[{update-notifier}]
 │         │         │               ├─vino-server───2*[{vino-server}]
 │         │         │               ├─zeitgeist-datah───{zeitgeist-datah}
 │         │         │               └─3*[{gnome-session}]
 │         │         └─{lightdm}
 │         └─2*[{lightdm}]

1
isso me levou até lá com meu sistema de buildroot personalizado.
jc__

11
xprop -id $(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}') -notype -f _NET_WM_NAME 8t 

1
Você pode explicar como isso funciona? Além disso, acho que você está perdendo um )no final.
Louis Matthijssen

@LouisMatthijssen 1. xprop -root -notypeexibe todas as propriedades da janela raiz (e omite tipos para facilitar a análise), a saída é enviada para awkvia pipe; 2. a awkinstrução $1=="_NET[blah]CK:"{print $5}'compara a primeira coluna de cada linha da entrada que ela passou pelo pipe com uma determinada string e, se encontrar a correspondência, executa o código entre parênteses, que imprime a quinta coluna dessa linha - o mesmo acontece (inteiramente por acidente, Aposto que) é o ID do átomo "_NET_SUPPORTING_WM_CHECK"; 3. esse ID é usado novamente para obter as propriedades do Windows Manager comxprop -id
cprn

4

Eu também testei com o KDE e minha conclusão é:

a) Maneira gráfica, com HardInfo: a resposta está normalmente em "Sistema operacional"> "Ambiente de área de trabalho", mas, caso contrário, você pode procurar em "Variáveis ​​de ambiente". O HardInfo está pronto com todas as distribuições testadas, exceto a do KDE, mas pode ser fácil e rapidamente instalado (apenas 2 pacotes no Linux Mint 13).

b) linha de comando, com este comando: ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm". O item que aparece em mais linhas deve ser a resposta (se houver um empate, o item com "sessão" deve ser a solução).


XFCE também tem vários gnome-...processos (e um hit kde com kdevtmpfs)
Xen2050

2

Nenhuma das opções acima realmente funcionou para mim, eu só queria saber se o Gnome estava sendo executado como minha sessão atual da área de trabalho.

Isto é o que funcionou, abra um terminal

lsb_release -a

(para verificar qual sabor ou versão eu tinha instalado na minha máquina UBUNTU)

ls /usr/bin/*session

(inicia qual sessão / ambiente de área de trabalho atualmente em uso)

gnome-shell --version 

(para descobrir qual versão do gnome está instalada)


1
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e.wordpress.com)


windowManagerName () {
    window=$(xprop -root -notype)
    identifier=$(echo "${window}" | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}')
    attributes=$(xprop -id "${identifier}" -notype -f _NET_WM_NAME 8t)

    echo "${attributes}" |
        grep "_NET_WM_NAME = " |
        cut --delimiter=' ' --fields=3 |
        cut --delimiter='"' --fields=2
}


windowManagerName

Ou em uma linha:

id = $ (xprop -root -notype | awk '$ 1 == "_ NET_SUPPORTING_WM_CHECK:" {print $ 5}'); xprop -id "$ {id}" -notype -f _NET_WM_NAME 8t | grep "_NET_WM_NAME =" | cut --delimiter = '' --fields = 3 | cut --delimiter = '"' --fields = 2


0

Isso é possível com o dbus e o Accounts Service (ambos por padrão no Ubuntu).

$ qdbus --system org.freedesktop.Accounts \                                                                
> /org/freedesktop/Accounts/User1000 \                                                                                     
> org.freedesktop.Accounts.User.XSession                                                                                   
ubuntu

Vale ressaltar que eu testei isso com o login através do lightdm (que é a tela gráfica de login), ele detectou uma área de trabalho clássica como o blackbox e, obviamente, o Unity. Eu suspeito que esse é um valor do que o usuário seleciona na tela de login como sessão, por isso é um pouco mais fácil usar essa verificação de processos


0

Roteiro

O script a seguir resultou como a melhor resposta a uma semelhante pergunta que eu postei sobre a unix.se . Também funciona muito bem com o Unity e o LXDE.

if [ "$XDG_CURRENT_DESKTOP" = '' ]
then
  desktop=$(echo "$XDG_DATA_DIRS" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/')
else
  desktop=$XDG_CURRENT_DESKTOP
fi

desktop=${desktop,,}  # convert to lower case
echo "$desktop"

0

Você pode usar a ferramenta chamada inxi. Pode ser obtido nos repositórios do Ubuntu por:

sudo apt install inxi

ou no github: https://github.com/smxi/inxi

Basta executar o comando da seguinte maneira:

inxi -Sx
System:    Host: blackhole Kernel: 5.1.15-050115-lowlatency x86_64 bits: 64 compiler: gcc v: 8.3.0
           Desktop: i3 4.16.1-178-g31c0f1b8 Distro: Ubuntu 19.04 (Disco Dingo)

Observe a Desktop: i3parte. No meu caso, o gerenciador de janelas que eu uso é i3.

A opção -Sexibe informações do sistema e xadiciona informações sobre o gerenciador de janelas.


-3

Só consigo pensar em procurar gerenciadores de janelas conhecidos nos processos em execução. Costumava haver uma chave no gconf que foi configurada para o gerenciador de janelas preferido, mas está obsoleta desde o Gnome 2.12.

Então, se isso é para um propósito de programação, sugiro que você pesquise todos os gerenciadores de janelas linux; alguns populares são:

  • gnome-shell *
  • compiz
  • metacidade
  • murmurar
  • peixe-serra

Você precisaria executar uma verificação para cada um com o comando pgrep -l $WINDOW_MANAGER, onde $WINDOW_MANAGERé o nome do gerenciador de janelas que deseja verificar. O pgrepcomando verifica se há processos em execução.

Não tenho 100% de certeza se o Gnome Shell é considerado um gerenciador de janelas; o restante dos gerenciadores de janelas que obtive de uma lista no /usr/bin/gnome-wmscript. Na verdade, esse script deve ser utilizável (desde que está presente em uma instalação limpa), mas, no meu caso, ele tenta executar o compizque não é o meu gerenciador de janelas padrão (não está na minha sessão do Gnome).

EDITAR:

Bem, o comentário de @Anarci parece ser mais preciso. No meu caso, mostrou gnome-shell.


1
Parece que o pgrep suporta regex, então um padrão com alternações pode ser usado. pgrep -l "compiz|metacity|mutter|kwin|sawfish|fluxbox|openbox|xmonad"
Anônimo

1
Isso não é suficiente: e se o usuário estiver executando várias sessões X com gerentes diferentes? Você deve pelo menos verificar se o gerenciador de janelas está operando na tela em que está interessado (você pode fazer isso examinando $DISPLAYo ambiente).
Gilles

Ubuntu 18.04 LTS Desktop: Unity: Unity7: ubuntu Sessão: unity
user2584621
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.