GUI не отображается при обработке аргументов командной строки - PullRequest
0 голосов
/ 25 сентября 2018

Проблема в том, что программа просто обрабатывает аргументы командной строки и завершает работу, а не отображает графический интерфейс.

Например:

#include <gtk/gtk.h>

static gint print_cmd_arg(GApplication *app, GApplicationCommandLine *app_cmd, int *argc)
{
    if (*argc > 1)
    {
        char **argv = g_application_command_line_get_arguments(app_cmd, argc);
        GFile *file = g_file_new_for_commandline_arg(argv[1]);

        if (g_file_query_exists(file, NULL))
        {
            char *text;
            g_file_load_contents(file, NULL, &text, NULL, NULL, NULL);
            g_print("%s", text);
            g_free(text);
            g_object_unref(file);
            return 0;
        }
        else
        {
            g_print("File \'%s\' does not exist.\n", argv[1]);
            g_object_unref(file);
            return 1;
        }
    }
    return 2;
}

static void activation(GtkApplication *app, gpointer user_data)
{
    GtkWidget *window = gtk_application_window_new(app);
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS);
    gtk_window_set_title(GTK_WINDOW(window), "Test");
    g_signal_connect(window, "delete-event", G_CALLBACK(gtk_widget_destroy), NULL);

    GtkWidget *button = gtk_button_new_with_label("Quit");
    g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window);

    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    gtk_container_add(GTK_CONTAINER(window), button);

    gtk_widget_show_all(window);
}

int main(int argc, char **argv)
{
    int status;
    GtkApplication *test = gtk_application_new("this.is.only.a.test", G_APPLICATION_NON_UNIQUE | G_APPLICATION_HANDLES_COMMAND_LINE);
    g_signal_connect(test, "activate", G_CALLBACK(activation), NULL);
    g_signal_connect(G_APPLICATION(test), "command-line", G_CALLBACK(print_cmd_arg), &argc);
    status = g_application_run(G_APPLICATION(test), argc, argv);
    return status;
}

Попробуйте выполнить это, вы увидитечто эта программа полностью игнорирует функцию activation.

. Я хочу, чтобы эта программа обрабатывала аргументы командной строки и отображала графический интерфейс пользователя.

Кроме того, я знаю, что должен использовать g_application_command_line_set_exit_status () в print_cmd_arg вместо return s, но я не знаю, как это сделать и получить предупреждения компилятора.

1 Ответ

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

Обработка командной строки является сложным предметом в контексте GtkApplication / GApplication из-за дополнительной гибкости.

Если вы «переопределяете» обработку / анализ командной строки, то для этого будут доступны различные методы..

Информация на эту тему несколько разбросана в документации.Некоторые из них здесь:

  1. https://wiki.gnome.org/HowDoI/GtkApplication
  2. https://wiki.gnome.org/HowDoI/GtkApplication/CommandLine
  3. https://developer.gnome.org/gio//2.30/GApplication.html#g-application-run
  4. https://developer.gnome.org/gtk3/stable/GtkApplication.html
  5. https://developer.gnome.org/gtk3/stable/gtk-getting-started.html

С 1) вы можете прочитать:

Работа с командной строкой

Обычно GtkApplication будетПредположим, что аргументы, передаваемые в командной строке, являются файлами, которые нужно открыть.Если аргументы не передаются, то предполагается, что приложение запускается, чтобы показать его главное окно или пустой документ.В случае, если файлы были переданы, вы получите эти файлы (в форме GFile) из сигнала открытия.В противном случае вы получите сигнал активации.Рекомендуется, чтобы новые приложения использовали эту стандартную обработку аргументов командной строки.

Если вы хотите иметь дело с аргументами командной строки более сложными способами, есть несколько (дополнительных) механизмов, с помощью которых вы можете сделать это.

И важный бит:

Обратите внимание, в частности, что можно использовать активацию действий вместо активации или открытия.Вполне разумно, чтобы приложение могло запускаться без сигнала активации. активировать должен только сигнал по умолчанию «запущен без опций» .Действия предназначены для использования для чего-либо еще.

Итак, существуют различные способы обработки аргументов.Вопросы касаются того, как и что вы пытаетесь сделать.Если аргументы являются файлами, то, возможно, обработайте их с помощью сигнала open и избегайте обработки командной строки.

Чтобы решить реальную проблему, как вы можете заключить, активация не будет запущена, но вы можете сделать это, используя g_application_activate в обратном вызове командной строки, например:

static gint print_cmd_arg(GApplication *app, GApplicationCommandLine *app_cmd, int *argc)
{
    /* ADD THIS TO YOUR CODE */
    g_application_activate(app);
    /* ENDS HERE */

    if (*argc > 1)
    {
        char **argv = g_application_command_line_get_arguments(app_cmd, argc);
        GFile *file = g_file_new_for_commandline_arg(argv[1]);

        if (g_file_query_exists(file, NULL))
        {
            char *text;
            g_file_load_contents(file, NULL, &text, NULL, NULL, NULL);
            g_print("%s", text);
            g_free(text);
            g_object_unref(file);
            return 0;
        }
        else
        {
            g_print("File \'%s\' does not exist.\n", argv[1]);
            g_object_unref(file);
            return 1;
        }
    }
    return 2;
}
...