GTK + автономное меню не получает shdown, если не запускается из терминала - PullRequest
0 голосов
/ 21 сентября 2018

Следующая программа всегда работает нормально - показывает меню с одним элементом - если запущено из терминала, но не если запущено оконным менеджером i3 напрямую (при привязке к клавише).

В последнемВ большинстве случаев он выводит «Вход в основной цикл gtk», но затем просто не получает 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;
}

1 Ответ

0 голосов
/ 27 сентября 2018

Я подозреваю, что вызов gtk_menu_popup до gtk_main приведет к странному поведению.Вы не меняете данные, как gtk_widget_show_all, который меняет флаг, вы на самом деле пытаетесь выполнить действий.

Один трюк, который я вижу, это переключиться на GtkApplication и запустить gtk_menu_popup в ответ на сигнал GtkApplication s activate.В это время вы уже находитесь в основном цикле.

...