aboutsummaryrefslogtreecommitdiff
path: root/src/Config.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Config.cpp')
-rw-r--r--src/Config.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/Config.cpp b/src/Config.cpp
new file mode 100644
index 0000000..03be824
--- /dev/null
+++ b/src/Config.cpp
@@ -0,0 +1,142 @@
+#include "../include/Config.hpp"
+#include "../include/Storage.hpp"
+#include <assert.h>
+
+namespace QuickMedia {
+ static bool config_initialized = false;
+ static Config config;
+
+ static float scale = 1.0f;
+ static bool scale_set = false;
+
+ static const int XFT_DPI_DEFAULT = 96;
+ // Returns 96 on error
+ static int xrdb_get_dpi() {
+ int xft_dpi = XFT_DPI_DEFAULT;
+
+ FILE *xrdb_query = popen("xrdb -query", "r");
+ if(!xrdb_query)
+ return xft_dpi;
+
+ char line[512];
+ while(fgets(line, sizeof(line), xrdb_query)) {
+ int line_length = strlen(line);
+ if(line_length > 0 && line[line_length - 1] == '\n') {
+ line[line_length - 1] = '\0';
+ line_length--;
+ }
+
+ if(line_length > 8 && memcmp(line, "Xft.dpi:", 8) == 0) {
+ int xft_dpi_file = atoi(line + 8);
+ if(xft_dpi_file > 0) {
+ xft_dpi = xft_dpi_file;
+ break;
+ }
+ }
+ }
+
+ pclose(xrdb_query);
+ return xft_dpi;
+ }
+
+ static float get_ui_scale() {
+ if(scale_set)
+ return scale;
+
+ char *gdk_scale = getenv("GDK_SCALE");
+ if(gdk_scale) {
+ setlocale(LC_ALL, "C"); // Sigh... stupid C
+ scale = atof(gdk_scale);
+ if(scale < 0.0001f)
+ scale = 1.0f;
+ } else {
+ scale = (float)xrdb_get_dpi() / (float)XFT_DPI_DEFAULT;
+ }
+
+ scale_set = true;
+ return scale;
+ }
+
+ // No-op if this has already been called before
+ void init_config() {
+ if(config_initialized)
+ return;
+
+ config_initialized = true;
+ Path config_path = get_storage_dir().join("config.json");
+ Json::Value json_root;
+ if(!read_file_as_json(config_path, json_root))
+ return;
+
+ const Json::Value &search_json = json_root["search"];
+ if(search_json.isObject()) {
+ const Json::Value &font_size_json = search_json["font_size"];
+ if(font_size_json.isNumeric())
+ config.search.font_size = font_size_json.asDouble();
+ }
+
+ const Json::Value &tab_json = json_root["tab"];
+ if(tab_json.isObject()) {
+ const Json::Value &font_size_json = tab_json["font_size"];
+ if(font_size_json.isNumeric())
+ config.tab.font_size = font_size_json.asDouble();
+ }
+
+ const Json::Value &body_json = json_root["body"];
+ if(body_json.isObject()) {
+ const Json::Value &title_font_size = body_json["title_font_size"];
+ if(title_font_size.isNumeric())
+ config.body.title_font_size = title_font_size.asDouble();
+
+ const Json::Value &author_font_size = body_json["author_font_size"];
+ if(author_font_size.isNumeric())
+ config.body.author_font_size = author_font_size.asDouble();
+
+ const Json::Value &description_font_size = body_json["description_font_size"];
+ if(description_font_size.isNumeric())
+ config.body.description_font_size = description_font_size.asDouble();
+
+ const Json::Value &timestamp_font_size = body_json["timestamp_font_size"];
+ if(timestamp_font_size.isNumeric())
+ config.body.timestamp_font_size = timestamp_font_size.asDouble();
+
+ const Json::Value &reaction_font_size = body_json["reaction_font_size"];
+ if(reaction_font_size.isNumeric())
+ config.body.reaction_font_size = reaction_font_size.asDouble();
+
+ const Json::Value &embedded_load_font_size = body_json["embedded_load_font_size"];
+ if(embedded_load_font_size.isNumeric())
+ config.body.embedded_load_font_size = embedded_load_font_size.asDouble();
+ }
+
+ const Json::Value &input_json = json_root["input"];
+ if(input_json.isObject()) {
+ const Json::Value &font_size_json = input_json["font_size"];
+ if(font_size_json.isNumeric())
+ config.input.font_size = font_size_json.asDouble();
+ }
+
+ const Json::Value &use_system_fonts_json = json_root["use_system_fonts"];
+ if(use_system_fonts_json.isBool())
+ config.use_system_fonts = use_system_fonts_json.asBool();
+
+ const Json::Value &theme_json = json_root["theme"];
+ if(theme_json.isString())
+ config.theme = theme_json.asString();
+
+ const Json::Value &scale_json = json_root["scale"];
+ if(scale_json.isNumeric())
+ config.scale = scale_json.asDouble();
+ else
+ config.scale = get_ui_scale();
+
+ const Json::Value &font_scale = json_root["font_scale"];
+ if(font_scale.isNumeric())
+ config.font_scale = font_scale.asDouble();
+ }
+
+ const Config& get_config() {
+ init_config();
+ return config;
+ }
+} \ No newline at end of file