Как получить имя текущей запущенной среды рабочего стола ? (Нужно для программы)

Модератор: Модераторы разделов

Ism
Сообщения: 1261
Статус: Никто, по сути быдло

Как получить имя текущей запущенной среды рабочего стола ?

Сообщение Ism »

Привет, вопрос такой

Как получить имя текущей запущенной среды рабочего стола ?
Конечно можно ориентироваться по именам запущенных процессов, но в этом способе нет уверенности.

Есть ли еще способы, в консоли или из программы узнать , какой рабочий стол (kde gnome unity) запущен в данный момент ?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение serzh-z »

Как минимум для GNOME/KDE - это $DESKTOP_SESSION.
Спасибо сказали:
Ism
Сообщения: 1261
Статус: Никто, по сути быдло

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение Ism »

Спасибо.

Проверил в unity , работает.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение eddy »

serzh-z писал(а):
30.12.2011 00:43
Как минимум для GNOME/KDE - это $DESKTOP_SESSION.

А если используется xdm?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение /dev/random »

Взято из скрипта /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: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение NickLion »

Ох, ненадёжно это:

Код: Выделить всё

nicklion@warlock:~> echo $DESKTOP_SESSION
default

А запущен KDE SC 4.8 RC.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение /dev/random »

NickLion писал(а):
30.12.2011 17:59
Ох, ненадёжно это:

Именно. Эту переменную следует использовать только в крайнем случае, если все остальные способы провалились. См. приведённый мной код.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение NickLion »

/dev/random писал(а):
30.12.2011 18:11
NickLion писал(а):
30.12.2011 17:59
Ох, ненадёжно это:

Именно. Эту переменную следует использовать только в крайнем случае, если все остальные способы провалились. См. приведённый мной код.

А как этот код отработает для того же Unity? Я так понял этот код пытается выловить KDE, GNOME, XFCE, LXDE и всё. Ну, ещё распознаёт GNOME 2/3. А вот KDE 3/4 - нет, судя по коду. Так что пилить и пилить :)
Спасибо сказали:
Ism
Сообщения: 1261
Статус: Никто, по сути быдло

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение Ism »

хм, приведенный скрипт в unity выдает gnome3 тогда как
echo $DESKTOP_SESSION
ubuntu-2d

Спасибо сказали:
Ism
Сообщения: 1261
Статус: Никто, по сути быдло

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение Ism »

Подкрутил скрипт , теперь определяет 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: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение /dev/random »

Ism писал(а):
02.01.2012 21:20
хм, приведенный скрипт в unity выдает gnome3 тогда как
echo $DESKTOP_SESSION
ubuntu-2d


В unity переменная $XDG_CURRENT_DESKTOP должна быть равна "Unity" (первая буква заглавная, остальные строчные). Добавьте это в первый case, и всё прекрасно распознается. Этот скрипт просто не знает о существовании unity. Натыкается в первом блоке на неизвестное имя, игнорирует его и переходит ко второму. А там уже по косвенным признакам решает, что это гном, т.к. технически у гнома и юнити больше сходств, чем различий.

А в $DESKTOP_SESSION _некоторые_ менеджеры логина устанавливают имя скрипта или .desktop-файла, с помощью которого запускают DE. Мало того, что для одних и тех же DE этот файл может называться по-разному в разных дистрибутивах, так ещё и не все менеджеры логина заморачиваются установкой этой переменной. Поэтому её следует использовать лишь в крайних случаях.

UPD: опоздал немного с сообщением
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение drBatty »

Ism
у меня пустую строчку выдаёт ваш код. IceWM.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ism
Сообщения: 1261
Статус: Никто, по сути быдло

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение Ism »

Ism
у меня пустую строчку выдаёт ваш код. IceWM.


А что выдает
echo ${XDG_CURRENT_DESKTOP}

кроме того этот скрипт не выдает ничего под root , во всяком случае в ubuntu , а под юзером нормально
ничего не пойму

под юзером echo ${XDG_CURRENT_DESKTOP} работает, под root нет.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5489
ОС: Gentoo

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение /dev/random »

drBatty писал(а):
02.01.2012 23:41
Ism
у меня пустую строчку выдаёт ваш код. IceWM.

Само собой. IceWM - это WM, а не DE. Вот если взять какое-нибудь DE, и заменить в нём нативный WM на ваш IceWM, то это DE и должно определяться. У вас же никакого DE просто не запущено.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение drBatty »

/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
то вполне себе даже запущено.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Ism
Сообщения: 1261
Статус: Никто, по сути быдло

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение Ism »

я запускаю скрипт из gui unity в gui терминале. под юзером echo ${XDG_CURRENT_DESKTOP} выдает unity

пытался sudo -u ny_user echo ${XDG_CURRENT_DESKTOP} все равно пусто, есть ли какой нибудь способ заставить корректно выдавать DE из под root ?
насколько я понимаю эта штука берет чтото из окружения , а под root этого нет .
можно ли из под рута заставить корректно работать echo ${XDG_CURRENT_DESKTOP} ?
Спасибо сказали:
Ism
Сообщения: 1261
Статус: Никто, по сути быдло

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение Ism »

нашел , вот так работает

sudo -E echo ${XDG_CURRENT_DESKTOP}
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение sash-kan »

Ism писал(а):
03.01.2012 00:35
нашел , вот так работает

sudo -E echo ${XDG_CURRENT_DESKTOP}
"sudo -E" — здесь лишнее·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Ism
Сообщения: 1261
Статус: Никто, по сути быдло

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение Ism »

без -E
sudo ./detect.sh не работает, скорее потому, что sudo без -E отбрасывает какието переменные окружения

а root сессия не знает какой DE запущен
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение sash-kan »

Ism писал(а):
03.01.2012 01:58
а root сессия не знает какой DE запущен
знает·
на основании списка процессов·
а вот переменные окружения (типа той же XDG_CURRENT_DESKTOP), установленные этими самыми процессами, доступны только их прямым потомкам·
процессы же всех остальных пользователей получают, естественно, совершенно иное окружение·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
romkaromka
Сообщения: 1064
ОС: Mageia

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение romkaromka »

Как скрипт поправить чтобы под root тоже он работал? Ведь если root знает, то и скрипт должен знать.
Консоль на мыло. Надо развивать графику.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение NickLion »

Из-под другого пользователя смотреть - не совсем хорошая задача. Если сохранено окружение (как в случае sudo -E), то всё норм. Ориентироваться на список процессов нехорошо - может быть одновременно запущено несколько сессий с разными DE. Значит надо ориентироваться на $DISPLAY, но не представляю что делать дальше. Из программы можно вызвать что-то вроде XGetWMName, но это тоже немного не то (как уже говорили DE может быть одно, а WM другой).
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение sciko »

Ism писал(а):
03.01.2012 01:58
без -E
sudo ./detect.sh не работает, скорее потому, что sudo без -E отбрасывает какието переменные окружения

а root сессия не знает какой DE запущен
Всё правильно. Ведь скорее всего в данный момент у пользователя root ни один DE не запущен. Запуская ваш sudo без -E, получаем переменные окружения пользователя root. Т.е. скрипты нужны переменные окружения того пользователя для которого определяется DE. Ведь user1 може запустить KDE, а пользователь user2 одновременно с ним -- Gnome.

ЗЫ. Извиняюсь, что сумбурно...
Спасибо сказали:
Аватара пользователя
romkaromka
Сообщения: 1064
ОС: Mageia

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение romkaromka »

Значит, скрипт, если он запущен под root, должен уметь вычислять всех пользователей и определять какой пользователь с каким DE.
Консоль на мыло. Надо развивать графику.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Как получить имя текущей запущенной среды рабочего стола ?

Сообщение NickLion »

romkaromka писал(а):
04.01.2012 00:35
Значит, скрипт, если он запущен под root, должен уметь вычислять всех пользователей и определять какой пользователь с каким DE.

Один и тот же пользователь может быть запущен со стопицот различными (или одинаковыми) DE. Скорее такой супер-универсальный скрипт должен определять на основании Display - какой пользователь и какой DE/WM. При этом Display - уникально, а пользователь и DE/WM - нет.
Спасибо сказали: