类
Gio ApplicationCommandLine
描述 [源]
class Gio.ApplicationCommandLine : GObject.Object
{
/* No available fields */
}
GApplicationCommandLine
代表应用程序的命令行调用。
它由 GApplication
创建,并在 GApplication::command-line
信号和虚拟函数中发出。
该类包含了程序调用的参数列表。同时还可以查询命令行调用是本地(即:当前进程是直接响应调用而运行)还是远程(即:某个其他进程将命令行转发到该进程)。
GApplicationCommandLine
对象可以提供 argc
和 argv
参数,用于与 GOptionContext
命令行解析 API 结合使用,通过 g_application_command_line_get_arguments()
函数。请参阅 [gapplication-example-cmdline3.c][gapplication-example-cmdline3] 中的示例。
可以设置最初调用的进程的退出状态,并将消息打印到该进程的 stdout 或 stderr。
对于远程调用,调用 g_application_command_line_done()
方法时,最初调用的进程会退出。当对象被回收时,此方法也会自动调用。
GApplicationCommandLine
(以及 GApplication::command-line
信号)的主要用途类似于“Emacs服务器”的使用场景:您可以设置 EDITOR
环境变量,例如让 git 使用您的喜欢的编辑器来编辑提交信息,如果您已经打开了编辑器的实例,编辑将在运行中的实例中进行,而不是打开一个新的实例。此用例的一个重要方面是 git 启动的进程将在编辑完成后才返回。
通常情况下,命令行在 GApplication::command-line
处理器中完全处理。一旦主实例中的信号处理器返回,启动实例就会退出,信号处理器的返回值将成为启动实例的退出状态。
static int
command_line (GApplication *application,
GApplicationCommandLine *cmdline)
{
gchar **argv;
gint argc;
gint i;
argv = g_application_command_line_get_arguments (cmdline, &argc);
g_application_command_line_print (cmdline,
"This text is written back\n"
"to stdout of the caller\n");
for (i = 0; i < argc; i++)
g_print ("argument %d: %s\n", i, argv[i]);
g_strfreev (argv);
return 0;
}
完整示例可在此处找到: gapplication-example-cmdline.c
在更复杂的情况下,命令行的处理可以分散在选择器和主实例之间。
static gboolean
test_local_cmdline (GApplication *application,
gchar ***arguments,
gint *exit_status)
{
gint i, j;
gchar **argv;
argv = *arguments;
if (argv[0] == NULL)
{
*exit_status = 0;
return FALSE;
}
i = 1;
while (argv[i])
{
if (g_str_has_prefix (argv[i], "--local-"))
{
g_print ("handling argument %s locally\n", argv[i]);
g_free (argv[i]);
for (j = i; argv[j]; j++)
argv[j] = argv[j + 1];
}
else
{
g_print ("not handling argument %s locally\n", argv[i]);
i++;
}
}
*exit_status = 0;
return FALSE;
}
static void
test_application_class_init (TestApplicationClass *class)
{
G_APPLICATION_CLASS (class)->local_command_line = test_local_cmdline;
...
}
在以下分步处理的示例中,以 --local-
开始的选项在本地处理,所有其他选项都将传递到主实例中运行 GApplication::command-line
处理器。
完整示例可在此处找到: gapplication-example-cmdline2.c
如果处理命令行需要大量工作,将其推迟可能更好。
static gboolean
my_cmdline_handler (gpointer data)
{
GApplicationCommandLine *cmdline = data;
// do the heavy lifting in an idle
g_application_command_line_set_exit_status (cmdline, 0);
g_object_unref (cmdline); // this releases the application
return G_SOURCE_REMOVE;
}
static int
command_line (GApplication *application,
GApplicationCommandLine *cmdline)
{
// keep the application running until we are done with this commandline
g_application_hold (application);
g_object_set_data_full (G_OBJECT (cmdline),
"application", application,
(GDestroyNotify)g_application_release);
g_object_ref (cmdline);
g_idle_add (my_cmdline_handler, cmdline);
return 0;
}
在此示例中,在 GApplication::command-line
处理器返回之前并不会完全处理命令行。相反,我们保留 GApplicationCommandLine
对象的引用,并在稍后(在本示例中,在空闲时)进行处理。请注意,需要保留应用程序直到你完成命令行处理。
完整示例可在此处找到: gapplication-example-cmdline3.c。
实例方法
g_application_command_line_get_environ
获取命令行调用的 ‘environ’ 变量的内容,就像 g_get_environ() 返回的那样,即作为形式为 ‘NAME=VALUE’ 的 NULL
终止字符串列表。这些字符串可能包含非 utf8 数据。
since: 2.28
g_application_command_line_get_exit_status
获取 cmdline
的退出状态。有关更多信息,请参阅 g_application_command_line_set_exit_status()
。
since: 2.28
g_application_command_line_getenv
获取命令行调用的特定环境变量的值,就像由 g_getenv() 返回的那样。这些字符串可能包含非 utf8 数据。
since: 2.28
信号
继承自GObject的信号(1个)
GObject::notify
当通过g_object_set_property(), g_object_set()等设置对象的一个属性时,将发出notify信号。
类结构
struct GioApplicationCommandLineClass {
void (* print_literal) (
GApplicationCommandLine* cmdline,
const gchar* message
);
void (* printerr_literal) (
GApplicationCommandLine* cmdline,
const gchar* message
);
GInputStream* (* get_stdin) (
GApplicationCommandLine* cmdline
);
void (* done) (
GApplicationCommandLine* cmdline
);
}
GApplicationCommandLineClass
-结构的包含只有私有数据。
类成员
print_literal: void (* print_literal) ( GApplicationCommandLine* cmdline, const gchar* message )
没有可用的描述。
printerr_literal: void (* printerr_literal) ( GApplicationCommandLine* cmdline, const gchar* message )
没有可用的描述。
get_stdin: GInputStream* (* get_stdin) ( GApplicationCommandLine* cmdline )
没有可用的描述。
done: void (* done) ( GApplicationCommandLine* cmdline )
没有可用的描述。