如果未从终端启动,GTK +独立菜单不会关闭

时间:2018-09-21 16:29:56

标签: c gtk gtk2

以下程序始终可以正常工作-仅显示一个菜单项-如果从终端启动,但如果由i3窗口管理器直接启动(绑定到键)则不可以。

在后一种情况下,大多数情况下,它确实会打印“进入gtk主循环”。虽然每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;
}

1 个答案:

答案 0 :(得分:0)

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

我看到的一个技巧是响应GtkApplication的{​​{1}}信号切换到gtk_menu_popup并运行GtkApplication。那时您已经处于主循环中。