Mercurial > minori
comparison src/sys/glib/dark_theme.cc @ 351:c844f8bb87ce
gui/theme: add xsettings backend
this also adds newly-necessary endianness methods in core/endian.h
which just so happen to be constexpr as well
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Sun, 14 Jul 2024 23:23:56 -0400 |
parents | daa03aa2262d |
children | 99c961c91809 |
comparison
equal
deleted
inserted
replaced
350:daa03aa2262d | 351:c844f8bb87ce |
---|---|
3 #include <cstring> | 3 #include <cstring> |
4 #include <gio/gio.h> | 4 #include <gio/gio.h> |
5 #include <string_view> | 5 #include <string_view> |
6 #include <memory> | 6 #include <memory> |
7 #include <array> | 7 #include <array> |
8 #include <iostream> | |
8 | 9 |
9 namespace glib { | 10 namespace glib { |
10 | 11 |
11 /* deleters */ | 12 /* deleters */ |
12 template<typename T> | 13 template<typename T> |
31 using GVariantPtr = std::unique_ptr<T, g_variant_del<T>>; | 32 using GVariantPtr = std::unique_ptr<T, g_variant_del<T>>; |
32 | 33 |
33 template<typename T> | 34 template<typename T> |
34 using GMallocPtr = std::unique_ptr<T, g_malloc_del<T>>; | 35 using GMallocPtr = std::unique_ptr<T, g_malloc_del<T>>; |
35 | 36 |
37 /* not really "glib" but GNOME-related enough */ | |
38 bool IsGTKThemeDark(const std::string_view str) { | |
39 /* if that doesn't exist, use the GTK theme and check for some known | |
40 * suffixes. if one is found, return | |
41 * | |
42 * XXX probably better to use case folding here */ | |
43 static constexpr std::array<std::string_view, 3> suffixes = { | |
44 "-dark", /* Adwaita-dark */ | |
45 "-Dark", /* Arc-Dark */ | |
46 "-Darker", /* Arc-Darker */ | |
47 }; | |
48 | |
49 for (const auto& suffix : suffixes) { | |
50 if (str.size() < suffix.size()) | |
51 continue; | |
52 | |
53 if (std::equal(str.data() + str.size() - suffix.length(), str.data() + str.size(), suffix.begin(), suffix.end())) | |
54 return true; | |
55 } | |
56 | |
57 return false; | |
58 } | |
59 | |
36 bool IsInDarkTheme() { | 60 bool IsInDarkTheme() { |
37 GObjectPtr<GSettings> settings(::g_settings_new("org.gnome.desktop.interface")); | 61 GObjectPtr<GSettings> settings(::g_settings_new("org.gnome.desktop.interface")); |
38 if (!settings) | 62 if (!settings) |
39 return false; | 63 return false; |
40 | 64 |
48 gsize size; | 72 gsize size; |
49 const gchar* str = ::g_variant_get_string(val.get(), &size); | 73 const gchar* str = ::g_variant_get_string(val.get(), &size); |
50 if (!str) | 74 if (!str) |
51 return false; | 75 return false; |
52 | 76 |
53 bool success = !std::strncmp(str, size, "prefer-dark"); | 77 bool success = !std::strncmp(str, "prefer-dark", size); |
54 | 78 |
55 if (success) | 79 if (success) |
56 return true; | 80 return true; |
57 } | 81 } |
58 | 82 |
59 { | 83 { |
60 /* if that doesn't exist, use the GTK theme and check for some known | |
61 * suffixes. if one is found, return | |
62 * | |
63 * XXX probably better to use case folding here */ | |
64 static constexpr std::array<std::string_view, 3> suffixes = { | |
65 "-dark", /* Adwaita-dark */ | |
66 "-Dark", /* Arc-Dark */ | |
67 "-Darker", /* Arc-Darker */ | |
68 }; | |
69 | 84 |
70 GVariantPtr<GVariant> gtk_theme(::g_settings_get_value(settings.get(), "gtk-theme")); | 85 GVariantPtr<GVariant> gtk_theme(::g_settings_get_value(settings.get(), "gtk-theme")); |
71 if (!gtk_theme) | 86 if (!gtk_theme) |
72 return false; | 87 return false; |
73 | 88 |
74 gsize size; | 89 gsize size; |
75 const gchar* str = ::g_variant_get_string(gtk_theme.get(), &size); | 90 const gchar* str = ::g_variant_get_string(gtk_theme.get(), &size); |
76 if (!str) | 91 if (!str) |
77 return false; | 92 return false; |
78 | 93 |
79 for (const auto& suffix : suffixes) { | 94 if (IsGTKThemeDark({str, size})) |
80 if (size < suffix.size()) | 95 return true; |
81 continue; | |
82 | |
83 if (std::equal(str + size - suffix.length(), str + size, suffix.begin(), suffix.end())) | |
84 return true; | |
85 } | |
86 } | 96 } |
87 | 97 |
88 /* welp, we tried */ | 98 /* welp, we tried */ |
89 return false; | 99 return false; |
90 } | 100 } |