问题在于程序只处理命令行参数并退出,而不显示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
,但是我不知道该怎么做并得到编译器警告。
答案 0 :(得分:1)
由于增加了灵活性,在GtkApplication / GApplication上下文中,处理命令行是一个复杂的主题。
如果您要“覆盖”命令行处理/解析,则可以使用多种方法进行操作。
有关此主题的信息在文档中有些分散。其中一些是在这里:
在 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;
}