处理命令行参数时,GUI不显示

时间:2018-09-25 07:36:27

标签: c gtk gtk3

问题在于程序只处理命令行参数并退出,而不显示GUI。

例如:

#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

我想要这个程序要做的是同时处理命令行参数和显示GUI。

此外,我知道我应该在print_cmd_arg中使用g_application_command_line_set_exit_status()而不是return,但是我不知道该怎么做并得到编译器警告。

1 个答案:

答案 0 :(得分:1)

由于增加了灵活性,在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;
}