mirror of
https://github.com/yshui/picom.git
synced 2025-07-31 22:01:56 -04:00
event, win: delayed handling of shape notify
Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
This commit is contained in:
parent
f476a78ad1
commit
e53ac7a6f9
4 changed files with 20 additions and 17 deletions
15
src/event.c
15
src/event.c
|
@ -653,19 +653,16 @@ static inline void ev_shape_notify(session_t *ps, xcb_shape_notify_event_t *ev)
|
||||||
* seemingly BadRegion errors would be triggered
|
* seemingly BadRegion errors would be triggered
|
||||||
* if we attempt to rebuild border_size
|
* if we attempt to rebuild border_size
|
||||||
*/
|
*/
|
||||||
// Mark the old border_size as damaged
|
// Mark the old bounding shape as damaged
|
||||||
|
if (!win_check_flags_any(w, WIN_FLAGS_SIZE_STALE | WIN_FLAGS_POSITION_STALE)) {
|
||||||
region_t tmp = win_get_bounding_shape_global_by_val(w);
|
region_t tmp = win_get_bounding_shape_global_by_val(w);
|
||||||
add_damage(ps, &tmp);
|
add_damage(ps, &tmp);
|
||||||
pixman_region32_fini(&tmp);
|
pixman_region32_fini(&tmp);
|
||||||
|
}
|
||||||
win_update_bounding_shape(ps, w);
|
|
||||||
|
|
||||||
// Mark the new border_size as damaged
|
|
||||||
tmp = win_get_bounding_shape_global_by_val(w);
|
|
||||||
add_damage(ps, &tmp);
|
|
||||||
pixman_region32_fini(&tmp);
|
|
||||||
|
|
||||||
w->reg_ignore_valid = false;
|
w->reg_ignore_valid = false;
|
||||||
|
|
||||||
|
win_set_flags(w, WIN_FLAGS_SIZE_STALE);
|
||||||
|
ps->pending_updates = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
|
|
@ -255,6 +255,9 @@ gen_by_val(win_get_region_frame_local);
|
||||||
void add_damage_from_win(session_t *ps, const struct managed_win *w) {
|
void add_damage_from_win(session_t *ps, const struct managed_win *w) {
|
||||||
// XXX there was a cached extents region, investigate
|
// XXX there was a cached extents region, investigate
|
||||||
// if that's better
|
// if that's better
|
||||||
|
|
||||||
|
// TODO(yshui) use the bounding shape when the window is shaped, otherwise the
|
||||||
|
// damage would be excessive
|
||||||
region_t extents;
|
region_t extents;
|
||||||
pixman_region32_init(&extents);
|
pixman_region32_init(&extents);
|
||||||
win_extents(w, &extents);
|
win_extents(w, &extents);
|
||||||
|
@ -1681,8 +1684,9 @@ gen_by_val(win_extents);
|
||||||
* Mark the window shape as updated
|
* Mark the window shape as updated
|
||||||
*/
|
*/
|
||||||
void win_update_bounding_shape(session_t *ps, struct managed_win *w) {
|
void win_update_bounding_shape(session_t *ps, struct managed_win *w) {
|
||||||
if (ps->shape_exists)
|
if (ps->shape_exists) {
|
||||||
w->bounding_shaped = win_bounding_shaped(ps, w->base.id);
|
w->bounding_shaped = win_bounding_shaped(ps, w->base.id);
|
||||||
|
}
|
||||||
|
|
||||||
pixman_region32_clear(&w->bounding_shape);
|
pixman_region32_clear(&w->bounding_shape);
|
||||||
// Start with the window rectangular region
|
// Start with the window rectangular region
|
||||||
|
@ -1700,8 +1704,9 @@ void win_update_bounding_shape(session_t *ps, struct managed_win *w) {
|
||||||
ps->c,
|
ps->c,
|
||||||
xcb_shape_get_rectangles(ps->c, w->base.id, XCB_SHAPE_SK_BOUNDING), NULL);
|
xcb_shape_get_rectangles(ps->c, w->base.id, XCB_SHAPE_SK_BOUNDING), NULL);
|
||||||
|
|
||||||
if (!r)
|
if (!r) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
xcb_rectangle_t *xrects = xcb_shape_get_rectangles_rectangles(r);
|
xcb_rectangle_t *xrects = xcb_shape_get_rectangles_rectangles(r);
|
||||||
int nrects = xcb_shape_get_rectangles_rectangles_length(r);
|
int nrects = xcb_shape_get_rectangles_rectangles_length(r);
|
||||||
|
|
|
@ -434,7 +434,7 @@ void win_set_property_stale(struct managed_win *w, xcb_atom_t prop);
|
||||||
/// Free all resources in a struct win
|
/// Free all resources in a struct win
|
||||||
void free_win_res(session_t *ps, struct managed_win *w);
|
void free_win_res(session_t *ps, struct managed_win *w);
|
||||||
|
|
||||||
static inline region_t win_get_bounding_shape_global_by_val(struct managed_win *w) {
|
static inline region_t attr_unused win_get_bounding_shape_global_by_val(struct managed_win *w) {
|
||||||
region_t ret;
|
region_t ret;
|
||||||
pixman_region32_init(&ret);
|
pixman_region32_init(&ret);
|
||||||
pixman_region32_copy(&ret, &w->bounding_shape);
|
pixman_region32_copy(&ret, &w->bounding_shape);
|
||||||
|
@ -446,7 +446,7 @@ static inline region_t win_get_bounding_shape_global_by_val(struct managed_win *
|
||||||
* Calculate the extents of the frame of the given window based on EWMH
|
* Calculate the extents of the frame of the given window based on EWMH
|
||||||
* _NET_FRAME_EXTENTS and the X window border width.
|
* _NET_FRAME_EXTENTS and the X window border width.
|
||||||
*/
|
*/
|
||||||
static inline margin_t attr_pure win_calc_frame_extents(const struct managed_win *w) {
|
static inline margin_t attr_pure attr_unused win_calc_frame_extents(const struct managed_win *w) {
|
||||||
margin_t result = w->frame_extents;
|
margin_t result = w->frame_extents;
|
||||||
result.top = max2(result.top, w->g.border_width);
|
result.top = max2(result.top, w->g.border_width);
|
||||||
result.left = max2(result.left, w->g.border_width);
|
result.left = max2(result.left, w->g.border_width);
|
||||||
|
@ -458,7 +458,7 @@ static inline margin_t attr_pure win_calc_frame_extents(const struct managed_win
|
||||||
/**
|
/**
|
||||||
* Check whether a window has WM frames.
|
* Check whether a window has WM frames.
|
||||||
*/
|
*/
|
||||||
static inline bool attr_pure win_has_frame(const struct managed_win *w) {
|
static inline bool attr_pure attr_unused win_has_frame(const struct managed_win *w) {
|
||||||
return w->g.border_width || w->frame_extents.top || w->frame_extents.left ||
|
return w->g.border_width || w->frame_extents.top || w->frame_extents.left ||
|
||||||
w->frame_extents.right || w->frame_extents.bottom;
|
w->frame_extents.right || w->frame_extents.bottom;
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,6 +87,7 @@ enum win_flags {
|
||||||
WIN_FLAGS_MAPPED = 64,
|
WIN_FLAGS_MAPPED = 64,
|
||||||
/// this window has properties which needs to be updated
|
/// this window has properties which needs to be updated
|
||||||
WIN_FLAGS_PROPERTY_STALE = 128,
|
WIN_FLAGS_PROPERTY_STALE = 128,
|
||||||
|
// TODO(yshui) _maybe_ split SIZE_STALE into SIZE_STALE and SHAPE_STALE
|
||||||
/// this window has an unhandled size/shape change
|
/// this window has an unhandled size/shape change
|
||||||
WIN_FLAGS_SIZE_STALE = 256,
|
WIN_FLAGS_SIZE_STALE = 256,
|
||||||
/// this window has an unhandled position (i.e. x and y) change
|
/// this window has an unhandled position (i.e. x and y) change
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue