summaryrefslogtreecommitdiff
path: root/src/events/Monitors.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2022-07-13 18:18:23 +0200
committerGitHub <noreply@github.com>2022-07-13 18:18:23 +0200
commit6708f3b1334e8b6a966f424fe04713a4e74d5fdb (patch)
tree3635c6d81e43ce033991fdd4b0f06083f07e86e4 /src/events/Monitors.cpp
parentef7ee2fd0f64a1a0a0088b90d3cbaeb6b3436c32 (diff)
Fixed TTY switching (#364)
Diffstat (limited to 'src/events/Monitors.cpp')
-rw-r--r--src/events/Monitors.cpp36
1 files changed, 20 insertions, 16 deletions
diff --git a/src/events/Monitors.cpp b/src/events/Monitors.cpp
index cf7e4b49..949d4585 100644
--- a/src/events/Monitors.cpp
+++ b/src/events/Monitors.cpp
@@ -166,6 +166,11 @@ void Events::listener_newOutput(wl_listener* listener, void* data) {
void Events::listener_monitorFrame(void* owner, void* data) {
SMonitor* const PMONITOR = (SMonitor*)owner;
+ if (!g_pCompositor->m_sWLRSession->active || !g_pCompositor->m_bSessionActive) {
+ Debug::log(WARN, "Attempted to render frame on inactive session!");
+ return; // cannot draw on session inactive (different tty)
+ }
+
static std::chrono::high_resolution_clock::time_point startRender = std::chrono::high_resolution_clock::now();
static std::chrono::high_resolution_clock::time_point startRenderOverlay = std::chrono::high_resolution_clock::now();
static std::chrono::high_resolution_clock::time_point endRenderOverlay = std::chrono::high_resolution_clock::now();
@@ -182,6 +187,18 @@ void Events::listener_monitorFrame(void* owner, void* data) {
g_pDebugOverlay->frameData(PMONITOR);
}
+ if (PMONITOR->framesToSkip > 0) {
+ PMONITOR->framesToSkip -= 1;
+
+ if (!PMONITOR->noFrameSchedule)
+ g_pCompositor->scheduleFrameForMonitor(PMONITOR);
+ else {
+ Debug::log(LOG, "NoFrameSchedule hit for %s.", PMONITOR->szName.c_str());
+ }
+ g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PMONITOR->ID);
+ return;
+ }
+
// checks //
if (PMONITOR->ID == pMostHzMonitor->ID || !*PNOVFR) { // unfortunately with VFR we don't have the guarantee mostHz is going to be updated all the time, so we have to ignore that
g_pCompositor->sanityCheckWorkspaces();
@@ -198,18 +215,6 @@ void Events::listener_monitorFrame(void* owner, void* data) {
}
// //
- if (PMONITOR->framesToSkip > 0) {
- PMONITOR->framesToSkip -= 1;
-
- if (!PMONITOR->noFrameSchedule)
- wlr_output_schedule_frame(PMONITOR->output);
- else {
- Debug::log(LOG, "NoFrameSchedule hit for %s.", PMONITOR->szName.c_str());
- }
- g_pLayoutManager->getCurrentLayout()->recalculateMonitor(PMONITOR->ID);
- return;
- }
-
timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
@@ -236,7 +241,7 @@ void Events::listener_monitorFrame(void* owner, void* data) {
wlr_output_rollback(PMONITOR->output);
if (*PDAMAGEBLINK || *PNOVFR)
- wlr_output_schedule_frame(PMONITOR->output);
+ g_pCompositor->scheduleFrameForMonitor(PMONITOR);
return;
}
@@ -326,7 +331,7 @@ void Events::listener_monitorFrame(void* owner, void* data) {
wlr_output_commit(PMONITOR->output);
if (*PDAMAGEBLINK || *PNOVFR)
- wlr_output_schedule_frame(PMONITOR->output);
+ g_pCompositor->scheduleFrameForMonitor(PMONITOR);
if (*PDEBUGOVERLAY == 1) {
const float µs = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now() - startRender).count() / 1000.f;
@@ -360,8 +365,7 @@ void Events::listener_monitorDestroy(void* owner, void* data) {
if (!BACKUPMON) {
Debug::log(CRIT, "No monitors! Unplugged last! Exiting.");
- g_pCompositor->cleanupExit();
- exit(1);
+ g_pCompositor->cleanup();
return;
}