Ответы:
Если вы 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
ssh -Y {host} 'wmctrl -m'
действительно возвращает некоторые значения (например, «Имя: Compiz» и несколько N / A), но имеет смысл ssh
иметь ограниченную информацию о диспетчере окон.
wmctrl -d
(Список всех рабочих столов, управляемых оконным менеджером), либо wmctrl -l
(Список окон, управляемых оконным менеджером) нормально работает на Xubuntu Wily с Window Maker?
В системах Linux я тестировал переменные окружения 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
В терминале введите 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
и т.д ..
$XDG_CURRENT_DESKTOP
это текущая среда рабочего стола, а не менеджер окон.
Я нашел 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}]
xprop -id $(xprop -root -notype | awk '$1=="_NET_SUPPORTING_WM_CHECK:"{print $5}') -notype -f _NET_WM_NAME 8t
)
в конце.
xprop -root -notype
отображает все свойства корневого окна (и пропускает типы для более простого анализа), выходные данные отправляются по awk
каналу; 2. awk
Инструкция $1=="_NET[blah]CK:"{print $5}'
сравнивает первый столбец каждой строки входных данных, которые она получила через канал, с заданной строкой, и если она находит совпадение, она запускает код в скобках, который печатает пятый столбец из этой строки - именно так и происходит (совершенно случайно, Бьюсь об заклад) быть идентификатором атома "_NET_SUPPORTING_WM_CHECK"; 3. этот идентификатор затем снова используется для получения свойств диспетчера Windows сxprop -id
Я также тестировал с KDE, и мой вывод:
а) Графически, с HardInfo: ответ обычно находится в «Операционная система»> «Среда рабочего стола», но если нет, вы можете посмотреть «Переменные среды». HardInfo готов ко всем протестированным дистрибутивам, кроме дистрибутива с KDE, но его можно легко и быстро установить (только 2 пакета в Linux Mint 13).
б) из командной строки с помощью следующей команды: ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm"
. Элемент, который появляется в большем количестве строк, должен быть ответом (если есть ничья, то решение с «сессией» должно быть решением).
gnome-...
процессов (и хит kdevtmpfs
Ничто из вышеперечисленного на самом деле не сработало для меня, я просто хотел узнать, запущен ли Gnome в качестве моего текущего сеанса рабочего стола.
Это то, что сработало, откройте терминал
lsb_release -a
(чтобы проверить, какой вариант или версию я установил на свой компьютер UBUNTU)
ls /usr/bin/*session
(запускает, какой сеанс рабочего стола / среда рабочего стола в настоящее время используется)
gnome-shell --version
(чтобы узнать какая версия gnome установлена)
#! /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
Это возможно благодаря dbus и службе учетных записей (обе по умолчанию в Ubuntu).
$ qdbus --system org.freedesktop.Accounts \
> /org/freedesktop/Accounts/User1000 \
> org.freedesktop.Accounts.User.XSession
ubuntu
Стоит отметить, что я проверил это при входе в систему через lightdm (то есть графический экран входа в систему), он обнаружил классический рабочий стол, такой как черный ящик, и, очевидно, обнаружил Unity. Я подозреваю, что это значение того, что пользователь выбирает на экране входа в качестве сеанса, поэтому немного проще использовать эту проверку для процессов
Следующий сценарий привел как лучший ответ на аналогичный вопрос , который я разместил над на 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"
Вы можете использовать инструмент под названием 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
информацию о системе и добавляет информацию о оконном менеджере.
Я могу думать только о проверке известных оконных менеджеров в запущенных процессах. Раньше в gconf был ключ, для которого был задан предпочтительный оконный менеджер, но он не рекомендуется с Gnome 2.12.
Итак, если это для целей программирования, я предлагаю вам исследовать все оконные менеджеры linux; некоторые популярные:
Вам нужно будет выполнить проверку каждого с помощью команды pgrep -l $WINDOW_MANAGER
, где $WINDOW_MANAGER
находится имя оконного менеджера, для которого вы хотите проверить. Команда pgrep
проверяет запущенные процессы.
Я не уверен на 100%, считается ли Gnome Shell оконным менеджером; остальные оконные менеджеры я получил из списка в /usr/bin/gnome-wm
скрипте. Этот скрипт на самом деле должен быть пригодным для использования (поскольку он присутствует в чистой установке), но в моем случае он пытается запустить, compiz
который не является моим оконным менеджером по умолчанию (не в моем сеансе Gnome).
РЕДАКТИРОВАТЬ:
Ну, комментарий @Anarci кажется более точным. В моем случае это действительно показывало gnome-shell
.
pgrep -l "compiz|metacity|mutter|kwin|sawfish|fluxbox|openbox|xmonad"
$DISPLAY
окружение).