comparison src/sys/glib/dark_theme.cc @ 379:5eaafed6c10b default tip

*: clang-format
author Paper <paper@tflc.us>
date Wed, 05 Nov 2025 12:59:46 -0500
parents 99c961c91809
children
comparison
equal deleted inserted replaced
378:5912dafc6e28 379:5eaafed6c10b
1 #include "sys/glib/dark_theme.h" 1 #include "sys/glib/dark_theme.h"
2 2
3 #include <array>
3 #include <cstring> 4 #include <cstring>
4 #include <gio/gio.h> 5 #include <gio/gio.h>
6 #include <memory>
5 #include <string_view> 7 #include <string_view>
6 #include <memory>
7 #include <array>
8 8
9 namespace glib { 9 namespace glib {
10 10
11 /* deleters */ 11 /* deleters */
12 template<typename T> 12 template<typename T>
13 struct g_object_del { 13 struct g_object_del {
14 void operator()(T* p) const { ::g_object_unref(p); }; 14 void operator()(T *p) const { ::g_object_unref(p); };
15 }; 15 };
16 16
17 template<typename T> 17 template<typename T>
18 struct g_variant_del { 18 struct g_variant_del {
19 void operator()(T* p) const { ::g_variant_unref(p); }; 19 void operator()(T *p) const { ::g_variant_unref(p); };
20 }; 20 };
21 21
22 template<typename T> 22 template<typename T>
23 struct g_malloc_del { 23 struct g_malloc_del {
24 void operator()(T* p) const { ::g_free(p); }; 24 void operator()(T *p) const { ::g_free(p); };
25 }; 25 };
26 26
27 template<typename T> 27 template<typename T>
28 using GObjectPtr = std::unique_ptr<T, g_object_del<T>>; 28 using GObjectPtr = std::unique_ptr<T, g_object_del<T>>;
29 29
32 32
33 template<typename T> 33 template<typename T>
34 using GMallocPtr = std::unique_ptr<T, g_malloc_del<T>>; 34 using GMallocPtr = std::unique_ptr<T, g_malloc_del<T>>;
35 35
36 /* not really "glib" but GNOME-related enough */ 36 /* not really "glib" but GNOME-related enough */
37 bool IsGTKThemeDark(const std::string_view str) { 37 bool IsGTKThemeDark(const std::string_view str)
38 {
38 /* if that doesn't exist, use the GTK theme and check for some known 39 /* if that doesn't exist, use the GTK theme and check for some known
39 * suffixes. if one is found, return 40 * suffixes. if one is found, return
40 * 41 *
41 * XXX probably better to use case folding here */ 42 * XXX probably better to use case folding here */
42 static constexpr std::array<std::string_view, 3> suffixes = { 43 static constexpr std::array<std::string_view, 3> suffixes = {
43 "-dark", /* Adwaita-dark */ 44 "-dark", /* Adwaita-dark */
44 "-Dark", /* Arc-Dark */ 45 "-Dark", /* Arc-Dark */
45 "-Darker", /* Arc-Darker */ 46 "-Darker", /* Arc-Darker */
46 }; 47 };
47 48
48 for (const auto& suffix : suffixes) { 49 for (const auto &suffix : suffixes) {
49 if (str.size() < suffix.size()) 50 if (str.size() < suffix.size())
50 continue; 51 continue;
51 52
52 if (std::equal(str.data() + str.size() - suffix.length(), str.data() + str.size(), suffix.begin(), suffix.end())) 53 if (std::equal(str.data() + str.size() - suffix.length(), str.data() + str.size(), suffix.begin(),
54 suffix.end()))
53 return true; 55 return true;
54 } 56 }
55 57
56 return false; 58 return false;
57 } 59 }
58 60
59 bool IsInDarkTheme() { 61 bool IsInDarkTheme()
62 {
60 GObjectPtr<GSettings> settings(::g_settings_new("org.gnome.desktop.interface")); 63 GObjectPtr<GSettings> settings(::g_settings_new("org.gnome.desktop.interface"));
61 if (!settings) 64 if (!settings)
62 return false; 65 return false;
63 66
64 { 67 {
67 if (!val) 70 if (!val)
68 return false; 71 return false;
69 72
70 /* this is free'd upon deconstruction of the GVariantPtr */ 73 /* this is free'd upon deconstruction of the GVariantPtr */
71 gsize size; 74 gsize size;
72 const gchar* str = ::g_variant_get_string(val.get(), &size); 75 const gchar *str = ::g_variant_get_string(val.get(), &size);
73 if (!str) 76 if (!str)
74 return false; 77 return false;
75 78
76 bool success = !std::strncmp(str, "prefer-dark", size); 79 bool success = !std::strncmp(str, "prefer-dark", size);
77 80
84 GVariantPtr<GVariant> gtk_theme(::g_settings_get_value(settings.get(), "gtk-theme")); 87 GVariantPtr<GVariant> gtk_theme(::g_settings_get_value(settings.get(), "gtk-theme"));
85 if (!gtk_theme) 88 if (!gtk_theme)
86 return false; 89 return false;
87 90
88 gsize size; 91 gsize size;
89 const gchar* str = ::g_variant_get_string(gtk_theme.get(), &size); 92 const gchar *str = ::g_variant_get_string(gtk_theme.get(), &size);
90 if (!str) 93 if (!str)
91 return false; 94 return false;
92 95
93 if (IsGTKThemeDark({str, size})) 96 if (IsGTKThemeDark({str, size}))
94 return true; 97 return true;