summaryrefslogtreecommitdiff
path: root/lpevent.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2004-04-28 07:20:50 +0000
committerKeith Packard <keithp@keithp.com>2004-04-28 07:20:50 +0000
commitfe9660749e5c69ea3822ff9a8b6639fc99f12c21 (patch)
treed48bde0ab9a872be79254f85619cbb447da0e83c /lpevent.c
Initial revision
Diffstat (limited to 'lpevent.c')
-rw-r--r--lpevent.c114
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);
+ }
+}