Launcher: autocompletion alphabetical sort from PeVe

This commit is contained in:
Radek Tříška 2010-08-28 23:08:29 +02:00 committed by Philippe Pepiot
parent 36aa4ce43a
commit 839ebeaf2b
3 changed files with 30 additions and 11 deletions

View File

@ -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;
}

View File

@ -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));
}

View File

@ -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);