mirror of
https://github.com/hyprwm/Hyprland.git
synced 2025-08-04 14:11:59 -07:00
@@ -25,7 +25,7 @@ using namespace Hyprutils::String;
|
||||
using namespace Hyprutils::Utils;
|
||||
|
||||
int ratHandler(void* data) {
|
||||
g_pHyprRenderer->renderMonitor((CMonitor*)data);
|
||||
g_pHyprRenderer->renderMonitor(((CMonitor*)data)->self.lock());
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -49,12 +49,12 @@ void CMonitor::onConnect(bool noRule) {
|
||||
listeners.frame = output->events.frame.registerListener([this](std::any d) { onMonitorFrame(); });
|
||||
listeners.commit = output->events.commit.registerListener([this](std::any d) {
|
||||
if (true) { // FIXME: E->state->committed & WLR_OUTPUT_STATE_BUFFER
|
||||
PROTO::screencopy->onOutputCommit(this);
|
||||
PROTO::toplevelExport->onOutputCommit(this);
|
||||
PROTO::screencopy->onOutputCommit(self.lock());
|
||||
PROTO::toplevelExport->onOutputCommit(self.lock());
|
||||
}
|
||||
});
|
||||
listeners.needsFrame =
|
||||
output->events.needsFrame.registerListener([this](std::any d) { g_pCompositor->scheduleFrameForMonitor(this, Aquamarine::IOutput::AQ_SCHEDULE_NEEDS_FRAME); });
|
||||
output->events.needsFrame.registerListener([this](std::any d) { g_pCompositor->scheduleFrameForMonitor(self.lock(), Aquamarine::IOutput::AQ_SCHEDULE_NEEDS_FRAME); });
|
||||
|
||||
listeners.presented = output->events.present.registerListener([this](std::any d) {
|
||||
auto E = std::any_cast<Aquamarine::IOutput::SPresentEvent>(d);
|
||||
@@ -84,7 +84,7 @@ void CMonitor::onConnect(bool noRule) {
|
||||
return;
|
||||
|
||||
Debug::log(LOG, "Reapplying monitor rule for {} from a state request", szName);
|
||||
g_pHyprRenderer->applyMonitorRule(this, &activeMonitorRule, true);
|
||||
g_pHyprRenderer->applyMonitorRule(self.lock(), &activeMonitorRule, true);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ void CMonitor::onConnect(bool noRule) {
|
||||
SMonitorRule rule = activeMonitorRule;
|
||||
rule.resolution = SIZE;
|
||||
|
||||
g_pHyprRenderer->applyMonitorRule(this, &rule);
|
||||
g_pHyprRenderer->applyMonitorRule(self.lock(), &rule);
|
||||
});
|
||||
|
||||
tearingState.canTear = output->getBackend()->type() == Aquamarine::AQ_BACKEND_DRM;
|
||||
@@ -171,7 +171,7 @@ void CMonitor::onConnect(bool noRule) {
|
||||
|
||||
// set mode, also applies
|
||||
if (!noRule)
|
||||
g_pHyprRenderer->applyMonitorRule(this, &monitorRule, true);
|
||||
g_pHyprRenderer->applyMonitorRule(self.lock(), &monitorRule, true);
|
||||
|
||||
if (!state.commit())
|
||||
Debug::log(WARN, "state.commit() failed in CMonitor::onCommit");
|
||||
@@ -187,7 +187,7 @@ void CMonitor::onConnect(bool noRule) {
|
||||
continue;
|
||||
|
||||
if (ws->m_szLastMonitor == szName || g_pCompositor->m_vMonitors.size() == 1 /* avoid lost workspaces on recover */) {
|
||||
g_pCompositor->moveWorkspaceToMonitor(ws, this);
|
||||
g_pCompositor->moveWorkspaceToMonitor(ws, self.lock());
|
||||
ws->startAnim(true, true, true);
|
||||
ws->m_szLastMonitor = "";
|
||||
}
|
||||
@@ -204,13 +204,13 @@ void CMonitor::onConnect(bool noRule) {
|
||||
setMirror(activeMonitorRule.mirrorOf);
|
||||
|
||||
if (!g_pCompositor->m_pLastMonitor) // set the last monitor if it isnt set yet
|
||||
g_pCompositor->setActiveMonitor(this);
|
||||
g_pCompositor->setActiveMonitor(self.lock());
|
||||
|
||||
g_pHyprRenderer->arrangeLayersForMonitor(ID);
|
||||
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(ID);
|
||||
|
||||
// ensure VRR (will enable if necessary)
|
||||
g_pConfigManager->ensureVRR(this);
|
||||
g_pConfigManager->ensureVRR(self.lock());
|
||||
|
||||
// verify last mon valid
|
||||
bool found = false;
|
||||
@@ -222,19 +222,19 @@ void CMonitor::onConnect(bool noRule) {
|
||||
}
|
||||
|
||||
if (!found)
|
||||
g_pCompositor->setActiveMonitor(this);
|
||||
g_pCompositor->setActiveMonitor(self.lock());
|
||||
|
||||
renderTimer = wl_event_loop_add_timer(g_pCompositor->m_sWLEventLoop, ratHandler, this);
|
||||
|
||||
g_pCompositor->scheduleFrameForMonitor(this, Aquamarine::IOutput::AQ_SCHEDULE_NEW_MONITOR);
|
||||
g_pCompositor->scheduleFrameForMonitor(self.lock(), Aquamarine::IOutput::AQ_SCHEDULE_NEW_MONITOR);
|
||||
|
||||
PROTO::gamma->applyGammaToState(this);
|
||||
PROTO::gamma->applyGammaToState(self.lock());
|
||||
|
||||
events.connect.emit();
|
||||
|
||||
g_pEventManager->postEvent(SHyprIPCEvent{"monitoradded", szName});
|
||||
g_pEventManager->postEvent(SHyprIPCEvent{"monitoraddedv2", std::format("{},{},{}", ID, szName, szShortDescription)});
|
||||
EMIT_HOOK_EVENT("monitorAdded", this);
|
||||
EMIT_HOOK_EVENT("monitorAdded", self.lock());
|
||||
}
|
||||
|
||||
void CMonitor::onDisconnect(bool destroy) {
|
||||
@@ -242,7 +242,7 @@ void CMonitor::onDisconnect(bool destroy) {
|
||||
if (g_pCompositor->m_bIsShuttingDown)
|
||||
return;
|
||||
g_pEventManager->postEvent(SHyprIPCEvent{"monitorremoved", szName});
|
||||
EMIT_HOOK_EVENT("monitorRemoved", this);
|
||||
EMIT_HOOK_EVENT("monitorRemoved", self.lock());
|
||||
g_pCompositor->arrangeMonitors();
|
||||
}};
|
||||
|
||||
@@ -259,21 +259,21 @@ void CMonitor::onDisconnect(bool destroy) {
|
||||
events.disconnect.emit();
|
||||
|
||||
// Cleanup everything. Move windows back, snap cursor, shit.
|
||||
CMonitor* BACKUPMON = nullptr;
|
||||
PHLMONITOR BACKUPMON = nullptr;
|
||||
for (auto const& m : g_pCompositor->m_vMonitors) {
|
||||
if (m.get() != this) {
|
||||
BACKUPMON = m.get();
|
||||
BACKUPMON = m;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// remove mirror
|
||||
if (pMirrorOf) {
|
||||
pMirrorOf->mirrors.erase(std::find_if(pMirrorOf->mirrors.begin(), pMirrorOf->mirrors.end(), [&](const auto& other) { return other == this; }));
|
||||
pMirrorOf->mirrors.erase(std::find_if(pMirrorOf->mirrors.begin(), pMirrorOf->mirrors.end(), [&](const auto& other) { return other == self; }));
|
||||
|
||||
// unlock software for mirrored monitor
|
||||
g_pPointerManager->unlockSoftwareForMonitor(pMirrorOf);
|
||||
pMirrorOf = nullptr;
|
||||
g_pPointerManager->unlockSoftwareForMonitor(pMirrorOf.lock());
|
||||
pMirrorOf.reset();
|
||||
}
|
||||
|
||||
if (!mirrors.empty()) {
|
||||
@@ -340,16 +340,16 @@ void CMonitor::onDisconnect(bool destroy) {
|
||||
if (!state.commit())
|
||||
Debug::log(WARN, "state.commit() failed in CMonitor::onDisconnect");
|
||||
|
||||
if (g_pCompositor->m_pLastMonitor.get() == this)
|
||||
g_pCompositor->setActiveMonitor(BACKUPMON ? BACKUPMON : g_pCompositor->m_pUnsafeOutput);
|
||||
if (g_pCompositor->m_pLastMonitor == self)
|
||||
g_pCompositor->setActiveMonitor(BACKUPMON ? BACKUPMON : g_pCompositor->m_pUnsafeOutput.lock());
|
||||
|
||||
if (g_pHyprRenderer->m_pMostHzMonitor == this) {
|
||||
int mostHz = 0;
|
||||
CMonitor* pMonitorMostHz = nullptr;
|
||||
if (g_pHyprRenderer->m_pMostHzMonitor == self) {
|
||||
int mostHz = 0;
|
||||
PHLMONITOR pMonitorMostHz = nullptr;
|
||||
|
||||
for (auto const& m : g_pCompositor->m_vMonitors) {
|
||||
if (m->refreshRate > mostHz && m.get() != this) {
|
||||
pMonitorMostHz = m.get();
|
||||
if (m->refreshRate > mostHz && m != self) {
|
||||
pMonitorMostHz = m;
|
||||
mostHz = m->refreshRate;
|
||||
}
|
||||
}
|
||||
@@ -361,11 +361,11 @@ void CMonitor::onDisconnect(bool destroy) {
|
||||
|
||||
void CMonitor::addDamage(const pixman_region32_t* rg) {
|
||||
static auto PZOOMFACTOR = CConfigValue<Hyprlang::FLOAT>("cursor:zoom_factor");
|
||||
if (*PZOOMFACTOR != 1.f && g_pCompositor->getMonitorFromCursor() == this) {
|
||||
if (*PZOOMFACTOR != 1.f && g_pCompositor->getMonitorFromCursor() == self) {
|
||||
damage.damageEntire();
|
||||
g_pCompositor->scheduleFrameForMonitor(this, Aquamarine::IOutput::AQ_SCHEDULE_DAMAGE);
|
||||
g_pCompositor->scheduleFrameForMonitor(self.lock(), Aquamarine::IOutput::AQ_SCHEDULE_DAMAGE);
|
||||
} else if (damage.damage(rg))
|
||||
g_pCompositor->scheduleFrameForMonitor(this, Aquamarine::IOutput::AQ_SCHEDULE_DAMAGE);
|
||||
g_pCompositor->scheduleFrameForMonitor(self.lock(), Aquamarine::IOutput::AQ_SCHEDULE_DAMAGE);
|
||||
}
|
||||
|
||||
void CMonitor::addDamage(const CRegion* rg) {
|
||||
@@ -374,13 +374,13 @@ void CMonitor::addDamage(const CRegion* rg) {
|
||||
|
||||
void CMonitor::addDamage(const CBox* box) {
|
||||
static auto PZOOMFACTOR = CConfigValue<Hyprlang::FLOAT>("cursor:zoom_factor");
|
||||
if (*PZOOMFACTOR != 1.f && g_pCompositor->getMonitorFromCursor() == this) {
|
||||
if (*PZOOMFACTOR != 1.f && g_pCompositor->getMonitorFromCursor() == self) {
|
||||
damage.damageEntire();
|
||||
g_pCompositor->scheduleFrameForMonitor(this, Aquamarine::IOutput::AQ_SCHEDULE_DAMAGE);
|
||||
g_pCompositor->scheduleFrameForMonitor(self.lock(), Aquamarine::IOutput::AQ_SCHEDULE_DAMAGE);
|
||||
}
|
||||
|
||||
if (damage.damage(*box))
|
||||
g_pCompositor->scheduleFrameForMonitor(this, Aquamarine::IOutput::AQ_SCHEDULE_DAMAGE);
|
||||
g_pCompositor->scheduleFrameForMonitor(self.lock(), Aquamarine::IOutput::AQ_SCHEDULE_DAMAGE);
|
||||
}
|
||||
|
||||
bool CMonitor::shouldSkipScheduleFrameOnMouseEvent() {
|
||||
@@ -456,7 +456,7 @@ void CMonitor::setupDefaultWS(const SMonitorRule& monitorRule) {
|
||||
|
||||
if (PNEWWORKSPACE) {
|
||||
// workspace exists, move it to the newly connected monitor
|
||||
g_pCompositor->moveWorkspaceToMonitor(PNEWWORKSPACE, this);
|
||||
g_pCompositor->moveWorkspaceToMonitor(PNEWWORKSPACE, self.lock());
|
||||
activeWorkspace = PNEWWORKSPACE;
|
||||
g_pLayoutManager->getCurrentLayout()->recalculateMonitor(ID);
|
||||
PNEWWORKSPACE->startAnim(true, true, true);
|
||||
@@ -485,7 +485,7 @@ void CMonitor::setMirror(const std::string& mirrorOf) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (PMIRRORMON == this) {
|
||||
if (PMIRRORMON == self) {
|
||||
Debug::log(ERR, "Cannot mirror self!");
|
||||
return;
|
||||
}
|
||||
@@ -494,13 +494,13 @@ void CMonitor::setMirror(const std::string& mirrorOf) {
|
||||
// disable mirroring
|
||||
|
||||
if (pMirrorOf) {
|
||||
pMirrorOf->mirrors.erase(std::find_if(pMirrorOf->mirrors.begin(), pMirrorOf->mirrors.end(), [&](const auto& other) { return other == this; }));
|
||||
pMirrorOf->mirrors.erase(std::find_if(pMirrorOf->mirrors.begin(), pMirrorOf->mirrors.end(), [&](const auto& other) { return other == self; }));
|
||||
|
||||
// unlock software for mirrored monitor
|
||||
g_pPointerManager->unlockSoftwareForMonitor(pMirrorOf);
|
||||
g_pPointerManager->unlockSoftwareForMonitor(pMirrorOf.lock());
|
||||
}
|
||||
|
||||
pMirrorOf = nullptr;
|
||||
pMirrorOf.reset();
|
||||
|
||||
// set rule
|
||||
const auto RULE = g_pConfigManager->getMonitorRuleFor(self.lock());
|
||||
@@ -528,12 +528,12 @@ void CMonitor::setMirror(const std::string& mirrorOf) {
|
||||
|
||||
setupDefaultWS(RULE);
|
||||
|
||||
g_pHyprRenderer->applyMonitorRule(this, (SMonitorRule*)&RULE, true); // will apply the offset and stuff
|
||||
g_pHyprRenderer->applyMonitorRule(self.lock(), (SMonitorRule*)&RULE, true); // will apply the offset and stuff
|
||||
} else {
|
||||
CMonitor* BACKUPMON = nullptr;
|
||||
PHLMONITOR BACKUPMON = nullptr;
|
||||
for (auto const& m : g_pCompositor->m_vMonitors) {
|
||||
if (m.get() != this) {
|
||||
BACKUPMON = m.get();
|
||||
BACKUPMON = m;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -557,14 +557,14 @@ void CMonitor::setMirror(const std::string& mirrorOf) {
|
||||
|
||||
pMirrorOf = PMIRRORMON;
|
||||
|
||||
pMirrorOf->mirrors.push_back(this);
|
||||
pMirrorOf->mirrors.push_back(self);
|
||||
|
||||
// remove from mvmonitors
|
||||
std::erase_if(g_pCompositor->m_vMonitors, [&](const auto& other) { return other.get() == this; });
|
||||
std::erase_if(g_pCompositor->m_vMonitors, [&](const auto& other) { return other == self; });
|
||||
|
||||
g_pCompositor->arrangeMonitors();
|
||||
|
||||
g_pCompositor->setActiveMonitor(g_pCompositor->m_vMonitors.front().get());
|
||||
g_pCompositor->setActiveMonitor(g_pCompositor->m_vMonitors.front());
|
||||
|
||||
g_pCompositor->sanityCheckWorkspaces();
|
||||
|
||||
@@ -654,11 +654,11 @@ void CMonitor::changeWorkspace(const PHLWORKSPACE& pWorkspace, bool internal, bo
|
||||
EMIT_HOOK_EVENT("workspace", pWorkspace);
|
||||
}
|
||||
|
||||
g_pHyprRenderer->damageMonitor(this);
|
||||
g_pHyprRenderer->damageMonitor(self.lock());
|
||||
|
||||
g_pCompositor->updateFullscreenFadeOnWorkspace(pWorkspace);
|
||||
|
||||
g_pConfigManager->ensureVRR(this);
|
||||
g_pConfigManager->ensureVRR(self.lock());
|
||||
|
||||
g_pCompositor->updateSuspendedStates();
|
||||
|
||||
@@ -674,7 +674,7 @@ void CMonitor::setSpecialWorkspace(const PHLWORKSPACE& pWorkspace) {
|
||||
if (activeSpecialWorkspace == pWorkspace)
|
||||
return;
|
||||
|
||||
g_pHyprRenderer->damageMonitor(this);
|
||||
g_pHyprRenderer->damageMonitor(self.lock());
|
||||
|
||||
if (!pWorkspace) {
|
||||
// remove special if exists
|
||||
@@ -696,7 +696,7 @@ void CMonitor::setSpecialWorkspace(const PHLWORKSPACE& pWorkspace) {
|
||||
|
||||
g_pCompositor->updateFullscreenFadeOnWorkspace(activeWorkspace);
|
||||
|
||||
g_pConfigManager->ensureVRR(this);
|
||||
g_pConfigManager->ensureVRR(self.lock());
|
||||
|
||||
g_pCompositor->updateSuspendedStates();
|
||||
|
||||
@@ -764,11 +764,11 @@ void CMonitor::setSpecialWorkspace(const PHLWORKSPACE& pWorkspace) {
|
||||
|
||||
g_pEventManager->postEvent(SHyprIPCEvent{"activespecial", pWorkspace->m_szName + "," + szName});
|
||||
|
||||
g_pHyprRenderer->damageMonitor(this);
|
||||
g_pHyprRenderer->damageMonitor(self.lock());
|
||||
|
||||
g_pCompositor->updateFullscreenFadeOnWorkspace(pWorkspace);
|
||||
|
||||
g_pConfigManager->ensureVRR(this);
|
||||
g_pConfigManager->ensureVRR(self.lock());
|
||||
|
||||
g_pCompositor->updateSuspendedStates();
|
||||
}
|
||||
@@ -824,7 +824,7 @@ void CMonitor::scheduleDone() {
|
||||
void CMonitor::setCTM(const Mat3x3& ctm_) {
|
||||
ctm = ctm_;
|
||||
ctmUpdated = true;
|
||||
g_pCompositor->scheduleFrameForMonitor(this, Aquamarine::IOutput::scheduleFrameReason::AQ_SCHEDULE_NEEDS_FRAME);
|
||||
g_pCompositor->scheduleFrameForMonitor(self.lock(), Aquamarine::IOutput::scheduleFrameReason::AQ_SCHEDULE_NEEDS_FRAME);
|
||||
}
|
||||
|
||||
bool CMonitor::attemptDirectScanout() {
|
||||
@@ -963,7 +963,7 @@ void CMonitor::onMonitorFrame() {
|
||||
if (!m_bEnabled)
|
||||
return;
|
||||
|
||||
g_pHyprRenderer->recheckSolitaryForMonitor(this);
|
||||
g_pHyprRenderer->recheckSolitaryForMonitor(self.lock());
|
||||
|
||||
tearingState.busy = false;
|
||||
|
||||
@@ -984,12 +984,12 @@ void CMonitor::onMonitorFrame() {
|
||||
if (*PENABLERAT && !tearingState.nextRenderTorn) {
|
||||
if (!RATScheduled) {
|
||||
// render
|
||||
g_pHyprRenderer->renderMonitor(this);
|
||||
g_pHyprRenderer->renderMonitor(self.lock());
|
||||
}
|
||||
|
||||
RATScheduled = false;
|
||||
|
||||
const auto& [avg, max, min] = g_pHyprRenderer->getRenderTimes(this);
|
||||
const auto& [avg, max, min] = g_pHyprRenderer->getRenderTimes(self.lock());
|
||||
|
||||
if (max + *PRATSAFE > 1000.0 / refreshRate)
|
||||
return;
|
||||
@@ -1002,11 +1002,11 @@ void CMonitor::onMonitorFrame() {
|
||||
const auto TIMETOSLEEP = std::floor(MSLEFT - ESTRENDERTIME);
|
||||
|
||||
if (MSLEFT < 1 || MSLEFT < ESTRENDERTIME || TIMETOSLEEP < 1)
|
||||
g_pHyprRenderer->renderMonitor(this);
|
||||
g_pHyprRenderer->renderMonitor(self.lock());
|
||||
else
|
||||
wl_event_source_timer_update(renderTimer, TIMETOSLEEP);
|
||||
} else
|
||||
g_pHyprRenderer->renderMonitor(this);
|
||||
g_pHyprRenderer->renderMonitor(self.lock());
|
||||
}
|
||||
|
||||
CMonitorState::CMonitorState(CMonitor* owner) {
|
||||
@@ -1040,7 +1040,7 @@ bool CMonitorState::commit() {
|
||||
if (!updateSwapchain())
|
||||
return false;
|
||||
|
||||
EMIT_HOOK_EVENT("preMonitorCommit", m_pOwner);
|
||||
EMIT_HOOK_EVENT("preMonitorCommit", m_pOwner->self.lock());
|
||||
|
||||
ensureBufferPresent();
|
||||
|
||||
|
Reference in New Issue
Block a user