diff --git a/src/server/src/actions/wm/window-actions.hpp b/src/server/src/actions/wm/window-actions.hpp index 153c616b9..9b5dc42d9 100644 --- a/src/server/src/actions/wm/window-actions.hpp +++ b/src/server/src/actions/wm/window-actions.hpp @@ -3,13 +3,15 @@ #include "services/window-manager/window-manager.hpp" #include "ui/action-pannel/action.hpp" #include "ui/image/url.hpp" +#include class FocusWindowAction : public AbstractAction { std::shared_ptr m_window; void execute(ApplicationContext *ctx) override { auto wm = ctx->services->windowManager(); - wm->provider()->focusWindowSync(*m_window.get()); + auto window = m_window; + QTimer::singleShot(0, [wm, window]() { wm->provider()->focusWindowSync(*window.get()); }); } public: diff --git a/src/server/src/qml/launcher-window.cpp b/src/server/src/qml/launcher-window.cpp index b52c2bb9d..14b4a726c 100644 --- a/src/server/src/qml/launcher-window.cpp +++ b/src/server/src/qml/launcher-window.cpp @@ -605,7 +605,7 @@ void LauncherWindow::setExclusiveFocus(bool exclusive) { if (!isLayerShellActive()) return; const auto &lc = m_ctx.services->config()->value().launcherWindow.layerShell; - int ki = (exclusive && lc.keyboardInteractivity == "exclusive") ? 1 : 2; // Exclusive : OnDemand + int ki = (exclusive && lc.keyboardInteractivity == "exclusive" && !Environment::isHyprlandCompositor()) ? 1 : 2; // Exclusive : OnDemand if (m_lsKeyboardInteractivity != ki) { m_lsKeyboardInteractivity = ki; emit lsChanged(); @@ -627,7 +627,7 @@ void LauncherWindow::updateLayerShellProps() { int layer = (lc.layer == "overlay") ? 3 : 2; // LayerOverlay : LayerTop int ki = 2; // OnDemand - if (lc.keyboardInteractivity == "exclusive" && !cfg.closeOnFocusLoss) ki = 1; // Exclusive + if (lc.keyboardInteractivity == "exclusive" && !cfg.closeOnFocusLoss && !Environment::isHyprlandCompositor()) ki = 1; // Exclusive bool changed = false; if (m_lsLayer != layer) { diff --git a/src/server/src/services/window-manager/hyprland/hyprland.cpp b/src/server/src/services/window-manager/hyprland/hyprland.cpp index 84b7a936a..97764f2d4 100644 --- a/src/server/src/services/window-manager/hyprland/hyprland.cpp +++ b/src/server/src/services/window-manager/hyprland/hyprland.cpp @@ -39,16 +39,15 @@ AbstractWindowManager::WindowPtr HyprlandWindowManager::getFocusedWindowSync() c void HyprlandWindowManager::focusWindowSync(const AbstractWindow &window) const { auto addr = window.id().toStdString(); + qDebug() << "Hyprland focusWindowSync:" << window.id(); Hyprctl::oneshot(std::format("[[BATCH]]dispatch focuswindow address:{0}" - ";eval hl.dispatch(hl.dsp.focus({{window=\"address:{0}\"}}))", + ";dispatch layoutmsg center", addr)); } bool HyprlandWindowManager::closeWindow(const AbstractWindow &window) const { auto addr = window.id().toStdString(); - Hyprctl::oneshot(std::format("[[BATCH]]dispatch closewindow address:{0}" - ";eval hl.dispatch(hl.dsp.window.close({{window=\"address:{0}\"}}))", - addr)); + Hyprctl::oneshot(std::format("[[BATCH]]dispatch closewindow address:{0}", addr)); emit windowsChanged(); return true;