summaryrefslogtreecommitdiff
path: root/xc/programs/Xserver/hw/sunAmoeba/sunAmIo.c
diff options
context:
space:
mode:
Diffstat (limited to 'xc/programs/Xserver/hw/sunAmoeba/sunAmIo.c')
-rw-r--r--xc/programs/Xserver/hw/sunAmoeba/sunAmIo.c175
1 files changed, 175 insertions, 0 deletions
diff --git a/xc/programs/Xserver/hw/sunAmoeba/sunAmIo.c b/xc/programs/Xserver/hw/sunAmoeba/sunAmIo.c
new file mode 100644
index 000000000..6624d6ff9
--- /dev/null
+++ b/xc/programs/Xserver/hw/sunAmoeba/sunAmIo.c
@@ -0,0 +1,175 @@
+/* $XConsortium: sunAmIo.c,v 1.1 94/04/01 17:54:49 dpw Exp $ */
+/*-
+ * sunAmIo.c --
+ * Amoeba implementation of functions to handle input from
+ * the keyboard and mouse.
+ *
+ * Copyright (c) 1994 by the Vrije Universiteit, Amsterdam
+ * Copyright (c) 1994 by the Regents of the University of California
+ *
+ * Permission to use, copy, modify, and distribute this
+ * software and its documentation for any purpose and without
+ * fee is hereby granted, provided that the above copyright
+ * notice appear in all copies. The Vrije Universiteit and
+ * the University of California make no representations about
+ * the suitability of this software for any purpose.
+ * It is provided "as is" without express or implied warranty.
+ */
+
+#define NEED_EVENTS
+#include "sun.h"
+
+#include "amoeba.h"
+#include "server/iop/iop.h"
+
+static int lastEventTime;
+
+int
+TimeSinceLastInputEvent()
+{
+ /* Return the time in milliseconds since there last was any input */
+ register long now;
+
+ now = GetTimeInMillis();
+ if (lastEventTime == 0)
+ lastEventTime = now;
+ return (now - lastEventTime);
+}
+
+void
+SetTimeSinceLastInputEvent()
+{
+ lastEventTime = GetTimeInMillis();
+}
+
+/*-
+ *-----------------------------------------------------------------------
+ * ProcessInputEvents --
+ * Retrieve all waiting input events and pass them to DIX in their
+ * correct chronological order. Only reads from the system pointer
+ * and keyboard.
+ *
+ * Results:
+ * None.
+ *
+ * Side Effects:
+ * Events are passed to the DIX layer.
+ *
+ *-----------------------------------------------------------------------
+ */
+void
+ProcessInputEvents ()
+{
+ DevicePtr pPointer;
+ DevicePtr pKeyboard;
+ register sunPtrPrivPtr ptrPriv;
+ register sunKbdPrivPtr kbdPriv;
+ int i;
+ register IOPEvent *e, *elast;
+ IOPEvent events[MAXEVENTS];
+ xEvent x;
+ static int firsttime = TRUE;
+
+ pPointer = LookupPointerDevice();
+ pKeyboard = LookupKeyboardDevice();
+ ptrPriv = (sunPtrPrivPtr)pPointer->devicePrivate;
+ kbdPriv = (sunKbdPrivPtr)pKeyboard->devicePrivate;
+
+ while ((i = AmoebaGetEvents(events, MAXEVENTS)) > 0) {
+ for (e = &events[0], elast = &events[i]; e < elast; e++) {
+ x.u.keyButtonPointer.time = lastEventTime = e->time;
+ switch (e->type) {
+ case EV_PointerDelta:
+ x.u.u.type = MotionNotify;
+ x.u.keyButtonPointer.rootX = e->x;
+ x.u.keyButtonPointer.rootY = e->y;
+ sunMouseProcessEvent(pPointer, &x);
+ break;
+ case EV_ButtonPress:
+ x.u.u.type = ButtonPress;
+ x.u.u.detail = e->keyorbut;
+ sunMouseProcessEvent(pPointer, &x);
+ break;
+ case EV_ButtonRelease:
+ x.u.u.type = ButtonRelease;
+ x.u.u.detail = e->keyorbut;
+ sunMouseProcessEvent(pPointer, &x);
+ break;
+ case EV_KeyPressEvent:
+ /* device dependent code goes here */
+ x.u.u.type = KeyPress;
+ x.u.u.detail = e->keyorbut;
+ sunKbdProcessEvent(pKeyboard, &x);
+ break;
+ case EV_KeyReleaseEvent:
+ x.u.u.type = KeyRelease;
+ x.u.u.detail = e->keyorbut;
+ sunKbdProcessEvent(pKeyboard, &x);
+ /* device dependent code goes here */
+ break;
+ default:
+ /* this shouldn't happen */
+ ErrorF("stray event %d (%d,%d) %x\n",
+ e->type, e->x, e->y, e->keyorbut);
+ break;
+ }
+ }
+
+ sunMouseDoneEvents(pPointer, TRUE);
+ }
+
+ mieqProcessInputEvents();
+ miPointerUpdate();
+}
+
+/*
+ * DDX - specific abort routine. Called by AbortServer().
+ */
+void AbortDDX()
+{
+ int i;
+ ScreenPtr pScreen;
+
+ for (i = 0; i < screenInfo.numScreens; i++)
+ {
+ pScreen = screenInfo.screens[i];
+ (*pScreen->SaveScreen) (pScreen, SCREEN_SAVER_OFF);
+ sunDisableCursor (pScreen);
+ }
+}
+
+/* Called by GiveUp(). */
+void
+ddxGiveUp()
+{
+ AbortDDX ();
+}
+
+void
+ddxUseMsg()
+{
+ ErrorF("-swapLkeys swap keysyms on L1..L10\n");
+ ErrorF("-mono force monochrome-only screen\n");
+ ErrorF("-flipPixels flip black and white pixels\n");
+}
+
+int
+ddxProcessArgument (argc, argv, i)
+ int argc;
+ char *argv[];
+ int i;
+{
+ if (strcmp (argv[i], "-swapLkeys") == 0) { /* -swapLkeys */
+ sunSwapLkeys = TRUE;
+ return 1;
+ }
+ if (strcmp (argv[i], "-mono") == 0) { /* -mono */
+ return 1;
+ }
+ if (strcmp (argv[i], "-flipPixels") == 0) { /* -flipPixels */
+ sunFlipPixels = TRUE;
+ return 1;
+ }
+ return 0;
+}
+