fxos/shell/theme.cpp

56 lines
1.2 KiB
C++

#include "theme.h"
#include <cstring>
#include <map>
#include <array>
uint32_t base16[16];
bool theme_load(std::string filename)
{
FILE *fp = fopen(filename.c_str(), "r");
if(!fp) return false;
for(int i = 0; i < 16; i++) base16[i] = 0xffffff;
char entry[64], value[256];
int colors_found = 0;
while(fscanf(fp, " %64[^:]: \"%64[^\"\n]\"", entry, value) == 2)
{
if(strlen(entry) == 6 && !strncmp(entry, "base0", 5))
{
int index = entry[5]-'0' - 7*(entry[5]>='A') - 32*(entry[5]>='a');
colors_found++;
sscanf(value, "%x", &base16[index]);
}
}
fclose(fp);
return true;
}
fmt::text_style theme(int color)
{
return fg(fmt::rgb(base16[color & 0xf]));
}
//---
// Built-in themes
//---
static std::map<std::string, std::array<uint32_t,16>> builtin_themes = {
/* Tomorrow Night by Chris Kempson (http://chriskempson.com) */
{ "tomorrow-night", {
0x1d1f21, 0x282a2e, 0x373b41, 0x969896, 0xb4b7b4, 0xc5c8c6,
0xe0e0e0, 0xffffff, 0xcc6666, 0xde935f, 0xf0c674, 0xb5bd68,
0x8abeb7, 0x81a2be, 0xb294bb, 0xa3685a, }},
};
bool theme_builtin(std::string name)
{
if(!builtin_themes.count(name)) return false;
for(int i = 0; i < 16; i++)
base16[i] = builtin_themes[name][i];
return true;
}