Add ability to change font sizes
This commit is contained in:
parent
2f28628bbe
commit
3cc2c379e4
78
config.cpp
78
config.cpp
|
@ -1,6 +1,8 @@
|
|||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <cmath>
|
||||
#include <cfloat>
|
||||
#include <sys/stat.h>
|
||||
#include <string>
|
||||
#include <memory>
|
||||
|
@ -32,6 +34,42 @@ static bool write(const char* ptr, FILE* file) {
|
|||
return fwrite(ptr, 1, strlen(ptr), file) == strlen(ptr);
|
||||
}
|
||||
|
||||
static inline float to_float(const char* str) {
|
||||
char* endptr;
|
||||
|
||||
while (isspace(str[0])) {
|
||||
str++;
|
||||
}
|
||||
if (str[0] == '\0') {
|
||||
throw std::invalid_argument("float string is empty");
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
float res = strtof(str, &endptr);
|
||||
if (res == HUGE_VALF && errno == ERANGE) {
|
||||
throw std::overflow_error(std::string(str) + " is bigger than HUGE_VALF");
|
||||
} else if (res == FLT_MIN && errno == ERANGE) {
|
||||
throw std::underflow_error(std::string(str) + " is smaller than FLT_MIN");
|
||||
} else if (endptr[0] != '\0') {
|
||||
throw std::invalid_argument(std::string(str) + " has trailing text");
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
static bool validate_font_size_or_log(float size) {
|
||||
if (size <= 0.0f) {
|
||||
log(std::string("Font size ") + std::to_string(size) + " is lower or equal to 0");
|
||||
return false;
|
||||
} else if (std::isnan(size)) {
|
||||
log(std::string("Font size ") + std::to_string(size) + " is NaN");
|
||||
return false;
|
||||
} else if (std::isinf(size)) {
|
||||
log(std::string("Font size ") + std::to_string(size) + " is infinity or negative infinity");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
std::string get_config_folder() {
|
||||
const char* path;
|
||||
|
@ -75,6 +113,24 @@ void create_config_folders_if_necessary() {
|
|||
}
|
||||
|
||||
|
||||
static inline void parse_config_line(Config& config, char* line) {
|
||||
if (strncmp(line, "logcat_command=", 15 * sizeof(char)) == 0) {
|
||||
config.logcat_command = &line[15];
|
||||
} else if (strncmp(line, "normal_font_size=", 17 * sizeof(char)) == 0) {
|
||||
float size = to_float(&line[17]);
|
||||
if (validate_font_size_or_log(size)) {
|
||||
config.normal_font_size = size;
|
||||
}
|
||||
} else if (strncmp(line, "monospace_font_size=", 20 * sizeof(char)) == 0) {
|
||||
float size = to_float(&line[20]);
|
||||
if (validate_font_size_or_log(size)) {
|
||||
config.monospace_font_size = size;
|
||||
}
|
||||
} else if (line[0] != '\0') {
|
||||
throw std::invalid_argument(std::string("unknown config line: ") + line);
|
||||
}
|
||||
}
|
||||
|
||||
static inline Config load_config(FILE* file) {
|
||||
size_t line_capacity_size = 128 * sizeof(char);
|
||||
char* line = static_cast<char*>(malloc(line_capacity_size));
|
||||
|
@ -103,12 +159,11 @@ static inline Config load_config(FILE* file) {
|
|||
*newline = '\0';
|
||||
}
|
||||
|
||||
if (strncmp(line, "logcat_command=", 15 * sizeof(char)) == 0) {
|
||||
config.logcat_command = &line[15];
|
||||
} else if (line[0] != '\0') {
|
||||
std::invalid_argument e = std::invalid_argument(std::string("unknown config line: ") + line);
|
||||
try {
|
||||
parse_config_line(config, line);
|
||||
} catch (const std::exception& e) {
|
||||
free(line);
|
||||
throw e;
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -141,6 +196,19 @@ static inline void write_config(FILE* file, const Config& config) {
|
|||
if (!write(config.logcat_command, file)) {
|
||||
throw std::runtime_error("Failed to write logcat command value");
|
||||
}
|
||||
|
||||
if (!write("\nnormal_font_size=", file)) {
|
||||
throw std::runtime_error("Failed to write normal font size key");
|
||||
}
|
||||
if (!write(std::to_string(config.normal_font_size), file)) {
|
||||
throw std::runtime_error("Failed to write normal font size value");
|
||||
}
|
||||
if (!write("\nmonospace_font_size=", file)) {
|
||||
throw std::runtime_error("Failed to write monospace font size key");
|
||||
}
|
||||
if (!write(std::to_string(config.monospace_font_size), file)) {
|
||||
throw std::runtime_error("Failed to write monospace font size value");
|
||||
}
|
||||
}
|
||||
|
||||
void write_config(const Config& config) {
|
||||
|
|
2
config.h
2
config.h
|
@ -4,6 +4,8 @@
|
|||
|
||||
struct Config {
|
||||
std::string logcat_command;
|
||||
float normal_font_size = 13.0f;
|
||||
float monospace_font_size = 13.0f;
|
||||
};
|
||||
|
||||
std::string get_config_folder();
|
||||
|
|
|
@ -24,6 +24,15 @@ static inline void settings_window(Config& config, float* config_write_timer, bo
|
|||
if (ImGui::InputTextWithHint("Logcat command", "adb logcat -Dv 'threadtime UTC epoch usec'", &config.logcat_command)) {
|
||||
*config_write_timer = *config_write_timer > 0.0f ? *config_write_timer : 5.0f;
|
||||
}
|
||||
ImGui::Text("Font sizes only take effect when LogMeow is restarted");
|
||||
#ifdef USE_FONTCONFIG
|
||||
if (ImGui::InputFloat("Normal font size", &config.normal_font_size, 0.5f, 1.0f, "%.3f")) {
|
||||
*config_write_timer = *config_write_timer > 0.0f ? *config_write_timer : 5.0f;
|
||||
}
|
||||
#endif
|
||||
if (ImGui::InputFloat("Monospace font size", &config.monospace_font_size, 0.5f, 1.0f, "%.3f")) {
|
||||
*config_write_timer = *config_write_timer > 0.0f ? *config_write_timer : 5.0f;
|
||||
}
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
|
|
14
main.cpp
14
main.cpp
|
@ -114,17 +114,17 @@ int main(int, char**) {
|
|||
#ifdef USE_FONTCONFIG
|
||||
try {
|
||||
std::pair<std::string, std::string> fonts = get_fonts();
|
||||
io.Fonts->AddFontFromFileTTF(fonts.first.c_str(), 16.0f);
|
||||
monospace_font = io.Fonts->AddFontFromFileTTF(fonts.second.c_str(), 15.0f);
|
||||
io.Fonts->AddFontFromFileTTF(fonts.first.c_str(), config.normal_font_size);
|
||||
monospace_font = io.Fonts->AddFontFromFileTTF(fonts.second.c_str(), config.monospace_font_size);
|
||||
} catch (const std::exception& e) {
|
||||
log("Failed to get fonts", e);
|
||||
}
|
||||
if (!monospace_font) {
|
||||
monospace_font = io.Fonts->AddFontDefault();
|
||||
}
|
||||
#else
|
||||
monospace_font = io.Fonts->AddFontDefault();
|
||||
#endif
|
||||
if (!monospace_font) {
|
||||
ImFontConfig font_config;
|
||||
font_config.SizePixels = config.monospace_font_size;
|
||||
monospace_font = io.Fonts->AddFontDefault(&font_config);
|
||||
}
|
||||
|
||||
// Main loop
|
||||
bool run_event_loop = true;
|
||||
|
|
Loading…
Reference in New Issue