summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorDave Davenport <qball@gmpclient.org>2016-02-03 09:01:13 +0100
committerDave Davenport <qball@gmpclient.org>2016-02-03 09:01:13 +0100
commitb557c4df6e51cf0dafa922b386470f2b3bb82c31 (patch)
treea1eb9733bbfaaceee079c78e051998080b348ad3 /source
parentfb4c0c085e21b8ed7f5d62937be2d48868597c1e (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.c26
-rw-r--r--source/rofi.c2
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 ) {