From db2c9ff0be619d958165a4126ba3d68630d9c261 Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Mon, 18 Nov 2019 20:53:49 +0000 Subject: [PATCH] tests: add testcase for another case of #239 The compositor crashes when a window does: has shadow -> no shadow -> has shadow This is because when the shadow is turned off, the shadow image is not freed, and this is catched by a later assertion. Signed-off-by: Yuxuan Shui --- tests/configs/issue239_3.conf | 4 +++ tests/run_tests.sh | 1 + tests/testcases/issue239_3.py | 52 +++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 tests/configs/issue239_3.conf create mode 100755 tests/testcases/issue239_3.py diff --git a/tests/configs/issue239_3.conf b/tests/configs/issue239_3.conf new file mode 100644 index 0000000..b8a1d69 --- /dev/null +++ b/tests/configs/issue239_3.conf @@ -0,0 +1,4 @@ +shadow = true; +shadow-exclude = [ +"name = 'NoShadow'" +] diff --git a/tests/run_tests.sh b/tests/run_tests.sh index 0becc68..fd499b9 100755 --- a/tests/run_tests.sh +++ b/tests/run_tests.sh @@ -6,3 +6,4 @@ cd $(dirname $0) ./run_one_test.sh $exe configs/empty.conf testcases/basic.py ./run_one_test.sh $exe configs/issue239.conf testcases/issue239.py ./run_one_test.sh $exe configs/issue239_2.conf testcases/issue239_2.py +./run_one_test.sh $exe configs/issue239_3.conf testcases/issue239_3.py diff --git a/tests/testcases/issue239_3.py b/tests/testcases/issue239_3.py new file mode 100755 index 0000000..9e9bc2f --- /dev/null +++ b/tests/testcases/issue239_3.py @@ -0,0 +1,52 @@ +#!/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 id is ", hex(wid)) + +# Create a window +conn.core.CreateWindowChecked(depth, wid, root, 0, 0, 100, 100, 0, xproto.WindowClass.InputOutput, visual, 0, []).check() + +# Set Window name so it doesn't get a shadow +name = "_NET_WM_NAME" +name_atom = conn.core.InternAtom(True, len(name), name).reply().atom +str_type = "STRING" +str_type_atom = conn.core.InternAtom(True, len(str_type), str_type).reply().atom + +win_name = "YesShadow" +conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid, name_atom, str_type_atom, 8, len(win_name), win_name).check() + +# Map the window +print("mapping") +conn.core.MapWindowChecked(wid).check() + +time.sleep(0.5) + +print("set new name") +win_name = "NoShadow" +conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid, name_atom, str_type_atom, 8, len(win_name), win_name).check() + +# Set the Window name so it gets a shadow +print("set new name") +win_name = "YesShadow" +conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid, name_atom, str_type_atom, 8, len(win_name), win_name).check() + +time.sleep(0.5) + +# Unmap the window +conn.core.UnmapWindowChecked(wid).check() + +time.sleep(0.5) + +# Destroy the window +conn.core.DestroyWindowChecked(wid).check()