THEME_REC *theme_load(const char *setname) { THEME_REC *theme, *oldtheme; struct stat statbuf; char *fname, *name, *p; name = g_strdup(setname); p = strrchr(name, '.'); if (p != NULL && strcmp(p, ".theme") == 0) { /* remove the trailing .theme */ *p = '\0'; } theme = theme_find(name); /* check home dir */ fname = g_strdup_printf("%s/%s.theme", get_irssi_dir(), name); if (stat(fname, &statbuf) != 0) { /* check global config dir */ g_free(fname); fname = g_strdup_printf(THEMESDIR"/%s.theme", name); if (stat(fname, &statbuf) != 0) { /* theme not found */ g_free(fname); g_free(name); return theme; /* use the one in memory if possible */ } } if (theme != NULL && theme->last_modify == statbuf.st_mtime) { /* theme not modified, use the one already in memory */ g_free(fname); g_free(name); return theme; } oldtheme = theme; theme = theme_create(fname, name); theme->last_modify = statbuf.st_mtime; if (!theme_read(theme, theme->path, NULL)) { /* error reading .theme file */ theme_destroy(theme); theme = NULL; } if (oldtheme != NULL && theme != NULL) { theme_destroy(oldtheme); window_themes_update(); } g_free(fname); g_free(name); return theme; }
void themes_deinit(void) { while (themes != NULL) theme_destroy(themes->data); theme_destroy(internal_theme); g_hash_table_destroy(default_formats); default_formats = NULL; command_unbind("format", (SIGNAL_FUNC) cmd_format); command_unbind("save", (SIGNAL_FUNC) cmd_save); signal_remove("complete command format", (SIGNAL_FUNC) sig_complete_format); signal_remove("irssi init finished", (SIGNAL_FUNC) sig_print_errors); signal_remove("setup changed", (SIGNAL_FUNC) read_settings); signal_remove("setup reread", (SIGNAL_FUNC) themes_reload); }
void themes_reload(void) { GSList *refs; char *fname; /* increase every theme's refcount, and destroy them. this way if we want to use the theme before it's reloaded we don't crash. */ refs = NULL; while (themes != NULL) { THEME_REC *theme = themes->data; refs = g_slist_prepend(refs, theme); theme->refcount++; theme_destroy(theme); } /* first there's default theme.. */ current_theme = theme_load("default"); if (current_theme == NULL) { fname = g_strdup_printf("%s/default.theme", get_irssi_dir()); current_theme = theme_create(fname, "default"); current_theme->default_color = -1; theme_read(current_theme, NULL); g_free(fname); } window_themes_update(); change_theme(settings_get_str("theme"), FALSE); while (refs != NULL) { theme_unref(refs->data); refs = g_slist_remove(refs, refs->data); } }
static THEME_REC *read_internal_theme(void) { CONFIG_REC *config; THEME_REC *theme; theme = theme_create("internal", "_internal"); theme->refcount++; theme_destroy(theme); config = config_open(NULL, -1); config_parse_data(config, default_theme, "internal"); theme_read_abstracts(config, theme); config_close(config); return theme; }