int main(int argc, char *argv[]) { /* TODO: refactor main() function */ char dir[PATH_MAX]; char lwin_path[PATH_MAX] = ""; char rwin_path[PATH_MAX] = ""; int lwin_handle = 0, rwin_handle = 0; int old_config; int no_configs; init_config(); if(is_in_string_array(argv + 1, argc - 1, "--logging")) { init_logger(1); } (void)setlocale(LC_ALL, ""); if(getcwd(dir, sizeof(dir)) == NULL) { perror("getcwd"); return -1; } #ifdef _WIN32 to_forward_slash(dir); #endif init_filelists(); init_registers(); set_config_paths(); reinit_logger(); init_commands(); init_builtin_functions(); update_path_env(1); if(init_status() != 0) { puts("Error during session status initialization."); return -1; } no_configs = is_in_string_array(argv + 1, argc - 1, "--no-configs"); /* Tell file type module what function to use to check availability of * external programs. */ config_filetypes(&external_command_exists); /* This should be called before loading any configuration file. */ reset_all_file_associations(curr_stats.env_type == ENVTYPE_EMULATOR_WITH_X); init_option_handlers(); old_config = is_old_config(); if(!old_config && !no_configs) read_info_file(0); ipc_pre_init(); parse_args(argc, argv, dir, lwin_path, rwin_path, &lwin_handle, &rwin_handle); ipc_init(&parse_recieved_arguments); init_background(); set_view_path(&lwin, lwin_path); set_view_path(&rwin, rwin_path); /* Force view switch when path is specified for invisible pane. */ if(lwin_path[0] != '\0' && rwin_path[0] == '\0' && curr_view != &lwin) { change_window(); } load_initial_directory(&lwin, dir); load_initial_directory(&rwin, dir); /* Force split view when two paths are specified on command-line. */ if(lwin_path[0] != '\0' && rwin_path[0] != '\0') { curr_stats.number_of_windows = 2; } /* Setup the ncurses interface. */ if(!setup_ncurses_interface()) return -1; colmgr_init(COLOR_PAIRS); init_modes(); init_undo_list(&perform_operation, NULL, &cfg.undo_levels); load_local_options(curr_view); curr_stats.load_stage = 1; if(!old_config && !no_configs) { load_scheme(); source_config(); } write_color_scheme_file(); setup_signals(); if(old_config && !no_configs) { convert_configs(); curr_stats.load_stage = 0; read_info_file(0); curr_stats.load_stage = 1; set_view_path(&lwin, lwin_path); set_view_path(&rwin, rwin_path); load_initial_directory(&lwin, dir); load_initial_directory(&rwin, dir); source_config(); } (void)create_trash_dir(cfg.trash_dir); check_path_for_file(&lwin, lwin_path, lwin_handle); check_path_for_file(&rwin, rwin_path, rwin_handle); curr_stats.load_stage = 2; exec_startup_commands(argc, argv); update_screen(UT_FULL); modes_update(); /* Update histories of the views to ensure that their current directories, * which might have been set using command-line parameters, are stored in the * history. This is not done automatically as history manipulation should be * postponed until views are fully loaded, otherwise there is no correct * information about current file and relative cursor position. */ save_view_history(&lwin, NULL, NULL, -1); save_view_history(&rwin, NULL, NULL, -1); curr_stats.load_stage = 3; main_loop(); return 0; }
int main(int argc, char *argv[]) { char dir[PATH_MAX]; char config_dir[PATH_MAX]; char *console = NULL; int x; int rwin_args = 0; int lwin_args = 0; struct stat stat_buf; setlocale(LC_ALL, ""); getcwd(dir, sizeof(dir)); /* Window initializations */ rwin.curr_line = 0; rwin.top_line = 0; rwin.list_rows = 0; rwin.list_pos = 0; rwin.selected_filelist = NULL; rwin.history_num = 0; rwin.invert = 0; rwin.color_scheme = 0; lwin.curr_line = 0; lwin.top_line = 0; lwin.list_rows = 0; lwin.list_pos = 0; lwin.selected_filelist = NULL; lwin.history_num = 0; lwin.invert = 0; lwin.color_scheme = 0; /* These need to be initialized before reading the configuration file */ cfg.command_num = 0; cfg.filetypes_num = 0; cfg.nmapped_num = 0; cfg.vim_filter = 0; cfg.show_one_window = 0; command_list = NULL; filetypes = NULL; cfg.search_history_len = 15; cfg.search_history_num = -1; cfg.search_history = (char **)calloc(cfg.search_history_len, sizeof(char*)); cfg.cmd_history_len = 15; cfg.cmd_history_num = -1; cfg.cmd_history = (char **)calloc(cfg.cmd_history_len, sizeof(char *)); cfg.auto_execute = 0; cfg.color_scheme_num = 0; cfg.color_pairs_num = 0; col_schemes = malloc(sizeof(Col_scheme) * 8); /* Maximum argument length to pass to the shell */ if (! (cfg.max_args = sysconf(_SC_ARG_MAX)) > 0) cfg.max_args = 4096; /* POSIX MINIMUM */ init_config(); set_config_dir(); read_config_file(); /* Safety check for existing vifmrc file without FUSE_HOME */ if (cfg.fuse_home == NULL) cfg.fuse_home = strdup("/tmp/vifm_FUSE"); /* Misc configuration */ lwin.prev_invert = lwin.invert; lwin.hide_dot = 1; strncpy(lwin.regexp, "\\..~$", sizeof(lwin.regexp)); rwin.prev_invert = rwin.invert; rwin.hide_dot = 1; strncpy(rwin.regexp, "\\..~$", sizeof(rwin.regexp)); cfg.timer = 10; curr_stats.yanked_files = NULL; curr_stats.num_yanked_files = 0; curr_stats.need_redraw = 0; curr_stats.getting_input = 0; curr_stats.menu = 0; curr_stats.redraw_menu = 0; curr_stats.is_updir = 0; curr_stats.last_char = 0; curr_stats.is_console = 0; curr_stats.search = 0; curr_stats.save_msg = 0; curr_stats.use_register = 0; curr_stats.curr_register = -1; curr_stats.register_saved = 0; curr_stats.show_full = 0; curr_stats.view = 0; if (cfg.show_one_window) curr_stats.number_of_windows = 1; else curr_stats.number_of_windows = 2; snprintf(config_dir, sizeof(config_dir), "%s/vifmrc", cfg.config_dir); if(stat(config_dir, &stat_buf) == 0) curr_stats.config_file_mtime = stat_buf.st_mtime; else curr_stats.config_file_mtime = 0; /* Check if running in X */ console = getenv("DISPLAY"); if(!console || !*console) curr_stats.is_console = 1; /* Setup the ncurses interface. */ if(!setup_ncurses_interface()) return -1; /* Load the initial directory */ snprintf(rwin.curr_dir, sizeof(rwin.curr_dir), "%s", dir); snprintf(lwin.curr_dir, sizeof(lwin.curr_dir), "%s", dir); rwin.dir_entry = (dir_entry_t *)malloc(sizeof(dir_entry_t)); lwin.dir_entry = (dir_entry_t *)malloc(sizeof(dir_entry_t)); rwin.dir_entry[0].name = malloc(sizeof("../") +1); lwin.dir_entry[0].name = malloc(sizeof("../") +1); strcpy(rwin.dir_entry[0].name, "../"); strcpy(lwin.dir_entry[0].name, "../"); change_directory(&rwin, dir); change_directory(&lwin, dir); other_view = &lwin; curr_view = &rwin; /* Get Command Line Arguments */ for(x = 1; x < argc; x++) { if(argv[x] != NULL) { if(!strcmp(argv[x], "-f")) { cfg.vim_filter = 1; } else if(!strcmp(argv[x], "--version")) { endwin(); printf("\n\nvifm %s\n\n", VERSION); exit(0); } else if(!strcmp(argv[x], "--help")) { endwin(); show_help_msg(); exit(0); } else if(is_dir(argv[x])) { if(lwin_args) { snprintf(rwin.curr_dir, sizeof(rwin.curr_dir), "%s", argv[x]); rwin_args++; } else { snprintf(lwin.curr_dir, sizeof(lwin.curr_dir), "%s", argv[x]); lwin_args++; } } else { endwin(); show_help_msg(); exit(0); } } } load_dir_list(&rwin, 0); if (rwin_args) { change_directory(&rwin, rwin.curr_dir); load_dir_list(&rwin, 0); } mvwaddstr(rwin.win, rwin.curr_line, 0, "*"); wrefresh(rwin.win); /* This is needed for the sort_dir_list() which uses curr_view */ switch_views(); load_dir_list(&lwin, 0); if (lwin_args) { change_directory(&lwin, lwin.curr_dir); load_dir_list(&lwin, 0); } moveto_list_pos(&lwin, 0); update_all_windows(); setup_signals(); werase(status_bar); wnoutrefresh(status_bar); /* Need to wait until both lists are loaded before changing one of the * lists to show the file stats. This is only used for starting vifm * from the vifm.vim script */ if(cfg.vim_filter) curr_stats.number_of_windows = 1; /* Enter the main loop. */ main_key_press_cb(curr_view); return 0; }
/* Entry-point. Has same semantics as main(). */ static int vifm_main(int argc, char *argv[]) { /* TODO: refactor vifm_main() function */ static const int quit = 0; char **files = NULL; int nfiles = 0; int lwin_cv, rwin_cv; char dir[PATH_MAX + 1]; if(get_start_cwd(dir, sizeof(dir)) != 0) { return -1; } args_parse(&vifm_args, argc, argv, dir); args_process(&vifm_args, 1); lwin_cv = (strcmp(vifm_args.lwin_path, "-") == 0 && vifm_args.lwin_handle); rwin_cv = (strcmp(vifm_args.rwin_path, "-") == 0 && vifm_args.rwin_handle); if(lwin_cv || rwin_cv) { files = read_stream_lines(stdin, &nfiles, 1, NULL, NULL); if(reopen_term_stdin() != 0) { free_string_array(files, nfiles); return EXIT_FAILURE; } } (void)setlocale(LC_ALL, ""); srand(time(NULL)); cfg_init(); if(vifm_args.logging) { init_logger(1, vifm_args.startup_log_path); } init_filelists(); tabs_init(); regs_init(); cfg_discover_paths(); reinit_logger(cfg.log_file); /* Commands module also initializes bracket notation and variables. */ init_commands(); init_builtin_functions(); update_path_env(1); if(stats_init(&cfg) != 0) { free_string_array(files, nfiles); puts("Error during session status initialization."); return -1; } /* Tell file type module what function to use to check availability of * external programs. */ ft_init(&external_command_exists); /* This should be called before loading any configuration file. */ ft_reset(curr_stats.exec_env_type == EET_EMULATOR_WITH_X); init_option_handlers(); if(!vifm_args.no_configs) { /* vifminfo must be processed this early so that it can restore last visited * directory. */ read_info_file(0); } curr_stats.ipc = ipc_init(vifm_args.server_name, &parse_received_arguments, &eval_received_expression); if(ipc_enabled() && curr_stats.ipc == NULL) { fputs("Failed to initialize IPC unit", stderr); return -1; } /* Export chosen server name to parsing unit. */ { var_t var = var_from_str(ipc_get_name(curr_stats.ipc)); setvar("v:servername", var); var_free(var); } args_process(&vifm_args, 0); bg_init(); fops_init(&enter_prompt_mode, &prompt_msg_custom); set_view_path(&lwin, vifm_args.lwin_path); set_view_path(&rwin, vifm_args.rwin_path); if(need_to_switch_active_pane(vifm_args.lwin_path, vifm_args.rwin_path)) { swap_view_roles(); } load_initial_directory(&lwin, dir); load_initial_directory(&rwin, dir); /* Force split view when two paths are specified on command-line. */ if(vifm_args.lwin_path[0] != '\0' && vifm_args.rwin_path[0] != '\0') { curr_stats.number_of_windows = 2; } /* Prepare terminal for further operations. */ curr_stats.original_stdout = reopen_term_stdout(); if(curr_stats.original_stdout == NULL) { free_string_array(files, nfiles); return -1; } if(!setup_ncurses_interface()) { free_string_array(files, nfiles); return -1; } init_modes(); un_init(&undo_perform_func, NULL, &ui_cancellation_requested, &cfg.undo_levels); load_view_options(curr_view); curr_stats.load_stage = 1; /* Make v:count exist during processing configuration. */ set_count_vars(0); if(!vifm_args.no_configs) { load_scheme(); cfg_load(); } if(lwin_cv || rwin_cv) { flist_custom_set(lwin_cv ? &lwin : &rwin, "-", dir, files, nfiles); } free_string_array(files, nfiles); cs_load_pairs(); cs_write(); setup_signals(); /* Ensure trash directories exist, it might not have been called during * configuration file sourcing if there is no `set trashdir=...` command. */ (void)set_trash_dir(cfg.trash_dir); check_path_for_file(&lwin, vifm_args.lwin_path, vifm_args.lwin_handle); check_path_for_file(&rwin, vifm_args.rwin_path, vifm_args.rwin_handle); curr_stats.load_stage = 2; /* Update histories of the views to ensure that their current directories, * which might have been set using command-line parameters, are stored in the * history. This is not done automatically as history manipulation should be * postponed until views are fully loaded, otherwise there is no correct * information about current file and relative cursor position. */ flist_hist_save(&lwin, NULL, NULL, -1); flist_hist_save(&rwin, NULL, NULL, -1); /* Trigger auto-commands for initial directories. */ if(!lwin_cv) { (void)vifm_chdir(flist_get_dir(&lwin)); vle_aucmd_execute("DirEnter", flist_get_dir(&lwin), &lwin); } if(!rwin_cv) { (void)vifm_chdir(flist_get_dir(&rwin)); vle_aucmd_execute("DirEnter", flist_get_dir(&rwin), &rwin); } update_screen(UT_FULL); modes_update(); /* Run startup commands after loading file lists into views, so that commands * like +1 work. */ exec_startup_commands(&vifm_args); curr_stats.load_stage = 3; event_loop(&quit); return 0; }
int main(int argc, char *argv[]) { /* TODO: refactor main() function */ static const int quit = 0; char dir[PATH_MAX]; char **files = NULL; int nfiles = 0; if(get_cwd(dir, sizeof(dir)) == NULL) { perror("getcwd"); return -1; } (void)vifm_chdir(dir); args_parse(&vifm_args, argc, argv, dir); args_process(&vifm_args, 1); if(strcmp(vifm_args.lwin_path, "-") == 0 || strcmp(vifm_args.rwin_path, "-") == 0) { files = read_stream_lines(stdin, &nfiles, 1, NULL, NULL); if(reopen_term_stdin() != 0) { return EXIT_FAILURE; } } (void)setlocale(LC_ALL, ""); srand(time(NULL)); cfg_init(); if(vifm_args.logging) { init_logger(1, vifm_args.startup_log_path); } init_filelists(); regs_init(); cfg_discover_paths(); reinit_logger(cfg.log_file); /* Commands module also initializes bracket notation and variables. */ init_commands(); init_builtin_functions(); update_path_env(1); if(init_status(&cfg) != 0) { puts("Error during session status initialization."); return -1; } /* Tell file type module what function to use to check availability of * external programs. */ ft_init(&external_command_exists); /* This should be called before loading any configuration file. */ ft_reset(curr_stats.exec_env_type == EET_EMULATOR_WITH_X); init_option_handlers(); if(!vifm_args.no_configs) { /* vifminfo must be processed this early so that it can restore last visited * directory. */ read_info_file(0); } ipc_init(vifm_args.server_name, &parse_received_arguments); /* Export chosen server name to parsing unit. */ { var_val_t value = { .string = (char *)ipc_get_name() }; var_t var = var_new(VTYPE_STRING, value); setvar("v:servername", var); var_free(var); } args_process(&vifm_args, 0); bg_init(); fops_init(&enter_prompt_mode, &prompt_msg_custom); set_view_path(&lwin, vifm_args.lwin_path); set_view_path(&rwin, vifm_args.rwin_path); if(need_to_switch_active_pane(vifm_args.lwin_path, vifm_args.rwin_path)) { swap_view_roles(); } load_initial_directory(&lwin, dir); load_initial_directory(&rwin, dir); /* Force split view when two paths are specified on command-line. */ if(vifm_args.lwin_path[0] != '\0' && vifm_args.rwin_path[0] != '\0') { curr_stats.number_of_windows = 2; } /* Prepare terminal for further operations. */ curr_stats.original_stdout = reopen_term_stdout(); if(curr_stats.original_stdout == NULL) { return -1; } if(!setup_ncurses_interface()) { return -1; } { const colmgr_conf_t colmgr_conf = { .max_color_pairs = COLOR_PAIRS, .max_colors = COLORS, .init_pair = &init_pair, .pair_content = &pair_content, .pair_in_use = &pair_in_use, .move_pair = &move_pair, }; colmgr_init(&colmgr_conf); } init_modes(); init_undo_list(&undo_perform_func, NULL, &ui_cancellation_requested, &cfg.undo_levels); load_view_options(curr_view); curr_stats.load_stage = 1; if(!vifm_args.no_configs) { load_scheme(); cfg_load(); if(strcmp(vifm_args.lwin_path, "-") == 0) { flist_custom_set(&lwin, "-", dir, files, nfiles); } else if(strcmp(vifm_args.rwin_path, "-") == 0) { flist_custom_set(&rwin, "-", dir, files, nfiles); } } /* Load colors in any case to load color pairs. */ cs_load_pairs(); cs_write(); setup_signals(); /* Ensure trash directories exist, it might not have been called during * configuration file sourcing if there is no `set trashdir=...` command. */ (void)set_trash_dir(cfg.trash_dir); check_path_for_file(&lwin, vifm_args.lwin_path, vifm_args.lwin_handle); check_path_for_file(&rwin, vifm_args.rwin_path, vifm_args.rwin_handle); curr_stats.load_stage = 2; /* Update histories of the views to ensure that their current directories, * which might have been set using command-line parameters, are stored in the * history. This is not done automatically as history manipulation should be * postponed until views are fully loaded, otherwise there is no correct * information about current file and relative cursor position. */ flist_hist_save(&lwin, NULL, NULL, -1); flist_hist_save(&rwin, NULL, NULL, -1); /* Trigger auto-commands for initial directories. */ vle_aucmd_execute("DirEnter", lwin.curr_dir, &lwin); vle_aucmd_execute("DirEnter", rwin.curr_dir, &rwin); update_screen(UT_FULL); modes_update(); /* Run startup commands after loading file lists into views, so that commands * like +1 work. */ exec_startup_commands(&vifm_args); curr_stats.load_stage = 3; event_loop(&quit); return 0; } /* Checks whether pair is being used at the moment. Returns non-zero if so and * zero otherwise. */ static int pair_in_use(short int pair) { int i; for(i = 0; i < MAXNUM_COLOR; ++i) { if(cfg.cs.pair[i] == pair || lwin.cs.pair[i] == pair || rwin.cs.pair[i] == pair) { return 1; } } return 0; }