我有一个使用 gtk3 在 Ubuntu 22.04 上构建的测试应用程序,它基本上执行以下操作来创建带有附加菜单的状态图标:
#include <gtk/gtk.h>
//#include <glib/glib.h>
static void trayExit(GtkMenuItem *item,
gpointer user_data)
{
printf("Quit\n");
gtk_main_quit();
}
static void trayIconOnClick(GtkStatusIcon* statusIcon,
gpointer trayMenu)
{
printf("Clicked on tray icon\n");
gtk_menu_popup_at_pointer(GTK_MENU(trayMenu), nullptr);
}
static void trayIconOnMenu(GtkStatusIcon* statusIcon,
guint button,
guint activateTime,
gpointer trayMenu)
{
printf("Popup menu\n");
gtk_menu_popup(GTK_MENU(trayMenu), nullptr, nullptr,
gtk_status_icon_position_menu, statusIcon,
button, activateTime);
}
static GtkWidget* createTrayMenu()
{
auto* menu = gtk_menu_new();
auto* menuItemExit = gtk_menu_item_new_with_label ("Exit");
g_signal_connect(G_OBJECT(menuItemExit), "activate", G_CALLBACK(trayExit), nullptr);
gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuItemExit);
gtk_widget_show_all(menu);
return menu;
}
static GtkStatusIcon *createTrayIcon()
{
auto* trayMenu = createTrayMenu();
auto* trayIcon = gtk_status_icon_new();
g_signal_connect(G_OBJECT(trayIcon), "activate",
G_CALLBACK(trayIconOnClick), trayMenu);
g_signal_connect(G_OBJECT(trayIcon),
"popup-menu",
G_CALLBACK(trayIconOnMenu), trayMenu);
gtk_status_icon_set_from_file(trayIcon, "/tmp/icon.png");
gtk_status_icon_set_visible(trayIcon, TRUE);
return trayIcon;
}
int main(int argc, char **argv)
{
gtk_init(0, nullptr);
auto trayIcon = createTrayIcon();
gtk_main();
return 0;
}
更多信息:
ubuntu: libgtk-3-dev
centos: gtk3-devel
g++ `pkg-config --cflags gtk+-3.0` -o main main.cpp `pkg-config --libs gtk+-3.0`
`pkg-config --cflags glib-2.0` `pkg-config --libs glib-2.0`
它在 22.04 上运行良好。但是,当我将应用程序复制到 20.04 时,状态图标不显示。应用程序正在运行,ldd 显示它正在链接到正确的库,等等。
Ubuntu 20.04 对状态图标的处理方式是否不同?我在 20.04 上安装了一些使用它们的应用程序,但我认为它们不是用 C 编写的。