aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authoroutfoxxed <[email protected]>2024-09-06 17:06:55 -0700
committerGitHub <[email protected]>2024-09-07 01:06:55 +0100
commit0500213086f8402ccbdb2acb4748dbc6d22e21f6 (patch)
treece3154cab29fd2437af4d55e53ef994c0d6a72d2
parentb0fca6eaf00a2c5061f499c76ec8d60772b6a719 (diff)
downloadHyprland-0500213086f8402ccbdb2acb4748dbc6d22e21f6.tar.gz
Hyprland-0500213086f8402ccbdb2acb4748dbc6d22e21f6.zip
input: try to refocus a focusable window when seat grabs are reset (#7669)
-rw-r--r--src/desktop/Popup.cpp7
-rw-r--r--src/desktop/Popup.hpp23
-rw-r--r--src/managers/SeatManager.cpp31
3 files changed, 50 insertions, 11 deletions
diff --git a/src/desktop/Popup.cpp b/src/desktop/Popup.cpp
index a4952ef7..9e254fa6 100644
--- a/src/desktop/Popup.cpp
+++ b/src/desktop/Popup.cpp
@@ -202,6 +202,13 @@ void CPopup::reposition() {
m_pResource->applyPositioning(box, COORDS);
}
+SP<CWLSurface> CPopup::getT1Owner() {
+ if (m_pWindowOwner)
+ return m_pWindowOwner->m_pWLSurface;
+ else
+ return m_pLayerOwner->surface;
+}
+
Vector2D CPopup::coordsRelativeToParent() {
Vector2D offset;
diff --git a/src/desktop/Popup.hpp b/src/desktop/Popup.hpp
index eea3fb84..04996612 100644
--- a/src/desktop/Popup.hpp
+++ b/src/desktop/Popup.hpp
@@ -18,21 +18,22 @@ class CPopup {
~CPopup();
- Vector2D coordsRelativeToParent();
- Vector2D coordsGlobal();
+ SP<CWLSurface> getT1Owner();
+ Vector2D coordsRelativeToParent();
+ Vector2D coordsGlobal();
- Vector2D size();
+ Vector2D size();
- void onNewPopup(SP<CXDGPopupResource> popup);
- void onDestroy();
- void onMap();
- void onUnmap();
- void onCommit(bool ignoreSiblings = false);
- void onReposition();
+ void onNewPopup(SP<CXDGPopupResource> popup);
+ void onDestroy();
+ void onMap();
+ void onUnmap();
+ void onCommit(bool ignoreSiblings = false);
+ void onReposition();
- void recheckTree();
+ void recheckTree();
- bool visible();
+ bool visible();
// will also loop over this node
void breadthfirst(std::function<void(CPopup*, void*)> fn, void* data);
diff --git a/src/managers/SeatManager.cpp b/src/managers/SeatManager.cpp
index 3e4063f4..b40d6cad 100644
--- a/src/managers/SeatManager.cpp
+++ b/src/managers/SeatManager.cpp
@@ -6,6 +6,7 @@
#include "../protocols/core/Compositor.hpp"
#include "../Compositor.hpp"
#include "../devices/IKeyboard.hpp"
+#include "wlr-layer-shell-unstable-v1.hpp"
#include <algorithm>
#include <ranges>
@@ -584,6 +585,36 @@ void CSeatManager::setGrab(SP<CSeatGrab> grab) {
auto oldGrab = seatGrab;
seatGrab.reset();
g_pInputManager->refocus();
+
+ auto currentFocus = state.keyboardFocus.lock();
+ auto refocus = !currentFocus;
+
+ SP<CWLSurface> surf;
+ PHLLS layer;
+
+ if (!refocus) {
+ surf = CWLSurface::fromResource(currentFocus);
+ layer = surf->getLayer();
+ }
+
+ if (!refocus && !layer) {
+ auto popup = surf->getPopup();
+ if (popup) {
+ auto parent = popup->getT1Owner();
+ layer = parent->getLayer();
+ }
+ }
+
+ if (!refocus && layer)
+ refocus = layer->interactivity == ZWLR_LAYER_SURFACE_V1_KEYBOARD_INTERACTIVITY_NONE;
+
+ if (refocus) {
+ auto candidate = g_pCompositor->m_pLastWindow.lock();
+
+ if (candidate)
+ g_pCompositor->focusWindow(candidate);
+ }
+
if (oldGrab->onEnd)
oldGrab->onEnd();
}