diff options
author | Federico Mena Quintero <federico@gnu.org> | 2008-03-13 00:47:38 +0000 |
---|---|---|
committer | Federico Mena Quintero <federico@src.gnome.org> | 2008-03-13 00:47:38 +0000 |
commit | 1e60639143ebca04dcf890c98cb4400fc6b34625 (patch) | |
tree | 0f2306f30cbc7aed6b1190c5f34a95d1308206d1 /gtk/gtkfilechooserentry.c | |
parent | b7e32c8dcb98ff025002224c3bc28fd325bf6854 (diff) | |
download | gtk+-1e60639143ebca04dcf890c98cb4400fc6b34625.tar.gz |
Don't complete the directory separator if it would result in double separators
Signed-off-by: Federico Mena Quintero <federico@gnu.org>
svn path=/trunk/; revision=19857
Diffstat (limited to 'gtk/gtkfilechooserentry.c')
-rw-r--r-- | gtk/gtkfilechooserentry.c | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/gtk/gtkfilechooserentry.c b/gtk/gtkfilechooserentry.c index a8f799ba30..a3d1c6b031 100644 --- a/gtk/gtkfilechooserentry.c +++ b/gtk/gtkfilechooserentry.c @@ -447,6 +447,18 @@ maybe_append_separator_to_path (GtkFileChooserEntry *chooser_entry, return display_name; } +static char * +trim_dir_separator_suffix (const char *str) +{ + int len; + + len = strlen (str); + if (len > 0 && G_IS_DIR_SEPARATOR (str[len - 1])) + return g_strndup (str, len - 1); + else + return g_strdup (str); +} + /* Determines if the completion model has entries with a common prefix relative * to the current contents of the entry. Also, if there's one and only one such * path, stores it in unique_path_ret. @@ -513,7 +525,7 @@ find_common_prefix (GtkFileChooserEntry *chooser_entry, { if (!*common_prefix_ret) { - *common_prefix_ret = g_strdup (display_name); + *common_prefix_ret = trim_dir_separator_suffix (display_name); *unique_path_ret = gtk_file_path_copy (path); } else @@ -577,6 +589,29 @@ find_common_prefix (GtkFileChooserEntry *chooser_entry, return TRUE; } +static gboolean +char_after_cursor_is_directory_separator (GtkFileChooserEntry *chooser_entry) +{ + int cursor_pos; + gboolean result; + + result = FALSE; + + cursor_pos = gtk_editable_get_position (GTK_EDITABLE (chooser_entry)); + if (cursor_pos < GTK_ENTRY (chooser_entry)->text_length) + { + char *next_char_str; + + next_char_str = gtk_editable_get_chars (GTK_EDITABLE (chooser_entry), cursor_pos, cursor_pos + 1); + if (G_IS_DIR_SEPARATOR (*next_char_str)) + result = TRUE; + + g_free (next_char_str); + } + + return result; +} + typedef enum { INVALID_INPUT, /* what the user typed is bogus */ NO_MATCH, /* no matches based on what the user typed */ @@ -623,9 +658,11 @@ append_common_prefix (GtkFileChooserEntry *chooser_entry, if (unique_path) { - common_prefix = maybe_append_separator_to_path (chooser_entry, - unique_path, - common_prefix); + if (!char_after_cursor_is_directory_separator (chooser_entry)) + common_prefix = maybe_append_separator_to_path (chooser_entry, + unique_path, + common_prefix); + gtk_file_path_free (unique_path); if (common_prefix) |