Don't use global vars for command line parsing
This commit is contained in:
		
							
								
								
									
										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); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user