summaryrefslogtreecommitdiff
path: root/src/tests/stacking
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2019-07-03 12:04:08 +0200
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2019-07-08 11:46:52 +0200
commit6d8293a422b08af97d3da985d49448db32d59248 (patch)
tree136c5cea462dde26706ae720e18247f210ffa6dc /src/tests/stacking
parentb80250e483e20bc2b66aa0117af0c442875c1b74 (diff)
downloadmutter-6d8293a422b08af97d3da985d49448db32d59248.tar.gz
window-x11: Use any focusable window as fallback delayed focus window
As per commit f71151a5 we focus an input window if no take-focus-window accepts it. This might lead to an infinite loop if there are various focusable but non-input windows in the stack. When the current focus window is unmanaging and we're trying to focus a WM_TAKE_FOCUS window, we intent to give the focus to the first focusable input window in the stack. However, if an application (such as the Java ones) only uses non-input WM_TAKE_FOCUS windows, are not requesting these ones to get the focus. This might lead to a state where no window is focused, or a wrong one is. So, instead of only focus the first eventually input window available, try to request to all the take-focus windows that are in the stack between the destroyed one and the first input one to acquire the input focus. Use a queue to keep track of those windows, that is passed around stealing ownership, while we protect for unmanaged queued windows. Also, reduce the default timeout value, as the previous one might lead to an excessive long wait. Added metatests verifying these situations. Closes: https://gitlab.gnome.org/GNOME/mutter/issues/660 https://gitlab.gnome.org/GNOME/mutter/merge_requests/669
Diffstat (limited to 'src/tests/stacking')
-rw-r--r--src/tests/stacking/closed-transient-no-input-parent.metatest2
-rw-r--r--src/tests/stacking/closed-transient-no-input-parents-queued-default-focus-destroyed.metatest43
-rw-r--r--src/tests/stacking/closed-transient-no-input-parents.metatest6
-rw-r--r--src/tests/stacking/closed-transient-only-take-focus-parents.metatest34
4 files changed, 81 insertions, 4 deletions
diff --git a/src/tests/stacking/closed-transient-no-input-parent.metatest b/src/tests/stacking/closed-transient-no-input-parent.metatest
index e0f1dc1e2..d0f3228d5 100644
--- a/src/tests/stacking/closed-transient-no-input-parent.metatest
+++ b/src/tests/stacking/closed-transient-no-input-parent.metatest
@@ -25,6 +25,6 @@ dispatch
assert_focused none
assert_stacking 2/1 1/1 1/2
-sleep 250
+sleep 150
assert_focused 1/1
assert_stacking 2/1 1/1 1/2
diff --git a/src/tests/stacking/closed-transient-no-input-parents-queued-default-focus-destroyed.metatest b/src/tests/stacking/closed-transient-no-input-parents-queued-default-focus-destroyed.metatest
new file mode 100644
index 000000000..49ecc510f
--- /dev/null
+++ b/src/tests/stacking/closed-transient-no-input-parents-queued-default-focus-destroyed.metatest
@@ -0,0 +1,43 @@
+new_client 0 x11
+create 0/1
+show 0/1
+
+new_client 1 x11
+create 1/1
+show 1/1
+
+create 1/2 csd
+set_parent 1/2 1
+accept_focus 1/2 false
+show 1/2
+
+create 1/3 csd
+set_parent 1/3 2
+accept_focus 1/3 false
+show 1/3
+
+create 1/4 csd
+set_parent 1/4 3
+accept_focus 1/4 false
+show 1/4
+
+create 1/5 csd
+set_parent 1/5 3
+show 1/5
+
+wait
+assert_focused 1/5
+assert_stacking 0/1 1/1 1/2 1/3 1/4 1/5
+
+destroy 1/5
+dispatch
+
+assert_focused none
+assert_stacking 0/1 1/1 1/2 1/3 1/4
+
+destroy 1/2
+dispatch
+
+sleep 450
+assert_focused 1/1
+assert_stacking 0/1 1/1 1/3 1/4
diff --git a/src/tests/stacking/closed-transient-no-input-parents.metatest b/src/tests/stacking/closed-transient-no-input-parents.metatest
index e3ec2e84a..ee9984192 100644
--- a/src/tests/stacking/closed-transient-no-input-parents.metatest
+++ b/src/tests/stacking/closed-transient-no-input-parents.metatest
@@ -35,12 +35,12 @@ dispatch
assert_focused none
assert_stacking 0/1 1/1 1/2 1/3 1/4
-sleep 250
-assert_focused none
+sleep 600
+assert_focused 1/1
assert_stacking 0/1 1/1 1/2 1/3 1/4
destroy 1/3
wait
-assert_focused none
+assert_focused 1/1
assert_stacking 0/1 1/1 1/2 1/4
diff --git a/src/tests/stacking/closed-transient-only-take-focus-parents.metatest b/src/tests/stacking/closed-transient-only-take-focus-parents.metatest
new file mode 100644
index 000000000..8aa86700f
--- /dev/null
+++ b/src/tests/stacking/closed-transient-only-take-focus-parents.metatest
@@ -0,0 +1,34 @@
+new_client 0 x11
+create 0/1
+show 0/1
+
+new_client 1 x11
+create 1/1
+accept_focus 1/1 false
+can_take_focus 1/1 true
+accept_take_focus 1/1 true
+show 1/1
+
+create 1/2 csd
+set_parent 1/2 1
+accept_focus 1/2 false
+can_take_focus 1/2 true
+accept_take_focus 1/2 true
+show 1/2
+
+create 1/3
+set_parent 1/3 2
+show 1/3
+
+assert_focused 1/3
+assert_stacking 0/1 1/1 1/2 1/3
+
+destroy 1/3
+wait
+
+assert_focused 1/2
+assert_stacking 0/1 1/1 1/2
+
+sleep 150
+assert_focused 1/2
+assert_stacking 0/1 1/1 1/2