mirror of
https://github.com/hyprwm/Hyprland
synced 2026-05-07 08:38:05 +02:00
notifications: move and small refactor (#14094)
moves to notification/, and adds a new style manager getter.
This commit is contained in:
parent
ff459f4a2a
commit
4cce7f60a9
11 changed files with 141 additions and 132 deletions
|
|
@ -73,7 +73,7 @@
|
|||
#include "render/AsyncResourceGatherer.hpp"
|
||||
#include "plugins/PluginSystem.hpp"
|
||||
#include "hyprerror/HyprError.hpp"
|
||||
#include "debug/HyprNotificationOverlay.hpp"
|
||||
#include "notification/NotificationOverlay.hpp"
|
||||
#include "debug/HyprDebugOverlay.hpp"
|
||||
#include "helpers/MonitorFrameScheduler.hpp"
|
||||
#include "i18n/Engine.hpp"
|
||||
|
|
@ -590,7 +590,7 @@ void CCompositor::cleanup() {
|
|||
g_pDecorationPositioner.reset();
|
||||
g_pCursorManager.reset();
|
||||
g_pPluginSystem.reset();
|
||||
g_pHyprNotificationOverlay.reset();
|
||||
Notification::overlay().reset();
|
||||
g_pDebugOverlay.reset();
|
||||
g_pEventManager.reset();
|
||||
g_pSessionLockManager.reset();
|
||||
|
|
@ -697,8 +697,8 @@ void CCompositor::initManagers(eManagersInitStage stage) {
|
|||
Log::logger->log(Log::DEBUG, "Creating the HyprDebugOverlay!");
|
||||
g_pDebugOverlay = makeUnique<CHyprDebugOverlay>();
|
||||
|
||||
Log::logger->log(Log::DEBUG, "Creating the HyprNotificationOverlay!");
|
||||
g_pHyprNotificationOverlay = makeUnique<CHyprNotificationOverlay>();
|
||||
Log::logger->log(Log::DEBUG, "Creating the NotificationOverlay!");
|
||||
Notification::overlay();
|
||||
|
||||
Log::logger->log(Log::DEBUG, "Creating the PluginSystem!");
|
||||
g_pPluginSystem = makeUnique<CPluginSystem>();
|
||||
|
|
@ -2573,7 +2573,7 @@ void CCompositor::performUserChecks() {
|
|||
if (!*PNOCHECKXDG) {
|
||||
const auto CURRENT_DESKTOP_ENV = getenv("XDG_CURRENT_DESKTOP");
|
||||
if (!CURRENT_DESKTOP_ENV || std::string{CURRENT_DESKTOP_ENV} != "Hyprland") {
|
||||
g_pHyprNotificationOverlay->addNotification(
|
||||
Notification::overlay()->addNotification(
|
||||
I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_EXTERNAL_XDG_DESKTOP, {{"value", CURRENT_DESKTOP_ENV ? CURRENT_DESKTOP_ENV : "unset"}}), CHyprColor{}, 15000,
|
||||
ICON_WARNING);
|
||||
}
|
||||
|
|
@ -2581,16 +2581,16 @@ void CCompositor::performUserChecks() {
|
|||
|
||||
if (!*PNOCHECKGUIUTILS) {
|
||||
if (!NFsUtils::executableExistsInPath("hyprland-dialog"))
|
||||
g_pHyprNotificationOverlay->addNotification(I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_NO_GUIUTILS), CHyprColor{}, 15000, ICON_WARNING);
|
||||
Notification::overlay()->addNotification(I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_NO_GUIUTILS), CHyprColor{}, 15000, ICON_WARNING);
|
||||
}
|
||||
|
||||
if (g_pHyprRenderer->m_failedAssetsNo > 0) {
|
||||
g_pHyprNotificationOverlay->addNotification(I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_FAILED_ASSETS, {{"count", std::to_string(g_pHyprRenderer->m_failedAssetsNo)}}),
|
||||
CHyprColor{1.0, 0.1, 0.1, 1.0}, 15000, ICON_ERROR);
|
||||
Notification::overlay()->addNotification(I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_FAILED_ASSETS, {{"count", std::to_string(g_pHyprRenderer->m_failedAssetsNo)}}),
|
||||
CHyprColor{1.0, 0.1, 0.1, 1.0}, 15000, ICON_ERROR);
|
||||
}
|
||||
|
||||
if (!m_watchdogWriteFd.isValid() && !*PNOWATCHDOG)
|
||||
g_pHyprNotificationOverlay->addNotification(I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_NO_WATCHDOG), CHyprColor{1.0, 0.1, 0.1, 1.0}, 15000, ICON_WARNING);
|
||||
Notification::overlay()->addNotification(I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_NO_WATCHDOG), CHyprColor{1.0, 0.1, 0.1, 1.0}, 15000, ICON_WARNING);
|
||||
|
||||
if (m_safeMode)
|
||||
openSafeModeBox();
|
||||
|
|
@ -2730,8 +2730,8 @@ void CCompositor::checkMonitorOverlaps() {
|
|||
for (const auto& m : m_monitors) {
|
||||
if (!monitorRegion.copy().intersect(m->logicalBox()).empty()) {
|
||||
Log::logger->log(Log::ERR, "Monitor {}: detected overlap with layout", m->m_name);
|
||||
g_pHyprNotificationOverlay->addNotification(I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_INVALID_MONITOR_LAYOUT, {{"name", m->m_name}}), CHyprColor{}, 15000,
|
||||
ICON_WARNING);
|
||||
Notification::overlay()->addNotification(I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_INVALID_MONITOR_LAYOUT, {{"name", m->m_name}}), CHyprColor{}, 15000,
|
||||
ICON_WARNING);
|
||||
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
#include "../../managers/eventLoop/EventLoopManager.hpp"
|
||||
#include "../../managers/EventManager.hpp"
|
||||
#include "../../managers/permissions/DynamicPermissionManager.hpp"
|
||||
#include "../../debug/HyprNotificationOverlay.hpp"
|
||||
#include "../../notification/NotificationOverlay.hpp"
|
||||
#include "../../plugins/PluginSystem.hpp"
|
||||
|
||||
#include "../../managers/input/trackpad/TrackpadGestures.hpp"
|
||||
|
|
@ -1360,8 +1360,8 @@ void CConfigManager::postConfigReload(const Hyprlang::CParseResult& result) {
|
|||
// manual crash
|
||||
if (std::any_cast<Hyprlang::INT>(m_config->getConfigValue("debug:manual_crash")) && !m_manualCrashInitiated) {
|
||||
m_manualCrashInitiated = true;
|
||||
g_pHyprNotificationOverlay->addNotification("Manual crash has been set up. Set debug:manual_crash back to 0 in order to crash the compositor.", CHyprColor(0), 5000,
|
||||
ICON_INFO);
|
||||
Notification::overlay()->addNotification("Manual crash has been set up. Set debug:manual_crash back to 0 in order to crash the compositor.", CHyprColor(0), 5000,
|
||||
ICON_INFO);
|
||||
} else if (m_manualCrashInitiated && !std::any_cast<Hyprlang::INT>(m_config->getConfigValue("debug:manual_crash"))) {
|
||||
// cowabunga it is
|
||||
g_pHyprRenderer->initiateManualCrash();
|
||||
|
|
@ -1428,10 +1428,8 @@ std::string CConfigManager::parseKeyword(const std::string& COMMAND, const std::
|
|||
// manual crash
|
||||
if (std::any_cast<Hyprlang::INT>(m_config->getConfigValue("debug:manual_crash")) && !m_manualCrashInitiated) {
|
||||
m_manualCrashInitiated = true;
|
||||
if (g_pHyprNotificationOverlay) {
|
||||
g_pHyprNotificationOverlay->addNotification("Manual crash has been set up. Set debug:manual_crash back to 0 in order to crash the compositor.", CHyprColor(0), 5000,
|
||||
ICON_INFO);
|
||||
}
|
||||
Notification::overlay()->addNotification("Manual crash has been set up. Set debug:manual_crash back to 0 in order to crash the compositor.", CHyprColor(0), 5000,
|
||||
ICON_INFO);
|
||||
} else if (m_manualCrashInitiated && !std::any_cast<Hyprlang::INT>(m_config->getConfigValue("debug:manual_crash"))) {
|
||||
// cowabunga it is
|
||||
g_pHyprRenderer->initiateManualCrash();
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ using namespace Hyprutils::OS;
|
|||
#include "../managers/XWaylandManager.hpp"
|
||||
#include "../plugins/PluginSystem.hpp"
|
||||
#include "../managers/animation/AnimationManager.hpp"
|
||||
#include "../debug/HyprNotificationOverlay.hpp"
|
||||
#include "../notification/NotificationOverlay.hpp"
|
||||
#include "../render/Renderer.hpp"
|
||||
#include "../render/OpenGL.hpp"
|
||||
#include "../layout/space/Space.hpp"
|
||||
|
|
@ -2002,7 +2002,7 @@ static std::string dispatchNotify(eHyprCtlOutputFormat format, std::string reque
|
|||
|
||||
const auto MESSAGE = vars.join(" ", msgidx);
|
||||
|
||||
g_pHyprNotificationOverlay->addNotification(MESSAGE, color, time, sc<eIcons>(icon), fontsize);
|
||||
Notification::overlay()->addNotification(MESSAGE, color, time, sc<eIcons>(icon), fontsize);
|
||||
|
||||
return "ok";
|
||||
}
|
||||
|
|
@ -2022,7 +2022,7 @@ static std::string dispatchDismissNotify(eHyprCtlOutputFormat format, std::strin
|
|||
} catch (std::exception& e) { return "invalid arg 1"; }
|
||||
}
|
||||
|
||||
g_pHyprNotificationOverlay->dismissNotifications(amount);
|
||||
Notification::overlay()->dismissNotifications(amount);
|
||||
|
||||
return "ok";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,72 +0,0 @@
|
|||
#pragma once
|
||||
|
||||
#include "../defines.hpp"
|
||||
#include "../helpers/time/Timer.hpp"
|
||||
#include "../render/Texture.hpp"
|
||||
#include "../SharedDefs.hpp"
|
||||
|
||||
#include <vector>
|
||||
|
||||
enum eIconBackend : uint8_t {
|
||||
ICONS_BACKEND_NONE = 0,
|
||||
ICONS_BACKEND_NF,
|
||||
ICONS_BACKEND_FA
|
||||
};
|
||||
|
||||
static const std::array<std::array<std::string, ICON_NONE + 1>, 3 /* backends */> ICONS_ARRAY = {
|
||||
std::array<std::string, ICON_NONE + 1>{"[!]", "[i]", "[Hint]", "[Err]", "[?]", "[ok]", ""},
|
||||
std::array<std::string, ICON_NONE + 1>{"", "", "", "", "", "", ""}, std::array<std::string, ICON_NONE + 1>{"", "", "", "", "", ""}};
|
||||
static const std::array<CHyprColor, ICON_NONE + 1> ICONS_COLORS = {CHyprColor{1.0, 204 / 255.0, 102 / 255.0, 1.0},
|
||||
CHyprColor{128 / 255.0, 255 / 255.0, 255 / 255.0, 1.0},
|
||||
CHyprColor{179 / 255.0, 255 / 255.0, 204 / 255.0, 1.0},
|
||||
CHyprColor{255 / 255.0, 77 / 255.0, 77 / 255.0, 1.0},
|
||||
CHyprColor{255 / 255.0, 204 / 255.0, 153 / 255.0, 1.0},
|
||||
CHyprColor{128 / 255.0, 255 / 255.0, 128 / 255.0, 1.0},
|
||||
CHyprColor{0, 0, 0, 1.0}};
|
||||
|
||||
struct SNotification {
|
||||
struct SRenderCache {
|
||||
SP<Render::ITexture> textTex;
|
||||
SP<Render::ITexture> iconTex;
|
||||
|
||||
Vector2D textSize = {};
|
||||
Vector2D iconSize = {};
|
||||
|
||||
PHLMONITORREF monitor;
|
||||
std::string fontFamily;
|
||||
int fontSizePx = -1;
|
||||
eIconBackend iconBackend = ICONS_BACKEND_NONE;
|
||||
} cache;
|
||||
|
||||
std::string text = "";
|
||||
CHyprColor color;
|
||||
CTimer started;
|
||||
float timeMs = 0;
|
||||
eIcons icon = ICON_NONE;
|
||||
float fontSize = 13.f;
|
||||
};
|
||||
|
||||
class CHyprNotificationOverlay {
|
||||
public:
|
||||
CHyprNotificationOverlay();
|
||||
~CHyprNotificationOverlay();
|
||||
|
||||
void draw(PHLMONITOR pMonitor);
|
||||
void addNotification(const std::string& text, const CHyprColor& color, const float timeMs, const eIcons icon = ICON_NONE, const float fontSize = 13.f);
|
||||
void dismissNotifications(const int amount);
|
||||
bool hasAny();
|
||||
|
||||
private:
|
||||
void ensureNotificationCache(SNotification& notif, PHLMONITOR pMonitor, const std::string& fontFamily);
|
||||
eIconBackend iconBackendForFont(const std::string& fontFamily);
|
||||
CBox drawNotifications(PHLMONITOR pMonitor);
|
||||
CBox m_lastDamage;
|
||||
|
||||
std::vector<UP<SNotification>> m_notifications;
|
||||
|
||||
std::string m_cachedIconBackendFontFamily;
|
||||
eIconBackend m_cachedIconBackend = ICONS_BACKEND_NONE;
|
||||
bool m_iconBackendValid = false;
|
||||
};
|
||||
|
||||
inline UP<CHyprNotificationOverlay> g_pHyprNotificationOverlay;
|
||||
|
|
@ -42,7 +42,7 @@
|
|||
#include "Drm.hpp"
|
||||
#include <aquamarine/output/Output.hpp>
|
||||
#include "debug/log/Logger.hpp"
|
||||
#include "debug/HyprNotificationOverlay.hpp"
|
||||
#include "notification/NotificationOverlay.hpp"
|
||||
#include "MonitorFrameScheduler.hpp"
|
||||
#include <hyprutils/memory/UniquePtr.hpp>
|
||||
#include <hyprutils/string/String.hpp>
|
||||
|
|
@ -896,7 +896,7 @@ bool CMonitor::applyMonitorRule(Config::CMonitorRule&& pMonitorRule, bool force)
|
|||
auto errorMessage = I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_MONITOR_MODE_FAIL,
|
||||
{{"name", m_name}, {"mode", std::format("{:X0}@{:.2f}Hz", mode->pixelSize, mode->refreshRate / 1000.f)}});
|
||||
Log::logger->log(Log::WARN, errorMessage);
|
||||
g_pHyprNotificationOverlay->addNotification(errorMessage, CHyprColor(0xff0000ff), 5000, ICON_WARNING);
|
||||
Notification::overlay()->addNotification(errorMessage, CHyprColor(0xff0000ff), 5000, ICON_WARNING);
|
||||
|
||||
m_refreshRate = mode->refreshRate / 1000.f;
|
||||
m_size = mode->pixelSize;
|
||||
|
|
@ -1037,11 +1037,12 @@ bool CMonitor::applyMonitorRule(Config::CMonitorRule&& pMonitorRule, bool force)
|
|||
if (!autoScale) {
|
||||
Log::logger->log(Log::ERR, "Invalid scale passed to monitor, {} found suggestion {}", m_scale, searchScale);
|
||||
static auto PDISABLENOTIFICATION = CConfigValue<Hyprlang::INT>("misc:disable_scale_notification");
|
||||
if (!*PDISABLENOTIFICATION)
|
||||
g_pHyprNotificationOverlay->addNotification(
|
||||
if (!*PDISABLENOTIFICATION) {
|
||||
Notification::overlay()->addNotification(
|
||||
I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_MONITOR_AUTO_SCALE,
|
||||
{{"name", m_name}, {"scale", std::format("{:.2f}", m_scale)}, {"fixed_scale", std::format("{:.2f}", searchScale)}}),
|
||||
CHyprColor(1.0, 0.0, 0.0, 1.0), 5000, ICON_WARNING);
|
||||
}
|
||||
}
|
||||
m_scale = searchScale;
|
||||
}
|
||||
|
|
@ -1683,7 +1684,7 @@ uint32_t CMonitor::isSolitaryBlocked(bool full) {
|
|||
return reasons;
|
||||
}
|
||||
|
||||
if (g_pHyprNotificationOverlay->hasAny()) {
|
||||
if (Notification::overlay()->hasAny()) {
|
||||
reasons |= SC_NOTIFICATION;
|
||||
if (!full)
|
||||
return reasons;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
#include <cmath>
|
||||
#include <numeric>
|
||||
#include <pango/pangocairo.h>
|
||||
#include "HyprNotificationOverlay.hpp"
|
||||
#include "NotificationOverlay.hpp"
|
||||
#include "../Compositor.hpp"
|
||||
#include "../config/ConfigValue.hpp"
|
||||
#include "../render/pass/RectPassElement.hpp"
|
||||
|
|
@ -12,6 +12,8 @@
|
|||
#include "../managers/animation/AnimationManager.hpp"
|
||||
#include "../render/Renderer.hpp"
|
||||
|
||||
using namespace Notification;
|
||||
|
||||
static inline auto iconBackendFromLayout(PangoLayout* layout) {
|
||||
// preference: Nerd > FontAwesome > text
|
||||
auto eIconBackendChecks = std::array<eIconBackend, 2>{ICONS_BACKEND_NF, ICONS_BACKEND_FA};
|
||||
|
|
@ -24,18 +26,23 @@ static inline auto iconBackendFromLayout(PangoLayout* layout) {
|
|||
return ICONS_BACKEND_NONE;
|
||||
}
|
||||
|
||||
static constexpr auto ANIM_DURATION_MS = 600.F;
|
||||
static constexpr auto ANIM_LAG_MS = 100.F;
|
||||
static constexpr auto NOTIF_LEFTBAR_SIZE = 5.F;
|
||||
static constexpr auto NOTIF_PAD_X = 20.F;
|
||||
static constexpr auto NOTIF_PAD_Y = 10.F;
|
||||
static constexpr auto NOTIF_OFFSET_Y = 10.F;
|
||||
static constexpr auto NOTIF_GAP_Y = 10.F;
|
||||
static constexpr auto NOTIF_DAMAGE_PAD_X = 20.F;
|
||||
static constexpr auto ICON_PAD = 3.F;
|
||||
static constexpr auto ICON_SCALE = 0.9F;
|
||||
static constexpr auto ANIM_DURATION_MS = 600.F;
|
||||
static constexpr auto ANIM_LAG_MS = 100.F;
|
||||
static constexpr auto NOTIF_LEFTBAR_SIZE = 5.F;
|
||||
static constexpr auto NOTIF_PAD_X = 20.F;
|
||||
static constexpr auto NOTIF_PAD_Y = 10.F;
|
||||
static constexpr auto NOTIF_OFFSET_Y = 10.F;
|
||||
static constexpr auto NOTIF_GAP_Y = 10.F;
|
||||
static constexpr auto NOTIF_DAMAGE_PAD_X = 20.F;
|
||||
static constexpr auto ICON_PAD = 3.F;
|
||||
static constexpr auto ICON_SCALE = 0.9F;
|
||||
|
||||
CHyprNotificationOverlay::CHyprNotificationOverlay() {
|
||||
UP<CNotificationOverlay>& Notification::overlay() {
|
||||
static UP<CNotificationOverlay> p = makeUnique<CNotificationOverlay>();
|
||||
return p;
|
||||
}
|
||||
|
||||
CNotificationOverlay::CNotificationOverlay() {
|
||||
static auto P = Event::bus()->m_events.monitor.focused.listen([&](PHLMONITOR mon) {
|
||||
if (m_notifications.empty())
|
||||
return;
|
||||
|
|
@ -44,9 +51,9 @@ CHyprNotificationOverlay::CHyprNotificationOverlay() {
|
|||
});
|
||||
}
|
||||
|
||||
CHyprNotificationOverlay::~CHyprNotificationOverlay() = default;
|
||||
CNotificationOverlay::~CNotificationOverlay() = default;
|
||||
|
||||
eIconBackend CHyprNotificationOverlay::iconBackendForFont(const std::string& fontFamily) {
|
||||
eIconBackend CNotificationOverlay::iconBackendForFont(const std::string& fontFamily) {
|
||||
if (m_iconBackendValid && m_cachedIconBackendFontFamily == fontFamily)
|
||||
return m_cachedIconBackend;
|
||||
|
||||
|
|
@ -72,7 +79,7 @@ eIconBackend CHyprNotificationOverlay::iconBackendForFont(const std::string& fon
|
|||
return m_cachedIconBackend;
|
||||
}
|
||||
|
||||
void CHyprNotificationOverlay::ensureNotificationCache(SNotification& notif, PHLMONITOR pMonitor, const std::string& fontFamily) {
|
||||
void CNotificationOverlay::ensureNotificationCache(SNotification& notif, PHLMONITOR pMonitor, const std::string& fontFamily) {
|
||||
const auto iconBackend = iconBackendForFont(fontFamily);
|
||||
const auto fontSizePx = std::clamp(sc<int>(notif.fontSize * ((pMonitor->m_pixelSize.x * pMonitor->m_scale) / 1920.f)), 8, 40);
|
||||
|
||||
|
|
@ -102,7 +109,7 @@ void CHyprNotificationOverlay::ensureNotificationCache(SNotification& notif, PHL
|
|||
}
|
||||
}
|
||||
|
||||
void CHyprNotificationOverlay::addNotification(const std::string& text, const CHyprColor& color, const float timeMs, const eIcons icon, const float fontSize) {
|
||||
void CNotificationOverlay::addNotification(const std::string& text, const CHyprColor& color, const float timeMs, const eIcons icon, const float fontSize) {
|
||||
const auto PNOTIF = m_notifications.emplace_back(makeUnique<SNotification>()).get();
|
||||
|
||||
PNOTIF->text = text;
|
||||
|
|
@ -117,7 +124,7 @@ void CHyprNotificationOverlay::addNotification(const std::string& text, const CH
|
|||
}
|
||||
}
|
||||
|
||||
void CHyprNotificationOverlay::dismissNotifications(const int amount) {
|
||||
void CNotificationOverlay::dismissNotifications(const int amount) {
|
||||
if (amount == -1)
|
||||
m_notifications.clear();
|
||||
else {
|
||||
|
|
@ -133,7 +140,7 @@ void CHyprNotificationOverlay::dismissNotifications(const int amount) {
|
|||
}
|
||||
}
|
||||
|
||||
CBox CHyprNotificationOverlay::drawNotifications(PHLMONITOR pMonitor) {
|
||||
CBox CNotificationOverlay::drawNotifications(PHLMONITOR pMonitor) {
|
||||
float offsetY = NOTIF_OFFSET_Y;
|
||||
float maxWidth = 0;
|
||||
|
||||
|
|
@ -223,7 +230,7 @@ CBox CHyprNotificationOverlay::drawNotifications(PHLMONITOR pMonitor) {
|
|||
sc<int>(offsetY + NOTIF_OFFSET_Y)};
|
||||
}
|
||||
|
||||
void CHyprNotificationOverlay::draw(PHLMONITOR pMonitor) {
|
||||
void CNotificationOverlay::draw(PHLMONITOR pMonitor) {
|
||||
// Draw the notifications
|
||||
if (m_notifications.empty()) {
|
||||
if (m_lastDamage.width > 0 && m_lastDamage.height > 0)
|
||||
|
|
@ -242,6 +249,6 @@ void CHyprNotificationOverlay::draw(PHLMONITOR pMonitor) {
|
|||
m_lastDamage = damage;
|
||||
}
|
||||
|
||||
bool CHyprNotificationOverlay::hasAny() {
|
||||
bool CNotificationOverlay::hasAny() {
|
||||
return !m_notifications.empty();
|
||||
}
|
||||
75
src/notification/NotificationOverlay.hpp
Normal file
75
src/notification/NotificationOverlay.hpp
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
#pragma once
|
||||
|
||||
#include "../defines.hpp"
|
||||
#include "../helpers/time/Timer.hpp"
|
||||
#include "../render/Texture.hpp"
|
||||
#include "../SharedDefs.hpp"
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace Notification {
|
||||
|
||||
enum eIconBackend : uint8_t {
|
||||
ICONS_BACKEND_NONE = 0,
|
||||
ICONS_BACKEND_NF,
|
||||
ICONS_BACKEND_FA
|
||||
};
|
||||
|
||||
static const std::array<std::array<std::string, ICON_NONE + 1>, 3 /* backends */> ICONS_ARRAY = {
|
||||
std::array<std::string, ICON_NONE + 1>{"[!]", "[i]", "[Hint]", "[Err]", "[?]", "[ok]", ""},
|
||||
std::array<std::string, ICON_NONE + 1>{"", "", "", "", "", "", ""}, std::array<std::string, ICON_NONE + 1>{"", "", "", "", "", ""}};
|
||||
static const std::array<CHyprColor, ICON_NONE + 1> ICONS_COLORS = {CHyprColor{1.0, 204 / 255.0, 102 / 255.0, 1.0},
|
||||
CHyprColor{128 / 255.0, 255 / 255.0, 255 / 255.0, 1.0},
|
||||
CHyprColor{179 / 255.0, 255 / 255.0, 204 / 255.0, 1.0},
|
||||
CHyprColor{255 / 255.0, 77 / 255.0, 77 / 255.0, 1.0},
|
||||
CHyprColor{255 / 255.0, 204 / 255.0, 153 / 255.0, 1.0},
|
||||
CHyprColor{128 / 255.0, 255 / 255.0, 128 / 255.0, 1.0},
|
||||
CHyprColor{0, 0, 0, 1.0}};
|
||||
|
||||
struct SNotification {
|
||||
struct SRenderCache {
|
||||
SP<Render::ITexture> textTex;
|
||||
SP<Render::ITexture> iconTex;
|
||||
|
||||
Vector2D textSize = {};
|
||||
Vector2D iconSize = {};
|
||||
|
||||
PHLMONITORREF monitor;
|
||||
std::string fontFamily;
|
||||
int fontSizePx = -1;
|
||||
eIconBackend iconBackend = ICONS_BACKEND_NONE;
|
||||
} cache;
|
||||
|
||||
std::string text = "";
|
||||
CHyprColor color;
|
||||
CTimer started;
|
||||
float timeMs = 0;
|
||||
eIcons icon = ICON_NONE;
|
||||
float fontSize = 13.f;
|
||||
};
|
||||
|
||||
class CNotificationOverlay {
|
||||
public:
|
||||
CNotificationOverlay();
|
||||
~CNotificationOverlay();
|
||||
|
||||
void draw(PHLMONITOR pMonitor);
|
||||
void addNotification(const std::string& text, const CHyprColor& color, const float timeMs, const eIcons icon = ICON_NONE, const float fontSize = 13.f);
|
||||
void dismissNotifications(const int amount);
|
||||
bool hasAny();
|
||||
|
||||
private:
|
||||
void ensureNotificationCache(SNotification& notif, PHLMONITOR pMonitor, const std::string& fontFamily);
|
||||
eIconBackend iconBackendForFont(const std::string& fontFamily);
|
||||
CBox drawNotifications(PHLMONITOR pMonitor);
|
||||
CBox m_lastDamage;
|
||||
|
||||
std::vector<UP<SNotification>> m_notifications;
|
||||
|
||||
std::string m_cachedIconBackendFontFamily;
|
||||
eIconBackend m_cachedIconBackend = ICONS_BACKEND_NONE;
|
||||
bool m_iconBackendValid = false;
|
||||
};
|
||||
|
||||
UP<CNotificationOverlay>& overlay();
|
||||
}
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
#include "../plugins/PluginSystem.hpp"
|
||||
#include "../managers/eventLoop/EventLoopManager.hpp"
|
||||
#include "../config/legacy/ConfigManager.hpp"
|
||||
#include "../debug/HyprNotificationOverlay.hpp"
|
||||
#include "../notification/NotificationOverlay.hpp"
|
||||
#include "../layout/target/Target.hpp"
|
||||
#include "../layout/supplementary/WorkspaceAlgoMatcher.hpp"
|
||||
#include <dlfcn.h>
|
||||
|
|
@ -113,7 +113,7 @@ APICALL bool HyprlandAPI::addNotification(HANDLE handle, const std::string& text
|
|||
if (!PLUGIN)
|
||||
return false;
|
||||
|
||||
g_pHyprNotificationOverlay->addNotification(text, color, timeMs);
|
||||
Notification::overlay()->addNotification(text, color, timeMs);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -301,7 +301,7 @@ APICALL bool addNotificationV2(HANDLE handle, const std::unordered_map<std::stri
|
|||
if (iterator != data.end())
|
||||
icon = std::any_cast<eIcons>(iterator->second);
|
||||
|
||||
g_pHyprNotificationOverlay->addNotification(text, COLOR, TIME, icon);
|
||||
Notification::overlay()->addNotification(text, COLOR, TIME, icon);
|
||||
|
||||
} catch (std::exception& e) {
|
||||
// bad any_cast most likely, plugin error
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
#include "../debug/HyprCtl.hpp"
|
||||
#include "../managers/eventLoop/EventLoopManager.hpp"
|
||||
#include "../managers/permissions/DynamicPermissionManager.hpp"
|
||||
#include "../debug/HyprNotificationOverlay.hpp"
|
||||
#include "../notification/NotificationOverlay.hpp"
|
||||
#include "../layout/supplementary/WorkspaceAlgoMatcher.hpp"
|
||||
#include "../i18n/Engine.hpp"
|
||||
|
||||
|
|
@ -228,8 +228,8 @@ void CPluginSystem::updateConfigPlugins(const std::vector<std::string>& plugins,
|
|||
if (result->hasError()) {
|
||||
const auto NAME = path.contains('/') ? path.substr(path.find_last_of('/') + 1) : path;
|
||||
Log::logger->log(Log::ERR, "CPluginSystem::updateConfigPlugins: failed to load plugin {}: {}", NAME, result->error());
|
||||
g_pHyprNotificationOverlay->addNotification(I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_FAILED_TO_LOAD_PLUGIN, {{"name", NAME}, {"error", result->error()}}),
|
||||
CHyprColor{0, 0, 0, 0}, 5000, ICON_ERROR);
|
||||
Notification::overlay()->addNotification(I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_FAILED_TO_LOAD_PLUGIN, {{"name", NAME}, {"error", result->error()}}),
|
||||
CHyprColor{0, 0, 0, 0}, 5000, ICON_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
#include "../i18n/Engine.hpp"
|
||||
#include "../event/EventBus.hpp"
|
||||
#include "../managers/screenshare/ScreenshareManager.hpp"
|
||||
#include "../debug/HyprNotificationOverlay.hpp"
|
||||
#include "../notification/NotificationOverlay.hpp"
|
||||
#include "hyprerror/HyprError.hpp"
|
||||
#include "macros.hpp"
|
||||
#include "pass/TexPassElement.hpp"
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
#include "../helpers/sync/SyncTimeline.hpp"
|
||||
#include "../hyprerror/HyprError.hpp"
|
||||
#include "../debug/HyprDebugOverlay.hpp"
|
||||
#include "../debug/HyprNotificationOverlay.hpp"
|
||||
#include "../notification/NotificationOverlay.hpp"
|
||||
#include "../layout/LayoutManager.hpp"
|
||||
#include "../layout/space/Space.hpp"
|
||||
#include "../i18n/Engine.hpp"
|
||||
|
|
@ -2040,7 +2040,7 @@ void IHyprRenderer::renderMonitor(PHLMONITOR pMonitor, bool commit) {
|
|||
renderLockscreen(pMonitor, NOW, renderBox);
|
||||
|
||||
if (pMonitor == Desktop::focusState()->monitor()) {
|
||||
g_pHyprNotificationOverlay->draw(pMonitor);
|
||||
Notification::overlay()->draw(pMonitor);
|
||||
g_pHyprError->draw();
|
||||
}
|
||||
|
||||
|
|
@ -2261,8 +2261,8 @@ bool IHyprRenderer::commitPendingAndDoExplicitSync(PHLMONITOR pMonitor) {
|
|||
Log::logger->log(Log::WARN, "Wide color gamut is enabled but the display is not in 10bit mode");
|
||||
static bool shown = false;
|
||||
if (!shown) {
|
||||
g_pHyprNotificationOverlay->addNotification(I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_WIDE_COLOR_NOT_10B, {{"name", pMonitor->m_name}}), CHyprColor{}, 15000,
|
||||
ICON_WARNING);
|
||||
Notification::overlay()->addNotification(I18n::i18nEngine()->localize(I18n::TXT_KEY_NOTIF_WIDE_COLOR_NOT_10B, {{"name", pMonitor->m_name}}), CHyprColor{}, 15000,
|
||||
ICON_WARNING);
|
||||
shown = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -2834,8 +2834,8 @@ std::tuple<float, float, float> IHyprRenderer::getRenderTimes(PHLMONITOR pMonito
|
|||
|
||||
static int handleCrashLoop(void* data) {
|
||||
|
||||
g_pHyprNotificationOverlay->addNotification("Hyprland will crash in " + std::to_string(10 - sc<int>(g_pHyprRenderer->m_crashingDistort * 2.f)) + "s.", CHyprColor(0), 5000,
|
||||
ICON_INFO);
|
||||
Notification::overlay()->addNotification("Hyprland will crash in " + std::to_string(10 - sc<int>(g_pHyprRenderer->m_crashingDistort * 2.f)) + "s.", CHyprColor(0), 5000,
|
||||
ICON_INFO);
|
||||
|
||||
g_pHyprRenderer->m_crashingDistort += 0.5f;
|
||||
|
||||
|
|
@ -2848,7 +2848,7 @@ static int handleCrashLoop(void* data) {
|
|||
}
|
||||
|
||||
void IHyprRenderer::initiateManualCrash() {
|
||||
g_pHyprNotificationOverlay->addNotification("Manual crash initiated. Farewell...", CHyprColor(0), 5000, ICON_INFO);
|
||||
Notification::overlay()->addNotification("Manual crash initiated. Farewell...", CHyprColor(0), 5000, ICON_INFO);
|
||||
|
||||
m_crashingLoop = wl_event_loop_add_timer(g_pCompositor->m_wlEventLoop, handleCrashLoop, nullptr);
|
||||
wl_event_source_timer_update(m_crashingLoop, 1000);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue