Created
July 5, 2014 17:24
-
-
Save DaveDavenport/91d0141e9f366db09b1e to your computer and use it in GitHub Desktop.
Patch for different sorting.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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