dwm picom added
This commit is contained in:
1 parent
471b6062af
commit
964ff4b2c7
132 files changed
+32922
No files matched your search
@@ -0,0 +1,5 @@
|
||||
shadow = true;
|
||||
shadow-exclude = [
|
||||
"name = 'NoShadow'"
|
||||
]
|
||||
unredir-if-possible = true;
|
||||
Whitespace-only changes.
@@ -0,0 +1,7 @@
|
||||
fading = true;
|
||||
fade-in-step = 1;
|
||||
fade-out-step = 0.01;
|
||||
shadow = true;
|
||||
shadow-exclude = [
|
||||
"name = 'NoShadow'"
|
||||
]
|
||||
@@ -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;
|
||||
@@ -0,0 +1,4 @@
|
||||
shadow = true;
|
||||
shadow-exclude = [
|
||||
"name = 'NoShadow'"
|
||||
]
|
||||
@@ -0,0 +1,6 @@
|
||||
fading = true
|
||||
fade-in-step = 0.01
|
||||
fade-out-step = 0.01
|
||||
inactive-opacity = 0
|
||||
blur-background = true
|
||||
force-win-blend = true
|
||||
@@ -0,0 +1,3 @@
|
||||
fading = true;
|
||||
fade-in-step = 1;
|
||||
fade-out-step = 0.01;
|
||||
@@ -0,0 +1,4 @@
|
||||
fading = true;
|
||||
fade-in-step = 1;
|
||||
fade-out-step = 0.01;
|
||||
shadow = true;
|
||||
@@ -0,0 +1,4 @@
|
||||
shadow = true;
|
||||
shadow-exclude = [
|
||||
"focused != 1"
|
||||
];
|
||||
Executable
+19
@@ -0,0 +1,19 @@
|
||||
#!/bin/sh
|
||||
set -xe
|
||||
if [ -z $DISPLAY ]; then
|
||||
exec xvfb-run -s "+extension composite" -a $0 $1 $2 $3
|
||||
fi
|
||||
|
||||
echo "Running test $2"
|
||||
|
||||
# TODO keep the log file, and parse it to see if test is successful
|
||||
($1 --dbus --experimental-backends --backend dummy --log-level=debug --log-file=$PWD/log --config=$2) &
|
||||
main_pid=$!
|
||||
$3
|
||||
|
||||
kill -INT $main_pid || true
|
||||
cat log
|
||||
rm log
|
||||
wait $main_pid
|
||||
|
||||
|
||||
Executable
+22
@@ -0,0 +1,22 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
exe=$(realpath $1)
|
||||
cd $(dirname $0)
|
||||
|
||||
eval `dbus-launch --sh-syntax`
|
||||
|
||||
./run_one_test.sh $exe configs/empty.conf testcases/basic.py
|
||||
./run_one_test.sh $exe configs/issue357.conf testcases/issue357.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
|
||||
./run_one_test.sh $exe configs/issue239_3.conf testcases/issue239_3_norefresh.py
|
||||
./run_one_test.sh $exe configs/issue314.conf testcases/issue314.py
|
||||
./run_one_test.sh $exe configs/issue314.conf testcases/issue314_2.py
|
||||
./run_one_test.sh $exe configs/issue314.conf testcases/issue314_3.py
|
||||
./run_one_test.sh $exe /dev/null testcases/issue299.py
|
||||
./run_one_test.sh $exe configs/issue465.conf testcases/issue465.py
|
||||
./run_one_test.sh $exe configs/clear_shadow_unredirected.conf testcases/clear_shadow_unredirected.py
|
||||
./run_one_test.sh $exe configs/clear_shadow_unredirected.conf testcases/redirect_when_unmapped_window_has_shadow.py
|
||||
./run_one_test.sh $exe configs/issue394.conf testcases/issue394.py
|
||||
./run_one_test.sh $exe configs/issue239.conf testcases/issue525.py
|
||||
Executable
+18
@@ -0,0 +1,18 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
|
||||
conn = xcffib.connect()
|
||||
setup = conn.get_setup()
|
||||
root = setup.roots[0].root
|
||||
visual = setup.roots[0].root_visual
|
||||
depth = setup.roots[0].root_depth
|
||||
|
||||
wid = conn.generate_id()
|
||||
conn.core.CreateWindowChecked(depth, wid, root, 0, 0, 100, 100, 0, xproto.WindowClass.InputOutput, visual, 0, []).check()
|
||||
conn.core.MapWindowChecked(wid).check()
|
||||
conn.core.UnmapWindowChecked(wid).check()
|
||||
conn.core.DestroyWindowChecked(wid).check()
|
||||
|
||||
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
from common import set_window_name
|
||||
|
||||
conn = xcffib.connect()
|
||||
setup = conn.get_setup()
|
||||
root = setup.roots[0].root
|
||||
visual = setup.roots[0].root_visual
|
||||
depth = setup.roots[0].root_depth
|
||||
|
||||
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
|
||||
|
||||
# making sure disabling shadow while screen is unredirected doesn't cause assertion failure
|
||||
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 does get a shadow
|
||||
set_window_name(conn, wid, "YesShadow")
|
||||
|
||||
# Map the window
|
||||
print("mapping")
|
||||
conn.core.MapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Set fullscreen property, causing screen to be unredirected
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid, name_atom, atom_atom, 32, 1, [fs_atom]).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Set the Window name so it loses its shadow
|
||||
print("set new name")
|
||||
set_window_name(conn, wid, "NoShadow")
|
||||
|
||||
# Unmap the window
|
||||
conn.core.UnmapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Destroy the window
|
||||
conn.core.DestroyWindowChecked(wid).check()
|
||||
@@ -0,0 +1,85 @@
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib.randr as randr
|
||||
import xcffib
|
||||
import time
|
||||
import random
|
||||
import string
|
||||
|
||||
def to_atom(conn, string):
|
||||
return conn.core.InternAtom(False, len(string), string).reply().atom
|
||||
|
||||
def set_window_name(conn, wid, name):
|
||||
prop_name = to_atom(conn, "_NET_WM_NAME")
|
||||
str_type = to_atom(conn, "UTF8_STRING")
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid, prop_name, str_type, 8, len(name), name).check()
|
||||
prop_name = to_atom(conn, "WM_NAME")
|
||||
str_type = to_atom(conn, "STRING")
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid, prop_name, str_type, 8, len(name), name).check()
|
||||
|
||||
def set_window_state(conn, wid, state):
|
||||
prop_name = to_atom(conn, "WM_STATE")
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid, prop_name, prop_name, 32, 2, [state, 0]).check()
|
||||
|
||||
def set_window_class(conn, wid, name):
|
||||
if not isinstance(name, bytearray):
|
||||
name = name.encode()
|
||||
name = name+b"\0"+name+b"\0"
|
||||
prop_name = to_atom(conn, "WM_CLASS")
|
||||
str_type = to_atom(conn, "STRING")
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid, prop_name, str_type, 8, len(name), name).check()
|
||||
|
||||
def set_window_size_async(conn, wid, width, height):
|
||||
value_mask = xproto.ConfigWindow.Width | xproto.ConfigWindow.Height
|
||||
value_list = [width, height]
|
||||
return conn.core.ConfigureWindowChecked(wid, value_mask, value_list)
|
||||
|
||||
def find_picom_window(conn):
|
||||
prop_name = to_atom(conn, "WM_NAME")
|
||||
setup = conn.get_setup()
|
||||
root = setup.roots[0].root
|
||||
windows = conn.core.QueryTree(root).reply()
|
||||
|
||||
ext = xproto.xprotoExtension(conn)
|
||||
for w in windows.children:
|
||||
name = ext.GetProperty(False, w, prop_name, xproto.GetPropertyType.Any, 0, (2 ** 32) - 1).reply()
|
||||
if name.value.buf() == b"picom":
|
||||
return w
|
||||
|
||||
def prepare_root_configure(conn):
|
||||
setup = conn.get_setup()
|
||||
root = setup.roots[0].root
|
||||
# Xorg sends root ConfigureNotify when we add a new mode to an output
|
||||
rr = conn(randr.key)
|
||||
name = ''.join([random.choice(string.ascii_letters + string.digits) for n in range(0, 32)])
|
||||
mode_info = randr.ModeInfo.synthetic(id = 0, width = 1000, height = 1000, dot_clock = 0,
|
||||
hsync_start = 0, hsync_end = 0, htotal = 0, hskew = 0, vsync_start = 0, vsync_end = 0,
|
||||
vtotal = 0, name_len = len(name), mode_flags = 0)
|
||||
|
||||
reply = rr.CreateMode(root, mode_info, len(name), name).reply()
|
||||
mode = reply.mode
|
||||
reply = rr.GetScreenResourcesCurrent(root).reply()
|
||||
# our xvfb is setup to only have 1 output
|
||||
output = reply.outputs[0]
|
||||
rr.AddOutputModeChecked(output, mode).check()
|
||||
return reply, mode, output
|
||||
|
||||
def trigger_root_configure(conn, reply, mode, output):
|
||||
rr = conn(randr.key)
|
||||
return rr.SetCrtcConfig(reply.crtcs[0], reply.timestamp, reply.config_timestamp, 0, 0, mode, randr.Rotation.Rotate_0, 1, [output])
|
||||
|
||||
def find_32bit_visual(conn):
|
||||
setup = conn.get_setup()
|
||||
render = conn(xcffib.render.key)
|
||||
r = render.QueryPictFormats().reply()
|
||||
pictfmt_ids = set()
|
||||
for pictform in r.formats:
|
||||
if (pictform.depth == 32 and
|
||||
pictform.type == xcffib.render.PictType.Direct and
|
||||
pictform.direct.alpha_mask != 0):
|
||||
pictfmt_ids.add(pictform.id)
|
||||
print(pictfmt_ids)
|
||||
for screen in r.screens:
|
||||
for depth in screen.depths:
|
||||
for pv in depth.visuals:
|
||||
if pv.format in pictfmt_ids:
|
||||
return pv.visual
|
||||
Executable
+40
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
from common import set_window_name
|
||||
|
||||
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
|
||||
set_window_name(conn, wid, "NoShadow")
|
||||
|
||||
# Map the window
|
||||
print("mapping")
|
||||
conn.core.MapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Set the Window name so it gets a shadow
|
||||
print("set new name")
|
||||
set_window_name(conn, wid, "YesShadow")
|
||||
|
||||
# Unmap the window
|
||||
conn.core.UnmapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Destroy the window
|
||||
conn.core.DestroyWindowChecked(wid).check()
|
||||
Executable
+52
@@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
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, causing screen to be redirected
|
||||
conn.core.MapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Set fullscreen property, causing screen to be unredirected
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid, name_atom, atom_atom, 32, 1, [fs_atom]).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Clear fullscreen property, causing screen to be redirected
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid, name_atom, atom_atom, 32, 0, []).check()
|
||||
|
||||
# Do a round trip to X server so the compositor has a chance to start the rerun of _draw_callback
|
||||
conn.core.GetInputFocus().reply()
|
||||
|
||||
# Unmap the window, triggers the bug
|
||||
conn.core.UnmapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Destroy the window
|
||||
conn.core.DestroyWindowChecked(wid).check()
|
||||
Executable
+47
@@ -0,0 +1,47 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
from common import set_window_name
|
||||
|
||||
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 gets a shadow
|
||||
set_window_name(conn, wid, "YesShadow")
|
||||
|
||||
# Map the window
|
||||
print("mapping")
|
||||
conn.core.MapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
print("set new name")
|
||||
set_window_name(conn, wid, "NoShadow")
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Set the Window name so it gets a shadow
|
||||
print("set new name")
|
||||
set_window_name(conn, wid, "YesShadow")
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Unmap the window
|
||||
conn.core.UnmapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Destroy the window
|
||||
conn.core.DestroyWindowChecked(wid).check()
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
from common import set_window_name
|
||||
|
||||
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 gets a shadow
|
||||
set_window_name(conn, wid, "YesShadow")
|
||||
|
||||
# Map the window
|
||||
print("mapping")
|
||||
conn.core.MapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
print("set new name")
|
||||
set_window_name(conn, wid, "NoShadow")
|
||||
|
||||
# Set the Window name so it gets a shadow
|
||||
print("set new name")
|
||||
set_window_name(conn, wid, "YesShadow")
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Unmap the window
|
||||
conn.core.UnmapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Destroy the window
|
||||
conn.core.DestroyWindowChecked(wid).check()
|
||||
Executable
+112
@@ -0,0 +1,112 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
import os
|
||||
import subprocess
|
||||
import asyncio
|
||||
from dbus_next.aio import MessageBus
|
||||
from dbus_next.message import Message, MessageType
|
||||
from common import *
|
||||
|
||||
display = os.environ["DISPLAY"].replace(":", "_")
|
||||
conn = xcffib.connect()
|
||||
setup = conn.get_setup()
|
||||
root = setup.roots[0].root
|
||||
visual = setup.roots[0].root_visual
|
||||
depth = setup.roots[0].root_depth
|
||||
x = xproto.xprotoExtension(conn)
|
||||
visual32 = find_32bit_visual(conn)
|
||||
|
||||
async def get_client_win_async(wid):
|
||||
message = await bus.call(Message(destination='com.github.chjj.compton.'+display,
|
||||
path='/com/github/chjj/compton',
|
||||
interface='com.github.chjj.compton',
|
||||
member='win_get',
|
||||
signature='us',
|
||||
body=[wid, 'client_win']))
|
||||
return message.body[0]
|
||||
|
||||
def get_client_win(wid):
|
||||
return loop.run_until_complete(get_client_win_async(wid))
|
||||
|
||||
def wait():
|
||||
time.sleep(0.5)
|
||||
|
||||
def create_client_window(name):
|
||||
client_win = conn.generate_id()
|
||||
print("Window : ", hex(client_win))
|
||||
conn.core.CreateWindowChecked(depth, client_win, root, 0, 0, 100, 100, 0,
|
||||
xproto.WindowClass.InputOutput, visual, 0, []).check()
|
||||
set_window_name(conn, client_win, "Test window "+name)
|
||||
set_window_class(conn, client_win, "Test windows")
|
||||
set_window_state(conn, client_win, 1)
|
||||
conn.core.MapWindowChecked(client_win).check()
|
||||
return client_win
|
||||
|
||||
loop = asyncio.get_event_loop()
|
||||
bus = loop.run_until_complete(MessageBus().connect())
|
||||
|
||||
cmid = conn.generate_id()
|
||||
colormap = conn.core.CreateColormapChecked(xproto.ColormapAlloc._None, cmid, root, visual32).check()
|
||||
|
||||
# Create window
|
||||
client_wins = []
|
||||
for i in range(0,2):
|
||||
client_wins.append(create_client_window(str(i)))
|
||||
|
||||
# Create frame window
|
||||
frame_win = conn.generate_id()
|
||||
print("Window : ", hex(frame_win))
|
||||
conn.core.CreateWindowChecked(depth, frame_win, root, 0, 0, 200, 200, 0,
|
||||
xproto.WindowClass.InputOutput, visual, 0, []).check()
|
||||
set_window_name(conn, frame_win, "Frame")
|
||||
conn.core.MapWindowChecked(frame_win).check()
|
||||
|
||||
# Scenario 1.1
|
||||
# 1. reparent placeholder to frame
|
||||
conn.core.ReparentWindowChecked(client_wins[0], frame_win, 0, 0).check()
|
||||
wait()
|
||||
# 2. reparent real client to frame
|
||||
conn.core.ReparentWindowChecked(client_wins[1], frame_win, 0, 0).check()
|
||||
wait()
|
||||
# 3. detach the placeholder
|
||||
conn.core.ReparentWindowChecked(client_wins[0], root, 0, 0).check()
|
||||
wait()
|
||||
assert get_client_win(frame_win) == client_wins[1]
|
||||
|
||||
# Scenario 1.2
|
||||
# 1. reparent placeholder to frame
|
||||
conn.core.ReparentWindowChecked(client_wins[0], frame_win, 0, 0).check()
|
||||
wait()
|
||||
# 2. reparent real client to frame
|
||||
conn.core.ReparentWindowChecked(client_wins[1], frame_win, 0, 0).check()
|
||||
wait()
|
||||
# 3. destroy the placeholder
|
||||
conn.core.DestroyWindowChecked(client_wins[0]).check()
|
||||
wait()
|
||||
assert get_client_win(frame_win) == client_wins[1]
|
||||
|
||||
client_wins[0] = create_client_window("0")
|
||||
|
||||
# Scenario 2
|
||||
# 1. frame is unmapped
|
||||
conn.core.UnmapWindowChecked(frame_win).check()
|
||||
wait()
|
||||
# 2. reparent placeholder to frame
|
||||
conn.core.ReparentWindowChecked(client_wins[0], frame_win, 0, 0).check()
|
||||
wait()
|
||||
# 3. destroy placeholder, map frame and reparent real client to frame
|
||||
conn.core.DestroyWindowChecked(client_wins[0]).check()
|
||||
conn.core.MapWindowChecked(frame_win).check()
|
||||
conn.core.ReparentWindowChecked(client_wins[1], frame_win, 0, 0).check()
|
||||
wait()
|
||||
assert get_client_win(frame_win) == client_wins[1]
|
||||
|
||||
client_wins[0] = create_client_window("0")
|
||||
|
||||
# Destroy the windows
|
||||
for wid in client_wins:
|
||||
conn.core.DestroyWindowChecked(wid).check()
|
||||
conn.core.DestroyWindowChecked(frame_win).check()
|
||||
Executable
+44
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
from common import set_window_name, trigger_root_configure
|
||||
|
||||
conn = xcffib.connect()
|
||||
setup = conn.get_setup()
|
||||
root = setup.roots[0].root
|
||||
visual = setup.roots[0].root_visual
|
||||
depth = setup.roots[0].root_depth
|
||||
x = xproto.xprotoExtension(conn)
|
||||
|
||||
# issue 314 is caused by changing a windows target opacity during its fade-in/-out transition
|
||||
wid1 = conn.generate_id()
|
||||
print("Window 1: ", hex(wid1))
|
||||
wid2 = conn.generate_id()
|
||||
print("Window 2: ", hex(wid2))
|
||||
|
||||
# Create windows
|
||||
conn.core.CreateWindowChecked(depth, wid1, root, 0, 0, 100, 100, 0, xproto.WindowClass.InputOutput, visual, 0, []).check()
|
||||
conn.core.CreateWindowChecked(depth, wid2, root, 0, 0, 100, 100, 0, xproto.WindowClass.InputOutput, visual, 0, []).check()
|
||||
|
||||
# Set Window names
|
||||
set_window_name(conn, wid1, "Test window 1")
|
||||
set_window_name(conn, wid2, "Test window 2")
|
||||
|
||||
# Check updating opacity while UNMAPPING/DESTROYING windows
|
||||
print("Mapping 1")
|
||||
conn.core.MapWindowChecked(wid1).check()
|
||||
print("Mapping 2")
|
||||
conn.core.MapWindowChecked(wid2).check()
|
||||
time.sleep(0.5)
|
||||
|
||||
x.SetInputFocusChecked(0, wid1, xproto.Time.CurrentTime).check()
|
||||
time.sleep(0.5)
|
||||
|
||||
# Destroy the windows
|
||||
print("Destroy 1 while fading out")
|
||||
conn.core.DestroyWindowChecked(wid1).check()
|
||||
x.SetInputFocusChecked(0, wid2, xproto.Time.CurrentTime).check()
|
||||
time.sleep(1)
|
||||
conn.core.DestroyWindowChecked(wid2).check()
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
from common import set_window_name
|
||||
|
||||
conn = xcffib.connect()
|
||||
setup = conn.get_setup()
|
||||
root = setup.roots[0].root
|
||||
visual = setup.roots[0].root_visual
|
||||
depth = setup.roots[0].root_depth
|
||||
x = xproto.xprotoExtension(conn)
|
||||
|
||||
opacity_80 = [int(0xffffffff * 0.8), ]
|
||||
opacity_single = [int(0xffffffff * 0.002), ]
|
||||
|
||||
# issue 314 is caused by changing a windows target opacity during its fade-in/-out transition
|
||||
wid1 = conn.generate_id()
|
||||
print("Window 1: ", hex(wid1))
|
||||
|
||||
atom = "_NET_WM_WINDOW_OPACITY"
|
||||
opacity_atom = conn.core.InternAtom(False, len(atom), atom).reply().atom
|
||||
|
||||
# Create windows
|
||||
conn.core.CreateWindowChecked(depth, wid1, root, 0, 0, 100, 100, 0, xproto.WindowClass.InputOutput, visual, 0, []).check()
|
||||
|
||||
# Set Window names
|
||||
set_window_name(conn, wid1, "Test window 1")
|
||||
|
||||
# Check updating opacity while MAPPING windows
|
||||
print("Mapping window")
|
||||
conn.core.MapWindowChecked(wid1).check()
|
||||
time.sleep(0.5)
|
||||
|
||||
print("Update opacity while fading in")
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid1, opacity_atom, xproto.Atom.CARDINAL, 32, 1, opacity_80).check()
|
||||
time.sleep(0.2)
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid1, opacity_atom, xproto.Atom.CARDINAL, 32, 1, opacity_single).check()
|
||||
time.sleep(1)
|
||||
|
||||
conn.core.DeletePropertyChecked(wid1, opacity_atom).check()
|
||||
time.sleep(0.5)
|
||||
|
||||
# Destroy the windows
|
||||
conn.core.DestroyWindowChecked(wid1).check()
|
||||
Executable
+63
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
from common import set_window_name
|
||||
|
||||
conn = xcffib.connect()
|
||||
setup = conn.get_setup()
|
||||
root = setup.roots[0].root
|
||||
visual = setup.roots[0].root_visual
|
||||
depth = setup.roots[0].root_depth
|
||||
x = xproto.xprotoExtension(conn)
|
||||
|
||||
opacity_100 = [0xffffffff, ]
|
||||
opacity_80 = [int(0xffffffff * 0.8), ]
|
||||
opacity_single = [int(0xffffffff * 0.002), ]
|
||||
opacity_0 = [0, ]
|
||||
|
||||
# issue 314 is caused by changing a windows target opacity during its fade-in/-out transition
|
||||
wid1 = conn.generate_id()
|
||||
print("Window 1: ", hex(wid1))
|
||||
|
||||
atom = "_NET_WM_WINDOW_OPACITY"
|
||||
opacity_atom = conn.core.InternAtom(False, len(atom), atom).reply().atom
|
||||
|
||||
# Create windows
|
||||
conn.core.CreateWindowChecked(depth, wid1, root, 0, 0, 100, 100, 0, xproto.WindowClass.InputOutput, visual, 0, []).check()
|
||||
|
||||
# Set Window names
|
||||
set_window_name(conn, wid1, "Test window 1")
|
||||
|
||||
# Check updating opacity while FADING windows
|
||||
print("Mapping window")
|
||||
conn.core.MapWindowChecked(wid1).check()
|
||||
time.sleep(1.2)
|
||||
|
||||
print("Update opacity while fading out")
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid1, opacity_atom, xproto.Atom.CARDINAL, 32, 1, opacity_single).check()
|
||||
time.sleep(0.2)
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid1, opacity_atom, xproto.Atom.CARDINAL, 32, 1, opacity_0).check()
|
||||
time.sleep(1)
|
||||
|
||||
print("Change from fading in to fading out")
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid1, opacity_atom, xproto.Atom.CARDINAL, 32, 1, opacity_80).check()
|
||||
time.sleep(0.5)
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid1, opacity_atom, xproto.Atom.CARDINAL, 32, 1, opacity_0).check()
|
||||
time.sleep(1)
|
||||
|
||||
print("Update opacity while fading in")
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid1, opacity_atom, xproto.Atom.CARDINAL, 32, 1, opacity_80).check()
|
||||
time.sleep(0.2)
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid1, opacity_atom, xproto.Atom.CARDINAL, 32, 1, opacity_100).check()
|
||||
time.sleep(1)
|
||||
|
||||
print("Change from fading out to fading in")
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid1, opacity_atom, xproto.Atom.CARDINAL, 32, 1, opacity_0).check()
|
||||
time.sleep(0.5)
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid1, opacity_atom, xproto.Atom.CARDINAL, 32, 1, opacity_80).check()
|
||||
time.sleep(1)
|
||||
|
||||
# Destroy the windows
|
||||
conn.core.DestroyWindowChecked(wid1).check()
|
||||
Executable
+34
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
from common import set_window_name, trigger_root_configure, prepare_root_configure
|
||||
|
||||
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 357 is triggered when a window is destroyed right after configure_root
|
||||
wid = conn.generate_id()
|
||||
print("Window 1: ", 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
|
||||
set_window_name(conn, wid, "Test window 1")
|
||||
|
||||
print("mapping 1")
|
||||
conn.core.MapWindowChecked(wid).check()
|
||||
time.sleep(0.5)
|
||||
|
||||
reply, mode, output = prepare_root_configure(conn)
|
||||
trigger_root_configure(conn, reply, mode, output).reply()
|
||||
|
||||
# Destroy the windows
|
||||
conn.core.DestroyWindowChecked(wid).check()
|
||||
|
||||
time.sleep(1)
|
||||
Executable
+35
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
from common import set_window_name, set_window_size_async
|
||||
|
||||
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 394 is caused by a window getting a size update just before destroying leading to a shadow update on destroyed window.
|
||||
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
|
||||
set_window_name(conn, wid, "Test Window")
|
||||
|
||||
# Map the window
|
||||
print("mapping")
|
||||
conn.core.MapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Resize the window and destroy
|
||||
print("resize and destroy")
|
||||
set_window_size_async(conn, wid, 150, 150)
|
||||
conn.core.DestroyWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
Executable
+40
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
from common import set_window_name
|
||||
|
||||
conn = xcffib.connect()
|
||||
setup = conn.get_setup()
|
||||
root = setup.roots[0].root
|
||||
visual = setup.roots[0].root_visual
|
||||
depth = setup.roots[0].root_depth
|
||||
x = xproto.xprotoExtension(conn)
|
||||
|
||||
# issue 465 is triggered when focusing a new window with a shadow-exclude rule for unfocused windows.
|
||||
wid1 = conn.generate_id()
|
||||
print("Window 1: ", hex(wid1))
|
||||
wid2 = conn.generate_id()
|
||||
print("Window 2: ", hex(wid2))
|
||||
|
||||
# Create a window
|
||||
conn.core.CreateWindowChecked(depth, wid1, root, 0, 0, 100, 100, 0, xproto.WindowClass.InputOutput, visual, 0, []).check()
|
||||
conn.core.CreateWindowChecked(depth, wid2, root, 0, 0, 100, 100, 0, xproto.WindowClass.InputOutput, visual, 0, []).check()
|
||||
|
||||
# Set Window name
|
||||
set_window_name(conn, wid1, "Test window 1")
|
||||
set_window_name(conn, wid2, "Test window 2")
|
||||
|
||||
print("mapping 1")
|
||||
conn.core.MapWindowChecked(wid1).check()
|
||||
print("mapping 2")
|
||||
conn.core.MapWindowChecked(wid2).check()
|
||||
time.sleep(0.5)
|
||||
|
||||
x.SetInputFocusChecked(0, wid1, xproto.Time.CurrentTime).check()
|
||||
time.sleep(0.5)
|
||||
|
||||
# Destroy the windows
|
||||
conn.core.DestroyWindowChecked(wid1).check()
|
||||
time.sleep(1)
|
||||
Executable
+36
@@ -0,0 +1,36 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
from common import set_window_name
|
||||
|
||||
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 525 happens when a window is unmapped with pixmap stale flag set
|
||||
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()
|
||||
|
||||
# Map the window
|
||||
print("mapping")
|
||||
conn.core.MapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# change window size, invalidate the pixmap
|
||||
conn.core.ConfigureWindow(wid, xproto.ConfigWindow.X | xproto.ConfigWindow.Width, [100, 200])
|
||||
|
||||
# unmap the window immediately after
|
||||
conn.core.UnmapWindowChecked(wid).check()
|
||||
|
||||
time.sleep(0.1)
|
||||
|
||||
# Destroy the window
|
||||
conn.core.DestroyWindowChecked(wid).check()
|
||||
@@ -0,0 +1,65 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import xcffib.xproto as xproto
|
||||
import xcffib
|
||||
import time
|
||||
from common import set_window_name
|
||||
|
||||
conn = xcffib.connect()
|
||||
setup = conn.get_setup()
|
||||
root = setup.roots[0].root
|
||||
visual = setup.roots[0].root_visual
|
||||
depth = setup.roots[0].root_depth
|
||||
|
||||
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
|
||||
|
||||
wid1 = conn.generate_id()
|
||||
print("Window 1 id is ", hex(wid1))
|
||||
|
||||
# Create a window
|
||||
conn.core.CreateWindowChecked(depth, wid1, root, 0, 0, 100, 100, 0, xproto.WindowClass.InputOutput, visual, 0, []).check()
|
||||
|
||||
# Map the window
|
||||
print("mapping 1")
|
||||
conn.core.MapWindowChecked(wid1).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
print("unmapping 1")
|
||||
# Unmap the window
|
||||
conn.core.UnmapWindowChecked(wid1).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# create and map a second window
|
||||
wid2 = conn.generate_id()
|
||||
print("Window 2 id is ", hex(wid2))
|
||||
conn.core.CreateWindowChecked(depth, wid2, root, 200, 0, 100, 100, 0, xproto.WindowClass.InputOutput, visual, 0, []).check()
|
||||
print("mapping 2")
|
||||
conn.core.MapWindowChecked(wid2).check()
|
||||
time.sleep(0.5)
|
||||
|
||||
# Set fullscreen property on the second window, causing screen to be unredirected
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid2, name_atom, atom_atom, 32, 1, [fs_atom]).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Unset fullscreen property on the second window, causing screen to be redirected
|
||||
conn.core.ChangePropertyChecked(xproto.PropMode.Replace, wid2, name_atom, atom_atom, 32, 0, []).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# map the first window again
|
||||
print("mapping 1")
|
||||
conn.core.MapWindowChecked(wid1).check()
|
||||
|
||||
time.sleep(0.5)
|
||||
|
||||
# Destroy the windows
|
||||
conn.core.DestroyWindowChecked(wid1).check()
|
||||
conn.core.DestroyWindowChecked(wid2).check()
|
||||
Reference in new issue
Block a user