From fdf0d73b30ecd02d3ea3bc68a8f5444451cdf96e Mon Sep 17 00:00:00 2001 From: bbedward Date: Sat, 15 Aug 2026 12:24:10 -0400 Subject: [PATCH] displays: apply refresh rate changes without compositor config reload related #3073 --- quickshell/Services/DisplayService.qml | 31 +++++++++++++++++++------ quickshell/Services/HyprlandService.qml | 4 ++-- quickshell/Services/MangoService.qml | 4 ++-- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/quickshell/Services/DisplayService.qml b/quickshell/Services/DisplayService.qml index df4e11dfd..1bc6d2fd0 100644 --- a/quickshell/Services/DisplayService.qml +++ b/quickshell/Services/DisplayService.qml @@ -376,19 +376,36 @@ Singleton { } function applyWlrModeOverrides(modeOverrides, callback) { - if (CompositorService.isHyprland) { - HyprlandService.generateOutputsConfig(buildWlrOutputsData(modeOverrides), SessionData.hyprlandOutputSettings, callback); - return; - } - - if (CompositorService.isMango) { - MangoService.generateOutputsConfig(buildWlrOutputsData(modeOverrides), callback); + if (CompositorService.isHyprland || CompositorService.isMango) { + applyModeOverridesWithoutReload(modeOverrides, callback); return; } WlrOutputService.applyConfiguration(buildWlrHeads(modeOverrides), callback); } + // apply live and persist without a compositor config reload — full reloads + // are a suspected trigger for IME input lockups (#3073) + function applyModeOverridesWithoutReload(modeOverrides, callback) { + WlrOutputService.applyConfiguration(buildWlrHeads(modeOverrides), success => { + if (!success) { + persistOutputsConfig(modeOverrides, callback, false); + return; + } + persistOutputsConfig(modeOverrides, null, true); + if (callback) + callback(true); + }); + } + + function persistOutputsConfig(modeOverrides, callback, skipReload) { + if (CompositorService.isHyprland) { + HyprlandService.generateOutputsConfig(buildWlrOutputsData(modeOverrides), SessionData.hyprlandOutputSettings, callback, skipReload); + return; + } + MangoService.generateOutputsConfig(buildWlrOutputsData(modeOverrides), callback, skipReload); + } + function buildWlrOutputsData(modeOverrides) { const outputs = WlrOutputService.outputs || []; const data = ({}); diff --git a/quickshell/Services/HyprlandService.qml b/quickshell/Services/HyprlandService.qml index 519fc92eb..8611272ca 100644 --- a/quickshell/Services/HyprlandService.qml +++ b/quickshell/Services/HyprlandService.qml @@ -168,7 +168,7 @@ Singleton { return Number(value); } - function generateOutputsConfig(outputsData, hyprlandSettings, callback) { + function generateOutputsConfig(outputsData, hyprlandSettings, callback, skipReload) { if (!canWriteLuaConfig("outputs")) { if (callback) callback(false); @@ -254,7 +254,7 @@ Singleton { return; } log.info("Generated outputs config at", outputsPath); - if (CompositorService.isHyprland) + if (CompositorService.isHyprland && !skipReload) reloadConfig(); if (callback) callback(true); diff --git a/quickshell/Services/MangoService.qml b/quickshell/Services/MangoService.qml index d3b50c4f2..e544ed1ac 100644 --- a/quickshell/Services/MangoService.qml +++ b/quickshell/Services/MangoService.qml @@ -563,7 +563,7 @@ Singleton { } } - function generateOutputsConfig(outputsData, callback) { + function generateOutputsConfig(outputsData, callback, skipReload) { if (!outputsData || Object.keys(outputsData).length === 0) { if (callback) callback(false); @@ -618,7 +618,7 @@ Singleton { return; } log.info("Generated outputs config at", outputsPath); - if (CompositorService.isMango) + if (CompositorService.isMango && !skipReload) reloadConfig(false); if (callback) callback(true);