mirror of https://github.com/davatorium/rofi.git
Fix some stuff when pasting
This commit is contained in:
parent
ffedaae438
commit
0d228cc265
285
source/rofi.c
285
source/rofi.c
|
@ -1251,6 +1251,8 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
|
|||
unsigned int selected = 0;
|
||||
for (;; )
|
||||
{
|
||||
int refilter = FALSE;
|
||||
int update = FALSE;
|
||||
XEvent ev;
|
||||
XNextEvent ( display, &ev );
|
||||
|
||||
|
@ -1315,8 +1317,9 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
|
|||
// Insert string move cursor.
|
||||
textbox_insert ( text, text->cursor, str );
|
||||
textbox_cursor ( text, text->cursor + dl );
|
||||
// Force a redraw
|
||||
textbox_draw ( text );
|
||||
// Force a redraw and refiltering of the text.
|
||||
update = TRUE;
|
||||
refilter = TRUE;
|
||||
}
|
||||
XFree ( pbuf );
|
||||
}
|
||||
|
@ -1383,6 +1386,153 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
|
|||
break;
|
||||
}
|
||||
else if ( rc )
|
||||
{
|
||||
refilter = TRUE;
|
||||
update = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// unhandled key
|
||||
KeySym key = XkbKeycodeToKeysym ( display, ev.xkey.keycode, 0, 0 );
|
||||
|
||||
if ( key == XK_Escape
|
||||
// pressing one of the global key bindings closes the switcher. this allows fast closing of the menu if an item is not selected
|
||||
|| ( ( windows_modmask == AnyModifier || ev.xkey.state & windows_modmask ) && key == windows_keysym )
|
||||
|| ( ( rundialog_modmask == AnyModifier || ev.xkey.state & rundialog_modmask ) && key == rundialog_keysym )
|
||||
|| ( ( sshdialog_modmask == AnyModifier || ev.xkey.state & sshdialog_modmask ) && key == sshdialog_keysym )
|
||||
)
|
||||
{
|
||||
retv = MENU_CANCEL;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Up or Shift-Tab
|
||||
if ( key == XK_Up || ( key == XK_Tab && ev.xkey.state & ShiftMask ) ||
|
||||
( key == XK_j && ev.xkey.state & ControlMask ) )
|
||||
{
|
||||
if ( selected == 0 )
|
||||
{
|
||||
selected = filtered_lines;
|
||||
}
|
||||
|
||||
if ( selected > 0 )
|
||||
{
|
||||
selected--;
|
||||
}
|
||||
update = TRUE;
|
||||
}
|
||||
else if ( key == XK_Down ||
|
||||
( key == XK_k && ev.xkey.state & ControlMask ) )
|
||||
{
|
||||
selected = selected < filtered_lines - 1 ? MIN ( filtered_lines - 1, selected + 1 ) : 0;
|
||||
update = TRUE;
|
||||
}
|
||||
else if ( key == XK_Page_Up )
|
||||
{
|
||||
if ( selected < max_elements )
|
||||
{
|
||||
selected = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
selected -= ( max_elements - 1 );
|
||||
}
|
||||
update = TRUE;
|
||||
}
|
||||
else if ( key == XK_Page_Down )
|
||||
{
|
||||
selected += ( max_elements - 1 );
|
||||
|
||||
if ( selected >= num_lines )
|
||||
{
|
||||
selected = num_lines - 1;
|
||||
}
|
||||
update = TRUE;
|
||||
}
|
||||
else if ( key == XK_h && ev.xkey.state & ControlMask )
|
||||
{
|
||||
if ( selected < max_rows )
|
||||
{
|
||||
selected = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
selected -= max_rows;
|
||||
}
|
||||
update = TRUE;
|
||||
}
|
||||
else if ( key == XK_l && ev.xkey.state & ControlMask )
|
||||
{
|
||||
selected += max_rows;
|
||||
if ( selected >= num_lines )
|
||||
{
|
||||
selected = num_lines - 1;
|
||||
}
|
||||
update = TRUE;
|
||||
}
|
||||
else if ( key == XK_Home || key == XK_KP_Home )
|
||||
{
|
||||
selected = 0;
|
||||
update = TRUE;
|
||||
}
|
||||
else if ( key == XK_End || key == XK_KP_End )
|
||||
{
|
||||
selected = num_lines - 1;
|
||||
update = TRUE;
|
||||
}
|
||||
else if ( key == XK_Tab )
|
||||
{
|
||||
if ( filtered_lines == 1 )
|
||||
{
|
||||
if ( filtered[selected] )
|
||||
{
|
||||
retv = MENU_OK;
|
||||
*selected_line = line_map[selected];
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf ( stderr, "We should never hit this." );
|
||||
abort ();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
int length_prefix = calculate_common_prefix ( filtered, num_lines );
|
||||
|
||||
// TODO: memcmp to utf8 aware cmp.
|
||||
if ( length_prefix && memcmp ( filtered[0], text->text, length_prefix ) )
|
||||
{
|
||||
// Do not want to modify original string, so make copy.
|
||||
// not eff..
|
||||
char * str = malloc ( sizeof ( char ) * ( length_prefix + 1 ) );
|
||||
memcpy ( str, filtered[0], length_prefix );
|
||||
str[length_prefix] = '\0';
|
||||
textbox_text ( text, str );
|
||||
textbox_cursor_end ( text );
|
||||
free ( str );
|
||||
update = TRUE;
|
||||
}
|
||||
// Double tab!
|
||||
else if ( filtered_lines == 0 && key == prev_key )
|
||||
{
|
||||
retv = MENU_NEXT;
|
||||
*selected_line = 0;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
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 );
|
||||
|
||||
|
@ -1426,135 +1576,9 @@ MenuReturn menu ( char **lines, char **input, char *prompt, Time *time, int *shi
|
|||
|
||||
tokenize_free ( tokens );
|
||||
}
|
||||
else
|
||||
// Update if requested.
|
||||
if ( update )
|
||||
{
|
||||
// unhandled key
|
||||
KeySym key = XkbKeycodeToKeysym ( display, ev.xkey.keycode, 0, 0 );
|
||||
|
||||
if ( key == XK_Escape
|
||||
// pressing one of the global key bindings closes the switcher. this allows fast closing of the menu if an item is not selected
|
||||
|| ( ( windows_modmask == AnyModifier || ev.xkey.state & windows_modmask ) && key == windows_keysym )
|
||||
|| ( ( rundialog_modmask == AnyModifier || ev.xkey.state & rundialog_modmask ) && key == rundialog_keysym )
|
||||
|| ( ( sshdialog_modmask == AnyModifier || ev.xkey.state & sshdialog_modmask ) && key == sshdialog_keysym )
|
||||
)
|
||||
{
|
||||
retv = MENU_CANCEL;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Up or Shift-Tab
|
||||
if ( key == XK_Up || ( key == XK_Tab && ev.xkey.state & ShiftMask ) ||
|
||||
( key == XK_j && ev.xkey.state & ControlMask ) )
|
||||
{
|
||||
if ( selected == 0 )
|
||||
{
|
||||
selected = filtered_lines;
|
||||
}
|
||||
|
||||
if ( selected > 0 )
|
||||
{
|
||||
selected--;
|
||||
}
|
||||
}
|
||||
else if ( key == XK_Down ||
|
||||
( key == XK_k && ev.xkey.state & ControlMask ) )
|
||||
{
|
||||
selected = selected < filtered_lines - 1 ? MIN ( filtered_lines - 1, selected + 1 ) : 0;
|
||||
}
|
||||
else if ( key == XK_Page_Up )
|
||||
{
|
||||
if ( selected < max_elements )
|
||||
{
|
||||
selected = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
selected -= ( max_elements - 1 );
|
||||
}
|
||||
}
|
||||
else if ( key == XK_Page_Down )
|
||||
{
|
||||
selected += ( max_elements - 1 );
|
||||
|
||||
if ( selected >= num_lines )
|
||||
{
|
||||
selected = num_lines - 1;
|
||||
}
|
||||
}
|
||||
else if ( key == XK_h && ev.xkey.state & ControlMask )
|
||||
{
|
||||
if ( selected < max_rows )
|
||||
{
|
||||
selected = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
selected -= max_rows;
|
||||
}
|
||||
}
|
||||
else if ( key == XK_l && ev.xkey.state & ControlMask )
|
||||
{
|
||||
selected += max_rows;
|
||||
if ( selected >= num_lines )
|
||||
{
|
||||
selected = num_lines - 1;
|
||||
}
|
||||
}
|
||||
else if ( key == XK_Home || key == XK_KP_Home )
|
||||
{
|
||||
selected = 0;
|
||||
}
|
||||
else if ( key == XK_End || key == XK_KP_End )
|
||||
{
|
||||
selected = num_lines - 1;
|
||||
}
|
||||
else if ( key == XK_Tab )
|
||||
{
|
||||
if ( filtered_lines == 1 )
|
||||
{
|
||||
if ( filtered[selected] )
|
||||
{
|
||||
retv = MENU_OK;
|
||||
*selected_line = line_map[selected];
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf ( stderr, "We should never hit this." );
|
||||
abort ();
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
int length_prefix = calculate_common_prefix ( filtered, num_lines );
|
||||
|
||||
// TODO: memcmp to utf8 aware cmp.
|
||||
if ( length_prefix && memcmp ( filtered[0], text->text, length_prefix ) )
|
||||
{
|
||||
// Do not want to modify original string, so make copy.
|
||||
// not eff..
|
||||
char * str = malloc ( sizeof ( char ) * ( length_prefix + 1 ) );
|
||||
memcpy ( str, filtered[0], length_prefix );
|
||||
str[length_prefix] = '\0';
|
||||
textbox_text ( text, str );
|
||||
textbox_cursor_end ( text );
|
||||
free ( str );
|
||||
}
|
||||
// Double tab!
|
||||
else if ( filtered_lines == 0 && key == prev_key )
|
||||
{
|
||||
retv = MENU_NEXT;
|
||||
*selected_line = 0;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
selected = selected < filtered_lines - 1 ? MIN ( filtered_lines - 1, selected + 1 ) : 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
menu_hide_arrow_text ( filtered_lines, selected,
|
||||
max_elements, arrowbox_top,
|
||||
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,
|
||||
max_elements, arrowbox_top,
|
||||
arrowbox_bottom );
|
||||
prev_key = key;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue