diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ad0e2fb..2b8da2f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,7 +73,7 @@ set(SRCS src/common/logo.c src/common/format.c src/common/parsing.c - src/common/gsettings.c + src/common/settings.c src/common/detectPlasma.c src/common/detectGTK.c src/common/detectWMDE.c diff --git a/src/common/detectGTK.c b/src/common/detectGTK.c index d843dff8..93b3a8e6 100644 --- a/src/common/detectGTK.c +++ b/src/common/detectGTK.c @@ -51,9 +51,9 @@ static void parseGTKDConfSettings(FFinstance* instance, FFGTKResult* result) init = true; - themeName = ffGSettingsGetValue(instance, "org.gnome.desktop.interface", "gtk-theme"); - iconsName = ffGSettingsGetValue(instance, "org.gnome.desktop.interface", "icon-theme"); - fontName = ffGSettingsGetValue(instance, "org.gnome.desktop.interface", "font-name"); + themeName = ffSettingsGet(instance, "/org/gnome/desktop/interface/gtk-theme", "org.gnome.desktop.interface", "gtk-theme"); + iconsName = ffSettingsGet(instance, "/org/gnome/desktop/interface/icon-theme", "org.gnome.desktop.interface", "icon-theme"); + fontName = ffSettingsGet(instance, "/org/gnome/desktop/interface/font-name", "org.gnome.desktop.interface", "font-name"); pthread_mutex_unlock(&mutex); applyGTKDConfSettings(result, themeName, iconsName, fontName); diff --git a/src/common/gsettings.c b/src/common/gsettings.c deleted file mode 100644 index 57a5480d..00000000 --- a/src/common/gsettings.c +++ /dev/null @@ -1,209 +0,0 @@ -#include "fastfetch.h" - -#include -#include -#include -#include - -typedef struct DConfData -{ - void* library; - GVariant*(*ffdconf_client_read_full)(DConfClient*, const gchar*, DConfReadFlags, const GQueue*); - const gchar*(*ffg_variant_get_string)(GVariant*, gsize*); - DConfClient* client; -} DConfData; - -typedef struct GSettingsData -{ - void* library; - GSettingsSchemaSource* schemaSource; - GSettingsSchema*(*ffg_settings_schema_source_lookup)(GSettingsSchemaSource*, const gchar*, gboolean); - gboolean(*ffg_settings_schema_has_key)(GSettingsSchema*, const gchar*); - GSettings*(*ffg_settings_new_full)(GSettingsSchema*, GSettingsBackend*, const gchar*); - GVariant*(*ffg_settings_get_value)(GSettings*, const gchar*); - GVariant*(*ffg_settings_get_user_value)(GSettings*, const gchar*); - GVariant*(*ffg_settings_get_default_value)(GSettings*, const gchar*); - const gchar*(*ffg_variant_get_string)(GVariant*, gsize*); -} GSettingsData; - -static int transformGSettingsToDConf(int c) -{ - return c == '.' ? '/' : c; -} - -static const char* getDConfValue(DConfData* data, const char* schemaName, const char* path, const char* key) -{ - if(data->client == NULL) - return NULL; - - FFstrbuf dconfStyleKey; - ffStrbufInitA(&dconfStyleKey, 64); - ffStrbufAppendC(&dconfStyleKey, '/'); - ffStrbufAppendTransformS(&dconfStyleKey, schemaName, transformGSettingsToDConf); - - if(path != NULL && *path != '/') - ffStrbufAppendC(&dconfStyleKey, '/'); - - ffStrbufAppendTransformS(&dconfStyleKey, path, transformGSettingsToDConf); - - if(dconfStyleKey.chars[dconfStyleKey.length - 1] != '/') - ffStrbufAppendC(&dconfStyleKey, '/'); - - ffStrbufAppendS(&dconfStyleKey, key); - - GVariant* variant = data->ffdconf_client_read_full(data->client, dconfStyleKey.chars, DCONF_READ_FLAGS_NONE, NULL); - - if(variant == NULL) - variant = data->ffdconf_client_read_full(data->client, dconfStyleKey.chars, DCONF_READ_USER_VALUE, NULL); - - if(variant == NULL) - variant = data->ffdconf_client_read_full(data->client, dconfStyleKey.chars, DCONF_READ_DEFAULT_VALUE, NULL); - - ffStrbufDestroy(&dconfStyleKey); - - if(variant != NULL) - return data->ffg_variant_get_string(variant, NULL); - - return NULL; -} - -static const char* dconfGetValue(FFinstance* instance, const char* schemaName, const char* path, const char* key) -{ - static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - static bool init = false; - - static DConfData data; - - pthread_mutex_lock(&mutex); - - if(init) - { - pthread_mutex_unlock(&mutex); - return getDConfValue(&data, schemaName, path, key); - } - - init = true; - - data.client = NULL; //error indicator - - data.library = dlopen(instance->config.libDConf.chars == NULL ? "libdconf.so" : instance->config.libDConf.chars, RTLD_LAZY); - if(data.library == NULL) - { - pthread_mutex_unlock(&mutex); - return NULL; - } - - data.ffdconf_client_read_full = dlsym(data.library, "dconf_client_read_full"); - data.ffg_variant_get_string = dlsym(data.library, "g_variant_get_string"); - - DConfClient*(*ffdconf_client_new)(void) = dlsym(data.library, "dconf_client_new"); - - if( - data.ffdconf_client_read_full == NULL || - data.ffg_variant_get_string == NULL || - (data.client = ffdconf_client_new()) == NULL - ) { - pthread_mutex_unlock(&mutex); - dlclose(data.library); - return NULL; - } - - pthread_mutex_unlock(&mutex); - return getDConfValue(&data, schemaName, path, key); -} - -static const char* getGSettingsValue(FFinstance* instance, GSettingsData* data, const char* schemaName, const char* path, const char* key) -{ - if(data->schemaSource == NULL) - return dconfGetValue(instance, schemaName, path, key); - - GSettingsSchema* schema = data->ffg_settings_schema_source_lookup(data->schemaSource, schemaName, true); - if(schema == NULL) - return dconfGetValue(instance, schemaName, path, key); - - if(data->ffg_settings_schema_has_key(schema, key) == 0) - return dconfGetValue(instance, schemaName, path, key); - - GSettings* settings = data->ffg_settings_new_full(schema, NULL, path); - if(settings == NULL) - return dconfGetValue(instance, schemaName, path, key); - - GVariant* variant = data->ffg_settings_get_value(settings, key); - - if(variant == NULL) - variant = data->ffg_settings_get_user_value(settings, key); - - if(variant == NULL) - variant = data->ffg_settings_get_default_value(settings, key); - - if(variant == NULL) - return dconfGetValue(instance, schemaName, path, key); - - const char* value = data->ffg_variant_get_string(variant, NULL); - - if(value == NULL || *value == '\0') - return dconfGetValue(instance, schemaName, path, key); - - return value; -} - -const char* ffGSettingsGetValuePath(FFinstance* instance, const char* schemaName, const char* path, const char* key) -{ - static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - static bool init = false; - - static GSettingsData data; - - pthread_mutex_lock(&mutex); - - if(init) - { - pthread_mutex_unlock(&mutex); - return getGSettingsValue(instance, &data, schemaName, path, key); - } - - init = true; - - data.schemaSource = NULL; //error indicator - - data.library = dlopen(instance->config.libGIO.length == 0 ? "libgio-2.0.so" : instance->config.libGIO.chars, RTLD_LAZY); - if(data.library == NULL) - { - pthread_mutex_unlock(&mutex); - return NULL; - } - - data.ffg_settings_schema_source_lookup = dlsym(data.library, "g_settings_schema_source_lookup"); - data.ffg_settings_schema_has_key = dlsym(data.library, "g_settings_schema_has_key"); - data.ffg_settings_new_full = dlsym(data.library, "g_settings_new_full"); - data.ffg_settings_get_value = dlsym(data.library, "g_settings_get_value"); - data.ffg_settings_get_user_value = dlsym(data.library, "g_settings_get_user_value"); - data.ffg_settings_get_default_value = dlsym(data.library, "g_settings_get_default_value"); - data.ffg_variant_get_string = dlsym(data.library, "g_variant_get_string"); - - GSettingsSchemaSource*(*ffg_settings_schema_source_get_default)(void) = dlsym(data.library, "g_settings_schema_source_get_default"); - - if( - data.ffg_settings_schema_source_lookup == NULL || - data.ffg_settings_schema_has_key == NULL || - data.ffg_settings_new_full == NULL || - data.ffg_settings_get_value == NULL || - data.ffg_settings_get_user_value == NULL || - data.ffg_settings_get_default_value == NULL || - data.ffg_variant_get_string == NULL || - ffg_settings_schema_source_get_default == NULL || - (data.schemaSource = ffg_settings_schema_source_get_default()) == NULL - ) { - pthread_mutex_unlock(&mutex); - dlclose(data.library); - return NULL; - } - - pthread_mutex_unlock(&mutex); - return getGSettingsValue(instance, &data, schemaName, path, key); -} - -const char* ffGSettingsGetValue(FFinstance* instance, const char* schemaName, const char* key) -{ - return ffGSettingsGetValuePath(instance, schemaName, NULL, key); -} diff --git a/src/common/settings.c b/src/common/settings.c new file mode 100644 index 00000000..d516fb2d --- /dev/null +++ b/src/common/settings.c @@ -0,0 +1,194 @@ +#include "fastfetch.h" + +#include +#include +#include +#include + +typedef struct DConfData +{ + GVariant*(*ffdconf_client_read_full)(DConfClient*, const gchar*, DConfReadFlags, const GQueue*); + const gchar*(*ffg_variant_get_string)(GVariant*, gsize*); + DConfClient* client; +} DConfData; + +static const char* getDConfValue(DConfData* data, const char* key) +{ + if(data->client == NULL) + return NULL; + + GVariant* variant = data->ffdconf_client_read_full(data->client, key, DCONF_READ_FLAGS_NONE, NULL); + + if(variant == NULL) + variant = data->ffdconf_client_read_full(data->client, key, DCONF_READ_USER_VALUE, NULL); + + if(variant == NULL) + variant = data->ffdconf_client_read_full(data->client, key, DCONF_READ_DEFAULT_VALUE, NULL); + + if(variant == NULL) + return NULL; + + return data->ffg_variant_get_string(variant, NULL); +} + +const char* ffSettingsGetDConf(FFinstance* instance, const char* key) +{ + static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + static bool init = false; + + static DConfData data; + + pthread_mutex_lock(&mutex); + + if(init) + { + pthread_mutex_unlock(&mutex); + return getDConfValue(&data, key); + } + + init = true; + + data.client = NULL; //error indicator + + void* library = dlopen(instance->config.libDConf.chars == NULL ? "libdconf.so" : instance->config.libDConf.chars, RTLD_LAZY); + if(library == NULL) + { + pthread_mutex_unlock(&mutex); + return NULL; + } + + data.ffdconf_client_read_full = dlsym(library, "dconf_client_read_full"); + data.ffg_variant_get_string = dlsym(library, "g_variant_get_string"); + + DConfClient*(*ffdconf_client_new)(void) = dlsym(library, "dconf_client_new"); + + if( + data.ffdconf_client_read_full == NULL || + data.ffg_variant_get_string == NULL || + (data.client = ffdconf_client_new()) == NULL + ) { + pthread_mutex_unlock(&mutex); + dlclose(library); + return NULL; + } + + pthread_mutex_unlock(&mutex); + return getDConfValue(&data, key); +} + +typedef struct GSettingsData +{ + GSettingsSchemaSource* schemaSource; + GSettingsSchema*(*ffg_settings_schema_source_lookup)(GSettingsSchemaSource*, const gchar*, gboolean); + gboolean(*ffg_settings_schema_has_key)(GSettingsSchema*, const gchar*); + GSettings*(*ffg_settings_new_full)(GSettingsSchema*, GSettingsBackend*, const gchar*); + GVariant*(*ffg_settings_get_value)(GSettings*, const gchar*); + GVariant*(*ffg_settings_get_user_value)(GSettings*, const gchar*); + GVariant*(*ffg_settings_get_default_value)(GSettings*, const gchar*); + const gchar*(*ffg_variant_get_string)(GVariant*, gsize*); +} GSettingsData; + +static const char* getGSettingsValue(GSettingsData* data, const char* schemaName, const char* path, const char* key) +{ + if(data->schemaSource == NULL) + return NULL; + + GSettingsSchema* schema = data->ffg_settings_schema_source_lookup(data->schemaSource, schemaName, true); + if(schema == NULL) + return NULL; + + if(data->ffg_settings_schema_has_key(schema, key) == 0) + return NULL; + + GSettings* settings = data->ffg_settings_new_full(schema, NULL, path); + if(settings == NULL) + return NULL; + + GVariant* variant = data->ffg_settings_get_value(settings, key); + + if(variant == NULL) + variant = data->ffg_settings_get_user_value(settings, key); + + if(variant == NULL) + variant = data->ffg_settings_get_default_value(settings, key); + + if(variant == NULL) + return NULL; + + return data->ffg_variant_get_string(variant, NULL); +} + +const char* ffSettingsGetGsettingsPath(FFinstance* instance, const char* schemaName, const char* path, const char* key) +{ + static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; + static bool init = false; + + static GSettingsData data; + + pthread_mutex_lock(&mutex); + + if(init) + { + pthread_mutex_unlock(&mutex); + return getGSettingsValue(&data, schemaName, path, key); + } + + init = true; + + data.schemaSource = NULL; //error indicator + + void* library = dlopen(instance->config.libGIO.length == 0 ? "libgio-2.0.so" : instance->config.libGIO.chars, RTLD_LAZY); + if(library == NULL) + { + pthread_mutex_unlock(&mutex); + return NULL; + } + + data.ffg_settings_schema_source_lookup = dlsym(library, "g_settings_schema_source_lookup"); + data.ffg_settings_schema_has_key = dlsym(library, "g_settings_schema_has_key"); + data.ffg_settings_new_full = dlsym(library, "g_settings_new_full"); + data.ffg_settings_get_value = dlsym(library, "g_settings_get_value"); + data.ffg_settings_get_user_value = dlsym(library, "g_settings_get_user_value"); + data.ffg_settings_get_default_value = dlsym(library, "g_settings_get_default_value"); + data.ffg_variant_get_string = dlsym(library, "g_variant_get_string"); + + GSettingsSchemaSource*(*ffg_settings_schema_source_get_default)(void) = dlsym(library, "g_settings_schema_source_get_default"); + + if( + data.ffg_settings_schema_source_lookup == NULL || + data.ffg_settings_schema_has_key == NULL || + data.ffg_settings_new_full == NULL || + data.ffg_settings_get_value == NULL || + data.ffg_settings_get_user_value == NULL || + data.ffg_settings_get_default_value == NULL || + data.ffg_variant_get_string == NULL || + ffg_settings_schema_source_get_default == NULL || + (data.schemaSource = ffg_settings_schema_source_get_default()) == NULL + ) { + pthread_mutex_unlock(&mutex); + dlclose(library); + return NULL; + } + + pthread_mutex_unlock(&mutex); + return getGSettingsValue(&data, schemaName, path, key); +} + +const char* ffSettingsGetGSettings(FFinstance* instance, const char* schemaName, const char* key) +{ + return ffSettingsGetGsettingsPath(instance, schemaName, NULL, key); +} + +const char* ffSettingsGetPath(FFinstance* instance, const char* dconfKey, const char* gsettingsSchemaName, const char* gsettingsPath, const char* gsettingsKey) +{ + const char* dconf = ffSettingsGetDConf(instance, dconfKey); + if(dconf != NULL) + return dconf; + + return ffSettingsGetGsettingsPath(instance, gsettingsSchemaName, gsettingsPath, gsettingsKey); +} + +const char* ffSettingsGet(FFinstance* instance, const char* dconfKey, const char* gsettingsSchemaName, const char* gsettingsKey) +{ + return ffSettingsGetPath(instance, dconfKey, gsettingsSchemaName, NULL, gsettingsKey); +} diff --git a/src/fastfetch.h b/src/fastfetch.h index fc9cf42c..ab58e86c 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -248,9 +248,12 @@ 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/gsettings.c -const char* ffGSettingsGetValuePath(FFinstance* instance, const char* schemaName, const char* path, const char* key); -const char* ffGSettingsGetValue(FFinstance* instance, const char* schemaName, const char* key); +//common/settings.c +const char* ffSettingsGetDConf(FFinstance* instance, const char* key); +const char* ffSettingsGetGsettingsPath(FFinstance* instance, const char* schemaName, const char* path, const char* key); +const char* ffSettingsGetGSettings(FFinstance* instance, const char* schemaName, const char* key); +const char* ffSettingsGetPath(FFinstance* instance, const char* dconfKey, const char* gsettingsSchemaName, const char* gsettingsPath, const char* gsettingsKey); +const char* ffSettingsGet(FFinstance* instance, const char* dconfKey, const char* gsettingsSchemaName, const char* gsettingsKey); //common/detectPlasma.c const FFPlasmaResult* ffDetectPlasma(FFinstance* instance); diff --git a/src/modules/wmtheme.c b/src/modules/wmtheme.c index 25c3e7ee..3dd3bf3a 100644 --- a/src/modules/wmtheme.c +++ b/src/modules/wmtheme.c @@ -36,10 +36,10 @@ static void printKWin(FFinstance* instance) static void printMutter(FFinstance* instance) { - char const* theme = ffGSettingsGetValue(instance, "org.gnome.shell.extensions.user-theme", "name"); + const char* theme = ffSettingsGet(instance, "/org/gnome/shell/extensions/user-theme/name", "org.gnome.shell.extensions.user-theme", "name"); if(theme == NULL) - theme = ffGSettingsGetValue(instance, "org.gnome.desktop.wm.preferences", "theme"); + theme = ffSettingsGet(instance, "/org/gnome/desktop/wm/preferences/theme", "org.gnome.desktop.wm.preferences", "theme"); if(theme == NULL) {