mirror of
https://github.com/davatorium/rofi.git
synced 2025-04-07 17:33:14 -04:00
Support Levenshtein in dmenu.i #149
This commit is contained in:
parent
f64395e4e9
commit
99118420ea
5 changed files with 28 additions and 32 deletions
|
@ -426,8 +426,6 @@ The following options are further explained in the theming section:
|
|||
|
||||
When searching sort the result based on levenshtein distance.
|
||||
|
||||
Note that levenshtein sort is disabled in dmenu mode.
|
||||
|
||||
### Dmenu specific
|
||||
|
||||
`-sep` *separator*
|
||||
|
|
17
doc/rofi.1
17
doc/rofi.1
|
@ -90,7 +90,8 @@ Keybindings can also be specified in the \fB\fCXresources\fR file.
|
|||
\fBrofi\fP can emulate \fB\fCdmenu\fR (a dynamic menu for X) when launched with the \fB\fC\-dmenu\fR flag.
|
||||
.PP
|
||||
The official website for \fB\fCdmenu\fR can be found:
|
||||
\[la]http://tools.suckless.org/dmenu/\[ra]
|
||||
.UR http://tools.suckless.org/dmenu/
|
||||
.UE
|
||||
.SH OPTIONS
|
||||
.PP
|
||||
\fB\fC\-key\-{mode}\fR \fBKEY\fP
|
||||
|
@ -531,8 +532,6 @@ Disable history
|
|||
\fB\fC\-levenshtein\-sort\fR
|
||||
.IP
|
||||
When searching sort the result based on levenshtein distance.
|
||||
.IP
|
||||
Note that levenshtein sort is disabled in dmenu mode.
|
||||
.SS Dmenu specific
|
||||
.PP
|
||||
\fB\fC\-sep\fR \fIseparator\fP
|
||||
|
@ -810,14 +809,18 @@ Check quotes used on the commandline: e.g. used “ instead of ".
|
|||
.SH WEBSITE
|
||||
.PP
|
||||
\fBrofi\fP website can be found at here
|
||||
\[la]https://davedavenport.github.io/rofi/\[ra]
|
||||
.UR https://davedavenport.github.io/rofi/
|
||||
.UE
|
||||
.PP
|
||||
\fBrofi\fP bugtracker can be found here
|
||||
\[la]https://github.com/DaveDavenport/rofi/issues\[ra]
|
||||
.UR https://github.com/DaveDavenport/rofi/issues
|
||||
.UE
|
||||
.SH AUTHOR
|
||||
.PP
|
||||
Qball Cow
|
||||
\[la]qball@gmpclient.org\[ra]
|
||||
.MT qball@gmpclient.org
|
||||
.ME
|
||||
.PP
|
||||
Original code based on work by: Sean Pringle
|
||||
\[la]sean.pringle@gmail.com\[ra]
|
||||
.MT sean.pringle@gmail.com
|
||||
.ME
|
||||
|
|
|
@ -91,8 +91,9 @@ typedef int ( *menu_match_cb )( char **tokens, const char *input, int case_sensi
|
|||
* @returns The command issued (see MenuReturn)
|
||||
*/
|
||||
MenuReturn menu ( char **lines, unsigned int num_lines, char **input, char *prompt,
|
||||
menu_match_cb mmc, void *mmc_data,
|
||||
int *selected_line, int sorting, get_display_value mgrv, void *mgrv_data ) __attribute__ ( ( nonnull ( 1, 3, 4, 7 ) ) );
|
||||
menu_match_cb mmc, void *mmc_data, int *selected_line, int sorting,
|
||||
get_display_value mgrv, void *mgrv_data, int *next_pos ) __attribute__ ( ( nonnull ( 1, 3,
|
||||
4, 7 ) ) );
|
||||
/**
|
||||
* @param sig The caught signal
|
||||
*
|
||||
|
|
|
@ -158,9 +158,9 @@ int dmenu_switcher_dialog ( char **input )
|
|||
}
|
||||
|
||||
do {
|
||||
int mretv = menu ( list, length, input, dmenu_prompt,
|
||||
token_match, NULL, &selected_line, FALSE, get_display_data, list );
|
||||
|
||||
int next_pos = selected_line;
|
||||
int mretv = menu ( list, length, input, dmenu_prompt,
|
||||
token_match, NULL, &selected_line, config.levenshtein_sort, get_display_data, list, &next_pos );
|
||||
// We normally do not want to restart the loop.
|
||||
restart = FALSE;
|
||||
if ( ( mretv & MENU_OK ) && list[selected_line] != NULL ) {
|
||||
|
@ -175,7 +175,7 @@ int dmenu_switcher_dialog ( char **input )
|
|||
if ( ( mretv & MENU_SHIFT ) ) {
|
||||
restart = TRUE;
|
||||
// Move to next line.
|
||||
selected_line = MIN ( selected_line + 1, length - 1 );
|
||||
selected_line = MIN ( next_pos, length - 1 );
|
||||
}
|
||||
retv = TRUE;
|
||||
}
|
||||
|
@ -188,7 +188,7 @@ int dmenu_switcher_dialog ( char **input )
|
|||
if ( ( mretv & MENU_SHIFT ) ) {
|
||||
restart = TRUE;
|
||||
// Move to next line.
|
||||
selected_line = MIN ( selected_line + 1, length - 1 );
|
||||
selected_line = MIN ( next_pos, length - 1 );
|
||||
}
|
||||
retv = TRUE;
|
||||
}
|
||||
|
|
|
@ -311,7 +311,6 @@ typedef struct MenuState
|
|||
Time last_button_press;
|
||||
|
||||
int quit;
|
||||
int init;
|
||||
// Return state
|
||||
int *selected_line;
|
||||
MenuReturn retv;
|
||||
|
@ -734,16 +733,6 @@ static void menu_refilter ( MenuState *state, char **lines, menu_match_cb mmc, v
|
|||
if ( sorting ) {
|
||||
state->distance[i] = levenshtein ( state->text->text, lines[i] );
|
||||
}
|
||||
// Try to look-up the selected line and highlight that.
|
||||
// This is needed 'hack' to fix the dmenu 'next row' modi.
|
||||
// int to unsigned int is valid because we check negativeness of
|
||||
// selected_line
|
||||
if ( state->init == TRUE && ( state->selected_line ) != NULL &&
|
||||
( *( state->selected_line ) ) >= 0 &&
|
||||
( (unsigned int) ( *( state->selected_line ) ) ) == i ) {
|
||||
state->selected = j;
|
||||
state->init = FALSE;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
}
|
||||
|
@ -917,7 +906,7 @@ static void menu_paste ( MenuState *state, XSelectionEvent *xse )
|
|||
|
||||
MenuReturn menu ( char **lines, unsigned int num_lines, char **input, char *prompt,
|
||||
menu_match_cb mmc, void *mmc_data, int *selected_line, int sorting,
|
||||
get_display_value mgrv, void *mgrv_data )
|
||||
get_display_value mgrv, void *mgrv_data, int *next_pos )
|
||||
{
|
||||
int shift = FALSE;
|
||||
MenuState state = {
|
||||
|
@ -928,7 +917,6 @@ MenuReturn menu ( char **lines, unsigned int num_lines, char **input, char *prom
|
|||
.last_offset = 0,
|
||||
.num_lines = num_lines,
|
||||
.distance = NULL,
|
||||
.init = TRUE,
|
||||
.quit = FALSE,
|
||||
.filtered_lines = 0,
|
||||
.max_elements = 0,
|
||||
|
@ -942,7 +930,10 @@ MenuReturn menu ( char **lines, unsigned int num_lines, char **input, char *prom
|
|||
.mgrv_data = mgrv_data
|
||||
};
|
||||
unsigned int i;
|
||||
workarea mon;
|
||||
if ( next_pos ) {
|
||||
*next_pos = *selected_line;
|
||||
}
|
||||
workarea mon;
|
||||
|
||||
// main window isn't explicitly destroyed in case we switch modes. Reusing it prevents flicker
|
||||
XWindowAttributes attr;
|
||||
|
@ -1258,6 +1249,10 @@ MenuReturn menu ( char **lines, unsigned int num_lines, char **input, char *prom
|
|||
g_free ( *input );
|
||||
*input = g_strdup ( state.text->text );
|
||||
|
||||
if ( next_pos ) {
|
||||
*( next_pos ) = state.selected + 1;
|
||||
}
|
||||
|
||||
int retv = state.retv;
|
||||
menu_free_state ( &state );
|
||||
|
||||
|
@ -1287,7 +1282,6 @@ void error_dialog ( const char *msg )
|
|||
.last_offset = 0,
|
||||
.num_lines = 0,
|
||||
.distance = NULL,
|
||||
.init = FALSE,
|
||||
.quit = FALSE,
|
||||
.filtered_lines = 0,
|
||||
.columns = 0,
|
||||
|
@ -1856,7 +1850,7 @@ SwitcherMode switcher_run ( char **input, Switcher *sw )
|
|||
&selected_line,
|
||||
config.levenshtein_sort,
|
||||
sw->mgrv,
|
||||
sw );
|
||||
sw, NULL );
|
||||
|
||||
SwitcherMode retv = sw->result ( mretv, input, selected_line, sw );
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue