【问题标题】:GTK+ standalone menu does not get shdown if not launched from terminal如果不是从终端启动,GTK+ 独立菜单不会关闭
【发布时间】:2018-09-21 16:29:55
【问题描述】:

如果从终端启动,但如果直接由 i3 窗口管理器启动(绑定到键时),则以下程序始终可以正常运行 - 显示带有一项的菜单。

在后一种情况下,大多数情况下它会打印“Entering gtk main loop.”,但随后根本不会关闭;虽然大约每 20 次按键会显示一次!

为什么?

#include <gtk/gtk.h>
#include <stdio.h>

static
void
deactivate_handler(GtkMenuShell *instance, gpointer user_data)
{
    (void) instance; (void) user_data; // unused parameters
    gtk_main_quit();
}

int
main(int argc, char **argv)
{
    gtk_init(&argc, &argv);

    GtkWidget *menu = gtk_menu_new();

    GtkWidget *item = gtk_menu_item_new_with_label("Test");
    gtk_menu_attach(GTK_MENU(menu), item, 0, 1, 0, 1);

    g_signal_connect(menu, "deactivate", G_CALLBACK(deactivate_handler), NULL);

    gtk_widget_show_all(menu);

    gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time());

    fprintf(stderr, "Entering gtk main loop.\n");

    gtk_main();

    return 0;
}

【问题讨论】:

  • 无关,但有用:使用 GLib 中的 G_GNUC_UNUSED 宏将参数标记为未使用。

标签: c gtk gtk2


【解决方案1】:

我怀疑在gtk_main 之前调用gtk_menu_popup 会导致奇怪的行为。您没有更改数据,例如更改标志的gtk_widget_show_all,您实际上是在尝试执行操作。

我看到的一个技巧是切换到GtkApplication 并运行gtk_menu_popup 以响应GtkApplicationactivate 信号。那时你已经在主循环中了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多