/* * $Id$ * * Copyright © 2004 Keith Packard * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #include "lpint.h" static Bool is_root (Display *dpy, Window window) { int s; for (s = 0; s < ScreenCount (dpy); s++) if (window == RootWindow (dpy, s)) return True; return False; } Bool _xlightpipe_init_window (Display *display, Window window, light_pipe_window *lpw) { XWindowAttributes attr; light_pipe_display *lpd = _xlightpipe_find_display (display); int level; if (!lpd) return False; lpw->display = display; lpw->window = window; XSelectInput (display, window, LP_WINDOW_EVENT_MASK); if (!XGetWindowAttributes (display, window, &attr)) return False; lpw->public.geometry.x = attr.x; lpw->public.geometry.y = attr.y; lpw->public.geometry.width = attr.width; lpw->public.geometry.height = attr.height; lpw->public.border_width = attr.border_width; lpw->public.damage.x = 0; lpw->public.damage.y = 0; lpw->public.damage.width = 0; lpw->public.damage.height = 0; lpw->public.image = 0; lpw->display = display; lpw->window = window; lpw->visual = attr.visual; lpw->depth = attr.depth; if (lpw->public.damage_region) level = XDamageReportDeltaRectangles; else level = XDamageReportBoundingBox; lpw->damage = XDamageCreate (display, window, level); lpw->repair = XFixesCreateRegion (display, 0, 0); /* * Ensure that the window contents are available even when occluded */ if (!is_root (display, window)) XCompositeRedirectWindow (display, window, CompositeRedirectAutomatic); lpw->next_damaged = 0; if (!_xlightpipe_create_window_image (lpw)) { XSelectInput (display, window, 0); return False; } if (attr.map_state == IsViewable) _xlightpipe_damage_window (lpw, 0, 0, attr.width, attr.height); return True; } void _xlightpipe_fini_window (Display *display, Window window, light_pipe_window *lpw) { XSelectInput (display, window, 0); _xlightpipe_undamage_window (lpw); if (!is_root (display, window)) XCompositeUnredirectWindow (display, window, CompositeRedirectAutomatic); XDamageDestroy (display, lpw->damage); _xlightpipe_destroy_window_image (lpw); }