glib/gio/tests/gapplication-example-cmdline3.c
Reuben Thomas e99dbb943b doc: remove unnecessary and confusing code from examples
Three of the four GApplicationCommandLine examples contained this line:

  g_application_set_inactivity_timeout (app, 10000);

It is not explained (which could be confusing for readers trying to
understand the examplese), or necessary. Worse, it causes two of the
examples to pause for ten seconds if they are invoked with no command-line
arguments, which makes them seem broken (and would presumably be reported
as a bug in any real application).

So, remove these calls.

Fixes #3615
2025-02-26 21:48:30 +00:00

106 lines
2.7 KiB
C

#include <gio/gio.h>
#include <stdlib.h>
#include <string.h>
static gboolean
my_cmdline_handler (gpointer data)
{
GApplicationCommandLine *cmdline = data;
gchar **args;
gchar **argv;
gint argc;
gint arg1;
gboolean arg2;
gboolean help;
GOptionContext *context;
GOptionEntry entries[] = {
{ "arg1", 0, 0, G_OPTION_ARG_INT, &arg1, NULL, NULL },
{ "arg2", 0, 0, G_OPTION_ARG_NONE, &arg2, NULL, NULL },
{ "help", '?', 0, G_OPTION_ARG_NONE, &help, NULL, NULL },
G_OPTION_ENTRY_NULL
};
GError *error;
gint i;
args = g_application_command_line_get_arguments (cmdline, &argc);
/* We have to make an extra copy of the array, since g_option_context_parse()
* assumes that it can remove strings from the array without freeing them.
*/
argv = g_new (gchar*, argc + 1);
for (i = 0; i <= argc; i++)
argv[i] = args[i];
context = g_option_context_new (NULL);
g_option_context_set_help_enabled (context, FALSE);
g_option_context_add_main_entries (context, entries, NULL);
arg1 = 0;
arg2 = FALSE;
help = FALSE;
error = NULL;
if (!g_option_context_parse (context, &argc, &argv, &error))
{
g_application_command_line_printerr (cmdline, "%s\n", error->message);
g_error_free (error);
g_application_command_line_set_exit_status (cmdline, 1);
}
else if (help)
{
gchar *text;
text = g_option_context_get_help (context, FALSE, NULL);
g_application_command_line_print (cmdline, "%s", text);
g_free (text);
}
else
{
g_application_command_line_print (cmdline, "arg1 is %d and arg2 is %s\n",
arg1, arg2 ? "TRUE" : "FALSE");
g_application_command_line_set_exit_status (cmdline, 0);
}
g_free (argv);
g_strfreev (args);
g_option_context_free (context);
/* we are done handling this commandline */
g_object_unref (cmdline);
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;
}
int
main (int argc, char **argv)
{
GApplication *app;
int status;
app = g_application_new ("org.gtk.TestApplication",
G_APPLICATION_HANDLES_COMMAND_LINE);
g_signal_connect (app, "command-line", G_CALLBACK (command_line), NULL);
status = g_application_run (app, argc, argv);
g_object_unref (app);
return status;
}