From 0f94a8cad3b2db4afa36031855bdd9e1ba95f87a Mon Sep 17 00:00:00 2001 From: wdlkmpx Date: Sat, 3 Oct 2020 21:06:43 +0800 Subject: [PATCH] gtkcompletionline.c: use only cl->cmpl to get filelist --- src/gtkcompletionline.c | 59 ++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/src/gtkcompletionline.c b/src/gtkcompletionline.c index 79cc44d..a0bcf70 100644 --- a/src/gtkcompletionline.c +++ b/src/gtkcompletionline.c @@ -60,8 +60,6 @@ enum { static guint gtk_completion_line_signals[LAST_SIGNAL]; static gchar ** path_gc = NULL; /* string list (gchar *) containing each directory in PATH */ -static GList * execs_gc = NULL; /* linked list of executables from current path */ -static GList * dirlist_gc = NULL; /* linked list of directories from current path */ static gchar * prefix = NULL; static int g_show_dot_files; @@ -253,14 +251,6 @@ static void gtk_completion_line_dispose (GObject *object) g_strfreev (path_gc); path_gc = NULL; } - if (execs_gc) { - g_list_free_full (execs_gc, g_free); - execs_gc = NULL; - } - if (dirlist_gc) { - g_list_free_full (dirlist_gc, g_free); - dirlist_gc = NULL; - } G_OBJECT_CLASS (gtk_completion_line_parent_class)->dispose (object); } @@ -464,7 +454,7 @@ int my_alphasort (const void *_a, const void *_b) } /* Iterates though PATH and list all executables */ -static void generate_execs_list (char * pfix) +static GList * generate_execs_list (char * pfix) { // generate_path_list if (!path_gc) { @@ -472,6 +462,7 @@ static void generate_execs_list (char * pfix) path_gc = g_strsplit (path_cstr, ":", -1); } + GList * execs_gc = NULL; if (prefix) g_free (prefix); prefix = g_strdup (pfix); @@ -496,10 +487,11 @@ static void generate_execs_list (char * pfix) g_free (prefix); prefix = NULL; } + return (execs_gc); } /* list all subdirs in what, return if ok or not */ -static int generate_dirlist (const char * path) +static GList * generate_dirlist (const char * path) { #ifdef DEBUG printf ("generate_dirlist\n"); @@ -509,6 +501,7 @@ static int generate_dirlist (const char * path) char * filename = str; GString * dest = g_string_new("/"); int n; + GList * dirlist_gc = NULL; /* Check path validity in path */ while (*p != '\0') @@ -517,9 +510,9 @@ static int generate_dirlist (const char * path) if (*p == '/') { DIR* dir = opendir(dest->str); if (!dir) { - free(str); + free (str); g_string_free (dest, TRUE); - return GEN_CANT_COMPLETE; + return (NULL); } closedir(dir); filename = p; @@ -538,9 +531,6 @@ static int generate_dirlist (const char * path) dest = g_string_new (str); dest = g_string_append_c (dest, '/'); - g_list_free_full (dirlist_gc, g_free); - dirlist_gc = NULL; - struct dirent **eps; char * file; int len; @@ -572,7 +562,7 @@ static int generate_dirlist (const char * path) } g_string_free(dest, TRUE); free(str); - return GEN_COMPLETION_OK; + return (dirlist_gc); } /* Expand tilde */ @@ -678,23 +668,14 @@ static int complete_line (GtkCompletionLine *object) g_show_dot_files = object->show_dot_files; - if (execs_gc) { - g_list_free_full (execs_gc, g_free); - execs_gc = NULL; - } - if (dirlist_gc) { - g_list_free_full (dirlist_gc, g_free); - dirlist_gc = NULL; - } - if (word[0] != '/') { - generate_execs_list (word); - object->cmpl = execs_gc; // exec list - } else { - generate_dirlist (word); - object->cmpl = dirlist_gc; // dirlist + /* populate object->cmpl */ + if (word[0] != '/') { /* exec list */ + object->cmpl = generate_execs_list (word); + } else { /* dirlist */ + object->cmpl = generate_dirlist (word); } - complete_from_list(object); + complete_from_list (object); GList *ls = object->cmpl; guint num_items = ls ? g_list_length (ls) : 0; @@ -703,10 +684,18 @@ static int complete_line (GtkCompletionLine *object) g_signal_emit_by_name(G_OBJECT(object), "unique"); clear_selection (object); g_list_free_full (list, g_free); + if (object->cmpl) { + g_list_free_full (object->cmpl, g_free); + object->cmpl = NULL; + } return GEN_COMPLETION_OK; } else if (num_items == 0) { g_signal_emit_by_name(G_OBJECT(object), "incomplete"); g_list_free_full (list, g_free); + if (object->cmpl) { + g_list_free_full (object->cmpl, g_free); + object->cmpl = NULL; + } return GEN_CANT_COMPLETE; } @@ -799,6 +788,10 @@ static int complete_line (GtkCompletionLine *object) on_cursor_changed_handler); g_list_free_full (list, g_free); + if (object->cmpl) { + g_list_free_full (object->cmpl, g_free); + object->cmpl = NULL; + } return GEN_NOT_UNIQUE; }