Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 26 additions & 26 deletions src/common/include/displaydevice/logging.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,14 +14,14 @@ namespace display_device {
*
* @note A lazy-evaluated, correctly-destroyed, thread-safe singleton pattern is used here (https://stackoverflow.com/a/1008289).
*/
class logger_t {
class Logger {
public:
/**
* @brief Defines the possible log levels.
* @note Level implicitly includes all other levels below it.
* @note All levels are in lower-case on purpose to fit the "BOOST_LOG(info)" style.
*/
enum class log_level_e {
enum class LogLevel {
verbose = 0,
debug,
info,
Expand All@@ -32,18 +32,18 @@ namespace display_device {
/**
* @brief Defines the callback type for log data re-routing.
*/
using callback_t = std::function<void(const log_level_e, std::string)>;
using Callback = std::function<void(LogLevel, std::string)>;

/**
* @brief Get the singleton instance.
* @returns Singleton instance for the class.
*
* EXAMPLES:
* ```cpp
* logger_t& logger { logger_t::get() };
* Logger& logger { Logger::get() };
* ```
*/
static logger_t &
static Logger &
get();

/**
Expand All@@ -52,11 +52,11 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_log_level(logger_t::log_level_e::Info);
* Logger::get().setLogLevel(Logger::LogLevel::Info);
* ```
*/
void
set_log_level(log_level_e log_level);
setLogLevel(LogLevel log_level);

/**
* @brief Check if log level is currently enabled.
Expand All@@ -65,25 +65,25 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* const bool is_enabled { logger_t::get().is_log_level_enabled(logger_t::log_level_e::Info) };
* const bool is_enabled { Logger::get().isLogLevelEnabled(Logger::LogLevel::Info) };
* ```
*/
[[nodiscard]] bool
is_log_level_enabled(log_level_e log_level) const;
isLogLevelEnabled(LogLevel log_level) const;

/**
* @brief Set custom callback for writing the logs.
* @param callback New callback to be used or nullptr to reset to the default.
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_custom_callback([](const log_level_e level, std::string value){
* Logger::get().setCustomCallback([](const LogLevel level, std::string value){
* // write to file or something
* });
* ```
*/
void
set_custom_callback(callback_t callback);
setCustomCallback(Callback callback);

/**
* @brief Write the string to the output (via callback) if the log level is enabled.
Expand All@@ -92,65 +92,65 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().write(logger_t::log_level_e::Info, "Hello World!");
* Logger::get().write(Logger::LogLevel::Info, "Hello World!");
* ```
*/
void
write(log_level_e log_level, std::string value);
write(LogLevel log_level, std::string value);

/**
* @brief A deleted copy constructor for singleton pattern.
* @note Public to ensure better compiler error message.
*/
logger_t(logger_t const &) = delete;
Logger(Logger const &) = delete;

/**
* @brief A deleted assignment operator for singleton pattern.
* @note Public to ensure better compiler error message.
*/
void
operator=(logger_t const &) = delete;
operator=(Logger const &) = delete;

private:
/**
* @brief A private constructor to ensure the singleton pattern.
*/
explicit logger_t();
explicit Logger();

log_level_e m_enabled_log_level; /**< The currently enabled log level. */
callback_t m_custom_callback; /**< Custom callback to pass log data to. */
LogLevel m_enabled_log_level; /**< The currently enabled log level. */
Callback m_custom_callback; /**< Custom callback to pass log data to. */
};

/**
* @brief A helper class for accumulating output via the stream operator and then writing it out at once.
*/
class log_writer_t {
class LogWriter {
public:
/**
* @brief Constructor scoped writer utility.
* @param log_level Level to be used when writing out the output.
*/
explicit log_writer_t(logger_t::log_level_e log_level);
explicit LogWriter(Logger::LogLevel log_level);

/**
* @brief Write out the accumulated output.
*/
virtual ~log_writer_t();
virtual ~LogWriter();

/**
* @brief Stream value to the buffer.
* @param value Arbitrary value to be written to the buffer.
* @returns Reference to the writer utility for chaining the operators.
*/
template <class T>
log_writer_t &
LogWriter &
operator<<(T &&value) {
m_buffer << std::forward<T>(value);
return *this;
}

private:
logger_t::log_level_e m_log_level; /**< Log level to be used. */
Logger::LogLevel m_log_level; /**< Log level to be used. */
std::ostringstream m_buffer; /**< Buffer to hold all the output. */
};
} // namespace display_device
Expand All@@ -164,6 +164,6 @@ namespace display_device {
* DD_LOG(error) << "OH MY GAWD!";
* ```
*/
#define DD_LOG(level) \
for (bool is_enabled { display_device::logger_t::get().is_log_level_enabled(display_device::logger_t::log_level_e::level) }; is_enabled; is_enabled = false) \
display_device::log_writer_t(display_device::logger_t::log_level_e::level)
#define DD_LOG(level) \
for (bool is_enabled { display_device::Logger::get().isLogLevelEnabled(display_device::Logger::LogLevel::level) }; is_enabled; is_enabled = false) \
display_device::LogWriter(display_device::Logger::LogLevel::level)
40 changes: 20 additions & 20 deletions src/common/logging.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,32 +8,32 @@
#include <mutex>

namespace display_device {
logger_t &
logger_t::get() {
static logger_t instance;
Logger &
Logger::get() {
static Logger instance;
return instance;
}

void
logger_t::set_log_level(const log_level_e log_level) {
Logger::setLogLevel(LogLevel log_level) {
m_enabled_log_level = log_level;
}

bool
logger_t::is_log_level_enabled(const log_level_e log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<log_level_e>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<log_level_e>>(m_enabled_log_level) };
Logger::isLogLevelEnabled(LogLevel log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<LogLevel>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<LogLevel>>(m_enabled_log_level) };
return log_level_v >= enabled_log_level_v;
}

void
logger_t::set_custom_callback(callback_t callback) {
Logger::setCustomCallback(Callback callback) {
m_custom_callback = std::move(callback);
}

void
logger_t::write(const log_level_e log_level, std::string value) {
if (!is_log_level_enabled(log_level)) {
Logger::write(const LogLevel log_level, std::string value) {
if (!isLogLevelEnabled(log_level)) {
return;
}

Expand DownExpand Up@@ -70,19 +70,19 @@ namespace display_device {

// Log level
switch (log_level) {
case log_level_e::verbose:
case LogLevel::verbose:
stream << "VERBOSE: ";
break;
case log_level_e::debug:
case LogLevel::debug:
stream << "DEBUG: ";
break;
case log_level_e::info:
case LogLevel::info:
stream << "INFO: ";
break;
case log_level_e::warning:
case LogLevel::warning:
stream << "WARNING: ";
break;
case log_level_e::error:
case LogLevel::error:
stream << "ERROR: ";
break;
default:
Expand All@@ -98,14 +98,14 @@ namespace display_device {
std::cout << stream.rdbuf() << std::endl;
}

logger_t::logger_t():
m_enabled_log_level { log_level_e::info } {
Logger::Logger():
m_enabled_log_level { LogLevel::info } {
}

log_writer_t::log_writer_t(const logger_t::log_level_e log_level):
LogWriter::LogWriter(const Logger::LogLevel log_level):
m_log_level { log_level } {}

log_writer_t::~log_writer_t() {
logger_t::get().write(m_log_level, m_buffer.str());
LogWriter::~LogWriter() {
Logger::get().write(m_log_level, m_buffer.str());
}
} // namespace display_device
26 changes: 13 additions & 13 deletions src/windows/include/displaydevice/windows/winapilayer.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,28 +9,28 @@ namespace display_device {
*/
class WinApiLayer: public WinApiLayerInterface {
public:
/** For details @see WinApiLayerInterface::get_error_string */
/** For details @see WinApiLayerInterface::getErrorString */
[[nodiscard]] std::string
get_error_string(LONG error_code) const override;
getErrorString(LONG error_code) const override;

/** For details @see WinApiLayerInterface::query_display_config */
[[nodiscard]] std::optional<path_and_mode_data_t>
query_display_config(query_type_e type) const override;
/** For details @see WinApiLayerInterface::queryDisplayConfig */
[[nodiscard]] std::optional<PathAndModeData>
queryDisplayConfig(QueryType type) const override;

/** For details @see WinApiLayerInterface::get_device_id */
/** For details @see WinApiLayerInterface::getDeviceId */
[[nodiscard]] std::string
get_device_id(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDeviceId(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_monitor_device_path */
/** For details @see WinApiLayerInterface::getMonitorDevicePath */
[[nodiscard]] std::string
get_monitor_device_path(const DISPLAYCONFIG_PATH_INFO &path) const override;
getMonitorDevicePath(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_friendly_name */
/** For details @see WinApiLayerInterface::getFriendlyName */
[[nodiscard]] std::string
get_friendly_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getFriendlyName(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_display_name */
/** For details @see WinApiLayerInterface::getDisplayName */
[[nodiscard]] std::string
get_display_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDisplayName(const DISPLAYCONFIG_PATH_INFO &path) const override;
};
} // namespace display_device
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 26 additions & 26 deletions src/common/include/displaydevice/logging.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,14 +14,14 @@ namespace display_device {
*
* @note A lazy-evaluated, correctly-destroyed, thread-safe singleton pattern is used here (https://stackoverflow.com/a/1008289).
*/
class logger_t {
class Logger {
public:
/**
* @brief Defines the possible log levels.
* @note Level implicitly includes all other levels below it.
* @note All levels are in lower-case on purpose to fit the "BOOST_LOG(info)" style.
*/
enum class log_level_e {
enum class LogLevel {
verbose = 0,
debug,
info,
Expand All@@ -32,18 +32,18 @@ namespace display_device {
/**
* @brief Defines the callback type for log data re-routing.
*/
using callback_t = std::function<void(const log_level_e, std::string)>;
using Callback = std::function<void(LogLevel, std::string)>;

/**
* @brief Get the singleton instance.
* @returns Singleton instance for the class.
*
* EXAMPLES:
* ```cpp
* logger_t& logger { logger_t::get() };
* Logger& logger { Logger::get() };
* ```
*/
static logger_t &
static Logger &
get();

/**
Expand All@@ -52,11 +52,11 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_log_level(logger_t::log_level_e::Info);
* Logger::get().setLogLevel(Logger::LogLevel::Info);
* ```
*/
void
set_log_level(log_level_e log_level);
setLogLevel(LogLevel log_level);

/**
* @brief Check if log level is currently enabled.
Expand All@@ -65,25 +65,25 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* const bool is_enabled { logger_t::get().is_log_level_enabled(logger_t::log_level_e::Info) };
* const bool is_enabled { Logger::get().isLogLevelEnabled(Logger::LogLevel::Info) };
* ```
*/
[[nodiscard]] bool
is_log_level_enabled(log_level_e log_level) const;
isLogLevelEnabled(LogLevel log_level) const;

/**
* @brief Set custom callback for writing the logs.
* @param callback New callback to be used or nullptr to reset to the default.
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_custom_callback([](const log_level_e level, std::string value){
* Logger::get().setCustomCallback([](const LogLevel level, std::string value){
* // write to file or something
* });
* ```
*/
void
set_custom_callback(callback_t callback);
setCustomCallback(Callback callback);

/**
* @brief Write the string to the output (via callback) if the log level is enabled.
Expand All@@ -92,65 +92,65 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().write(logger_t::log_level_e::Info, "Hello World!");
* Logger::get().write(Logger::LogLevel::Info, "Hello World!");
* ```
*/
void
write(log_level_e log_level, std::string value);
write(LogLevel log_level, std::string value);

/**
* @brief A deleted copy constructor for singleton pattern.
* @note Public to ensure better compiler error message.
*/
logger_t(logger_t const &) = delete;
Logger(Logger const &) = delete;

/**
* @brief A deleted assignment operator for singleton pattern.
* @note Public to ensure better compiler error message.
*/
void
operator=(logger_t const &) = delete;
operator=(Logger const &) = delete;

private:
/**
* @brief A private constructor to ensure the singleton pattern.
*/
explicit logger_t();
explicit Logger();

log_level_e m_enabled_log_level; /**< The currently enabled log level. */
callback_t m_custom_callback; /**< Custom callback to pass log data to. */
LogLevel m_enabled_log_level; /**< The currently enabled log level. */
Callback m_custom_callback; /**< Custom callback to pass log data to. */
};

/**
* @brief A helper class for accumulating output via the stream operator and then writing it out at once.
*/
class log_writer_t {
class LogWriter {
public:
/**
* @brief Constructor scoped writer utility.
* @param log_level Level to be used when writing out the output.
*/
explicit log_writer_t(logger_t::log_level_e log_level);
explicit LogWriter(Logger::LogLevel log_level);

/**
* @brief Write out the accumulated output.
*/
virtual ~log_writer_t();
virtual ~LogWriter();

/**
* @brief Stream value to the buffer.
* @param value Arbitrary value to be written to the buffer.
* @returns Reference to the writer utility for chaining the operators.
*/
template <class T>
log_writer_t &
LogWriter &
operator<<(T &&value) {
m_buffer << std::forward<T>(value);
return *this;
}

private:
logger_t::log_level_e m_log_level; /**< Log level to be used. */
Logger::LogLevel m_log_level; /**< Log level to be used. */
std::ostringstream m_buffer; /**< Buffer to hold all the output. */
};
} // namespace display_device
Expand All@@ -164,6 +164,6 @@ namespace display_device {
* DD_LOG(error) << "OH MY GAWD!";
* ```
*/
#define DD_LOG(level) \
for (bool is_enabled { display_device::logger_t::get().is_log_level_enabled(display_device::logger_t::log_level_e::level) }; is_enabled; is_enabled = false) \
display_device::log_writer_t(display_device::logger_t::log_level_e::level)
#define DD_LOG(level) \
for (bool is_enabled { display_device::Logger::get().isLogLevelEnabled(display_device::Logger::LogLevel::level) }; is_enabled; is_enabled = false) \
display_device::LogWriter(display_device::Logger::LogLevel::level)
40 changes: 20 additions & 20 deletions src/common/logging.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,32 +8,32 @@
#include <mutex>

namespace display_device {
logger_t &
logger_t::get() {
static logger_t instance;
Logger &
Logger::get() {
static Logger instance;
return instance;
}

void
logger_t::set_log_level(const log_level_e log_level) {
Logger::setLogLevel(LogLevel log_level) {
m_enabled_log_level = log_level;
}

bool
logger_t::is_log_level_enabled(const log_level_e log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<log_level_e>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<log_level_e>>(m_enabled_log_level) };
Logger::isLogLevelEnabled(LogLevel log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<LogLevel>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<LogLevel>>(m_enabled_log_level) };
return log_level_v >= enabled_log_level_v;
}

void
logger_t::set_custom_callback(callback_t callback) {
Logger::setCustomCallback(Callback callback) {
m_custom_callback = std::move(callback);
}

void
logger_t::write(const log_level_e log_level, std::string value) {
if (!is_log_level_enabled(log_level)) {
Logger::write(const LogLevel log_level, std::string value) {
if (!isLogLevelEnabled(log_level)) {
return;
}

Expand DownExpand Up@@ -70,19 +70,19 @@ namespace display_device {

// Log level
switch (log_level) {
case log_level_e::verbose:
case LogLevel::verbose:
stream << "VERBOSE: ";
break;
case log_level_e::debug:
case LogLevel::debug:
stream << "DEBUG: ";
break;
case log_level_e::info:
case LogLevel::info:
stream << "INFO: ";
break;
case log_level_e::warning:
case LogLevel::warning:
stream << "WARNING: ";
break;
case log_level_e::error:
case LogLevel::error:
stream << "ERROR: ";
break;
default:
Expand All@@ -98,14 +98,14 @@ namespace display_device {
std::cout << stream.rdbuf() << std::endl;
}

logger_t::logger_t():
m_enabled_log_level { log_level_e::info } {
Logger::Logger():
m_enabled_log_level { LogLevel::info } {
}

log_writer_t::log_writer_t(const logger_t::log_level_e log_level):
LogWriter::LogWriter(const Logger::LogLevel log_level):
m_log_level { log_level } {}

log_writer_t::~log_writer_t() {
logger_t::get().write(m_log_level, m_buffer.str());
LogWriter::~LogWriter() {
Logger::get().write(m_log_level, m_buffer.str());
}
} // namespace display_device
26 changes: 13 additions & 13 deletions src/windows/include/displaydevice/windows/winapilayer.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,28 +9,28 @@ namespace display_device {
*/
class WinApiLayer: public WinApiLayerInterface {
public:
/** For details @see WinApiLayerInterface::get_error_string */
/** For details @see WinApiLayerInterface::getErrorString */
[[nodiscard]] std::string
get_error_string(LONG error_code) const override;
getErrorString(LONG error_code) const override;

/** For details @see WinApiLayerInterface::query_display_config */
[[nodiscard]] std::optional<path_and_mode_data_t>
query_display_config(query_type_e type) const override;
/** For details @see WinApiLayerInterface::queryDisplayConfig */
[[nodiscard]] std::optional<PathAndModeData>
queryDisplayConfig(QueryType type) const override;

/** For details @see WinApiLayerInterface::get_device_id */
/** For details @see WinApiLayerInterface::getDeviceId */
[[nodiscard]] std::string
get_device_id(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDeviceId(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_monitor_device_path */
/** For details @see WinApiLayerInterface::getMonitorDevicePath */
[[nodiscard]] std::string
get_monitor_device_path(const DISPLAYCONFIG_PATH_INFO &path) const override;
getMonitorDevicePath(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_friendly_name */
/** For details @see WinApiLayerInterface::getFriendlyName */
[[nodiscard]] std::string
get_friendly_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getFriendlyName(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_display_name */
/** For details @see WinApiLayerInterface::getDisplayName */
[[nodiscard]] std::string
get_display_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDisplayName(const DISPLAYCONFIG_PATH_INFO &path) const override;
};
} // namespace display_device
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 26 additions & 26 deletions src/common/include/displaydevice/logging.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,14 +14,14 @@ namespace display_device {
*
* @note A lazy-evaluated, correctly-destroyed, thread-safe singleton pattern is used here (https://stackoverflow.com/a/1008289).
*/
class logger_t {
class Logger {
public:
/**
* @brief Defines the possible log levels.
* @note Level implicitly includes all other levels below it.
* @note All levels are in lower-case on purpose to fit the "BOOST_LOG(info)" style.
*/
enum class log_level_e {
enum class LogLevel {
verbose = 0,
debug,
info,
Expand All@@ -32,18 +32,18 @@ namespace display_device {
/**
* @brief Defines the callback type for log data re-routing.
*/
using callback_t = std::function<void(const log_level_e, std::string)>;
using Callback = std::function<void(LogLevel, std::string)>;

/**
* @brief Get the singleton instance.
* @returns Singleton instance for the class.
*
* EXAMPLES:
* ```cpp
* logger_t& logger { logger_t::get() };
* Logger& logger { Logger::get() };
* ```
*/
static logger_t &
static Logger &
get();

/**
Expand All@@ -52,11 +52,11 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_log_level(logger_t::log_level_e::Info);
* Logger::get().setLogLevel(Logger::LogLevel::Info);
* ```
*/
void
set_log_level(log_level_e log_level);
setLogLevel(LogLevel log_level);

/**
* @brief Check if log level is currently enabled.
Expand All@@ -65,25 +65,25 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* const bool is_enabled { logger_t::get().is_log_level_enabled(logger_t::log_level_e::Info) };
* const bool is_enabled { Logger::get().isLogLevelEnabled(Logger::LogLevel::Info) };
* ```
*/
[[nodiscard]] bool
is_log_level_enabled(log_level_e log_level) const;
isLogLevelEnabled(LogLevel log_level) const;

/**
* @brief Set custom callback for writing the logs.
* @param callback New callback to be used or nullptr to reset to the default.
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_custom_callback([](const log_level_e level, std::string value){
* Logger::get().setCustomCallback([](const LogLevel level, std::string value){
* // write to file or something
* });
* ```
*/
void
set_custom_callback(callback_t callback);
setCustomCallback(Callback callback);

/**
* @brief Write the string to the output (via callback) if the log level is enabled.
Expand All@@ -92,65 +92,65 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().write(logger_t::log_level_e::Info, "Hello World!");
* Logger::get().write(Logger::LogLevel::Info, "Hello World!");
* ```
*/
void
write(log_level_e log_level, std::string value);
write(LogLevel log_level, std::string value);

/**
* @brief A deleted copy constructor for singleton pattern.
* @note Public to ensure better compiler error message.
*/
logger_t(logger_t const &) = delete;
Logger(Logger const &) = delete;

/**
* @brief A deleted assignment operator for singleton pattern.
* @note Public to ensure better compiler error message.
*/
void
operator=(logger_t const &) = delete;
operator=(Logger const &) = delete;

private:
/**
* @brief A private constructor to ensure the singleton pattern.
*/
explicit logger_t();
explicit Logger();

log_level_e m_enabled_log_level; /**< The currently enabled log level. */
callback_t m_custom_callback; /**< Custom callback to pass log data to. */
LogLevel m_enabled_log_level; /**< The currently enabled log level. */
Callback m_custom_callback; /**< Custom callback to pass log data to. */
};

/**
* @brief A helper class for accumulating output via the stream operator and then writing it out at once.
*/
class log_writer_t {
class LogWriter {
public:
/**
* @brief Constructor scoped writer utility.
* @param log_level Level to be used when writing out the output.
*/
explicit log_writer_t(logger_t::log_level_e log_level);
explicit LogWriter(Logger::LogLevel log_level);

/**
* @brief Write out the accumulated output.
*/
virtual ~log_writer_t();
virtual ~LogWriter();

/**
* @brief Stream value to the buffer.
* @param value Arbitrary value to be written to the buffer.
* @returns Reference to the writer utility for chaining the operators.
*/
template <class T>
log_writer_t &
LogWriter &
operator<<(T &&value) {
m_buffer << std::forward<T>(value);
return *this;
}

private:
logger_t::log_level_e m_log_level; /**< Log level to be used. */
Logger::LogLevel m_log_level; /**< Log level to be used. */
std::ostringstream m_buffer; /**< Buffer to hold all the output. */
};
} // namespace display_device
Expand All@@ -164,6 +164,6 @@ namespace display_device {
* DD_LOG(error) << "OH MY GAWD!";
* ```
*/
#define DD_LOG(level) \
for (bool is_enabled { display_device::logger_t::get().is_log_level_enabled(display_device::logger_t::log_level_e::level) }; is_enabled; is_enabled = false) \
display_device::log_writer_t(display_device::logger_t::log_level_e::level)
#define DD_LOG(level) \
for (bool is_enabled { display_device::Logger::get().isLogLevelEnabled(display_device::Logger::LogLevel::level) }; is_enabled; is_enabled = false) \
display_device::LogWriter(display_device::Logger::LogLevel::level)
40 changes: 20 additions & 20 deletions src/common/logging.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,32 +8,32 @@
#include <mutex>

namespace display_device {
logger_t &
logger_t::get() {
static logger_t instance;
Logger &
Logger::get() {
static Logger instance;
return instance;
}

void
logger_t::set_log_level(const log_level_e log_level) {
Logger::setLogLevel(LogLevel log_level) {
m_enabled_log_level = log_level;
}

bool
logger_t::is_log_level_enabled(const log_level_e log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<log_level_e>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<log_level_e>>(m_enabled_log_level) };
Logger::isLogLevelEnabled(LogLevel log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<LogLevel>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<LogLevel>>(m_enabled_log_level) };
return log_level_v >= enabled_log_level_v;
}

void
logger_t::set_custom_callback(callback_t callback) {
Logger::setCustomCallback(Callback callback) {
m_custom_callback = std::move(callback);
}

void
logger_t::write(const log_level_e log_level, std::string value) {
if (!is_log_level_enabled(log_level)) {
Logger::write(const LogLevel log_level, std::string value) {
if (!isLogLevelEnabled(log_level)) {
return;
}

Expand DownExpand Up@@ -70,19 +70,19 @@ namespace display_device {

// Log level
switch (log_level) {
case log_level_e::verbose:
case LogLevel::verbose:
stream << "VERBOSE: ";
break;
case log_level_e::debug:
case LogLevel::debug:
stream << "DEBUG: ";
break;
case log_level_e::info:
case LogLevel::info:
stream << "INFO: ";
break;
case log_level_e::warning:
case LogLevel::warning:
stream << "WARNING: ";
break;
case log_level_e::error:
case LogLevel::error:
stream << "ERROR: ";
break;
default:
Expand All@@ -98,14 +98,14 @@ namespace display_device {
std::cout << stream.rdbuf() << std::endl;
}

logger_t::logger_t():
m_enabled_log_level { log_level_e::info } {
Logger::Logger():
m_enabled_log_level { LogLevel::info } {
}

log_writer_t::log_writer_t(const logger_t::log_level_e log_level):
LogWriter::LogWriter(const Logger::LogLevel log_level):
m_log_level { log_level } {}

log_writer_t::~log_writer_t() {
logger_t::get().write(m_log_level, m_buffer.str());
LogWriter::~LogWriter() {
Logger::get().write(m_log_level, m_buffer.str());
}
} // namespace display_device
26 changes: 13 additions & 13 deletions src/windows/include/displaydevice/windows/winapilayer.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,28 +9,28 @@ namespace display_device {
*/
class WinApiLayer: public WinApiLayerInterface {
public:
/** For details @see WinApiLayerInterface::get_error_string */
/** For details @see WinApiLayerInterface::getErrorString */
[[nodiscard]] std::string
get_error_string(LONG error_code) const override;
getErrorString(LONG error_code) const override;

/** For details @see WinApiLayerInterface::query_display_config */
[[nodiscard]] std::optional<path_and_mode_data_t>
query_display_config(query_type_e type) const override;
/** For details @see WinApiLayerInterface::queryDisplayConfig */
[[nodiscard]] std::optional<PathAndModeData>
queryDisplayConfig(QueryType type) const override;

/** For details @see WinApiLayerInterface::get_device_id */
/** For details @see WinApiLayerInterface::getDeviceId */
[[nodiscard]] std::string
get_device_id(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDeviceId(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_monitor_device_path */
/** For details @see WinApiLayerInterface::getMonitorDevicePath */
[[nodiscard]] std::string
get_monitor_device_path(const DISPLAYCONFIG_PATH_INFO &path) const override;
getMonitorDevicePath(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_friendly_name */
/** For details @see WinApiLayerInterface::getFriendlyName */
[[nodiscard]] std::string
get_friendly_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getFriendlyName(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_display_name */
/** For details @see WinApiLayerInterface::getDisplayName */
[[nodiscard]] std::string
get_display_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDisplayName(const DISPLAYCONFIG_PATH_INFO &path) const override;
};
} // namespace display_device
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 26 additions & 26 deletions src/common/include/displaydevice/logging.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,14 +14,14 @@ namespace display_device {
*
* @note A lazy-evaluated, correctly-destroyed, thread-safe singleton pattern is used here (https://stackoverflow.com/a/1008289).
*/
class logger_t {
class Logger {
public:
/**
* @brief Defines the possible log levels.
* @note Level implicitly includes all other levels below it.
* @note All levels are in lower-case on purpose to fit the "BOOST_LOG(info)" style.
*/
enum class log_level_e {
enum class LogLevel {
verbose = 0,
debug,
info,
Expand All@@ -32,18 +32,18 @@ namespace display_device {
/**
* @brief Defines the callback type for log data re-routing.
*/
using callback_t = std::function<void(const log_level_e, std::string)>;
using Callback = std::function<void(LogLevel, std::string)>;

/**
* @brief Get the singleton instance.
* @returns Singleton instance for the class.
*
* EXAMPLES:
* ```cpp
* logger_t& logger { logger_t::get() };
* Logger& logger { Logger::get() };
* ```
*/
static logger_t &
static Logger &
get();

/**
Expand All@@ -52,11 +52,11 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_log_level(logger_t::log_level_e::Info);
* Logger::get().setLogLevel(Logger::LogLevel::Info);
* ```
*/
void
set_log_level(log_level_e log_level);
setLogLevel(LogLevel log_level);

/**
* @brief Check if log level is currently enabled.
Expand All@@ -65,25 +65,25 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* const bool is_enabled { logger_t::get().is_log_level_enabled(logger_t::log_level_e::Info) };
* const bool is_enabled { Logger::get().isLogLevelEnabled(Logger::LogLevel::Info) };
* ```
*/
[[nodiscard]] bool
is_log_level_enabled(log_level_e log_level) const;
isLogLevelEnabled(LogLevel log_level) const;

/**
* @brief Set custom callback for writing the logs.
* @param callback New callback to be used or nullptr to reset to the default.
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_custom_callback([](const log_level_e level, std::string value){
* Logger::get().setCustomCallback([](const LogLevel level, std::string value){
* // write to file or something
* });
* ```
*/
void
set_custom_callback(callback_t callback);
setCustomCallback(Callback callback);

/**
* @brief Write the string to the output (via callback) if the log level is enabled.
Expand All@@ -92,65 +92,65 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().write(logger_t::log_level_e::Info, "Hello World!");
* Logger::get().write(Logger::LogLevel::Info, "Hello World!");
* ```
*/
void
write(log_level_e log_level, std::string value);
write(LogLevel log_level, std::string value);

/**
* @brief A deleted copy constructor for singleton pattern.
* @note Public to ensure better compiler error message.
*/
logger_t(logger_t const &) = delete;
Logger(Logger const &) = delete;

/**
* @brief A deleted assignment operator for singleton pattern.
* @note Public to ensure better compiler error message.
*/
void
operator=(logger_t const &) = delete;
operator=(Logger const &) = delete;

private:
/**
* @brief A private constructor to ensure the singleton pattern.
*/
explicit logger_t();
explicit Logger();

log_level_e m_enabled_log_level; /**< The currently enabled log level. */
callback_t m_custom_callback; /**< Custom callback to pass log data to. */
LogLevel m_enabled_log_level; /**< The currently enabled log level. */
Callback m_custom_callback; /**< Custom callback to pass log data to. */
};

/**
* @brief A helper class for accumulating output via the stream operator and then writing it out at once.
*/
class log_writer_t {
class LogWriter {
public:
/**
* @brief Constructor scoped writer utility.
* @param log_level Level to be used when writing out the output.
*/
explicit log_writer_t(logger_t::log_level_e log_level);
explicit LogWriter(Logger::LogLevel log_level);

/**
* @brief Write out the accumulated output.
*/
virtual ~log_writer_t();
virtual ~LogWriter();

/**
* @brief Stream value to the buffer.
* @param value Arbitrary value to be written to the buffer.
* @returns Reference to the writer utility for chaining the operators.
*/
template <class T>
log_writer_t &
LogWriter &
operator<<(T &&value) {
m_buffer << std::forward<T>(value);
return *this;
}

private:
logger_t::log_level_e m_log_level; /**< Log level to be used. */
Logger::LogLevel m_log_level; /**< Log level to be used. */
std::ostringstream m_buffer; /**< Buffer to hold all the output. */
};
} // namespace display_device
Expand All@@ -164,6 +164,6 @@ namespace display_device {
* DD_LOG(error) << "OH MY GAWD!";
* ```
*/
#define DD_LOG(level) \
for (bool is_enabled { display_device::logger_t::get().is_log_level_enabled(display_device::logger_t::log_level_e::level) }; is_enabled; is_enabled = false) \
display_device::log_writer_t(display_device::logger_t::log_level_e::level)
#define DD_LOG(level) \
for (bool is_enabled { display_device::Logger::get().isLogLevelEnabled(display_device::Logger::LogLevel::level) }; is_enabled; is_enabled = false) \
display_device::LogWriter(display_device::Logger::LogLevel::level)
40 changes: 20 additions & 20 deletions src/common/logging.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,32 +8,32 @@
#include <mutex>

namespace display_device {
logger_t &
logger_t::get() {
static logger_t instance;
Logger &
Logger::get() {
static Logger instance;
return instance;
}

void
logger_t::set_log_level(const log_level_e log_level) {
Logger::setLogLevel(LogLevel log_level) {
m_enabled_log_level = log_level;
}

bool
logger_t::is_log_level_enabled(const log_level_e log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<log_level_e>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<log_level_e>>(m_enabled_log_level) };
Logger::isLogLevelEnabled(LogLevel log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<LogLevel>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<LogLevel>>(m_enabled_log_level) };
return log_level_v >= enabled_log_level_v;
}

void
logger_t::set_custom_callback(callback_t callback) {
Logger::setCustomCallback(Callback callback) {
m_custom_callback = std::move(callback);
}

void
logger_t::write(const log_level_e log_level, std::string value) {
if (!is_log_level_enabled(log_level)) {
Logger::write(const LogLevel log_level, std::string value) {
if (!isLogLevelEnabled(log_level)) {
return;
}

Expand DownExpand Up@@ -70,19 +70,19 @@ namespace display_device {

// Log level
switch (log_level) {
case log_level_e::verbose:
case LogLevel::verbose:
stream << "VERBOSE: ";
break;
case log_level_e::debug:
case LogLevel::debug:
stream << "DEBUG: ";
break;
case log_level_e::info:
case LogLevel::info:
stream << "INFO: ";
break;
case log_level_e::warning:
case LogLevel::warning:
stream << "WARNING: ";
break;
case log_level_e::error:
case LogLevel::error:
stream << "ERROR: ";
break;
default:
Expand All@@ -98,14 +98,14 @@ namespace display_device {
std::cout << stream.rdbuf() << std::endl;
}

logger_t::logger_t():
m_enabled_log_level { log_level_e::info } {
Logger::Logger():
m_enabled_log_level { LogLevel::info } {
}

log_writer_t::log_writer_t(const logger_t::log_level_e log_level):
LogWriter::LogWriter(const Logger::LogLevel log_level):
m_log_level { log_level } {}

log_writer_t::~log_writer_t() {
logger_t::get().write(m_log_level, m_buffer.str());
LogWriter::~LogWriter() {
Logger::get().write(m_log_level, m_buffer.str());
}
} // namespace display_device
26 changes: 13 additions & 13 deletions src/windows/include/displaydevice/windows/winapilayer.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,28 +9,28 @@ namespace display_device {
*/
class WinApiLayer: public WinApiLayerInterface {
public:
/** For details @see WinApiLayerInterface::get_error_string */
/** For details @see WinApiLayerInterface::getErrorString */
[[nodiscard]] std::string
get_error_string(LONG error_code) const override;
getErrorString(LONG error_code) const override;

/** For details @see WinApiLayerInterface::query_display_config */
[[nodiscard]] std::optional<path_and_mode_data_t>
query_display_config(query_type_e type) const override;
/** For details @see WinApiLayerInterface::queryDisplayConfig */
[[nodiscard]] std::optional<PathAndModeData>
queryDisplayConfig(QueryType type) const override;

/** For details @see WinApiLayerInterface::get_device_id */
/** For details @see WinApiLayerInterface::getDeviceId */
[[nodiscard]] std::string
get_device_id(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDeviceId(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_monitor_device_path */
/** For details @see WinApiLayerInterface::getMonitorDevicePath */
[[nodiscard]] std::string
get_monitor_device_path(const DISPLAYCONFIG_PATH_INFO &path) const override;
getMonitorDevicePath(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_friendly_name */
/** For details @see WinApiLayerInterface::getFriendlyName */
[[nodiscard]] std::string
get_friendly_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getFriendlyName(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_display_name */
/** For details @see WinApiLayerInterface::getDisplayName */
[[nodiscard]] std::string
get_display_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDisplayName(const DISPLAYCONFIG_PATH_INFO &path) const override;
};
} // namespace display_device
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 26 additions & 26 deletions src/common/include/displaydevice/logging.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,14 +14,14 @@ namespace display_device {
*
* @note A lazy-evaluated, correctly-destroyed, thread-safe singleton pattern is used here (https://stackoverflow.com/a/1008289).
*/
class logger_t {
class Logger {
public:
/**
* @brief Defines the possible log levels.
* @note Level implicitly includes all other levels below it.
* @note All levels are in lower-case on purpose to fit the "BOOST_LOG(info)" style.
*/
enum class log_level_e {
enum class LogLevel {
verbose = 0,
debug,
info,
Expand All@@ -32,18 +32,18 @@ namespace display_device {
/**
* @brief Defines the callback type for log data re-routing.
*/
using callback_t = std::function<void(const log_level_e, std::string)>;
using Callback = std::function<void(LogLevel, std::string)>;

/**
* @brief Get the singleton instance.
* @returns Singleton instance for the class.
*
* EXAMPLES:
* ```cpp
* logger_t& logger { logger_t::get() };
* Logger& logger { Logger::get() };
* ```
*/
static logger_t &
static Logger &
get();

/**
Expand All@@ -52,11 +52,11 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_log_level(logger_t::log_level_e::Info);
* Logger::get().setLogLevel(Logger::LogLevel::Info);
* ```
*/
void
set_log_level(log_level_e log_level);
setLogLevel(LogLevel log_level);

/**
* @brief Check if log level is currently enabled.
Expand All@@ -65,25 +65,25 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* const bool is_enabled { logger_t::get().is_log_level_enabled(logger_t::log_level_e::Info) };
* const bool is_enabled { Logger::get().isLogLevelEnabled(Logger::LogLevel::Info) };
* ```
*/
[[nodiscard]] bool
is_log_level_enabled(log_level_e log_level) const;
isLogLevelEnabled(LogLevel log_level) const;

/**
* @brief Set custom callback for writing the logs.
* @param callback New callback to be used or nullptr to reset to the default.
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_custom_callback([](const log_level_e level, std::string value){
* Logger::get().setCustomCallback([](const LogLevel level, std::string value){
* // write to file or something
* });
* ```
*/
void
set_custom_callback(callback_t callback);
setCustomCallback(Callback callback);

/**
* @brief Write the string to the output (via callback) if the log level is enabled.
Expand All@@ -92,65 +92,65 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().write(logger_t::log_level_e::Info, "Hello World!");
* Logger::get().write(Logger::LogLevel::Info, "Hello World!");
* ```
*/
void
write(log_level_e log_level, std::string value);
write(LogLevel log_level, std::string value);

/**
* @brief A deleted copy constructor for singleton pattern.
* @note Public to ensure better compiler error message.
*/
logger_t(logger_t const &) = delete;
Logger(Logger const &) = delete;

/**
* @brief A deleted assignment operator for singleton pattern.
* @note Public to ensure better compiler error message.
*/
void
operator=(logger_t const &) = delete;
operator=(Logger const &) = delete;

private:
/**
* @brief A private constructor to ensure the singleton pattern.
*/
explicit logger_t();
explicit Logger();

log_level_e m_enabled_log_level; /**< The currently enabled log level. */
callback_t m_custom_callback; /**< Custom callback to pass log data to. */
LogLevel m_enabled_log_level; /**< The currently enabled log level. */
Callback m_custom_callback; /**< Custom callback to pass log data to. */
};

/**
* @brief A helper class for accumulating output via the stream operator and then writing it out at once.
*/
class log_writer_t {
class LogWriter {
public:
/**
* @brief Constructor scoped writer utility.
* @param log_level Level to be used when writing out the output.
*/
explicit log_writer_t(logger_t::log_level_e log_level);
explicit LogWriter(Logger::LogLevel log_level);

/**
* @brief Write out the accumulated output.
*/
virtual ~log_writer_t();
virtual ~LogWriter();

/**
* @brief Stream value to the buffer.
* @param value Arbitrary value to be written to the buffer.
* @returns Reference to the writer utility for chaining the operators.
*/
template <class T>
log_writer_t &
LogWriter &
operator<<(T &&value) {
m_buffer << std::forward<T>(value);
return *this;
}

private:
logger_t::log_level_e m_log_level; /**< Log level to be used. */
Logger::LogLevel m_log_level; /**< Log level to be used. */
std::ostringstream m_buffer; /**< Buffer to hold all the output. */
};
} // namespace display_device
Expand All@@ -164,6 +164,6 @@ namespace display_device {
* DD_LOG(error) << "OH MY GAWD!";
* ```
*/
#define DD_LOG(level) \
for (bool is_enabled { display_device::logger_t::get().is_log_level_enabled(display_device::logger_t::log_level_e::level) }; is_enabled; is_enabled = false) \
display_device::log_writer_t(display_device::logger_t::log_level_e::level)
#define DD_LOG(level) \
for (bool is_enabled { display_device::Logger::get().isLogLevelEnabled(display_device::Logger::LogLevel::level) }; is_enabled; is_enabled = false) \
display_device::LogWriter(display_device::Logger::LogLevel::level)
40 changes: 20 additions & 20 deletions src/common/logging.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,32 +8,32 @@
#include <mutex>

namespace display_device {
logger_t &
logger_t::get() {
static logger_t instance;
Logger &
Logger::get() {
static Logger instance;
return instance;
}

void
logger_t::set_log_level(const log_level_e log_level) {
Logger::setLogLevel(LogLevel log_level) {
m_enabled_log_level = log_level;
}

bool
logger_t::is_log_level_enabled(const log_level_e log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<log_level_e>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<log_level_e>>(m_enabled_log_level) };
Logger::isLogLevelEnabled(LogLevel log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<LogLevel>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<LogLevel>>(m_enabled_log_level) };
return log_level_v >= enabled_log_level_v;
}

void
logger_t::set_custom_callback(callback_t callback) {
Logger::setCustomCallback(Callback callback) {
m_custom_callback = std::move(callback);
}

void
logger_t::write(const log_level_e log_level, std::string value) {
if (!is_log_level_enabled(log_level)) {
Logger::write(const LogLevel log_level, std::string value) {
if (!isLogLevelEnabled(log_level)) {
return;
}

Expand DownExpand Up@@ -70,19 +70,19 @@ namespace display_device {

// Log level
switch (log_level) {
case log_level_e::verbose:
case LogLevel::verbose:
stream << "VERBOSE: ";
break;
case log_level_e::debug:
case LogLevel::debug:
stream << "DEBUG: ";
break;
case log_level_e::info:
case LogLevel::info:
stream << "INFO: ";
break;
case log_level_e::warning:
case LogLevel::warning:
stream << "WARNING: ";
break;
case log_level_e::error:
case LogLevel::error:
stream << "ERROR: ";
break;
default:
Expand All@@ -98,14 +98,14 @@ namespace display_device {
std::cout << stream.rdbuf() << std::endl;
}

logger_t::logger_t():
m_enabled_log_level { log_level_e::info } {
Logger::Logger():
m_enabled_log_level { LogLevel::info } {
}

log_writer_t::log_writer_t(const logger_t::log_level_e log_level):
LogWriter::LogWriter(const Logger::LogLevel log_level):
m_log_level { log_level } {}

log_writer_t::~log_writer_t() {
logger_t::get().write(m_log_level, m_buffer.str());
LogWriter::~LogWriter() {
Logger::get().write(m_log_level, m_buffer.str());
}
} // namespace display_device
26 changes: 13 additions & 13 deletions src/windows/include/displaydevice/windows/winapilayer.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,28 +9,28 @@ namespace display_device {
*/
class WinApiLayer: public WinApiLayerInterface {
public:
/** For details @see WinApiLayerInterface::get_error_string */
/** For details @see WinApiLayerInterface::getErrorString */
[[nodiscard]] std::string
get_error_string(LONG error_code) const override;
getErrorString(LONG error_code) const override;

/** For details @see WinApiLayerInterface::query_display_config */
[[nodiscard]] std::optional<path_and_mode_data_t>
query_display_config(query_type_e type) const override;
/** For details @see WinApiLayerInterface::queryDisplayConfig */
[[nodiscard]] std::optional<PathAndModeData>
queryDisplayConfig(QueryType type) const override;

/** For details @see WinApiLayerInterface::get_device_id */
/** For details @see WinApiLayerInterface::getDeviceId */
[[nodiscard]] std::string
get_device_id(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDeviceId(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_monitor_device_path */
/** For details @see WinApiLayerInterface::getMonitorDevicePath */
[[nodiscard]] std::string
get_monitor_device_path(const DISPLAYCONFIG_PATH_INFO &path) const override;
getMonitorDevicePath(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_friendly_name */
/** For details @see WinApiLayerInterface::getFriendlyName */
[[nodiscard]] std::string
get_friendly_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getFriendlyName(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_display_name */
/** For details @see WinApiLayerInterface::getDisplayName */
[[nodiscard]] std::string
get_display_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDisplayName(const DISPLAYCONFIG_PATH_INFO &path) const override;
};
} // namespace display_device
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 26 additions & 26 deletions src/common/include/displaydevice/logging.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,14 +14,14 @@ namespace display_device {
*
* @note A lazy-evaluated, correctly-destroyed, thread-safe singleton pattern is used here (https://stackoverflow.com/a/1008289).
*/
class logger_t {
class Logger {
public:
/**
* @brief Defines the possible log levels.
* @note Level implicitly includes all other levels below it.
* @note All levels are in lower-case on purpose to fit the "BOOST_LOG(info)" style.
*/
enum class log_level_e {
enum class LogLevel {
verbose = 0,
debug,
info,
Expand All@@ -32,18 +32,18 @@ namespace display_device {
/**
* @brief Defines the callback type for log data re-routing.
*/
using callback_t = std::function<void(const log_level_e, std::string)>;
using Callback = std::function<void(LogLevel, std::string)>;

/**
* @brief Get the singleton instance.
* @returns Singleton instance for the class.
*
* EXAMPLES:
* ```cpp
* logger_t& logger { logger_t::get() };
* Logger& logger { Logger::get() };
* ```
*/
static logger_t &
static Logger &
get();

/**
Expand All@@ -52,11 +52,11 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_log_level(logger_t::log_level_e::Info);
* Logger::get().setLogLevel(Logger::LogLevel::Info);
* ```
*/
void
set_log_level(log_level_e log_level);
setLogLevel(LogLevel log_level);

/**
* @brief Check if log level is currently enabled.
Expand All@@ -65,25 +65,25 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* const bool is_enabled { logger_t::get().is_log_level_enabled(logger_t::log_level_e::Info) };
* const bool is_enabled { Logger::get().isLogLevelEnabled(Logger::LogLevel::Info) };
* ```
*/
[[nodiscard]] bool
is_log_level_enabled(log_level_e log_level) const;
isLogLevelEnabled(LogLevel log_level) const;

/**
* @brief Set custom callback for writing the logs.
* @param callback New callback to be used or nullptr to reset to the default.
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_custom_callback([](const log_level_e level, std::string value){
* Logger::get().setCustomCallback([](const LogLevel level, std::string value){
* // write to file or something
* });
* ```
*/
void
set_custom_callback(callback_t callback);
setCustomCallback(Callback callback);

/**
* @brief Write the string to the output (via callback) if the log level is enabled.
Expand All@@ -92,65 +92,65 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().write(logger_t::log_level_e::Info, "Hello World!");
* Logger::get().write(Logger::LogLevel::Info, "Hello World!");
* ```
*/
void
write(log_level_e log_level, std::string value);
write(LogLevel log_level, std::string value);

/**
* @brief A deleted copy constructor for singleton pattern.
* @note Public to ensure better compiler error message.
*/
logger_t(logger_t const &) = delete;
Logger(Logger const &) = delete;

/**
* @brief A deleted assignment operator for singleton pattern.
* @note Public to ensure better compiler error message.
*/
void
operator=(logger_t const &) = delete;
operator=(Logger const &) = delete;

private:
/**
* @brief A private constructor to ensure the singleton pattern.
*/
explicit logger_t();
explicit Logger();

log_level_e m_enabled_log_level; /**< The currently enabled log level. */
callback_t m_custom_callback; /**< Custom callback to pass log data to. */
LogLevel m_enabled_log_level; /**< The currently enabled log level. */
Callback m_custom_callback; /**< Custom callback to pass log data to. */
};

/**
* @brief A helper class for accumulating output via the stream operator and then writing it out at once.
*/
class log_writer_t {
class LogWriter {
public:
/**
* @brief Constructor scoped writer utility.
* @param log_level Level to be used when writing out the output.
*/
explicit log_writer_t(logger_t::log_level_e log_level);
explicit LogWriter(Logger::LogLevel log_level);

/**
* @brief Write out the accumulated output.
*/
virtual ~log_writer_t();
virtual ~LogWriter();

/**
* @brief Stream value to the buffer.
* @param value Arbitrary value to be written to the buffer.
* @returns Reference to the writer utility for chaining the operators.
*/
template <class T>
log_writer_t &
LogWriter &
operator<<(T &&value) {
m_buffer << std::forward<T>(value);
return *this;
}

private:
logger_t::log_level_e m_log_level; /**< Log level to be used. */
Logger::LogLevel m_log_level; /**< Log level to be used. */
std::ostringstream m_buffer; /**< Buffer to hold all the output. */
};
} // namespace display_device
Expand All@@ -164,6 +164,6 @@ namespace display_device {
* DD_LOG(error) << "OH MY GAWD!";
* ```
*/
#define DD_LOG(level) \
for (bool is_enabled { display_device::logger_t::get().is_log_level_enabled(display_device::logger_t::log_level_e::level) }; is_enabled; is_enabled = false) \
display_device::log_writer_t(display_device::logger_t::log_level_e::level)
#define DD_LOG(level) \
for (bool is_enabled { display_device::Logger::get().isLogLevelEnabled(display_device::Logger::LogLevel::level) }; is_enabled; is_enabled = false) \
display_device::LogWriter(display_device::Logger::LogLevel::level)
40 changes: 20 additions & 20 deletions src/common/logging.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,32 +8,32 @@
#include <mutex>

namespace display_device {
logger_t &
logger_t::get() {
static logger_t instance;
Logger &
Logger::get() {
static Logger instance;
return instance;
}

void
logger_t::set_log_level(const log_level_e log_level) {
Logger::setLogLevel(LogLevel log_level) {
m_enabled_log_level = log_level;
}

bool
logger_t::is_log_level_enabled(const log_level_e log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<log_level_e>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<log_level_e>>(m_enabled_log_level) };
Logger::isLogLevelEnabled(LogLevel log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<LogLevel>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<LogLevel>>(m_enabled_log_level) };
return log_level_v >= enabled_log_level_v;
}

void
logger_t::set_custom_callback(callback_t callback) {
Logger::setCustomCallback(Callback callback) {
m_custom_callback = std::move(callback);
}

void
logger_t::write(const log_level_e log_level, std::string value) {
if (!is_log_level_enabled(log_level)) {
Logger::write(const LogLevel log_level, std::string value) {
if (!isLogLevelEnabled(log_level)) {
return;
}

Expand DownExpand Up@@ -70,19 +70,19 @@ namespace display_device {

// Log level
switch (log_level) {
case log_level_e::verbose:
case LogLevel::verbose:
stream << "VERBOSE: ";
break;
case log_level_e::debug:
case LogLevel::debug:
stream << "DEBUG: ";
break;
case log_level_e::info:
case LogLevel::info:
stream << "INFO: ";
break;
case log_level_e::warning:
case LogLevel::warning:
stream << "WARNING: ";
break;
case log_level_e::error:
case LogLevel::error:
stream << "ERROR: ";
break;
default:
Expand All@@ -98,14 +98,14 @@ namespace display_device {
std::cout << stream.rdbuf() << std::endl;
}

logger_t::logger_t():
m_enabled_log_level { log_level_e::info } {
Logger::Logger():
m_enabled_log_level { LogLevel::info } {
}

log_writer_t::log_writer_t(const logger_t::log_level_e log_level):
LogWriter::LogWriter(const Logger::LogLevel log_level):
m_log_level { log_level } {}

log_writer_t::~log_writer_t() {
logger_t::get().write(m_log_level, m_buffer.str());
LogWriter::~LogWriter() {
Logger::get().write(m_log_level, m_buffer.str());
}
} // namespace display_device
26 changes: 13 additions & 13 deletions src/windows/include/displaydevice/windows/winapilayer.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,28 +9,28 @@ namespace display_device {
*/
class WinApiLayer: public WinApiLayerInterface {
public:
/** For details @see WinApiLayerInterface::get_error_string */
/** For details @see WinApiLayerInterface::getErrorString */
[[nodiscard]] std::string
get_error_string(LONG error_code) const override;
getErrorString(LONG error_code) const override;

/** For details @see WinApiLayerInterface::query_display_config */
[[nodiscard]] std::optional<path_and_mode_data_t>
query_display_config(query_type_e type) const override;
/** For details @see WinApiLayerInterface::queryDisplayConfig */
[[nodiscard]] std::optional<PathAndModeData>
queryDisplayConfig(QueryType type) const override;

/** For details @see WinApiLayerInterface::get_device_id */
/** For details @see WinApiLayerInterface::getDeviceId */
[[nodiscard]] std::string
get_device_id(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDeviceId(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_monitor_device_path */
/** For details @see WinApiLayerInterface::getMonitorDevicePath */
[[nodiscard]] std::string
get_monitor_device_path(const DISPLAYCONFIG_PATH_INFO &path) const override;
getMonitorDevicePath(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_friendly_name */
/** For details @see WinApiLayerInterface::getFriendlyName */
[[nodiscard]] std::string
get_friendly_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getFriendlyName(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_display_name */
/** For details @see WinApiLayerInterface::getDisplayName */
[[nodiscard]] std::string
get_display_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDisplayName(const DISPLAYCONFIG_PATH_INFO &path) const override;
};
} // namespace display_device
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 26 additions & 26 deletions src/common/include/displaydevice/logging.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,14 +14,14 @@ namespace display_device {
*
* @note A lazy-evaluated, correctly-destroyed, thread-safe singleton pattern is used here (https://stackoverflow.com/a/1008289).
*/
class logger_t {
class Logger {
public:
/**
* @brief Defines the possible log levels.
* @note Level implicitly includes all other levels below it.
* @note All levels are in lower-case on purpose to fit the "BOOST_LOG(info)" style.
*/
enum class log_level_e {
enum class LogLevel {
verbose = 0,
debug,
info,
Expand All@@ -32,18 +32,18 @@ namespace display_device {
/**
* @brief Defines the callback type for log data re-routing.
*/
using callback_t = std::function<void(const log_level_e, std::string)>;
using Callback = std::function<void(LogLevel, std::string)>;

/**
* @brief Get the singleton instance.
* @returns Singleton instance for the class.
*
* EXAMPLES:
* ```cpp
* logger_t& logger { logger_t::get() };
* Logger& logger { Logger::get() };
* ```
*/
static logger_t &
static Logger &
get();

/**
Expand All@@ -52,11 +52,11 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_log_level(logger_t::log_level_e::Info);
* Logger::get().setLogLevel(Logger::LogLevel::Info);
* ```
*/
void
set_log_level(log_level_e log_level);
setLogLevel(LogLevel log_level);

/**
* @brief Check if log level is currently enabled.
Expand All@@ -65,25 +65,25 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* const bool is_enabled { logger_t::get().is_log_level_enabled(logger_t::log_level_e::Info) };
* const bool is_enabled { Logger::get().isLogLevelEnabled(Logger::LogLevel::Info) };
* ```
*/
[[nodiscard]] bool
is_log_level_enabled(log_level_e log_level) const;
isLogLevelEnabled(LogLevel log_level) const;

/**
* @brief Set custom callback for writing the logs.
* @param callback New callback to be used or nullptr to reset to the default.
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_custom_callback([](const log_level_e level, std::string value){
* Logger::get().setCustomCallback([](const LogLevel level, std::string value){
* // write to file or something
* });
* ```
*/
void
set_custom_callback(callback_t callback);
setCustomCallback(Callback callback);

/**
* @brief Write the string to the output (via callback) if the log level is enabled.
Expand All@@ -92,65 +92,65 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().write(logger_t::log_level_e::Info, "Hello World!");
* Logger::get().write(Logger::LogLevel::Info, "Hello World!");
* ```
*/
void
write(log_level_e log_level, std::string value);
write(LogLevel log_level, std::string value);

/**
* @brief A deleted copy constructor for singleton pattern.
* @note Public to ensure better compiler error message.
*/
logger_t(logger_t const &) = delete;
Logger(Logger const &) = delete;

/**
* @brief A deleted assignment operator for singleton pattern.
* @note Public to ensure better compiler error message.
*/
void
operator=(logger_t const &) = delete;
operator=(Logger const &) = delete;

private:
/**
* @brief A private constructor to ensure the singleton pattern.
*/
explicit logger_t();
explicit Logger();

log_level_e m_enabled_log_level; /**< The currently enabled log level. */
callback_t m_custom_callback; /**< Custom callback to pass log data to. */
LogLevel m_enabled_log_level; /**< The currently enabled log level. */
Callback m_custom_callback; /**< Custom callback to pass log data to. */
};

/**
* @brief A helper class for accumulating output via the stream operator and then writing it out at once.
*/
class log_writer_t {
class LogWriter {
public:
/**
* @brief Constructor scoped writer utility.
* @param log_level Level to be used when writing out the output.
*/
explicit log_writer_t(logger_t::log_level_e log_level);
explicit LogWriter(Logger::LogLevel log_level);

/**
* @brief Write out the accumulated output.
*/
virtual ~log_writer_t();
virtual ~LogWriter();

/**
* @brief Stream value to the buffer.
* @param value Arbitrary value to be written to the buffer.
* @returns Reference to the writer utility for chaining the operators.
*/
template <class T>
log_writer_t &
LogWriter &
operator<<(T &&value) {
m_buffer << std::forward<T>(value);
return *this;
}

private:
logger_t::log_level_e m_log_level; /**< Log level to be used. */
Logger::LogLevel m_log_level; /**< Log level to be used. */
std::ostringstream m_buffer; /**< Buffer to hold all the output. */
};
} // namespace display_device
Expand All@@ -164,6 +164,6 @@ namespace display_device {
* DD_LOG(error) << "OH MY GAWD!";
* ```
*/
#define DD_LOG(level) \
for (bool is_enabled { display_device::logger_t::get().is_log_level_enabled(display_device::logger_t::log_level_e::level) }; is_enabled; is_enabled = false) \
display_device::log_writer_t(display_device::logger_t::log_level_e::level)
#define DD_LOG(level) \
for (bool is_enabled { display_device::Logger::get().isLogLevelEnabled(display_device::Logger::LogLevel::level) }; is_enabled; is_enabled = false) \
display_device::LogWriter(display_device::Logger::LogLevel::level)
40 changes: 20 additions & 20 deletions src/common/logging.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,32 +8,32 @@
#include <mutex>

namespace display_device {
logger_t &
logger_t::get() {
static logger_t instance;
Logger &
Logger::get() {
static Logger instance;
return instance;
}

void
logger_t::set_log_level(const log_level_e log_level) {
Logger::setLogLevel(LogLevel log_level) {
m_enabled_log_level = log_level;
}

bool
logger_t::is_log_level_enabled(const log_level_e log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<log_level_e>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<log_level_e>>(m_enabled_log_level) };
Logger::isLogLevelEnabled(LogLevel log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<LogLevel>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<LogLevel>>(m_enabled_log_level) };
return log_level_v >= enabled_log_level_v;
}

void
logger_t::set_custom_callback(callback_t callback) {
Logger::setCustomCallback(Callback callback) {
m_custom_callback = std::move(callback);
}

void
logger_t::write(const log_level_e log_level, std::string value) {
if (!is_log_level_enabled(log_level)) {
Logger::write(const LogLevel log_level, std::string value) {
if (!isLogLevelEnabled(log_level)) {
return;
}

Expand DownExpand Up@@ -70,19 +70,19 @@ namespace display_device {

// Log level
switch (log_level) {
case log_level_e::verbose:
case LogLevel::verbose:
stream << "VERBOSE: ";
break;
case log_level_e::debug:
case LogLevel::debug:
stream << "DEBUG: ";
break;
case log_level_e::info:
case LogLevel::info:
stream << "INFO: ";
break;
case log_level_e::warning:
case LogLevel::warning:
stream << "WARNING: ";
break;
case log_level_e::error:
case LogLevel::error:
stream << "ERROR: ";
break;
default:
Expand All@@ -98,14 +98,14 @@ namespace display_device {
std::cout << stream.rdbuf() << std::endl;
}

logger_t::logger_t():
m_enabled_log_level { log_level_e::info } {
Logger::Logger():
m_enabled_log_level { LogLevel::info } {
}

log_writer_t::log_writer_t(const logger_t::log_level_e log_level):
LogWriter::LogWriter(const Logger::LogLevel log_level):
m_log_level { log_level } {}

log_writer_t::~log_writer_t() {
logger_t::get().write(m_log_level, m_buffer.str());
LogWriter::~LogWriter() {
Logger::get().write(m_log_level, m_buffer.str());
}
} // namespace display_device
26 changes: 13 additions & 13 deletions src/windows/include/displaydevice/windows/winapilayer.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,28 +9,28 @@ namespace display_device {
*/
class WinApiLayer: public WinApiLayerInterface {
public:
/** For details @see WinApiLayerInterface::get_error_string */
/** For details @see WinApiLayerInterface::getErrorString */
[[nodiscard]] std::string
get_error_string(LONG error_code) const override;
getErrorString(LONG error_code) const override;

/** For details @see WinApiLayerInterface::query_display_config */
[[nodiscard]] std::optional<path_and_mode_data_t>
query_display_config(query_type_e type) const override;
/** For details @see WinApiLayerInterface::queryDisplayConfig */
[[nodiscard]] std::optional<PathAndModeData>
queryDisplayConfig(QueryType type) const override;

/** For details @see WinApiLayerInterface::get_device_id */
/** For details @see WinApiLayerInterface::getDeviceId */
[[nodiscard]] std::string
get_device_id(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDeviceId(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_monitor_device_path */
/** For details @see WinApiLayerInterface::getMonitorDevicePath */
[[nodiscard]] std::string
get_monitor_device_path(const DISPLAYCONFIG_PATH_INFO &path) const override;
getMonitorDevicePath(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_friendly_name */
/** For details @see WinApiLayerInterface::getFriendlyName */
[[nodiscard]] std::string
get_friendly_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getFriendlyName(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_display_name */
/** For details @see WinApiLayerInterface::getDisplayName */
[[nodiscard]] std::string
get_display_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDisplayName(const DISPLAYCONFIG_PATH_INFO &path) const override;
};
} // namespace display_device
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 26 additions & 26 deletions src/common/include/displaydevice/logging.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,14 +14,14 @@ namespace display_device {
*
* @note A lazy-evaluated, correctly-destroyed, thread-safe singleton pattern is used here (https://stackoverflow.com/a/1008289).
*/
class logger_t {
class Logger {
public:
/**
* @brief Defines the possible log levels.
* @note Level implicitly includes all other levels below it.
* @note All levels are in lower-case on purpose to fit the "BOOST_LOG(info)" style.
*/
enum class log_level_e {
enum class LogLevel {
verbose = 0,
debug,
info,
Expand All@@ -32,18 +32,18 @@ namespace display_device {
/**
* @brief Defines the callback type for log data re-routing.
*/
using callback_t = std::function<void(const log_level_e, std::string)>;
using Callback = std::function<void(LogLevel, std::string)>;

/**
* @brief Get the singleton instance.
* @returns Singleton instance for the class.
*
* EXAMPLES:
* ```cpp
* logger_t& logger { logger_t::get() };
* Logger& logger { Logger::get() };
* ```
*/
static logger_t &
static Logger &
get();

/**
Expand All@@ -52,11 +52,11 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_log_level(logger_t::log_level_e::Info);
* Logger::get().setLogLevel(Logger::LogLevel::Info);
* ```
*/
void
set_log_level(log_level_e log_level);
setLogLevel(LogLevel log_level);

/**
* @brief Check if log level is currently enabled.
Expand All@@ -65,25 +65,25 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* const bool is_enabled { logger_t::get().is_log_level_enabled(logger_t::log_level_e::Info) };
* const bool is_enabled { Logger::get().isLogLevelEnabled(Logger::LogLevel::Info) };
* ```
*/
[[nodiscard]] bool
is_log_level_enabled(log_level_e log_level) const;
isLogLevelEnabled(LogLevel log_level) const;

/**
* @brief Set custom callback for writing the logs.
* @param callback New callback to be used or nullptr to reset to the default.
*
* EXAMPLES:
* ```cpp
* logger_t::get().set_custom_callback([](const log_level_e level, std::string value){
* Logger::get().setCustomCallback([](const LogLevel level, std::string value){
* // write to file or something
* });
* ```
*/
void
set_custom_callback(callback_t callback);
setCustomCallback(Callback callback);

/**
* @brief Write the string to the output (via callback) if the log level is enabled.
Expand All@@ -92,65 +92,65 @@ namespace display_device {
*
* EXAMPLES:
* ```cpp
* logger_t::get().write(logger_t::log_level_e::Info, "Hello World!");
* Logger::get().write(Logger::LogLevel::Info, "Hello World!");
* ```
*/
void
write(log_level_e log_level, std::string value);
write(LogLevel log_level, std::string value);

/**
* @brief A deleted copy constructor for singleton pattern.
* @note Public to ensure better compiler error message.
*/
logger_t(logger_t const &) = delete;
Logger(Logger const &) = delete;

/**
* @brief A deleted assignment operator for singleton pattern.
* @note Public to ensure better compiler error message.
*/
void
operator=(logger_t const &) = delete;
operator=(Logger const &) = delete;

private:
/**
* @brief A private constructor to ensure the singleton pattern.
*/
explicit logger_t();
explicit Logger();

log_level_e m_enabled_log_level; /**< The currently enabled log level. */
callback_t m_custom_callback; /**< Custom callback to pass log data to. */
LogLevel m_enabled_log_level; /**< The currently enabled log level. */
Callback m_custom_callback; /**< Custom callback to pass log data to. */
};

/**
* @brief A helper class for accumulating output via the stream operator and then writing it out at once.
*/
class log_writer_t {
class LogWriter {
public:
/**
* @brief Constructor scoped writer utility.
* @param log_level Level to be used when writing out the output.
*/
explicit log_writer_t(logger_t::log_level_e log_level);
explicit LogWriter(Logger::LogLevel log_level);

/**
* @brief Write out the accumulated output.
*/
virtual ~log_writer_t();
virtual ~LogWriter();

/**
* @brief Stream value to the buffer.
* @param value Arbitrary value to be written to the buffer.
* @returns Reference to the writer utility for chaining the operators.
*/
template <class T>
log_writer_t &
LogWriter &
operator<<(T &&value) {
m_buffer << std::forward<T>(value);
return *this;
}

private:
logger_t::log_level_e m_log_level; /**< Log level to be used. */
Logger::LogLevel m_log_level; /**< Log level to be used. */
std::ostringstream m_buffer; /**< Buffer to hold all the output. */
};
} // namespace display_device
Expand All@@ -164,6 +164,6 @@ namespace display_device {
* DD_LOG(error) << "OH MY GAWD!";
* ```
*/
#define DD_LOG(level) \
for (bool is_enabled { display_device::logger_t::get().is_log_level_enabled(display_device::logger_t::log_level_e::level) }; is_enabled; is_enabled = false) \
display_device::log_writer_t(display_device::logger_t::log_level_e::level)
#define DD_LOG(level) \
for (bool is_enabled { display_device::Logger::get().isLogLevelEnabled(display_device::Logger::LogLevel::level) }; is_enabled; is_enabled = false) \
display_device::LogWriter(display_device::Logger::LogLevel::level)
40 changes: 20 additions & 20 deletions src/common/logging.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,32 +8,32 @@
#include <mutex>

namespace display_device {
logger_t &
logger_t::get() {
static logger_t instance;
Logger &
Logger::get() {
static Logger instance;
return instance;
}

void
logger_t::set_log_level(const log_level_e log_level) {
Logger::setLogLevel(LogLevel log_level) {
m_enabled_log_level = log_level;
}

bool
logger_t::is_log_level_enabled(const log_level_e log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<log_level_e>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<log_level_e>>(m_enabled_log_level) };
Logger::isLogLevelEnabled(LogLevel log_level) const {
const auto log_level_v { static_cast<std::underlying_type_t<LogLevel>>(log_level) };
const auto enabled_log_level_v { static_cast<std::underlying_type_t<LogLevel>>(m_enabled_log_level) };
return log_level_v >= enabled_log_level_v;
}

void
logger_t::set_custom_callback(callback_t callback) {
Logger::setCustomCallback(Callback callback) {
m_custom_callback = std::move(callback);
}

void
logger_t::write(const log_level_e log_level, std::string value) {
if (!is_log_level_enabled(log_level)) {
Logger::write(const LogLevel log_level, std::string value) {
if (!isLogLevelEnabled(log_level)) {
return;
}

Expand DownExpand Up@@ -70,19 +70,19 @@ namespace display_device {

// Log level
switch (log_level) {
case log_level_e::verbose:
case LogLevel::verbose:
stream << "VERBOSE: ";
break;
case log_level_e::debug:
case LogLevel::debug:
stream << "DEBUG: ";
break;
case log_level_e::info:
case LogLevel::info:
stream << "INFO: ";
break;
case log_level_e::warning:
case LogLevel::warning:
stream << "WARNING: ";
break;
case log_level_e::error:
case LogLevel::error:
stream << "ERROR: ";
break;
default:
Expand All@@ -98,14 +98,14 @@ namespace display_device {
std::cout << stream.rdbuf() << std::endl;
}

logger_t::logger_t():
m_enabled_log_level { log_level_e::info } {
Logger::Logger():
m_enabled_log_level { LogLevel::info } {
}

log_writer_t::log_writer_t(const logger_t::log_level_e log_level):
LogWriter::LogWriter(const Logger::LogLevel log_level):
m_log_level { log_level } {}

log_writer_t::~log_writer_t() {
logger_t::get().write(m_log_level, m_buffer.str());
LogWriter::~LogWriter() {
Logger::get().write(m_log_level, m_buffer.str());
}
} // namespace display_device
26 changes: 13 additions & 13 deletions src/windows/include/displaydevice/windows/winapilayer.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -9,28 +9,28 @@ namespace display_device {
*/
class WinApiLayer: public WinApiLayerInterface {
public:
/** For details @see WinApiLayerInterface::get_error_string */
/** For details @see WinApiLayerInterface::getErrorString */
[[nodiscard]] std::string
get_error_string(LONG error_code) const override;
getErrorString(LONG error_code) const override;

/** For details @see WinApiLayerInterface::query_display_config */
[[nodiscard]] std::optional<path_and_mode_data_t>
query_display_config(query_type_e type) const override;
/** For details @see WinApiLayerInterface::queryDisplayConfig */
[[nodiscard]] std::optional<PathAndModeData>
queryDisplayConfig(QueryType type) const override;

/** For details @see WinApiLayerInterface::get_device_id */
/** For details @see WinApiLayerInterface::getDeviceId */
[[nodiscard]] std::string
get_device_id(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDeviceId(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_monitor_device_path */
/** For details @see WinApiLayerInterface::getMonitorDevicePath */
[[nodiscard]] std::string
get_monitor_device_path(const DISPLAYCONFIG_PATH_INFO &path) const override;
getMonitorDevicePath(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_friendly_name */
/** For details @see WinApiLayerInterface::getFriendlyName */
[[nodiscard]] std::string
get_friendly_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getFriendlyName(const DISPLAYCONFIG_PATH_INFO &path) const override;

/** For details @see WinApiLayerInterface::get_display_name */
/** For details @see WinApiLayerInterface::getDisplayName */
[[nodiscard]] std::string
get_display_name(const DISPLAYCONFIG_PATH_INFO &path) const override;
getDisplayName(const DISPLAYCONFIG_PATH_INFO &path) const override;
};
} // namespace display_device
Loading