internal: Fix wlr output management (#3234)

This commit is contained in:
Philip Damianik 2023-09-10 14:14:27 +02:00 committed by GitHub
parent d490f198a4
commit 6c855dd6e4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 18 deletions

View file

@ -580,12 +580,12 @@ void CConfigManager::handleMonitor(const std::string& command, const std::string
return; return;
} }
wl_output_transform transform = (wl_output_transform)std::stoi(ARGS[2]); const auto TRANSFORM = (wl_output_transform)TSF;
// overwrite if exists // overwrite if exists
for (auto& r : m_dMonitorRules) { for (auto& r : m_dMonitorRules) {
if (r.name == newrule.name) { if (r.name == newrule.name) {
r.transform = transform; r.transform = TRANSFORM;
return; return;
} }
} }

View file

@ -38,8 +38,18 @@ void Events::listener_change(wl_listener* listener, void* data) {
CONFIGHEAD->state.enabled = m->output->enabled; CONFIGHEAD->state.enabled = m->output->enabled;
CONFIGHEAD->state.mode = m->output->current_mode; CONFIGHEAD->state.mode = m->output->current_mode;
CONFIGHEAD->state.x = m->vecPosition.x; if (!m->output->current_mode) {
CONFIGHEAD->state.y = m->vecPosition.y; CONFIGHEAD->state.custom_mode = {
m->output->width,
m->output->height,
m->output->refresh,
};
}
CONFIGHEAD->state.x = m->vecPosition.x;
CONFIGHEAD->state.y = m->vecPosition.y;
CONFIGHEAD->state.transform = m->transform;
CONFIGHEAD->state.scale = m->scale;
CONFIGHEAD->state.adaptive_sync_enabled = m->vrrActive;
} }
wlr_output_manager_v1_set_configuration(g_pCompositor->m_sWLROutputMgr, CONFIG); wlr_output_manager_v1_set_configuration(g_pCompositor->m_sWLROutputMgr, CONFIG);

View file

@ -86,8 +86,6 @@ void CMonitor::onConnect(bool noRule) {
if (!wlr_output_commit(output)) if (!wlr_output_commit(output))
Debug::log(ERR, "Couldn't commit disabled state on output {}", output->name); Debug::log(ERR, "Couldn't commit disabled state on output {}", output->name);
Events::listener_change(nullptr, nullptr);
m_bEnabled = false; m_bEnabled = false;
hyprListener_monitorFrame.removeCallback(); hyprListener_monitorFrame.removeCallback();

View file

@ -1135,7 +1135,7 @@ void CHyprRenderer::setWindowScanoutMode(CWindow* pWindow) {
void CHyprRenderer::outputMgrApplyTest(wlr_output_configuration_v1* config, bool test) { void CHyprRenderer::outputMgrApplyTest(wlr_output_configuration_v1* config, bool test) {
wlr_output_configuration_head_v1* head; wlr_output_configuration_head_v1* head;
bool noError = true; bool ok = true;
wl_list_for_each(head, &config->heads, link) { wl_list_for_each(head, &config->heads, link) {
@ -1160,29 +1160,24 @@ void CHyprRenderer::outputMgrApplyTest(wlr_output_configuration_v1* config, bool
commandForCfg += std::to_string(head->state.custom_mode.width) + "x" + std::to_string(head->state.custom_mode.height) + "@" + commandForCfg += std::to_string(head->state.custom_mode.width) + "x" + std::to_string(head->state.custom_mode.height) + "@" +
std::to_string(head->state.custom_mode.refresh / 1000.f) + ","; std::to_string(head->state.custom_mode.refresh / 1000.f) + ",";
commandForCfg += std::to_string(head->state.x) + "x" + std::to_string(head->state.y) + "," + std::to_string(head->state.scale); commandForCfg += std::to_string(head->state.x) + "x" + std::to_string(head->state.y) + "," + std::to_string(head->state.scale) + ",transform," +
std::to_string((int)head->state.transform);
if (!test) { if (!test) {
g_pConfigManager->parseKeyword("monitor", commandForCfg, true); g_pConfigManager->parseKeyword("monitor", commandForCfg, true);
wlr_output_state_set_adaptive_sync_enabled(&OUTPUT->pending, head->state.adaptive_sync_enabled);
std::string transformStr = std::string(OUTPUT->name) + ",transform," + std::to_string((int)OUTPUT->transform);
const auto PMONITOR = g_pCompositor->getMonitorFromName(OUTPUT->name);
if (!PMONITOR || OUTPUT->transform != PMONITOR->transform)
g_pConfigManager->parseKeyword("monitor", transformStr);
} }
noError = wlr_output_test(OUTPUT); ok = wlr_output_test(OUTPUT);
if (!noError) if (!ok)
break; break;
} }
if (!test) if (!test)
g_pConfigManager->m_bWantsMonitorReload = true; // for monitor keywords g_pConfigManager->m_bWantsMonitorReload = true; // for monitor keywords
if (noError) if (ok)
wlr_output_configuration_v1_send_succeeded(config); wlr_output_configuration_v1_send_succeeded(config);
else else
wlr_output_configuration_v1_send_failed(config); wlr_output_configuration_v1_send_failed(config);
@ -1859,6 +1854,8 @@ bool CHyprRenderer::applyMonitorRule(CMonitor* pMonitor, SMonitorRule* pMonitorR
EMIT_HOOK_EVENT("monitorLayoutChanged", nullptr); EMIT_HOOK_EVENT("monitorLayoutChanged", nullptr);
Events::listener_change(nullptr, nullptr);
return true; return true;
} }