#include #include #include #include "runes.h" #include "config.h" static void runes_config_set_defaults(RunesConfig *config); static FILE *runes_config_get_config_file(); static void runes_config_process_config_file( RunesConfig *config, FILE *config_file); static void runes_config_process_args( RunesConfig *config, int argc, char *argv[]); static void runes_config_set(RunesConfig *config, char *key, char *value); static char runes_config_parse_bool(char *val); static int runes_config_parse_uint(char *val); static char *runes_config_parse_string(char *val); static cairo_pattern_t *runes_config_parse_color(char *val); RunesConfig *runes_config_new(int argc, char *argv[]) { RunesConfig *config; config = calloc(1, sizeof(RunesConfig)); runes_config_set_defaults(config); runes_config_process_config_file(config, runes_config_get_config_file()); runes_config_process_args(config, argc, argv); return config; } void runes_config_delete(RunesConfig *config) { int i; free(config->font_name); cairo_pattern_destroy(config->cursorcolor); cairo_pattern_destroy(config->mousecursorcolor); cairo_pattern_destroy(config->fgdefault); cairo_pattern_destroy(config->bgdefault); for (i = 0; i < 256; ++i) { cairo_pattern_destroy(config->colors[i]); } free(config); } static void runes_config_set_defaults(RunesConfig *config) { config->font_name = strdup("monospace 10"); config->bold_is_bright = 1; config->bold_is_bold = 1; config->audible_bell = 1; config->bell_is_urgent = 1; config->redraw_rate = 20; config->double_click_rate = 500; config->cursorcolor = cairo_pattern_create_rgb(0.0, 1.0, 0.0); config->mousecursorcolor = cairo_pattern_create_rgb(1.0, 1.0, 1.0); config->fgdefault = cairo_pattern_create_rgb(0.827, 0.827, 0.827); config->bgdefault = cairo_pattern_create_rgb(0.0, 0.0, 0.0); config->colors[0] = cairo_pattern_create_rgb(0.000, 0.000, 0.000); config->colors[1] = cairo_pattern_create_rgb(0.804, 0.000, 0.000); config->colors[2] = cairo_pattern_create_rgb(0.000, 0.804, 0.000); config->colors[3] = cairo_pattern_create_rgb(0.804, 0.804, 0.000); config->colors[4] = cairo_pattern_create_rgb(0.000, 0.000, 0.804); config->colors[5] = cairo_pattern_create_rgb(0.804, 0.000, 0.804); config->colors[6] = cairo_pattern_create_rgb(0.000, 0.804, 0.804); config->colors[7] = cairo_pattern_create_rgb(0.898, 0.898, 0.898); config->colors[8] = cairo_pattern_create_rgb(0.302, 0.302, 0.302); config->colors[9] = cairo_pattern_create_rgb(1.000, 0.000, 0.000); config->colors[10] = cairo_pattern_create_rgb(0.000, 1.000, 0.000); config->colors[11] = cairo_pattern_create_rgb(1.000, 1.000, 0.000); config->colors[12] = cairo_pattern_create_rgb(0.000, 0.000, 1.000); config->colors[13] = cairo_pattern_create_rgb(1.000, 0.000, 1.000); config->colors[14] = cairo_pattern_create_rgb(0.000, 1.000, 1.000); config->colors[15] = cairo_pattern_create_rgb(1.000, 1.000, 1.000); config->colors[16] = cairo_pattern_create_rgb(0.000, 0.000, 0.000); config->colors[17] = cairo_pattern_create_rgb(0.000, 0.000, 0.373); config->colors[18] = cairo_pattern_create_rgb(0.000, 0.000, 0.529); config->colors[19] = cairo_pattern_create_rgb(0.000, 0.000, 0.686); config->colors[20] = cairo_pattern_create_rgb(0.000, 0.000, 0.843); config->colors[21] = cairo_pattern_create_rgb(0.000, 0.000, 1.000); config->colors[22] = cairo_pattern_create_rgb(0.000, 0.373, 0.000); config->colors[23] = cairo_pattern_create_rgb(0.000, 0.373, 0.373); config->colors[24] = cairo_pattern_create_rgb(0.000, 0.373, 0.529); config->colors[25] = cairo_pattern_create_rgb(0.000, 0.373, 0.686); config->colors[26] = cairo_pattern_create_rgb(0.000, 0.373, 0.843); config->colors[27] = cairo_pattern_create_rgb(0.000, 0.373, 1.000); config->colors[28] = cairo_pattern_create_rgb(0.000, 0.529, 0.000); config->colors[29] = cairo_pattern_create_rgb(0.000, 0.529, 0.373); config->colors[30] = cairo_pattern_create_rgb(0.000, 0.529, 0.529); config->colors[31] = cairo_pattern_create_rgb(0.000, 0.529, 0.686); config->colors[32] = cairo_pattern_create_rgb(0.000, 0.529, 0.843); config->colors[33] = cairo_pattern_create_rgb(0.000, 0.529, 1.000); config->colors[34] = cairo_pattern_create_rgb(0.000, 0.686, 0.000); config->colors[35] = cairo_pattern_create_rgb(0.000, 0.686, 0.373); config->colors[36] = cairo_pattern_create_rgb(0.000, 0.686, 0.529); config->colors[37] = cairo_pattern_create_rgb(0.000, 0.686, 0.686); config->colors[38] = cairo_pattern_create_rgb(0.000, 0.686, 0.843); config->colors[39] = cairo_pattern_create_rgb(0.000, 0.686, 1.000); config->colors[40] = cairo_pattern_create_rgb(0.000, 0.843, 0.000); config->colors[41] = cairo_pattern_create_rgb(0.000, 0.843, 0.373); config->colors[42] = cairo_pattern_create_rgb(0.000, 0.843, 0.529); config->colors[43] = cairo_pattern_create_rgb(0.000, 0.843, 0.686); config->colors[44] = cairo_pattern_create_rgb(0.000, 0.843, 0.843); config->colors[45] = cairo_pattern_create_rgb(0.000, 0.843, 1.000); config->colors[46] = cairo_pattern_create_rgb(0.000, 1.000, 0.000); config->colors[47] = cairo_pattern_create_rgb(0.000, 1.000, 0.373); config->colors[48] = cairo_pattern_create_rgb(0.000, 1.000, 0.529); config->colors[49] = cairo_pattern_create_rgb(0.000, 1.000, 0.686); config->colors[50] = cairo_pattern_create_rgb(0.000, 1.000, 0.843); config->colors[51] = cairo_pattern_create_rgb(0.000, 1.000, 1.000); config->colors[52] = cairo_pattern_create_rgb(0.373, 0.000, 0.000); config->colors[53] = cairo_pattern_create_rgb(0.373, 0.000, 0.373); config->colors[54] = cairo_pattern_create_rgb(0.373, 0.000, 0.529); config->colors[55] = cairo_pattern_create_rgb(0.373, 0.000, 0.686); config->colors[56] = cairo_pattern_create_rgb(0.373, 0.000, 0.843); config->colors[57] = cairo_pattern_create_rgb(0.373, 0.000, 1.000); config->colors[58] = cairo_pattern_create_rgb(0.373, 0.373, 0.000); config->colors[59] = cairo_pattern_create_rgb(0.373, 0.373, 0.373); config->colors[60] = cairo_pattern_create_rgb(0.373, 0.373, 0.529); config->colors[61] = cairo_pattern_create_rgb(0.373, 0.373, 0.686); config->colors[62] = cairo_pattern_create_rgb(0.373, 0.373, 0.843); config->colors[63] = cairo_pattern_create_rgb(0.373, 0.373, 1.000); config->colors[64] = cairo_pattern_create_rgb(0.373, 0.529, 0.000); config->colors[65] = cairo_pattern_create_rgb(0.373, 0.529, 0.373); config->colors[66] = cairo_pattern_create_rgb(0.373, 0.529, 0.529); config->colors[67] = cairo_pattern_create_rgb(0.373, 0.529, 0.686); config->colors[68] = cairo_pattern_create_rgb(0.373, 0.529, 0.843); config->colors[69] = cairo_pattern_create_rgb(0.373, 0.529, 1.000); config->colors[70] = cairo_pattern_create_rgb(0.373, 0.686, 0.000); config->colors[71] = cairo_pattern_create_rgb(0.373, 0.686, 0.373); config->colors[72] = cairo_pattern_create_rgb(0.373, 0.686, 0.529); config->colors[73] = cairo_pattern_create_rgb(0.373, 0.686, 0.686); config->colors[74] = cairo_pattern_create_rgb(0.373, 0.686, 0.843); config->colors[75] = cairo_pattern_create_rgb(0.373, 0.686, 1.000); config->colors[76] = cairo_pattern_create_rgb(0.373, 0.843, 0.000); config->colors[77] = cairo_pattern_create_rgb(0.373, 0.843, 0.373); config->colors[78] = cairo_pattern_create_rgb(0.373, 0.843, 0.529); config->colors[79] = cairo_pattern_create_rgb(0.373, 0.843, 0.686); config->colors[80] = cairo_pattern_create_rgb(0.373, 0.843, 0.843); config->colors[81] = cairo_pattern_create_rgb(0.373, 0.843, 1.000); config->colors[82] = cairo_pattern_create_rgb(0.373, 1.000, 0.000); config->colors[83] = cairo_pattern_create_rgb(0.373, 1.000, 0.373); config->colors[84] = cairo_pattern_create_rgb(0.373, 1.000, 0.529); config->colors[85] = cairo_pattern_create_rgb(0.373, 1.000, 0.686); config->colors[86] = cairo_pattern_create_rgb(0.373, 1.000, 0.843); config->colors[87] = cairo_pattern_create_rgb(0.373, 1.000, 1.000); config->colors[88] = cairo_pattern_create_rgb(0.529, 0.000, 0.000); config->colors[89] = cairo_pattern_create_rgb(0.529, 0.000, 0.373); config->colors[90] = cairo_pattern_create_rgb(0.529, 0.000, 0.529); config->colors[91] = cairo_pattern_create_rgb(0.529, 0.000, 0.686); config->colors[92] = cairo_pattern_create_rgb(0.529, 0.000, 0.843); config->colors[93] = cairo_pattern_create_rgb(0.529, 0.000, 1.000); config->colors[94] = cairo_pattern_create_rgb(0.529, 0.373, 0.000); config->colors[95] = cairo_pattern_create_rgb(0.529, 0.373, 0.373); config->colors[96] = cairo_pattern_create_rgb(0.529, 0.373, 0.529); config->colors[97] = cairo_pattern_create_rgb(0.529, 0.373, 0.686); config->colors[98] = cairo_pattern_create_rgb(0.529, 0.373, 0.843); config->colors[99] = cairo_pattern_create_rgb(0.529, 0.373, 1.000); config->colors[100] = cairo_pattern_create_rgb(0.529, 0.529, 0.000); config->colors[101] = cairo_pattern_create_rgb(0.529, 0.529, 0.373); config->colors[102] = cairo_pattern_create_rgb(0.529, 0.529, 0.529); config->colors[103] = cairo_pattern_create_rgb(0.529, 0.529, 0.686); config->colors[104] = cairo_pattern_create_rgb(0.529, 0.529, 0.843); config->colors[105] = cairo_pattern_create_rgb(0.529, 0.529, 1.000); config->colors[106] = cairo_pattern_create_rgb(0.529, 0.686, 0.000); config->colors[107] = cairo_pattern_create_rgb(0.529, 0.686, 0.373); config->colors[108] = cairo_pattern_create_rgb(0.529, 0.686, 0.529); config->colors[109] = cairo_pattern_create_rgb(0.529, 0.686, 0.686); config->colors[110] = cairo_pattern_create_rgb(0.529, 0.686, 0.843); config->colors[111] = cairo_pattern_create_rgb(0.529, 0.686, 1.000); config->colors[112] = cairo_pattern_create_rgb(0.529, 0.843, 0.000); config->colors[113] = cairo_pattern_create_rgb(0.529, 0.843, 0.373); config->colors[114] = cairo_pattern_create_rgb(0.529, 0.843, 0.529); config->colors[115] = cairo_pattern_create_rgb(0.529, 0.843, 0.686); config->colors[116] = cairo_pattern_create_rgb(0.529, 0.843, 0.843); config->colors[117] = cairo_pattern_create_rgb(0.529, 0.843, 1.000); config->colors[118] = cairo_pattern_create_rgb(0.529, 1.000, 0.000); config->colors[119] = cairo_pattern_create_rgb(0.529, 1.000, 0.373); config->colors[120] = cairo_pattern_create_rgb(0.529, 1.000, 0.529); config->colors[121] = cairo_pattern_create_rgb(0.529, 1.000, 0.686); config->colors[122] = cairo_pattern_create_rgb(0.529, 1.000, 0.843); config->colors[123] = cairo_pattern_create_rgb(0.529, 1.000, 1.000); config->colors[124] = cairo_pattern_create_rgb(0.686, 0.000, 0.000); config->colors[125] = cairo_pattern_create_rgb(0.686, 0.000, 0.373); config->colors[126] = cairo_pattern_create_rgb(0.686, 0.000, 0.529); config->colors[127] = cairo_pattern_create_rgb(0.686, 0.000, 0.686); config->colors[128] = cairo_pattern_create_rgb(0.686, 0.000, 0.843); config->colors[129] = cairo_pattern_create_rgb(0.686, 0.000, 1.000); config->colors[130] = cairo_pattern_create_rgb(0.686, 0.373, 0.000); config->colors[131] = cairo_pattern_create_rgb(0.686, 0.373, 0.373); config->colors[132] = cairo_pattern_create_rgb(0.686, 0.373, 0.529); config->colors[133] = cairo_pattern_create_rgb(0.686, 0.373, 0.686); config->colors[134] = cairo_pattern_create_rgb(0.686, 0.373, 0.843); config->colors[135] = cairo_pattern_create_rgb(0.686, 0.373, 1.000); config->colors[136] = cairo_pattern_create_rgb(0.686, 0.529, 0.000); config->colors[137] = cairo_pattern_create_rgb(0.686, 0.529, 0.373); config->colors[138] = cairo_pattern_create_rgb(0.686, 0.529, 0.529); config->colors[139] = cairo_pattern_create_rgb(0.686, 0.529, 0.686); config->colors[140] = cairo_pattern_create_rgb(0.686, 0.529, 0.843); config->colors[141] = cairo_pattern_create_rgb(0.686, 0.529, 1.000); config->colors[142] = cairo_pattern_create_rgb(0.686, 0.686, 0.000); config->colors[143] = cairo_pattern_create_rgb(0.686, 0.686, 0.373); config->colors[144] = cairo_pattern_create_rgb(0.686, 0.686, 0.529); config->colors[145] = cairo_pattern_create_rgb(0.686, 0.686, 0.686); config->colors[146] = cairo_pattern_create_rgb(0.686, 0.686, 0.843); config->colors[147] = cairo_pattern_create_rgb(0.686, 0.686, 1.000); config->colors[148] = cairo_pattern_create_rgb(0.686, 0.843, 0.000); config->colors[149] = cairo_pattern_create_rgb(0.686, 0.843, 0.373); config->colors[150] = cairo_pattern_create_rgb(0.686, 0.843, 0.529); config->colors[151] = cairo_pattern_create_rgb(0.686, 0.843, 0.686); config->colors[152] = cairo_pattern_create_rgb(0.686, 0.843, 0.843); config->colors[153] = cairo_pattern_create_rgb(0.686, 0.843, 1.000); config->colors[154] = cairo_pattern_create_rgb(0.686, 1.000, 0.000); config->colors[155] = cairo_pattern_create_rgb(0.686, 1.000, 0.373); config->colors[156] = cairo_pattern_create_rgb(0.686, 1.000, 0.529); config->colors[157] = cairo_pattern_create_rgb(0.686, 1.000, 0.686); config->colors[158] = cairo_pattern_create_rgb(0.686, 1.000, 0.843); config->colors[159] = cairo_pattern_create_rgb(0.686, 1.000, 1.000); config->colors[160] = cairo_pattern_create_rgb(0.843, 0.000, 0.000); config->colors[161] = cairo_pattern_create_rgb(0.843, 0.000, 0.373); config->colors[162] = cairo_pattern_create_rgb(0.843, 0.000, 0.529); config->colors[163] = cairo_pattern_create_rgb(0.843, 0.000, 0.686); config->colors[164] = cairo_pattern_create_rgb(0.843, 0.000, 0.843); config->colors[165] = cairo_pattern_create_rgb(0.843, 0.000, 1.000); config->colors[166] = cairo_pattern_create_rgb(0.843, 0.373, 0.000); config->colors[167] = cairo_pattern_create_rgb(0.843, 0.373, 0.373); config->colors[168] = cairo_pattern_create_rgb(0.843, 0.373, 0.529); config->colors[169] = cairo_pattern_create_rgb(0.843, 0.373, 0.686); config->colors[170] = cairo_pattern_create_rgb(0.843, 0.373, 0.843); config->colors[171] = cairo_pattern_create_rgb(0.843, 0.373, 1.000); config->colors[172] = cairo_pattern_create_rgb(0.843, 0.529, 0.000); config->colors[173] = cairo_pattern_create_rgb(0.843, 0.529, 0.373); config->colors[174] = cairo_pattern_create_rgb(0.843, 0.529, 0.529); config->colors[175] = cairo_pattern_create_rgb(0.843, 0.529, 0.686); config->colors[176] = cairo_pattern_create_rgb(0.843, 0.529, 0.843); config->colors[177] = cairo_pattern_create_rgb(0.843, 0.529, 1.000); config->colors[178] = cairo_pattern_create_rgb(0.843, 0.686, 0.000); config->colors[179] = cairo_pattern_create_rgb(0.843, 0.686, 0.373); config->colors[180] = cairo_pattern_create_rgb(0.843, 0.686, 0.529); config->colors[181] = cairo_pattern_create_rgb(0.843, 0.686, 0.686); config->colors[182] = cairo_pattern_create_rgb(0.843, 0.686, 0.843); config->colors[183] = cairo_pattern_create_rgb(0.843, 0.686, 1.000); config->colors[184] = cairo_pattern_create_rgb(0.843, 0.843, 0.000); config->colors[185] = cairo_pattern_create_rgb(0.843, 0.843, 0.373); config->colors[186] = cairo_pattern_create_rgb(0.843, 0.843, 0.529); config->colors[187] = cairo_pattern_create_rgb(0.843, 0.843, 0.686); config->colors[188] = cairo_pattern_create_rgb(0.843, 0.843, 0.843); config->colors[189] = cairo_pattern_create_rgb(0.843, 0.843, 1.000); config->colors[190] = cairo_pattern_create_rgb(0.843, 1.000, 0.000); config->colors[191] = cairo_pattern_create_rgb(0.843, 1.000, 0.373); config->colors[192] = cairo_pattern_create_rgb(0.843, 1.000, 0.529); config->colors[193] = cairo_pattern_create_rgb(0.843, 1.000, 0.686); config->colors[194] = cairo_pattern_create_rgb(0.843, 1.000, 0.843); config->colors[195] = cairo_pattern_create_rgb(0.843, 1.000, 1.000); config->colors[196] = cairo_pattern_create_rgb(1.000, 0.000, 0.000); config->colors[197] = cairo_pattern_create_rgb(1.000, 0.000, 0.373); config->colors[198] = cairo_pattern_create_rgb(1.000, 0.000, 0.529); config->colors[199] = cairo_pattern_create_rgb(1.000, 0.000, 0.686); config->colors[200] = cairo_pattern_create_rgb(1.000, 0.000, 0.843); config->colors[201] = cairo_pattern_create_rgb(1.000, 0.000, 1.000); config->colors[202] = cairo_pattern_create_rgb(1.000, 0.373, 0.000); config->colors[203] = cairo_pattern_create_rgb(1.000, 0.373, 0.373); config->colors[204] = cairo_pattern_create_rgb(1.000, 0.373, 0.529); config->colors[205] = cairo_pattern_create_rgb(1.000, 0.373, 0.686); config->colors[206] = cairo_pattern_create_rgb(1.000, 0.373, 0.843); config->colors[207] = cairo_pattern_create_rgb(1.000, 0.373, 1.000); config->colors[208] = cairo_pattern_create_rgb(1.000, 0.529, 0.000); config->colors[209] = cairo_pattern_create_rgb(1.000, 0.529, 0.373); config->colors[210] = cairo_pattern_create_rgb(1.000, 0.529, 0.529); config->colors[211] = cairo_pattern_create_rgb(1.000, 0.529, 0.686); config->colors[212] = cairo_pattern_create_rgb(1.000, 0.529, 0.843); config->colors[213] = cairo_pattern_create_rgb(1.000, 0.529, 1.000); config->colors[214] = cairo_pattern_create_rgb(1.000, 0.686, 0.000); config->colors[215] = cairo_pattern_create_rgb(1.000, 0.686, 0.373); config->colors[216] = cairo_pattern_create_rgb(1.000, 0.686, 0.529); config->colors[217] = cairo_pattern_create_rgb(1.000, 0.686, 0.686); config->colors[218] = cairo_pattern_create_rgb(1.000, 0.686, 0.843); config->colors[219] = cairo_pattern_create_rgb(1.000, 0.686, 1.000); config->colors[220] = cairo_pattern_create_rgb(1.000, 0.843, 0.000); config->colors[221] = cairo_pattern_create_rgb(1.000, 0.843, 0.373); config->colors[222] = cairo_pattern_create_rgb(1.000, 0.843, 0.529); config->colors[223] = cairo_pattern_create_rgb(1.000, 0.843, 0.686); config->colors[224] = cairo_pattern_create_rgb(1.000, 0.843, 0.843); config->colors[225] = cairo_pattern_create_rgb(1.000, 0.843, 1.000); config->colors[226] = cairo_pattern_create_rgb(1.000, 1.000, 0.000); config->colors[227] = cairo_pattern_create_rgb(1.000, 1.000, 0.373); config->colors[228] = cairo_pattern_create_rgb(1.000, 1.000, 0.529); config->colors[229] = cairo_pattern_create_rgb(1.000, 1.000, 0.686); config->colors[230] = cairo_pattern_create_rgb(1.000, 1.000, 0.843); config->colors[231] = cairo_pattern_create_rgb(1.000, 1.000, 1.000); config->colors[232] = cairo_pattern_create_rgb(0.031, 0.031, 0.031); config->colors[233] = cairo_pattern_create_rgb(0.071, 0.071, 0.071); config->colors[234] = cairo_pattern_create_rgb(0.110, 0.110, 0.110); config->colors[235] = cairo_pattern_create_rgb(0.149, 0.149, 0.149); config->colors[236] = cairo_pattern_create_rgb(0.188, 0.188, 0.188); config->colors[237] = cairo_pattern_create_rgb(0.227, 0.227, 0.227); config->colors[238] = cairo_pattern_create_rgb(0.267, 0.267, 0.267); config->colors[239] = cairo_pattern_create_rgb(0.306, 0.306, 0.306); config->colors[240] = cairo_pattern_create_rgb(0.345, 0.345, 0.345); config->colors[241] = cairo_pattern_create_rgb(0.376, 0.376, 0.376); config->colors[242] = cairo_pattern_create_rgb(0.400, 0.400, 0.400); config->colors[243] = cairo_pattern_create_rgb(0.463, 0.463, 0.463); config->colors[244] = cairo_pattern_create_rgb(0.502, 0.502, 0.502); config->colors[245] = cairo_pattern_create_rgb(0.541, 0.541, 0.541); config->colors[246] = cairo_pattern_create_rgb(0.580, 0.580, 0.580); config->colors[247] = cairo_pattern_create_rgb(0.620, 0.620, 0.620); config->colors[248] = cairo_pattern_create_rgb(0.659, 0.659, 0.659); config->colors[249] = cairo_pattern_create_rgb(0.698, 0.698, 0.698); config->colors[250] = cairo_pattern_create_rgb(0.737, 0.737, 0.737); config->colors[251] = cairo_pattern_create_rgb(0.776, 0.776, 0.776); config->colors[252] = cairo_pattern_create_rgb(0.816, 0.816, 0.816); config->colors[253] = cairo_pattern_create_rgb(0.855, 0.855, 0.855); config->colors[254] = cairo_pattern_create_rgb(0.894, 0.894, 0.894); config->colors[255] = cairo_pattern_create_rgb(0.933, 0.933, 0.933); config->default_rows = 24; config->default_cols = 80; config->scroll_lines = 3; config->scrollback_length = 4096; } static FILE *runes_config_get_config_file() { char *home, *config_dir, *path; FILE *file; home = getenv("HOME"); config_dir = getenv("XDG_CONFIG_HOME"); if (config_dir) { config_dir = strdup(config_dir); } else { runes_sprintf_dup(&config_dir, "%s/.config", home); } runes_sprintf_dup(&path, "%s/runes/runes.conf", config_dir); free(config_dir); file = fopen(path, "r"); free(path); if (file) { return file; } runes_sprintf_dup(&path, "%s/.runesrc", home); file = fopen(path, "r"); free(path); if (file) { return file; } path = "/etc/runesrc"; file = fopen(path, "r"); if (file) { return file; } return NULL; } static void runes_config_process_config_file( RunesConfig *config, FILE *config_file) { char line[1024]; if (!config_file) { return; } while (fgets(line, 1024, config_file)) { char *kbegin, *kend, *vbegin, *vend; size_t len; len = strlen(line); if (line[len - 1] == '\n') { line[len - 1] = '\0'; len--; } if (!len || line[strspn(line, " \t")] == '#') { continue; } kbegin = line + strspn(line, " \t"); kend = kbegin + strcspn(kbegin, " \t="); vbegin = kend + strspn(kend, " \t"); if (*vbegin != '=') { runes_warn("couldn't parse line: '%s'", line); } vbegin++; vbegin = vbegin + strspn(vbegin, " \t"); vend = line + len; *kend = '\0'; *vend = '\0'; runes_config_set(config, kbegin, vbegin); } } static void runes_config_process_args(RunesConfig *config, int argc, char *argv[]) { int i; for (i = 1; i < argc; ++i) { if (!strncmp(argv[i], "--", 2)) { if (i + 1 < argc) { runes_config_set(config, &argv[i][2], argv[i + 1]); i++; } else { runes_warn("option found with no argument: '%s'", argv[i]); } } else { runes_warn("unknown argument: '%s'", argv[i]); } } } static void runes_config_set(RunesConfig *config, char *key, char *val) { if (!strcmp(key, "font")) { free(config->font_name); config->font_name = runes_config_parse_string(val); } else if (!strcmp(key, "bold_is_bright")) { config->bold_is_bright = runes_config_parse_bool(val); } else if (!strcmp(key, "bold_is_bold")) { config->bold_is_bold = runes_config_parse_bool(val); } else if (!strcmp(key, "audible_bell")) { config->audible_bell = runes_config_parse_bool(val); } else if (!strcmp(key, "bell_is_urgent")) { config->bell_is_urgent = runes_config_parse_bool(val); } else if (!strcmp(key, "bgcolor")) { cairo_pattern_t *newcolor; newcolor = runes_config_parse_color(val); if (newcolor) { cairo_pattern_destroy(config->bgdefault); config->bgdefault = newcolor; } } else if (!strcmp(key, "fgcolor")) { cairo_pattern_t *newcolor; newcolor = runes_config_parse_color(val); if (newcolor) { cairo_pattern_destroy(config->fgdefault); config->fgdefault = newcolor; } } else if (!strcmp(key, "cursorcolor")) { cairo_pattern_t *newcolor; newcolor = runes_config_parse_color(val); if (newcolor) { cairo_pattern_destroy(config->cursorcolor); config->cursorcolor = newcolor; } } else if (!strcmp(key, "mousecursorcolor")) { cairo_pattern_t *newcolor; newcolor = runes_config_parse_color(val); if (newcolor) { cairo_pattern_destroy(config->mousecursorcolor); config->mousecursorcolor = newcolor; } } else if (!strncmp(key, "color", 5)) { cairo_pattern_t *newcolor; int i; i = atoi(&key[5]); if (key[5] < '0' || key[5] > '9' || i < 0 || i > 255) { runes_warn("unknown option: '%s'", key); return; } newcolor = runes_config_parse_color(val); if (newcolor) { cairo_pattern_destroy(config->colors[i]); config->colors[i] = newcolor; } } else if (!strcmp(key, "rows")) { config->default_rows = runes_config_parse_uint(val); } else if (!strcmp(key, "cols")) { config->default_cols = runes_config_parse_uint(val); } else if (!strcmp(key, "scroll_lines")) { config->scroll_lines = runes_config_parse_uint(val); } else if (!strcmp(key, "scrollback_length")) { config->scrollback_length = runes_config_parse_uint(val); } else if (!strcmp(key, "redraw_rate")) { config->redraw_rate = runes_config_parse_uint(val); } else if (!strcmp(key, "double_click_rate")) { config->double_click_rate = runes_config_parse_uint(val); } else if (!strcmp(key, "command")) { config->cmd = runes_config_parse_string(val); } else { runes_warn("unknown option: '%s'", key); } } static char runes_config_parse_bool(char *val) { if (!strcmp(val, "true")) { return 1; } else if (!strcmp(val, "false")) { return 0; } else { runes_warn("unknown boolean value: '%s'", val); return 0; } } static int runes_config_parse_uint(char *val) { if (strspn(val, "0123456789") != strlen(val)) { runes_warn("unknown unsigned integer value: '%s'", val); } return atoi(val); } static char *runes_config_parse_string(char *val) { return strdup(val); } static cairo_pattern_t *runes_config_parse_color(char *val) { unsigned int r, g, b; if (strlen(val) != 7 || sscanf(val, "#%2x%2x%2x", &r, &g, &b) != 3) { runes_warn("unknown color value: '%s'", val); return NULL; } return cairo_pattern_create_rgb( (double)r / 255.0, (double)g / 255.0, (double)b / 255.0); }