1 | #include <gio/gio.h> |
2 | #include <stdlib.h> |
3 | #include <string.h> |
4 | |
5 | static gboolean |
6 | my_cmdline_handler (gpointer data) |
7 | { |
8 | GApplicationCommandLine *cmdline = data; |
9 | gchar **args; |
10 | gchar **argv; |
11 | gint argc; |
12 | gint arg1; |
13 | gboolean arg2; |
14 | gboolean help; |
15 | GOptionContext *context; |
16 | GOptionEntry entries[] = { |
17 | { "arg1" , 0, 0, G_OPTION_ARG_INT, &arg1, NULL, NULL }, |
18 | { "arg2" , 0, 0, G_OPTION_ARG_NONE, &arg2, NULL, NULL }, |
19 | { "help" , '?', 0, G_OPTION_ARG_NONE, &help, NULL, NULL }, |
20 | { NULL } |
21 | }; |
22 | GError *error; |
23 | gint i; |
24 | |
25 | args = g_application_command_line_get_arguments (cmdline, argc: &argc); |
26 | |
27 | /* We have to make an extra copy of the array, since g_option_context_parse() |
28 | * assumes that it can remove strings from the array without freeing them. |
29 | */ |
30 | argv = g_new (gchar*, argc + 1); |
31 | for (i = 0; i <= argc; i++) |
32 | argv[i] = args[i]; |
33 | |
34 | context = g_option_context_new (NULL); |
35 | g_option_context_set_help_enabled (context, FALSE); |
36 | g_option_context_add_main_entries (context, entries, NULL); |
37 | |
38 | arg1 = 0; |
39 | arg2 = FALSE; |
40 | help = FALSE; |
41 | error = NULL; |
42 | if (!g_option_context_parse (context, argc: &argc, argv: &argv, error: &error)) |
43 | { |
44 | g_application_command_line_printerr (cmdline, format: "%s\n" , error->message); |
45 | g_error_free (error); |
46 | g_application_command_line_set_exit_status (cmdline, exit_status: 1); |
47 | } |
48 | else if (help) |
49 | { |
50 | gchar *text; |
51 | text = g_option_context_get_help (context, FALSE, NULL); |
52 | g_application_command_line_print (cmdline, format: "%s" , text); |
53 | g_free (mem: text); |
54 | } |
55 | else |
56 | { |
57 | g_application_command_line_print (cmdline, format: "arg1 is %d and arg2 is %s\n" , |
58 | arg1, arg2 ? "TRUE" : "FALSE" ); |
59 | g_application_command_line_set_exit_status (cmdline, exit_status: 0); |
60 | } |
61 | |
62 | g_free (mem: argv); |
63 | g_strfreev (str_array: args); |
64 | |
65 | g_option_context_free (context); |
66 | |
67 | /* we are done handling this commandline */ |
68 | g_object_unref (object: cmdline); |
69 | |
70 | return G_SOURCE_REMOVE; |
71 | } |
72 | |
73 | static int |
74 | command_line (GApplication *application, |
75 | GApplicationCommandLine *cmdline) |
76 | { |
77 | /* keep the application running until we are done with this commandline */ |
78 | g_application_hold (application); |
79 | |
80 | g_object_set_data_full (G_OBJECT (cmdline), |
81 | key: "application" , data: application, |
82 | destroy: (GDestroyNotify)g_application_release); |
83 | |
84 | g_object_ref (cmdline); |
85 | g_idle_add (function: my_cmdline_handler, data: cmdline); |
86 | |
87 | return 0; |
88 | } |
89 | |
90 | int |
91 | main (int argc, char **argv) |
92 | { |
93 | GApplication *app; |
94 | int status; |
95 | |
96 | app = g_application_new (application_id: "org.gtk.TestApplication" , |
97 | flags: G_APPLICATION_HANDLES_COMMAND_LINE); |
98 | g_signal_connect (app, "command-line" , G_CALLBACK (command_line), NULL); |
99 | g_application_set_inactivity_timeout (application: app, inactivity_timeout: 10000); |
100 | |
101 | status = g_application_run (application: app, argc, argv); |
102 | |
103 | g_object_unref (object: app); |
104 | |
105 | return status; |
106 | } |
107 | |