如何检测 appmenu 是否处于活动状态?

如何检测 appmenu 是否处于活动状态?

是否可以从应用程序中检查其菜单是否显示在窗口中或面板中(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”。如果它存在,则它正在托管菜单。

相关内容