Fix xcb error ignoring
The existing mechanism with set_ignore_next() is (IMHO) ugly and also does not work with XCB requests. This commit adds a new function set_ignore_cookie() and fixes callers that were converted to XCB to use this new function instead. Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
parent
00ae9718ee
commit
aa8cb217c8
|
@ -1995,6 +1995,14 @@ set_ignore_next(session_t *ps) {
|
||||||
set_ignore(ps, NextRequest(ps->dpy));
|
set_ignore(ps, NextRequest(ps->dpy));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ignore X errors caused by given X request.
|
||||||
|
*/
|
||||||
|
static inline void
|
||||||
|
set_ignore_cookie(session_t *ps, xcb_void_cookie_t cookie) {
|
||||||
|
set_ignore(ps, cookie.sequence);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if a window is a fullscreen window.
|
* Check if a window is a fullscreen window.
|
||||||
*
|
*
|
||||||
|
|
|
@ -1445,9 +1445,9 @@ win_paint_win(session_t *ps, win *w, XserverRegion reg_paint,
|
||||||
|
|
||||||
// Fetch Pixmap
|
// Fetch Pixmap
|
||||||
if (!w->paint.pixmap && ps->has_name_pixmap) {
|
if (!w->paint.pixmap && ps->has_name_pixmap) {
|
||||||
set_ignore_next(ps);
|
|
||||||
w->paint.pixmap = xcb_generate_id(c);
|
w->paint.pixmap = xcb_generate_id(c);
|
||||||
xcb_composite_name_window_pixmap(c, w->id, w->paint.pixmap);
|
set_ignore_cookie(ps,
|
||||||
|
xcb_composite_name_window_pixmap(c, w->id, w->paint.pixmap));
|
||||||
if (w->paint.pixmap)
|
if (w->paint.pixmap)
|
||||||
free_fence(ps, &w->fence);
|
free_fence(ps, &w->fence);
|
||||||
}
|
}
|
||||||
|
@ -1997,12 +1997,12 @@ repair_win(session_t *ps, win *w) {
|
||||||
|
|
||||||
if (!w->ever_damaged) {
|
if (!w->ever_damaged) {
|
||||||
parts = win_extents(ps, w);
|
parts = win_extents(ps, w);
|
||||||
set_ignore_next(ps);
|
set_ignore_cookie(ps,
|
||||||
xcb_damage_subtract(c, w->damage, XCB_NONE, XCB_NONE);
|
xcb_damage_subtract(c, w->damage, XCB_NONE, XCB_NONE));
|
||||||
} else {
|
} else {
|
||||||
parts = XFixesCreateRegion(ps->dpy, 0, 0);
|
parts = XFixesCreateRegion(ps->dpy, 0, 0);
|
||||||
set_ignore_next(ps);
|
set_ignore_cookie(ps,
|
||||||
xcb_damage_subtract(c, w->damage, XCB_NONE, parts);
|
xcb_damage_subtract(c, w->damage, XCB_NONE, parts));
|
||||||
XFixesTranslateRegion(ps->dpy, parts,
|
XFixesTranslateRegion(ps->dpy, parts,
|
||||||
w->g.x + w->g.border_width,
|
w->g.x + w->g.border_width,
|
||||||
w->g.y + w->g.border_width);
|
w->g.y + w->g.border_width);
|
||||||
|
|
|
@ -164,8 +164,8 @@ inline static void
|
||||||
free_damage(session_t *ps, xcb_damage_damage_t *p) {
|
free_damage(session_t *ps, xcb_damage_damage_t *p) {
|
||||||
if (*p) {
|
if (*p) {
|
||||||
// BadDamage will be thrown if the window is destroyed
|
// BadDamage will be thrown if the window is destroyed
|
||||||
set_ignore_next(ps);
|
set_ignore_cookie(ps,
|
||||||
xcb_damage_destroy(XGetXCBConnection(ps->dpy), *p);
|
xcb_damage_destroy(XGetXCBConnection(ps->dpy), *p));
|
||||||
*p = None;
|
*p = None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue