xf86-input-fpit 1.2.0

This commit is contained in:
matthieu 2008-08-23 13:57:32 +00:00
parent ca4f6e5638
commit 524cab8dde
4 changed files with 223 additions and 160 deletions

View File

@ -22,7 +22,7 @@
AC_PREREQ(2.57)
AC_INIT([xf86-input-fpit],
1.1.0,
1.2.0,
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
xf86-input-fpit)

View File

@ -23,11 +23,15 @@ driver functions as a pointer input device, and may be used as the
X server's core pointer.
.SH SUPPORTED HARDWARE
This driver supports the touchscreen of the Stylistic LT and (with
special options) of the Stylistic 500, 1000 and 2300.
special options) of the Stylistic 500, 1000, 1200, 2300, and 3400.
Modern FinePoint MP800 devices will also work with this driver.
Under Linux the Fujitsus serial port is not, by default, detected.
Therefore the following must be added to one of your start-up scripts.
(Either one of the X scripts, or to rc.local or similar).
Under Linux the Fujitsu's serial port is not, by default, detected.
Therefore the port must be configured manually as described in the
accompanying readme.txt file.
For example, add the following to your startup scripts for Stylistic xx00
devices:
.TP 4
.B setserial /dev/ttyS3 autoconfig
@ -70,12 +74,13 @@ Same as for X axis, but for Y axis.
Invert the specified axis.
.TP 4
.B Option \fI"SwapXY"\fP
Swap the X and Y axis.
Swap the X and Y axis (after inversions).
.TP 4
.B Option \fI"Rotate"\fP \fI"CW"\fP
.B Option \fI"Rotate"\fP \fI"CWW"\fP
Manipulate the invert and swap options to match screen
rotations.
rotations. (Will behave strangely if combined with invert or swap options.)
New users should consider the \fI"TrackRandR"\fP option instead.
.TP 4
.B Option \fI"DeviceName"\fP \fI"name"\fP
.B Option \fI"DeviceName"\fP \fI"name"\fP
@ -92,11 +97,14 @@ enabled for any other value.
.B Option \fI"DebugLevel"\fP \fInumber \fP
sets the level of debugging info reported.
.TP 4
.B Option \fI"BaudRate"\fP \fI"38400"\fP, \fI"19200"\fP or \fI"9600"\fP (default)
.B Option \fI"BaudRate"\fP \fI"38400"\fP, \fI"19200"\fP (default) or \fI"9600"\fP
changes the serial link speed.
.TP 4
.B Option \fI"Passive"\fP
decodes the passive pen.
.B Option \fI"TrackRandR"\fP
automatically keeps the cursor synchronized with the pen's position, even when
the screen is resized or rotated. (Recommended for tablet PC's.)
.RE
Example, for Stylistic LT setup is:
@ -105,6 +113,7 @@ Example, for Stylistic LT setup is:
.BI " Identifier \*q" mouse0 \*q
.B " Driver \*qfpit\*q"
.BI " Option \*qDevice\*q \*q"/dev/ttyS3 \*q
.BI " # Option \*qTrackRandR\*q"
.B EndSection
.fi
@ -120,6 +129,7 @@ And for other Stylistic devices try:
.BI " Option \*qMinimumXPosition\*q \*q"130 \*q
.BI " Option \*qMinimumYPosition\*q \*q"0 \*q
.BI " Option \*qInvertY\*q"
.BI " # Option \*qTrackRandR\*q"
.B EndSection
.fi
@ -136,6 +146,7 @@ For Stylistic 3400:
.BI " Option \*qMinimumYPosition\*q \*q"0 \*q
.BI " Option \*qPassive\*q"
.BI " Option \*qSendCoreEvents\*q"
.BI " # Option \*qTrackRandR\*q"
.B EndSection
.fi

View File

@ -1,15 +1,8 @@
xf86Fpit.c
(and associated files).
Documentation updated by John Apfelbaum, linuxslate.com Oct 2001
*** P L E A S E N O T E ***
* Due to a Hardrive failure, the version of this driver that was previously
* on the linuxslate.com website was lost. This is a version came from a
* directory on my development system that was marked "Works", and I belive it
* to be the latest version I worked on (about a year ago), but I have not had
* time to build from this source and verify this driver.
***
Last updated Jan 2007
This information applies to version 1.1.0 of this driver.
Supported Hardware:
@ -19,6 +12,8 @@ Supported Hardware:
Fujistu Stylistic 1000 (Should Work)
Fujistu Stylistic 1200 (Should Work)
Fujistu Stylistic 2300 (Should Work)
Fujitsu Stylistic 3400 (and possibly other passive-pen systems)
FinePoint MP800
History and Contributors:
@ -30,9 +25,11 @@ History and Contributors:
project into the XFree86 4.0.2 Elographics driver by Patrick Lecoanet.
- John Apfelbaum continuted the work to produce a working XFree86 4.0.x driver for the
Stylistic 1200.
- David Clay added support for Stylistic 3400 passive pen.
- David Clay added support for Stylistic 3400 passive pen, and possibly
others. (Also fixed processing of all packets, and enabled right mouse button.)
Please visit http://linuxslate.com for the latest information.
Please visit http://webcvs.freedesktop.org/xorg/driver/xf86-input-fpit/ for the
latest version of this driver.
License:
@ -52,73 +49,56 @@ Please visit http://XFree86.org for license information.
Installation:
THIS RELEASE IS FOR XFree86 Version 4.0.2. Hopefully it will also work
with other Version 4 systems. The source is written so that hopefully
it can be compiled under 3.3.6 - THIS HAS NOT BEEN TESTED (yet).
Copied from original xf86fpit.c readme:
1. Install and configure Linux w/o consideration of the digitizer tablet.
2. Get X working the way you want it.
3. Add or Change your appropriate startup scripts to include:
3. Set up a serial device to be initialized at startup.
Modify /etc/serial.conf if your distribution uses it. Otherwise
add or modify your appropriate startup scripts to include:
setserial /dev/ttyS3 autoconfig
setserial /dev/ttyS3 IRQ 15 baud_base 115200
(Some models may also have to specify: port 0xfce8)
setserial /dev/ttyS3 port ??? IRQ ?? baud_base 115200 [uart 16450]
New/Different for Ver 4.0.2
The uart setting may be necessary for the device to work.
See below for appropriate port/IRQ values.
4. Copy fpit_drv.o to /usr/X11R6/lib/modules/input
5. Add the following to your XF86Config(-4) file:
5. Add the following to your X config file (XF86Config/XF86Config-4/xorg.conf)
Section "InputDevice"
Identifier "mouse0"
Driver "fpit"
Option "Device" "/dev/ttyS3"
# These may need tweaking; see below.
Option "BaudRate" "19200"
Option "MaximumXPosition" "6250"
Option "MaximumYPosition" "4950"
Option "MinimumXPosition" "130"
Option "MinimumYPosition" "0"
Option "InvertY"
# For a passive pen, e.g. Stylistic 3400
Option "Passive"
# To make the touchscreen respond automatically to
# resolution changes and screen rotation:
Option "TrackRandR"
EndSection
6. Remember to add this Input Device to the server description (Near the end of the file.)
7. Start or restart X.
8. If required adjust the Min/Max X/Y positions so that the pointer
8. If required adjust the baud rate and Min/Max X/Y positions so that the pointer
tracks the pen correctly.
For Fujitsu Stylistic xx00 models, try IRQ 15, with port either unspecified
or set to 0xfce8.
New for Ver 4.5.0
For Fujitsu Stylistic 3400 models, try IRQ 4 and port 0xfd68.
Recommended X config settings are BaudRate 9600, Min X/Y 0, MaxX 4070, MaxY 4020.
* supports Stylistic 3400 (and possibly other passive-pen systems)
* Fixed processing of all packets
* Fixed hover-mode pointer movement
* Added Passive parameter for passive displays
* Added switch 3 for "right" mouse button
Try this serial configuration for the 3400:
setserial /dev/ttyS3 autoconfig
setserial /dev/ttyS3 uart 16450 irq 5 port 0xfd68
Try this config for the 3400:
Section "InputDevice"
Identifier "mouse0"
Driver "fpit"
Option "Device" "/dev/ttyS3"
Option "BaudRate" "9600"
Option "Passive"
Option "MaximumXPosition" "4070"
Option "MaximumYPosition" "4020"
Option "MinimumXPosition" "0"
Option "MinimumYPosition" "0"
Option "SendCoreEvents"
EndSection
In general you may wish to consult /proc/ioports or /sys/devices/pnp0/*
(under Linux 2.6) for serial information. BaudRate should generally be 9600,
19200, or 38400.
Hints if you are having problems (Thanks to Aron Hsiao):
@ -135,6 +115,8 @@ This should be re-stating the defaults, but Aron Hsiao agrees that it appears
to be an XFree86 4.x bug.
Problem 2: X Server crash during GUI startup (Particularly Gnome).
Or: programs using high-resolution pen tracking via XInput
don't work.
Solution: You must have a regular mouse defined as the default pointer
even if no mouse is used. During startup, Gnome attempts to
@ -142,6 +124,10 @@ Solution: You must have a regular mouse defined as the default pointer
pendrivers are absolute pointers, and acceleration is meaningless,
they do not take well to attempts to set it :-)
Additionally, setting the tablet as a core pointer prevents X
from sending XInput events. This lowers the pen-tracking
resolution available to programs by 1 or 2 orders of magnitude!
Problem 3: Jittery cursor and undesired mouse clicks (both buttons),
particuarly on the Stylistic 1200, and particuarly after the
system has warmed up.
@ -152,12 +138,13 @@ Solution: (Not really a solution) This is a hardware problem. Some
actively using it extends battery life, and keeps the system from
getting too hot.
If cursor movement seems completely random and mouse clicks seem
inexplicable, your baud rate may be set incorrectly.
Bugs and Needed Work:
(See above)
X rotation (Portrait mode is not supported). -- I plan to add this soon.
Adjusting the constants in the XF86Config(-4) is teedious and requires
multiple restarts of the X Window system. -- Somebody PLEASE write a
calibration program !

View File

@ -63,11 +63,10 @@
# include <misc.h>
# include <xf86.h>
# if !defined(DGUX)
# endif
# include <xf86_OSproc.h>
# include <xf86Xinput.h>
# include <exevents.h>
# include <randrstr.h>
# include <xf86Module.h>
@ -79,7 +78,6 @@
*
***************************************************************************
*/
#define FPIT_LINK_SPEED B19200 /* 19200 Baud */
#define FPIT_PORT "/dev/ttyS3"
#define FPIT_MAX_X 4100
@ -87,19 +85,6 @@
#define FPIT_MAX_Y 4100
#define FPIT_MIN_Y 0
#define PHASING_BIT 0x80
#define PROXIMITY_BIT 0x20 /* DMC: This was 0x40 but the chart says its bit 5 which is 0x20 */
/*#define TABID_BIT 0x20 */
#define XSIGN_BIT 0x10
#define YSIGN_BIT 0x08
#define BUTTON_BITS 0x07
#define COORD_BITS 0x7f
/* DMC: Added these */
#define SW1 0x01
#define SW2 0x02
#define SW3 0x04
/*
***************************************************************************
@ -111,6 +96,20 @@
#define FPIT_PACKET_SIZE 5
#define BUFFER_SIZE (FPIT_PACKET_SIZE*20)
/*
***************************************************************************
*
* Screen orientation descriptors.
*
***************************************************************************
*/
typedef enum {
FPIT_INVERT_X = 0x01,
FPIT_INVERT_Y = 0x02,
FPIT_THEN_SWAP_XY = 0x04
} FpitOrientation;
/*
***************************************************************************
*
@ -122,9 +121,8 @@ typedef struct {
char *fpitDev; /* device file name */
int screen_width;
int screen_height;
Rotation screen_rotation;
int screen_no;
int fpitInc; /* increment between transmits */
int fpitButTrans; /* button translation flags */
int fpitOldX; /* previous X position */
int fpitOldY; /* previous Y position */
int fpitOldProximity; /* previous proximity */
@ -133,15 +131,14 @@ typedef struct {
int fpitMinY; /* min Y value */
int fpitMaxX; /* max X value */
int fpitMaxY; /* max Y value */
int fpitInvX; /* Invert X axis */
int fpitInvY; /* Invert Y axis */
int fpitRes; /* resolution in lines per inch */
int flags; /* various flags */
int fpitIndex; /* number of bytes read */
int fpitBaud; /* Baud rate of device */
unsigned char fpitData[BUFFER_SIZE]; /* data read on the device */
int fpitSwapXY; /* swap X and Y values */
FpitOrientation fpitBaseOrientation; /* read from X config */
FpitOrientation fpitTotalOrientation; /* above + RandR */
int fpitPassive; /* translate passive buttons */
int fpitTrackRandR; /* check for, react to screen rotate/resize */
/* XXX when this last option is unset, we provide "compatibly stupid"
* behavior. */
} FpitPrivateRec, *FpitPrivatePtr;
@ -160,20 +157,72 @@ typedef struct {
static Bool xf86FpitConvert(LocalDevicePtr local, int first, int num, int v0, int v1, int v2, int v3, int v4, int v5, int *x, int *y)
{
FpitPrivatePtr priv = (FpitPrivatePtr) local->private;
AxisInfoPtr axes = local->dev->valuator->axes;
if (first != 0 || num != 2) {
return FALSE;
}
if (priv->fpitSwapXY != 0) {
*x = xf86ScaleAxis(v1, 0, priv->screen_width, priv->fpitMinY, priv->fpitMaxY);
*y = xf86ScaleAxis(v0, 0, priv->screen_height, priv->fpitMinX, priv->fpitMaxX);
} else {
*x = xf86ScaleAxis(v0, 0, priv->screen_width, priv->fpitMinX, priv->fpitMaxX);
*y = xf86ScaleAxis(v1, 0, priv->screen_height, priv->fpitMinY, priv->fpitMaxY);
}
*x = xf86ScaleAxis(v0, 0, priv->screen_width, axes[0].min_value, axes[0].max_value);
*y = xf86ScaleAxis(v1, 0, priv->screen_height, axes[1].min_value, axes[1].max_value);
return TRUE;
}
/*
***************************************************************************
*
* xf86FpitSetUpAxes --
* Based on current screen resolution and, if RandR support is enabled,
* current rotation state, set up the XInput axes and orientation info.
*
***************************************************************************
*/
static void xf86FpitSetUpAxes(DeviceIntPtr dev, FpitPrivatePtr priv)
{
/*
* Device reports motions on 2 axes in absolute coordinates.
* Axes min and max values are reported in raw coordinates.
* Resolution is computed roughly by the difference between
* max and min values scaled from the approximate size of the
* screen to fit one meter.
*/
int quarter_turns;
priv->screen_width = screenInfo.screens[priv->screen_no]->width;
priv->screen_height = screenInfo.screens[priv->screen_no]->height;
priv->fpitTotalOrientation = priv->fpitBaseOrientation;
if (!priv->fpitTrackRandR)
return;
/* now apply transforms specified by RandR:
* slightly complicated because invertX/Y and swapXY don't commute. */
priv->screen_rotation = RRGetRotation(screenInfo.screens[priv->screen_no]);
quarter_turns = (
(priv->screen_rotation & RR_Rotate_90 ? 1 : 0) +
(priv->screen_rotation & RR_Rotate_180 ? 2 : 0) +
(priv->screen_rotation & RR_Rotate_270 ? 3 : 0) ) % 4;
if (quarter_turns / 2 != 0)
priv->fpitTotalOrientation ^= FPIT_INVERT_X | FPIT_INVERT_Y;
if (quarter_turns % 2 != 0) {
priv->fpitTotalOrientation ^=
(priv->fpitTotalOrientation & FPIT_THEN_SWAP_XY ? FPIT_INVERT_X : FPIT_INVERT_Y)
| FPIT_THEN_SWAP_XY;
}
if (priv->fpitTotalOrientation & FPIT_THEN_SWAP_XY) {
InitValuatorAxisStruct(dev, 1, priv->fpitMinX, priv->fpitMaxX, 9500, 0 /* min_res */ ,
9500 /* max_res */ );
InitValuatorAxisStruct(dev, 0, priv->fpitMinY, priv->fpitMaxY, 10500, 0 /* min_res */ ,
10500 /* max_res */ );
} else {
InitValuatorAxisStruct(dev, 0, priv->fpitMinX, priv->fpitMaxX, 9500, 0 /* min_res */ ,
9500 /* max_res */ );
InitValuatorAxisStruct(dev, 1, priv->fpitMinY, priv->fpitMaxY, 10500, 0 /* min_res */ ,
10500 /* max_res */ );
}
}
/*
** xf86FpitReadInput
** Reads from the Fpit and posts any new events to the server.
@ -182,11 +231,17 @@ static void xf86FpitReadInput(LocalDevicePtr local)
{
FpitPrivatePtr priv = (FpitPrivatePtr) local->private;
int len, loop;
int is_core_pointer;
int x, y, buttons, prox;
DeviceIntPtr device;
int conv_x, conv_y;
if (priv->fpitTrackRandR && (
priv->screen_width != screenInfo.screens[priv->screen_no]->width ||
priv->screen_height != screenInfo.screens[priv->screen_no]->height ||
priv->screen_rotation != RRGetRotation(screenInfo.screens[priv->screen_no])
))
xf86FpitSetUpAxes(local->dev, priv);
do { /* keep reading blocks until there are no more */
/* Read data into buffer */
@ -209,57 +264,72 @@ static void xf86FpitReadInput(LocalDevicePtr local)
priv->fpitIndex += len;
/* process each packet in this block */
for (loop=0;loop+FPIT_PACKET_SIZE<=priv->fpitIndex;loop++) {
if (!(priv->fpitData[loop] & 0x80)) continue; /* we don't have a start bit yet */
#define PHASING_BIT 0x80
#define PROXIMITY_BIT 0x20
#define BUTTON_BITS 0x07
#define SW1 0x01
#define SW2 0x02
#define SW3 0x04
/* process each packet in this block */
/* Format of 5 bytes data packet for Fpit Tablets
Byte 1
bit 7 Phasing bit always 1
bit 6 Switch status change
bit 5 Proximity
bit 4 Always 0
bit 3 Test data
bit 2 Sw3 (2nd side sw)
bit 1 Sw2 (1st side sw)
bit 0 Sw1 (Pen tip sw)
bit 7 (0x80) Phasing bit always 1
bit 6 (0x40) Switch status change
bit 5 (0x20) Proximity
bit 4 (0x10) Always 0
bit 3 (0x08) Test data
bits 2-0 (0x07) Buttons:
bit 2 (0x04) Sw3 (2nd side sw)
bit 1 (0x02) Sw2 (1st side sw)
bit 0 (0x01) Sw1 (Pen tip sw)
Byte 2
bit 7 Always 0
bits 6-0 = X6 - X0
bit 7 (0x80) Always 0
bits 6-0 (0x7f) X6 - X0
Byte 3
bit 7 Always 0
bits 6-0 = X13 - X7
bit 7 (0x80) Always 0
bits 6-0 (0x7f) X13 - X7
Byte 4
bit 7 Always 0
bits 6-0 = Y6 - Y0
bit 7 (0x80) Always 0
bits 6-0 (0x7f) Y6 - Y0
Byte 5
bit 7 Always 0
bits 6-0 = Y13 - Y7
bit 7 (0x80) Always 0
bits 6-0 (0x7f) Y13 - Y7
*/
for (loop=0;loop+FPIT_PACKET_SIZE<=priv->fpitIndex;loop++) {
if (!(priv->fpitData[loop] & PHASING_BIT)) continue; /* we don't have a start bit yet */
x = (int) (priv->fpitData[loop + 1] & 0x7f) + ((int) (priv->fpitData[loop + 2] & 0x7f) << 7);
y = (int) (priv->fpitData[loop + 3] & 0x7f) + ((int) (priv->fpitData[loop + 4] & 0x7f) << 7);
/* Add in any offsets */
if (priv->fpitInvX)
/* Adjust to orientation */
if (priv->fpitTotalOrientation & FPIT_INVERT_X)
x = priv->fpitMaxX - x + priv->fpitMinX;
if (priv->fpitInvY)
if (priv->fpitTotalOrientation & FPIT_INVERT_Y)
y = priv->fpitMaxY - y + priv->fpitMinY;
if (priv->fpitTotalOrientation & FPIT_THEN_SWAP_XY) {
int z = x; x = y; y = z;
}
prox = (priv->fpitData[loop] & PROXIMITY_BIT) ? 0 : 1;
buttons = (priv->fpitData[loop] & BUTTON_BITS);
device = local->dev;
is_core_pointer = xf86IsCorePointer(device);
xf86FpitConvert(local, 0, 2, x, y, 0, 0, 0, 0, &conv_x, &conv_y);
xf86XInputSetScreen(local, priv->screen_no, conv_x, conv_y);
/* coordonates are ready we can send events */
/* coordinates are ready we can send events */
if (prox!=priv->fpitOldProximity) /* proximity changed */
if (!is_core_pointer) xf86PostProximityEvent(device, prox, 0, 2, x, y);
if (prox!=priv->fpitOldProximity) { /* proximity changed */
#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0
if (xf86IsCorePointer(device) == 0)
#endif
xf86PostProximityEvent(device, prox, 0, 2, x, y);
}
if (priv->fpitOldX != x || priv->fpitOldY != y) /* position changed */
xf86PostMotionEvent(device, 1, 0, 2, x, y);
@ -268,20 +338,16 @@ static void xf86FpitReadInput(LocalDevicePtr local)
/*
For passive pen (Stylistic 3400, et al.):
sw1 = 1 if pen is moving
sw1 = 0 if pen is not moving
sw2 = 0 if pen is contacting the pad
sw2 = 1 if pen was lifted from the pad
sw2 = 1 if pen was lifted from the pad / isn't in contact
sw3 = 1 if right mouse-button icon was chosen
*/
/* convert the pen button bits to actual mouse buttons */
if (buttons & SW2) buttons=0; /* the pen was lifted, so no buttons are pressed */
else if (buttons & SW3) buttons=SW3; /* the "right mouse" button was pressed, so send down event */
else if (prox) buttons=SW1; /* the "left mouse" button was pressed and we are not hovering, so send down event */
else buttons=0; /* We are in hover mode, so no buttons */
}
else { /* the active pen's buttons map directly to the mouse buttons */
if (!prox) buttons=0; /* We are in hover mode, so no buttons */
else buttons=0; /* We are in hover mode, so not left-clicking. */
}
/* the active pen's buttons map directly to the mouse buttons. Right-click may happen even in hover mode. */
/* DBG(2, ErrorF("%02d/%02d Prox=%d SW:%x Buttons:%x->%x (%d, %d)\n",
loop,priv->fpitIndex,prox,priv->fpitData[loop]&BUTTON_BITS,priv->fpitOldButtons,buttons,x,y));*/
@ -351,8 +417,6 @@ static Bool xf86FpitControl(DeviceIntPtr dev, int mode)
if (priv->screen_no >= screenInfo.numScreens || priv->screen_no < 0) {
priv->screen_no = 0;
}
priv->screen_width = screenInfo.screens[priv->screen_no]->width;
priv->screen_height = screenInfo.screens[priv->screen_no]->height;
/*
* Device reports button press for up to 3 buttons.
*/
@ -370,22 +434,11 @@ static Bool xf86FpitControl(DeviceIntPtr dev, int mode)
ErrorF("Unable to allocate PtrFeedBackClassDeviceStruct\n");
}
/*
* Device reports motions on 2 axes in absolute coordinates.
* Axes min and max values are reported in raw coordinates.
* Resolution is computed roughly by the difference between
* max and min values scaled from the approximate size of the
* screen to fit one meter.
*/
if (InitValuatorClassDeviceStruct(dev, 2, xf86GetMotionEvents, local->history_size, Absolute) == FALSE) {
ErrorF("Unable to allocate Elographics touchscreen ValuatorClassDeviceStruct\n");
ErrorF("Unable to allocate Fpit touchscreen ValuatorClassDeviceStruct\n");
return !Success;
} else {
InitValuatorAxisStruct(dev, 0, priv->fpitMinX, priv->fpitMaxX, 9500, 0 /* min_res */ ,
9500 /* max_res */ );
InitValuatorAxisStruct(dev, 1, priv->fpitMinY, priv->fpitMaxY, 10500, 0 /* min_res */ ,
10500 /* max_res */ );
}
xf86FpitSetUpAxes(dev, priv);
if (InitFocusClassDeviceStruct(dev) == FALSE) {
ErrorF("Unable to allocate Fpit touchscreen FocusClassDeviceStruct\n");
@ -468,6 +521,7 @@ static LocalDevicePtr xf86FpitAllocate(InputDriverPtr drv)
priv->screen_no = 0;
priv->screen_width = -1;
priv->screen_height = -1;
priv->screen_rotation = RR_Rotate_0;
priv->fpitMinX = FPIT_MIN_X;
priv->fpitMaxX = FPIT_MAX_X;
priv->fpitMinY = FPIT_MIN_Y;
@ -476,7 +530,6 @@ static LocalDevicePtr xf86FpitAllocate(InputDriverPtr drv)
priv->fpitOldButtons = 0;
priv->fpitOldProximity = 0;
priv->fpitIndex = 0;
priv->fpitSwapXY = 0;
priv->fpitPassive = 0;
local->name = XI_TOUCHSCREEN;
local->flags = 0 /* XI86_NO_OPEN_ON_INIT */ ;
@ -542,37 +595,41 @@ static InputInfoPtr xf86FpitInit(InputDriverPtr drv, IDevPtr dev, int flags)
xf86Msg(X_CONFIG, "FPIT device name: %s\n", local->name);
priv->screen_no = xf86SetIntOption(local->options, "ScreenNo", 0);
xf86Msg(X_CONFIG, "Fpit associated screen: %d\n", priv->screen_no);
priv->fpitMaxX = xf86SetIntOption(local->options, "MaximumXPosition", 4100);
priv->fpitMaxX = xf86SetIntOption(local->options, "MaximumXPosition", FPIT_MAX_X);
xf86Msg(X_CONFIG, "FPIT maximum x position: %d\n", priv->fpitMaxX);
priv->fpitMinX = xf86SetIntOption(local->options, "MinimumXPosition", 0);
priv->fpitMinX = xf86SetIntOption(local->options, "MinimumXPosition", FPIT_MIN_X);
xf86Msg(X_CONFIG, "FPIT minimum x position: %d\n", priv->fpitMinX);
priv->fpitMaxY = xf86SetIntOption(local->options, "MaximumYPosition", 4100);
priv->fpitMaxY = xf86SetIntOption(local->options, "MaximumYPosition", FPIT_MAX_Y);
xf86Msg(X_CONFIG, "FPIT maximum y position: %d\n", priv->fpitMaxY);
priv->fpitMinY = xf86SetIntOption(local->options, "MinimumYPosition", 0);
priv->fpitMinY = xf86SetIntOption(local->options, "MinimumYPosition", FPIT_MIN_Y);
xf86Msg(X_CONFIG, "FPIT minimum y position: %d\n", priv->fpitMinY);
priv->fpitInvX = xf86SetBoolOption(local->options, "InvertX", 0);
priv->fpitInvY = xf86SetBoolOption(local->options, "InvertY", 0);
priv->fpitSwapXY = xf86SetBoolOption(local->options, "SwapXY", 0);
priv->fpitBaseOrientation = 0;
if (xf86SetBoolOption(local->options, "InvertX", 0))
priv->fpitBaseOrientation |= FPIT_INVERT_X;
if (xf86SetBoolOption(local->options, "InvertY", 0))
priv->fpitBaseOrientation |= FPIT_INVERT_Y;
if (xf86SetBoolOption(local->options, "SwapXY", 0))
priv->fpitBaseOrientation |= FPIT_THEN_SWAP_XY;
priv->fpitPassive = xf86SetBoolOption(local->options, "Passive", 0);
priv->fpitTrackRandR = xf86SetBoolOption(local->options, "TrackRandR", 0);
/* XXX "Rotate" option provides compatibly stupid behavior. JEB. */
str = xf86SetStrOption(local->options, "Rotate", 0);
if (!xf86NameCmp(str, "CW")) {
priv->fpitInvX = 1;
priv->fpitInvY = 1;
priv->fpitSwapXY = 1;
} else if (!xf86NameCmp(str, "CCW")) {
priv->fpitInvX = 0;
priv->fpitInvY = 0;
priv->fpitSwapXY = 1;
}
xf86Msg(X_CONFIG, "FPIT invert X axis: %s\n", priv->fpitInvX ? "Yes" : "No");
xf86Msg(X_CONFIG, "FPIT invert Y axis: %s\n", priv->fpitInvY ? "Yes" : "No");
xf86Msg(X_CONFIG, "FPIT swap X and Y axis: %s\n", priv->fpitSwapXY ? "Yes" : "No");
if (!xf86NameCmp(str, "CW"))
priv->fpitBaseOrientation |= FPIT_INVERT_X | FPIT_INVERT_Y | FPIT_THEN_SWAP_XY;
else if (!xf86NameCmp(str, "CCW"))
priv->fpitBaseOrientation |= FPIT_THEN_SWAP_XY;
xf86Msg(X_CONFIG, "FPIT invert X axis: %s\n", priv->fpitBaseOrientation & FPIT_INVERT_X ? "Yes" : "No");
xf86Msg(X_CONFIG, "FPIT invert Y axis: %s\n", priv->fpitBaseOrientation & FPIT_INVERT_Y ? "Yes" : "No");
xf86Msg(X_CONFIG, "FPIT swap X and Y axis: %s\n", priv->fpitBaseOrientation & FPIT_THEN_SWAP_XY ? "Yes" : "No");
xf86Msg(X_CONFIG, "FPIT Passive button mode: %s\n", priv->fpitPassive ? "Yes" : "No");
xf86Msg(X_CONFIG, "FPIT RandR tracking: %s\n", priv->fpitTrackRandR ? "Yes" : "No");
/* mark the device configured */
local->flags |= XI86_CONFIGURED;
return local;
}
_X_EXPORT InputDriverRec FPIT = {
1, /* driver version */
"fpit", /* driver name */
@ -595,7 +652,15 @@ static void Unplug(pointer p)
}
static XF86ModuleVersionInfo version_rec = {
"fpit", MODULEVENDORSTRING, MODINFOSTRING1, MODINFOSTRING2, XORG_VERSION_CURRENT, 1, 1, 0, ABI_CLASS_XINPUT, ABI_XINPUT_VERSION, MOD_CLASS_XINPUT,
"fpit",
MODULEVENDORSTRING,
MODINFOSTRING1,
MODINFOSTRING2,
XORG_VERSION_CURRENT,
PACKAGE_VERSION_MAJOR, PACKAGE_VERSION_MINOR, PACKAGE_VERSION_PATCHLEVEL,
ABI_CLASS_XINPUT,
ABI_XINPUT_VERSION,
MOD_CLASS_XINPUT,
{0, 0, 0, 0}
};