Есть ли способ (например, команда или переменная окружения) определить, какой оконный менеджер активно работает в текущем сеансе?
Это возможно при использовании dbus и службы учетных записей (по умолчанию в Ubuntu).
$ qdbus --system org.freedesktop.Accounts \
> /org/freedesktop/Accounts/User1000 \
> org.freedesktop.Accounts.User.XSession
ubuntu
Стоит отметить, что я проверил это при входе через lightdm (это графический экран входа в систему), он обнаружил классический рабочий стол, такой как черный ящик, и, очевидно, обнаружил Unity. Я подозреваю, что это значение того, что пользователь выбирает на экране входа в качестве сеанса, поэтому немного проще использовать эту проверку для процессов
Если у вас установлено wmctrl
, первая строка вывода команды
wmctrl -m
покажет вам имя оконного менеджера. Если у вас не установлено wmctrl
, используйте следующую команду для его установки:
sudo apt-get install wmctrl
Примечание, man wmctrl
(то есть страница man
для wmctrl
) говорит частично :
-m Показать информацию об оконном менеджере ...
blockquote>В моей системе Ubuntu 11.10 / Linux 3.0.0-14-generic # 23-Ubuntu x86_64 / metacity 2.34.1 первая строка вывода из
wmctrl -m
была:Name: Metacity
[ 1120], в то время как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
В системах Linux I переменных тестовой среды XDG_CURRENT_DESKTOP
и GDMSESSION
и получил следующие результаты.
Можно использовать эту строку для получения вывода:
printf 'Desktop: %s\nSession: %s\n' "$XDG_CURRENT_DESKTOP" "$GDMSESSION"
XDG_CURRENT_DESKTOP=ubuntu:GNOME
GDMSESSION=ubuntu
XDG_CURRENT_DESKTOP=ubuntu:GNOME
GDMSESSION=ubuntu-wayland
XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu
XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu
Обратите внимание, что MIR_SERVER_NAME также установлен
MIR_SERVER_NAME=session-$NUMBER
XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu
XDG_CURRENT_DESKTOP=XFCE
GDMSESSION=xfce
XDG_CURRENT_DESKTOP=
GDMSESSION=kde-plasma
XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu
XDG_CURRENT_DESKTOP=Unity
GDMSESSION=ubuntu-2d
XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome-shell
XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome-classic
XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome-fallback
XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=cinnamon
XDG_CURRENT_DESKTOP=KDE
GDMSESSION=default
XDG_CURRENT_DESKTOP=X-Cinnamon
GDMSESSION=default
XDG_CURRENT_DESKTOP=LXDE
GDMSESSION=Lubuntu
XDG_CURRENT_DESKTOP=X-Cinnamon
GDMSESSION=cinnamon
XDG_CURRENT_DESKTOP=GNOME
GDMSESSION=gnome
XDG_CURRENT_DESKTOP=MATE
GDMSESSION=mate
XDG_CURRENT_DESKTOP=XFCE
GDMSESSION=xubuntu
xprop -id $(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}') -notype -f _NET_WM_NAME 8t
Я также тестировал с KDE, и мой вывод таков:
a) Графически, с HardInfo: ответ обычно в «Операционная система»> «Среда рабочего стола», но если нет, вы можете посмотрите на «Переменные среды». HardInfo готов ко всем протестированным дистрибутивам, кроме дистрибутива с KDE, но его можно легко и быстро установить (только 2 пакета в Linux Mint 13).
б) Командная строка, с этой командой: ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm"
. Элемент, который появляется в нескольких строках, должен быть ответом (если есть ничья, то решение с «сессией» должно быть решением).
Я могу думать только о проверке известных оконных менеджеров в запущенных процессах. Раньше в gconf был ключ, для которого был задан предпочтительный оконный менеджер, но он устарел с Gnome 2.12.
Итак, если это для целей программирования, я предлагаю вам исследовать все оконные менеджеры linux; Некоторые популярные:
Вам нужно будет выполнить проверку для каждого с помощью команды pgrep -l $WINDOW_MANAGER
, где $WINDOW_MANAGER
- это имя оконного менеджера, для которого вы хотите проверить. Команда pgrep
проверяет запущенные процессы.
Я не уверен на 100%, считается ли Gnome Shell оконным менеджером; остальные оконные менеджеры я получил из списка в скрипте /usr/bin/gnome-wm
. Этот скрипт на самом деле должен быть пригоден для использования (поскольку он присутствует при чистой установке), но в моем случае он пытается запустить compiz
, который не является моим оконным менеджером по умолчанию (не в моем сеансе Gnome).
РЕДАКТИРОВАТЬ:
Ну, комментарий @Anarci кажется более точным. В моем случае это действительно показывало gnome-shell
.
Ничего из вышеперечисленного на самом деле не работало для меня, я просто хотел узнать, работал ли у меня Gnome в качестве моего текущего сеанса рабочего стола.
Это то, что сработало, откройте терминал
lsb_release -a
(чтобы проверить, какой вариант или версию я установил на своем компьютере с UBUNTU)
ls /usr/bin/*session
(запускает сессию рабочего стола / настольная среда, используемая в настоящее время)
gnome-shell --version
(чтобы узнать, какая версия gnome установлена)
Я нашел 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}]
В терминале введите env
, чтобы увидеть все переменные среды. Вот некоторые из них:
XDG_CURRENT_DESKTOP - Сообщает вам, какую среду рабочего стола вы используете
GDMSESSION - Сообщает вам, какую опцию вы выбрали из lightdm приветствовать, чтобы войти.
Чтобы использовать их, перейдите в терминал и введите:
echo $XDG_CURRENT_DESKTOP
(будет выводить, например, «Unity», если вы используете Unity)
или
echo $GDMSESSION
(Выводит, например, «ubuntu», если вы выбрали ubuntu в логине, или «ubuntu-2d», если вы выбрали его в логине.)
У вас есть другие, если вы посмотрите ближе на вывод из env
, таких как DESKTOP_SESSION и COMPIZ_CONFIG_PROFILE
Так как то, что вы ищете, это имя того, что используется Window Manager, единственный способ увидеть, как получить это, посмотрев в список процессов. Для этого есть команда под названием pgrep
( Wikipedia ). Я сделал следующее, чтобы получить имя, так как параметр -l добавляет идентификатор процесса:
pgrep -l compiz |cut -d " " -f2
, поскольку процесс выполняется одним и тем же пользователем, нет необходимости добавлять префикс sudo. Затем вы можете использовать это для создания сценария, который выполняет действие на основе диспетчера окон.
Чтобы искать другие типы, просто измените слово compiz
на другое, например mutter
, kwin
и т. Д.
Следующий скрипт является лучшим ответом на аналогичный вопрос, который я разместил на 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"
#! /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 - базируются-notype | awk '1$ == "_NET_SUPPORTING_WM_CHECK": {печатают 5$} '); xprop - идентификатор "$ {идентификатор}"-notype-f _NET_WM_NAME 8 т | grep "_NET_WM_NAME = "| сокращение - разделитель ='' - fields=3 | сокращение - разделитель = '"' - fields=2
Можно использовать названный инструмент 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
добавляет информация о менеджере окон.