Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中以编程方式检测Linux中的桌面环境_C_Linux_Desktop_Environment - Fatal编程技术网

在C中以编程方式检测Linux中的桌面环境

在C中以编程方式检测Linux中的桌面环境,c,linux,desktop,environment,C,Linux,Desktop,Environment,我试图检测我是在Gnome还是KDE桌面环境上运行 我知道我可以通过ps-aux检查gnome或KDE,但这并不好:1)如果我在gnome桌面上,但我已经加载了KDE库怎么办?2) 我需要在不使用system()或popen()或其他fork/exec组合的情况下从代码开始执行 我可以读取文件或环境。变量之类的 有什么想法吗 谢谢,非常感谢您的帮助。至少在Opensuse上有环境变量WINDOWMANAGER、WINDOW\u MANAGER eike@lixie:~> echo $WIN

我试图检测我是在Gnome还是KDE桌面环境上运行

我知道我可以通过ps-aux检查gnome或KDE,但这并不好:1)如果我在gnome桌面上,但我已经加载了KDE库怎么办?2) 我需要在不使用system()或popen()或其他fork/exec组合的情况下从代码开始执行

我可以读取文件或环境。变量之类的

有什么想法吗


谢谢,非常感谢您的帮助。

至少在Opensuse上有环境变量WINDOWMANAGER、WINDOW\u MANAGER

eike@lixie:~> echo $WINDOWMANAGER
/usr/bin/startkde
eike@lixie:~> echo $WINDOW_MANAGER
/usr/bin/startkde
eike@lixie:~>

选择一组您关心的窗口管理器:metacity、xfwm4、flwm等。您可以在
ps
(或通过/proc搜索)的grep中查找这些窗口管理器。Gnome库并不一定意味着有人在运行整个Gnome桌面环境,但是Gnome和KDE不是窗口管理器。如果WMs是您所关心的,请查找它们。

如果您不介意外观不一致的UI,您可以静态链接窗口工具包。它仍然可以正常工作。您还可以简单地捆绑共享库,并确保LD_LIBRARY_路径指向它们。如果您真的想要实现动态链接到不同工具包的东西,您可以尝试使用dlopen/dlsym,但那太疯狂了


如果您关心跨平台/跨窗口小部件工具包的一致性,那么最好的选择是呈现本地窗口小部件本身;Swing可以使相同的代码看起来像GTK或Windows。我知道你没有使用Java,但C语言中没有简单的解决方案(Swing只会让你走到一半,因为它不支持Qt)。

不确定这有多标准,但它在Fedora21、Slackware 14.1和Ubuntu 14.04中是一致的。(更欢迎)

试一试


希望这有帮助。

如果是xfce怎么办?离子?wmii?dwm…?既然您只想检测gnome和kde,那么是否有一组特定的发行版或配置是您的目标?解决方案的通用性如何?为什么要这样做?有可能你正走在一条考虑不周的小路上…@杰西卡:我不能代表任何人说话,但我问为什么,因为我想帮忙。有时人们会问“我怎么做Foo?”当他们的意思是“我想完成Bar,并且一直在尝试Foo。”当Bar更好地由一些非Foo方法处理时。我不知道你从哪里挖到“恶意”的。你想向用户展示什么程序,为什么?也许可以使用XDG中的一个东西来找出用户喜欢哪些程序并展示它们,这样即使他们是喜欢某些KDE应用程序的GNOME用户,你也总能找到正确的答案。我只需要知道我是否正在使用任何一个桌面运行。原因是,我可以向用户提供一个基于该信息运行某些程序的选项,但是我的程序是一个简单的命令行,没有链接到QT或GTK。如果使用处理列表,则会出现一些不好的情况。仅仅因为当前用户正在运行[Gnome | KDE],并不意味着该进程附加到该显示器上(用户可以运行多个X会话,并且可以在其中使用不同的桌面环境和窗口管理器)…我知道这一点。因此,这里的问题可能是我没有正确地解释自己:有没有办法知道我是在gnome环境还是KDE上运行的?啊。在这种情况下,您可能希望将问题编辑为“桌面环境”而不是“窗口管理器”。不。如果我知道怎么做,我会这么说,而不是试图让你澄清你的问题。无论如何,谢谢。这应该很容易,但由于某些原因,它相当简单complex@Jessica当前位置是什么让你认为这应该很容易?Linux没有“我在运行什么GUI?”的系统级概念,因为GUI只是另一个用户进程。也就是说,你可以看看,如果这还不够的话,我会问用户。真正地
 $ echo $DESKTOP_SESSION