mirror of
https://github.com/yshui/picom.git
synced 2024-11-11 13:51:02 -05:00
event: fix dumb bug in repair_win
Basically we won't call xcb_damage_subtract if show_all_xerrors is set, which is very bad. Fixes that, and also make sure the damage subtract request is flushed in all branches. (cherry picked from commita5826b6fb0
) Fixes:1307d9ec70
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
parent
de9724f814
commit
41f9a5816c
1 changed files with 18 additions and 6 deletions
24
src/event.c
24
src/event.c
|
@ -585,16 +585,28 @@ static inline void repair_win(session_t *ps, struct managed_win *w) {
|
||||||
region_t parts;
|
region_t parts;
|
||||||
pixman_region32_init(&parts);
|
pixman_region32_init(&parts);
|
||||||
|
|
||||||
|
// If this is the first time this window is damaged, we would redraw the
|
||||||
|
// whole window, so we don't need to fetch the damage region. But we still need
|
||||||
|
// to make sure the X server receives the DamageSubtract request, hence the
|
||||||
|
// `xcb_request_check` here.
|
||||||
|
// Otherwise, we fetch the damage regions. That means we will receive a reply
|
||||||
|
// from the X server, which implies it has received our request.
|
||||||
if (!w->ever_damaged) {
|
if (!w->ever_damaged) {
|
||||||
win_extents(w, &parts);
|
auto e = xcb_request_check(
|
||||||
if (!ps->o.show_all_xerrors) {
|
ps->c.c, xcb_damage_subtract(ps->c.c, w->damage, XCB_NONE, XCB_NONE));
|
||||||
set_ignore_cookie(&ps->c, xcb_damage_subtract(ps->c.c, w->damage,
|
if (e) {
|
||||||
XCB_NONE, XCB_NONE));
|
if (ps->o.show_all_xerrors) {
|
||||||
|
x_print_error(e->sequence, e->major_code, e->minor_code,
|
||||||
|
e->error_code);
|
||||||
}
|
}
|
||||||
|
free(e);
|
||||||
|
}
|
||||||
|
win_extents(w, &parts);
|
||||||
} else {
|
} else {
|
||||||
|
auto cookie =
|
||||||
|
xcb_damage_subtract(ps->c.c, w->damage, XCB_NONE, ps->damaged_region);
|
||||||
if (!ps->o.show_all_xerrors) {
|
if (!ps->o.show_all_xerrors) {
|
||||||
set_ignore_cookie(&ps->c, xcb_damage_subtract(ps->c.c, w->damage, XCB_NONE,
|
set_ignore_cookie(&ps->c, cookie);
|
||||||
ps->damaged_region));
|
|
||||||
}
|
}
|
||||||
x_fetch_region(&ps->c, ps->damaged_region, &parts);
|
x_fetch_region(&ps->c, ps->damaged_region, &parts);
|
||||||
pixman_region32_translate(&parts, w->g.x + w->g.border_width,
|
pixman_region32_translate(&parts, w->g.x + w->g.border_width,
|
||||||
|
|
Loading…
Reference in a new issue