mirror of
https://github.com/hyprwm/Hyprland
synced 2024-12-23 01:09:49 +01:00
notify: Add custom fontsize support for notifications (#4981)
* Add custom fontsize support for notifications * Remove debug stuff * Use original default font size * Handle fontsize as keyword arg * Use CVarList::join instead of for loop * Use size_t for msgidx
This commit is contained in:
parent
8e2a62e53b
commit
067df84388
3 changed files with 37 additions and 26 deletions
|
@ -1455,17 +1455,29 @@ std::string dispatchNotify(eHyprCtlOutputFormat format, std::string request) {
|
||||||
time = std::stoi(TIME);
|
time = std::stoi(TIME);
|
||||||
} catch (std::exception& e) { return "invalid arg 2"; }
|
} catch (std::exception& e) { return "invalid arg 2"; }
|
||||||
|
|
||||||
CColor color = configStringToInt(vars[3]);
|
CColor color = configStringToInt(vars[3]);
|
||||||
|
|
||||||
std::string message = "";
|
size_t msgidx = 4;
|
||||||
|
float fontsize = 13.f;
|
||||||
|
if (vars[msgidx].length() > 9 && vars[msgidx].compare(0, 10, "fontsize:")) {
|
||||||
|
const auto FONTSIZE = vars[msgidx].substr(9);
|
||||||
|
|
||||||
for (size_t i = 4; i < vars.size(); ++i) {
|
if (!isNumber(FONTSIZE, true))
|
||||||
message += vars[i] + " ";
|
return "invalid fontsize kwarg";
|
||||||
|
|
||||||
|
try {
|
||||||
|
fontsize = std::stoi(FONTSIZE);
|
||||||
|
} catch (std::exception& e) { return "invalid fontsize karg"; }
|
||||||
|
|
||||||
|
++msgidx;
|
||||||
}
|
}
|
||||||
|
|
||||||
message.pop_back();
|
if (vars.size() <= msgidx)
|
||||||
|
return "not enough args";
|
||||||
|
|
||||||
g_pHyprNotificationOverlay->addNotification(message, color, time, (eIcons)icon);
|
const auto MESSAGE = vars.join(" ", msgidx);
|
||||||
|
|
||||||
|
g_pHyprNotificationOverlay->addNotification(MESSAGE, color, time, (eIcons)icon, fontsize);
|
||||||
|
|
||||||
return "ok";
|
return "ok";
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,14 +36,15 @@ CHyprNotificationOverlay::CHyprNotificationOverlay() {
|
||||||
m_szIconFontName = fonts.substr(COLON + 2, LASTCHAR - (COLON + 2));
|
m_szIconFontName = fonts.substr(COLON + 2, LASTCHAR - (COLON + 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprNotificationOverlay::addNotification(const std::string& text, const CColor& color, const float timeMs, const eIcons icon) {
|
void CHyprNotificationOverlay::addNotification(const std::string& text, const CColor& color, const float timeMs, const eIcons icon, const float fontSize) {
|
||||||
const auto PNOTIF = m_dNotifications.emplace_back(std::make_unique<SNotification>()).get();
|
const auto PNOTIF = m_dNotifications.emplace_back(std::make_unique<SNotification>()).get();
|
||||||
|
|
||||||
PNOTIF->text = text;
|
PNOTIF->text = text;
|
||||||
PNOTIF->color = color == CColor(0) ? ICONS_COLORS[icon] : color;
|
PNOTIF->color = color == CColor(0) ? ICONS_COLORS[icon] : color;
|
||||||
PNOTIF->started.reset();
|
PNOTIF->started.reset();
|
||||||
PNOTIF->timeMs = timeMs;
|
PNOTIF->timeMs = timeMs;
|
||||||
PNOTIF->icon = icon;
|
PNOTIF->icon = icon;
|
||||||
|
PNOTIF->fontSize = fontSize;
|
||||||
|
|
||||||
for (auto& m : g_pCompositor->m_vMonitors) {
|
for (auto& m : g_pCompositor->m_vMonitors) {
|
||||||
g_pCompositor->scheduleFrameForMonitor(m.get());
|
g_pCompositor->scheduleFrameForMonitor(m.get());
|
||||||
|
@ -73,28 +74,25 @@ CBox CHyprNotificationOverlay::drawNotifications(CMonitor* pMonitor) {
|
||||||
float offsetY = 10;
|
float offsetY = 10;
|
||||||
float maxWidth = 0;
|
float maxWidth = 0;
|
||||||
|
|
||||||
const auto SCALE = pMonitor->scale;
|
const auto SCALE = pMonitor->scale;
|
||||||
const auto FONTSIZE = std::clamp((int)(13.f * ((pMonitor->vecPixelSize.x * SCALE) / 1920.f)), 8, 40);
|
|
||||||
|
|
||||||
const auto MONSIZE = pMonitor->vecPixelSize;
|
const auto MONSIZE = pMonitor->vecPixelSize;
|
||||||
|
|
||||||
cairo_text_extents_t cairoExtents;
|
cairo_text_extents_t cairoExtents;
|
||||||
int iconW = 0, iconH = 0;
|
int iconW = 0, iconH = 0;
|
||||||
|
|
||||||
PangoLayout* pangoLayout;
|
|
||||||
PangoFontDescription* pangoFD;
|
|
||||||
|
|
||||||
pangoLayout = pango_cairo_create_layout(m_pCairo);
|
|
||||||
pangoFD = pango_font_description_from_string(("Sans " + std::to_string(FONTSIZE * ICON_SCALE)).c_str());
|
|
||||||
pango_layout_set_font_description(pangoLayout, pangoFD);
|
|
||||||
|
|
||||||
cairo_select_font_face(m_pCairo, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
|
cairo_select_font_face(m_pCairo, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
|
||||||
cairo_set_font_size(m_pCairo, FONTSIZE);
|
|
||||||
|
|
||||||
const auto PBEZIER = g_pAnimationManager->getBezier("default");
|
const auto PBEZIER = g_pAnimationManager->getBezier("default");
|
||||||
|
|
||||||
for (auto& notif : m_dNotifications) {
|
for (auto& notif : m_dNotifications) {
|
||||||
const auto ICONPADFORNOTIF = notif->icon == ICON_NONE ? 0 : ICON_PAD;
|
const auto ICONPADFORNOTIF = notif->icon == ICON_NONE ? 0 : ICON_PAD;
|
||||||
|
const auto FONTSIZE = std::clamp((int)(notif->fontSize * ((pMonitor->vecPixelSize.x * SCALE) / 1920.f)), 8, 40);
|
||||||
|
|
||||||
|
PangoLayout* pangoLayout = pango_cairo_create_layout(m_pCairo);
|
||||||
|
PangoFontDescription* pangoFD = pango_font_description_from_string(("Sans " + std::to_string(FONTSIZE * ICON_SCALE)).c_str());
|
||||||
|
pango_layout_set_font_description(pangoLayout, pangoFD);
|
||||||
|
cairo_set_font_size(m_pCairo, FONTSIZE);
|
||||||
|
|
||||||
// first rect (bg, col)
|
// first rect (bg, col)
|
||||||
const float FIRSTRECTANIMP =
|
const float FIRSTRECTANIMP =
|
||||||
|
@ -174,10 +172,10 @@ CBox CHyprNotificationOverlay::drawNotifications(CMonitor* pMonitor) {
|
||||||
|
|
||||||
if (maxWidth < NOTIFSIZE.x)
|
if (maxWidth < NOTIFSIZE.x)
|
||||||
maxWidth = NOTIFSIZE.x;
|
maxWidth = NOTIFSIZE.x;
|
||||||
}
|
|
||||||
|
|
||||||
pango_font_description_free(pangoFD);
|
pango_font_description_free(pangoFD);
|
||||||
g_object_unref(pangoLayout);
|
g_object_unref(pangoLayout);
|
||||||
|
}
|
||||||
|
|
||||||
// cleanup notifs
|
// cleanup notifs
|
||||||
std::erase_if(m_dNotifications, [](const auto& notif) { return notif->started.getMillis() > notif->timeMs; });
|
std::erase_if(m_dNotifications, [](const auto& notif) { return notif->started.getMillis() > notif->timeMs; });
|
||||||
|
|
|
@ -31,8 +31,9 @@ struct SNotification {
|
||||||
std::string text = "";
|
std::string text = "";
|
||||||
CColor color;
|
CColor color;
|
||||||
CTimer started;
|
CTimer started;
|
||||||
float timeMs = 0;
|
float timeMs = 0;
|
||||||
eIcons icon = ICON_NONE;
|
eIcons icon = ICON_NONE;
|
||||||
|
float fontSize = 13.f;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CHyprNotificationOverlay {
|
class CHyprNotificationOverlay {
|
||||||
|
@ -40,7 +41,7 @@ class CHyprNotificationOverlay {
|
||||||
CHyprNotificationOverlay();
|
CHyprNotificationOverlay();
|
||||||
|
|
||||||
void draw(CMonitor* pMonitor);
|
void draw(CMonitor* pMonitor);
|
||||||
void addNotification(const std::string& text, const CColor& color, const float timeMs, const eIcons icon = ICON_NONE);
|
void addNotification(const std::string& text, const CColor& color, const float timeMs, const eIcons icon = ICON_NONE, const float fontSize = 13.f);
|
||||||
void dismissNotifications(const int amount);
|
void dismissNotifications(const int amount);
|
||||||
bool hasAny();
|
bool hasAny();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue