Как определить, какой оконный менеджер запущен


180

Есть ли способ (например, команда или переменная окружения) определить, какой оконный менеджер активно работает в текущем сеансе?

Ответы:


145

Если вы wmctrlустановили, первая строка вывода из команды

    wmctrl -m

покажет вам имя оконного менеджера. Если вы не wmctrlустановили, используйте следующую команду, чтобы установить его:

    sudo apt-get install wmctrl

Обратите внимание, man wmctrl(то есть, manстраница для wmctrl) говорит частично:

-m Показать информацию о диспетчере окон ...

В моей системе Ubuntu 11.10 / Linux 3.0.0-14-generic # 23-Ubuntu x86_64 / metacity 2.34.1, первая строка вывода wmctrl -mбыла: Name: Metacity
пока echo $DESKTOP_SESSIONпоказывался ubuntu-2dи echo $XDG_CURRENT_DESKTOPпоказывался Unity.

На свежей Ubuntu 15.10 установку Ubuntu desktopпрограммного обеспечения на старом ноутбуке, первая линия выхода из wmctrl -mбыло: в Name: Compiz
то время как DESKTOP_SESSIONи XDG_CURRENT_DESKTOPценности были ubuntuиUnity


4
К сожалению, это не работает через ssh, даже если X11 включен.
Шридхар Сарнобат

1
@ Sridhar-Sarnobat в Ubuntu 15.04, запуск ssh -Y {host} 'wmctrl -m'действительно возвращает некоторые значения (например, «Имя: Compiz» и несколько N / A), но имеет смысл sshиметь ограниченную информацию о диспетчере окон.
Майкл

на Debian работает Cinnamon, это не работает. вывод команды wmctrl -m: имя: Mutter (Muffin), а $ XDG_CURRENT_DESKTOP = X-Cinnamon
Флойд

В Xubuntu Wily при запуске Window Maker 0.95.6 - wmctrl сообщает N / A для всех записей. GDMSESSION установлен на wmaker-common, но XDG_CURRENT_DESKTOP вообще не установлен.
Мэй

@ Mei, у вас есть Window Maker, работающий на каких-либо других системах, которые вы можете сравнить? Кроме того, либо wmctrl -d(Список всех рабочих столов, управляемых оконным менеджером), либо wmctrl -l(Список окон, управляемых оконным менеджером) нормально работает на Xubuntu Wily с Window Maker?
Джеймс Уолдби - jwpat7

102

В системах Linux я тестировал переменные окружения XDG_CURRENT_DESKTOPи GDMSESSIONи получил следующие результаты.

Вы можете использовать эту строку, чтобы получить вывод:

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 on Wayland)

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

Ubuntu 16.04


Единство (7)

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Ubuntu 14.04


Единство с Миром

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Примечание MIR_SERVER_NAME также установлено

  • MIR_SERVER_NAME=session-$NUMBER

Unity работает без Мира

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

XFCE

  • XDG_CURRENT_DESKTOP=XFCE
  • GDMSESSION=xfce

Ubuntu 12.04


KDE

  • XDG_CURRENT_DESKTOP=
  • GDMSESSION=kde-plasma

Единство 3d

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Unity 2d

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu-2d

Гном

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-shell

Гномик Классик

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-classic

Gnome Classic (без эффектов)

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=gnome-fallback

Другие дистрибутивы на основе Ubuntu


Мята 13 (Корица)

  • XDG_CURRENT_DESKTOP=GNOME
  • GDMSESSION=cinnamon

Монетный двор 16 (издание KDE)

  • XDG_CURRENT_DESKTOP=KDE
  • GDMSESSION=default

Мята 17 (Корица)

  • 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 с помощью рабочего стола 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
Монетный двор 13 (Корица): XDG_CURRENT_DESKTOP = GNOME, GDMSESSION = Корица
Рик-Шоу

1
Lubuntu 12.04: XDG_CURRENT_DESKTOP = LXDE, GDMSESSION = Lubuntu
Рик-Шоу

А как насчет $ DESKTOP_SESSION? В качестве решения для резервного копирования :)
Savvas Radevic

1
Что если я не использую GDM?
Роберт Симер

6
И далее это не отвечает, какой оконный менеджер я использую!
Роберт Симер

42

В терминале введите envвсе переменные окружения. Некоторые из них:

XDG_CURRENT_DESKTOP - сообщает, какую среду рабочего стола вы используете

GDMSESSION - Сообщает вам, какую опцию вы выбрали на приветствии lightdm для входа.

Чтобы использовать их, перейдите в терминал и введите:

echo $XDG_CURRENT_DESKTOP

(Будет выводить, например, «Unity», если вы используете Unity)

или же

echo $GDMSESSION  

(Будет выводиться, например, «Ubuntu», если вы выбрали Ubuntu в логин или «Ubuntu-2d», если вы выбрали тот в логин.)

У вас есть другие, если вы посмотрите ближе к выводамenv вроде DESKTOP_SESSION и COMPIZ_CONFIG_PROFILE

Поскольку то, что вы ищете, - это название того, какой диспетчер окон используется, единственный способ узнать, как это сделать, - просмотреть список процессов. Для этого есть команда под названием pgrep( Википедия ). Я сделал следующее, чтобы получить имя, так как параметр -l добавляет идентификатор процесса:

pgrep -l compiz |cut -d " " -f2поскольку процесс выполняется одним и тем же пользователем, нет необходимости добавлять префикс sudo. Затем вы можете использовать это для создания сценария, который выполняет действие на основе диспетчера окон.

Чтобы искать другие типы, просто измените слово compizна другое, например mutter, kwinи т.д ..


2
Те просто говорят мне имя сеанса и среду рабочего стола. Например, в нем написано «GNOME» - это среда рабочего стола, которая может использовать Metacity, Mutter, Compiz или другие оконные менеджеры. Он говорит "gnome-classic", который является именем сеанса, такого оконного менеджера с таким именем не существует.
Аноним

1
Вот и ты. Нашел команду, которая может помочь со списком процессов. pgrep. Добрался до этой части, по крайней мере, он покажет вам имя оконного менеджера, если найден. Попытка проверить, смогу ли я добавить их все вместе. Ваш вопрос очень хорош, поскольку Ubuntu 11.10 немного сбивает с толку, используя Compiz (или бормочет, если в Gnome 3.x), поэтому было бы неплохо указать на фактический оконный менеджер, который используется в Unity.
Луис Альварадо

$XDG_CURRENT_DESKTOPэто текущая среда рабочего стола, а не менеджер окон.
Кен Шарп

24

Я нашел pstreeбольшую помощь.

Монтаж

sudo apt-get install pstree

выход

Это то, что я получил.

 ├─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
это привело меня туда с моей собственной системой buildroot.
jc__

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

1
Можете ли вы объяснить, как это работает? Кроме того, я думаю, что вы пропустите )в конце.
Луи Матейссен

@LouisMatthijssen 1. xprop -root -notypeотображает все свойства корневого окна (и пропускает типы для более простого анализа), выходные данные отправляются по awkканалу; 2. awkИнструкция $1=="_NET[blah]CK:"{print $5}'сравнивает первый столбец каждой строки входных данных, которые она получила через канал, с заданной строкой, и если она находит совпадение, она запускает код в скобках, который печатает пятый столбец из этой строки - именно так и происходит (совершенно случайно, Бьюсь об заклад) быть идентификатором атома "_NET_SUPPORTING_WM_CHECK"; 3. этот идентификатор затем снова используется для получения свойств диспетчера Windows сxprop -id
cprn

4

Я также тестировал с KDE, и мой вывод:

а) Графически, с HardInfo: ответ обычно находится в «Операционная система»> «Среда рабочего стола», но если нет, вы можете посмотреть «Переменные среды». HardInfo готов ко всем протестированным дистрибутивам, кроме дистрибутива с KDE, но его можно легко и быстро установить (только 2 пакета в Linux Mint 13).

б) из командной строки с помощью следующей команды: ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm". Элемент, который появляется в большем количестве строк, должен быть ответом (если есть ничья, то решение с «сессией» должно быть решением).


XFCE также имеет несколько gnome-...процессов (и хит kdevtmpfs
KDE

2

Ничто из вышеперечисленного на самом деле не сработало для меня, я просто хотел узнать, запущен ли Gnome в качестве моего текущего сеанса рабочего стола.

Это то, что сработало, откройте терминал

lsb_release -a

(чтобы проверить, какой вариант или версию я установил на свой компьютер UBUNTU)

ls /usr/bin/*session

(запускает, какой сеанс рабочего стола / среда рабочего стола в настоящее время используется)

gnome-shell --version 

(чтобы узнать какая версия gnome установлена)


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

Или в одну строку:

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

Это возможно благодаря dbus и службе учетных записей (обе по умолчанию в Ubuntu).

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

Стоит отметить, что я проверил это при входе в систему через lightdm (то есть графический экран входа в систему), он обнаружил классический рабочий стол, такой как черный ящик, и, очевидно, обнаружил Unity. Я подозреваю, что это значение того, что пользователь выбирает на экране входа в качестве сеанса, поэтому немного проще использовать эту проверку для процессов


0

скрипт

Следующий сценарий привел как лучший ответ на аналогичный вопрос , который я разместил над на unix.se . Он также прекрасно работает с Unity и 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

Вы можете использовать инструмент под названием inxi. Его можно получить в репозиториях Ubuntu:

sudo apt install inxi

или с GitHub: https://github.com/smxi/inxi

Просто запустите команду следующим образом:

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)

Обратите внимание на Desktop: i3часть. В моем случае оконный менеджер я использую i3.

Опция -Sотображает xинформацию о системе и добавляет информацию о оконном менеджере.


-3

Я могу думать только о проверке известных оконных менеджеров в запущенных процессах. Раньше в gconf был ключ, для которого был задан предпочтительный оконный менеджер, но он не рекомендуется с Gnome 2.12.

Итак, если это для целей программирования, я предлагаю вам исследовать все оконные менеджеры linux; некоторые популярные:

  • гном-оболочки *
  • Compiz
  • Metacity
  • бормотание
  • пила-рыба

Вам нужно будет выполнить проверку каждого с помощью команды pgrep -l $WINDOW_MANAGER, где $WINDOW_MANAGERнаходится имя оконного менеджера, для которого вы хотите проверить. Команда pgrepпроверяет запущенные процессы.

Я не уверен на 100%, считается ли Gnome Shell оконным менеджером; остальные оконные менеджеры я получил из списка в /usr/bin/gnome-wmскрипте. Этот скрипт на самом деле должен быть пригодным для использования (поскольку он присутствует в чистой установке), но в моем случае он пытается запустить, compizкоторый не является моим оконным менеджером по умолчанию (не в моем сеансе Gnome).

РЕДАКТИРОВАТЬ:

Ну, комментарий @Anarci кажется более точным. В моем случае это действительно показывало gnome-shell.


1
Кажется, pgrep поддерживает регулярные выражения, поэтому можно использовать шаблон с чередованием. pgrep -l "compiz|metacity|mutter|kwin|sawfish|fluxbox|openbox|xmonad"
Аноним

1
Этого недостаточно: что, если пользователь запускает несколько сеансов X с разными менеджерами? Вы должны, по крайней мере, убедиться, что менеджер окон работает на интересующем вас дисплее (вы можете сделать это, изучив $DISPLAYокружение).
Жиль

Ubuntu 18.04 LTS Desktop: Unity: Unity7: Ubuntu Сессия:
Unity
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.