diff options
author | Richard Grenville <[email protected]> | 2012-10-27 21:46:01 +0800 |
---|---|---|
committer | Richard Grenville <[email protected]> | 2012-10-27 21:52:26 +0800 |
commit | 00ce7d0de030b42958e80766534c9220d57873d3 (patch) | |
tree | d5b7557edd9e81426c415e71605b4e6c8241ccfb | |
parent | 399df7aef871f7db8ab3adbe3eee6b0f5af99989 (diff) | |
download | tdebase-00ce7d0de030b42958e80766534c9220d57873d3.tar.gz tdebase-00ce7d0de030b42958e80766534c9220d57873d3.zip |
Bug fix #57: Fix incorrect handling of InputOnly windows
- Stop rendering InputOnly windows. In the past I've misunderstood the
whole thing, I guess, sorry. Thanks to garfilth and funeral1988 for
reporting and providing valuable information.
- Fix a possible segfault in DDEBUG_EVENTS.
- Add "dbe" as a configuration file option.
- Attempt to slightly reduce the rendering delay after VSync in non-DBE
mode. I don't think, however, that this would be greatly helpful for
the tearing issue.
-rwxr-xr-x | compton.c | 19 |
1 files changed, 16 insertions, 3 deletions
@@ -784,6 +784,13 @@ win_match_once(win *w, const wincond *cond) { cond); #endif + if (InputOnly == w->a.class) { +#ifdef DEBUG_WINMATCH + printf(": InputOnly\n"); +#endif + return false; + } + // Determine the target target = NULL; switch (cond->target) { @@ -1710,6 +1717,10 @@ paint_all(Display *dpy, XserverRegion region, win *t) { XFixesDestroyRegion(dpy, reg_tmp); XFixesDestroyRegion(dpy, reg_tmp2); + // Do this as early as possible + if (!opts.dbe) + XFixesSetPictureClipRegion(dpy, tgt_buffer, 0, 0, None); + // Wait for VBlank vsync_wait(); @@ -1724,7 +1735,6 @@ paint_all(Display *dpy, XserverRegion region, win *t) { } // No-DBE painting mode else if (tgt_buffer != tgt_picture) { - XFixesSetPictureClipRegion(dpy, tgt_buffer, 0, 0, None); XRenderComposite( dpy, PictOpSrc, tgt_buffer, None, tgt_picture, 0, 0, 0, 0, @@ -1819,7 +1829,8 @@ map_win(Display *dpy, Window id, Bool override_redirect) { win *w = find_win(dpy, id); - if (!w) return; + // Don't care about window mapping if it's an InputOnly window + if (!w || InputOnly == w->a.class) return; reg_ignore_expire = True; @@ -3167,7 +3178,7 @@ ev_handle(XEvent *ev) { if (!w) w = find_toplevel(dpy, wid); - if (w->name) + if (w && w->name) window_name = w->name; else to_free = (Bool) wid_get_name(dpy, wid, &window_name); @@ -3686,6 +3697,8 @@ parse_config(char *cpath, struct options_tmp *pcfgtmp) { parse_vsync(sval); // --alpha-step config_lookup_float(&cfg, "alpha-step", &opts.alpha_step); + // --dbe + lcfg_lookup_bool(&cfg, "dbe", &opts.dbe); // --paint-on-overlay lcfg_lookup_bool(&cfg, "paint-on-overlay", &opts.paint_on_overlay); // --sw-opti |