view src/sys/glib/dark_theme.cc @ 347:a0aa8c8c4307

dep/anitomy: port to use UCS-4 rather than wide strings rationale: wide strings are not the same on every platform, and might not even be Unicode. (while they usually are, its possible that they are not) I was *going* to change StringToInt to use a string stream, but outputting to an integer doesn't seem to work at all with UCS-4, even though it ought to, so I just rolled my own that uses the arabic digits only.
author Paper <paper@paper.us.eu.org>
date Sun, 23 Jun 2024 10:32:09 -0400
parents ac1451035c85
children daa03aa2262d
line wrap: on
line source

#include <cstring>
#include <gio/gio.h>
#include <string_view>

/* this file uses the regular gio C interface because I don't
 * see any real benefit to using the C++ bindings. */

namespace glib {

bool IsInDarkTheme() {
	GSettings* settings = ::g_settings_new("org.gnome.desktop.interface");
	if (!settings)
		return false;

	{
		GVariant* val = ::g_settings_get_value(settings, "color-scheme");
		if (!val) {
			::g_object_unref(settings);
			return false;
		}

		const gchar* str = nullptr;
		::g_variant_get(val, "&s", &str); /* should not be freed */
		if (!str) {                       /* how */
			::g_variant_unref(val);
			::g_object_unref(settings);
			return false;
		}

		bool success = !std::strcmp(str, "prefer-dark");

		::g_variant_unref(val);

		if (success)
			return true;
	}

	{
		GVariant* gtk_theme = ::g_settings_get_value(settings, "gtk-theme");
		if (!gtk_theme) {
			::g_object_unref(settings);
			return false;
		}

		const gchar* gtk_theme_str = nullptr;
		::g_variant_get(gtk_theme, "&s", gtk_theme_str);
		if (!gtk_theme_str) {
			::g_variant_unref(gtk_theme);
			::g_object_unref(settings);
			return false;
		}

		static constexpr std::string_view suffix = "-dark";

		size_t gtk_theme_len = strlen(gtk_theme_str);

		if (gtk_theme_len < suffix.length()) {
			::g_variant_unref(gtk_theme);
			::g_object_unref(settings);
			return false;
		}

		bool success = !std::strncmp(gtk_theme_str + gtk_theme_len - suffix.length(), suffix.data(), suffix.length());

		::g_variant_unref(gtk_theme);
		::g_object_unref(settings);

		if (success)
			return true;
	}

	return false;
}

} // namespace glib