diff options
author | Dave Davenport <qball@gmpclient.org> | 2016-02-03 09:01:13 +0100 |
---|---|---|
committer | Dave Davenport <qball@gmpclient.org> | 2016-02-03 09:01:13 +0100 |
commit | b557c4df6e51cf0dafa922b386470f2b3bb82c31 (patch) | |
tree | a1eb9733bbfaaceee079c78e051998080b348ad3 /source | |
parent | fb4c0c085e21b8ed7f5d62937be2d48868597c1e (diff) |
Issue: #333, Check if row is selected, don't assume selected_line is valid.
Diffstat (limited to 'source')
-rw-r--r-- | source/dialogs/dmenu.c | 26 | ||||
-rw-r--r-- | source/rofi.c | 2 |
2 files changed, 17 insertions, 11 deletions
diff --git a/source/dialogs/dmenu.c b/source/dialogs/dmenu.c index 37749b67..46c87753 100644 --- a/source/dialogs/dmenu.c +++ b/source/dialogs/dmenu.c @@ -426,25 +426,29 @@ int dmenu_switcher_dialog ( void ) * Select item mode. */ restart = 1; - if ( ( mretv & ( MENU_OK | MENU_QUICK_SWITCH ) ) && cmd_list[pd->selected_line] != NULL ) { - dmenu_output_formatted_line ( pd->format, cmd_list[pd->selected_line], pd->selected_line, input ); - retv = TRUE; - if ( ( mretv & MENU_QUICK_SWITCH ) ) { - retv = 10 + ( mretv & MENU_LOWER_MASK ); - } - return retv; - } - else if ( ( mretv & MENU_CANCEL ) == MENU_CANCEL ) { + // Skip if no valid item is selected. + if ( ( mretv & MENU_CANCEL ) == MENU_CANCEL ) { // In no custom mode we allow canceling. restart = ( find_arg ( "-only-match" ) >= 0 ); } - pd->selected_line = next_pos - 1; + else if ( pd->selected_line != UINT32_MAX ){ + + if ( ( mretv & ( MENU_OK | MENU_QUICK_SWITCH ) ) && cmd_list[pd->selected_line] != NULL ) { + dmenu_output_formatted_line ( pd->format, cmd_list[pd->selected_line], pd->selected_line, input ); + retv = TRUE; + if ( ( mretv & MENU_QUICK_SWITCH ) ) { + retv = 10 + ( mretv & MENU_LOWER_MASK ); + } + return retv; + } + pd->selected_line = next_pos - 1; + } continue; } // We normally do not want to restart the loop. restart = FALSE; // Normal mode - if ( ( mretv & MENU_OK ) && cmd_list[pd->selected_line] != NULL ) { + if ( ( mretv & MENU_OK ) && pd->selected_line != UINT32_MAX && cmd_list[pd->selected_line] != NULL ) { dmenu_output_formatted_line ( pd->format, cmd_list[pd->selected_line], pd->selected_line, input ); if ( ( mretv & MENU_SHIFT ) ) { restart = TRUE; diff --git a/source/rofi.c b/source/rofi.c index 172f9826..749be43c 100644 --- a/source/rofi.c +++ b/source/rofi.c @@ -1379,6 +1379,7 @@ static void menu_mainloop_iter ( MenuState *state, XEvent *ev ) } for ( unsigned int a = CUSTOM_1; a <= CUSTOM_19; a++ ) { if ( abe_test_action ( a, ev->xkey.state, key ) ) { + state->selected_line = UINT32_MAX; if ( state->selected < state->filtered_lines ) { ( state->selected_line ) = state->line_map[state->selected]; } @@ -1403,6 +1404,7 @@ static void menu_mainloop_iter ( MenuState *state, XEvent *ev ) int shift = ( ( ev->xkey.state & ShiftMask ) == ShiftMask ); // If a valid item is selected, return that.. + state->selected_line = UINT32_MAX; if ( state->selected < state->filtered_lines ) { ( state->selected_line ) = state->line_map[state->selected]; if ( strlen ( state->text->text ) > 0 && rc == -2 ) { |