From 6eddc6105f8f8fd6b9dfbe29b91759d7c95fa497 Mon Sep 17 00:00:00 2001 From: Linus Dierheimer Date: Sat, 1 May 2021 16:01:59 +0200 Subject: [PATCH] ffDconfGetValue --- CMakeLists.txt | 1 + src/common/dconf.c | 92 ++++++++++++++++++++++++++++++++++++++++++ src/common/detectGTK.c | 80 +++++------------------------------- src/fastfetch.h | 3 ++ 4 files changed, 107 insertions(+), 69 deletions(-) create mode 100644 src/common/dconf.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e907db3..4914422a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,6 +65,7 @@ set(SRCS src/common/logo.c src/common/format.c src/common/parsing.c + src/common/dconf.c src/common/detectPlasma.c src/common/detectGTK.c src/common/detectWMDE.c diff --git a/src/common/dconf.c b/src/common/dconf.c new file mode 100644 index 00000000..0a7b08e3 --- /dev/null +++ b/src/common/dconf.c @@ -0,0 +1,92 @@ +#include "fastfetch.h" + +#include +#include +#include + +typedef struct DConfData +{ + void* library; + DConfClient*(*ffdconf_client_new)(void); + GVariant*(*ffdconf_client_read)(DConfClient*, const gchar*); + const gchar*(*ffg_variant_get_string)(GVariant*, gsize*); + DConfClient* dconfClient; +} DConfData; + +static inline const char* getDConfValue(DConfData* dconf, const char* key) +{ + if(dconf->dconfClient == NULL) + return NULL; + + GVariant* variant = dconf->ffdconf_client_read(dconf->dconfClient, key); + if(variant != NULL) + return dconf->ffg_variant_get_string(variant, NULL); + + return NULL; +} + +const char* ffDConfGetValue(FFinstance* instance, const char* key) +{ + static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + static bool init = false; + + static DConfData dconf; + + pthread_mutex_lock(&mutex); + + if(init) + { + pthread_mutex_unlock(&mutex); + return getDConfValue(&dconf, key); + } + + init = true; + + dconf.dconfClient = NULL; //error indicator + + if(instance->config.libDConf.length == 0) + dconf.library = dlopen("libdconf.so", RTLD_LAZY); + else + dconf.library = dlopen(instance->config.libDConf.chars, RTLD_LAZY); + + if(dconf.library == NULL) + { + pthread_mutex_unlock(&mutex); + return NULL; + } + + dconf.ffdconf_client_new = dlsym(dconf.library, "dconf_client_new"); + if(dconf.ffdconf_client_new == NULL) + { + pthread_mutex_unlock(&mutex); + dlclose(dconf.library); + return NULL; + } + + dconf.ffg_variant_get_string = dlsym(dconf.library, "g_variant_get_string"); + if(dconf.ffg_variant_get_string == NULL) + { + pthread_mutex_unlock(&mutex); + dlclose(dconf.library); + return NULL; + } + + GVariant*(*ffdconf_client_read)(DConfClient*, const gchar*) = dlsym(dconf.library, "dconf_client_read"); + if(ffdconf_client_read == NULL) + { + pthread_mutex_unlock(&mutex); + dlclose(dconf.library); + return NULL; + } + + DConfClient* dconfClient = dconf.ffdconf_client_new(); + if(dconfClient == NULL) + { + pthread_mutex_unlock(&mutex); + dlclose(dconf.library); + return NULL; + } + + pthread_mutex_unlock(&mutex); + return getDConfValue(&dconf, key); +} diff --git a/src/common/detectGTK.c b/src/common/detectGTK.c index aebad380..0cc207a3 100644 --- a/src/common/detectGTK.c +++ b/src/common/detectGTK.c @@ -2,7 +2,6 @@ #include #include -#include static inline bool allPropertiesSet(FFGTKResult* result) { @@ -19,7 +18,7 @@ static inline void initresult(FFGTKResult* result) ffStrbufInit(&result->font); } -static inline void applyGTKDConfSettings(FFGTKResult* result, const gchar* themeName, const gchar* iconsName, const gchar* fontName) +static inline void applyGTKDConfSettings(FFGTKResult* result, const char* themeName, const char* iconsName, const char* fontName) { if(result->theme.length == 0) ffStrbufAppendS(&result->theme, themeName); @@ -35,9 +34,9 @@ static void parseGTKDConfSettings(FFinstance* instance, FFGTKResult* result) { static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - static const gchar* themeName; - static const gchar* iconsName; - static const gchar* fontName; + static const char* themeName; + static const char* iconsName; + static const char* fontName; static bool init = false; @@ -45,75 +44,18 @@ static void parseGTKDConfSettings(FFinstance* instance, FFGTKResult* result) if(init) { - applyGTKDConfSettings(result, themeName, iconsName, fontName); pthread_mutex_unlock(&mutex); + applyGTKDConfSettings(result, themeName, iconsName, fontName); return; } + init = true; - themeName = NULL; - iconsName = NULL; - fontName = NULL; - - void* dconf; - if(instance->config.libDConf.length == 0) - dconf = dlopen("libdconf.so", RTLD_LAZY); - else - dconf = dlopen(instance->config.libDConf.chars, RTLD_LAZY); - - if(dconf == NULL) - { - pthread_mutex_unlock(&mutex); - return; - } - - DConfClient*(*ffdconf_client_new)(void) = dlsym(dconf, "dconf_client_new"); - if(ffdconf_client_new == NULL) - { - pthread_mutex_unlock(&mutex); - dlclose(dconf); - return; - } - - const gchar*(*ffg_variant_get_string)(GVariant*, gsize*) = dlsym(dconf, "g_variant_get_string"); - if(ffg_variant_get_string == NULL) - { - pthread_mutex_unlock(&mutex); - dlclose(dconf); - return; - } - - GVariant*(*ffdconf_client_read)(DConfClient*, const gchar*) = dlsym(dconf, "dconf_client_read"); - if(ffdconf_client_read == NULL) - { - pthread_mutex_unlock(&mutex); - dlclose(dconf); - return; - } - - DConfClient* dconfClient = ffdconf_client_new(); - if(dconfClient == NULL) - { - pthread_mutex_unlock(&mutex); - dlclose(dconf); - return; - } - - GVariant* themeNameVariant = ffdconf_client_read(dconfClient, "/org/gnome/desktop/interface/gtk-theme"); - if(themeNameVariant != NULL) - themeName = ffg_variant_get_string(themeNameVariant, NULL); - - GVariant* fontNameVariant = ffdconf_client_read(dconfClient, "/org/gnome/desktop/interface/font-name"); - if(fontNameVariant != NULL) - fontName = ffg_variant_get_string(fontNameVariant, NULL); - - GVariant* iconsNameVariant = ffdconf_client_read(dconfClient, "/org/gnome/desktop/interface/icon-theme"); - if(iconsNameVariant != NULL) - iconsName = ffg_variant_get_string(iconsNameVariant, NULL); + themeName = ffDConfGetValue(instance, "/org/gnome/desktop/interface/gtk-theme"); + iconsName = ffDConfGetValue(instance, "/org/gnome/desktop/interface/font-name"); + fontName = ffDConfGetValue(instance, "/org/gnome/desktop/interface/icon-theme"); pthread_mutex_unlock(&mutex); - - dlclose(dconf); applyGTKDConfSettings(result, themeName, iconsName, fontName); } @@ -223,10 +165,10 @@ static void detectGTK(FFinstance* instance, const char* version, FFGTKResult* re { ffStrbufInitA(&configDir, 64); ffStrbufAppendS(&configDir, instance->state.passwd->pw_dir); - ffStrbufAppendS(&configDir, "/.config"); + ffStrbufAppendS(&configDir, "/.confisg"); ffStrbufInitA(&xdgConfigDir, 64); - ffStrbufAppendS(&xdgConfigDir, getenv("XDG_CONFIG_HOME")); + ffStrbufAppendS(&xdgConfigDir, getenv("XDG_CONFIG_HOMEs")); ffStrbufTrimRight(&xdgConfigDir, '/'); xdgIsDifferent = ffStrbufComp(&configDir, &xdgConfigDir) != 0; diff --git a/src/fastfetch.h b/src/fastfetch.h index 9945dd51..30d1c8d0 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -247,6 +247,9 @@ void ffGetGtkPretty(FFstrbuf* buffer, const FFstrbuf* gtk2, const FFstrbuf* gtk3 void ffGetFont(const char* font, FFstrbuf* name, double* size); void ffGetFontPretty(FFstrbuf* buffer, const FFstrbuf* name, double size); +//common/dconf.c +const char* ffDConfGetValue(FFinstance* instance, const char* key); + //common/detectPlasma.c const FFPlasmaResult* ffDetectPlasma(FFinstance* instance);