input-field: only render the current output on fade out callback (#206)

This commit is contained in:
Maximilian Seidler 2024-03-19 03:49:12 +01:00 committed by GitHub
parent 1bf6ffdbe2
commit b50acfaf94
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 21 additions and 17 deletions

View file

@ -754,6 +754,17 @@ std::optional<std::string> CHyprlock::passwordLastFailReason() {
return m_sPasswordState.lastFailReason; return m_sPasswordState.lastFailReason;
} }
void CHyprlock::renderOutput(const std::string& stringPort) {
const auto MON = std::find_if(m_vOutputs.begin(), m_vOutputs.end(), [stringPort](const auto& other) { return other->stringPort == stringPort; });
if (MON == m_vOutputs.end() || !MON->get())
return;
const auto PMONITOR = MON->get();
PMONITOR->sessionLockSurface->render();
}
void CHyprlock::onKey(uint32_t key, bool down) { void CHyprlock::onKey(uint32_t key, bool down) {
if (m_bFadeStarted) if (m_bFadeStarted)
return; return;

View file

@ -56,6 +56,8 @@ class CHyprlock {
bool passwordCheckWaiting(); bool passwordCheckWaiting();
std::optional<std::string> passwordLastFailReason(); std::optional<std::string> passwordLastFailReason();
void renderOutput(const std::string& stringPort);
size_t getPasswordBufferLen(); size_t getPasswordBufferLen();
size_t getPasswordBufferDisplayLen(); size_t getPasswordBufferDisplayLen();
size_t getPasswordFailedAttempts(); size_t getPasswordFailedAttempts();

View file

@ -321,7 +321,7 @@ std::vector<std::unique_ptr<IWidget>>* CRenderer::getOrCreateWidgetsFor(const CS
widgets[surf].emplace_back(std::make_unique<CBackground>(surf->size, surf->output, resourceID, c.values, PATH == "screenshot")); widgets[surf].emplace_back(std::make_unique<CBackground>(surf->size, surf->output, resourceID, c.values, PATH == "screenshot"));
} else if (c.type == "input-field") { } else if (c.type == "input-field") {
widgets[surf].emplace_back(std::make_unique<CPasswordInputField>(surf->size, c.values)); widgets[surf].emplace_back(std::make_unique<CPasswordInputField>(surf->size, c.values, surf->output->stringPort));
} else if (c.type == "label") { } else if (c.type == "label") {
widgets[surf].emplace_back(std::make_unique<CLabel>(surf->size, c.values, surf->output->stringPort)); widgets[surf].emplace_back(std::make_unique<CLabel>(surf->size, c.values, surf->output->stringPort));
} else if (c.type == "image") { } else if (c.type == "image") {

View file

@ -129,15 +129,7 @@ static void onAssetCallbackTimer(std::shared_ptr<CTimer> self, void* data) {
} }
void CLabel::renderSuper() { void CLabel::renderSuper() {
const auto MON = g_pHyprlock->renderOutput(outputStringPort);
std::find_if(g_pHyprlock->m_vOutputs.begin(), g_pHyprlock->m_vOutputs.end(), [this](const auto& other) { return other->stringPort == this->outputStringPort; });
if (MON == g_pHyprlock->m_vOutputs.end() || !MON->get())
return;
const auto PMONITOR = MON->get();
PMONITOR->sessionLockSurface->render();
if (!pendingResourceID.empty()) /* did not consume the pending resource */ if (!pendingResourceID.empty()) /* did not consume the pending resource */
g_pHyprlock->addTimer(std::chrono::milliseconds(100), onAssetCallbackTimer, this); g_pHyprlock->addTimer(std::chrono::milliseconds(100), onAssetCallbackTimer, this);

View file

@ -3,7 +3,8 @@
#include "../../core/hyprlock.hpp" #include "../../core/hyprlock.hpp"
#include <algorithm> #include <algorithm>
CPasswordInputField::CPasswordInputField(const Vector2D& viewport_, const std::unordered_map<std::string, std::any>& props) : shadow(this, props, viewport_) { CPasswordInputField::CPasswordInputField(const Vector2D& viewport_, const std::unordered_map<std::string, std::any>& props, const std::string& output) :
outputStringPort(output), shadow(this, props, viewport_) {
size = std::any_cast<Hyprlang::VEC2>(props.at("size")); size = std::any_cast<Hyprlang::VEC2>(props.at("size"));
outThick = std::any_cast<Hyprlang::INT>(props.at("outline_thickness")); outThick = std::any_cast<Hyprlang::INT>(props.at("outline_thickness"));
dots.size = std::any_cast<Hyprlang::FLOAT>(props.at("dots_size")); dots.size = std::any_cast<Hyprlang::FLOAT>(props.at("dots_size"));
@ -78,15 +79,13 @@ static void fadeOutCallback(std::shared_ptr<CTimer> self, void* data) {
CPasswordInputField* p = (CPasswordInputField*)data; CPasswordInputField* p = (CPasswordInputField*)data;
p->onFadeOutTimer(); p->onFadeOutTimer();
for (auto& o : g_pHyprlock->m_vOutputs) {
o->sessionLockSurface->render();
}
} }
void CPasswordInputField::onFadeOutTimer() { void CPasswordInputField::onFadeOutTimer() {
fade.allowFadeOut = true; fade.allowFadeOut = true;
fade.fadeOutTimer.reset(); fade.fadeOutTimer.reset();
g_pHyprlock->renderOutput(outputStringPort);
} }
void CPasswordInputField::updateFade() { void CPasswordInputField::updateFade() {

View file

@ -14,7 +14,7 @@ struct SPreloadedAsset;
class CPasswordInputField : public IWidget { class CPasswordInputField : public IWidget {
public: public:
CPasswordInputField(const Vector2D& viewport, const std::unordered_map<std::string, std::any>& props); CPasswordInputField(const Vector2D& viewport, const std::unordered_map<std::string, std::any>& props, const std::string& output);
virtual bool draw(const SRenderData& data); virtual bool draw(const SRenderData& data);
void onFadeOutTimer(); void onFadeOutTimer();
@ -39,7 +39,7 @@ class CPasswordInputField : public IWidget {
Vector2D configPos; Vector2D configPos;
Vector2D configSize; Vector2D configSize;
std::string halign, valign, configFailText; std::string halign, valign, configFailText, outputStringPort;
int outThick, rounding; int outThick, rounding;