Skip to content

Instantly share code, notes, and snippets.

@DaveDavenport
Created July 5, 2014 17:24
Show Gist options
  • Select an option

  • Save DaveDavenport/91d0141e9f366db09b1e to your computer and use it in GitHub Desktop.

Select an option

Save DaveDavenport/91d0141e9f366db09b1e to your computer and use it in GitHub Desktop.
Patch for different sorting.
diff --git a/source/rofi.c b/source/rofi.c
index 40ffaa6..d3a3a96 100644
--- a/source/rofi.c
+++ b/source/rofi.c
@@ -869,6 +869,59 @@ int window_match ( char **tokens, __attribute__( ( unused ) ) const char *input,
return match;
}
+static int lev_sort ( const void *p1, const void *p2, void *arg )
+{
+ const int *a = p1;
+ const int *b = p2;
+ int *distances = arg;
+
+ return distances[*a] - distances[*b];
+}
+
+static int levenshtein ( const char *s, const char *t )
+{
+ int ls = strlen ( s ), lt = strlen ( t );
+ int d[ls + 1][lt + 1];
+
+ for ( int i = 0; i <= ls; i++ ) {
+ for ( int j = 0; j <= lt; j++ ) {
+ d[i][j] = -1;
+ }
+ }
+
+ int dist ( int i, int j )
+ {
+ if ( d[i][j] >= 0 ) {
+ return d[i][j];
+ }
+
+ int x;
+ if ( i == ls ) {
+ x = lt - j;
+ }
+ else if ( j == lt ) {
+ x = ls - i;
+ }
+ else if ( s[i] == t[j] ) {
+ x = dist ( i + 1, j + 1 );
+ }
+ else {
+ x = dist ( i + 1, j + 1 );
+
+ int y;
+ if ( ( y = dist ( i, j + 1 ) ) < x ) {
+ x = y;
+ }
+ if ( ( y = dist ( i + 1, j ) ) < x ) {
+ x = y;
+ }
+ x++;
+ }
+ return d[i][j] = x;
+ }
+ return dist ( 0, 0 );
+}
+
MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shift,
menu_match_cb mmc, void *mmc_data, int *selected_line )
{
@@ -923,7 +976,7 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
int x = mon.x + ( mon.w - w ) / 2;
int element_width = w - ( 2 * ( config.padding ) );
// Divide by the # columns
- element_width = (element_width-(columns-1)*LINE_MARGIN)/columns;
+ element_width = ( element_width - ( columns - 1 ) * LINE_MARGIN ) / columns;
if ( config.hmode == TRUE ) {
element_width = ( w - ( 2 * ( config.padding ) ) - max_elements * LINE_MARGIN ) / ( max_elements + 1 );
}
@@ -1038,9 +1091,10 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
// filtered list
char **filtered = calloc ( num_lines, sizeof ( char* ) );
int *line_map = calloc ( num_lines, sizeof ( int ) );
+ int *distance = calloc ( num_lines, sizeof ( int ) );
unsigned int filtered_lines = 0;
- if ( input && *input ) {
+ if ( input && *input && strlen ( *input ) > 0 ) {
char **tokens = tokenize ( *input );
// input changed
@@ -1049,13 +1103,20 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
// If each token was matched, add it to list.
if ( match ) {
- line_map[j] = i;
- filtered[j++] = lines[i];
- filtered_lines++;
+ line_map[j] = i;
+ distance[i] = levenshtein ( *input, lines[i] );
+ j++;
}
}
+ qsort_r ( line_map, j, sizeof ( int ), lev_sort, distance );
+ for ( i = 0; i < j; i++ ) {
+ filtered[i] = lines[line_map[i]];
+ }
+ filtered_lines = j;
tokenize_free ( tokens );
+
+ // Sort on distance.
}
else{
int jin = 0;
@@ -1206,8 +1267,8 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
if ( ( ( ( ev.xkey.state & ControlMask ) == ControlMask ) && key == XK_v ) ||
key == XK_Insert ) {
XConvertSelection ( display, ( ev.xkey.state & ShiftMask ) ?
- netatoms[CLIPBOARD] : XA_PRIMARY,
- netatoms[UTF8_STRING], netatoms[UTF8_STRING], main_window, CurrentTime );
+ netatoms[CLIPBOARD] : XA_PRIMARY,
+ netatoms[UTF8_STRING], netatoms[UTF8_STRING], main_window, CurrentTime );
}
else if ( ( ( ev.xkey.state & ShiftMask ) == ShiftMask ) &&
key == XK_slash ) {
@@ -1370,10 +1431,15 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
// If each token was matched, add it to list.
if ( match ) {
- line_map[j] = i;
- filtered[j++] = lines[i];
+ line_map[j] = i;
+ distance[i] = levenshtein ( text->text, lines[i] );
+ j++;
}
}
+ qsort_r ( line_map, j, sizeof ( int ), lev_sort, distance );
+ for ( i = 0; i < j; i++ ) {
+ filtered[i] = lines[line_map[i]];
+ }
// Cleanup + bookkeeping.
filtered_lines = j;
@@ -1432,6 +1498,7 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
free ( filtered );
free ( line_map );
+ free ( distance );
return retv;
}
diff --git a/source/run-dialog.c b/source/run-dialog.c
index fe06b02..ceb1286 100644
--- a/source/run-dialog.c
+++ b/source/run-dialog.c
@@ -150,7 +150,7 @@ static char ** get_apps ( void )
continue;
}
// Skip dot files.
- if(dent->d_name[0] == '.') {
+ if ( dent->d_name[0] == '.' ) {
continue;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment