/* * $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 void process_destroy_notify (XDestroyWindowEvent *event) { _xlightpipe_remove_window (event->display, event->window); } static void process_configure_notify (XConfigureEvent *event) { light_pipe_window *lpw = _xlightpipe_find_window (event->display, event->window); if (!lpw) return; if (event->width != lpw->public.geometry.width || event->height != lpw->public.geometry.height) { lpw->public.geometry.width = event->width; lpw->public.geometry.height = event->height; _xlightpipe_destroy_window_image (lpw); _xlightpipe_create_window_image (lpw); _xlightpipe_damage_window (lpw, 0, 0, event->width, event->height); } lpw->public.geometry.x = event->x; lpw->public.geometry.y = event->y; lpw->public.border_width = event->border_width; } static void process_damage_notify (XDamageNotifyEvent *event) { light_pipe_window *lpw = _xlightpipe_find_window (event->display, event->drawable); if (!lpw) return; _xlightpipe_damage_window (lpw, event->area.x, event->area.y, event->area.width, event->area.height); } static void process_event (XEvent *event) { Display *display = event->xany.display; light_pipe_display *lpd = _xlightpipe_find_display (display); if (!lpd) return; switch (event->type) { case DestroyNotify: process_destroy_notify ((XDestroyWindowEvent *) event); return; case ConfigureNotify: process_configure_notify ((XConfigureEvent *) event); return; default: break; } switch (event->type - lpd->damage.event_base) { case XDamageNotify: process_damage_notify ((XDamageNotifyEvent *) event); return; default: break; } } Bool _xlightpipe_await_event (Display *display) { XEvent event; XPeekEvent (display, &event); return True; } void _xlightpipe_process_events (Display *display) { while (XPending (display)) { XEvent event; XNextEvent (display, &event); process_event (&event); } }