diff --git a/CMakeLists.txt b/CMakeLists.txt index 7161c4e..c179ffe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,7 @@ boption(SERVICE_MPRIS "Mpris" ON) boption(SERVICE_PAM "Pam" ON) boption(SERVICE_GREETD "Greetd" ON) boption(SERVICE_UPOWER "UPower" ON) +boption(SERVICE_NETWORKMANAGER "NetworkManager" ON) boption(SERVICE_NOTIFICATIONS "Notifications" ON) boption(BLUETOOTH "Bluetooth" ON) diff --git a/default.nix b/default.nix index 73cd8d1..411b2a4 100644 --- a/default.nix +++ b/default.nix @@ -20,6 +20,7 @@ libdrm, libgbm ? null, pipewire, + networkmanager, pam, gitRev ? (let @@ -40,6 +41,7 @@ withWayland ? true, withX11 ? true, withPipewire ? true, + withNetworkmanager ? true, withPam ? true, withHyprland ? true, withI3 ? true, @@ -70,7 +72,8 @@ ++ lib.optionals (withWayland && libgbm != null) [ libdrm libgbm ] ++ lib.optional withX11 xorg.libxcb ++ lib.optional withPam pam - ++ lib.optional withPipewire pipewire; + ++ lib.optional withPipewire pipewire + ++ lib.optional withNetworkmanager networkmanager; cmakeBuildType = if debug then "Debug" else "RelWithDebInfo"; @@ -84,6 +87,7 @@ (lib.cmakeBool "WAYLAND" withWayland) (lib.cmakeBool "SCREENCOPY" (libgbm != null)) (lib.cmakeBool "SERVICE_PIPEWIRE" withPipewire) + (lib.cmakeBool "SERVICE_NETWORKMANAGER" withNetworkmanager) (lib.cmakeBool "SERVICE_PAM" withPam) (lib.cmakeBool "HYPRLAND" withHyprland) (lib.cmakeBool "I3" withI3) diff --git a/src/services/CMakeLists.txt b/src/services/CMakeLists.txt index 5ab5c55..173ddea 100644 --- a/src/services/CMakeLists.txt +++ b/src/services/CMakeLists.txt @@ -6,6 +6,10 @@ if (SERVICE_PIPEWIRE) add_subdirectory(pipewire) endif() +if (SERVICE_NETWORKMANAGER) + add_subdirectory(networkmanager) +endif() + if (SERVICE_MPRIS) add_subdirectory(mpris) endif() diff --git a/src/services/networkmanager/CMakeLists.txt b/src/services/networkmanager/CMakeLists.txt new file mode 100644 index 0000000..c9d53e1 --- /dev/null +++ b/src/services/networkmanager/CMakeLists.txt @@ -0,0 +1,41 @@ +find_package(PkgConfig REQUIRED) +# Not using libnm +#pkg_check_modules(networkmanager REQUIRED IMPORTED_TARGET libnm) + +set_source_files_properties(org.freedesktop.NetworkManager.xml PROPERTIES + CLASSNAME DBusNetworkManagerService + NO_NAMESPACE TRUE +) +qt_add_dbus_interface(DBUS_INTERFACES + org.freedesktop.NetworkManager.xml + dbus_service +) + +qt_add_library(quickshell-service-networkmanager STATIC + core.cpp + ${DBUS_INTERFACES} +) + +# dbus headers +target_include_directories(quickshell-service-networkmanager PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) + +qt_add_qml_module(quickshell-service-networkmanager + URI Quickshell.Services.NetworkManager + VERSION 0.1 + DEPENDENCIES QtQml +) + +# Not sure what this is doing +qs_add_module_deps_light(quickshell-service-networkmanager Quickshell) + +install_qml_module(quickshell-service-networkmanager) + +target_link_libraries(quickshell-service-networkmanager PRIVATE + Qt::Qml + #Qt::Quick # pch + Qt::DBus +) +qs_add_link_dependencies(quickshell-service-networkmanager quickshell-dbus) +target_link_libraries(quickshell PRIVATE quickshell-service-networkmanagerplugin) + +qs_module_pch(quickshell-service-networkmanager) diff --git a/src/services/networkmanager/core.cpp b/src/services/networkmanager/core.cpp new file mode 100644 index 0000000..97d42ec --- /dev/null +++ b/src/services/networkmanager/core.cpp @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include "core.hpp" +#include "dbus_service.h" +#include +#include + +#include "../../dbus/bus.hpp" + +namespace qs::service::networkmanager { + +namespace { +Q_LOGGING_CATEGORY(logNetworkManager, "quickshell.service.networkmanager", QtDebugMsg); +} + +NetworkManager::NetworkManager(){ + //qDBusRegisterMetaType>(); + + auto bus = QDBusConnection::systemBus(); + + if (!bus.isConnected()) { + // Log message + qCWarning(logNetworkManager) << "Could not connect to DBus. NetworkManager service will not work."; + return; + } + + this->service = new DBusNetworkManagerService("org.freedesktop.NetworkManager", "/org/freedesktop/NetworkManager", bus, this); + + if (!this->service->isValid()) { + qCDebug(logNetworkManager) << "NetworkManager service is not currently running, attempting to start it."; + + dbus::tryLaunchService(this, bus, "org.freedesktop.NetworkManager", [this](bool success) { + if (success) { + qCDebug(logNetworkManager) << "Successfully launched NetworkManager service."; + this->init(); + } else { + qCWarning(logNetworkManager) << "Could not start NetworkManager. The NetworkManager service will not work."; + } + }); + } else { + this->init(); + } +} + +NetworkManager* NetworkManager::instance() { + static NetworkManager* instance = new NetworkManager(); // NOLINT + return instance; +} + +void NetworkManager::init() { + qCDebug(logNetworkManager) << "Hi mom"; +} + +} diff --git a/src/services/networkmanager/core.hpp b/src/services/networkmanager/core.hpp new file mode 100644 index 0000000..b6da281 --- /dev/null +++ b/src/services/networkmanager/core.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include +#include +#include "dbus_service.h" +#include + +// Define the "au" dbus type +using dbus_type_au = QList; +Q_DECLARE_METATYPE(dbus_type_au); +// Define the "a{sv}" dbus type +//using NetworkManagerCapabilities = QList; + +namespace qs::service::networkmanager { + +class NetworkManager : public QObject { + Q_OBJECT; +public: + static NetworkManager* instance(); // Get instance of the class +private: + NetworkManager(); + DBusNetworkManagerService* service = nullptr; + void init(); +}; + +} diff --git a/src/services/networkmanager/org.freedesktop.NetworkManager.xml b/src/services/networkmanager/org.freedesktop.NetworkManager.xml new file mode 100644 index 0000000..2044c75 --- /dev/null +++ b/src/services/networkmanager/org.freedesktop.NetworkManager.xml @@ -0,0 +1,611 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/services/networkmanager/org.freedesktop.NetworkManager.xml.test b/src/services/networkmanager/org.freedesktop.NetworkManager.xml.test new file mode 100644 index 0000000..5ea471f --- /dev/null +++ b/src/services/networkmanager/org.freedesktop.NetworkManager.xml.test @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/services/pipewire/core.cpp b/src/services/pipewire/core.cpp index 9c2a3db..998b0cb 100644 --- a/src/services/pipewire/core.cpp +++ b/src/services/pipewire/core.cpp @@ -52,7 +52,7 @@ PwCore::PwCore(QObject* parent): QObject(parent), notifier(QSocketNotifier::Read qCInfo(logLoop) << "Connecting to pipewire server."; this->core = pw_context_connect(this->context, nullptr, 0); if (this->core == nullptr) { - qCCritical(logLoop) << "Failed to connect pipewire context. Errno:" << errno; + qCCritical(logLoop) << "Failed to connect pipewire context. Errno:" << errno; return; }