![如何检测 appmenu 是否处于活动状态?](https://linux22.com/image/1105885/%E5%A6%82%E4%BD%95%E6%A3%80%E6%B5%8B%20appmenu%20%E6%98%AF%E5%90%A6%E5%A4%84%E4%BA%8E%E6%B4%BB%E5%8A%A8%E7%8A%B6%E6%80%81%EF%BC%9F.png)
是否可以从应用程序中检查其菜单是否显示在窗口中或面板中(AppMenu)?
我当然可以检查环境是否是 Unity,但有些人在 KDE 或经典 GNOME 中使用 AppMenu,所以我正在寻找更通用的方法。
我更喜欢一种适合 C 语言并在 Ubuntu 11.10 中运行的方式。
答案1
以下是适用于任何 Linux 发行版的更完整的答案:
static int menu_proxy = -1;
typedef void *(*KVoidPtoF)();
void *proxylib;
KVoidPtoF gtk_menu_proxy_get;
menu_proxy = 0;
proxylib = dlopen("libappmenu.so", RTLD_NOLOAD | RTLD_LAZY);
if (proxylib)
{
gtk_menu_proxy_get = (KVoidPtoF)dlsym(proxylib,
"ubuntu_menu_proxy_get");
if (gtk_menu_proxy_get && (*gtk_menu_proxy_get)() != 0)
menu_proxy = 1;
}
答案2
我在这里找到了一个更好的解决方案:https://wiki.ubuntu.com/MenuBar#Advertising_the_presence_of_the_menu_bar。
答案3
我不确定如何具体检查 Qt 模块。要查找 GTK 模块,您可以查找环境变量 UBUNTU_MENUPROXY。如果您想确保菜单出现在应用程序中(并且如果可能的话被导出),那么您可以将 APPMENU_DISPLAY_BOTH 设置为 1。如果您想查看 indicator-appmenu 主机是否正在使用菜单,您可以在 DBus 上查找众所周知的名称“com.canonical.AppMenu.Registrar”。如果它存在,则它正在托管菜单。