Don't use global vars for command line parsing
This commit is contained in:
parent
42f78a6980
commit
3b9d03837b
106
xed/xed-app.c
106
xed/xed-app.c
|
@ -82,19 +82,20 @@ struct _XedAppPrivate
|
||||||
GSettings *window_settings;
|
GSettings *window_settings;
|
||||||
|
|
||||||
PeasExtensionSet *extensions;
|
PeasExtensionSet *extensions;
|
||||||
|
|
||||||
|
/* command line parsing */
|
||||||
|
gboolean new_window;
|
||||||
|
gboolean new_document;
|
||||||
|
gchar *geometry;
|
||||||
|
const GtkSourceEncoding *encoding;
|
||||||
|
GInputStream *stdin_stream;
|
||||||
|
GSList *file_list;
|
||||||
|
gint line_position;
|
||||||
|
GApplicationCommandLine *command_line;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (XedApp, xed_app, GTK_TYPE_APPLICATION)
|
G_DEFINE_TYPE (XedApp, xed_app, GTK_TYPE_APPLICATION)
|
||||||
|
|
||||||
static gboolean new_window = FALSE;
|
|
||||||
static gboolean new_document = FALSE;
|
|
||||||
static gchar *geometry = NULL;
|
|
||||||
static const GtkSourceEncoding *encoding = NULL;
|
|
||||||
static GInputStream *stdin_stream = NULL;
|
|
||||||
static GSList *file_list = NULL;
|
|
||||||
static gint line_position = 0;
|
|
||||||
static GApplicationCommandLine *command_line = NULL;
|
|
||||||
|
|
||||||
static const GOptionEntry options[] =
|
static const GOptionEntry options[] =
|
||||||
{
|
{
|
||||||
/* Version */
|
/* Version */
|
||||||
|
@ -361,16 +362,25 @@ get_active_window (GtkApplication *app)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_command_line_wait (XedTab *tab)
|
set_command_line_wait (XedApp *app,
|
||||||
|
XedTab *tab)
|
||||||
{
|
{
|
||||||
g_object_set_data_full (G_OBJECT (tab),
|
g_object_set_data_full (G_OBJECT (tab),
|
||||||
"XedTabCommandLineWait",
|
"XedTabCommandLineWait",
|
||||||
g_object_ref (command_line),
|
g_object_ref (app->priv->command_line),
|
||||||
(GDestroyNotify)g_object_unref);
|
(GDestroyNotify)g_object_unref);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xed_app_activate (GApplication *application)
|
open_files (GApplication *application,
|
||||||
|
gboolean new_window,
|
||||||
|
gboolean new_document,
|
||||||
|
gchar *geometry,
|
||||||
|
gint line_position,
|
||||||
|
const GtkSourceEncoding *encoding,
|
||||||
|
GInputStream *stdin_stream,
|
||||||
|
GSList *file_list,
|
||||||
|
GApplicationCommandLine *command_line)
|
||||||
{
|
{
|
||||||
XedWindow *window = NULL;
|
XedWindow *window = NULL;
|
||||||
XedTab *tab;
|
XedTab *tab;
|
||||||
|
@ -408,7 +418,7 @@ xed_app_activate (GApplication *application)
|
||||||
|
|
||||||
if (doc_created && command_line)
|
if (doc_created && command_line)
|
||||||
{
|
{
|
||||||
set_command_line_wait (tab);
|
set_command_line_wait (XED_APP (application), tab);
|
||||||
}
|
}
|
||||||
g_input_stream_close (stdin_stream, NULL, NULL);
|
g_input_stream_close (stdin_stream, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
@ -436,7 +446,7 @@ xed_app_activate (GApplication *application)
|
||||||
|
|
||||||
if (command_line)
|
if (command_line)
|
||||||
{
|
{
|
||||||
set_command_line_wait (tab);
|
set_command_line_wait (XED_APP (application), tab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -444,19 +454,38 @@ xed_app_activate (GApplication *application)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
clear_options (void)
|
xed_app_activate (GApplication *application)
|
||||||
{
|
{
|
||||||
g_free (geometry);
|
XedAppPrivate *priv = XED_APP (application)->priv;
|
||||||
g_clear_object (&stdin_stream);
|
|
||||||
g_slist_free_full (file_list, g_object_unref);
|
|
||||||
|
|
||||||
new_window = FALSE;
|
open_files (application,
|
||||||
new_document = FALSE;
|
priv->new_window,
|
||||||
geometry = NULL;
|
priv->new_document,
|
||||||
encoding = NULL;
|
priv->geometry,
|
||||||
file_list = NULL;
|
priv->line_position,
|
||||||
line_position = 0;
|
priv->encoding,
|
||||||
command_line = NULL;
|
priv->stdin_stream,
|
||||||
|
priv->file_list,
|
||||||
|
priv->command_line);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clear_options (XedApp *app)
|
||||||
|
{
|
||||||
|
XedAppPrivate *priv = app->priv;
|
||||||
|
|
||||||
|
g_free (priv->geometry);
|
||||||
|
g_clear_object (&priv->stdin_stream);
|
||||||
|
g_slist_free_full (priv->file_list, g_object_unref);
|
||||||
|
|
||||||
|
priv->new_window = FALSE;
|
||||||
|
priv->new_document = FALSE;
|
||||||
|
priv->geometry = NULL;
|
||||||
|
priv->encoding = NULL;
|
||||||
|
priv->file_list = NULL;
|
||||||
|
priv->line_position = 0;
|
||||||
|
priv->column_position = 0;
|
||||||
|
priv->command_line = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -470,26 +499,29 @@ static gint
|
||||||
xed_app_command_line (GApplication *application,
|
xed_app_command_line (GApplication *application,
|
||||||
GApplicationCommandLine *cl)
|
GApplicationCommandLine *cl)
|
||||||
{
|
{
|
||||||
|
XedAppPrivate *priv;
|
||||||
GVariantDict *options;
|
GVariantDict *options;
|
||||||
const gchar *encoding_charset;
|
const gchar *encoding_charset;
|
||||||
const gchar **remaining_args;
|
const gchar **remaining_args;
|
||||||
|
|
||||||
|
priv = XED_APP (application)->priv;
|
||||||
|
|
||||||
options = g_application_command_line_get_options_dict (cl);
|
options = g_application_command_line_get_options_dict (cl);
|
||||||
|
|
||||||
g_variant_dict_lookup (options, "new-window", "b", &new_window);
|
g_variant_dict_lookup (options, "new-window", "b", &priv->new_window);
|
||||||
g_variant_dict_lookup (options, "new-document", "b", &new_document);
|
g_variant_dict_lookup (options, "new-document", "b", &priv->new_document);
|
||||||
g_variant_dict_lookup (options, "geometry", "s", &geometry);
|
g_variant_dict_lookup (options, "geometry", "s", &priv->geometry);
|
||||||
|
|
||||||
if (g_variant_dict_contains (options, "wait"))
|
if (g_variant_dict_contains (options, "wait"))
|
||||||
{
|
{
|
||||||
command_line = cl;
|
priv->command_line = cl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_variant_dict_lookup (options, "encoding", "&s", &encoding_charset))
|
if (g_variant_dict_lookup (options, "encoding", "&s", &encoding_charset))
|
||||||
{
|
{
|
||||||
encoding = gtk_source_encoding_get_from_charset (encoding_charset);
|
priv->encoding = gtk_source_encoding_get_from_charset (encoding_charset);
|
||||||
|
|
||||||
if (encoding == NULL)
|
if (priv->encoding == NULL)
|
||||||
{
|
{
|
||||||
g_application_command_line_printerr (cl, _("%s: invalid encoding."), encoding_charset);
|
g_application_command_line_printerr (cl, _("%s: invalid encoding."), encoding_charset);
|
||||||
}
|
}
|
||||||
|
@ -507,33 +539,33 @@ xed_app_command_line (GApplication *application,
|
||||||
if (*(remaining_args[i] + 1) == '\0')
|
if (*(remaining_args[i] + 1) == '\0')
|
||||||
{
|
{
|
||||||
/* goto the last line of the document */
|
/* goto the last line of the document */
|
||||||
line_position = G_MAXINT;
|
priv->line_position = G_MAXINT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
get_line_position (remaining_args[i] + 1, &line_position);
|
get_line_position (remaining_args[i] + 1, &priv->line_position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (*remaining_args[i] == '-' && *(remaining_args[i] + 1) == '\0')
|
else if (*remaining_args[i] == '-' && *(remaining_args[i] + 1) == '\0')
|
||||||
{
|
{
|
||||||
stdin_stream = g_application_command_line_get_stdin (cl);
|
priv->stdin_stream = g_application_command_line_get_stdin (cl);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GFile *file;
|
GFile *file;
|
||||||
|
|
||||||
file = g_application_command_line_create_file_for_arg (cl, remaining_args[i]);
|
file = g_application_command_line_create_file_for_arg (cl, remaining_args[i]);
|
||||||
file_list = g_slist_prepend (file_list, file);
|
priv->file_list = g_slist_prepend (priv->file_list, file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
file_list = g_slist_reverse (file_list);
|
priv->file_list = g_slist_reverse (priv->file_list);
|
||||||
g_free (remaining_args);
|
g_free (remaining_args);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_application_activate (application);
|
g_application_activate (application);
|
||||||
clear_options ();
|
clear_options (XED_APP (application));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,7 @@ main (int argc, char *argv[])
|
||||||
|
|
||||||
app = g_object_new (XED_TYPE_APP,
|
app = g_object_new (XED_TYPE_APP,
|
||||||
"application-id", "org.x.editor",
|
"application-id", "org.x.editor",
|
||||||
"flags", G_APPLICATION_HANDLES_COMMAND_LINE,
|
"flags", G_APPLICATION_HANDLES_COMMAND_LINE | G_APPLICATION_HANDLES_OPEN,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
status = g_application_run (G_APPLICATION (app), argc, argv);
|
status = g_application_run (G_APPLICATION (app), argc, argv);
|
||||||
|
|
Loading…
Reference in New Issue