diff --git a/src/config.c b/src/config.c index d760f7be0..13e21efcc 100644 --- a/src/config.c +++ b/src/config.c @@ -1,48 +1,76 @@ #include "e.h" -static char cfg_grabs_db[4096]; -static char cfg_settings_db[4096]; -static char cfg_actions_db[4096]; -static char cfg_borders[4096]; +static char cfg_grabs_db[4096] = ""; +static char cfg_settings_db[4096] = ""; +static char cfg_actions_db[4096] = ""; +static char cfg_borders_db[4096] = ""; +static char cfg_user_dir[4096] = ""; +static char cfg_images_dir[4096] = ""; +static char cfg_fonts_dir[4096] = ""; + +void +e_config_init(void) +{ + if (!e_file_is_dir(e_config_user_dir())) + { + char buf[4096]; + + sprintf(buf, "%s", e_config_user_dir()); + e_file_mkdir(buf); + sprintf(buf, "%sappearance", e_config_user_dir()); + e_file_mkdir(buf); + sprintf(buf, "%sappearance/borders", e_config_user_dir()); + e_file_mkdir(buf); + sprintf(buf, "%sbehavior", e_config_user_dir()); + e_file_mkdir(buf); + sprintf(buf, "%sbehavior/grabs.db", e_config_user_dir()); + e_file_cp(PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db", buf); + sprintf(buf, "%sbehavior/settings.db", e_config_user_dir()); + e_file_cp(PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db", buf); + sprintf(buf, "%sbehavior/actions.db", e_config_user_dir()); + e_file_cp(PACKAGE_DATA_DIR"/data/config/behavior/default/actions.db", buf); + + sprintf(buf, "%sappearance/borders/border.bits.db", e_config_user_dir()); + e_file_cp(PACKAGE_DATA_DIR"/data/config/appearance/default/borders/border.bits.db", buf); + sprintf(buf, "%sappearance/borders/border2.bits.db", e_config_user_dir()); + e_file_cp(PACKAGE_DATA_DIR"/data/config/appearance/default/borders/border2.bits.db", buf); + sprintf(buf, "%sappearance/borders/borderless.bits.db", e_config_user_dir()); + e_file_cp(PACKAGE_DATA_DIR"/data/config/appearance/default/borders/borderless.bits.db", buf); + } +} + +char * +e_config_user_dir(void) +{ + if (cfg_user_dir[0]) return cfg_user_dir; + sprintf(cfg_user_dir, "%s/.e/", e_file_home()); + return cfg_user_dir; +} + +#define E_CONF(_key, _var, _args...) \ +{ \ + if (!strcmp(type, _key)) \ + { \ + if ((_var)[0]) return (_var); \ + sprintf((_var), ## _args); \ + return (_var); \ + } \ +} char * e_config_get(char *type) { - if (!strcmp(type, "grabs")) - { - sprintf(cfg_grabs_db, - PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db"); - return cfg_grabs_db; - } - if (!strcmp(type, "settings")) - { - sprintf(cfg_settings_db, - PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db"); - return cfg_settings_db; - } - if (!strcmp(type, "actions")) - { - sprintf(cfg_actions_db, - PACKAGE_DATA_DIR"/data/config/behavior/default/actions.db"); - return cfg_actions_db; - } - if (!strcmp(type, "borders")) - { - sprintf(cfg_borders, - PACKAGE_DATA_DIR"/data/config/appearance/default/borders/"); - return cfg_borders; - } - if (!strcmp(type, "images")) - { - sprintf(cfg_borders, - PACKAGE_DATA_DIR"/data/images/"); - return cfg_borders; - } - if (!strcmp(type, "fonts")) - { - sprintf(cfg_borders, - PACKAGE_DATA_DIR"/data/fonts/"); - return cfg_borders; - } + E_CONF("grabs", cfg_grabs_db, + PACKAGE_DATA_DIR"/data/config/behavior/default/grabs.db"); + E_CONF("settings", cfg_settings_db, + PACKAGE_DATA_DIR"/data/config/behavior/default/settings.db"); + E_CONF("actions", cfg_actions_db, + PACKAGE_DATA_DIR"/data/config/behavior/default/actions.db"); + E_CONF("borders", cfg_borders_db, + PACKAGE_DATA_DIR"/data/config/appearance/default/borders/"); + E_CONF("images", cfg_images_dir, + PACKAGE_DATA_DIR"/data/images/"); + E_CONF("fonts", cfg_fonts_dir, + PACKAGE_DATA_DIR"/data/fonts/"); return ""; } diff --git a/src/e.h b/src/e.h index a5b40f43f..b318a8398 100644 --- a/src/e.h +++ b/src/e.h @@ -348,6 +348,11 @@ void e_resist_border(E_Border *b); time_t e_file_modified_time(char *file); void e_set_env(char *variable, char *content); +int e_file_exists(char *file); +int e_file_is_dir(char *file); +char *e_file_home(void); +int e_file_mkdir(char *dir); +int e_file_cp(char *src, char *dst); void e_exec_set_args(int argc, char **argv); void e_exec_restart(void); @@ -355,4 +360,6 @@ pid_t e_exec_run(char *exe); pid_t e_exec_run_in_dir(char *exe, char *dir); pid_t e_run_in_dir_with_env(char *exe, char *dir, int *launch_id_ret, char **env, char *launch_path); +void e_config_init(void); +char *e_config_user_dir(void); char *e_config_get(char *type); diff --git a/src/main.c b/src/main.c index ce36ad0c0..3c192a86d 100644 --- a/src/main.c +++ b/src/main.c @@ -38,9 +38,10 @@ setup(void) int main(int argc, char **argv) { + atexit(cb_exit); e_exec_set_args(argc, argv); - atexit(cb_exit); + e_config_init(); e_display_init(NULL); e_ev_signal_init(); e_event_filter_init(); diff --git a/src/util.c b/src/util.c index d0939c444..744962afe 100644 --- a/src/util.c +++ b/src/util.c @@ -17,3 +17,64 @@ e_set_env(char *variable, char *content) sprintf(env, "%s=%s", variable, content); putenv(env); } + +int +e_file_exists(char *file) +{ + struct stat st; + + if (stat(file, &st) < 0) return 0; + return 1; +} + +int +e_file_is_dir(char *file) +{ + struct stat st; + + if (stat(file, &st) < 0) return 0; + if (S_ISDIR(st.st_mode)) return 1; + return 0; +} + +char * +e_file_home(void) +{ + static char *home = NULL; + + if (home) return home; + home = getenv("HOME"); + if (!home) home = getenv("TMPDIR"); + if (!home) home = "/tmp"; + return home; +} + +static mode_t default_mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; + +int +e_file_mkdir(char *dir) +{ + if (mkdir(dir, default_mode) < 0) return 0; + return 1; +} + +int +e_file_cp(char *src, char *dst) +{ + FILE *f1, *f2; + char buf[4096]; + size_t num; + + f1 = fopen(src, "rb"); + if (!f1) return 0; + f2 = fopen(dst, "wb"); + if (!f2) + { + fclose(f2); + return 0; + } + while ((num = fread(buf, 1, 4096, f1)) > 0) fwrite(buf, 1, num, f2); + fclose(f1); + fclose(f2); + return 1; +}