Как получить имя текущей запущенной среды рабочего стола ? (Нужно для программы)
Модератор: Модераторы разделов
-
Ism
- Сообщения: 1261
- Статус: Никто, по сути быдло
Как получить имя текущей запущенной среды рабочего стола ?
Привет, вопрос такой
Как получить имя текущей запущенной среды рабочего стола ?
Конечно можно ориентироваться по именам запущенных процессов, но в этом способе нет уверенности.
Есть ли еще способы, в консоли или из программы узнать , какой рабочий стол (kde gnome unity) запущен в данный момент ?
Как получить имя текущей запущенной среды рабочего стола ?
Конечно можно ориентироваться по именам запущенных процессов, но в этом способе нет уверенности.
Есть ли еще способы, в консоли или из программы узнать , какой рабочий стол (kde gnome unity) запущен в данный момент ?
-
serzh-z
- Бывший модератор
- Сообщения: 8259
- Статус: Маньяк
- ОС: Arch, Fedora, Ubuntu
Re: Как получить имя текущей запущенной среды рабочего стола ?
Как минимум для GNOME/KDE - это $DESKTOP_SESSION.
-
Ism
- Сообщения: 1261
- Статус: Никто, по сути быдло
Re: Как получить имя текущей запущенной среды рабочего стола ?
Спасибо.
Проверил в unity , работает.
Проверил в unity , работает.
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Как получить имя текущей запущенной среды рабочего стола ?
А если используется xdm?
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
/dev/random
- Администратор
- Сообщения: 5489
- ОС: Gentoo
Re: Как получить имя текущей запущенной среды рабочего стола ?
Взято из скрипта /usr/bin/xdg-settings:
Код: Выделить всё
detectDE()
{
# see https://bugs.freedesktop.org/show_bug.cgi?id=34164
unset GREP_OPTIONS
if [ -n "${XDG_CURRENT_DESKTOP}" ]; then
case "${XDG_CURRENT_DESKTOP}" in
GNOME)
DE=gnome;
;;
KDE)
DE=kde;
;;
LXDE)
DE=lxde;
;;
XFCE)
DE=xfce
esac
fi
if [ x"$DE" = x"" ]; then
# classic fallbacks
if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde;
elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome;
elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
elif xprop -root 2> /dev/null | grep -i '^xfce_desktop_window' >/dev/null 2>&1; then DE=xfce
fi
fi
if [ x"$DE" = x"" ]; then
# fallback to checking $DESKTOP_SESSION
case "$DESKTOP_SESSION" in
gnome)
DE=gnome;
;;
LXDE)
DE=lxde;
;;
xfce|xfce4)
DE=xfce;
;;
esac
fi
if [ x"$DE" = x"" ]; then
# fallback to uname output for other platforms
case "$(uname 2>/dev/null)" in
Darwin)
DE=darwin;
;;
esac
fi
if [ x"$DE" = x"gnome" ]; then
# gnome-default-applications-properties is only available in GNOME 2.x
# but not in GNOME 3.x
which gnome-default-applications-properties > /dev/null 2>&1 || DE="gnome3"
fi
}-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Как получить имя текущей запущенной среды рабочего стола ?
Ох, ненадёжно это:
А запущен KDE SC 4.8 RC.
Код: Выделить всё
nicklion@warlock:~> echo $DESKTOP_SESSION
defaultА запущен KDE SC 4.8 RC.
-
/dev/random
- Администратор
- Сообщения: 5489
- ОС: Gentoo
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Как получить имя текущей запущенной среды рабочего стола ?
/dev/random писал(а): ↑30.12.2011 18:11
Именно. Эту переменную следует использовать только в крайнем случае, если все остальные способы провалились. См. приведённый мной код.
А как этот код отработает для того же Unity? Я так понял этот код пытается выловить KDE, GNOME, XFCE, LXDE и всё. Ну, ещё распознаёт GNOME 2/3. А вот KDE 3/4 - нет, судя по коду. Так что пилить и пилить
-
Ism
- Сообщения: 1261
- Статус: Никто, по сути быдло
Re: Как получить имя текущей запущенной среды рабочего стола ?
хм, приведенный скрипт в unity выдает gnome3 тогда как
echo $DESKTOP_SESSION
ubuntu-2d
echo $DESKTOP_SESSION
ubuntu-2d
-
Ism
- Сообщения: 1261
- Статус: Никто, по сути быдло
Re: Как получить имя текущей запущенной среды рабочего стола ?
Подкрутил скрипт , теперь определяет unity
Еще раз спасибо
Еще раз спасибо
Код: Выделить всё
#/bin/sh
detectDE()
{
# see https://bugs.freedesktop.org/show_bug.cgi?id=34164
unset GREP_OPTIONS
if [ -n "${XDG_CURRENT_DESKTOP}" ]; then
case "${XDG_CURRENT_DESKTOP}" in
GNOME)
DE=gnome;
;;
KDE)
DE=kde;
;;
LXDE)
DE=lxde;
;;
XFCE)
DE=xfce
;;
Unity|UNITY|unity)
DE=unity;
;;
esac
fi
if [ x"$DE" = x"" ]; then
# classic fallbacks
if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde;
elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome;
elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
elif xprop -root 2> /dev/null | grep -i '^xfce_desktop_window' >/dev/null 2>&1; then DE=xfce
fi
fi
if [ x"$DE" = x"" ]; then
# fallback to checking $DESKTOP_SESSION
case "$DESKTOP_SESSION" in
gnome)
DE=gnome;
;;
LXDE)
DE=lxde;
;;
xfce|xfce4)
DE=xfce;
;;
esac
fi
if [ x"$DE" = x"" ]; then
# fallback to uname output for other platforms
case "$(uname 2>/dev/null)" in
Darwin)
DE=darwin;
;;
esac
fi
if [ x"$DE" = x"gnome" ]; then
# gnome-default-applications-properties is only available in GNOME 2.x
# but not in GNOME 3.x
which gnome-default-applications-properties > /dev/null 2>&1 || DE="gnome3"
fi
echo $DE
}
detectDE
exit 0-
/dev/random
- Администратор
- Сообщения: 5489
- ОС: Gentoo
Re: Как получить имя текущей запущенной среды рабочего стола ?
В unity переменная $XDG_CURRENT_DESKTOP должна быть равна "Unity" (первая буква заглавная, остальные строчные). Добавьте это в первый case, и всё прекрасно распознается. Этот скрипт просто не знает о существовании unity. Натыкается в первом блоке на неизвестное имя, игнорирует его и переходит ко второму. А там уже по косвенным признакам решает, что это гном, т.к. технически у гнома и юнити больше сходств, чем различий.
А в $DESKTOP_SESSION _некоторые_ менеджеры логина устанавливают имя скрипта или .desktop-файла, с помощью которого запускают DE. Мало того, что для одних и тех же DE этот файл может называться по-разному в разных дистрибутивах, так ещё и не все менеджеры логина заморачиваются установкой этой переменной. Поэтому её следует использовать лишь в крайних случаях.
UPD: опоздал немного с сообщением
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Как получить имя текущей запущенной среды рабочего стола ?
Ism
у меня пустую строчку выдаёт ваш код. IceWM.
у меня пустую строчку выдаёт ваш код. IceWM.
-
Ism
- Сообщения: 1261
- Статус: Никто, по сути быдло
Re: Как получить имя текущей запущенной среды рабочего стола ?
Ism
у меня пустую строчку выдаёт ваш код. IceWM.
А что выдает
echo ${XDG_CURRENT_DESKTOP}
кроме того этот скрипт не выдает ничего под root , во всяком случае в ubuntu , а под юзером нормально
ничего не пойму
под юзером echo ${XDG_CURRENT_DESKTOP} работает, под root нет.
-
/dev/random
- Администратор
- Сообщения: 5489
- ОС: Gentoo
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Как получить имя текущей запущенной среды рабочего стола ?
/dev/random писал(а): ↑02.01.2012 23:52Само собой. IceWM - это WM, а не DE. Вот если взять какое-нибудь DE, и заменить в нём нативный WM на ваш IceWM, то это DE и должно определяться. У вас же никакого DE просто не запущено.
почему это "не запущенно"? Если принять вот это определение: http://ru.wikipedia.org/wiki/%D0%A1%D1%80%...%BE%D0%BB%D0%B0
то вполне себе даже запущено.
-
Ism
- Сообщения: 1261
- Статус: Никто, по сути быдло
Re: Как получить имя текущей запущенной среды рабочего стола ?
я запускаю скрипт из gui unity в gui терминале. под юзером echo ${XDG_CURRENT_DESKTOP} выдает unity
пытался sudo -u ny_user echo ${XDG_CURRENT_DESKTOP} все равно пусто, есть ли какой нибудь способ заставить корректно выдавать DE из под root ?
насколько я понимаю эта штука берет чтото из окружения , а под root этого нет .
можно ли из под рута заставить корректно работать echo ${XDG_CURRENT_DESKTOP} ?
пытался sudo -u ny_user echo ${XDG_CURRENT_DESKTOP} все равно пусто, есть ли какой нибудь способ заставить корректно выдавать DE из под root ?
насколько я понимаю эта штука берет чтото из окружения , а под root этого нет .
можно ли из под рута заставить корректно работать echo ${XDG_CURRENT_DESKTOP} ?
-
Ism
- Сообщения: 1261
- Статус: Никто, по сути быдло
Re: Как получить имя текущей запущенной среды рабочего стола ?
нашел , вот так работает
sudo -E echo ${XDG_CURRENT_DESKTOP}
sudo -E echo ${XDG_CURRENT_DESKTOP}
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Как получить имя текущей запущенной среды рабочего стола ?
"sudo -E" — здесь лишнее·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
Ism
- Сообщения: 1261
- Статус: Никто, по сути быдло
Re: Как получить имя текущей запущенной среды рабочего стола ?
без -E
sudo ./detect.sh не работает, скорее потому, что sudo без -E отбрасывает какието переменные окружения
а root сессия не знает какой DE запущен
sudo ./detect.sh не работает, скорее потому, что sudo без -E отбрасывает какието переменные окружения
а root сессия не знает какой DE запущен
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Как получить имя текущей запущенной среды рабочего стола ?
знает·
на основании списка процессов·
а вот переменные окружения (типа той же XDG_CURRENT_DESKTOP), установленные этими самыми процессами, доступны только их прямым потомкам·
процессы же всех остальных пользователей получают, естественно, совершенно иное окружение·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
romkaromka
- Сообщения: 1064
- ОС: Mageia
Re: Как получить имя текущей запущенной среды рабочего стола ?
Как скрипт поправить чтобы под root тоже он работал? Ведь если root знает, то и скрипт должен знать.
Консоль на мыло. Надо развивать графику.
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Как получить имя текущей запущенной среды рабочего стола ?
Из-под другого пользователя смотреть - не совсем хорошая задача. Если сохранено окружение (как в случае sudo -E), то всё норм. Ориентироваться на список процессов нехорошо - может быть одновременно запущено несколько сессий с разными DE. Значит надо ориентироваться на $DISPLAY, но не представляю что делать дальше. Из программы можно вызвать что-то вроде XGetWMName, но это тоже немного не то (как уже говорили DE может быть одно, а WM другой).
-
sciko
- Сообщения: 1744
- Статус: Ъ-участник
- ОС: Debian/Ubuntu/etc
Re: Как получить имя текущей запущенной среды рабочего стола ?
Всё правильно. Ведь скорее всего в данный момент у пользователя root ни один DE не запущен. Запуская ваш sudo без -E, получаем переменные окружения пользователя root. Т.е. скрипты нужны переменные окружения того пользователя для которого определяется DE. Ведь user1 може запустить KDE, а пользователь user2 одновременно с ним -- Gnome.
ЗЫ. Извиняюсь, что сумбурно...
-
romkaromka
- Сообщения: 1064
- ОС: Mageia
Re: Как получить имя текущей запущенной среды рабочего стола ?
Значит, скрипт, если он запущен под root, должен уметь вычислять всех пользователей и определять какой пользователь с каким DE.
Консоль на мыло. Надо развивать графику.
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Как получить имя текущей запущенной среды рабочего стола ?
romkaromka писал(а): ↑04.01.2012 00:35Значит, скрипт, если он запущен под root, должен уметь вычислять всех пользователей и определять какой пользователь с каким DE.
Один и тот же пользователь может быть запущен со стопицот различными (или одинаковыми) DE. Скорее такой супер-универсальный скрипт должен определять на основании Display - какой пользователь и какой DE/WM. При этом Display - уникально, а пользователь и DE/WM - нет.