Skip to content

Commit 34a758f

Browse files
authored
core: Add integration with hyprutils' cli::logger (#21)
1 parent 5cfe074 commit 34a758f

File tree

9 files changed

+122
-95
lines changed

9 files changed

+122
-95
lines changed

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pkg_check_modules(
2828
wayland-client
2929
wayland-protocols
3030
egl
31-
hyprutils>=0.9.0
31+
hyprutils>=0.10.4
3232
hyprlang>=0.6.0
3333
pixman-1
3434
libdrm
@@ -39,7 +39,7 @@ pkg_check_modules(
3939
pangocairo
4040
iniparser
4141
hyprgraphics>=0.3.0
42-
aquamarine>=0.9.5)
42+
aquamarine>=0.10.0)
4343

4444
configure_file(hyprtoolkit.pc.in hyprtoolkit.pc @ONLY)
4545

flake.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

include/hyprtoolkit/core/Backend.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <hyprutils/memory/SharedPtr.hpp>
44
#include <hyprutils/memory/Atomic.hpp>
5+
#include <hyprutils/cli/Logger.hpp>
56
#include <aquamarine/backend/Null.hpp>
67
#include <aquamarine/backend/Backend.hpp>
78
#include <functional>
@@ -28,12 +29,19 @@ namespace Hyprtoolkit {
2829

2930
using LogFn = std::function<void(eLogLevel, const std::string&)>;
3031

32+
struct SBackendCreationData {
33+
explicit SBackendCreationData();
34+
35+
Hyprutils::Memory::CSharedPointer<Hyprutils::CLI::CLoggerConnection> pLogConnection;
36+
};
37+
3138
/*
3239
Create a backend.
3340
There can only be one backend per process: In case of another create(),
3441
it will fail.
3542
*/
3643
static Hyprutils::Memory::CSharedPointer<IBackend> create();
44+
static Hyprutils::Memory::CSharedPointer<IBackend> createWithData(const SBackendCreationData& data);
3745

3846
/*
3947
Destroy the backend.

src/core/Backend.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,15 @@ using namespace Hyprutils::Memory;
3030
#define SP CSharedPointer
3131
#define WP CWeakPointer
3232

33-
static void aqLog(Aquamarine::eBackendLogLevel level, std::string msg) {
34-
if (Env::envEnabled("HT_QUIET"))
35-
return;
36-
37-
if (g_logger)
38-
g_logger->log(HT_LOG_DEBUG, "[AQ] {}", msg);
39-
else
40-
std::println("{}", msg);
41-
}
42-
4333
CBackend::CBackend() {
4434
pipe(m_sLoopState.exitfd);
4535
pipe(m_sLoopState.wakeupfd);
4636

4737
Aquamarine::SBackendOptions options{};
48-
options.logFunction = ::aqLog;
38+
g_logger->m_aqLoggerConnection = makeShared<Hyprutils::CLI::CLoggerConnection>(g_logger->m_logger);
39+
g_logger->m_aqLoggerConnection->setLogLevel(Hyprutils::CLI::LOG_WARN); // don't print debug logs, unless AQ_TRACE is set, then aq will set it
40+
g_logger->m_aqLoggerConnection->setName("aquamarine");
41+
options.logConnection = g_logger->m_aqLoggerConnection;
4942

5043
std::vector<Aquamarine::SBackendImplementationOptions> implementations;
5144
Aquamarine::SBackendImplementationOptions option;
@@ -65,11 +58,18 @@ CBackend::~CBackend() {
6558
close(m_sLoopState.wakeupfd[1]);
6659
}
6760

61+
IBackend::SBackendCreationData::SBackendCreationData() = default;
62+
63+
SP<IBackend> IBackend::createWithData(const IBackend::SBackendCreationData& data) {
64+
g_logger->m_loggerConnection = data.pLogConnection;
65+
g_logger->updateLogLevel();
66+
return IBackend::create();
67+
}
68+
6869
SP<IBackend> IBackend::create() {
6970
if (g_backend)
7071
return nullptr;
7172
g_backend = SP<CBackend>(new CBackend());
72-
g_logger = SP<CBackendLogger>(new CBackendLogger());
7373
g_config = makeShared<CConfigManager>();
7474
g_config->parse();
7575
g_palette = CPalette::palette();
@@ -94,7 +94,7 @@ void CBackend::destroy() {
9494
}
9595

9696
void CBackend::setLogFn(LogFn&& fn) {
97-
m_logFn = std::move(fn);
97+
g_logger->m_logFn = std::move(fn);
9898
}
9999

100100
SP<CPalette> CBackend::getPalette() {

src/core/Backend.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <hyprtoolkit/core/Backend.hpp>
44
#include <hyprutils/os/FileDescriptor.hpp>
5+
#include <hyprutils/cli/Logger.hpp>
56
#include <hyprgraphics/resource/AsyncResourceGatherer.hpp>
67

78
#include "../helpers/Env.hpp"
@@ -48,8 +49,6 @@ namespace Hyprtoolkit {
4849

4950
Hyprutils::Memory::CSharedPointer<Aquamarine::CBackend> m_aqBackend;
5051

51-
LogFn m_logFn;
52-
5352
bool m_terminate = false;
5453
bool m_needsConfigReload = false;
5554

src/core/InternalBackend.cpp

Lines changed: 0 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -9,49 +9,3 @@ using namespace Hyprtoolkit;
99

1010
IBackend::~IBackend() = default;
1111
IBackend::IBackend() = default;
12-
13-
void CBackendLogger::log(eLogLevel level, std::string str) {
14-
if (Env::envEnabled("HT_QUIET"))
15-
return;
16-
17-
if (g_backend->m_logFn) {
18-
g_backend->m_logFn(level, str);
19-
return;
20-
}
21-
22-
std::string coloredStr = str;
23-
//NOLINTBEGIN
24-
switch (level) {
25-
case HT_LOG_TRACE:
26-
str = "[HT] TRACE: " + str;
27-
coloredStr = str;
28-
break;
29-
case HT_LOG_DEBUG:
30-
str = "[HT] DEBUG: " + str;
31-
coloredStr = "\033[1;33m" + str + "\033[0m"; // yellow
32-
break;
33-
case HT_LOG_WARNING:
34-
str = "[HT] WARN: " + str;
35-
coloredStr = "\033[1;33m" + str + "\033[0m"; // yellow
36-
break;
37-
case HT_LOG_ERROR:
38-
str = "[HT] ERR: " + str;
39-
coloredStr = "\033[1;31m" + str + "\033[0m"; // red
40-
break;
41-
case HT_LOG_CRITICAL:
42-
str = "[HT] CRIT: " + str;
43-
coloredStr = "\033[1;35m" + str + "\033[0m"; // magenta
44-
break;
45-
default: break;
46-
}
47-
//NOLINTEND
48-
49-
static bool LOG_NO_COLOR = Env::envEnabled("HT_NO_COLOR_LOGS");
50-
51-
if (LOG_NO_COLOR)
52-
std::println("{}", coloredStr);
53-
else
54-
std::println("{}", str);
55-
56-
std::fflush(stdout);
57-
}

src/core/InternalBackend.hpp

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,15 @@
66

77
#include "Backend.hpp"
88
#include "../helpers/Env.hpp"
9+
#include "Logger.hpp"
910

1011
namespace Hyprtoolkit {
1112

1213
class CPalette;
1314
class CConfigManager;
1415
class CSystemIconFactory;
1516

16-
class CBackendLogger {
17-
public:
18-
void log(eLogLevel level, std::string str);
19-
20-
template <typename... Args>
21-
//NOLINTNEXTLINE
22-
void log(eLogLevel level, std::format_string<Args...> fmt, Args&&... args) {
23-
static bool LOG_DISABLED = Env::envEnabled("HT_NO_LOGS");
24-
25-
if (LOG_DISABLED)
26-
return;
27-
28-
std::string logMsg = "";
29-
30-
// no need for try {} catch {} because std::format_string<Args...> ensures that vformat never throw std::format_error
31-
// because
32-
// 1. any faulty format specifier that sucks will cause a compilation error.
33-
// 2. and `std::bad_alloc` is catastrophic, (Almost any operation in stdlib could throw this.)
34-
// 3. this is actually what std::format in stdlib does
35-
logMsg += std::vformat(fmt.get(), std::make_format_args(args...));
36-
37-
log(level, logMsg);
38-
}
39-
};
40-
4117
inline Hyprutils::Memory::CSharedPointer<Hyprtoolkit::CBackend> g_backend;
42-
inline Hyprutils::Memory::CSharedPointer<Hyprtoolkit::CBackendLogger> g_logger;
4318
inline Hyprutils::Memory::CSharedPointer<Hyprgraphics::CAsyncResourceGatherer> g_asyncResourceGatherer;
4419
inline Hyprutils::Memory::CSharedPointer<CPalette> g_palette;
4520
inline Hyprutils::Memory::CSharedPointer<CConfigManager> g_config;

src/core/Logger.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include "Logger.hpp"
2+
3+
using namespace Hyprtoolkit;
4+
5+
static Hyprutils::CLI::eLogLevel levelToHU(eLogLevel l) {
6+
switch (l) {
7+
case Hyprtoolkit::HT_LOG_DEBUG: return Hyprutils::CLI::LOG_DEBUG;
8+
case Hyprtoolkit::HT_LOG_ERROR: return Hyprutils::CLI::LOG_ERR;
9+
case Hyprtoolkit::HT_LOG_WARNING: return Hyprutils::CLI::LOG_WARN;
10+
case Hyprtoolkit::HT_LOG_CRITICAL: return Hyprutils::CLI::LOG_CRIT;
11+
case Hyprtoolkit::HT_LOG_TRACE: return Hyprutils::CLI::LOG_TRACE;
12+
}
13+
return Hyprutils::CLI::LOG_DEBUG;
14+
}
15+
16+
CLogger::CLogger() {
17+
const auto IS_TRACE = Env::isTrace();
18+
m_logger.setLogLevel(IS_TRACE ? Hyprutils::CLI::LOG_TRACE : Hyprutils::CLI::LOG_DEBUG);
19+
}
20+
21+
void CLogger::updateLogLevel() {
22+
const auto IS_TRACE = Env::isTrace();
23+
if (m_loggerConnection && IS_TRACE)
24+
m_loggerConnection->setLogLevel(Hyprutils::CLI::LOG_TRACE);
25+
}
26+
27+
void CLogger::log(eLogLevel level, const std::string& str) {
28+
static const bool IS_QUIET = Env::envEnabled("HT_QUIET");
29+
if (IS_QUIET)
30+
return;
31+
32+
if (m_logFn) {
33+
m_logFn(level, str);
34+
return;
35+
}
36+
37+
if (m_loggerConnection) {
38+
m_loggerConnection->log(levelToHU(level), str);
39+
return;
40+
}
41+
42+
m_logger.log(levelToHU(level), str);
43+
}

src/core/Logger.hpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#pragma once
2+
3+
#include <hyprtoolkit/core/LogTypes.hpp>
4+
#include <hyprtoolkit/core/Backend.hpp>
5+
6+
#include <hyprutils/cli/Logger.hpp>
7+
#include <optional>
8+
9+
#include "../helpers/Env.hpp"
10+
11+
namespace Hyprtoolkit {
12+
class CLogger {
13+
public:
14+
CLogger();
15+
~CLogger() = default;
16+
17+
void log(eLogLevel level, const std::string& str);
18+
19+
template <typename... Args>
20+
//NOLINTNEXTLINE
21+
void log(eLogLevel level, std::format_string<Args...> fmt, Args&&... args) {
22+
static bool LOG_DISABLED = Env::envEnabled("HT_NO_LOGS");
23+
24+
if (LOG_DISABLED)
25+
return;
26+
27+
std::string logMsg = "";
28+
29+
// no need for try {} catch {} because std::format_string<Args...> ensures that vformat never throw std::format_error
30+
// because
31+
// 1. any faulty format specifier that sucks will cause a compilation error.
32+
// 2. and `std::bad_alloc` is catastrophic, (Almost any operation in stdlib could throw this.)
33+
// 3. this is actually what std::format in stdlib does
34+
logMsg += std::vformat(fmt.get(), std::make_format_args(args...));
35+
36+
log(level, logMsg);
37+
}
38+
39+
void updateLogLevel();
40+
41+
Hyprutils::CLI::CLogger m_logger;
42+
IBackend::LogFn m_logFn;
43+
Hyprutils::Memory::CSharedPointer<Hyprutils::CLI::CLoggerConnection> m_loggerConnection;
44+
Hyprutils::Memory::CSharedPointer<Hyprutils::CLI::CLoggerConnection> m_aqLoggerConnection;
45+
};
46+
47+
inline Hyprutils::Memory::CSharedPointer<CLogger> g_logger = Hyprutils::Memory::makeShared<CLogger>();
48+
};

0 commit comments

Comments
 (0)