From a668b6c11a2d6b4800407ad918481d90be87a732 Mon Sep 17 00:00:00 2001 From: Matthew Allum Date: Thu, 23 Jun 2005 16:34:07 +0000 Subject: [PATCH] redo tslib --- hw/kdrive/linux/tslib.c | 243 ++++++++++++++++++++-------------------- 1 file changed, 124 insertions(+), 119 deletions(-) diff --git a/hw/kdrive/linux/tslib.c b/hw/kdrive/linux/tslib.c index eafba56b0..1addffdb4 100644 --- a/hw/kdrive/linux/tslib.c +++ b/hw/kdrive/linux/tslib.c @@ -7,6 +7,7 @@ * Copyright © 1999 Keith Packard * Copyright © 2000 Compaq Computer Corporation * Copyright © 2002 MontaVista Software Inc. + * Copyright © 2005 OpenedHand Ltd. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -43,6 +44,24 @@ * 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. + * + * 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 Matthew Allum or OpenedHand not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Matthew Allum and OpenedHand make no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * MATTHEW ALLUM AND OPENEDHAND DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, + * IN NO EVENT SHALL EITHER 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. */ @@ -59,79 +78,65 @@ #include #include -static long lastx = 0, lasty = 0; static struct tsdev *tsDev = NULL; +static char *TsNames[] = { + NULL, /* set via TSLIB_TSDEVICE */ + "/dev/ts", + "/dev/touchscreen/0", +}; + +#define NUM_TS_NAMES (sizeof (TsNames) / sizeof (TsNames[0])) + +/* For XCalibrate extension */ void (*tslib_raw_event_hook)(int x, int y, int pressure, void *closure); void *tslib_raw_event_closure; -int KdTsPhyScreen = 0; +int TsInputType = 0; +int KdTsPhyScreen = 0; /* XXX Togo .. */ static void TsRead (int tsPort, void *closure) { KdMouseInfo *mi = closure; struct ts_sample event; - int n; long x, y; unsigned long flags; if (tslib_raw_event_hook) { + /* XCalibrate Ext */ if (ts_read_raw(tsDev, &event, 1) == 1) { - tslib_raw_event_hook (event.x, event.y, event.pressure, tslib_raw_event_closure); + tslib_raw_event_hook (event.x, + event.y, + event.pressure, + tslib_raw_event_closure); } return; } while (ts_read(tsDev, &event, 1) == 1) - { - if (event.pressure) - { - /* - * HACK ATTACK. (static global variables used !) - * Here we test for the touch screen driver actually being on the - * touch screen, if it is we send absolute coordinates. If not, - * then we send delta's so that we can track the entire vga screen. - */ - if (KdCurScreen == KdTsPhyScreen) { - flags = KD_BUTTON_1; - x = event.x; - y = event.y; - } else { - flags = /* KD_BUTTON_1 |*/ KD_MOUSE_DELTA; - if ((lastx == 0) || (lasty == 0)) { - x = 0; - y = 0; - } else { - x = event.x - lastx; - y = event.y - lasty; - } - lastx = event.x; - lasty = event.y; - } - } else { - flags = KD_MOUSE_DELTA; - x = 0; - y = 0; - lastx = 0; - lasty = 0; - } - + { + flags = (event.pressure) ? KD_BUTTON_1 : 0; + x = event.x; + y = event.y; + KdEnqueueMouseEvent (mi, flags, x, y); - } + } } -static char *TsNames[] = { - NULL, - "/dev/ts", - "/dev/touchscreen/0", -}; +static int +TsLibOpen(char *dev) +{ + if(!(tsDev = ts_open(dev, 0))) + return -1; -#define NUM_TS_NAMES (sizeof (TsNames) / sizeof (TsNames[0])) + if (ts_config(tsDev)) + return -1; -int TsInputType; + return ts_fd(tsDev); +} static int TslibEnable (int not_needed_fd, void *closure) @@ -139,16 +144,8 @@ TslibEnable (int not_needed_fd, void *closure) KdMouseInfo *mi = closure; int fd = 0; - fprintf(stderr, "%s() called\n", __func__); - - if(!(tsDev = ts_open(mi->name, 0))) { - fprintf(stderr, "%s() failed to open %s\n", __func__, mi->name ); - return -1; /* XXX Not sure what to return here */ - } - - if (ts_config(tsDev)) - return -1; - fd=ts_fd(tsDev); + if ((fd = TsLibOpen(mi->name)) == -1) + ErrorF ("Unable to re-enable TSLib ( on %s )", mi->name); return fd; } @@ -156,79 +153,80 @@ TslibEnable (int not_needed_fd, void *closure) static void TslibDisable (int fd, void *closure) { - ts_close(tsDev); + if (tsDev) + ts_close(tsDev); tsDev = NULL; } static int TslibInit (void) { - int i, j = 0; - KdMouseInfo *mi, *next; - int fd= 0; - int n = 0; + int i, j = 0; + KdMouseInfo *mi, *next; + int fd = 0; + int req_type; - if (!TsInputType) - TsInputType = KdAllocInputType (); - - KdMouseInfoAdd(); /* allocate empty kdMouseInfo entry for ts */ - - for (mi = kdMouseInfo; mi; mi = next) + if (!TsInputType) { - next = mi->next; - if (mi->inputType) - continue; - - /* Check for tslib env var device setting */ - if ((TsNames[0] = getenv("TSLIB_TSDEVICE")) == NULL) - j++; - - if (!mi->name) + TsInputType = KdAllocInputType (); + KdParseMouse(0); /* allocate safe slot in kdMouseInfo */ + req_type = 0; + } + else req_type = TsInputType; /* is being re-inited */ + + for (mi = kdMouseInfo; mi; mi = next) + { + next = mi->next; + + /* find a usuable slot */ + if (mi->inputType != req_type) + continue; + + /* Check for tslib env var device setting */ + if ((TsNames[0] = getenv("TSLIB_TSDEVICE")) == NULL) + j++; + + if (!mi->name) { - for (i = j; i < NUM_TS_NAMES; i++) + for (i = j; i < NUM_TS_NAMES; i++) { - - /* XXX Should check for */ - - if(!(tsDev = ts_open(TsNames[i],0))) continue; - if (ts_config(tsDev)) continue; - fd=ts_fd(tsDev); - if (fd >= 0) + fd = TsLibOpen(TsNames[i]); + + if (fd >= 0) { - mi->name = KdSaveString (TsNames[i]); - break; + mi->name = KdSaveString (TsNames[i]); + break; } } - } else { - - if(!(tsDev = ts_open(mi->name,0))) - continue; - if (ts_config(tsDev)) continue; - fd=ts_fd(tsDev); - - } - - if (fd > 0 && tsDev != 0) - { - mi->driver = (void *) fd; - mi->inputType = TsInputType; - if (KdRegisterFd (TsInputType, fd, TsRead, (void *) mi)) - n++; - - /* Set callbacks for vt switches etc */ - KdRegisterFdEnableDisable (fd, TslibEnable, TslibDisable); - - } - else - { - fprintf(stderr, "%s() failed to open tslib\n", __func__); - if (fd > 0) close(fd); - } - - - } - - return n; + } + else + fd = TsLibOpen(mi->name); + + if (fd >= 0 && tsDev != NULL) + { + mi->driver = (void *) fd; + mi->inputType = TsInputType; + + KdRegisterFd (TsInputType, fd, TsRead, (void *) mi); + + /* Set callbacks for vt switches etc */ + KdRegisterFdEnableDisable (fd, TslibEnable, TslibDisable); + + return TRUE; + } + } + + ErrorF ("Failed to open TSLib device, tried "); + for (i = j; i < NUM_TS_NAMES; i++) + ErrorF ("%s ", TsNames[i]); + ErrorF (".\n"); + if (!TsNames[0]) + ErrorF ("Try setting TSLIB_TSDEVICE to valid /dev entry?\n"); + + if (fd > 0) + close(fd); + + return FALSE; } static void @@ -241,12 +239,19 @@ TslibFini (void) { if (mi->inputType == TsInputType) { - if(mi->driver) { + if(mi->driver) + { ts_close(tsDev); tsDev = NULL; - } - mi->driver = 0; - mi->inputType = 0; + } + mi->driver = 0; + + /* If below is set to 0, then MouseInit() will trash it, + * setting to 'mouse type' ( via server reset). Therefore + * Leave it alone and work around in TslibInit() ( see + * req_type ). + */ + /* mi->inputType = 0; */ } } }