summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2000-09-26 04:31:23 +0000
committerKeith Packard <keithp@keithp.com>2000-09-26 04:31:23 +0000
commit94368c3b92b8513d5135fb3c20165f108b0e96fd (patch)
treee0332d7abceb17a9ed7a5f3ef808799e270cbc57
parent03e3689701007ea40422b4d729b65aaebcd84869 (diff)
kdrive: Add iPAQ and Touch screen support
-rw-r--r--hw/kdrive/fbdev/fbdev.c8
-rw-r--r--hw/kdrive/fbdev/fbinit.c5
-rw-r--r--hw/kdrive/linux/Imakefile11
-rw-r--r--hw/kdrive/linux/ts.c104
-rw-r--r--hw/kdrive/src/kdrive.h18
-rw-r--r--hw/kdrive/src/kinput.c117
-rw-r--r--hw/kdrive/src/kkeymap.h11
7 files changed, 233 insertions, 41 deletions
diff --git a/hw/kdrive/fbdev/fbdev.c b/hw/kdrive/fbdev/fbdev.c
index a63e69736..7748b798f 100644
--- a/hw/kdrive/fbdev/fbdev.c
+++ b/hw/kdrive/fbdev/fbdev.c
@@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.c,v 1.6 2000/09/15 07:25:12 keithp Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbdev.c,v 1.7 2000/09/22 06:25:08 keithp Exp $ */
#include "fbdev.h"
@@ -382,7 +382,11 @@ fbdevDPMS (ScreenPtr pScreen, int mode)
FbdevPriv *priv = pScreenPriv->card->driver;
#ifdef FBIOPUT_POWERMODE
- if (!ioctl (priv->fd, FBIOPUT_POWERMODE, &mode))
+ if (ioctl (priv->fd, FBIOPUT_POWERMODE, &mode) >= 0)
+ return TRUE;
+#endif
+#ifdef FBIOBLANK
+ if (ioctl (priv->fd, FBIOBLANK, mode ? mode + 1 : 0) >= 0)
return TRUE;
#endif
return FALSE;
diff --git a/hw/kdrive/fbdev/fbinit.c b/hw/kdrive/fbdev/fbinit.c
index 26380e233..68926944a 100644
--- a/hw/kdrive/fbdev/fbinit.c
+++ b/hw/kdrive/fbdev/fbinit.c
@@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbinit.c,v 1.2 1999/12/30 03:03:08 robin Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/kdrive/fbdev/fbinit.c,v 1.4 2000/09/22 06:25:08 keithp Exp $ */
#include <fbdev.h>
@@ -75,6 +75,9 @@ InitInput (int argc, char **argv)
#else
KdInitInput (&Ps2MouseFuncs, &LinuxKeyboardFuncs);
#endif
+#ifdef TOUCHSCREEN
+ kdInitTouchScreen (&TsFuncs);
+#endif
}
int
diff --git a/hw/kdrive/linux/Imakefile b/hw/kdrive/linux/Imakefile
index f7f0879ea..ed7b89e56 100644
--- a/hw/kdrive/linux/Imakefile
+++ b/hw/kdrive/linux/Imakefile
@@ -1,11 +1,16 @@
XCOMM $XConsortium: Imakefile /main/10 1996/12/02 10:20:33 lehors $
-XCOMM $XFree86: $
+XCOMM $XFree86: xc/programs/Xserver/hw/kdrive/linux/Imakefile,v 1.3 2000/09/22 06:25:09 keithp Exp $
KDRIVE=..
#include "../Kdrive.tmpl"
-SRCS = keyboard.c linux.c ps2.c bus.c
+#if TouchScreen
+TSSRCS = ts.c
+TSOBJS = ts.o
+#endif
-OBJS = keyboard.o linux.o ps2.o bus.o
+SRCS = keyboard.c linux.c ps2.c bus.c $(TSSRCS)
+
+OBJS = keyboard.o linux.o ps2.o bus.o $(TSOBJS)
INCLUDES = -I. $(KDINCS)
diff --git a/hw/kdrive/linux/ts.c b/hw/kdrive/linux/ts.c
new file mode 100644
index 000000000..44dae6da3
--- /dev/null
+++ b/hw/kdrive/linux/ts.c
@@ -0,0 +1,104 @@
+/*
+ * Id: ts.c,v 1.1 1999/11/02 03:54:46 keithp Exp $
+ *
+ * Derived from ps2.c by Jim Gettys
+ *
+ * Copyright © 1999 Keith Packard
+ * Copyright © 2000 Compaq Computer Corporation
+ *
+ * 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 or Compaq not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. Keith Packard and Compaq makes no
+ * representations about the suitability of this software for any purpose. It
+ * is provided "as is" without express or implied warranty.
+ *
+ * KEITH PACKARD AND COMPAQ DISCLAIM 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.
+ */
+
+#define NEED_EVENTS
+#include "X.h"
+#include "Xproto.h"
+#include "inputstr.h"
+#include "scrnintstr.h"
+#include "kdrive.h"
+#include "Xpoll.h"
+#include <sys/ioctl.h>
+#include <linux/h3600_ts.h> /* touch screen events */
+
+void
+TsRead (int tsPort)
+{
+ TS_EVENT event;
+ long buf[3];
+ int n;
+ long pressure;
+ long x, y;
+ unsigned long flags;
+ unsigned long buttons;
+
+ n = Ps2ReadBytes (tsPort, (char *) &event,
+ sizeof (event), sizeof (event));
+ if (n == sizeof (event))
+ {
+ if (event.pressure)
+ {
+ flags = KD_BUTTON_1;
+ x = event.x;
+ y = event.y;
+ }
+ else {
+ flags = KD_MOUSE_DELTA;
+ x = 0;
+ y = 0;
+ }
+ KdEnqueueMouseEvent (flags, x, y);
+ }
+}
+
+
+char *TsNames[] = {
+ "/dev/ts",
+ "/dev/h3600_ts" /* temporary name; note this code can try
+ to open more than one device */
+};
+
+#define NUM_TS_NAMES (sizeof (TsNames) / sizeof (TsNames[0]))
+
+int
+TsInit (void)
+{
+ int i;
+ int TsPort;
+
+ for (i = 0; i < NUM_TS_NAMES; i++)
+ {
+ TsPort = open (TsNames[i], 0);
+ if (TsPort >= 0)
+ return TsPort;
+ }
+ perror("Touch screen not found.\n");
+ exit (1);
+}
+
+void
+TsFini (int tsPort)
+{
+ if (tsPort >= 0)
+ close (tsPort);
+}
+
+KdTsFuncs TsFuncs = {
+ TsInit,
+ TsRead,
+ TsFini
+};
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index 04013ade6..7b0b70cdf 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.h,v 1.6 2000/08/26 00:24:38 keithp Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.h,v 1.8 2000/09/22 06:25:29 keithp Exp $ */
#include <stdio.h>
#include "X.h"
@@ -167,6 +167,14 @@ typedef struct _KdMouseFuncs {
void (*Fini) (int);
} KdMouseFuncs;
+#ifdef TOUCHSCREEN
+typedef struct _KdTsFuncs {
+ int (*Init) (void);
+ void (*Read) (int);
+ void (*Fini) (int);
+} KdTsFuncs;
+#endif
+
typedef struct _KdKeyboardFuncs {
void (*Load) (void);
int (*Init) (void);
@@ -491,6 +499,11 @@ KdScreenInfoDispose (KdScreenInfo *si);
void
KdInitInput(KdMouseFuncs *, KdKeyboardFuncs *);
+#ifdef TOUCHSCREEN
+void
+KdInitTouchScreen(KdTsFuncs *pTsFuncs);
+#endif
+
void
KdEnqueueKeyboardEvent(unsigned char scan_code,
unsigned char is_up);
@@ -538,6 +551,9 @@ ProcessInputEvents ();
extern KdMouseFuncs Ps2MouseFuncs;
extern KdMouseFuncs BusMouseFuncs;
+#ifdef TOUCHSCREEN
+extern KdTsFuncs TsFuncs;
+#endif
extern KdKeyboardFuncs LinuxKeyboardFuncs;
extern KdOsFuncs LinuxFuncs;
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 82bcc747c..dd1b9a38e 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -26,7 +26,9 @@
#include "kdrive.h"
#include "inputstr.h"
+#define XK_PUBLISHING
#include <X11/keysym.h>
+#include <X11/XF86keysym.h>
#include "kkeymap.h"
#include <signal.h>
#include <stdio.h>
@@ -48,6 +50,11 @@ static KdMouseMatrix kdMouseMatrix = {
0, 1, 0
};
+#ifdef TOUCHSCREEN
+static KdTsFuncs *kdTsFuncs;
+static int kdTsFd = -1;
+#endif
+
int kdMinScanCode;
int kdMaxScanCode;
int kdMinKeyCode;
@@ -72,6 +79,10 @@ CARD8 kdKeyState[KD_KEY_COUNT/8];
void
KdSigio (int sig)
{
+#ifdef TOUCHSCREEN
+ if (kdTsFd >= 0)
+ (*kdTsFuncs->Read) (kdTsFd);
+#endif
if (kdMouseFd >= 0)
(*kdMouseFuncs->Read) (kdMouseFd);
if (kdKeyboardFd >= 0)
@@ -173,6 +184,10 @@ KdRemoveFd (int fd)
void
KdDisableInput (void)
{
+#ifdef TOUCHSCREEN
+ if (kdTsFd >= 0)
+ KdRemoveFd (kdTsFd);
+#endif
if (kdMouseFd >= 0)
KdRemoveFd (kdMouseFd);
if (kdKeyboardFd >= 0)
@@ -186,6 +201,10 @@ KdEnableInput (void)
xEvent xE;
kdInputEnabled = TRUE;
+#ifdef TOUCHSCREEN
+ if (kdTsFd >= 0)
+ KdAddFd (kdTsFd);
+#endif
if (kdMouseFd >= 0)
KdAddFd (kdMouseFd);
if (kdKeyboardFd >= 0)
@@ -225,6 +244,14 @@ KdMouseProc(DeviceIntPtr pDevice, int onoff)
if (kdMouseFd >= 0 && kdInputEnabled)
KdAddFd (kdMouseFd);
}
+#ifdef TOUCHSCREEN
+ if (kdTsFuncs)
+ {
+ kdTsFd = (*kdTsFuncs->Init) ();
+ if (kdTsFd >= 0 && kdInputEnabled)
+ KdAddFd (kdTsFd);
+ }
+#endif
break;
case DEVICE_OFF:
case DEVICE_CLOSE:
@@ -239,6 +266,15 @@ KdMouseProc(DeviceIntPtr pDevice, int onoff)
(*kdMouseFuncs->Fini) (kdMouseFd);
kdMouseFd = -1;
}
+#ifdef TOUCHSCREEN
+ if (kdTsFd >= 0)
+ {
+ if (kdInputEnabled)
+ KdRemoveFd (kdTsFd);
+ (*kdTsFuncs->Fini) (kdTsFd);
+ kdTsFd = -1;
+ }
+#endif
}
break;
}
@@ -364,6 +400,35 @@ KdInitAutoRepeats (void)
}
}
+const KdKeySymModsRec kdKeySymMods[] = {
+ XK_Control_L, ControlMask,
+ XK_Control_R, ControlMask,
+ XK_Shift_L, ShiftMask,
+ XK_Shift_R, ShiftMask,
+ XK_Caps_Lock, LockMask,
+ XK_Shift_Lock, LockMask,
+ XK_Alt_L, Mod1Mask,
+ XK_Alt_R, Mod1Mask,
+ XK_Meta_L, Mod1Mask,
+ XK_Meta_R, Mod1Mask,
+ XK_Num_Lock, Mod2Mask,
+ XK_Super_L, Mod3Mask,
+ XK_Super_R, Mod3Mask,
+ XK_Hyper_L, Mod3Mask,
+ XK_Hyper_R, Mod3Mask,
+ XK_Mode_switch, Mod4Mask,
+#ifdef TOUCHSCREEN
+ /* iPAQ specific hacks */
+ XF86XK_Start, ControlMask,
+ XK_Menu, ShiftMask,
+ XF86XK_Calendar, LockMask,
+ XK_telephone, Mod1Mask,
+ XF86XK_AudioRecord, Mod2Mask,
+#endif
+};
+
+#define NUM_SYM_MODS (sizeof(kdKeySymMods) / sizeof(kdKeySymMods[0]))
+
static void
KdInitModMap (void)
{
@@ -371,6 +436,7 @@ KdInitModMap (void)
int row;
int width;
KeySym *syms;
+ int i;
width = kdKeySyms.mapWidth;
for (key_code = kdMinKeyCode; key_code <= kdMaxKeyCode; key_code++)
@@ -379,37 +445,10 @@ KdInitModMap (void)
syms = kdKeymap + (key_code - kdMinKeyCode) * width;
for (row = 0; row < width; row++, syms++)
{
- switch (*syms) {
- case XK_Control_L:
- case XK_Control_R:
- kdModMap[key_code] |= ControlMask;
- break;
- case XK_Shift_L:
- case XK_Shift_R:
- kdModMap[key_code] |= ShiftMask;
- break;
- case XK_Caps_Lock:
- case XK_Shift_Lock:
- kdModMap[key_code] |= LockMask;
- break;
- case XK_Alt_L:
- case XK_Alt_R:
- case XK_Meta_L:
- case XK_Meta_R:
- kdModMap[key_code] |= Mod1Mask;
- break;
- case XK_Num_Lock:
- kdModMap[key_code] |= Mod2Mask;
- break;
- case XK_Super_L:
- case XK_Super_R:
- case XK_Hyper_L:
- case XK_Hyper_R:
- kdModMap[key_code] |= Mod3Mask;
- break;
- case XK_Mode_switch:
- kdModMap[key_code] |= Mod4Mask;
- break;
+ for (i = 0; i < NUM_SYM_MODS; i++)
+ {
+ if (*syms == kdKeySymMods[i].modsym)
+ kdModMap[key_code] |= kdKeySymMods[i].modbit;
}
}
}
@@ -454,6 +493,14 @@ KdInitInput(KdMouseFuncs *pMouseFuncs,
#endif
}
+#ifdef TOUCHSCREEN
+void
+KdInitTouchScreen(KdTsFuncs *pTsFuncs)
+{
+ kdTsFuncs = pTsFuncs;
+}
+#endif
+
/*
* Middle button emulation state machine
*
@@ -1287,6 +1334,14 @@ KdWakeupHandler (int screen,
(*kdMouseFuncs->Read) (kdMouseFd);
KdUnblockSigio ();
}
+#ifdef TOUCHSCREEN
+ if (kdTsFd >= 0 && FD_ISSET (kdTsFd, pReadmask))
+ {
+ KdBlockSigio ();
+ (*kdTsFuncs->Read) (kdTsFd);
+ KdUnblockSigio ();
+ }
+#endif
if (kdKeyboardFd >= 0 && FD_ISSET (kdKeyboardFd, pReadmask))
{
KdBlockSigio ();
diff --git a/hw/kdrive/src/kkeymap.h b/hw/kdrive/src/kkeymap.h
index 293fb4a81..51ab2b6a6 100644
--- a/hw/kdrive/src/kkeymap.h
+++ b/hw/kdrive/src/kkeymap.h
@@ -27,8 +27,8 @@
* live in this header file.
*/
-#ifndef _KDKEYMP_H
-#define _KDKEYMP_H
+#ifndef _KKEYMAP_H
+#define _KKEYMAP_H
/* Offset of MIN_SCANCODE to 8 (X minimum scancode value) */
#define KD_KEY_OFFSET (8 - kdMinScanCode)
@@ -50,4 +50,9 @@ extern CARD8 kdModMap[MAP_LENGTH];
extern KeySymsRec kdKeySyms;
-#endif /* _WINKEYMP_H */
+typedef struct {
+ KeySym modsym;
+ int modbit;
+} KdKeySymModsRec;
+
+#endif /* _KKEYMAP_H */