diff --git a/osk.conf b/osk.conf index e74f6cbaaa73c945d70176bcd81b951be044f8ba..255128780407f4ce313df0d2bc19ccaef05d0310 100644 --- a/osk.conf +++ b/osk.conf @@ -3,11 +3,18 @@ wallpaper = #000000 -keyboard-background = #333333; +keyboard-background = #0E0E12 keyboard-map = us keyboard-font = /usr/share/fonts/ttf-dejavu/DejaVuSans.ttf +keyboard-font-size = 24 +key-foreground = #FFFFFF +key-background-letter = #5A606A +key-background-return = #003C00 +key-background-other = #32363E key-radius = 0 + +inputbox-background = #32363E inputbox-radius = 0 animations = true diff --git a/src/config.cpp b/src/config.cpp index 650677ddf921567de0e4e2cd9f45135f44970226..110210ac9f635a9e30820236ec89438a0e7a9d5b 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -25,6 +25,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <sstream> #include <string> +argb parseHexString(const std::string &hex) +{ + argb result = { 255, 0, 0, 0 }; + if (sscanf(hex.c_str(), "#%02hhx%02hhx%02hhx", &result.r, &result.g, &result.b) != 3) { + SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Could not parse color code %s", hex.c_str()); + exit(EXIT_FAILURE); + } + return result; +} + bool Config::Read(const std::string &path) { std::ifstream is(path, std::ifstream::binary); @@ -39,12 +49,14 @@ bool Config::Read(const std::string &path) auto it = Config::options.find("wallpaper"); if (it != Config::options.end()) { - Config::wallpaper = Config::options["wallpaper"]; + std::string hex = Config::options["wallpaper"]; + Config::wallpaper = parseHexString(hex); } it = Config::options.find("keyboard-background"); if (it != Config::options.end()) { - Config::keyboardBackground = Config::options["keyboard-background"]; + std::string hex = Config::options["keyboard-background"]; + Config::keyboardBackground = parseHexString(hex); } it = Config::options.find("keyboard-font"); @@ -52,16 +64,51 @@ bool Config::Read(const std::string &path) Config::keyboardFont = Config::options["keyboard-font"]; } + it = Config::options.find("keyboard-font-size"); + if (it != Config::options.end()) { + Config::keyboardFontSize = std::stoi(Config::options["keyboard-font-size"]); + } + it = Config::options.find("keyboard-map"); if (it != Config::options.end()) { Config::keyboardMap = Config::options["keyboard-map"]; } + it = Config::options.find("key-foreground"); + if (it != Config::options.end()) { + std::string hex = Config::options["key-foreground"]; + Config::keyForeground = parseHexString(hex); + } + + it = Config::options.find("key-background-letter"); + if (it != Config::options.end()) { + std::string hex = Config::options["key-background-letter"]; + Config::keyBackgroundLetter = parseHexString(hex); + } + + it = Config::options.find("key-background-return"); + if (it != Config::options.end()) { + std::string hex = Config::options["key-background-return"]; + Config::keyBackgroundReturn = parseHexString(hex); + } + + it = Config::options.find("key-background-other"); + if (it != Config::options.end()) { + std::string hex = Config::options["key-background-other"]; + Config::keyBackgroundOther = parseHexString(hex); + } + it = Config::options.find("key-radius"); if (it != Config::options.end()) { Config::keyRadius = Config::options["key-radius"]; } + it = Config::options.find("inputbox-background"); + if (it != Config::options.end()) { + std::string hex = Config::options["inputbox-background"]; + Config::inputBoxBackground = parseHexString(hex); + } + it = Config::options.find("inputbox-radius"); if (it != Config::options.end()) { Config::inputBoxRadius = Config::options["inputbox-radius"]; diff --git a/src/config.h b/src/config.h index 9487d0d90009032357f7f59c77dd55e0a1ede6f3..b35ac7ebd3a0e84cf5f0dbebc987f75668c9b81c 100644 --- a/src/config.h +++ b/src/config.h @@ -22,14 +22,34 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #include <map> #include <string> +struct argb { + unsigned char a; + unsigned char r; + unsigned char g; + unsigned char b; +}; + +/** + Convert color hex string into ARGB + @hex 6-character hex string with leading # + @return ARGB structure to write the extracted values into + */ +argb parseHexString(const std::string &hex); + class Config { public: - std::string keyboardBackground = "#333333"; - std::string wallpaper = "#FF9900"; + argb wallpaper = parseHexString("#000000"); + argb keyboardBackground = parseHexString("#0E0E12"); std::string keyboardFont = "DejaVu"; + int keyboardFontSize = 24; std::string keyboardMap = "us"; - std::string inputBoxRadius = "0"; + argb keyForeground = parseHexString("#FFFFFF"); + argb keyBackgroundLetter = parseHexString("#5A606A"); + argb keyBackgroundReturn = parseHexString("#003C00"); + argb keyBackgroundOther = parseHexString("#32363E"); std::string keyRadius = "0"; + argb inputBoxBackground = parseHexString("#32363E"); + std::string inputBoxRadius = "0"; bool animations = true; /** diff --git a/src/keyboard.cpp b/src/keyboard.cpp index 5dbd96c79ddf88135d4a01e13080f9275bc21b52..2ff6249068e908a8684a8f3cb8c6c4a728427787 100644 --- a/src/keyboard.cpp +++ b/src/keyboard.cpp @@ -68,14 +68,6 @@ void Keyboard::setTargetPosition(float p) targetPosition = p; } -void Keyboard::setKeyboardColor(uint8_t a, uint8_t r, uint8_t g, uint8_t b) -{ - keyboardColor.a = a; - keyboardColor.r = r; - keyboardColor.g = g; - keyboardColor.b = b; -} - void Keyboard::updateAnimations() { const int animStep = 20; // 20ms -> 50 FPS @@ -133,7 +125,7 @@ void Keyboard::draw(SDL_Renderer *renderer, int screenHeight) srcRect.w = keyboardWidth; srcRect.h = keyboardRect.h; - SDL_SetRenderDrawColor(renderer, keyboardColor.r, keyboardColor.g, keyboardColor.b, keyboardColor.a); + SDL_SetRenderDrawColor(renderer, config->keyboardBackground.r, config->keyboardBackground.g, config->keyboardBackground.b, config->keyboardBackground.a); for (const auto &layer : keyboard) { if (layer.layerNum == activeLayer) { @@ -150,10 +142,10 @@ bool Keyboard::isInSlideAnimation() const void Keyboard::drawRow(SDL_Surface *surface, std::vector<touchArea> &keyVector, int x, int y, int width, int height, const std::vector<std::string> &keys, int padding, TTF_Font *font) const { - auto keyBackground = SDL_MapRGB(surface->format, 15, 15, 15); - SDL_Color textColor = { 255, 255, 255, 0 }; + auto keyBackground = SDL_MapRGB(surface->format, config->keyBackgroundLetter.r, config->keyBackgroundLetter.g, config->keyBackgroundLetter.b); + SDL_Color textColor = { config->keyForeground.r, config->keyForeground.g, config->keyForeground.b, config->keyForeground.a }; - auto background = SDL_MapRGB(surface->format, keyboardColor.r, keyboardColor.g, keyboardColor.b); + auto background = SDL_MapRGB(surface->format, config->keyboardBackground.r, config->keyboardBackground.g, config->keyboardBackground.b); int i = 0; for (const auto &keyCap : keys) { SDL_Rect keyRect; @@ -182,10 +174,10 @@ void Keyboard::drawRow(SDL_Surface *surface, std::vector<touchArea> &keyVector, } void Keyboard::drawKey(SDL_Surface *surface, std::vector<touchArea> &keyVector, int x, int y, int width, int height, - char *cap, const char *key, int padding, TTF_Font *font) const + char *cap, const char *key, int padding, TTF_Font *font, argb background) const { - auto keyBackground = SDL_MapRGB(surface->format, 15, 15, 15); - SDL_Color textColor = { 255, 255, 255, 0 }; + auto keyBackground = SDL_MapRGB(surface->format, background.r, background.g, background.b); + SDL_Color textColor = { config->keyForeground.r, config->keyForeground.g, config->keyForeground.b, config->keyForeground.a }; SDL_Rect keyRect; keyRect.x = x + padding; @@ -235,7 +227,7 @@ SDL_Surface *Keyboard::makeKeyboard(KeyboardLayer *layer) const } SDL_FillRect(surface, nullptr, - SDL_MapRGB(surface->format, keyboardColor.r, keyboardColor.g, keyboardColor.b)); + SDL_MapRGB(surface->format, config->keyboardBackground.r, config->keyboardBackground.g, config->keyboardBackground.b)); int rowCount = layer->rows.size(); int rowHeight = keyboardHeight / (rowCount + 1); @@ -245,7 +237,7 @@ SDL_Surface *Keyboard::makeKeyboard(KeyboardLayer *layer) const return nullptr; } - TTF_Font *font = TTF_OpenFont(config->keyboardFont.c_str(), 24); + TTF_Font *font = TTF_OpenFont(config->keyboardFont.c_str(), config->keyboardFontSize); if (!font) { SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "TTF_OpenFont: %s", TTF_GetError()); return nullptr; @@ -274,29 +266,29 @@ SDL_Surface *Keyboard::makeKeyboard(KeyboardLayer *layer) const if (layer->layerNum < 2) { char nums[] = "123"; drawKey(surface, layer->keyVector, colw, y, colw * 3, rowHeight, - nums, KEYCAP_NUMBERS, keyboardWidth / 100, font); + nums, KEYCAP_NUMBERS, keyboardWidth / 100, font, config->keyBackgroundOther); } else { char abc[] = "abc"; drawKey(surface, layer->keyVector, colw, y, colw * 3, rowHeight, - abc, KEYCAP_ABC, keyboardWidth / 100, font); + abc, KEYCAP_ABC, keyboardWidth / 100, font, config->keyBackgroundOther); } /* Shift-key that transforms into "123" or "=\<" depending on layer: */ if (layer->layerNum == 2) { char symb[] = "=\\<"; drawKey(surface, layer->keyVector, 0, y - rowHeight, sidebuttonsWidth, rowHeight, - symb, KEYCAP_SYMBOLS, keyboardWidth / 100, font); + symb, KEYCAP_SYMBOLS, keyboardWidth / 100, font, config->keyBackgroundOther); } else if (layer->layerNum == 3) { char nums[] = "123"; drawKey(surface, layer->keyVector, 0, y - rowHeight, sidebuttonsWidth, rowHeight, - nums, KEYCAP_NUMBERS, keyboardWidth / 100, font); + nums, KEYCAP_NUMBERS, keyboardWidth / 100, font, config->keyBackgroundOther); } else { char shift[64] = ""; memcpy(shift, KEYCAP_SHIFT, strlen(KEYCAP_SHIFT) + 1); drawKey(surface, layer->keyVector, 0, y - rowHeight, sidebuttonsWidth, rowHeight, - shift, KEYCAP_SHIFT, keyboardWidth / 100, font); + shift, KEYCAP_SHIFT, keyboardWidth / 100, font, config->keyBackgroundOther); } /* Backspace key that is larger-sized (hence also drawn separately) */ { @@ -305,20 +297,20 @@ SDL_Surface *Keyboard::makeKeyboard(KeyboardLayer *layer) const strlen(KEYCAP_BACKSPACE) + 1); drawKey(surface, layer->keyVector, keyboardWidth / 20 + colw * 16, y - rowHeight, sidebuttonsWidth, rowHeight, - bcksp, KEYCAP_BACKSPACE, keyboardWidth / 100, font); + bcksp, KEYCAP_BACKSPACE, keyboardWidth / 100, font, config->keyBackgroundOther); } char space[] = " "; drawKey(surface, layer->keyVector, colw * 5, y, colw * 8, rowHeight, - space, KEYCAP_SPACE, keyboardWidth / 100, font); + space, KEYCAP_SPACE, keyboardWidth / 100, font, config->keyBackgroundLetter); char period[] = "."; drawKey(surface, layer->keyVector, colw * 13, y, colw * 2, rowHeight, - period, KEYCAP_PERIOD, keyboardWidth / 100, font); + period, KEYCAP_PERIOD, keyboardWidth / 100, font, config->keyBackgroundOther); char enter[] = "OK"; drawKey(surface, layer->keyVector, colw * 15, y, colw * 5, rowHeight, - enter, KEYCAP_RETURN, keyboardWidth / 100, font); + enter, KEYCAP_RETURN, keyboardWidth / 100, font, config->keyBackgroundReturn); return surface; } diff --git a/src/keyboard.h b/src/keyboard.h index 4e757cf94d59c1a60793c9f61e5d0d932c05b537..691b1b45b3a771fa51c48e18fd198b43dbaba6d6 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -51,13 +51,6 @@ struct rgb { unsigned char b; }; -struct argb { - unsigned char a; - unsigned char r; - unsigned char g; - unsigned char b; -}; - struct KeyboardLayer { SDL_Surface *surface = nullptr; SDL_Texture *texture = nullptr; @@ -85,14 +78,6 @@ public: @return String with value of key at the given coordinates */ std::string getCharForCoordinates(int x, int y); - /** - Set keyboard color - @param a Alpha value - @param r Red value - @param g Green value - @param b Blue value - */ - void setKeyboardColor(uint8_t a, uint8_t r, uint8_t g, uint8_t b); /** Get position of keyboard @return Position as a value between 0 and 1 (0% and 100%) @@ -141,7 +126,6 @@ public: bool isInSlideAnimation() const; private: - argb keyboardColor = { 0, 0, 0, 0 }; int keyRadius = 0; float position; float targetPosition; @@ -187,9 +171,10 @@ private: @param key Key text @param padding Spacing to reserve around the key @param font Font to use for key character + @param background Background color for the keycap */ void drawKey(SDL_Surface *surface, std::vector<touchArea> &keyVector, int x, int y, - int width, int height, char *cap, const char *key, int padding, TTF_Font *font) const; + int width, int height, char *cap, const char *key, int padding, TTF_Font *font, argb background) const; /** Prepare new keyboard @param layer Keyboard layer to use diff --git a/src/main.cpp b/src/main.cpp index 73673dafed2aff120d16e2d1d8e992443592dd9e..97c85b5c8b87fc877893d98083e7fcb43146abf5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -141,7 +141,6 @@ int main(int argc, char **args) // Initialize virtual keyboard Keyboard keyboard(0, 1, WIDTH, keyboardHeight, &config); - keyboard.setKeyboardColor(0, 30, 30, 30); if (keyboard.init(renderer)) { SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "Failed to initialize keyboard!"); atexit(SDL_Quit); @@ -175,17 +174,8 @@ int main(int argc, char **args) inputHeight / 1.5, inputBoxRadius); inputBoxRadius = 0; } - argb wallpaperColor {}; - wallpaperColor.a = 255; - if (sscanf(config.wallpaper.c_str(), "#%02hhx%02hhx%02hhx", &wallpaperColor.r, &wallpaperColor.g, - &wallpaperColor.b) - != 3) { - SDL_LogWarn(SDL_LOG_CATEGORY_ERROR, "Could not parse color code %s", config.wallpaper.c_str()); - //to avoid akward colors just remove the radius - inputBoxRadius = 0; - } - argb inputBoxColor = argb { 255, 30, 30, 30 }; + argb inputBoxColor = config.inputBoxBackground; SDL_Surface *inputBox = make_input_box(static_cast<int>(WIDTH * 0.9), inputHeight, &inputBoxColor, inputBoxRadius); SDL_Texture *inputBoxTexture = SDL_CreateTextureFromSurface(renderer, inputBox); diff --git a/src/tooltip.cpp b/src/tooltip.cpp index cfdd18490258211330e4393d0280f511da8df9e0..c1ae57770bd9312b381ba6d74dd0471c44c846f7 100644 --- a/src/tooltip.cpp +++ b/src/tooltip.cpp @@ -51,7 +51,7 @@ int Tooltip::init(SDL_Renderer *renderer, const std::string &text) } SDL_FillRect(surface, nullptr, SDL_MapRGB(surface->format, 30, 30, 30)); - TTF_Font *font = TTF_OpenFont(config->keyboardFont.c_str(), 24); + TTF_Font *font = TTF_OpenFont(config->keyboardFont.c_str(), config->keyboardFontSize); SDL_Surface *textSurface; SDL_Color textColor = { 255, 255, 255, 0 }; textSurface = TTF_RenderText_Blended(font, text.c_str(), textColor); diff --git a/src/util.cpp b/src/util.cpp index df5fc7faa7474dff4fea19e7a4c5c452ed1d7fbb..16bef652a4a657ae73d8ac2ee06947ef08d6e37b 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -98,19 +98,7 @@ SDL_Surface *make_wallpaper(Config *config, int width, int height) #endif surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32, rmask, gmask, bmask, amask); - - if (config->wallpaper[0] == '#') { - unsigned char r, g, b; - if (sscanf(config->wallpaper.c_str(), "#%02hhx%02hhx%02hhx", &r, &g, &b) != 3) { - SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Could not parse color code %s", config->wallpaper.c_str()); - exit(EXIT_FAILURE); - } - SDL_FillRect(surface, nullptr, SDL_MapRGB(surface->format, r, g, b)); - } else { - // Implement image loading - SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Image loading not supported yet"); - exit(EXIT_FAILURE); - } + SDL_FillRect(surface, nullptr, SDL_MapRGB(surface->format, config->wallpaper.r, config->wallpaper.g, config->wallpaper.b)); return surface; }