c - 如果不从终端启动,GTK+ 独立菜单不会被 shdown

标签 c gtk gtk2

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

在后一种情况下,大多数时候它会打印“Entering gtk main loop.”,但随后根本不会被 shdown;虽然大约每 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;
}

最佳答案

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

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

关于c - 如果不从终端启动,GTK+ 独立菜单不会被 shdown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52447825/

相关文章:

python - Pygtk:CellRenderer 耗尽所有垂直空间

c - C 语言中的简单密码提示

gtk - Libtool 认为是 "library was moved"但事实并非如此

c - 如何在不显示的情况下获取最大化窗口的大小?

c - (初学者 c GUI 程序)GTK+ 和 C 程序在显示图标时遇到问题

c - 如何使用 gtk3 在 gtk_dialog 窗口中打包小部件

c - 基于用户的 if 语句

c - 不明白这段代码是如何缩放bmp图像的

c - 在 arm-none-eabi-gcc 中使用显式字节顺序进行复制的优化

python - 如何在 GTK+2 中的表格中拥有完整的彩色背景?