如何确定正在运行的窗口管理器

是否有任何方法(例如命令或环境变量)来确定哪个窗口管理器是在当前会话中主动运行的窗口管理器

如果你安装了wmctrl ,那么命令的第一行输出

  wmctrl -m 

将显示窗口管理器的名称。 如果您没有安装wmctrl ,请使用以下命令进行安装:

  sudo apt-get install wmctrl 

注意, man wmctrl (也就是man wmctrlman页)部分说:

-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-2decho $XDG_CURRENT_DESKTOP显示Unity

在旧笔记本电脑上安装新的Ubuntu 15.10 Ubuntu desktop软件时, wmctrl -m的第一行输出是: Name: Compiz
DESKTOP_SESSIONXDG_CURRENT_DESKTOP值是ubuntuUnity

在Linux系统上,我测试了环境变量XDG_CURRENT_DESKTOPGDMSESSION ,得到了以下结果。

您可以使用此行来获取输出:

 printf 'Desktop: %s\nSession: %s\n' "$XDG_CURRENT_DESKTOP" "$GDMSESSION" 

Ubuntu 18.04(Ubuntu)

  • XDG_CURRENT_DESKTOP=ubuntu:GNOME
  • GDMSESSION=ubuntu

Ubuntu 18.04(Wayland上的Ubuntu)

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

Ubuntu 16.04


团结(7)

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

Ubuntu 14.04


团结与Mir一起运行

  • XDG_CURRENT_DESKTOP=Unity
  • GDMSESSION=ubuntu

注意MIR_SERVER_NAME也已设置

  • MIR_SERVER_NAME=session-$NUMBER

Unity没有Mir运行

  • 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

Gnome Classic

  • 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

在终端类型env中查看所有环境变量。 他们之中有一些是:

XDG_CURRENT_DESKTOP – 告诉您正在使用的桌面环境

GDMSESSION – 告诉您从lightdm greeter中选择的选项以进行登录。

要使用它们,请转到终端并键入:

 echo $XDG_CURRENT_DESKTOP 

(如果使用Unity,将输出例如’unity’)

要么

 echo $GDMSESSION 

(如果您在登录中选择了ubuntu,则输出例如’ubuntu’,如果您在登录中选择了ubuntu,则输出’ubuntu-2d’。)

如果你仔细观察像DESKTOP_SESSIONCOMPIZ_CONFIG_PROFILE这样的env的输出,你还有其他人

因为您正在寻找的是Window Manager正在使用的名称,所以我看到如何获得这个的唯一方法是查看进程列表。 要做到这一点,有一个名为pgrep ( 维基百科 )的命令。 我执行以下操作来获取名称,因为参数-l添加了进程ID:

pgrep -l compiz |cut -d " " -f2因为进程由同一个用户运行,所以不需要为sudo部分添加前缀。 然后,您可以使用此脚本创建基于Window Manager执行操作的脚本。

要查找其他类型,只需将单词compiz更改为另一个类似mutterkwin等。

我发现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 

我一直在测试KDE,我的结论是:

a)图形方式,使用HardInfo:答案通常在“操作系统”>“桌面环境”中,但如果不是,则可以查看“环境变量”。 HardInfo已经准备好了所有经过测试的发行版,除了使用KDE的发行版之外,它可以轻松快速地安装(Linux Mint 13中只有2个软件包)。

b)命令行,使用以下命令: ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm" ps -A | egrep -i "gnome|kde|mate|cinnamon|lx|xfce|jwm" 。 出现在更多行中的项目应该是答案(如果有绘图,则具有“会话”的项目应该是解决方案)。

以上这些都不适合我,我只是想知道我是否将Gnome作为我当前的桌面会话运行。

这是有效的,打开一个终端

 lsb_release -a 

(检查我在UBUNTU机器上安装的风味或版本)

 ls /usr/bin/*session 

(启动当前正在使用的桌面会话/桌面环境)

 gnome-shell --version 

(找出安装了哪个版本的gnome)

以下脚本是我在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" 

使用dbus和Accounts Service(默认情况下在Ubuntu中)都可以实现这一点。

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

值得注意的是,我通过lightdm(即图形登录屏幕)登录进行了测试,它确实检测到了像blackbox这样的经典桌面,并且显然检测到了Unity。 我怀疑这是用户在登录屏幕上选择的会话值,这就是为什么使用检查流程更容易的原因

我只能想到在正在运行的进程中检查已知的窗口管理器。 曾经有一个设置为首选窗口管理器的gconf中的密钥,但是自Gnome 2.12以来它已被弃用。

所以,如果这是出于编程目的,我建议你研究一下所有的linux窗口管理器; 一些流行的是:

  • GNOME壳*
  • Compiz的
  • 的metacity
  • 咕哝
  • 锯鳐

您必须使用命令pgrep -l $WINDOW_MANAGER为每个运行检查,其中$WINDOW_MANAGER是您要检查的窗口管理器的名称。 pgrep命令检查正在运行的进程。

如果Gnome Shell被视为窗口管理员,我不是100%肯定; 我从/usr/bin/gnome-wm脚本中的列表中获取的其余窗口管理器。 事实上这个脚本应该是可用的(因为它在干净安装时出现),但在我的情况下,它试图运行compiz ,这不是我的默认窗口管理器(不在我的Gnome会话中)。

编辑:

那么@Anarci的评论似乎更准确。 在我的情况下它确实显示了gnome-shell