Как я могу установить код состояния приложения GTK после выхода? - PullRequest
1 голос
/ 17 марта 2020

Я пишу приложение, которое использует GTK для создания GUI.

. В приведенном ниже примере кода функция run_gui запускает приложение GTK.

Когда что-то идет неправильно в одном из обработчиков событий, я хотел бы закрыть приложение GTK, и я бы хотел run_gui знать, что приложение закрылось из-за сбоя. Кажется, что естественный способ сделать это - заставить g_application_run возвращать определенный код состояния по возвращении.

Я узнал, что подходящим способом закрыть приложение будет вызов g_quit_application из обработчика события ( поправьте пожалуйста если не так). Тем не менее, я хотел бы знать, как я могу установить код состояния, возвращаемый из g_application_run, чтобы run_gui мог проверить его и действовать соответствующим образом.

Код для иллюстрации того, что я хочу сделать:

#include <gtk/gtk.h>

static void activate(GtkApplication* app, gpointer user_data) {
    GtkWidget* window = gtk_application_window_new (app);
    gtk_window_set_title(GTK_WINDOW(window), "Window");
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
    gtk_widget_show_all(window);

    bool success = do_something();

    if (!success) {
        /* How do I set the exit status of the GTK app? */
        g_application_quit(G_APPLICATION(app));
    }
}

void run_gui(void) {
    GtkApplication* app = gtk_application_new("my.app", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);

    int status = g_application_run(G_APPLICATION(app), 0, NULL);
    g_object_unref(app);

    if (status == 0) {
        /* Do something about success */
    } else {
        /* Do something about failure */
    }
}

1 Ответ

0 голосов
/ 18 марта 2020

Единственная часть GApplication, которая позволяет вам возвращать код выхода, это GApplication::local_command_line(); в противном случае GApplication вернет 1 для любого внутреннего сбоя или 0 для успеха.

Если у вас есть статус выхода после активации, вам придется с ним справиться самостоятельно.

Помните: активация выполняется на текущем запущенном экземпляре. Только запущенный в данный момент процесс отправит активацию - любой дополнительный экземпляр немедленно прекратит работу.

...