diff --git a/src/launcher.c b/src/launcher.c index 629b21f..0a1ea2c 100644 --- a/src/launcher.c +++ b/src/launcher.c @@ -37,7 +37,6 @@ #include "wmfs.h" - static char *complete_on_command(char*, size_t); static char *complete_on_files(char*, size_t); @@ -256,7 +255,10 @@ complete_on_command(char *start, size_t hits) char *ret = NULL; DIR *dir; struct dirent *content; - size_t count = 0; + + char **namelist = NULL; + int n = 0; + void *temp = NULL; if (!getenv("PATH") || !start || hits <= 0) return NULL; @@ -265,27 +267,37 @@ complete_on_command(char *start, size_t hits) dirname = strtok(path, ":"); /* recursively open PATH */ - while (dirname) + while (dirname != NULL) { if ((dir = opendir(dirname))) { while ((content = readdir(dir))) - if (!strncmp(content->d_name, start, strlen(start)) && ++count == hits) + { + if(strncmp(content->d_name, ".", 1)) { - ret = _strdup(content->d_name + strlen(start)); - break; + if (!strncmp(content->d_name, start, strlen(start))) + { + temp = realloc(namelist, ++n * sizeof(*namelist)); + if ( temp != NULL ) + namelist = temp; + namelist[n-1] = strdup(content->d_name); + } } + } closedir(dir); } - - if (ret) - break; - dirname = strtok(NULL, ":"); } + qsort(namelist, n, sizeof(char *), qsort_string_compare); free(path); + if(n > 0) + ret = _strdup(namelist[((hits > 0) ? hits - 1 : 0) % n] + strlen(start)); + int i; + for(i = 0; i < n; i++) + free(namelist[i]); + free(namelist); return ret; } diff --git a/src/util.c b/src/util.c index e1e8b1c..8314f48 100644 --- a/src/util.c +++ b/src/util.c @@ -356,3 +356,10 @@ patht(char *path) return ret; } + +int +qsort_string_compare (const void * a, const void * b) +{ + return (strcmp(*(char **)a, *(char **)b)); +} + diff --git a/src/wmfs.h b/src/wmfs.h index 0054a3b..c5da5c1 100644 --- a/src/wmfs.h +++ b/src/wmfs.h @@ -300,7 +300,7 @@ void swap_ptr(void **x, void **y); void uicb_spawn(uicb_t); char *clean_value(char *str); char* patht(char *path); - +int qsort_string_compare (const void * a, const void * b); #ifdef HAVE_IMLIB int parse_image_block(ImageAttr *im, char *str);