用C语言编程检测Linux中的桌面环境

luaexgnf  于 2022-11-22  发布在  Linux
关注(0)|答案(5)|浏览(146)

我正在尝试检测我是否在Gnome或KDE桌面环境中运行。
我知道我可以通过ps -aux和grepping检查gnome或KDE,但这不太好:1)如果我在一个gnome桌面上,但我已经加载了KDE库,该怎么办?2)我需要从代码中完成,而不使用system()或popen()或其他fork/exec组合。
我可以读取文件,或环境变量或任何东西。
有什么想法吗?
谢谢,任何帮助都是感激不尽的。

pokxtpni

pokxtpni1#

不知道这是多么标准,但它在Fedora 21,Slackware 14.1和Ubuntu 14.04中是一致的。
尝试

$ echo $DESKTOP_SESSION

希望这对你有帮助。

1szpjjfi

1szpjjfi2#

至少在Openuse上有环境变量WINDOWMANAGER、WINDOW_MANAGER

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

g6ll5ycj3#

选择一组您关心的窗口管理器:metacity,xfwm 4,flwm等等。你可以在ps的grep中查找这些文件(或者在/proc中搜索)。Gnome库并不一定意味着有人在运行整个Gnome桌面环境,但是Gnome和KDE并不是窗口管理器。如果WM是你所关心的,那就去找它们。

gajydyqb

gajydyqb4#

如果你不介意看起来不一致的UI,你可以静态地链接你的窗口工具包。它仍然会工作得很好。你也可以简单地捆绑共享库,并确保LD_LIBRARY_PATH指向它们。如果你真的想实现一些可以动态链接到不同工具包的东西,你可以尝试dlopen/dlsym,但那将是疯狂的。
如果您关心跨平台/跨小部件工具包的一致性,那么最好的选择是呈现看起来像本机的小部件; Swing可以将相同的代码呈现为GTK或Windows的样子。我知道您没有使用Java,但在C中没有简单的解决方案(Swing只能让您完成一半,因为它不支持Qt)。

u5rb5r59

u5rb5r595#

您可能会发现以下与常见DE对应的env变量值列表很有用:
AskUbuntu answer
简而言之:检查环境变量值:

  • XDG_CURRENT_DESKTOP
  • GDMSESSION

Bash示例:

# Corresponding variables in bash which also can be obtained form C++
echo "XDG_CURRENT_DESKTOP=$XDG_CURRENT_DESKTOP"
echo "GDMSESSION=$GDMSESSION"

C++示例:

#include <cstdlib>
#include <iostream>

int main() {

    std::cout << std::getenv("XDG_CURRENT_DESKTOP") << '\n';
    std::cout << std::getenv("GDMSESSION") << '\n';

    return 0;

}

相关问题