diff --git a/CMakeLists.txt b/CMakeLists.txt index 82fcb6e9..02b2d7a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,7 @@ ecm_setup_version(${PROJECT_VERSION} VARIABLE_PREFIX KTAILCTL VERSION_HEADER find_package( Qt6 ${QT6_MIN_VERSION} REQUIRED COMPONENTS Core + DBus Gui # Qml Quick diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f7011c1a..3848a65a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,11 +6,14 @@ check_ipo_supported(RESULT ipo_supported OUTPUT ipo_output) add_subdirectory(ui/components) add_subdirectory(wrapper) +qt6_add_dbus_interfaces(KTAILCTL_DBUS_SRCS org.freedesktop.portal.Settings.xml) + add_executable( ktailctl about.cpp app.cpp exit_node_model.cpp + freedesktop_settings_portal.cpp json.cpp logging.cpp main.cpp @@ -26,7 +29,8 @@ add_executable( taildrop_sender.cpp tailscale.cpp tray_icon.cpp - util.cpp) + util.cpp + ${KTAILCTL_DBUS_SRCS}) ecm_add_qml_module(ktailctl URI org.fkoehler.KTailctl GENERATE_PLUGIN_SOURCE) ecm_target_qml_sources( @@ -123,6 +127,8 @@ target_link_libraries( KF6::CoreAddons KF6::WindowSystem KF6::GuiAddons + Qt6::Core + Qt6::DBus Qt6::Widgets Qt6::Quick Qt6::QuickControls2 diff --git a/src/freedesktop_settings_portal.cpp b/src/freedesktop_settings_portal.cpp new file mode 100644 index 00000000..6a0ab951 --- /dev/null +++ b/src/freedesktop_settings_portal.cpp @@ -0,0 +1,59 @@ +#include "freedesktop_settings_portal.hpp" + +FreedesktopSettingsPortal::FreedesktopSettingsPortal(QObject *parent) + : QObject(parent) + , mConnection(QDBusConnection::sessionBus()) +{ + mSettingsInterface = new org::freedesktop::portal::Settings(QStringLiteral("org.freedesktop.portal.Settings"), "/", mConnection, this); + + // register for color scheme changes + connect(mSettingsInterface, + &org::freedesktop::portal::Settings::SettingChanged, + this, + [this](const QString &ns, const QString &key, const QDBusVariant &value) { + if (ns == QStringLiteral("org.freedesktop.appearance") && key == QStringLiteral("color-scheme")) { + updateColorScheme(value); + } + }); + + // get initial value for color scheme setting + auto request = mSettingsInterface->ReadOne("org.freedesktop.appearance", "color-scheme"); + request.waitForFinished(); + updateColorScheme(request.value()); + emit colorSchemeChanged(mColorScheme); +} + +void FreedesktopSettingsPortal::updateColorScheme(const QDBusVariant &value) +{ + ColorScheme newColorScheme; + const int colorSchemeValue = value.variant().toInt(); + switch (colorSchemeValue) { + case 0: + newColorScheme = ColorScheme::NoPreference; + break; + case 1: + newColorScheme = ColorScheme::Dark; + break; + case 2: + newColorScheme = ColorScheme::Light; + break; + default: + newColorScheme = ColorScheme::NoPreference; + qCritical() << "Unknown color scheme:" << colorSchemeValue; + } + if (newColorScheme != mColorScheme) { + mColorScheme = newColorScheme; + emit colorSchemeChanged(mColorScheme); + } +} + +FreedesktopSettingsPortal *FreedesktopSettingsPortal::instance() +{ + static FreedesktopSettingsPortal instance; + return &instance; +} + +FreedesktopSettingsPortal::ColorScheme FreedesktopSettingsPortal::colorScheme() const +{ + return mColorScheme; +} diff --git a/src/freedesktop_settings_portal.hpp b/src/freedesktop_settings_portal.hpp new file mode 100644 index 00000000..bfa50aad --- /dev/null +++ b/src/freedesktop_settings_portal.hpp @@ -0,0 +1,39 @@ +#ifndef KTAILCTL_SRC_SETTINGS_PORTAL_HPP +#define KTAILCTL_SRC_SETTINGS_PORTAL_HPP + +#include "settingsinterface.h" +#include +#include + +class FreedesktopSettingsPortal : public QObject +{ + Q_OBJECT + Q_PROPERTY(ColorScheme colorScheme READ colorScheme NOTIFY colorSchemeChanged) + +public: + enum class ColorScheme : int { + NoPreference = 0, + Dark = 1, + Light = 2, + }; + Q_ENUM(ColorScheme) + +private: + QDBusConnection mConnection; + org::freedesktop::portal::Settings *mSettingsInterface; + ColorScheme mColorScheme = ColorScheme::NoPreference; + + explicit FreedesktopSettingsPortal(QObject *parent = nullptr); + + void updateColorScheme(const QDBusVariant &value); + +public: + static FreedesktopSettingsPortal *instance(); + + ColorScheme colorScheme() const; + +signals: + void colorSchemeChanged(ColorScheme value); +}; + +#endif /* KTAILCTL_SRC_SETTINGS_PORTAL_HPP */ diff --git a/src/main.cpp b/src/main.cpp index 734d2095..ac48f15d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,6 +18,7 @@ #include "about.hpp" #include "app.hpp" +#include "freedesktop_settings_portal.hpp" #include "logging.hpp" #include "peer_model.hpp" #include "preferences.hpp" @@ -91,6 +92,7 @@ Q_DECL_EXPORT int main(int argc, char *argv[]) qmlRegisterSingletonInstance("org.fkoehler.KTailctl", 1, 0, "App", application); qmlRegisterSingletonInstance("org.fkoehler.KTailctl", 1, 0, "Util", util); qmlRegisterSingletonInstance("org.fkoehler.KTailctl", 1, 0, "TaildropSendJobFactory", TaildropSendJobFactory::instance()); + qmlRegisterSingletonInstance("org.fkoehler.KTailctl", 1, 0, "FreedesktopSettingsPortal", FreedesktopSettingsPortal::instance()); qmlRegisterType("org.fkoehler.KTailctl", 1, 0, "SpeedStatistics"); qmlRegisterType("org.fkoehler.KTailctl", 1, 0, "Statistics"); diff --git a/src/org.freedesktop.portal.Settings.xml b/src/org.freedesktop.portal.Settings.xml new file mode 100644 index 00000000..6721af09 --- /dev/null +++ b/src/org.freedesktop.portal.Settings.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/themes.hpp b/src/themes.hpp index ded76c97..67da2546 100644 --- a/src/themes.hpp +++ b/src/themes.hpp @@ -6,12 +6,15 @@ static const QStringList TrayIconThemes = {QStringLiteral("breeze-light"), QStringLiteral("breeze-dark"), + QStringLiteral("breeze-auto"), QStringLiteral("colorful"), QStringLiteral("adwaita-dark"), QStringLiteral("adwaita-light"), + QStringLiteral("adwaita-auto"), QStringLiteral("catppuccin-latte"), QStringLiteral("catppuccin-frappe"), QStringLiteral("catppuccin-macchiato"), - QStringLiteral("catppuccin-mocha")}; + QStringLiteral("catppuccin-mocha"), + QStringLiteral("catppuccin-auto")}; #endif /* KTAILCTL_GENERATE_ICONS_PY */