From 1959f049f5934be215a9eca9fbc1582438f4dbe2 Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Tue, 30 Dec 2025 14:20:58 +0100 Subject: [PATCH] core: rewrite entire app in hyprtoolkit (#25) * core: rewrite entire app in hyprtoolkit * Nix: update deps * CMake: fix .desktop path, dedup deps --------- Co-authored-by: Mihai Fufezan --- CMakeLists.txt | 87 ++++++--- README.md | 6 +- assets/showcase.png | Bin 72647 -> 105066 bytes flake.lock | 158 ++++++++++++---- flake.nix | 44 ++++- nix/default.nix | 70 ++++---- nix/overlays.nix | 18 +- src/CMakeLists.txt | 19 -- src/SystemIconProvider.cpp | 25 --- src/SystemIconProvider.hpp | 14 -- src/SystemInfo.cpp | 226 ----------------------- src/SystemInfo.hpp | 46 ----- src/WaylandScreen.cpp | 60 ------- src/WaylandScreen.hpp | 14 -- src/helpers/Logger.hpp | 12 ++ src/helpers/Memory.hpp | 15 ++ src/icons/Icons.hpp | 9 + src/main.cpp | 287 +++++++++++++++++++++++++++-- src/main.qml | 207 --------------------- src/util/Utils.cpp | 46 ----- src/util/Utils.hpp | 8 - src/utils/HyprlandIPC.cpp | 86 +++++++++ src/utils/HyprlandIPC.hpp | 8 + src/utils/SystemInfo.cpp | 358 +++++++++++++++++++++++++++++++++++++ src/utils/SystemInfo.hpp | 24 +++ 25 files changed, 1072 insertions(+), 775 deletions(-) delete mode 100644 src/CMakeLists.txt delete mode 100644 src/SystemIconProvider.cpp delete mode 100644 src/SystemIconProvider.hpp delete mode 100644 src/SystemInfo.cpp delete mode 100644 src/SystemInfo.hpp delete mode 100644 src/WaylandScreen.cpp delete mode 100644 src/WaylandScreen.hpp create mode 100644 src/helpers/Logger.hpp create mode 100644 src/helpers/Memory.hpp create mode 100644 src/icons/Icons.hpp delete mode 100644 src/main.qml delete mode 100644 src/util/Utils.cpp delete mode 100644 src/util/Utils.hpp create mode 100644 src/utils/HyprlandIPC.cpp create mode 100644 src/utils/HyprlandIPC.hpp create mode 100644 src/utils/SystemInfo.cpp create mode 100644 src/utils/SystemInfo.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index f0cf66f..1e74232 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,34 +1,75 @@ -cmake_minimum_required(VERSION 3.16) +cmake_minimum_required(VERSION 3.19) -# Get version file(READ "${CMAKE_SOURCE_DIR}/VERSION" VER_RAW) -string(STRIP ${VER_RAW} VER) +string(STRIP ${VER_RAW} HYPRSYSTEMINFO_VERSION) -project(hsi VERSION ${VER} LANGUAGES CXX) +add_compile_definitions(HYPRSYSTEMINFO_VERSION="${HYPRSYSTEMINFO_VERSION}") + +project( + hyprsysteminfo + VERSION ${HYPRSYSTEMINFO_VERSION} + DESCRIPTION "System info utility for Hyprland") + +include(CTest) +include(CheckIncludeFile) +include(GNUInstallDirs) + +set(PREFIX ${CMAKE_INSTALL_PREFIX}) +set(INCLUDE ${CMAKE_INSTALL_FULL_INCLUDEDIR}) +set(LIBDIR ${CMAKE_INSTALL_FULL_LIBDIR}) + +find_package(glaze QUIET) +if (NOT glaze_FOUND) + set(GLAZE_VERSION v6.1.0) + message(STATUS "glaze dependency not found, retrieving ${GLAZE_VERSION} with FetchContent") + include(FetchContent) + FetchContent_Declare( + glaze + GIT_REPOSITORY https://github.com/stephenberry/glaze.git + GIT_TAG ${GLAZE_VERSION} + GIT_SHALLOW TRUE + ) + FetchContent_MakeAvailable(glaze) +endif() + +find_package(PkgConfig REQUIRED) +pkg_check_modules( + deps + REQUIRED + IMPORTED_TARGET + hyprtoolkit + hyprutils>=0.10.2 + libdrm + libpci + pixman-1 +) set(CMAKE_CXX_STANDARD 23) -set(CMAKE_CXX_STANDARD_REQUIRED ON) +add_compile_options( + -Wall + -Wextra + -Wno-unused-parameter + -Wno-unused-value + -Wno-missing-field-initializers + -Wpedantic) +set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) -find_package(Qt6 6.5 REQUIRED COMPONENTS Widgets Quick QuickControls2 WaylandClient) -find_package(PkgConfig REQUIRED) +if(CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES DEBUG) + message(STATUS "Configuring hyprsysteminfo in Debug") + add_compile_definitions(hyprsysteminfo_DEBUG) +else() + add_compile_options(-O3) + message(STATUS "Configuring hyprsysteminfo in Release") +endif() -pkg_check_modules(hyprutils REQUIRED IMPORTED_TARGET hyprutils) +file(GLOB_RECURSE SRCFILES CONFIGURE_DEPENDS "src/*.cpp" "include/*.hpp") -qt_standard_project_setup(REQUIRES 6.5) +add_executable(hyprsysteminfo ${SRCFILES}) -add_subdirectory(src) +target_link_libraries(hyprsysteminfo PkgConfig::deps) -qt_add_resources(hyprsysteminfo "resource" - PREFIX "/" - FILES - resource/hyprlandlogo.svg -) +install( + FILES assets/install/hyprsysteminfo.desktop + DESTINATION "share/applications") -include(GNUInstallDirs) -install(TARGETS hyprsysteminfo - BUNDLE DESTINATION . - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} -) - -install(FILES assets/install/hyprsysteminfo.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) +install(TARGETS hyprsysteminfo) diff --git a/README.md b/README.md index 04abd68..cf15fcd 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,7 @@ -# hyprsysteminfo -A tiny qt6/qml application to display information about the running system, +## hyprsysteminfo +A tiny hyprtoolkit application to display information about the running system, or copy diagnostics data, without the terminal. -![](./assets/showcase.png) - ## Footnotes [^1]: Some distributions may not support a graphical logo in hyprsysteminfo. To check if your distribution supports a graphical logo, run `cat /etc/os-release`. If the output includes a `LOGO` line, a graphical logo should appear in hyprsysteminfo. If there is no `LOGO` line, a graphical logo will not be displayed. diff --git a/assets/showcase.png b/assets/showcase.png index a934f4934cec38d7efc8e1fbb5caad895a9868e5..8cbc9e13fcbbef92d72c6c302671e3e0e942ebce 100644 GIT binary patch literal 105066 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 AXaE2J literal 72647 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 diff --git a/flake.lock b/flake.lock index de8411a..607603a 100644 --- a/flake.lock +++ b/flake.lock @@ -1,8 +1,13 @@ { "nodes": { - "hyprland-qt-support": { + "aquamarine": { "inputs": { - "hyprlang": "hyprlang", + "hyprutils": [ + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprwayland-scanner" + ], "nixpkgs": [ "nixpkgs" ], @@ -11,37 +16,63 @@ ] }, "locked": { - "lastModified": 1737634706, - "narHash": "sha256-nGCibkfsXz7ARx5R+SnisRtMq21IQIhazp6viBU8I/A=", + "lastModified": 1767024902, + "narHash": "sha256-sMdk6QkMDhIOnvULXKUM8WW8iyi551SWw2i6KQHbrrU=", "owner": "hyprwm", - "repo": "hyprland-qt-support", - "rev": "8810df502cdee755993cb803eba7b23f189db795", + "repo": "aquamarine", + "rev": "b8a0c5ba5a9fbd2c660be7dd98bdde0ff3798556", "type": "github" }, "original": { "owner": "hyprwm", - "repo": "hyprland-qt-support", + "repo": "aquamarine", + "type": "github" + } + }, + "hyprgraphics": { + "inputs": { + "hyprutils": [ + "hyprutils" + ], + "nixpkgs": [ + "nixpkgs" + ], + "systems": [ + "systems" + ] + }, + "locked": { + "lastModified": 1766946335, + "narHash": "sha256-MRD+Jr2bY11MzNDfenENhiK6pvN+nHygxdHoHbZ1HtE=", + "owner": "hyprwm", + "repo": "hyprgraphics", + "rev": "4af02a3925b454deb1c36603843da528b67ded6c", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprgraphics", "type": "github" } }, "hyprlang": { "inputs": { - "hyprutils": "hyprutils", + "hyprutils": [ + "hyprutils" + ], "nixpkgs": [ - "hyprland-qt-support", "nixpkgs" ], "systems": [ - "hyprland-qt-support", "systems" ] }, "locked": { - "lastModified": 1737634606, - "narHash": "sha256-W7W87Cv6wqZ9PHegI6rH1+ve3zJPiyevMFf0/HwdbCQ=", + "lastModified": 1764612430, + "narHash": "sha256-54ltTSbI6W+qYGMchAgCR6QnC1kOdKXN6X6pJhOWxFg=", "owner": "hyprwm", "repo": "hyprlang", - "rev": "f41271d35cc0f370d300413d756c2677f386af9d", + "rev": "0d00dc118981531aa731150b6ea551ef037acddd", "type": "github" }, "original": { @@ -50,25 +81,59 @@ "type": "github" } }, + "hyprtoolkit": { + "inputs": { + "aquamarine": [ + "aquamarine" + ], + "hyprgraphics": [ + "hyprgraphics" + ], + "hyprlang": [ + "hyprlang" + ], + "hyprutils": [ + "hyprutils" + ], + "hyprwayland-scanner": [ + "hyprwayland-scanner" + ], + "nixpkgs": [ + "nixpkgs" + ], + "systems": [ + "systems" + ] + }, + "locked": { + "lastModified": 1767025790, + "narHash": "sha256-LEGGn0KRXr3swO80ESKE72KR6J4arRX/9psBnNF7O0A=", + "owner": "hyprwm", + "repo": "hyprtoolkit", + "rev": "b42b3281d766e67eca990dba89e85cc7c1d3e26d", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprtoolkit", + "type": "github" + } + }, "hyprutils": { "inputs": { "nixpkgs": [ - "hyprland-qt-support", - "hyprlang", "nixpkgs" ], "systems": [ - "hyprland-qt-support", - "hyprlang", "systems" ] }, "locked": { - "lastModified": 1737632363, - "narHash": "sha256-X9I8POSlHxBVjD0fiX1O2j7U9Zi1+4rIkrsyHP0uHXY=", + "lastModified": 1766253372, + "narHash": "sha256-1+p4Kw8HdtMoFSmJtfdwjxM4bPxDK9yg27SlvUMpzWA=", "owner": "hyprwm", "repo": "hyprutils", - "rev": "006620eb29d54ea9086538891404c78563d1bae1", + "rev": "51a4f93ce8572e7b12b7284eb9e6e8ebf16b4be9", "type": "github" }, "original": { @@ -77,7 +142,7 @@ "type": "github" } }, - "hyprutils_2": { + "hyprwayland-scanner": { "inputs": { "nixpkgs": [ "nixpkgs" @@ -87,26 +152,52 @@ ] }, "locked": { - "lastModified": 1737632363, - "narHash": "sha256-X9I8POSlHxBVjD0fiX1O2j7U9Zi1+4rIkrsyHP0uHXY=", + "lastModified": 1763640274, + "narHash": "sha256-Uan1Nl9i4TF/kyFoHnTq1bd/rsWh4GAK/9/jDqLbY5A=", "owner": "hyprwm", - "repo": "hyprutils", - "rev": "006620eb29d54ea9086538891404c78563d1bae1", + "repo": "hyprwayland-scanner", + "rev": "f6cf414ca0e16a4d30198fd670ec86df3c89f671", "type": "github" }, "original": { "owner": "hyprwm", - "repo": "hyprutils", + "repo": "hyprwayland-scanner", + "type": "github" + } + }, + "hyprwire": { + "inputs": { + "hyprutils": [ + "hyprutils" + ], + "nixpkgs": [ + "nixpkgs" + ], + "systems": [ + "systems" + ] + }, + "locked": { + "lastModified": 1766253414, + "narHash": "sha256-O70C7PD8r/8fwrVofU5gaswXrQ7WFg0m/M1eWnm3+1U=", + "owner": "hyprwm", + "repo": "hyprwire", + "rev": "c0541f6fa55bfc98a7bfdfe07b0e448d616a3a1b", + "type": "github" + }, + "original": { + "owner": "hyprwm", + "repo": "hyprwire", "type": "github" } }, "nixpkgs": { "locked": { - "lastModified": 1737469691, - "narHash": "sha256-nmKOgAU48S41dTPIXAq0AHZSehWUn6ZPrUKijHAMmIk=", + "lastModified": 1766902085, + "narHash": "sha256-coBu0ONtFzlwwVBzmjacUQwj3G+lybcZ1oeNSQkgC0M=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9e4d5190a9482a1fb9d18adf0bdb83c6e506eaab", + "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4", "type": "github" }, "original": { @@ -118,8 +209,13 @@ }, "root": { "inputs": { - "hyprland-qt-support": "hyprland-qt-support", - "hyprutils": "hyprutils_2", + "aquamarine": "aquamarine", + "hyprgraphics": "hyprgraphics", + "hyprlang": "hyprlang", + "hyprtoolkit": "hyprtoolkit", + "hyprutils": "hyprutils", + "hyprwayland-scanner": "hyprwayland-scanner", + "hyprwire": "hyprwire", "nixpkgs": "nixpkgs", "systems": "systems" } diff --git a/flake.nix b/flake.nix index a842cb6..982183c 100644 --- a/flake.nix +++ b/flake.nix @@ -5,16 +5,56 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; systems.url = "github:nix-systems/default-linux"; + aquamarine = { + url = "github:hyprwm/aquamarine"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.systems.follows = "systems"; + inputs.hyprutils.follows = "hyprutils"; + inputs.hyprwayland-scanner.follows = "hyprwayland-scanner"; + }; + + hyprgraphics = { + url = "github:hyprwm/hyprgraphics"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.systems.follows = "systems"; + inputs.hyprutils.follows = "hyprutils"; + }; + hyprutils = { url = "github:hyprwm/hyprutils"; inputs.nixpkgs.follows = "nixpkgs"; inputs.systems.follows = "systems"; }; - hyprland-qt-support = { - url = "github:hyprwm/hyprland-qt-support"; + hyprlang = { + url = "github:hyprwm/hyprlang"; inputs.nixpkgs.follows = "nixpkgs"; inputs.systems.follows = "systems"; + inputs.hyprutils.follows = "hyprutils"; + }; + + hyprwayland-scanner = { + url = "github:hyprwm/hyprwayland-scanner"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.systems.follows = "systems"; + }; + + hyprwire = { + url = "github:hyprwm/hyprwire"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.systems.follows = "systems"; + inputs.hyprutils.follows = "hyprutils"; + }; + + hyprtoolkit = { + url = "github:hyprwm/hyprtoolkit"; + inputs.nixpkgs.follows = "nixpkgs"; + inputs.systems.follows = "systems"; + inputs.aquamarine.follows = "aquamarine"; + inputs.hyprutils.follows = "hyprutils"; + inputs.hyprlang.follows = "hyprlang"; + inputs.hyprgraphics.follows = "hyprgraphics"; + inputs.hyprwayland-scanner.follows = "hyprwayland-scanner"; }; }; diff --git a/nix/default.nix b/nix/default.nix index dc33dc8..fcf4b9a 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -4,46 +4,48 @@ stdenv, cmake, - qt6, pkg-config, + aquamarine, + cairo, + glaze-hyprsysteminfo, + hyprgraphics, + hyprtoolkit, hyprutils, + libdrm, pciutils, - hyprland-qt-support, + pixman, version ? "0", -}: let - inherit (lib.strings) makeBinPath; -in - stdenv.mkDerivation { - pname = "hyprsysteminfo"; - inherit version; +}: - src = nix-gitignore.gitignoreSource [] ./..; +stdenv.mkDerivation { + pname = "hyprsysteminfo"; + inherit version; - nativeBuildInputs = [ - cmake - pkg-config - qt6.wrapQtAppsHook - ]; + src = nix-gitignore.gitignoreSource [] ./..; - buildInputs = [ - qt6.qtbase - qt6.qtdeclarative - qt6.qtsvg - qt6.qtwayland - hyprutils - hyprland-qt-support - ]; + nativeBuildInputs = [ + cmake + pkg-config + ]; - preFixup = '' - qtWrapperArgs+=(--prefix PATH : "${makeBinPath [pciutils]}") - ''; + buildInputs = [ + aquamarine + cairo + glaze-hyprsysteminfo + hyprgraphics + hyprtoolkit + hyprutils + libdrm + pciutils + pixman + ]; - meta = { - description = "A tiny qt6/qml application to display information about the running system"; - homepage = "https://github.com/hyprwm/hyprsysteminfo"; - license = lib.licenses.bsd3; - maintainers = [lib.maintainers.fufexan]; - mainProgram = "hyprsysteminfo"; - platforms = lib.platforms.linux; - }; - } + meta = { + description = "System info utility for Hyprland"; + homepage = "https://github.com/hyprwm/hyprsysteminfo"; + license = lib.licenses.bsd3; + maintainers = [lib.maintainers.fufexan]; + mainProgram = "hyprsysteminfo"; + platforms = lib.platforms.linux; + }; +} diff --git a/nix/overlays.nix b/nix/overlays.nix index ffab21d..24ed99f 100644 --- a/nix/overlays.nix +++ b/nix/overlays.nix @@ -14,12 +14,28 @@ in { default = self.overlays.hyprsysteminfo; hyprsysteminfo = lib.composeManyExtensions [ + inputs.aquamarine.overlays.default + inputs.hyprgraphics.overlays.default + inputs.hyprlang.overlays.default inputs.hyprutils.overlays.default - inputs.hyprland-qt-support.overlays.default + inputs.hyprwayland-scanner.overlays.default + inputs.hyprtoolkit.overlays.default + inputs.hyprwire.overlays.default + self.overlays.glaze (final: prev: { hyprsysteminfo = final.callPackage ./. { version = "${version}+date=${date}_${self.shortRev or "dirty"}"; + stdenv = final.gcc15Stdenv; }; }) ]; + + # Even though glaze itself disables it by default, nixpkgs sets ENABLE_SSL set to true. + # Since we don't include openssl, the build failes without the `enableSSL = false;` override + glaze = final: prev: { + glaze-hyprsysteminfo = prev.glaze.override { + enableSSL = false; + enableInterop = false; + }; + }; } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt deleted file mode 100644 index 0bac937..0000000 --- a/src/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -find_package(Qt6 REQUIRED COMPONENTS WaylandClientPrivate) - -qt_add_executable(hyprsysteminfo - main.cpp - util/Utils.cpp - SystemInfo.cpp - SystemIconProvider.cpp - WaylandScreen.cpp -) - -qt_add_qml_module(hyprsysteminfo - URI org.hyprland.systeminfo - VERSION 1.0 - QML_FILES main.qml -) - -target_link_libraries(hyprsysteminfo PRIVATE - Qt6::Widgets Qt6::QuickControls2 Qt6::WaylandClientPrivate PkgConfig::hyprutils -) diff --git a/src/SystemIconProvider.cpp b/src/SystemIconProvider.cpp deleted file mode 100644 index 9900e78..0000000 --- a/src/SystemIconProvider.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "SystemIconProvider.hpp" -#include -#include -#include - -QPixmap CSystemIconProvider::requestPixmap(const QString& id, QSize* size, const QSize& requestedSize) { - auto icon = QIcon::fromTheme(id); - - if (!requestedSize.isValid()) { - qCritical() << "Icon requests without an explicit size are not allowed."; - return QPixmap(); - } - - auto pixmap = icon.pixmap(requestedSize.width(), requestedSize.height()); - - if (pixmap.isNull()) { - qWarning() << "Could not load icon" << id; - return QPixmap(); - } - - if (size != nullptr) - *size = pixmap.size(); - - return pixmap; -} diff --git a/src/SystemIconProvider.hpp b/src/SystemIconProvider.hpp deleted file mode 100644 index bd4b3a8..0000000 --- a/src/SystemIconProvider.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -class CSystemIconProvider : public QQuickImageProvider { - public: - CSystemIconProvider() : QQuickImageProvider(QQuickImageProvider::Pixmap) {} - - QPixmap requestPixmap(const QString& id, QSize* size, const QSize& requestedSize) override; -}; diff --git a/src/SystemInfo.cpp b/src/SystemInfo.cpp deleted file mode 100644 index ea8235b..0000000 --- a/src/SystemInfo.cpp +++ /dev/null @@ -1,226 +0,0 @@ -#include "SystemInfo.hpp" -#include "WaylandScreen.hpp" -#include "util/Utils.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace Hyprutils::String; - -CSystemInternals::CSystemInternals(QObject* parent) : QObject(parent) { - setenv("LC_ALL", "en_US.UTF-8", true); - - // gather data from os-release - if (auto data = readFile("/etc/os-release")) { - CVarList lines(data.value(), 0, '\n'); - - for (auto& line : lines) { - CVarList param(line, 2, '='); - - const auto& key = param[0]; - auto value = param[1]; - - if (value.length() >= 2 && value.at(0) == '\"') - value = value.substr(1, value.length() - 2); - - if (key == "PRETTY_NAME") { - systemName = QString::fromLocal8Bit(value); - continue; - } - - if (key == "HOME_URL") { - systemURL = QString::fromLocal8Bit(value); - continue; - } - - if (key == "LOGO") { - systemLogoName = QString::fromLocal8Bit(value); - continue; - } - } - } - - // get kernel ver - utsname unamebuf; - if (uname(&unamebuf) == 0) { - systemKernel = unamebuf.release; - } - - // get hyprland info - if (getenv("HYPRLAND_INSTANCE_SIGNATURE")) { - hlSystemVersion = execAndGet("hyprctl", {"version"}); - auto DATA = hlSystemVersion.toStdString(); - - if (DATA.contains("Tag: ")) { - auto temp = DATA.substr(DATA.find("Tag: ") + 5); - temp = temp.substr(0, temp.find(",")); - hyprlandVersionLong = QString::fromLocal8Bit(temp); - hyprlandVersion = QString::fromLocal8Bit(temp.substr(0, temp.find("-"))); - } - - if (hyprlandVersionLong.length() <= 0 && DATA.contains("at commit")) { - auto temp = DATA.substr(DATA.find("at commit") + 10); - temp = temp.substr(0, temp.find(" ")); - hyprlandVersionLong = QString::fromLocal8Bit(temp.substr(0, 7)); - hyprlandVersion = QString::fromLocal8Bit(temp.substr(0, 7)); - } - - if (hyprlandVersionLong.isEmpty()) { - hyprlandVersionLong = QStringLiteral("unknown"); - hyprlandVersion = QStringLiteral("unknown"); - } - - hlSystemInfo = execAndGet("hyprctl", {"systeminfo"}); - if (!hlSystemInfo.contains("Hyprland")) - hlSystemInfo = ""; - } - - // get cpu info - { - const auto DATA = execAndGet("lscpu").toStdString(); - if (DATA.contains("odel name")) { - std::string arch, model, ghz, nproc; - - CVarList data(DATA, 0, '\n'); - for (auto& line : data) { - std::string left, right; - left = trim(line.substr(0, line.find(":"))); - right = trim(line.substr(line.find(":") + 1)); - - if (left == "Architecture") { - arch = right; - continue; - } - if (left == "Model name") { - model = right; - continue; - } - if (left == "CPU(s)") { - nproc = right; - continue; - } - if (left == "CPU max MHz") { - try { - ghz = std::format("{:.02}GHz", std::stof(right) / 1000.F); - } catch (...) { ghz = "?GHz"; } - continue; - } - } - - cpuInfo = QString::fromLocal8Bit(std::format("{} at {}x{} ({})", model, nproc, ghz, arch)); - } - } - - // get gpu info - { - auto ok = false; - const auto DATA = execAndGet("lspci", {"-vnn"}, &ok).toStdString(); - CVarList lines(DATA, 0, '\n'); - - if (ok) { - for (auto& line : lines) { - if (!line.contains("VGA")) - continue; - gpuInfo.emplace_back(QString::fromLocal8Bit(std::format("{}", line.substr(line.find(":", line.find("VGA")) + 2)))); - } - - if (gpuInfo.isEmpty()) - gpuInfo.emplaceBack(QStringLiteral("No GPUs found")); - } else - gpuInfo.emplaceBack(QStringLiteral("missing dependency: lspci")); - } - - // get ram info - { - const auto DATA = execAndGet("free").toStdString(); - if (DATA.contains("total")) { - CVarList data(DATA, 0, '\n'); - - auto ramIntToReadable = [](const std::string& datapoint) -> std::string { - try { - auto asInt = std::stoull(datapoint); - return std::format("{:.03}GB", asInt / 1000000.0); - } catch (...) { return "[error]"; } - }; - - CVarList props(data[1], 0, 's', true); - - ramInfo = QString::fromLocal8Bit(std::format("{} / {}", ramIntToReadable(props[2]), ramIntToReadable(props[1]))); - } - } - - // other, misc - if (auto current = qEnvironmentVariable("XDG_CURRENT_DESKTOP"); !current.isEmpty()) - DE = current; - - if (auto procUptime = readFile("/proc/uptime")) { - CVarList data(procUptime.value(), 0, 's', true); - - try { - int uptimeSeconds = std::round(std::stof(data[0])); - int uptimeDays = std::floor(uptimeSeconds / 3600.0 / 24.0); - int uptimeHours = std::floor((uptimeSeconds % (3600 * 24)) / 3600.0); - int uptimeMinutes = std::floor((uptimeSeconds % (3600)) / 60.0); - - auto upStr = std::format("{}{}{}", (uptimeDays > 0 ? std::format("{} days, ", uptimeDays) : ""), (uptimeHours > 0 ? std::format("{} hours, ", uptimeHours) : ""), - (uptimeMinutes > 0 ? std::format("{} minutes, ", uptimeMinutes) : "")); - - if (!upStr.empty()) - upStr = upStr.substr(0, upStr.length() - 2); - - uptime = QString::fromLocal8Bit(upStr); - } catch (...) { ; } - } - - { - std::string screens; - for (const auto& s : SWaylandScreenInfo::enumerateScreens()) { - screens += std::format("{} ({}x{}), ", s.name.toStdString(), s.pixelSize.width(), s.pixelSize.height()); - } - - if (!screens.empty()) - screens = screens.substr(0, screens.length() - 2); - - this->screens = QString::fromLocal8Bit(screens); - } - - if (auto* username = getlogin()) { - std::array hostname; - if (gethostname(hostname.data(), hostname.size()) == 0) - user = QString::fromLocal8Bit(std::format("{}@{}", username, hostname.data())); - } - - { - if (auto productName = readFile("/sys/devices/virtual/dmi/id/product_name")) - board = QString::fromLocal8Bit(trim(productName.value())); - else if (auto boardName = readFile("/sys/devices/virtual/dmi/id/board_name")) - board = QString::fromLocal8Bit(trim(boardName.value())); - } -} - -void CSystemInternals::copySystemInfo() { - QGuiApplication::clipboard()->setText(hlSystemInfo); - execAndGet("hyprctl", {"notify", "5", "5000", "0", "Copied system info to the clipboard."}); -} - -void CSystemInternals::copyVersion() { - QGuiApplication::clipboard()->setText(hlSystemVersion); - execAndGet("hyprctl", {"notify", "5", "5000", "0", "Copied version info to the clipboard."}); -} diff --git a/src/SystemInfo.hpp b/src/SystemInfo.hpp deleted file mode 100644 index 3c91a39..0000000 --- a/src/SystemInfo.hpp +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -class CSystemInternals : public QObject { - Q_OBJECT; - QML_NAMED_ELEMENT(SystemInfo); - QML_SINGLETON; - Q_PROPERTY(QString systemLogoName MEMBER systemLogoName CONSTANT); - Q_PROPERTY(QString systemName MEMBER systemName CONSTANT); - Q_PROPERTY(QString systemUrl MEMBER systemURL CONSTANT); - Q_PROPERTY(QString systemKernel MEMBER systemKernel CONSTANT); - Q_PROPERTY(QString hyprlandVersion MEMBER hyprlandVersion CONSTANT); - Q_PROPERTY(QString hyprlandVersionLong MEMBER hyprlandVersionLong CONSTANT); - Q_PROPERTY(QString cpuInfo MEMBER cpuInfo CONSTANT); - Q_PROPERTY(QVector gpuInfo MEMBER gpuInfo CONSTANT); - Q_PROPERTY(QString ramInfo MEMBER ramInfo CONSTANT); - Q_PROPERTY(QString uptime MEMBER uptime CONSTANT); - Q_PROPERTY(QString de MEMBER DE CONSTANT); - Q_PROPERTY(QString screens MEMBER screens CONSTANT); - Q_PROPERTY(QString model MEMBER board CONSTANT); - Q_PROPERTY(QString user MEMBER user CONSTANT); - - public: - explicit CSystemInternals(QObject* parent = nullptr); - - QString systemLogoName, systemName = "Linux", systemURL = "https://kernel.org/", systemKernel = "unknown"; - QString hyprlandVersion, hyprlandVersionLong; - - QString cpuInfo = "missing dependency: lscpu"; - QVector gpuInfo; - QString ramInfo = "?"; - - QString hlSystemInfo = "[error]", hlSystemVersion = "[error]"; - - QString uptime = "unknown", DE = "Unknown", screens = "unknown", board = "", user = ""; - - Q_INVOKABLE void copySystemInfo(); - Q_INVOKABLE void copyVersion(); -}; diff --git a/src/WaylandScreen.cpp b/src/WaylandScreen.cpp deleted file mode 100644 index 01aa7a9..0000000 --- a/src/WaylandScreen.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "WaylandScreen.hpp" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace QtWaylandClient; - -class CWaylandScreen : public QtWayland::wl_output { - public: - explicit CWaylandScreen(QWaylandDisplay* display, uint32_t version, uint32_t id); - ~CWaylandScreen() override; - Q_DISABLE_COPY_MOVE(CWaylandScreen); - SWaylandScreenInfo info; - - protected: - void output_mode(uint32_t flags, int32_t width, int32_t height, int32_t refresh) override; - void output_name(const QString& name) override; -}; - -std::vector SWaylandScreenInfo::enumerateScreens() { - auto* display = QWaylandIntegration::instance()->display(); - - std::vector screens; - for (const auto& global : display->globals()) { - if (global.interface == QStringLiteral("wl_output")) { - screens.emplace_back(new CWaylandScreen(display, global.version, global.id)); - } - } - - display->forceRoundTrip(); - - std::vector info; - for (auto* screen : screens) { - info.push_back(screen->info); - delete screen; - } - - return info; -} - -CWaylandScreen::CWaylandScreen(QWaylandDisplay* display, uint32_t version, uint32_t id) : QtWayland::wl_output(display->wl_registry(), id, 4u) {} - -CWaylandScreen::~CWaylandScreen() { - release(); -} - -void CWaylandScreen::output_mode(uint32_t flags, int width, int height, int refresh) { - info.pixelSize = QSize(width, height); -} - -void CWaylandScreen::output_name(const QString& name) { - info.name = name; -} diff --git a/src/WaylandScreen.hpp b/src/WaylandScreen.hpp deleted file mode 100644 index 3033325..0000000 --- a/src/WaylandScreen.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -struct SWaylandScreenInfo { - QString name; - QSize pixelSize; - - static std::vector enumerateScreens(); -}; diff --git a/src/helpers/Logger.hpp b/src/helpers/Logger.hpp new file mode 100644 index 0000000..55544ba --- /dev/null +++ b/src/helpers/Logger.hpp @@ -0,0 +1,12 @@ +#pragma once + +#include +#include "Memory.hpp" + +#define LOG_DEBUG Hyprutils::CLI::LOG_DEBUG +#define LOG_ERR Hyprutils::CLI::LOG_ERR +#define LOG_WARN Hyprutils::CLI::LOG_WARN +#define LOG_TRACE Hyprutils::CLI::LOG_TRACE +#define LOG_CRIT Hyprutils::CLI::LOG_CRIT + +inline UP g_logger = makeUnique(); diff --git a/src/helpers/Memory.hpp b/src/helpers/Memory.hpp new file mode 100644 index 0000000..4ddb4b6 --- /dev/null +++ b/src/helpers/Memory.hpp @@ -0,0 +1,15 @@ +#pragma once + +#include + +#include +#include +#include +#include + +using namespace Hyprutils::Memory; + +#define SP CSharedPointer +#define WP CWeakPointer +#define UP CUniquePointer +#define ASP CAtomicSharedPointer \ No newline at end of file diff --git a/src/icons/Icons.hpp b/src/icons/Icons.hpp new file mode 100644 index 0000000..86f2ad9 --- /dev/null +++ b/src/icons/Icons.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include + +namespace Icons { + inline constexpr uint8_t HYPRLAND_LOGO[] = { +#embed "../../resource/hyprlandlogo.svg" + }; +}; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 0089af0..9ad81d8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,21 +1,278 @@ -#include "SystemIconProvider.hpp" -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include -int main(int argc, char* argv[]) { - QApplication app(argc, argv); +#include +#include +#include - app.setApplicationName("Hyprland System Info"); +#include "utils/SystemInfo.hpp" +#include "utils/HyprlandIPC.hpp" - if (qEnvironmentVariableIsEmpty("QT_QUICK_CONTROLS_STYLE")) - QQuickStyle::setStyle("org.hyprland.style"); +#include - QQmlApplicationEngine engine; - engine.addImageProvider("systemIcons", new CSystemIconProvider); - QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, &app, []() { QCoreApplication::exit(-1); }, Qt::QueuedConnection); - engine.load("qrc:/qt/qml/org/hyprland/systeminfo/main.qml"); +using namespace Hyprutils::Memory; +using namespace Hyprutils::Math; +using namespace Hyprutils::OS; +using namespace Hyprtoolkit; - return app.exec(); +#define SP CSharedPointer +#define WP CWeakPointer +#define UP CUniquePointer + +static SP backend; + +// +static SP space(SP e) { + auto n = CNullBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_AUTO, {1, 1}})->commence(); + n->addChild(e); + e->setPositionMode(Hyprtoolkit::IElement::HT_POSITION_ABSOLUTE); + e->setPositionFlag(Hyprtoolkit::IElement::HT_POSITION_FLAG_LEFT, true); + e->setPositionFlag(Hyprtoolkit::IElement::HT_POSITION_FLAG_VCENTER, true); + return n; } + +int main(int argc, char** argv, char** envp) { + setenv("HT_QUIET", "1", true); + backend = IBackend::create(); + + const auto FONT_SIZE = CFontSize{CFontSize::HT_FONT_TEXT}.ptSize(); + const auto WINDOW_SIZE = Vector2D{FONT_SIZE * 100.F, FONT_SIZE * 60.F}; + + auto window = + CWindowBuilder::begin()->preferredSize(WINDOW_SIZE)->minSize(WINDOW_SIZE)->maxSize(WINDOW_SIZE)->appTitle("System Information")->appClass("hyprsysteminfo")->commence(); + + window->m_rootElement->addChild(CRectangleBuilder::begin()->color([] { return backend->getPalette()->m_colors.background; })->commence()); + + auto mainLayout = CColumnLayoutBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_PERCENT, {1, 1}})->gap(2)->commence(); + mainLayout->setMargin(4); + + window->m_rootElement->addChild(mainLayout); + + auto topLayout = CRowLayoutBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_AUTO, {1, 1}})->commence(); + + // Left: Distro + { + auto distroNull = CNullBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_ABSOLUTE, {0.5F, FONT_SIZE * 10.F}})->commence(); + auto distroLayout = CRowLayoutBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_PERCENT, {0.9F, 1.F}})->commence(); + distroLayout->setPositionMode(Hyprtoolkit::IElement::HT_POSITION_ABSOLUTE); + distroLayout->setPositionFlag(Hyprtoolkit::IElement::HT_POSITION_FLAG_CENTER, true); + + auto spacer1 = CNullBuilder::begin()->size({CDynamicSize::HT_SIZE_ABSOLUTE, CDynamicSize::HT_SIZE_ABSOLUTE, {1, 1}})->commence(); + spacer1->setGrow(true); + + distroLayout->addChild(spacer1); + + auto distroLogoName = Info::getDistroLogoName(); + if (distroLogoName) { + auto icon = backend->systemIcons()->lookupIcon(*distroLogoName); + + if (icon->exists()) { + auto img = CImageBuilder::begin()->size({CDynamicSize::HT_SIZE_AUTO, CDynamicSize::HT_SIZE_PERCENT, {1.F, 0.9F}})->icon(icon)->commence(); + distroLayout->addChild(img); + } + } + + auto distroTextLayout = CColumnLayoutBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_AUTO, {0.5F, 1.F}})->commence(); + + auto distroTextA = CTextBuilder::begin() + ->text(Info::getFromEtcOsRelease("NAME").value_or("Unknown")) + ->fontSize({CFontSize::HT_FONT_TEXT, 1.F}) + ->color([] { return backend->getPalette()->m_colors.text; }) + ->commence(); + auto distroTextB = CTextBuilder::begin() + ->text(std::format("{}", Info::getFromEtcOsRelease("HOME_URL").value_or(""), Info::getFromEtcOsRelease("HOME_URL").value_or(""))) + ->fontSize({CFontSize::HT_FONT_TEXT, 1.F}) + ->color([] { return backend->getPalette()->m_colors.text; }) + ->commence(); + auto distroTextC = + CTextBuilder::begin()->text(Info::kernel())->fontSize({CFontSize::HT_FONT_TEXT, 1.F})->color([] { return backend->getPalette()->m_colors.text; })->commence(); + + distroTextLayout->addChild(distroTextA); + distroTextLayout->addChild(distroTextB); + distroTextLayout->addChild(distroTextC); + + distroLayout->addChild(distroTextLayout); + + distroNull->addChild(distroLayout); + + topLayout->addChild(distroNull); + } + + // Right: Hyprland + + { + auto hlNull = CNullBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_ABSOLUTE, {0.5F, FONT_SIZE * 10.F}})->commence(); + auto hlLayout = CRowLayoutBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_PERCENT, {0.9F, 1.F}})->commence(); + hlLayout->setPositionMode(Hyprtoolkit::IElement::HT_POSITION_ABSOLUTE); + hlLayout->setPositionFlag(Hyprtoolkit::IElement::HT_POSITION_FLAG_CENTER, true); + + auto spacer1 = CNullBuilder::begin()->size({CDynamicSize::HT_SIZE_ABSOLUTE, CDynamicSize::HT_SIZE_ABSOLUTE, {1, 1}})->commence(); + spacer1->setGrow(true); + + auto logoData = Info::deLogo(); + if (logoData) { + std::vector data; + data.resize(logoData->size()); + std::memcpy(data.data(), logoData->data(), logoData->size()); + + auto img = CImageBuilder::begin()->size({CDynamicSize::HT_SIZE_AUTO, CDynamicSize::HT_SIZE_PERCENT, {1.F, 0.9F}})->data(std::move(data))->commence(); + hlLayout->addChild(img); + } + + auto hlTextLayout = CColumnLayoutBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_AUTO, {0.5F, 1.F}})->commence(); + + auto hlTextA = + CTextBuilder::begin()->text(Info::desktop())->fontSize({CFontSize::HT_FONT_TEXT, 1.F})->color([] { return backend->getPalette()->m_colors.text; })->commence(); + auto hlTextB = CTextBuilder::begin() + ->text(std::format("{}", Info::desktopHome(), Info::desktopHome())) + ->fontSize({CFontSize::HT_FONT_TEXT, 1.F}) + ->color([] { return backend->getPalette()->m_colors.text; }) + ->commence(); + auto hlTextC = + CTextBuilder::begin()->text(Info::desktopVersion())->fontSize({CFontSize::HT_FONT_TEXT, 1.F})->color([] { return backend->getPalette()->m_colors.text; })->commence(); + + hlTextLayout->addChild(hlTextA); + hlTextLayout->addChild(hlTextB); + hlTextLayout->addChild(hlTextC); + + hlLayout->addChild(hlTextLayout); + + hlLayout->addChild(spacer1); + + hlNull->addChild(hlLayout); + + topLayout->addChild(hlNull); + } + + mainLayout->addChild(topLayout); + + // Spacer, then system props + + auto hr = Hyprtoolkit::CRectangleBuilder::begin() // + ->color([] { return Hyprtoolkit::CHyprColor{backend->getPalette()->m_colors.text.darken(0.65)}; }) + ->size({Hyprtoolkit::CDynamicSize::HT_SIZE_PERCENT, Hyprtoolkit::CDynamicSize::HT_SIZE_ABSOLUTE, {1.F, 9.F}}) + ->commence(); + hr->setMargin(4); + + mainLayout->addChild(hr); + + auto container = CColumnLayoutBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_AUTO, {0.95F, 1.F}})->gap(2)->commence(); + + container->setMargin(10); + + container->setPositionMode(Hyprtoolkit::IElement::HT_POSITION_ABSOLUTE); + container->setPositionFlag(Hyprtoolkit::IElement::HT_POSITION_FLAG_HCENTER, true); + + container->addChild(space(CTextBuilder::begin() + ->text(std::format("User: {}", Info::user())) + ->fontSize({CFontSize::HT_FONT_TEXT, 1.F}) + ->color([] { return backend->getPalette()->m_colors.text; }) + ->commence())); + + container->addChild(space(CTextBuilder::begin() + ->text(std::format("Model: {}", Info::model())) + ->fontSize({CFontSize::HT_FONT_TEXT, 1.F}) + ->color([] { return backend->getPalette()->m_colors.text; }) + ->commence())); + + container->addChild(space(CTextBuilder::begin() + ->text(std::format("CPU: {}", Info::cpu())) + ->fontSize({CFontSize::HT_FONT_TEXT, 1.F}) + ->color([] { return backend->getPalette()->m_colors.text; }) + ->commence())); + + for (const auto& g : Info::gpus()) { + container->addChild(space(CTextBuilder::begin() + ->text(std::format("GPU: {}", g)) + ->fontSize({CFontSize::HT_FONT_TEXT, 1.F}) + ->color([] { return backend->getPalette()->m_colors.text; }) + ->commence())); + } + + container->addChild(space(CTextBuilder::begin() + ->text(std::format("RAM: {}", Info::mem())) + ->fontSize({CFontSize::HT_FONT_TEXT, 1.F}) + ->color([] { return backend->getPalette()->m_colors.text; }) + ->commence())); + + container->addChild(space(CTextBuilder::begin() + ->text(std::format("Uptime: {}", Info::uptime())) + ->fontSize({CFontSize::HT_FONT_TEXT, 1.F}) + ->color([] { return backend->getPalette()->m_colors.text; }) + ->commence())); + + mainLayout->addChild(container); + + // bottom layout + + auto bottomNull = CNullBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_AUTO, {1, 1}})->commence(); + bottomNull->setMargin(6); + bottomNull->setPositionMode(Hyprtoolkit::IElement::HT_POSITION_ABSOLUTE); + bottomNull->setPositionFlag(Hyprtoolkit::IElement::HT_POSITION_FLAG_BOTTOM, true); + + auto bottomLayout = CRowLayoutBuilder::begin()->size({CDynamicSize::HT_SIZE_PERCENT, CDynamicSize::HT_SIZE_AUTO, {1, 1}})->gap(10)->commence(); + + auto spacer = CNullBuilder::begin()->size({CDynamicSize::HT_SIZE_ABSOLUTE, CDynamicSize::HT_SIZE_ABSOLUTE, {1, 1}})->commence(); + spacer->setGrow(true, false); + + bottomLayout->addChild(spacer); + + bottomLayout->addChild( // + CButtonBuilder::begin() + ->label("Copy Hyprland System Info") + ->onMainClick([](SP e) { + // FIXME: toolkit needs to provide clipboard stuff + + auto info = HyprlandIPC::getFromSocket("/systeminfo"); + + if (!info) { + e->rebuild()->label("Failed copying")->commence(); + return; + } + + CProcess proc("wl-copy", {*info}); + if (!proc.runAsync()) { // FIXME: why does runSync hang?! + e->rebuild()->label("Failed copying")->commence(); + return; + } + + e->rebuild()->label("Copied!")->commence(); + }) + ->commence() // + ); + + bottomLayout->addChild( // + CButtonBuilder::begin() + ->label("Exit") + ->onMainClick([w = WP{window}](SP e) { + w->close(); + backend->destroy(); + }) + ->commence() // + ); + + // + + bottomNull->addChild(bottomLayout); + window->m_rootElement->addChild(bottomNull); + + window->m_events.closeRequest.listenStatic([w = WP{window}] { + w->close(); + backend->destroy(); + }); + + window->open(); + + backend->enterLoop(); + + return 0; +} \ No newline at end of file diff --git a/src/main.qml b/src/main.qml deleted file mode 100644 index 18c9db3..0000000 --- a/src/main.qml +++ /dev/null @@ -1,207 +0,0 @@ -pragma ComponentBehavior: Bound - -import QtQuick -import QtQuick.Controls -import QtQuick.Layouts -import org.hyprland.systeminfo - -ApplicationWindow { - id: window - - FontMetrics { id: fontMetrics } - - property var firstPanelHeight: fontMetrics.height * 7 - - minimumWidth: Math.max(fontMetrics.height * 50, mainLayout.Layout.minimumWidth) + mainLayout.anchors.margins * 2 - minimumHeight: Math.max(fontMetrics.height * 30, mainLayout.Layout.minimumHeight) + mainLayout.anchors.margins * 2 - maximumWidth: minimumWidth - maximumHeight: minimumHeight - visible: true - - component Separator: Rectangle { - color: Qt.darker(window.palette.text, 1.5) - } - - component VSeparator: Separator { - implicitWidth: 1 - Layout.fillHeight: true - Layout.topMargin: fontMetrics.height - Layout.bottomMargin: fontMetrics.height - } - - component HSeparator: Separator { - implicitHeight: 1 - Layout.fillWidth: true - Layout.leftMargin: fontMetrics.height * 8 - Layout.rightMargin: fontMetrics.height * 8 - } - - SystemPalette { - id: system - colorGroup: SystemPalette.Active - } - - ColumnLayout { - id: mainLayout - spacing: fontMetrics.height - - anchors { - fill: parent - margins: 4 - } - - RowLayout { - // First panel hyprland and distro info - Layout.preferredHeight: firstPanelHeight - Layout.maximumHeight: firstPanelHeight - Layout.topMargin: fontMetrics.height - spacing: fontMetrics.height - - Item { Layout.fillWidth: true } - - RowLayout { - id: distroLogoName - spacing: fontMetrics.height - - Image { - visible: SystemInfo.systemLogoName != "" - source: "image://systemIcons/" + SystemInfo.systemLogoName - sourceSize.width: firstPanelHeight - sourceSize.height: firstPanelHeight - Layout.preferredWidth: firstPanelHeight - Layout.preferredHeight: firstPanelHeight - Layout.alignment: Qt.AlignCenter - smooth: true - } - - ColumnLayout { - id: distroText - - Layout.preferredWidth: hyprlandInfo.visible ? Math.max(Layout.minimumWidth, hyprlandText.Layout.minimumWidth) : Layout.minimumWidth - spacing: 2 - Layout.alignment: Qt.AlignVCenter - - Label { - color: system.windowText - text: SystemInfo.systemName - Layout.alignment: Qt.AlignHCenter - } - - Label { - color: system.windowText - text: SystemInfo.systemUrl - Layout.alignment: Qt.AlignHCenter - } - - Label { - color: system.windowText - text: SystemInfo.systemKernel - Layout.alignment: Qt.AlignHCenter - } - } - } - - Item { visible: hyprlandInfo.visible; Layout.fillWidth: true } - VSeparator { visible: hyprlandInfo.visible } - Item { visible: hyprlandInfo.visible; Layout.fillWidth: true } - - RowLayout { - id: hyprlandInfo - visible: SystemInfo.hyprlandVersionLong != "" - spacing: fontMetrics.height - - Image { - source: "qrc:/resource/hyprlandlogo.svg" - sourceSize.width: firstPanelHeight - sourceSize.height: firstPanelHeight - Layout.preferredWidth: firstPanelHeight - Layout.preferredHeight: firstPanelHeight - Layout.alignment: Qt.AlignCenter - smooth: true - } - - ColumnLayout { - id: hyprlandText - Layout.preferredWidth: Math.max(Layout.minimumWidth, distroText.Layout.minimumWidth) - spacing: 2 - Layout.alignment: Qt.AlignVCenter - - Label { - color: system.windowText - text: "Hyprland" - Layout.alignment: Qt.AlignHCenter - } - - Label { - color: system.windowText - text: SystemInfo.hyprlandVersion - Layout.alignment: Qt.AlignHCenter - } - - Label { - color: system.windowText - visible: SystemInfo.hyprlandVersion != text - text: SystemInfo.hyprlandVersionLong - Layout.alignment: Qt.AlignHCenter - } - } - } - - Item { Layout.fillWidth: true } - } - - HSeparator {} - - ColumnLayout { - spacing: 6 - Layout.leftMargin: fontMetrics.height * 4 - Layout.rightMargin: fontMetrics.height * 4 - - component DetailsLabel: Label { - color: system.windowText - Layout.fillWidth: true - elide: Text.ElideRight - wrapMode: Text.NoWrap - } - - DetailsLabel { text: "User: " + SystemInfo.user; visible: text != "" } - DetailsLabel { text: "Model: " + SystemInfo.model; visible: text != "" } - DetailsLabel { text: "CPU: " + SystemInfo.cpuInfo } - - Repeater { - model: SystemInfo.gpuInfo - - DetailsLabel { - required property string modelData - text: "GPU: " + modelData - } - } - - DetailsLabel { text: "Memory: " + SystemInfo.ramInfo } - DetailsLabel { text: "DE: " + SystemInfo.de } - DetailsLabel { text: "Uptime: " + SystemInfo.uptime } - DetailsLabel { text: "Displays: " + SystemInfo.screens } - } - - Item { Layout.fillHeight: true } - - HSeparator {} - - RowLayout { - visible: SystemInfo.hyprlandVersionLong != "" - spacing: 6 - Layout.leftMargin: 20 - Layout.rightMargin: 20 - - Button { - text: "Copy Hyprland System Info" - onClicked: SystemInfo.copySystemInfo(); - } - - Button { - text: "Copy Hyprland Version" - onClicked: SystemInfo.copyVersion(); - } - } - } -} diff --git a/src/util/Utils.cpp b/src/util/Utils.cpp deleted file mode 100644 index 22510b6..0000000 --- a/src/util/Utils.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "Utils.hpp" - -#include -#include -#include -#include -#include - -QString execAndGet(const QString& program, const QStringList& arguments, bool* ok) { - QProcess process; - process.setProcessChannelMode(QProcess::SeparateChannels); - process.start(program, arguments, QIODevice::ReadOnly); - - if (!process.waitForStarted(-1)) { - qCritical() << "Failed to start process" << program << arguments; - if (ok) - *ok = false; - - return ""; - } - - if (!process.waitForFinished(-1)) { - qCritical() << "Failed to run process" << program << arguments; - if (ok) - *ok = false; - - return ""; - } - - if (ok) - *ok = true; - return process.readAll(); -} - -std::optional readFile(const std::string& filename) { - try { - std::ifstream ifs(filename); - if (ifs.good()) { - std::string data(std::istreambuf_iterator{ifs}, {}); - ifs.close(); - return data; - } - } catch (...) {} - - return {}; -} diff --git a/src/util/Utils.hpp b/src/util/Utils.hpp deleted file mode 100644 index 8b268c2..0000000 --- a/src/util/Utils.hpp +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include -#include -#include - -QString execAndGet(const QString& program, const QStringList& arguments = {}, bool* ok = nullptr); -std::optional readFile(const std::string& filename); diff --git a/src/utils/HyprlandIPC.cpp b/src/utils/HyprlandIPC.cpp new file mode 100644 index 0000000..5074772 --- /dev/null +++ b/src/utils/HyprlandIPC.cpp @@ -0,0 +1,86 @@ +#include "HyprlandIPC.hpp" + +#include +#include +#include +#include +#include +#include + +#include + +#include + +using namespace Hyprutils::Memory; + +static int getUID() { + const auto UID = getuid(); + const auto PWUID = getpwuid(UID); + return PWUID ? PWUID->pw_uid : UID; +} + +static std::string getRuntimeDir() { + const auto XDG = getenv("XDG_RUNTIME_DIR"); + + if (!XDG) { + const std::string USERID = std::to_string(getUID()); + return "/run/user/" + USERID + "/hypr"; + } + + return std::string{XDG} + "/hypr"; +} + +std::expected HyprlandIPC::getFromSocket(const std::string& cmd) { + static const auto HIS = getenv("HYPRLAND_INSTANCE_SIGNATURE"); + + if (!HIS || HIS[0] == '\0') + return std::unexpected("HYPRLAND_INSTANCE_SIGNATURE empty: are we under hyprland?"); + + const auto SERVERSOCKET = socket(AF_UNIX, SOCK_STREAM, 0); + + auto t = timeval{.tv_sec = 5, .tv_usec = 0}; + setsockopt(SERVERSOCKET, SOL_SOCKET, SO_RCVTIMEO, &t, sizeof(struct timeval)); + + if (SERVERSOCKET < 0) + return std::unexpected("couldn't open a socket (1)"); + + sockaddr_un serverAddress = {0}; + serverAddress.sun_family = AF_UNIX; + + std::string socketPath = getRuntimeDir() + "/" + HIS + "/.socket.sock"; + + strncpy(serverAddress.sun_path, socketPath.c_str(), sizeof(serverAddress.sun_path) - 1); + + if (connect(SERVERSOCKET, rc(&serverAddress), SUN_LEN(&serverAddress)) < 0) + return std::unexpected(std::format("couldn't connect to the hyprland socket at {}", socketPath)); + + auto sizeWritten = write(SERVERSOCKET, cmd.c_str(), cmd.length()); + + if (sizeWritten < 0) + return std::unexpected("couldn't write (4)"); + + std::string reply = ""; + char buffer[8192] = {0}; + + sizeWritten = read(SERVERSOCKET, buffer, 8192); + + if (sizeWritten < 0) { + if (errno == EWOULDBLOCK) + return std::unexpected("Hyprland IPC didn't respond in time"); + return std::unexpected("couldn't read (5)"); + } + + reply += std::string(buffer, sizeWritten); + + while (sizeWritten == 8192) { + sizeWritten = read(SERVERSOCKET, buffer, 8192); + if (sizeWritten < 0) { + return std::unexpected("couldn't read (5)"); + } + reply += std::string(buffer, sizeWritten); + } + + close(SERVERSOCKET); + + return reply; +} diff --git a/src/utils/HyprlandIPC.hpp b/src/utils/HyprlandIPC.hpp new file mode 100644 index 0000000..a66e61d --- /dev/null +++ b/src/utils/HyprlandIPC.hpp @@ -0,0 +1,8 @@ +#pragma once + +#include +#include + +namespace HyprlandIPC { + std::expected getFromSocket(const std::string& cmd); +}; diff --git a/src/utils/SystemInfo.cpp b/src/utils/SystemInfo.cpp new file mode 100644 index 0000000..99eb112 --- /dev/null +++ b/src/utils/SystemInfo.cpp @@ -0,0 +1,358 @@ +#include "SystemInfo.hpp" + +#include +#include +#include + +#include +#include +#include + +#include "HyprlandIPC.hpp" +#include "../helpers/Logger.hpp" +#include "../icons/Icons.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Hyprutils::File; +using namespace Hyprutils::String; + +std::optional Info::getFromEtcOsRelease(const std::string_view& sv) { + static std::string content = ""; + static bool once = true; + + if (once) { + once = false; + + auto read = readFileAsString("/etc/os-release"); + content = read.value_or(""); + } + + static CVarList2 vars(std::move(content), 0, '\n', true); + + for (const auto& v : vars) { + if (v.starts_with(sv) && v.contains('=')) { + // found + auto value = trim(v.substr(v.find('=') + 1)); + + if (value.back() == value.front() && value.back() == '"') + value = value.substr(1, value.size() - 2); + + return std::string{value}; + } + } + + return std::nullopt; +} + +std::expected Info::getDistroLogoName() { + auto v = getFromEtcOsRelease("LOGO"); + if (!v) + return std::unexpected("Prop missing"); + return *v; +} + +std::string Info::kernel() { + struct utsname un; + + if (::uname(&un) != 0) + return ""; + + return std::string(un.release); +} + +std::string Info::desktop() { + static std::string x = [] -> std::string { + auto ENV = getenv("XDG_CURRENT_DESKTOP"); + + if (!ENV) + return "Unknown"; + + if (!std::string_view{ENV}.contains(':')) + return ENV; + + CVarList2 vl(ENV, 0, ':', true); + + return std::string{vl[0]}; + }(); + return x; +} + +std::string Info::desktopHome() { + static std::string x = [] -> std::string { + auto D = desktop(); + std::ranges::transform(D, D.begin(), ::tolower); + + if (D == "hyprland") + return "https://hypr.land/"; + if (D == "sway") + return "https://swaywm.org/"; + if (D == "wayfire") + return "https://wayfire.org/"; + if (D == "kde") + return "https://kde.org/"; + if (D == "gnome") + return "https://gnome.org/"; + + return ""; + }(); + return x; +} + +std::string Info::desktopVersion() { + static std::string x = [] -> std::string { + auto D = desktop(); + std::ranges::transform(D, D.begin(), ::tolower); + + if (D == "hyprland") { + auto res = HyprlandIPC::getFromSocket("j/version"); + + if (res) { + auto json = glz::read_json(*res); + if (json && json->contains("tag")) + return (*json)["tag"].get_string(); + } + } + + return ""; + }(); + return x; +} + +std::string Info::user() { + std::string username, host; + + uid_t uid = geteuid(); + struct passwd pwd, *result = NULL; + char buf[16384]; + + if (getpwuid_r(uid, &pwd, buf, sizeof(buf), &result) == 0 && result) + username = pwd.pw_name; + + if (gethostname(buf, sizeof(buf)) == 0) { + buf[HOST_NAME_MAX] = '\0'; + host = buf; + } + + return std::format("{}@{}", username, host); +} + +std::string Info::model() { + auto manu = cat("/sys/class/dmi/id/sys_vendor"); + auto model = cat("/sys/class/dmi/id/product_name"); + + if (manu && model) { + if (model->starts_with(*manu)) + return *model; + return std::format("{} {}", *manu, *model); + } + + if (manu) + return *manu; + if (model) + return *model; + return ""; +} + +std::optional Info::cat(const std::filesystem::path& p) { + auto f = readFileAsString(p.string()); + + if (!f) + return std::nullopt; + + return trim(*f); +} + +static std::string formatKHz(const uint64_t khz) { + if (khz >= 1000000) + return std::format("{:.1f}GHz", khz / 1000000.F); + return std::format("{:.1f}MHz", khz / 1000.F); +} + +static std::optional getFromCpuinfo(const std::string_view& sv) { + static std::string content = ""; + static bool once = true; + + if (once) { + once = false; + + auto read = readFileAsString("/proc/cpuinfo"); + content = read.value_or(""); + } + + static CVarList2 vars(std::move(content), 0, '\n', true); + + for (const auto& v : vars) { + if (v.starts_with(sv) && v.contains(':')) { + // found + auto value = trim(v.substr(v.find(':') + 2)); + + if (value.back() == value.front() && value.back() == '"') + value = value.substr(1, value.size() - 2); + + return std::string{value}; + } + } + + return std::nullopt; +} + +std::string Info::cpu() { + auto nproc = sysconf(_SC_NPROCESSORS_ONLN); + std::string hz = "?GHz"; + try { + hz = formatKHz(std::stoull(cat("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq").value())); + } catch (...) { + ; // oh well + } + + struct utsname u; + std::string arch; + if (uname(&u) == 0) + arch = u.machine; + + // try to read proc names from /proc/cpuinfo + std::string cpuname = getFromCpuinfo("model name").value_or("Unknown"); + + return std::format("{} {}x{} ({})", cpuname, nproc, hz, arch); +} + +static std::optional readU32Hex(const std::string& p) { + auto str = readFileAsString(p); + + if (!str) + return std::nullopt; + + auto s = std::move(*str); + + if (s.rfind("0x", 0) == 0) + s.erase(0, 2); + + try { + return sc(std::stoul(s, nullptr, 16)); + } catch (...) { return std::nullopt; } +} + +std::vector Info::gpus() { + glob_t g = {0}; + if (glob("/sys/class/drm/card[0-9]*", 0, NULL, &g) != 0) + return {}; + + struct pci_access* pacc = pci_alloc(); + pci_init(pacc); + pci_scan_bus(pacc); + + std::vector gpuNames; + + for (size_t i = 0; i < g.gl_pathc; i++) { + const char* cardpath = g.gl_pathv[i]; + + std::filesystem::path vendorPath = std::filesystem::path{cardpath} / "device" / "vendor"; + std::filesystem::path devicePath = std::filesystem::path{cardpath} / "device" / "device"; + std::filesystem::path classPath = std::filesystem::path{cardpath} / "device" / "class"; + + uint32_t vendor = 0, device = 0; + + if (auto ret = readU32Hex(vendorPath.string()); ret) + vendor = *ret; + else + continue; + + if (auto ret = readU32Hex(devicePath.string()); ret) + device = *ret; + else + continue; + + if (auto ret = readU32Hex(classPath.string()); ret) { + if (((*ret) & 0xFF0000u) != 0x030000u) // only keep PCI class 0x03xxxx (display controller) + continue; + } + + static char namebuf[512] = {0}; + pci_lookup_name(pacc, namebuf, sizeof(namebuf), PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE, vendor, device); + + gpuNames.emplace_back(namebuf); + } + + pci_cleanup(pacc); + globfree(&g); + + return gpuNames; +} + +static uint64_t toBytes(uint64_t v, uint64_t unit) { + return v * unit; +} + +static std::string formatBytes(uint64_t bytes) { + // If you have more than 1TiB of RAM then holy fucking shit + if (bytes > 1024 * 1024 * 1024 * 1024ULL) + return std::format("{:.1f}TiB", bytes / sc(1024 * 1024 * 1024 * 1024ULL)); + if (bytes > 1024 * 1024 * 1024) + return std::format("{:.1f}GiB", bytes / sc(1024 * 1024 * 1024)); + if (bytes > 1024 * 1024) + return std::format("{:.1f}MiB", bytes / sc(1024 * 1024)); + if (bytes > 1024) + return std::format("{:.1f}KiB", bytes / sc(1024)); + return std::format("{}B", bytes); +} + +std::string Info::mem() { + struct sysinfo info{}; + if (sysinfo(&info) != 0) + return ""; + + const auto TOTAL = toBytes(info.totalram, info.mem_unit); + auto FREE = toBytes(info.freeram + info.bufferram, info.mem_unit); + + if (const auto meminfo = cat("/proc/meminfo"); meminfo) { + CVarList2 vl(std::string{*meminfo}, 0, '\n', true, true); + for (const auto& l : vl) { + if (!l.starts_with("MemAvailable")) + continue; + + CVarList2 ln(std::string{l}, 0, 's', true, false); + + try { + FREE = toBytes(std::stoull(std::string{ln[1]}), 1000); + } catch (...) {} + break; + } + } + + return std::format("{} / {} ({:.0f}% used)", formatBytes(TOTAL - FREE), formatBytes(TOTAL), sc((TOTAL - FREE) / sc(TOTAL)) * 100.F); +} + +std::string Info::uptime() { + struct sysinfo info{}; + if (::sysinfo(&info) != 0) + return ""; + + uint64_t s = sc(info.uptime); + + const auto DAYS = s / 86400; + s %= 86400; + const auto HRS = s / 3600; + s %= 3600; + const auto MINS = s / 60; + s %= 60; + + return std::format("{} days, {} hours, {} minutes", DAYS, HRS, MINS); +} + +std::optional> Info::deLogo() { + const auto DE = desktop(); + + if (DE == "Hyprland") + return std::span{Icons::HYPRLAND_LOGO, sizeof(Icons::HYPRLAND_LOGO)}; + + return std::nullopt; +} diff --git a/src/utils/SystemInfo.hpp b/src/utils/SystemInfo.hpp new file mode 100644 index 0000000..16bfa6c --- /dev/null +++ b/src/utils/SystemInfo.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace Info { + std::expected getDistroLogoName(); + std::optional getFromEtcOsRelease(const std::string_view& sv); + std::string kernel(); + std::string desktop(); + std::string desktopHome(); + std::string desktopVersion(); + std::string user(); + std::optional cat(const std::filesystem::path& p); + std::string model(); + std::string cpu(); + std::vector gpus(); + std::string mem(); + std::string uptime(); + std::optional> deLogo(); +}; \ No newline at end of file