static int read_char(WINDOW *win, wint_t *c, int timeout) { static const int T = 150; static const int IPC_F = 10; int i; int result = ERR; for(i = 0; i <= timeout/T; i++) { int j; if(is_redraw_scheduled()) { modes_redraw(); } if(!is_status_bar_multiline() && !is_in_menu_like_mode() && get_mode() != CMDLINE_MODE) { check_if_filelists_have_changed(curr_view); if(curr_stats.number_of_windows != 1 && !curr_stats.view) check_if_filelists_have_changed(other_view); } check_background_jobs(); for(j = 0; j < IPC_F; j++) { ipc_check(); wtimeout(win, MIN(T, timeout)/IPC_F); if((result = wget_wch(win, c)) != ERR) break; if(is_redraw_scheduled()) { modes_redraw(); } } if(result != ERR) break; timeout -= T; } return result; }
static int read_char(WINDOW *win, wint_t *c, int timeout) { static const int T = 150; static const int IPC_F = 10; int i; int result = ERR; for(i = 0; i <= timeout/T; i++) { int j; process_scheduled_updates(); if(should_check_views_for_changes()) { check_view_for_changes(curr_view); check_view_for_changes(other_view); } check_background_jobs(); for(j = 0; j < IPC_F; j++) { ipc_check(); wtimeout(win, MIN(T, timeout)/IPC_F); if((result = wget_wch(win, c)) != ERR) { break; } process_scheduled_updates(); } if(result != ERR) { break; } timeout -= T; } return result; }
/* Sub-loop of the main loop that "asynchronously" queries for the input * performing the following tasks while waiting for input: * - checks for new IPC messages; * - checks whether contents of displayed directories changed; * - redraws UI if requested. * Returns KEY_CODE_YES for functional keys, OK for wide character and ERR * otherwise (e.g. after timeout). */ static int get_char_async_loop(WINDOW *win, wint_t *c, int timeout) { const int IPC_F = (ipc_enabled() && ipc_server()) ? 10 : 1; do { int i; if(should_check_views_for_changes()) { check_view_for_changes(curr_view); check_view_for_changes(other_view); } process_scheduled_updates(); for(i = 0; i < IPC_F; ++i) { int result; ipc_check(); wtimeout(win, MIN(cfg.min_timeout_len, timeout)/IPC_F); result = compat_wget_wch(win, c); if(result != ERR) { return result; } process_scheduled_updates(); } timeout -= cfg.min_timeout_len; } while(timeout > 0); return ERR; }
int *ipc_check_(float *timeout) { return( (int*) ipc_check(*timeout) ); }
/* Sub-loop of the main loop that "asynchronously" queries for the input * performing the following tasks while waiting for input: * - checks for new IPC messages; * - checks whether contents of displayed directories changed; * - redraws UI if requested. * Returns KEY_CODE_YES for functional keys (preprocesses *c in this case), OK * for wide character and ERR otherwise (e.g. after timeout). */ static int get_char_async_loop(WINDOW *win, wint_t *c, int timeout) { const int IPC_F = ipc_enabled() ? 10 : 1; do { int i; int delay_slice = DIV_ROUND_UP(MIN(cfg.min_timeout_len, timeout), IPC_F); #ifdef __PDCURSES__ /* pdcurses performs delays in 50 ms intervals (1/20 of a second). */ delay_slice = MAX(50, delay_slice); #endif if(should_check_views_for_changes()) { check_view_for_changes(curr_view); check_view_for_changes(other_view); } process_scheduled_updates(); for(i = 0; i < IPC_F && timeout > 0; ++i) { int result; ipc_check(curr_stats.ipc); wtimeout(win, delay_slice); timeout -= delay_slice; if(suggestions_are_visible) { /* Redraw suggestion box as it might have been hidden due to other * redraws. */ display_suggestion_box(curr_input_buf); } /* Update cursor before waiting for input. Modes set cursor correctly * within corresponding windows, but we need to call refresh on one of * them to make it active. */ update_hardware_cursor(); result = compat_wget_wch(win, c); if(result != ERR) { if(result == KEY_CODE_YES) { *c = K(*c); } else if(*c == L'\0') { *c = WC_C_SPACE; } return result; } process_scheduled_updates(); } } while(timeout > 0); return ERR; }