diff options
author | Keith Packard <keithp@keithp.com> | 2004-04-28 07:20:50 +0000 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2004-04-28 07:20:50 +0000 |
commit | fe9660749e5c69ea3822ff9a8b6639fc99f12c21 (patch) | |
tree | d48bde0ab9a872be79254f85619cbb447da0e83c /lpevent.c |
Initial revision
Diffstat (limited to 'lpevent.c')
-rw-r--r-- | lpevent.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/lpevent.c b/lpevent.c new file mode 100644 index 0000000..334fe98 --- /dev/null +++ b/lpevent.c @@ -0,0 +1,114 @@ +/* + * $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) +{ + remove_window (event->display, event->window); +} + +static void +process_configure_notify (XConfigureEvent *event) +{ + light_pipe_window *lpw = 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; + destroy_window_image (lpw); + create_window_image (lpw); + 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 = find_window (event->display, event->drawable); + + if (!lpw) + return; + 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 = 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 +await_event (Display *display) +{ + XEvent event; + + XPeekEvent (display, &event); + return True; +} + +void +process_events (Display *display) +{ + while (XPending (display)) + { + XEvent event; + + XNextEvent (display, &event); + process_event (&event); + } +} |