static ModeMode combi_mode_result ( Mode *sw, int mretv, char **input, unsigned int selected_line ) { CombiModePrivateData *pd = mode_get_private_data ( sw ); if ( *input[0] == '!' ) { int switcher = -1; for ( unsigned i = 0; switcher == -1 && i < pd->num_switchers; i++ ) { if ( ( *input )[1] == mode_get_name ( pd->switchers[i] )[0] ) { switcher = i; } } if ( switcher >= 0 ) { char *n = strchr ( *input, ' ' ); // skip whitespace if ( n != NULL ) { n++; return mode_result ( pd->switchers[switcher], mretv, &n, selected_line - pd->starts[switcher] ); } return MODE_EXIT; } } for ( unsigned i = 0; i < pd->num_switchers; i++ ) { if ( selected_line >= pd->starts[i] && selected_line < ( pd->starts[i] + pd->lengths[i] ) ) { return mode_result ( pd->switchers[i], mretv, input, selected_line - pd->starts[i] ); } } return MODE_EXIT; }
void process_result ( RofiViewState *state ) { Mode *sw = state->sw; if ( sw != NULL ) { unsigned int selected_line = rofi_view_get_selected_line ( state );; MenuReturn mretv = rofi_view_get_return_value ( state ); char *input = g_strdup ( rofi_view_get_user_input ( state ) ); rofi_view_set_active ( NULL ); rofi_view_free ( state ); ModeMode retv = mode_result ( sw, mretv, &input, selected_line ); ModeMode mode = curr_switcher; // Find next enabled if ( retv == NEXT_DIALOG ) { mode = ( mode + 1 ) % num_modi; } else if ( retv == PREVIOUS_DIALOG ) { if ( mode == 0 ) { mode = num_modi - 1; } else { mode = ( mode - 1 ) % num_modi; } } else if ( retv == RELOAD_DIALOG ) { // do nothing. } else if ( retv < MODE_EXIT ) { mode = ( retv ) % num_modi; } else { mode = retv; } if ( mode != MODE_EXIT ) { /** * Load in the new mode. */ __run_switcher_internal ( mode, input ); g_free ( input ); return; } // Cleanup g_free ( input ); for ( unsigned int i = 0; i < num_modi; i++ ) { mode_destroy ( modi[i] ); } } }