我正在尝试检测我是否在Gnome或KDE桌面环境中运行。我知道我可以通过ps -aux和grepping检查gnome或KDE,但这不太好:1)如果我在一个gnome桌面上,但我已经加载了KDE库,该怎么办?2)我需要从代码中完成,而不使用system()或popen()或其他fork/exec组合。我可以读取文件,或环境变量或任何东西。有什么想法吗?谢谢,任何帮助都是感激不尽的。
pokxtpni1#
不知道这是多么标准,但它在Fedora 21,Slackware 14.1和Ubuntu 14.04中是一致的。尝试
$ echo $DESKTOP_SESSION
希望这对你有帮助。
1szpjjfi2#
至少在Openuse上有环境变量WINDOWMANAGER、WINDOW_MANAGER
eike@lixie:~> echo $WINDOWMANAGER /usr/bin/startkde eike@lixie:~> echo $WINDOW_MANAGER /usr/bin/startkde eike@lixie:~>
g6ll5ycj3#
选择一组您关心的窗口管理器:metacity,xfwm 4,flwm等等。你可以在ps的grep中查找这些文件(或者在/proc中搜索)。Gnome库并不一定意味着有人在运行整个Gnome桌面环境,但是Gnome和KDE并不是窗口管理器。如果WM是你所关心的,那就去找它们。
ps
gajydyqb4#
如果你不介意看起来不一致的UI,你可以静态地链接你的窗口工具包。它仍然会工作得很好。你也可以简单地捆绑共享库,并确保LD_LIBRARY_PATH指向它们。如果你真的想实现一些可以动态链接到不同工具包的东西,你可以尝试dlopen/dlsym,但那将是疯狂的。如果您关心跨平台/跨小部件工具包的一致性,那么最好的选择是呈现看起来像本机的小部件; Swing可以将相同的代码呈现为GTK或Windows的样子。我知道您没有使用Java,但在C中没有简单的解决方案(Swing只能让您完成一半,因为它不支持Qt)。
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; }
5条答案
按热度按时间pokxtpni1#
不知道这是多么标准,但它在Fedora 21,Slackware 14.1和Ubuntu 14.04中是一致的。
尝试
希望这对你有帮助。
1szpjjfi2#
至少在Openuse上有环境变量WINDOWMANAGER、WINDOW_MANAGER
g6ll5ycj3#
选择一组您关心的窗口管理器:metacity,xfwm 4,flwm等等。你可以在
ps
的grep中查找这些文件(或者在/proc中搜索)。Gnome库并不一定意味着有人在运行整个Gnome桌面环境,但是Gnome和KDE并不是窗口管理器。如果WM是你所关心的,那就去找它们。gajydyqb4#
如果你不介意看起来不一致的UI,你可以静态地链接你的窗口工具包。它仍然会工作得很好。你也可以简单地捆绑共享库,并确保LD_LIBRARY_PATH指向它们。如果你真的想实现一些可以动态链接到不同工具包的东西,你可以尝试dlopen/dlsym,但那将是疯狂的。
如果您关心跨平台/跨小部件工具包的一致性,那么最好的选择是呈现看起来像本机的小部件; Swing可以将相同的代码呈现为GTK或Windows的样子。我知道您没有使用Java,但在C中没有简单的解决方案(Swing只能让您完成一半,因为它不支持Qt)。
u5rb5r595#
您可能会发现以下与常见DE对应的env变量值列表很有用:
AskUbuntu answer
简而言之:检查环境变量值:
XDG_CURRENT_DESKTOP
GDMSESSION
Bash示例:
C++示例: