diff options
author | Joshua Baergen <joshuabaergen@gentoo.org> | 2007-05-13 17:47:22 +0000 |
---|---|---|
committer | Joshua Baergen <joshuabaergen@gentoo.org> | 2007-05-13 17:47:22 +0000 |
commit | 4d8dcb54d3d17d97c353db5bc1c4f1139e7ff9b7 (patch) | |
tree | 8cf4959df02ce6b0d745b72cc29ea20f3394f562 /x11-drivers/xf86-input-fpit | |
parent | amd64 stable (diff) | |
download | gentoo-2-4d8dcb54d3d17d97c353db5bc1c4f1139e7ff9b7.tar.gz gentoo-2-4d8dcb54d3d17d97c353db5bc1c4f1139e7ff9b7.tar.bz2 gentoo-2-4d8dcb54d3d17d97c353db5bc1c4f1139e7ff9b7.zip |
Include several patches from upstream. Thanks to Conrad Kostecki in bug
#176514.
(Portage version: 2.1.2.7)
Diffstat (limited to 'x11-drivers/xf86-input-fpit')
6 files changed, 820 insertions, 1 deletions
diff --git a/x11-drivers/xf86-input-fpit/ChangeLog b/x11-drivers/xf86-input-fpit/ChangeLog index 96bf1452f76b..b4173a93872f 100644 --- a/x11-drivers/xf86-input-fpit/ChangeLog +++ b/x11-drivers/xf86-input-fpit/ChangeLog @@ -1,6 +1,14 @@ # ChangeLog for x11-drivers/xf86-input-fpit # Copyright 1999-2007 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/x11-drivers/xf86-input-fpit/ChangeLog,v 1.31 2007/01/24 06:47:09 dberkholz Exp $ +# $Header: /var/cvsroot/gentoo-x86/x11-drivers/xf86-input-fpit/ChangeLog,v 1.32 2007/05/13 17:47:22 joshuabaergen Exp $ + +*xf86-input-fpit-1.1.0-r1 (13 May 2007) + + 13 May 2007; Joshua Baergen <joshuabaergen@gentoo.org> + +files/xf86-input-fpit-update1.diff, +files/xf86-input-fpit-update2.diff, + +files/xf86-input-fpit-update3.diff, +xf86-input-fpit-1.1.0-r1.ebuild: + Include several patches from upstream. Thanks to Conrad Kostecki in bug + #176514. 24 Jan 2007; Donnie Berkholz <dberkholz@gentoo.org>; -xf86-input-fpit-1.0.0.5.ebuild: diff --git a/x11-drivers/xf86-input-fpit/files/digest-xf86-input-fpit-1.1.0-r1 b/x11-drivers/xf86-input-fpit/files/digest-xf86-input-fpit-1.1.0-r1 new file mode 100644 index 000000000000..97c0e5725807 --- /dev/null +++ b/x11-drivers/xf86-input-fpit/files/digest-xf86-input-fpit-1.1.0-r1 @@ -0,0 +1,6 @@ +MD5 1b8cfd2923836ee93eda69abe50dda04 x11-driver-patches-1.tar.bz2 389 +RMD160 0c57d4b235d83f3d7c46691c13857fd121ddec2d x11-driver-patches-1.tar.bz2 389 +SHA256 64787d5b57d2845c0fa9297a9d924093ba191fc3551798239d9983f0bcca9b3e x11-driver-patches-1.tar.bz2 389 +MD5 a31066a2076d18619ceaea67f6d89698 xf86-input-fpit-1.1.0.tar.bz2 232340 +RMD160 677a27db3c5b71c0e7c752cfeb4a09340893f1ad xf86-input-fpit-1.1.0.tar.bz2 232340 +SHA256 8ee3b2df90516182460fbda025153aa7fb2c6ba343e4239d225963a287f694f8 xf86-input-fpit-1.1.0.tar.bz2 232340 diff --git a/x11-drivers/xf86-input-fpit/files/xf86-input-fpit-update1.diff b/x11-drivers/xf86-input-fpit/files/xf86-input-fpit-update1.diff new file mode 100644 index 000000000000..81ef3798f16a --- /dev/null +++ b/x11-drivers/xf86-input-fpit/files/xf86-input-fpit-update1.diff @@ -0,0 +1,400 @@ +commit 4b06c8f70e8b1d6cfaeb41e1584f9efcfef83bb0 +Author: Justin Blanchard <justinb04@aim.com> +Date: Tue Jan 30 20:12:07 2007 -0500 + + Updates from Justin Blanchard - patch 1 + + * Make the docs reflect more accurately what the code actually does. + * Update the docs: remove material specific to XFree86 3.x/4.0. Re-organize to + reflect the wider variety of machines that use this device. Change the link to + linuxslate.com. Expand troubleshooting section. + * Code cleanup: assorted trivial changes. + +diff --git a/man/fpit.man b/man/fpit.man +index fba0e6f..4964dbe 100644 +--- a/man/fpit.man ++++ b/man/fpit.man +@@ -23,11 +23,15 @@ driver functions as a pointer input devi + 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,12 @@ 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.) + .TP 4 + .B Option \fI"DeviceName"\fP \fI"name"\fP + .B Option \fI"DeviceName"\fP \fI"name"\fP +@@ -92,7 +96,7 @@ 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 +diff --git a/readme.txt b/readme.txt +index fd0990c..075c52e 100644 +--- a/readme.txt ++++ b/readme.txt +@@ -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,53 @@ Please visit http://XFree86.org for lice + + 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" + 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 +- +- * 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: ++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. + +-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 +112,8 @@ This should be re-stating the defaults, + 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 +121,10 @@ Solution: You must have a regular mous + 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,6 +135,9 @@ Solution: (Not really a solution) This + 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) +diff --git a/src/xf86Fpit.c b/src/xf86Fpit.c +index b7a9a60..d0b9fe3 100644 +--- a/src/xf86Fpit.c ++++ b/src/xf86Fpit.c +@@ -63,8 +63,6 @@ + + # include <misc.h> + # include <xf86.h> +-# if !defined(DGUX) +-# endif + # include <xf86_OSproc.h> + # include <xf86Xinput.h> + # include <exevents.h> +@@ -79,7 +77,6 @@ + * + *************************************************************************** + */ +-#define FPIT_LINK_SPEED B19200 /* 19200 Baud */ + #define FPIT_PORT "/dev/ttyS3" + + #define FPIT_MAX_X 4100 +@@ -87,19 +84,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 +- + + /* + *************************************************************************** +@@ -123,8 +107,6 @@ typedef struct { + int screen_width; + int screen_height; + 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 */ +@@ -135,10 +117,7 @@ typedef struct { + 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 */ + int fpitPassive; /* translate passive buttons */ +@@ -209,37 +188,45 @@ static void xf86FpitReadInput(LocalDevic + + 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); +@@ -256,7 +243,7 @@ static void xf86FpitReadInput(LocalDevic + 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); +@@ -268,9 +255,7 @@ static void xf86FpitReadInput(LocalDevic + /* + 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 */ +@@ -378,7 +363,7 @@ static Bool xf86FpitControl(DeviceIntPtr + * 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 */ , +@@ -542,13 +527,13 @@ static InputInfoPtr xf86FpitInit(InputDr + 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); diff --git a/x11-drivers/xf86-input-fpit/files/xf86-input-fpit-update2.diff b/x11-drivers/xf86-input-fpit/files/xf86-input-fpit-update2.diff new file mode 100644 index 000000000000..120db6e4b533 --- /dev/null +++ b/x11-drivers/xf86-input-fpit/files/xf86-input-fpit-update2.diff @@ -0,0 +1,30 @@ +commit 979c283a6ecb1ba718790a147b3e910a106cb473 +Author: Justin Blanchard <justinb04@aim.com> +Date: Tue Jan 30 20:13:52 2007 -0500 + + update from Justin Blanchard - part 2 + + * Fix a bug that prevents active-pen users from right-clicking while hovering. + * Bug was introduced with passive pen support; fix is simple and has been + recommended in forums since Oct 2006 + (http://ubuntuforums.org/showpost.php?p=1620646&postcount=15). + For some reason I don't see a bug report for the issue. + +diff --git a/src/xf86Fpit.c b/src/xf86Fpit.c +index d0b9fe3..636d6d0 100644 +--- a/src/xf86Fpit.c ++++ b/src/xf86Fpit.c +@@ -262,11 +262,9 @@ static void xf86FpitReadInput(LocalDevic + 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));*/ diff --git a/x11-drivers/xf86-input-fpit/files/xf86-input-fpit-update3.diff b/x11-drivers/xf86-input-fpit/files/xf86-input-fpit-update3.diff new file mode 100644 index 000000000000..a232a9d8631e --- /dev/null +++ b/x11-drivers/xf86-input-fpit/files/xf86-input-fpit-update3.diff @@ -0,0 +1,355 @@ +commit cb6adfe32f929e57eedcab189e9f359fc9e970ab +Author: Justin Blanchard <justinb04@aim.com> +Date: Tue Jan 30 20:15:50 2007 -0500 + + update from Justin Blanchard - part 3 + + * Adds support for detecting/responding to screen resize and rotate events + (i.e., fixing bug 3421 for FPIT users). This corrects both cursor-related and + extended events. + * The fix is disabled unless the user adds 'Option "TrackRandR"' to the + InputDevice section. This is to avoid breaking setups where some nightmarish + workaround was already in place. + * Use of RRGetRotation may break driver under XFree86. If this is a problem I + think xf86GetRotation can be used instead. + +diff --git a/man/fpit.man b/man/fpit.man +index 4964dbe..1809d2b 100644 +--- a/man/fpit.man ++++ b/man/fpit.man +@@ -80,6 +80,7 @@ Swap the X and Y axis (after inversions) + .B Option \fI"Rotate"\fP \fI"CWW"\fP + Manipulate the invert and swap options to match screen + 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 +@@ -101,6 +102,9 @@ 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: +@@ -109,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 + +@@ -124,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 + +@@ -140,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 + +diff --git a/readme.txt b/readme.txt +index 075c52e..3e6051c 100644 +--- a/readme.txt ++++ b/readme.txt +@@ -78,6 +78,9 @@ Section "InputDevice" + 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.) +@@ -142,8 +145,6 @@ 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 ! +diff --git a/src/xf86Fpit.c b/src/xf86Fpit.c +index 636d6d0..99d8bdb 100644 +--- a/src/xf86Fpit.c ++++ b/src/xf86Fpit.c +@@ -66,6 +66,7 @@ + # include <xf86_OSproc.h> + # include <xf86Xinput.h> + # include <exevents.h> ++# include <randrstr.h> + + # include <xf86Module.h> + +@@ -98,6 +99,20 @@ + /* + *************************************************************************** + * ++ * Screen orientation descriptors. ++ * ++ *************************************************************************** ++ */ ++ ++typedef enum { ++ FPIT_INVERT_X = 0x01, ++ FPIT_INVERT_Y = 0x02, ++ FPIT_THEN_SWAP_XY = 0x04 ++} FpitOrientation; ++ ++/* ++ *************************************************************************** ++ * + * Device private records. + * + *************************************************************************** +@@ -106,6 +121,7 @@ typedef struct { + char *fpitDev; /* device file name */ + int screen_width; + int screen_height; ++ Rotation screen_rotation; + int screen_no; + int fpitOldX; /* previous X position */ + int fpitOldY; /* previous Y position */ +@@ -115,12 +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 fpitIndex; /* number of bytes read */ + 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; + + +@@ -139,21 +157,73 @@ 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. + */ +@@ -166,6 +236,13 @@ static void xf86FpitReadInput(LocalDevic + 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 */ +@@ -230,11 +307,15 @@ static void xf86FpitReadInput(LocalDevic + + 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; +@@ -334,8 +415,6 @@ static Bool xf86FpitControl(DeviceIntPtr + 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. + */ +@@ -353,22 +432,11 @@ static Bool xf86FpitControl(DeviceIntPtr + 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 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"); +@@ -451,6 +519,7 @@ static LocalDevicePtr xf86FpitAllocate(I + 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; +@@ -459,7 +528,6 @@ static LocalDevicePtr xf86FpitAllocate(I + 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 */ ; +@@ -533,29 +601,33 @@ static InputInfoPtr xf86FpitInit(InputDr + xf86Msg(X_CONFIG, "FPIT maximum y position: %d\n", priv->fpitMaxY); + 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 */ diff --git a/x11-drivers/xf86-input-fpit/xf86-input-fpit-1.1.0-r1.ebuild b/x11-drivers/xf86-input-fpit/xf86-input-fpit-1.1.0-r1.ebuild new file mode 100644 index 000000000000..b3397e5c213f --- /dev/null +++ b/x11-drivers/xf86-input-fpit/xf86-input-fpit-1.1.0-r1.ebuild @@ -0,0 +1,20 @@ +# Copyright 1999-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/x11-drivers/xf86-input-fpit/xf86-input-fpit-1.1.0-r1.ebuild,v 1.1 2007/05/13 17:47:22 joshuabaergen Exp $ + +# Must be before x-modular eclass is inherited +#SNAPSHOT="yes" + +inherit x-modular + +DESCRIPTION="Fujitsu Stylistic input driver" +KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~sh ~sparc ~x86 ~x86-fbsd" +RDEPEND=">=x11-base/xorg-server-1.0.99" +DEPEND="${RDEPEND} + x11-proto/inputproto + x11-proto/randrproto + x11-proto/xproto" + +PATCHES="${FILESDIR}/${PN}-update1.diff + ${FILESDIR}/${PN}-update2.diff + ${FILESDIR}/${PN}-update3.diff" |