Terminal: load themes from data and settings folders.
* Uses the same format as the Terminal settings file * Adds an additional key, "Theme name", to settings for themes, which needs to be present for a theme to be loaded, else it will be skipped * Loads themes from Terminal/Themes in the data and settings directories, searching data first, then settings second, allowing a theme to be tweaked by putting a copy in a settings folder Change-Id: I8cadf98151459c1ae6098c38481b16eb3f2cf952
This commit is contained in:
@@ -37,7 +37,6 @@
|
|||||||
#define B_TRANSLATION_CONTEXT "Terminal AppearancePrefView"
|
#define B_TRANSLATION_CONTEXT "Terminal AppearancePrefView"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// #pragma mark -
|
// #pragma mark -
|
||||||
|
|
||||||
|
|
||||||
@@ -112,7 +111,7 @@ AppearancePrefView::AppearancePrefView(const char* name,
|
|||||||
fEncodingField = new BMenuField(B_TRANSLATE("Encoding:"), encodingMenu);
|
fEncodingField = new BMenuField(B_TRANSLATE("Encoding:"), encodingMenu);
|
||||||
|
|
||||||
BPopUpMenu* schemesPopUp = _MakeColorSchemeMenu(MSG_COLOR_SCHEME_CHANGED,
|
BPopUpMenu* schemesPopUp = _MakeColorSchemeMenu(MSG_COLOR_SCHEME_CHANGED,
|
||||||
gPredefinedColorSchemes, gPredefinedColorSchemes[0]);
|
gColorSchemes);
|
||||||
fColorSchemeField = new BMenuField(B_TRANSLATE("Color scheme:"),
|
fColorSchemeField = new BMenuField(B_TRANSLATE("Color scheme:"),
|
||||||
schemesPopUp);
|
schemesPopUp);
|
||||||
|
|
||||||
@@ -453,38 +452,17 @@ AppearancePrefView::_SetCurrentColorScheme()
|
|||||||
{
|
{
|
||||||
PrefHandler* pref = PrefHandler::Default();
|
PrefHandler* pref = PrefHandler::Default();
|
||||||
|
|
||||||
gCustomColorScheme.text_fore_color = pref->getRGB(PREF_TEXT_FORE_COLOR);
|
pref->LoadColorScheme(&gCustomColorScheme);
|
||||||
gCustomColorScheme.text_back_color = pref->getRGB(PREF_TEXT_BACK_COLOR);
|
|
||||||
gCustomColorScheme.select_fore_color = pref->getRGB(PREF_SELECT_FORE_COLOR);
|
|
||||||
gCustomColorScheme.select_back_color = pref->getRGB(PREF_SELECT_BACK_COLOR);
|
|
||||||
gCustomColorScheme.cursor_fore_color = pref->getRGB(PREF_CURSOR_FORE_COLOR);
|
|
||||||
gCustomColorScheme.cursor_back_color = pref->getRGB(PREF_CURSOR_BACK_COLOR);
|
|
||||||
gCustomColorScheme.ansi_colors.black = pref->getRGB(PREF_ANSI_BLACK_COLOR);
|
|
||||||
gCustomColorScheme.ansi_colors.red = pref->getRGB(PREF_ANSI_RED_COLOR);
|
|
||||||
gCustomColorScheme.ansi_colors.green = pref->getRGB(PREF_ANSI_GREEN_COLOR);
|
|
||||||
gCustomColorScheme.ansi_colors.yellow = pref->getRGB(PREF_ANSI_YELLOW_COLOR);
|
|
||||||
gCustomColorScheme.ansi_colors.blue = pref->getRGB(PREF_ANSI_BLUE_COLOR);
|
|
||||||
gCustomColorScheme.ansi_colors.magenta =
|
|
||||||
pref->getRGB(PREF_ANSI_MAGENTA_COLOR);
|
|
||||||
gCustomColorScheme.ansi_colors.cyan = pref->getRGB(PREF_ANSI_CYAN_COLOR);
|
|
||||||
gCustomColorScheme.ansi_colors.white = pref->getRGB(PREF_ANSI_WHITE_COLOR);
|
|
||||||
gCustomColorScheme.ansi_colors_h.black = pref->getRGB(PREF_ANSI_BLACK_HCOLOR);
|
|
||||||
gCustomColorScheme.ansi_colors_h.red = pref->getRGB(PREF_ANSI_RED_HCOLOR);
|
|
||||||
gCustomColorScheme.ansi_colors_h.green = pref->getRGB(PREF_ANSI_GREEN_HCOLOR);
|
|
||||||
gCustomColorScheme.ansi_colors_h.yellow =
|
|
||||||
pref->getRGB(PREF_ANSI_YELLOW_HCOLOR);
|
|
||||||
gCustomColorScheme.ansi_colors_h.blue = pref->getRGB(PREF_ANSI_BLUE_HCOLOR);
|
|
||||||
gCustomColorScheme.ansi_colors_h.magenta =
|
|
||||||
pref->getRGB(PREF_ANSI_MAGENTA_HCOLOR);
|
|
||||||
gCustomColorScheme.ansi_colors_h.cyan = pref->getRGB(PREF_ANSI_CYAN_HCOLOR);
|
|
||||||
gCustomColorScheme.ansi_colors_h.white = pref->getRGB(PREF_ANSI_WHITE_HCOLOR);
|
|
||||||
|
|
||||||
const char* currentSchemeName = NULL;
|
const char* currentSchemeName = NULL;
|
||||||
|
|
||||||
for (const color_scheme** schemes = gPredefinedColorSchemes;
|
int32 i = 0;
|
||||||
*schemes != NULL; schemes++) {
|
while (i < gColorSchemes->CountItems()) {
|
||||||
if (gCustomColorScheme == **schemes) {
|
const color_scheme *item = gColorSchemes->ItemAt(i);
|
||||||
currentSchemeName = (*schemes)->name;
|
i++;
|
||||||
|
|
||||||
|
if (gCustomColorScheme == *item) {
|
||||||
|
currentSchemeName = item->name;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -655,25 +633,47 @@ AppearancePrefView::_MakeMenu(uint32 msg, const char** items,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*static*/ void
|
||||||
|
AppearancePrefView::_MakeColorSchemeMenuItem(uint32 msg, const color_scheme *item,
|
||||||
|
BPopUpMenu *menu)
|
||||||
|
{
|
||||||
|
if (item == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
BMessage* message = new BMessage(msg);
|
||||||
|
message->AddPointer("color_scheme", (const void*)item);
|
||||||
|
menu->AddItem(new BMenuItem(item->name, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*static*/ BPopUpMenu*
|
/*static*/ BPopUpMenu*
|
||||||
AppearancePrefView::_MakeColorSchemeMenu(uint32 msg, const color_scheme** items,
|
AppearancePrefView::_MakeColorSchemeMenu(uint32 msg, BObjectList<const color_scheme> *items)
|
||||||
const color_scheme* defaultItemName)
|
|
||||||
{
|
{
|
||||||
BPopUpMenu* menu = new BPopUpMenu("");
|
BPopUpMenu* menu = new BPopUpMenu("");
|
||||||
|
|
||||||
int32 i = 0;
|
FindColorSchemeByName comparator("Default");
|
||||||
while (*items) {
|
|
||||||
if (strcmp((*items)->name, "") == 0)
|
|
||||||
menu->AddSeparatorItem();
|
|
||||||
else {
|
|
||||||
BMessage* message = new BMessage(msg);
|
|
||||||
message->AddPointer("color_scheme", (const void*)*items);
|
|
||||||
menu->AddItem(new BMenuItem((*items)->name, message));
|
|
||||||
}
|
|
||||||
|
|
||||||
items++;
|
const color_scheme* defaultItem = items->FindIf(comparator);
|
||||||
|
|
||||||
|
_MakeColorSchemeMenuItem(msg, defaultItem, menu);
|
||||||
|
|
||||||
|
int32 i = 0;
|
||||||
|
while (i < items->CountItems()) {
|
||||||
|
const color_scheme *item = items->ItemAt(i);
|
||||||
i++;
|
i++;
|
||||||
|
|
||||||
|
if (strcmp(item->name, "") == 0)
|
||||||
|
menu->AddSeparatorItem();
|
||||||
|
else if (item == defaultItem)
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
_MakeColorSchemeMenuItem(msg, item, menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add the custom item at the very end
|
||||||
|
menu->AddSeparatorItem();
|
||||||
|
_MakeColorSchemeMenuItem(msg, &gCustomColorScheme, menu);
|
||||||
|
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#include <GroupView.h>
|
#include <GroupView.h>
|
||||||
#include <Messenger.h>
|
#include <Messenger.h>
|
||||||
|
#include <ObjectList.h>
|
||||||
#include <String.h>
|
#include <String.h>
|
||||||
|
|
||||||
|
|
||||||
@@ -71,8 +72,10 @@ private:
|
|||||||
const char* defaultItem);
|
const char* defaultItem);
|
||||||
|
|
||||||
static BPopUpMenu* _MakeColorSchemeMenu(uint32 msg,
|
static BPopUpMenu* _MakeColorSchemeMenu(uint32 msg,
|
||||||
const color_scheme** schemes,
|
BObjectList<const color_scheme> *items);
|
||||||
const color_scheme* defaultItemName);
|
static void _MakeColorSchemeMenuItem(uint32 msg,
|
||||||
|
const color_scheme *item,
|
||||||
|
BPopUpMenu* menu);
|
||||||
|
|
||||||
void _MarkSelectedFont(const char* family,
|
void _MarkSelectedFont(const char* family,
|
||||||
const char* style, const char* size);
|
const char* style, const char* size);
|
||||||
|
|||||||
@@ -23,215 +23,12 @@
|
|||||||
#define B_TRANSLATION_CONTEXT "Terminal colors scheme"
|
#define B_TRANSLATION_CONTEXT "Terminal colors scheme"
|
||||||
|
|
||||||
|
|
||||||
// Standard colors
|
|
||||||
const rgb_color kBlack = { 0, 0, 0, 255 };
|
|
||||||
const rgb_color kGreen = { 0, 255, 0, 255 };
|
|
||||||
const rgb_color kWhite = { 255, 255, 255, 255 };
|
|
||||||
const rgb_color kYellow = { 255, 255, 0, 255 };
|
|
||||||
|
|
||||||
const struct ansi_color_scheme kAnsiColorSchemeDefault = {
|
|
||||||
{ 40, 40, 40, 255 },
|
|
||||||
{ 204, 0, 0, 255 },
|
|
||||||
{ 78, 154, 6, 255 },
|
|
||||||
{ 218, 168, 0, 255 },
|
|
||||||
{ 51, 102, 152, 255 },
|
|
||||||
{ 115, 68, 123, 255 },
|
|
||||||
{ 6, 152, 154, 255 },
|
|
||||||
{ 245, 245, 245, 255 }
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The 'bright' colors palette, relates to the existing
|
|
||||||
PREF_ANSI_<color>_HCOLOR macros used elsewhere */
|
|
||||||
const struct ansi_color_scheme kAnsiColorHSchemeDefault = {
|
|
||||||
{ 128, 128, 128, 255 },
|
|
||||||
{ 255, 0, 0, 255 },
|
|
||||||
{ 0, 255, 0, 255 },
|
|
||||||
{ 255, 255, 0, 255 },
|
|
||||||
{ 0, 0, 255, 255 },
|
|
||||||
{ 255, 0, 255, 255 },
|
|
||||||
{ 0, 255, 255, 255 },
|
|
||||||
{ 255, 255, 255, 255 }
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct color_scheme kColorSchemeDefault = {
|
|
||||||
B_TRANSLATE("Default"),
|
|
||||||
kBlack,
|
|
||||||
kWhite,
|
|
||||||
kWhite,
|
|
||||||
kBlack,
|
|
||||||
kWhite,
|
|
||||||
kBlack,
|
|
||||||
kAnsiColorSchemeDefault,
|
|
||||||
kAnsiColorHSchemeDefault
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct color_scheme kColorSchemeBlue = {
|
|
||||||
B_TRANSLATE("Blue"),
|
|
||||||
kYellow,
|
|
||||||
{ 0, 0, 139, 255 },
|
|
||||||
kBlack,
|
|
||||||
kYellow,
|
|
||||||
kBlack,
|
|
||||||
{ 0, 139, 139, 255 },
|
|
||||||
kAnsiColorSchemeDefault,
|
|
||||||
kAnsiColorHSchemeDefault
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct color_scheme kColorSchemeMidnight = {
|
|
||||||
B_TRANSLATE("Midnight"),
|
|
||||||
kWhite,
|
|
||||||
kBlack,
|
|
||||||
kBlack,
|
|
||||||
kWhite,
|
|
||||||
kBlack,
|
|
||||||
kWhite,
|
|
||||||
kAnsiColorSchemeDefault,
|
|
||||||
kAnsiColorHSchemeDefault
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct color_scheme kColorSchemeProfessional = {
|
|
||||||
B_TRANSLATE("Professional"),
|
|
||||||
kWhite,
|
|
||||||
{ 8, 8, 8, 255 },
|
|
||||||
{ 50, 50, 50, 255 },
|
|
||||||
kWhite,
|
|
||||||
kWhite,
|
|
||||||
{ 50, 50, 50, 255 },
|
|
||||||
kAnsiColorSchemeDefault,
|
|
||||||
kAnsiColorHSchemeDefault
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct color_scheme kColorSchemeRetro = {
|
|
||||||
B_TRANSLATE("Retro"),
|
|
||||||
kGreen,
|
|
||||||
kBlack,
|
|
||||||
kBlack,
|
|
||||||
kGreen,
|
|
||||||
kBlack,
|
|
||||||
kGreen,
|
|
||||||
kAnsiColorSchemeDefault,
|
|
||||||
kAnsiColorHSchemeDefault
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct color_scheme kColorSchemeSlate = {
|
|
||||||
B_TRANSLATE("Slate"),
|
|
||||||
kWhite,
|
|
||||||
{ 20, 20, 28, 255 },
|
|
||||||
{ 70, 70, 70, 255 },
|
|
||||||
{ 255, 200, 0, 255 },
|
|
||||||
kWhite,
|
|
||||||
{ 70, 70, 70, 255 },
|
|
||||||
kAnsiColorSchemeDefault,
|
|
||||||
kAnsiColorHSchemeDefault
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct color_scheme kColorSchemeSolarizedDark = {
|
|
||||||
B_TRANSLATE("Solarized Dark"),
|
|
||||||
{ 131, 148, 150, 255 },
|
|
||||||
{ 0, 43, 54, 255 },
|
|
||||||
{ 0, 46, 57, 255 },
|
|
||||||
{ 120, 137, 139, 255 },
|
|
||||||
{ 238, 232, 213, 255 },
|
|
||||||
{ 88, 110, 117, 255 },
|
|
||||||
{
|
|
||||||
{ 7, 54, 66, 255 },
|
|
||||||
{ 220, 50, 47, 255 },
|
|
||||||
{ 133, 153, 0, 255 },
|
|
||||||
{ 181, 137, 0, 255 },
|
|
||||||
{ 38, 139, 210, 255 },
|
|
||||||
{ 211, 54, 130, 255 },
|
|
||||||
{ 42, 161, 152, 255 },
|
|
||||||
{ 238, 232, 213, 255 }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ 0, 43, 54, 255 },
|
|
||||||
{ 203, 75, 22, 255 },
|
|
||||||
{ 88, 110, 117, 255 },
|
|
||||||
{ 101, 123, 131, 255 },
|
|
||||||
{ 131, 148, 150, 255 },
|
|
||||||
{ 108, 113, 196, 255 },
|
|
||||||
{ 147, 161, 161, 255 },
|
|
||||||
{ 253, 246, 227, 255 }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct color_scheme kColorSchemeSolarizedLight = {
|
|
||||||
B_TRANSLATE("Solarized Light"),
|
|
||||||
{ 101, 123, 131, 255 },
|
|
||||||
{ 253, 246, 227, 255 },
|
|
||||||
{ 236, 228, 207, 255 },
|
|
||||||
{ 90, 112, 120, 255 },
|
|
||||||
{ 147, 161, 161, 255 },
|
|
||||||
{ 7, 54, 66, 255 },
|
|
||||||
{
|
|
||||||
{ 7, 54, 66, 255 },
|
|
||||||
{ 220, 50, 47, 255 },
|
|
||||||
{ 133, 153, 0, 255 },
|
|
||||||
{ 181, 137, 0, 255 },
|
|
||||||
{ 38, 139, 210, 255 },
|
|
||||||
{ 211, 54, 130, 255 },
|
|
||||||
{ 42, 161, 152, 255 },
|
|
||||||
{ 238, 232, 213, 255 }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ 0, 43, 54, 255 },
|
|
||||||
{ 203, 75, 22, 255 },
|
|
||||||
{ 88, 110, 117, 255 },
|
|
||||||
{ 101, 123, 131, 255 },
|
|
||||||
{ 131, 148, 150, 255 },
|
|
||||||
{ 108, 113, 196, 255 },
|
|
||||||
{ 147, 161, 161, 255 },
|
|
||||||
{ 253, 246, 227, 255 }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct color_scheme kColorSchemeRelaxed = {
|
|
||||||
B_TRANSLATE("Relaxed"),
|
|
||||||
{ 217, 217, 217, 255 },
|
|
||||||
{ 53, 58, 68, 255 },
|
|
||||||
{ 27, 27, 27, 255 },
|
|
||||||
{ 255, 203, 0, 255 },
|
|
||||||
{ 53, 58, 68, 255 },
|
|
||||||
{ 217, 217, 217, 255 },
|
|
||||||
{
|
|
||||||
{ 21, 21, 21, 255 },
|
|
||||||
{ 188, 86, 83, 255 },
|
|
||||||
{ 144, 157, 99, 255 },
|
|
||||||
{ 235, 193, 122, 255 },
|
|
||||||
{ 106, 135, 153, 255 },
|
|
||||||
{ 176, 102, 152, 255 },
|
|
||||||
{ 201, 223, 255, 255 },
|
|
||||||
{ 217, 217, 217, 255 }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ 99, 99, 99, 255 },
|
|
||||||
{ 188, 86, 83, 255 },
|
|
||||||
{ 160, 172, 119, 255 },
|
|
||||||
{ 235, 192, 122, 255 },
|
|
||||||
{ 126, 170, 199, 255 },
|
|
||||||
{ 176, 102, 152, 255 },
|
|
||||||
{ 172, 187, 208, 255 },
|
|
||||||
{ 247, 247, 247, 255 }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct color_scheme gCustomColorScheme = {
|
struct color_scheme gCustomColorScheme = {
|
||||||
B_TRANSLATE("Custom")
|
B_TRANSLATE("Custom")
|
||||||
};
|
};
|
||||||
|
|
||||||
const color_scheme* gPredefinedColorSchemes[] = {
|
|
||||||
&kColorSchemeDefault,
|
BObjectList<const color_scheme>* gColorSchemes = NULL;
|
||||||
&kColorSchemeBlue,
|
|
||||||
&kColorSchemeMidnight,
|
|
||||||
&kColorSchemeProfessional,
|
|
||||||
&kColorSchemeRetro,
|
|
||||||
&kColorSchemeSlate,
|
|
||||||
&kColorSchemeSolarizedDark,
|
|
||||||
&kColorSchemeSolarizedLight,
|
|
||||||
&kColorSchemeRelaxed,
|
|
||||||
&gCustomColorScheme,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <InterfaceDefs.h>
|
#include <InterfaceDefs.h>
|
||||||
|
#include <ObjectList.h>
|
||||||
|
|
||||||
|
|
||||||
struct ansi_color_scheme {
|
struct ansi_color_scheme {
|
||||||
@@ -38,8 +39,24 @@ struct color_scheme {
|
|||||||
bool operator==(const color_scheme& color);
|
bool operator==(const color_scheme& color);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct FindColorSchemeByName : public UnaryPredicate<const color_scheme> {
|
||||||
|
FindColorSchemeByName() : scheme_name("") {}
|
||||||
|
|
||||||
|
FindColorSchemeByName(const char* name)
|
||||||
|
: scheme_name(name)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
int operator()(const color_scheme* item) const
|
||||||
|
{
|
||||||
|
return strcmp(item->name, scheme_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* scheme_name;
|
||||||
|
};
|
||||||
|
|
||||||
extern color_scheme gCustomColorScheme;
|
extern color_scheme gCustomColorScheme;
|
||||||
extern const color_scheme* gPredefinedColorSchemes[];
|
extern BObjectList<const color_scheme> *gColorSchemes;
|
||||||
|
|
||||||
const uint kANSIColorCount = 16;
|
const uint kANSIColorCount = 16;
|
||||||
const uint kTermColorCount = 256;
|
const uint kTermColorCount = 256;
|
||||||
|
|||||||
@@ -21,18 +21,20 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <AutoDeleter.h>
|
||||||
#include <Catalog.h>
|
#include <Catalog.h>
|
||||||
#include <Directory.h>
|
#include <Directory.h>
|
||||||
#include <Entry.h>
|
#include <Entry.h>
|
||||||
#include <File.h>
|
#include <File.h>
|
||||||
#include <FindDirectory.h>
|
|
||||||
#include <Font.h>
|
#include <Font.h>
|
||||||
#include <GraphicsDefs.h>
|
#include <GraphicsDefs.h>
|
||||||
#include <Locale.h>
|
#include <Locale.h>
|
||||||
#include <Message.h>
|
#include <Message.h>
|
||||||
#include <NodeInfo.h>
|
#include <NodeInfo.h>
|
||||||
#include <Path.h>
|
#include <Path.h>
|
||||||
|
#include <PathFinder.h>
|
||||||
|
|
||||||
|
#include "Colors.h"
|
||||||
#include "Globals.h"
|
#include "Globals.h"
|
||||||
#include "TermConst.h"
|
#include "TermConst.h"
|
||||||
|
|
||||||
@@ -110,6 +112,11 @@ PrefHandler::PrefHandler(bool loadSettings)
|
|||||||
BPath path;
|
BPath path;
|
||||||
GetDefaultPath(path);
|
GetDefaultPath(path);
|
||||||
OpenText(path.Path());
|
OpenText(path.Path());
|
||||||
|
|
||||||
|
// Add the builtin schemes
|
||||||
|
if (gColorSchemes == NULL) {
|
||||||
|
LoadThemes();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: If no fixed font is available, be_fixed_font
|
// TODO: If no fixed font is available, be_fixed_font
|
||||||
@@ -253,6 +260,60 @@ PrefHandler::SaveAsText(const char *path, const char *mimetype,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
SortByName(const color_scheme *lhs, const color_scheme *rhs)
|
||||||
|
{
|
||||||
|
return strcmp(lhs->name, rhs->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
PrefHandler::LoadThemes()
|
||||||
|
{
|
||||||
|
gColorSchemes = new BObjectList<const color_scheme>(10, true);
|
||||||
|
|
||||||
|
BStringList paths;
|
||||||
|
|
||||||
|
if (BPathFinder::FindPaths(B_FIND_PATH_DATA_DIRECTORY,
|
||||||
|
"Terminal/Themes/", B_FIND_PATH_EXISTING_ONLY, paths) == B_OK)
|
||||||
|
paths.DoForEach(PrefHandler::_LoadThemesFromDirectory);
|
||||||
|
|
||||||
|
if (BPathFinder::FindPaths(B_FIND_PATH_SETTINGS_DIRECTORY,
|
||||||
|
"Terminal/Themes/", B_FIND_PATH_EXISTING_ONLY, paths) == B_OK)
|
||||||
|
paths.DoForEach(PrefHandler::_LoadThemesFromDirectory);
|
||||||
|
|
||||||
|
gColorSchemes->SortItems(SortByName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
PrefHandler::LoadColorScheme(color_scheme* scheme)
|
||||||
|
{
|
||||||
|
scheme->text_fore_color = getRGB(PREF_TEXT_FORE_COLOR);
|
||||||
|
scheme->text_back_color = getRGB(PREF_TEXT_BACK_COLOR);
|
||||||
|
scheme->select_fore_color = getRGB(PREF_SELECT_FORE_COLOR);
|
||||||
|
scheme->select_back_color = getRGB(PREF_SELECT_BACK_COLOR);
|
||||||
|
scheme->cursor_fore_color = getRGB(PREF_CURSOR_FORE_COLOR);
|
||||||
|
scheme->cursor_back_color = getRGB(PREF_CURSOR_BACK_COLOR);
|
||||||
|
scheme->ansi_colors.black = getRGB(PREF_ANSI_BLACK_COLOR);
|
||||||
|
scheme->ansi_colors.red = getRGB(PREF_ANSI_RED_COLOR);
|
||||||
|
scheme->ansi_colors.green = getRGB(PREF_ANSI_GREEN_COLOR);
|
||||||
|
scheme->ansi_colors.yellow = getRGB(PREF_ANSI_YELLOW_COLOR);
|
||||||
|
scheme->ansi_colors.blue = getRGB(PREF_ANSI_BLUE_COLOR);
|
||||||
|
scheme->ansi_colors.magenta = getRGB(PREF_ANSI_MAGENTA_COLOR);
|
||||||
|
scheme->ansi_colors.cyan = getRGB(PREF_ANSI_CYAN_COLOR);
|
||||||
|
scheme->ansi_colors.white = getRGB(PREF_ANSI_WHITE_COLOR);
|
||||||
|
scheme->ansi_colors_h.black = getRGB(PREF_ANSI_BLACK_HCOLOR);
|
||||||
|
scheme->ansi_colors_h.red = getRGB(PREF_ANSI_RED_HCOLOR);
|
||||||
|
scheme->ansi_colors_h.green = getRGB(PREF_ANSI_GREEN_HCOLOR);
|
||||||
|
scheme->ansi_colors_h.yellow = getRGB(PREF_ANSI_YELLOW_HCOLOR);
|
||||||
|
scheme->ansi_colors_h.blue = getRGB(PREF_ANSI_BLUE_HCOLOR);
|
||||||
|
scheme->ansi_colors_h.magenta = getRGB(PREF_ANSI_MAGENTA_HCOLOR);
|
||||||
|
scheme->ansi_colors_h.cyan = getRGB(PREF_ANSI_CYAN_HCOLOR);
|
||||||
|
scheme->ansi_colors_h.white = getRGB(PREF_ANSI_WHITE_HCOLOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32
|
int32
|
||||||
PrefHandler::getInt32(const char *key)
|
PrefHandler::getInt32(const char *key)
|
||||||
{
|
{
|
||||||
@@ -483,3 +544,46 @@ PrefHandler::_LoadFromTextFile(const char * path)
|
|||||||
fclose(file);
|
fclose(file);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
PrefHandler::_LoadThemesFromDirectory(const BString &directory)
|
||||||
|
{
|
||||||
|
BDirectory *themes = new BDirectory(directory.String());
|
||||||
|
if (themes == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
BEntry entry;
|
||||||
|
BPath path;
|
||||||
|
FindColorSchemeByName comparator;
|
||||||
|
while (themes->GetNextEntry(&entry) == B_OK)
|
||||||
|
{
|
||||||
|
if (entry.GetPath(&path) != B_OK)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
PrefHandler *themeHandler = new PrefHandler(false);
|
||||||
|
ObjectDeleter<PrefHandler> themeHandlerDeleter(themeHandler);
|
||||||
|
themeHandler->_LoadFromTextFile(path.Path());
|
||||||
|
|
||||||
|
const char *name = themeHandler->fContainer.GetString(PREF_THEME_NAME, NULL);
|
||||||
|
|
||||||
|
if (name == NULL || strlen(name) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
comparator.scheme_name = name;
|
||||||
|
|
||||||
|
const color_scheme *scheme = gColorSchemes->FindIf(comparator);
|
||||||
|
|
||||||
|
if (scheme != NULL) {
|
||||||
|
// Scheme with this name exists, replace with this version instead
|
||||||
|
gColorSchemes->RemoveItem(scheme);
|
||||||
|
}
|
||||||
|
|
||||||
|
color_scheme *newScheme = new color_scheme();
|
||||||
|
newScheme->name = strdup(name);
|
||||||
|
themeHandler->LoadColorScheme(newScheme);
|
||||||
|
gColorSchemes->AddItem(newScheme);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,11 +18,14 @@
|
|||||||
#include <SupportDefs.h>
|
#include <SupportDefs.h>
|
||||||
#include <GraphicsDefs.h>
|
#include <GraphicsDefs.h>
|
||||||
#include <Message.h>
|
#include <Message.h>
|
||||||
|
#include <String.h>
|
||||||
|
|
||||||
class BFont;
|
class BFont;
|
||||||
class BPath;
|
class BPath;
|
||||||
|
|
||||||
|
|
||||||
|
struct color_scheme;
|
||||||
|
|
||||||
struct pref_defaults {
|
struct pref_defaults {
|
||||||
const char *key;
|
const char *key;
|
||||||
const char *item;
|
const char *item;
|
||||||
@@ -71,10 +74,14 @@ class PrefHandler {
|
|||||||
|
|
||||||
static status_t GetDefaultPath(BPath& path);
|
static status_t GetDefaultPath(BPath& path);
|
||||||
|
|
||||||
|
void LoadThemes();
|
||||||
|
void LoadColorScheme(color_scheme* scheme);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void _ConfirmFont(const BFont *fallbackFont);
|
void _ConfirmFont(const BFont *fallbackFont);
|
||||||
status_t _LoadFromDefault(const pref_defaults* defaults = NULL);
|
status_t _LoadFromDefault(const pref_defaults* defaults = NULL);
|
||||||
status_t _LoadFromTextFile(const char * path);
|
status_t _LoadFromTextFile(const char * path);
|
||||||
|
static bool _LoadThemesFromDirectory(const BString &directory);
|
||||||
|
|
||||||
BMessage fContainer;
|
BMessage fContainer;
|
||||||
|
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ static const uint32 MSG_GET_TERMINAL_COLOR = 'getc';
|
|||||||
|
|
||||||
|
|
||||||
// Preference Read/Write Keys
|
// Preference Read/Write Keys
|
||||||
|
static const char* const PREF_THEME_NAME = "Theme name";
|
||||||
static const char* const PREF_HALF_FONT_FAMILY = "Half Font Family";
|
static const char* const PREF_HALF_FONT_FAMILY = "Half Font Family";
|
||||||
static const char* const PREF_HALF_FONT_STYLE = "Half Font Style";
|
static const char* const PREF_HALF_FONT_STYLE = "Half Font Style";
|
||||||
static const char* const PREF_HALF_FONT_SIZE = "Half Font Size";
|
static const char* const PREF_HALF_FONT_SIZE = "Half Font Size";
|
||||||
|
|||||||
Reference in New Issue
Block a user