tests: add testcase for #239, bug number 2

If a window is unmapped during the draw_callback re-run when the screen
is just redirected, that window won't get a chance to acquire a pixmap.
If fading is enabled, the compositor will try to render that window and
crash.

Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
Yuxuan Shui 2019-09-28 23:18:43 +01:00
parent 0c7a19fda6
commit df67fb2508
No known key found for this signature in database
GPG Key ID: 37C999F617EA1A47
3 changed files with 58 additions and 0 deletions

View File

@ -0,0 +1,8 @@
fading = true;
fade-in-step = 1;
fade-out-step = 0.01;
shadow = true;
shadow-exclude = [
"name = 'NoShadow'"
]
unredir-if-possible = true;

View File

@ -5,3 +5,4 @@ cd $(dirname $0)
./run_one_test.sh $compton configs/empty.conf testcases/basic.py
./run_one_test.sh $compton configs/issue239.conf testcases/issue239.py
./run_one_test.sh $compton configs/issue239_2.conf testcases/issue239_2.py

49
tests/testcases/issue239_2.py Executable file
View File

@ -0,0 +1,49 @@
#!/usr/bin/env python
import xcffib.xproto as xproto
import xcffib
import time
conn = xcffib.connect()
setup = conn.get_setup()
root = setup.roots[0].root
visual = setup.roots[0].root_visual
depth = setup.roots[0].root_depth
# issue 239 is caused by a window gaining a shadow during its fade-out transition
wid = conn.generate_id()
print("Window ids are ", hex(wid))
# Create a window
mask = xproto.CW.BackPixel
value = [ setup.roots[0].white_pixel ]
conn.core.CreateWindowChecked(depth, wid, root, 0, 0, 100, 100, 0, xproto.WindowClass.InputOutput, visual, mask, value).check()
name = "_NET_WM_STATE"
name_atom = conn.core.InternAtom(False, len(name), name).reply().atom
atom = "ATOM"
atom_atom = conn.core.InternAtom(False, len(atom), atom).reply().atom
fs = "_NET_WM_STATE_FULLSCREEN"
fs_atom = conn.core.InternAtom(False, len(fs), fs).reply().atom
# Map the window
conn.core.MapWindowChecked(wid).check()
time.sleep(0.5)
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid, name_atom, atom_atom, 32, 1, [fs_atom]).check()
time.sleep(0.5)
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid, name_atom, atom_atom, 32, 0, []).check()
conn.core.GetInputFocus().reply()
# Unmap the window
conn.core.UnmapWindowChecked(wid).check()
time.sleep(0.5)
# Destroy the window
conn.core.DestroyWindowChecked(wid).check()