Gio ApplicationCommandLine

描述 [源]

class Gio.ApplicationCommandLine : GObject.Object
{
  /* No available fields */
}

GApplicationCommandLine 代表应用程序的命令行调用。

它由 GApplication 创建,并在 GApplication::command-line 信号和虚拟函数中发出。

该类包含了程序调用的参数列表。同时还可以查询命令行调用是本地(即:当前进程是直接响应调用而运行)还是远程(即:某个其他进程将命令行转发到该进程)。

GApplicationCommandLine 对象可以提供 argcargv 参数,用于与 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_create_file_for_arg

为作为 cmdline 调用的一部分给出的文件名创建一个 GFile

since: 2.36

g_application_command_line_done

表示命令行处理已完成。

since: 2.80

g_application_command_line_get_arguments

获取命令行上传递的参数列表。

since: 2.28

g_application_command_line_get_cwd

获取命令行调用的当前工作目录。字符串可能包含非 utf8 数据。

since: 2.28

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_get_is_remote

确定 cmdline 是否表示远程调用。

since: 2.28

g_application_command_line_get_options_dict

获取传递给 g_application_command_line() 的选项。

since: 2.40

g_application_command_line_get_platform_data

获取与 cmdline 调用相关的平台数据。

since: 2.28

g_application_command_line_get_stdin

获取调用进程的 stdin。

since: 2.34

g_application_command_line_getenv

获取命令行调用的特定环境变量的值,就像由 g_getenv() 返回的那样。这些字符串可能包含非 utf8 数据。

since: 2.28

g_application_command_line_print

格式化消息并使用调用进程的 stdout 打印处理器打印它。

since: 2.28

g_application_command_line_print_literal

使用调用进程的 stdout 打印处理器打印消息。

since: 2.80

g_application_command_line_printerr

格式化消息并使用调用进程的 stderr 打印处理器打印它。

since: 2.28

g_application_command_line_printerr_literal

使用调用进程中的stderr打印处理程序打印信息。

since: 2.80

g_application_command_line_set_exit_status

设置进程退出时将使用的退出状态。

since: 2.28

继承自GObject的方法(43个)

请参见GObject以获取方法的全列表。

属性

Gio.ApplicationCommandLine:arguments

引起此GApplication::command-line信号发出的命令行。

since: 2.28

Gio.ApplicationCommandLine:is-remote

是否为远程命令行。

since: 2.28

Gio.ApplicationCommandLine:options

与命令行一起发送的选项。

since: 2.28

Gio.ApplicationCommandLine:platform-data

命令行特有的平台数据。

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 )

没有可用的描述。

虚方法

Gio.ApplicationCommandLineClass.done

表示命令行处理已完成。

since: 2.80

Gio.ApplicationCommandLineClass.get_stdin

获取调用进程的 stdin。

since: 2.34

Gio.ApplicationCommandLineClass.print_literal

使用调用进程的 stdout 打印处理器打印消息。

since: 2.80

Gio.ApplicationCommandLineClass.printerr_literal

使用调用进程中的stderr打印处理程序打印信息。

since: 2.80