43 auto* self = static_cast<LowPowerModeNotifier*>(userData);
44 if (proxy) {
45 GUniquePtr<char> nameOwner(g_dbus_proxy_get_name_owner(proxy.get()));
46 if (nameOwner) {
47 self->m_displayDeviceProxy = WTFMove(proxy);
48 self->updateWarningLevel();
49 g_signal_connect_swapped(self->m_displayDeviceProxy.get(), "g-properties-changed", G_CALLBACK(gPropertiesChangedCallback), self);
50 return;
51 }
52 }
53
54 // Now, if there is no name owner, it would be good to try to
55 // connect to a Flatpak battery status portal instead.
56 // Unfortunately, no such portal currently exists.
57 self->m_cancellable = nullptr;
58 }, this);
59 }
60
61 void LowPowerModeNotifier::updateWarningLevel()
62 {
63 GRefPtr<GVariant> variant = adoptGRef(g_dbus_proxy_get_cached_property(m_displayDeviceProxy.get(), kWarningLevel));
64 if (!variant) {
65 m_lowPowerModeEnabled = false;
66 return;
67 }
68
69 // 0: Unknown
70 // 1: None
71 // 2: Discharging (only for universal power supplies)
72 // 3: Low
73 // 4: Critical
74 // 5: Action
75 m_lowPowerModeEnabled = g_variant_get_uint32(variant.get()) > 1;
76 }
77
78 void LowPowerModeNotifier::warningLevelChanged()
79 {
80 updateWarningLevel();
81 m_callback(m_lowPowerModeEnabled);
82 }
83
84 void LowPowerModeNotifier::gPropertiesChangedCallback(LowPowerModeNotifier* self, GVariant* changedProperties)
85 {
86 GUniqueOutPtr<GVariantIter> iter;
87 g_variant_get(changedProperties, "a{sv}", &iter.outPtr());
88
89 const char* propertyName;
90 while (g_variant_iter_next(iter.get(), "{&sv}", &propertyName, nullptr)) {
91 if (!strcmp(propertyName, kWarningLevel)) {
92 self->warningLevelChanged();
93 break;
94 }
95 }
38#if GLIB_CHECK_VERSION(2, 69, 1)
39 g_signal_connect_swapped(m_powerProfileMonitor.get(), "notify::power-saver-enabled", G_CALLBACK(+[] (LowPowerModeNotifier* self, GParamSpec*, GPowerProfileMonitor*) {
40 self->m_callback(self->isLowPowerModeEnabled());
41 }), this);
42#endif