comparison src/sys/glib/dark_theme.cc @ 403:df4a027623d0 default tip

x11: fix build fail when glib is not detected this can happen if glib is just not installed, or if dev headers are not installed either.
author Paper <paper@tflc.us>
date Mon, 10 Nov 2025 15:51:45 -0500
parents 5eaafed6c10b
children
comparison
equal deleted inserted replaced
402:d859306e2db4 403:df4a027623d0
1 #include "sys/glib/dark_theme.h" 1 #include "sys/glib/dark_theme.h"
2 #include "core/strings.h"
2 3
3 #include <array> 4 #include <array>
4 #include <cstring> 5 #include <cstring>
5 #include <gio/gio.h> 6 #include <gio/gio.h>
6 #include <memory> 7 #include <memory>
30 template<typename T> 31 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 /* not really "glib" but GNOME-related enough */
37 bool IsGTKThemeDark(const std::string_view str)
38 {
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(),
54 suffix.end()))
55 return true;
56 }
57
58 return false;
59 }
60 36
61 bool IsInDarkTheme() 37 bool IsInDarkTheme()
62 { 38 {
63 GObjectPtr<GSettings> settings(::g_settings_new("org.gnome.desktop.interface")); 39 GObjectPtr<GSettings> settings(::g_settings_new("org.gnome.desktop.interface"));
64 if (!settings) 40 if (!settings)
91 gsize size; 67 gsize size;
92 const gchar *str = ::g_variant_get_string(gtk_theme.get(), &size); 68 const gchar *str = ::g_variant_get_string(gtk_theme.get(), &size);
93 if (!str) 69 if (!str)
94 return false; 70 return false;
95 71
96 if (IsGTKThemeDark({str, size})) 72 if (Strings::IsGTKThemeDark({str, size}))
97 return true; 73 return true;
98 } 74 }
99 75
100 /* welp, we tried */ 76 /* welp, we tried */
101 return false; 77 return false;