diff options
author | Ernestas Kulik <ernestask@gnome.org> | 2018-02-19 21:33:16 +0200 |
---|---|---|
committer | Ernestas Kulik <ernestask@gnome.org> | 2018-02-27 11:28:13 +0200 |
commit | fe6a5681ce92097eebfe07abe14fd877116e3b37 (patch) | |
tree | 3f2d022e5468871afb22e1f3b7dcc54cc9806528 | |
parent | 7cd0d6319ca55d10a9a65082b83de5eef2308378 (diff) | |
download | nautilus-fe6a5681ce92097eebfe07abe14fd877116e3b37.tar.gz |
general: truncate messages used in dialogs
This is most notably a problem with paths that are approaching PATH_MAX
in length. Cairo surface creation fails due to its internal size limit
being reached and GTK+ promptly crashes after trying to dereference a
null pointer. Besides, the window can get ridiculously long even if
Nautilus doesn’t crash.
-rw-r--r-- | src/nautilus-error-reporting.c | 147 | ||||
-rw-r--r-- | src/nautilus-error-reporting.h | 3 | ||||
-rw-r--r-- | src/nautilus-file-operations.c | 31 |
3 files changed, 110 insertions, 71 deletions
diff --git a/src/nautilus-error-reporting.c b/src/nautilus-error-reporting.c index e2e4cfe8b..50a979d93 100644 --- a/src/nautilus-error-reporting.c +++ b/src/nautilus-error-reporting.c @@ -34,19 +34,30 @@ #include "nautilus-debug.h" #define NEW_NAME_TAG "Nautilus: new name" -#define MAXIMUM_DISPLAYED_FILE_NAME_LENGTH 50 static void finish_rename (NautilusFile *file, gboolean stop_timer, GError *error); +static char * +get_truncated_name_for_file (NautilusFile *file) +{ + g_autofree char *file_name = NULL; + + g_assert (NAUTILUS_IS_FILE (file)); + + file_name = nautilus_file_get_display_name (file); + + return eel_str_middle_truncate (file_name, MAXIMUM_DISPLAYED_FILE_NAME_LENGTH); +} + void nautilus_report_error_loading_directory (NautilusFile *file, GError *error, GtkWindow *parent_window) { - char *file_name; - char *message; + g_autofree char *truncated_name = NULL; + g_autofree char *message = NULL; if (error == NULL || error->message == NULL) @@ -61,7 +72,7 @@ nautilus_report_error_loading_directory (NautilusFile *file, return; } - file_name = nautilus_file_get_display_name (file); + truncated_name = get_truncated_name_for_file (file); if (error->domain == G_IO_ERROR) { @@ -70,20 +81,28 @@ nautilus_report_error_loading_directory (NautilusFile *file, case G_IO_ERROR_PERMISSION_DENIED: { message = g_strdup_printf (_("You do not have the permissions necessary to view the contents of “%s”."), - file_name); + truncated_name); } break; case G_IO_ERROR_NOT_FOUND: { message = g_strdup_printf (_("“%s” could not be found. Perhaps it has recently been deleted."), - file_name); + truncated_name); } break; default: - message = g_strdup_printf (_("Sorry, could not display all the contents of “%s”: %s"), file_name, - error->message); + { + g_autofree char *truncated_error_message = NULL; + + truncated_error_message = eel_str_middle_truncate (error->message, + MAXIMUM_DISPLAYED_ERROR_MESSAGE_LENGTH); + + message = g_strdup_printf (_("Sorry, could not display all the contents of “%s”: %s"), truncated_name, + truncated_error_message); + } + break; } } else @@ -92,9 +111,6 @@ nautilus_report_error_loading_directory (NautilusFile *file, } eel_show_error_dialog (_("This location could not be displayed."), message, parent_window); - - g_free (file_name); - g_free (message); } void @@ -102,17 +118,16 @@ nautilus_report_error_setting_group (NautilusFile *file, GError *error, GtkWindow *parent_window) { - char *file_name; - char *message; + g_autofree char *truncated_name = NULL; + g_autofree char *message = NULL; if (error == NULL) { return; } - file_name = nautilus_file_get_display_name (file); + truncated_name = get_truncated_name_for_file (file); - message = NULL; if (error->domain == G_IO_ERROR) { switch (error->code) @@ -120,7 +135,7 @@ nautilus_report_error_setting_group (NautilusFile *file, case G_IO_ERROR_PERMISSION_DENIED: { message = g_strdup_printf (_("You do not have the permissions necessary to change the group of “%s”."), - file_name); + truncated_name); } break; @@ -133,19 +148,21 @@ nautilus_report_error_setting_group (NautilusFile *file, if (message == NULL) { + g_autofree char *truncated_error_message = NULL; + + truncated_error_message = eel_str_middle_truncate (error->message, + MAXIMUM_DISPLAYED_ERROR_MESSAGE_LENGTH); + /* We should invent decent error messages for every case we actually experience. */ g_warning ("Hit unhandled case %s:%d in nautilus_report_error_setting_group", g_quark_to_string (error->domain), error->code); /* fall through */ - message = g_strdup_printf (_("Sorry, could not change the group of “%s”: %s"), file_name, - error->message); + message = g_strdup_printf (_("Sorry, could not change the group of “%s”: %s"), truncated_name, + truncated_error_message); } eel_show_error_dialog (_("The group could not be changed."), message, parent_window); - - g_free (file_name); - g_free (message); } void @@ -153,22 +170,23 @@ nautilus_report_error_setting_owner (NautilusFile *file, GError *error, GtkWindow *parent_window) { - char *file_name; - char *message; + g_autofree char *truncated_name = NULL; + g_autofree char *truncated_error_message = NULL; + g_autofree char *message = NULL; if (error == NULL) { return; } - file_name = nautilus_file_get_display_name (file); + truncated_name = get_truncated_name_for_file (file); - message = g_strdup_printf (_("Sorry, could not change the owner of “%s”: %s"), file_name, error->message); + truncated_error_message = eel_str_middle_truncate (error->message, + MAXIMUM_DISPLAYED_ERROR_MESSAGE_LENGTH); + message = g_strdup_printf (_("Sorry, could not change the owner of “%s”: %s"), + truncated_name, truncated_error_message); eel_show_error_dialog (_("The owner could not be changed."), message, parent_window); - - g_free (file_name); - g_free (message); } void @@ -176,22 +194,23 @@ nautilus_report_error_setting_permissions (NautilusFile *file, GError *error, GtkWindow *parent_window) { - char *file_name; - char *message; + g_autofree char *truncated_name = NULL; + g_autofree char *truncated_error_message = NULL; + g_autofree char *message = NULL; if (error == NULL) { return; } - file_name = nautilus_file_get_display_name (file); + truncated_name = get_truncated_name_for_file (file); - message = g_strdup_printf (_("Sorry, could not change the permissions of “%s”: %s"), file_name, error->message); + truncated_error_message = eel_str_middle_truncate (error->message, + MAXIMUM_DISPLAYED_ERROR_MESSAGE_LENGTH); + message = g_strdup_printf (_("Sorry, could not change the permissions of “%s”: %s"), + truncated_name, truncated_error_message); eel_show_error_dialog (_("The permissions could not be changed."), message, parent_window); - - g_free (file_name); - g_free (message); } typedef struct _NautilusRenameData @@ -207,20 +226,16 @@ nautilus_report_error_renaming_file (NautilusFile *file, GError *error, GtkWindow *parent_window) { - char *original_name, *original_name_truncated; - char *new_name_truncated; - char *message; + g_autofree char *truncated_old_name = NULL; + g_autofree char *truncated_new_name = NULL; + g_autofree char *message = NULL; /* Truncate names for display since very long file names with no spaces * in them won't get wrapped, and can create insanely wide dialog boxes. */ - original_name = nautilus_file_get_display_name (file); - original_name_truncated = eel_str_middle_truncate (original_name, MAXIMUM_DISPLAYED_FILE_NAME_LENGTH); - g_free (original_name); - - new_name_truncated = eel_str_middle_truncate (new_name, MAXIMUM_DISPLAYED_FILE_NAME_LENGTH); + truncated_old_name = get_truncated_name_for_file (file); + truncated_new_name = eel_str_middle_truncate (new_name, MAXIMUM_DISPLAYED_FILE_NAME_LENGTH); - message = NULL; if (error->domain == G_IO_ERROR) { switch (error->code) @@ -229,7 +244,7 @@ nautilus_report_error_renaming_file (NautilusFile *file, { message = g_strdup_printf (_("The name “%s” is already used in this location. " "Please use a different name."), - new_name_truncated); + truncated_new_name); } break; @@ -237,14 +252,14 @@ nautilus_report_error_renaming_file (NautilusFile *file, { message = g_strdup_printf (_("There is no “%s” in this location. " "Perhaps it was just moved or deleted?"), - original_name_truncated); + truncated_old_name); } break; case G_IO_ERROR_PERMISSION_DENIED: { message = g_strdup_printf (_("You do not have the permissions necessary to rename “%s”."), - original_name_truncated); + truncated_old_name); } break; @@ -254,13 +269,13 @@ nautilus_report_error_renaming_file (NautilusFile *file, { message = g_strdup_printf (_("The name “%s” is not valid because it contains the character “/”. " "Please use a different name."), - new_name_truncated); + truncated_new_name); } else { message = g_strdup_printf (_("The name “%s” is not valid. " "Please use a different name."), - new_name_truncated); + truncated_new_name); } } break; @@ -269,7 +284,7 @@ nautilus_report_error_renaming_file (NautilusFile *file, { message = g_strdup_printf (_("The name “%s” is too long. " "Please use a different name."), - new_name_truncated); + truncated_new_name); } break; @@ -282,20 +297,21 @@ nautilus_report_error_renaming_file (NautilusFile *file, if (message == NULL) { + g_autofree char *truncated_error_message = NULL; + + truncated_error_message = eel_str_middle_truncate (error->message, + MAXIMUM_DISPLAYED_ERROR_MESSAGE_LENGTH); + /* We should invent decent error messages for every case we actually experience. */ g_warning ("Hit unhandled case %s:%d in nautilus_report_error_renaming_file", g_quark_to_string (error->domain), error->code); /* fall through */ message = g_strdup_printf (_("Sorry, could not rename “%s” to “%s”: %s"), - original_name_truncated, new_name_truncated, - error->message); + truncated_old_name, truncated_new_name, + truncated_error_message); } - g_free (original_name_truncated); - g_free (new_name_truncated); - eel_show_error_dialog (_("The item could not be renamed."), message, parent_window); - g_free (message); } static void @@ -377,10 +393,12 @@ nautilus_rename_file (NautilusFile *file, NautilusFileOperationCallback callback, gpointer callback_data) { - char *old_name, *wait_message; + g_autoptr (GError) error = NULL; NautilusRenameData *data; - char *uri; - GError *error; + g_autofree char *truncated_old_name = NULL; + g_autofree char *truncated_new_name = NULL; + g_autofree char *wait_message = NULL; + g_autofree char *uri = NULL; g_return_if_fail (NAUTILUS_IS_FILE (file)); g_return_if_fail (new_name != NULL); @@ -388,7 +406,6 @@ nautilus_rename_file (NautilusFile *file, /* Stop any earlier rename that's already in progress. */ error = g_error_new (G_IO_ERROR, G_IO_ERROR_CANCELLED, "Cancelled"); finish_rename (file, TRUE, error); - g_error_free (error); data = g_new0 (NautilusRenameData, 1); data->name = g_strdup (new_name); @@ -401,18 +418,16 @@ nautilus_rename_file (NautilusFile *file, data, (GDestroyNotify) nautilus_rename_data_free); /* Start the timed wait to cancel the rename. */ - old_name = nautilus_file_get_display_name (file); + truncated_old_name = get_truncated_name_for_file (file); + truncated_new_name = eel_str_middle_truncate (new_name, MAXIMUM_DISPLAYED_FILE_NAME_LENGTH); wait_message = g_strdup_printf (_("Renaming “%s” to “%s”."), - old_name, - new_name); - g_free (old_name); + truncated_old_name, + truncated_new_name); eel_timed_wait_start (cancel_rename_callback, file, wait_message, NULL); /* FIXME bugzilla.gnome.org 42395: Parent this? */ - g_free (wait_message); uri = nautilus_file_get_uri (file); DEBUG ("Renaming file %s to %s", uri, new_name); - g_free (uri); /* Start the rename. */ nautilus_file_rename (file, new_name, diff --git a/src/nautilus-error-reporting.h b/src/nautilus-error-reporting.h index 955b937ac..e60c06f71 100644 --- a/src/nautilus-error-reporting.h +++ b/src/nautilus-error-reporting.h @@ -27,6 +27,9 @@ #include <gtk/gtk.h> #include "nautilus-file.h" +#define MAXIMUM_DISPLAYED_FILE_NAME_LENGTH 50 +#define MAXIMUM_DISPLAYED_ERROR_MESSAGE_LENGTH 350 + void nautilus_report_error_loading_directory (NautilusFile *file, GError *error, GtkWindow *parent_window); diff --git a/src/nautilus-file-operations.c b/src/nautilus-file-operations.c index c6d277a1d..1f3ff7967 100644 --- a/src/nautilus-file-operations.c +++ b/src/nautilus-file-operations.c @@ -49,6 +49,7 @@ #include <gio/gio.h> #include <glib.h> +#include "nautilus-error-reporting.h" #include "nautilus-operations-ui-manager.h" #include "nautilus-file-changes-queue.h" #include "nautilus-file-private.h" @@ -1005,6 +1006,18 @@ get_basename (GFile *file) return name; } +static gchar * +get_truncated_parse_name (GFile *file) +{ + g_autofree gchar *parse_name = NULL; + + g_assert (G_IS_FILE (file)); + + parse_name = g_file_get_parse_name (file); + + return eel_str_middle_truncate (parse_name, MAXIMUM_DISPLAYED_FILE_NAME_LENGTH); +} + #define op_job_new(__type, parent_window) ((__type *) (init_common (sizeof (__type), parent_window))) static gpointer @@ -1219,6 +1232,14 @@ do_run_simple_dialog (gpointer _data) gtk_label_set_line_wrap (GTK_LABEL (label), TRUE); gtk_label_set_selectable (GTK_LABEL (label), TRUE); gtk_label_set_xalign (GTK_LABEL (label), 0); + /* Ideally, we shouldn’t do this. + * + * Refer to https://gitlab.gnome.org/GNOME/nautilus/merge_requests/94 + * and https://gitlab.gnome.org/GNOME/nautilus/issues/270. + */ + gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_MIDDLE); + gtk_label_set_max_width_chars (GTK_LABEL (label), + MAXIMUM_DISPLAYED_ERROR_MESSAGE_LENGTH); gtk_container_add (GTK_CONTAINER (content_area), label); @@ -5384,7 +5405,7 @@ retry: { primary = g_strdup_printf (_("Error while copying “%s”."), basename); } - filename = g_file_get_parse_name (dest_dir); + filename = get_truncated_parse_name (dest_dir); secondary = g_strdup_printf (_("Could not remove the already existing file " "with the same name in %s."), filename); @@ -5470,7 +5491,7 @@ retry: } basename = get_basename (src); primary = g_strdup_printf (_("Error while copying “%s”."), basename); - filename = g_file_get_parse_name (dest_dir); + filename = get_truncated_parse_name (dest_dir); secondary = g_strdup_printf (_("There was an error copying the file into %s."), filename); details = error->message; @@ -6054,7 +6075,7 @@ retry: } basename = get_basename (src); primary = g_strdup_printf (_("Error while moving “%s”."), basename); - filename = g_file_get_parse_name (dest_dir); + filename = get_truncated_parse_name (dest_dir); secondary = g_strdup_printf (_("There was an error moving the file into %s."), filename); @@ -6516,7 +6537,7 @@ retry: { g_autofree gchar *filename = NULL; - filename = g_file_get_parse_name (dest_dir); + filename = get_truncated_parse_name (dest_dir); secondary = g_strdup_printf (_("There was an error creating the symlink in %s."), filename); details = error->message; @@ -7413,7 +7434,7 @@ retry: primary = g_strdup_printf (_("Error while creating file %s."), basename); } - filename = g_file_get_parse_name (job->dest_dir); + filename = get_truncated_parse_name (job->dest_dir); secondary = g_strdup_printf (_("There was an error creating the directory in %s."), filename); |