int check_directory_for_color_scheme(int left, const char dir[]) { char *p; char t; int altered; union { char *name; tree_val_t buf; } u; if(dirs == NULL_TREE) { return 0; } curr_stats.cs = left ? &lwin.cs : &rwin.cs; assign_color_scheme(curr_stats.cs, &cfg.cs); /* TODO: maybe use split_and_get() here as in io/iop:iop_mkdir(). */ p = (char *)dir; altered = 0; do { t = *p; *p = '\0'; if(tree_get_data(dirs, dir, &u.buf) == 0 && color_scheme_exists(u.name)) { (void)source_cs(u.name); altered = 1; } *p = t; p = until_first(p + 1, '/'); } while(t != '\0'); curr_stats.cs = &cfg.cs; if(!altered) { return 0; } check_color_scheme(curr_stats.cs); load_color_pairs(curr_stats.cs); return 1; }
/* The return value is the color scheme base number for the colorpairs. * * The color scheme with the longest matching directory path is the one that * should be returned. */ int check_directory_for_color_scheme(int left, const char *dir) { char *p; char t; union { char *name; tree_val_t buf; }u; if(dirs == NULL_TREE) { return DCOLOR_BASE; } curr_stats.cs_base = left ? LCOLOR_BASE : RCOLOR_BASE; curr_stats.cs = left ? &lwin.cs : &rwin.cs; *curr_stats.cs = cfg.cs; p = (char *)dir; do { char full[PATH_MAX]; t = *p; *p = '\0'; if(tree_get_data(dirs, dir, &u.buf) != 0 || !color_scheme_exists(u.name)) { *p = t; if((p = strchr(p + 1, '/')) == NULL) p = (char *)dir + strlen(dir); continue; } snprintf(full, sizeof(full), "%s/colors/%s", cfg.config_dir, u.name); (void)source_file(full); *p = t; if((p = strchr(p + 1, '/')) == NULL) p = (char *)dir + strlen(dir); } while(t != '\0'); check_color_scheme(curr_stats.cs); load_color_pairs(curr_stats.cs_base, curr_stats.cs); curr_stats.cs_base = DCOLOR_BASE; curr_stats.cs = &cfg.cs; return left ? LCOLOR_BASE : RCOLOR_BASE; }
/* Loads color scheme. Converts old format to the new one if needed. * Terminates application with error message on error. */ static void load_scheme(void) { if(are_old_color_schemes()) { if(run_converter(2) != 0) { endwin(); fputs("Problems with running vifmrc-converter\n", stderr); exit(0); } } if(color_scheme_exists(curr_stats.color_scheme)) { load_color_scheme(curr_stats.color_scheme); } load_color_scheme_colors(); }
int load_primary_color_scheme(const char name[]) { col_scheme_t prev_cs; char full[PATH_MAX]; if(!color_scheme_exists(name)) { show_error_msgf("Color Scheme", "Invalid color scheme name: \"%s\"", name); return 0; } prev_cs = cfg.cs; curr_stats.cs_base = DCOLOR_BASE; curr_stats.cs = &cfg.cs; cfg.cs.state = CSS_LOADING; snprintf(full, sizeof(full), "%s/colors/%s", cfg.config_dir, name); if(source_file(full) != 0) { restore_primary_color_scheme(&prev_cs); show_error_msgf("Color Scheme Sourcing", "Errors loading colors cheme: \"%s\"", name); cfg.cs.state = CSS_NORMAL; return 0; } copy_str(cfg.cs.name, sizeof(cfg.cs.name), name); check_color_scheme(&cfg.cs); update_attributes(); if(curr_stats.load_stage >= 2 && cfg.cs.state == CSS_DEFAULTED) { restore_primary_color_scheme(&prev_cs); show_error_msg("Color Scheme Error", "Not supported by the terminal"); return 0; } cfg.cs.state = CSS_NORMAL; return 0; }
int load_primary_color_scheme(const char name[]) { col_scheme_t prev_cs = {}; if(!color_scheme_exists(name)) { show_error_msgf("Color Scheme", "Invalid color scheme name: \"%s\"", name); return 0; } assign_color_scheme(&prev_cs, &cfg.cs); curr_stats.cs = &cfg.cs; cfg.cs.state = CSS_LOADING; if(source_cs(name) != 0) { restore_primary_color_scheme(&prev_cs); show_error_msgf("Color Scheme Sourcing", "An error occurred on loading color scheme: \"%s\"", name); cfg.cs.state = CSS_NORMAL; return 0; } copy_str(cfg.cs.name, sizeof(cfg.cs.name), name); check_color_scheme(&cfg.cs); update_attributes(); if(cfg.cs.state == CSS_DEFAULTED) { restore_primary_color_scheme(&prev_cs); show_error_msgf("Color Scheme Error", "\"%s\" color scheme is not supported by the terminal, restored \"%s\"", name, prev_cs.name); return 0; } free_color_scheme_highlights(&prev_cs); cfg.cs.state = CSS_NORMAL; return 0; }