status_t TerminalThemesAddon::SaveHaikuTerminalSettings(BMessage &from) { BMessage settings; status_t err; BPath pTermPref; // load existing err = LoadHaikuTerminalSettings(settings); if (find_directory(B_USER_SETTINGS_DIRECTORY, &pTermPref) < B_OK) return EINVAL; #ifdef __HAIKU__ pTermPref.Append("Terminal"); pTermPref.Append("Default"); #else pTermPref.Append("HaikuTerminal_settings"); #endif BFile file(pTermPref.Path(), B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE); BString buffer; type_code type; char *key; err = file.InitCheck(); if (err < B_OK) return err; // merge new values for (int32 i = 0; from.GetInfo(B_STRING_TYPE, i, GET_INFO_NAME_PTR(&key), &type) == B_OK; i++) { BString s; if (from.FindString(key, &s) < B_OK) continue; settings.RemoveName(key); settings.AddString(key, s.String()); } for (int32 i = 0; settings.GetInfo(B_STRING_TYPE, i, GET_INFO_NAME_PTR(&key), &type) == B_OK; i++) { BString s; if (settings.FindString(key, &s) < B_OK) continue; buffer.Append("\""); buffer.Append(key); buffer.Append("\" , \""); buffer.Append(s); buffer.Append("\"\n"); file.Write(buffer.String(), buffer.Length()); } return B_OK; }
status_t TerminalThemesAddon::MakeThemeHaiku(BMessage &theme, uint32 flags) { BMessage termpref; BMessage lines; status_t err; BString value; int n, i; (void)flags; err = MyMessage(theme, termpref); if (err) termpref.MakeEmpty(); err = LoadHaikuTerminalSettings(lines); for (i = 0; i < NENTS(sHaikuPrefsMapInt32); i++) { int v; if (lines.FindString(sHaikuPrefsMapInt32[i].pref, &value) < B_OK) continue; n = sscanf(value.String(), "%d", &v); //printf("n=%d '%s'\n", n, value.String()); if (n == 1) termpref.AddInt32(sHaikuPrefsMapInt32[i].name, v); } for (i = 0; i < NENTS(sHaikuPrefsMapColors); i++) { int r, g, b; if (lines.FindString(sHaikuPrefsMapColors[i].pref, &value) < B_OK) continue; n = sscanf(value.String(), "%d%*[, ]%d%*[, ]%d", &r, &g, &b); //printf("n=%d '%s' %d,%d,%d\n", n, value.String(), r, g, b); if (n == 3) { rgb_color c = make_color(r, g, b, 255); AddRGBColor(termpref, sHaikuPrefsMapColors[i].name, c); } } BFont font; BString s; font_family family; font_style style; float size = 12.0; memset(&family, 0, sizeof(family)); memset(&style, 0, sizeof(style)); if (lines.FindString(PREF_HALF_FONT_FAMILY, &s) == B_OK) strncpy(family, s.String(), B_FONT_FAMILY_LENGTH); if (lines.FindString(PREF_HALF_FONT_STYLE, &s) == B_OK) strncpy(style, s.String(), B_FONT_STYLE_LENGTH); font.SetFamilyAndStyle(family, style); if (lines.FindString(PREF_HALF_FONT_SIZE, &s) == B_OK) sscanf(s.String(), "%f", &size); font.SetSize(size); //termpref.PrintToStream(); err = SetMyMessage(theme, termpref); return B_OK; }
status_t TerminalThemesAddon::MakeThemeHaiku(BMessage &theme, uint32 flags) { BMessage termpref; BMessage lines; status_t err; BPath pTermPref; (void)flags; err = MyMessage(theme, termpref); if (err) termpref.MakeEmpty(); err = LoadHaikuTerminalSettings(lines); //XXX: WRITEME /* char buffer[1024]; char key[B_FIELD_NAME_LENGTH], data[512]; int n; FILE *file; while (fgets(buffer, sizeof(buffer), file) != NULL) { if (*buffer == '#') continue; n = sscanf(buffer, "%*[\"]%[^\"]%*[\"]%*[^\"]%*[\"]%[^\"]", key, data); if (n == 2) { if (strstr(key, " Color")) { rgb_color color; int r, g, b; n = sscanf(data, "%3d, %3d, %3d", &r, &g, &b); color.red = r; color.green = g; color.blue = b; color.alpha = 255; } else lines.AddString(key, data); } } */ /* BFile fTermPref(pTermPref.Path(), B_READ_ONLY); if (fTermPref.InitCheck() != B_OK) return fTermPref.InitCheck(); if (fTermPref.Read(&tp, sizeof(struct termprefs)) < (ssize_t)sizeof(struct termprefs)) return EIO; if ((tp.magic != TP_MAGIC) || (tp.version != TP_VERSION)) return EINVAL; termpref.AddInt32(TP_COLS, tp.p.cols); termpref.AddInt32(TP_ROWS, tp.p.rows); termpref.AddInt32(TP_TABWIDTH, tp.p.tab_width); BFont tFont; font_family ff; font_style fs; BString str(tp.p.font); str.Truncate(str.FindFirst('/')); strncpy(ff, str.String(), sizeof(ff)); str.SetTo(tp.p.font); str.Remove(0, str.FindFirst('/')+1); strncpy(fs, str.String(), sizeof(fs)); tFont.SetFamilyAndStyle(ff, fs); tFont.SetSize(tp.p.font_size); AddFont(termpref, TP_FONT, &tFont); AddRGBColor(termpref, TP_BG, tp.p.bg); AddRGBColor(termpref, TP_FG, tp.p.fg); AddRGBColor(termpref, TP_CURBG, tp.p.curbg); AddRGBColor(termpref, TP_CURFG, tp.p.curfg); AddRGBColor(termpref, TP_SELBG, tp.p.selbg); AddRGBColor(termpref, TP_SELFG, tp.p.selfg); termpref.AddInt32(TP_ENCODING, tp.p.encoding); */ err = SetMyMessage(theme, termpref); return B_OK; }