Fix some stuff when pasting

This commit is contained in:
Qball Cow 2014-05-27 18:55:48 +02:00
parent ffedaae438
commit 0d228cc265
1 changed files with 67 additions and 44 deletions

View File

@ -1251,6 +1251,8 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
unsigned int selected = 0; unsigned int selected = 0;
for (;; ) for (;; )
{ {
int refilter = FALSE;
int update = FALSE;
XEvent ev; XEvent ev;
XNextEvent ( display, &ev ); XNextEvent ( display, &ev );
@ -1315,8 +1317,9 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
// Insert string move cursor. // Insert string move cursor.
textbox_insert ( text, text->cursor, str ); textbox_insert ( text, text->cursor, str );
textbox_cursor ( text, text->cursor + dl ); textbox_cursor ( text, text->cursor + dl );
// Force a redraw // Force a redraw and refiltering of the text.
textbox_draw ( text ); update = TRUE;
refilter = TRUE;
} }
XFree ( pbuf ); XFree ( pbuf );
} }
@ -1384,47 +1387,8 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
} }
else if ( rc ) else if ( rc )
{ {
char **tokens = tokenize ( text->text ); refilter = TRUE;
update = TRUE;
// input changed
for ( i = 0, j = 0; i < num_lines; i++ )
{
int match = mmc ( tokens, lines[i], i, mmc_data );
// If each token was matched, add it to list.
if ( match )
{
line_map[j] = i;
filtered[j++] = lines[i];
}
}
// Cleanup + bookkeeping.
filtered_lines = j;
selected = MIN ( selected, j - 1 );
for (; j < num_lines; j++ )
{
filtered[j] = NULL;
}
if ( config.zeltak_mode && filtered_lines == 1 )
{
if ( filtered[selected] )
{
retv = MENU_OK;
*selected_line = line_map[selected];
}
else
{
fprintf ( stderr, "We should never hit this." );
abort ();
}
break;
}
tokenize_free ( tokens );
} }
else else
{ {
@ -1456,11 +1420,13 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
{ {
selected--; selected--;
} }
update = TRUE;
} }
else if ( key == XK_Down || else if ( key == XK_Down ||
( key == XK_k && ev.xkey.state & ControlMask ) ) ( key == XK_k && ev.xkey.state & ControlMask ) )
{ {
selected = selected < filtered_lines - 1 ? MIN ( filtered_lines - 1, selected + 1 ) : 0; selected = selected < filtered_lines - 1 ? MIN ( filtered_lines - 1, selected + 1 ) : 0;
update = TRUE;
} }
else if ( key == XK_Page_Up ) else if ( key == XK_Page_Up )
{ {
@ -1472,6 +1438,7 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
{ {
selected -= ( max_elements - 1 ); selected -= ( max_elements - 1 );
} }
update = TRUE;
} }
else if ( key == XK_Page_Down ) else if ( key == XK_Page_Down )
{ {
@ -1481,6 +1448,7 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
{ {
selected = num_lines - 1; selected = num_lines - 1;
} }
update = TRUE;
} }
else if ( key == XK_h && ev.xkey.state & ControlMask ) else if ( key == XK_h && ev.xkey.state & ControlMask )
{ {
@ -1492,6 +1460,7 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
{ {
selected -= max_rows; selected -= max_rows;
} }
update = TRUE;
} }
else if ( key == XK_l && ev.xkey.state & ControlMask ) else if ( key == XK_l && ev.xkey.state & ControlMask )
{ {
@ -1500,14 +1469,17 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
{ {
selected = num_lines - 1; selected = num_lines - 1;
} }
update = TRUE;
} }
else if ( key == XK_Home || key == XK_KP_Home ) else if ( key == XK_Home || key == XK_KP_Home )
{ {
selected = 0; selected = 0;
update = TRUE;
} }
else if ( key == XK_End || key == XK_KP_End ) else if ( key == XK_End || key == XK_KP_End )
{ {
selected = num_lines - 1; selected = num_lines - 1;
update = TRUE;
} }
else if ( key == XK_Tab ) else if ( key == XK_Tab )
{ {
@ -1540,6 +1512,7 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
textbox_text ( text, str ); textbox_text ( text, str );
textbox_cursor_end ( text ); textbox_cursor_end ( text );
free ( str ); free ( str );
update = TRUE;
} }
// Double tab! // Double tab!
else if ( filtered_lines == 0 && key == prev_key ) else if ( filtered_lines == 0 && key == prev_key )
@ -1551,10 +1524,61 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
else else
{ {
selected = selected < filtered_lines - 1 ? MIN ( filtered_lines - 1, selected + 1 ) : 0; selected = selected < filtered_lines - 1 ? MIN ( filtered_lines - 1, selected + 1 ) : 0;
update = TRUE;
} }
} }
} }
} }
prev_key = key;
}
// If something changed, refilter the list. (paste or text entered)
if ( refilter )
{
char **tokens = tokenize ( text->text );
// input changed
for ( i = 0, j = 0; i < num_lines; i++ )
{
int match = mmc ( tokens, lines[i], i, mmc_data );
// If each token was matched, add it to list.
if ( match )
{
line_map[j] = i;
filtered[j++] = lines[i];
}
}
// Cleanup + bookkeeping.
filtered_lines = j;
selected = MIN ( selected, j - 1 );
for (; j < num_lines; j++ )
{
filtered[j] = NULL;
}
if ( config.zeltak_mode && filtered_lines == 1 )
{
if ( filtered[selected] )
{
retv = MENU_OK;
*selected_line = line_map[selected];
}
else
{
fprintf ( stderr, "We should never hit this." );
abort ();
}
break;
}
tokenize_free ( tokens );
}
// Update if requested.
if ( update )
{
menu_hide_arrow_text ( filtered_lines, selected, menu_hide_arrow_text ( filtered_lines, selected,
max_elements, arrowbox_top, max_elements, arrowbox_top,
arrowbox_bottom ); arrowbox_bottom );
@ -1564,7 +1588,6 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
menu_set_arrow_text ( filtered_lines, selected, menu_set_arrow_text ( filtered_lines, selected,
max_elements, arrowbox_top, max_elements, arrowbox_top,
arrowbox_bottom ); arrowbox_bottom );
prev_key = key;
} }
} }