ugghghghgh
This commit is contained in:
parent
f9a9491da3
commit
8cbc00372d
|
@ -156,6 +156,8 @@
|
||||||
]
|
]
|
||||||
++ deps;
|
++ deps;
|
||||||
|
|
||||||
|
LD_LIBRARY_PATH = "${pkgs.lib.makeLibraryPath deps}";
|
||||||
|
|
||||||
name = "C++";
|
name = "C++";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ namespace {
|
||||||
const string& host = GetHost();
|
const string& host = GetHost();
|
||||||
const string& kernelVersion = GetKernelVersion();
|
const string& kernelVersion = GetKernelVersion();
|
||||||
const string& osVersion = GetOSVersion();
|
const string& osVersion = GetOSVersion();
|
||||||
const u64 memInfo = GetMemInfo();
|
const u64 memInfo = GetMemInfo().value_or(0);
|
||||||
const string& desktopEnvironment = GetDesktopEnvironment();
|
const string& desktopEnvironment = GetDesktopEnvironment();
|
||||||
const string& windowManager = GetWindowManager();
|
const string& windowManager = GetWindowManager();
|
||||||
const bool nowPlayingEnabled = config.now_playing.get().enabled;
|
const bool nowPlayingEnabled = config.now_playing.get().enabled;
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
#include <expected>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
@ -25,59 +26,6 @@ namespace fs = std::filesystem;
|
||||||
enum SessionType : u8 { Wayland, X11, TTY, Unknown };
|
enum SessionType : u8 { Wayland, X11, TTY, Unknown };
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
fn MeminfoParse() -> u64 {
|
|
||||||
constexpr const char* path = "/proc/meminfo";
|
|
||||||
|
|
||||||
std::ifstream input(path);
|
|
||||||
if (!input.is_open()) {
|
|
||||||
ERROR_LOG("Failed to open {}", path);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
string line;
|
|
||||||
while (std::getline(input, line)) {
|
|
||||||
if (line.starts_with("MemTotal")) {
|
|
||||||
const size_t colonPos = line.find(':');
|
|
||||||
if (colonPos == std::string::npos) {
|
|
||||||
ERROR_LOG("Invalid MemTotal line: no colon found");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string_view view(line);
|
|
||||||
view.remove_prefix(colonPos + 1);
|
|
||||||
|
|
||||||
// Trim leading whitespace
|
|
||||||
const size_t firstNonSpace = view.find_first_not_of(' ');
|
|
||||||
if (firstNonSpace == std::string_view::npos) {
|
|
||||||
ERROR_LOG("No number found after colon in MemTotal line");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
view.remove_prefix(firstNonSpace);
|
|
||||||
|
|
||||||
// Find the end of the numeric part
|
|
||||||
const size_t end = view.find_first_not_of("0123456789");
|
|
||||||
if (end != std::string_view::npos)
|
|
||||||
view = view.substr(0, end);
|
|
||||||
|
|
||||||
// Get pointers via iterators
|
|
||||||
const char* startPtr = &*view.begin(); // Safe iterator-to-pointer conversion
|
|
||||||
const char* endPtr = &*view.end(); // No manual arithmetic
|
|
||||||
|
|
||||||
u64 value = 0;
|
|
||||||
const auto result = std::from_chars(startPtr, endPtr, value);
|
|
||||||
if (result.ec != std::errc() || result.ptr != endPtr) {
|
|
||||||
ERROR_LOG("Failed to parse number in MemTotal line");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ERROR_LOG("MemTotal line not found in {}", path);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn GetMprisPlayers(sdbus::IConnection& connection) -> std::vector<string> {
|
fn GetMprisPlayers(sdbus::IConnection& connection) -> std::vector<string> {
|
||||||
const sdbus::ServiceName dbusInterface = sdbus::ServiceName("org.freedesktop.DBus");
|
const sdbus::ServiceName dbusInterface = sdbus::ServiceName("org.freedesktop.DBus");
|
||||||
const sdbus::ObjectPath dbusObjectPath = sdbus::ObjectPath("/org/freedesktop/DBus");
|
const sdbus::ObjectPath dbusObjectPath = sdbus::ObjectPath("/org/freedesktop/DBus");
|
||||||
|
@ -450,7 +398,49 @@ fn GetOSVersion() -> string {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
fn GetMemInfo() -> u64 { return MeminfoParse() * 1024; }
|
fn GetMemInfo() -> std::expected<u64, string> {
|
||||||
|
constexpr const char* path = "/proc/meminfo";
|
||||||
|
|
||||||
|
std::ifstream input(path);
|
||||||
|
if (!input.is_open())
|
||||||
|
return std::unexpected("Failed to open " + std::string(path));
|
||||||
|
|
||||||
|
std::string line;
|
||||||
|
while (std::getline(input, line)) {
|
||||||
|
if (line.starts_with("MemTotal")) {
|
||||||
|
const size_t colonPos = line.find(':');
|
||||||
|
if (colonPos == std::string::npos)
|
||||||
|
return std::unexpected("Invalid MemTotal line: no colon found");
|
||||||
|
|
||||||
|
std::string_view view(line);
|
||||||
|
view.remove_prefix(colonPos + 1);
|
||||||
|
|
||||||
|
// Trim leading whitespace
|
||||||
|
const size_t firstNonSpace = view.find_first_not_of(' ');
|
||||||
|
if (firstNonSpace == std::string_view::npos)
|
||||||
|
return std::unexpected("No number found after colon in MemTotal line");
|
||||||
|
view.remove_prefix(firstNonSpace);
|
||||||
|
|
||||||
|
// Find the end of the numeric part
|
||||||
|
const size_t end = view.find_first_not_of("0123456789");
|
||||||
|
if (end != std::string_view::npos)
|
||||||
|
view = view.substr(0, end);
|
||||||
|
|
||||||
|
// Get pointers via iterators
|
||||||
|
const char* startPtr = &*view.begin();
|
||||||
|
const char* endPtr = &*view.end();
|
||||||
|
|
||||||
|
u64 value = 0;
|
||||||
|
const auto result = std::from_chars(startPtr, endPtr, value);
|
||||||
|
if (result.ec != std::errc() || result.ptr != endPtr)
|
||||||
|
return std::unexpected("Failed to parse number in MemTotal line");
|
||||||
|
|
||||||
|
return value * 1024;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::unexpected("MemTotal line not found in " + std::string(path));
|
||||||
|
}
|
||||||
|
|
||||||
fn GetNowPlaying() -> string {
|
fn GetNowPlaying() -> string {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
#include "src/os/linux/pkg_count.h"
|
||||||
|
|
||||||
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
|
fn GetApkPackageCount() -> std::optional<usize> {
|
||||||
|
fs::path apkDbPath("/lib/apk/db/installed");
|
||||||
|
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
|
@ -1,28 +1,33 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "src/util/macros.h"
|
||||||
|
|
||||||
// Get package count from dpkg (Debian/Ubuntu)
|
// Get package count from dpkg (Debian/Ubuntu)
|
||||||
int get_dpkg_package_count();
|
fn GetDpkgPackageCount() -> std::optional<usize>;
|
||||||
|
|
||||||
// Get package count from RPM (Red Hat/Fedora/CentOS)
|
// Get package count from RPM (Red Hat/Fedora/CentOS)
|
||||||
int get_rpm_package_count();
|
fn GetRpmPackageCount() -> std::optional<usize>;
|
||||||
|
|
||||||
// Get package count from pacman (Arch Linux)
|
// Get package count from pacman (Arch Linux)
|
||||||
int get_pacman_package_count();
|
fn GetPacmanPackageCount() -> std::optional<usize>;
|
||||||
|
|
||||||
// Get package count from Portage (Gentoo)
|
// Get package count from Portage (Gentoo)
|
||||||
int get_portage_package_count();
|
fn GetPortagePackageCount() -> std::optional<usize>;
|
||||||
|
|
||||||
// Get package count from zypper (openSUSE)
|
// Get package count from zypper (openSUSE)
|
||||||
int get_zypper_package_count();
|
fn GetZypperPackageCount() -> std::optional<usize>;
|
||||||
|
|
||||||
|
// Get package count from apk (Alpine)
|
||||||
|
fn GetApkPackageCount() -> std::optional<usize>;
|
||||||
|
|
||||||
// Get package count from flatpak
|
// Get package count from flatpak
|
||||||
int get_flatpak_package_count();
|
fn GetFlatpakPackageCount() -> std::optional<usize>;
|
||||||
|
|
||||||
// Get package count from snap
|
// Get package count from snap
|
||||||
int get_snap_package_count();
|
fn GetSnapPackageCount() -> std::optional<usize>;
|
||||||
|
|
||||||
// Get package count from AppImage
|
// Get package count from AppImage
|
||||||
int get_appimage_package_count();
|
fn GetAppimagePackageCount() -> std::optional<usize>;
|
||||||
|
|
||||||
// Get total package count from all available package managers
|
// Get total package count from all available package managers
|
||||||
fn GetTotalPackageCount() -> int;
|
fn GetTotalPackageCount() -> std::optional<usize>;
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <expected>
|
||||||
|
|
||||||
#include "../util/macros.h"
|
#include "../util/macros.h"
|
||||||
#include "../util/types.h"
|
#include "../util/types.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the amount of installed RAM in bytes.
|
* @brief Get the amount of installed RAM in bytes.
|
||||||
*/
|
*/
|
||||||
fn GetMemInfo() -> u64;
|
fn GetMemInfo() -> std::expected<u64, string>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get the currently playing song metadata.
|
* @brief Get the currently playing song metadata.
|
||||||
|
|
Loading…
Reference in a new issue