void vifm_try_leave(int write_info, int cquit, int force) { if(!force && bg_has_active_jobs()) { if(!prompt_msg("Warning", "Some of backgrounded commands are still " "working. Quit?")) { return; } } fuse_unmount_all(); if(write_info) { write_info_file(); } if(stats_file_choose_action_set()) { vim_write_empty_file_list(); } #ifdef _WIN32 erase(); refresh(); #endif ui_shutdown(); vifm_leave(EXIT_SUCCESS, cquit); }
/* Handles current content of the menu to Vim as quickfix list. */ static void cmd_v(key_info_t key_info, keys_info_t *keys_info) { int bg; const char *vi_cmd; FILE *vim_stdin; char *cmd; int i; int qf = 1; /* If both first and last lines do not contain colons, treat lines as list of * file names. */ if(strchr(menu->items[0], ':') == NULL && strchr(menu->items[menu->len - 1], ':') == NULL) { qf = 0; } ui_shutdown(); curr_stats.need_update = UT_FULL; vi_cmd = cfg_get_vicmd(&bg); if(!qf) { char *const arg = shell_like_escape("+exe 'bd!|args' " "join(map(getline('1','$'),'fnameescape(v:val)'))", 0); cmd = format_str("%s %s +argument%d -", vi_cmd, arg, menu->pos + 1); free(arg); } else if(menu->pos == 0) { /* For some reason +cc1 causes noisy messages on status line, so handle this * case separately. */ cmd = format_str("%s +cgetbuffer +bd! +cfirst -", vi_cmd); } else { cmd = format_str("%s +cgetbuffer +bd! +cfirst +cc%d -", vi_cmd, menu->pos + 1); } vim_stdin = popen(cmd, "w"); free(cmd); if(vim_stdin == NULL) { recover_after_shellout(); show_error_msg("Vim QuickFix", "Failed to send list of files to editor."); return; } for(i = 0; i < menu->len; ++i) { fputs(menu->items[i], vim_stdin); putc('\n', vim_stdin); } pclose(vim_stdin); recover_after_shellout(); }
static void _gnuc_noreturn shutdown_nicely(int sig, const char descr[]) { LOG_FUNC_ENTER; ui_shutdown(); term_title_update(NULL); fuse_unmount_all(); write_info_file(); fprintf(stdout, "Vifm killed by signal: %d (%s).\n", sig, descr); /* Alternatively we could do this sequence: * signal(sig, SIG_DFL); * raise(sig); * but only on *nix systems. */ _Exit(EXIT_FAILURE); }
void _gnuc_noreturn vifm_finish(const char message[]) { ui_shutdown(); /* Update vifminfo only if we were able to startup, otherwise we can end up * writing from some intermediate half-initialized state. One particular * case: after vifminfo read, but before configuration is processed, as a * result we write very little information to vifminfo file according to * default value of 'vifminfo' option. */ if(curr_stats.load_stage == 3) { write_info_file(); } fprintf(stderr, "%s\n", message); LOG_ERROR_MSG("Finishing: %s", message); vifm_exit(EXIT_FAILURE); }
void showtime_shutdown(int retcode) { TRACE(TRACE_DEBUG, "core", "Shutdown requested, returncode = %d", retcode); if(showtime_retcode != 1) { // Force exit arch_exit(retcode); } showtime_retcode = retcode; // run early shutdown hooks (those must be fast) shutdown_hook_run(1); htsmsg_store_flush(); if(ui_shutdown() == -1) { // Primary UI has no shutdown method, launch a new thread to stop hts_thread_create_detached("shutdown", showtime_shutdown0, NULL, THREAD_PRIO_NORMAL); } }
void _gnuc_noreturn vifm_choose_files(const view_t *view, int nfiles, char *files[]) { int exit_code; /* As curses can do something with terminal on shutting down, disable it * before writing anything to the screen. */ ui_shutdown(); exit_code = EXIT_SUCCESS; if(vim_write_file_list(view, nfiles, files) != 0) { exit_code = EXIT_FAILURE; } /* XXX: this ignores nfiles+files. */ if(vim_run_choose_cmd(view) != 0) { exit_code = EXIT_FAILURE; } write_info_file(); vifm_leave(exit_code, 0); }
void machine_shutdown(void) { file_system_detach_disk_shutdown(); machine_specific_shutdown(); autostart_shutdown(); #ifdef HAS_JOYSTICK joystick_close(); #endif sound_close(); printer_shutdown(); gfxoutput_shutdown(); fliplist_shutdown(); file_system_shutdown(); fsdevice_shutdown(); tape_shutdown(); traps_shutdown(); kbdbuf_shutdown(); keyboard_shutdown(); monitor_shutdown(); console_close_all(); cmdline_shutdown(); resources_shutdown(); drive_shutdown(); machine_maincpu_shutdown(); video_shutdown(); ui_shutdown(); sysfile_shutdown(); log_close_all(); event_shutdown(); network_shutdown(); autostart_resources_shutdown(); fsdevice_resources_shutdown(); disk_image_resources_shutdown(); machine_resources_shutdown(); sysfile_resources_shutdown(); zfile_shutdown(); ui_resources_shutdown(); log_resources_shutdown(); fliplist_resources_shutdown(); romset_resources_shutdown(); #ifdef HAVE_NETWORK monitor_network_resources_shutdown(); #endif archdep_shutdown(); lib_debug_check(); }
void event_loop(const int *quit) { /* TODO: refactor this function event_loop(). */ LOG_FUNC_ENTER; const wchar_t *const prev_input_buf = curr_input_buf; const size_t *const prev_input_buf_pos = curr_input_buf_pos; wchar_t input_buf[128]; size_t input_buf_pos; int last_result = 0; int wait_for_enter = 0; int wait_for_suggestion = 0; int timeout = cfg.timeout_len; input_buf[0] = L'\0'; input_buf_pos = 0; curr_input_buf = &input_buf[0]; curr_input_buf_pos = &input_buf_pos; /* Make sure to set the working directory once in order to have the * desired state even before any events are processed. */ (void)vifm_chdir(flist_get_dir(curr_view)); while(!*quit) { wint_t c; size_t counter; int got_input; lwin.user_selection = 1; rwin.user_selection = 1; modes_pre(); /* Waits for timeout then skips if no key press. Short-circuit if we're not * waiting for the next key after timeout. */ do { const int actual_timeout = wait_for_suggestion ? MIN(timeout, cfg.sug.delay) : timeout; if(!ensure_term_is_ready()) { wait_for_enter = 0; continue; } modes_periodic(); bg_check(); got_input = (get_char_async_loop(status_bar, &c, actual_timeout) != ERR); /* If suggestion delay timed out, reset it and wait the rest of the * timeout. */ if(!got_input && wait_for_suggestion) { wait_for_suggestion = 0; timeout -= actual_timeout; display_suggestion_box(input_buf); continue; } wait_for_suggestion = 0; if(!got_input && (input_buf_pos == 0 || last_result == KEYS_WAIT)) { timeout = cfg.timeout_len; continue; } if(got_input && c == K(KEY_RESIZE)) { modes_redraw(); continue; } break; } while(1); suggestions_are_visible = 0; /* Ensure that current working directory is set correctly (some pieces of * code rely on this, e.g. %c macro in current directory). */ (void)vifm_chdir(flist_get_dir(curr_view)); if(got_input) { if(wait_for_enter) { wait_for_enter = 0; curr_stats.save_msg = 0; ui_sb_clear(); if(c == WC_CR) { continue; } } if(c == WC_C_z) { ui_shutdown(); stop_process(); continue; } if(input_buf_pos < ARRAY_LEN(input_buf) - 2) { input_buf[input_buf_pos++] = c; input_buf[input_buf_pos] = L'\0'; } else { /* Recover from input buffer overflow by resetting its contents. */ reset_input_buf(input_buf, &input_buf_pos); clear_input_bar(); continue; } } counter = vle_keys_counter(); if(!got_input && last_result == KEYS_WAIT_SHORT) { hide_suggestion_box(); last_result = vle_keys_exec_timed_out(input_buf); counter = vle_keys_counter() - counter; assert(counter <= input_buf_pos); if(counter > 0) { memmove(input_buf, input_buf + counter, (wcslen(input_buf) - counter + 1)*sizeof(wchar_t)); } } else { if(got_input) { curr_stats.save_msg = 0; } if(last_result == KEYS_WAIT || last_result == KEYS_WAIT_SHORT) { hide_suggestion_box(); } last_result = vle_keys_exec(input_buf); counter = vle_keys_counter() - counter; assert(counter <= input_buf_pos); if(counter > 0) { input_buf_pos -= counter; memmove(input_buf, input_buf + counter, (wcslen(input_buf) - counter + 1)*sizeof(wchar_t)); } if(last_result == KEYS_WAIT || last_result == KEYS_WAIT_SHORT) { if(should_display_suggestion_box()) { wait_for_suggestion = 1; } if(got_input) { modupd_input_bar(input_buf); } if(last_result == KEYS_WAIT_SHORT && wcscmp(input_buf, L"\033") == 0) { timeout = 1; } if(counter > 0) { clear_input_bar(); } if(!curr_stats.save_msg && curr_view->selected_files && !vle_mode_is(CMDLINE_MODE)) { print_selected_msg(); } continue; } } timeout = cfg.timeout_len; process_scheduled_updates(); reset_input_buf(input_buf, &input_buf_pos); clear_input_bar(); if(ui_sb_multiline()) { wait_for_enter = 1; update_all_windows(); continue; } /* Ensure that current working directory is set correctly (some pieces of * code rely on this). PWD could be changed during command execution, but * it should be correct for modes_post() in case of preview modes. */ (void)vifm_chdir(flist_get_dir(curr_view)); modes_post(); } curr_input_buf = prev_input_buf; curr_input_buf_pos = prev_input_buf_pos; }