Hello community, here is the log from the commit of package xorg-x11-driver-input checked in at Thu Mar 1 20:10:06 CET 2007. -------- --- xorg-x11-driver-input/xorg-x11-driver-input.changes 2007-02-22 12:28:00.000000000 +0100 +++ /mounts/work_src_done/STABLE/xorg-x11-driver-input/xorg-x11-driver-input.changes 2007-03-01 15:33:08.979712000 +0100 @@ -1,0 +2,38 @@ +Thu Mar 1 15:29:00 CET 2007 - sndirsch@suse.de + +- xf86-input-fpit-update1.diff: + * 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. +- xf86-input-fpit-update2.diff: + * 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. +- xf86-input-fpit-update3.diff: + * 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. + +------------------------------------------------------------------- +Wed Feb 28 04:21:31 CET 2007 - sndirsch@suse.de + +- updated vmmouse driver to bugfix release 12.4.1: + * Under certain circumstances, typically when the kernel PS/2 + driver decides to reset the PS/2 device, we can find ourselves + in an inconsistent state between the vmmouse driver and the + virtual hardware. When this is encountered, we should re- + request absolute mode from the hardware to get back in sync. + +------------------------------------------------------------------- Old: ---- xf86-input-vmmouse-X11R7.1-12.4.0.tar.bz2 New: ---- xf86-input-fpit-update1.diff xf86-input-fpit-update2.diff xf86-input-fpit-update3.diff xf86-input-vmmouse-12.4.1.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xorg-x11-driver-input.spec ++++++ --- /var/tmp/diff_new_pack.a28439/_old 2007-03-01 20:02:32.000000000 +0100 +++ /var/tmp/diff_new_pack.a28439/_new 2007-03-01 20:02:32.000000000 +0100 @@ -15,7 +15,7 @@ BuildRequires: Mesa-devel pkgconfig xorg-x11-proto-devel xorg-x11-server-sdk Url: http://xorg.freedesktop.org/ Version: 7.2 -Release: 36 +Release: 38 License: X11/MIT BuildRoot: %{_tmppath}/%{name}-%{version}-build Group: System/X11/Servers/XF86_4 @@ -47,7 +47,7 @@ Source23: xf86-input-summa-X11R7.1-1.1.0.tar.bz2 Source24: xf86-input-tek4957-X11R7.1-1.1.0.tar.bz2 Source25: xf86-input-ur98-X11R7.1-1.1.0.tar.bz2 -Source26: xf86-input-vmmouse-X11R7.1-12.4.0.tar.bz2 +Source26: xf86-input-vmmouse-12.4.1.tar.bz2 Source27: xf86-input-void-X11R7.1-1.1.0.tar.bz2 Source28: xf86-input-aiptek-1.2.tar.gz Patch: xf86-input-keyboard.diff @@ -57,6 +57,9 @@ Patch4: p_kbd.diff Patch5: evdev-overflow.diff Patch6: mouse-readinput.diff +Patch7: xf86-input-fpit-update1.diff +Patch8: xf86-input-fpit-update2.diff +Patch9: xf86-input-fpit-update3.diff %description @@ -90,6 +93,12 @@ pushd xf86-input-aiptek-*/src tar xzf $RPM_SOURCE_DIR/xf86-input-aiptek-1.2.tar.gz popd +pushd xf86-input-fpit-* +%patch7 -p1 +%patch8 -p1 +# disabled for now; see Bug #250146 +#%patch9 -p1 +popd %build %ifarch %ix86 x86_64 @@ -126,6 +135,38 @@ %{_mandir}/man4/* %changelog +* Thu Mar 01 2007 - sndirsch@suse.de +- xf86-input-fpit-update1.diff: + * 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. +- xf86-input-fpit-update2.diff: + * 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. +- xf86-input-fpit-update3.diff: + * 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. +* Wed Feb 28 2007 - sndirsch@suse.de +- updated vmmouse driver to bugfix release 12.4.1: + * Under certain circumstances, typically when the kernel PS/2 + driver decides to reset the PS/2 device, we can find ourselves + in an inconsistent state between the vmmouse driver and the + virtual hardware. When this is encountered, we should re- + request absolute mode from the hardware to get back in sync. * Thu Feb 22 2007 - sndirsch@suse.de - xf86-input-keyboard.diff: * fix key led update (Bug #103009 / X.Org Bug #313) ++++++ xf86-input-fpit-update1.diff ++++++ 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); ++++++ xf86-input-fpit-update2.diff ++++++ 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));*/ ++++++ xf86-input-fpit-update3.diff ++++++ 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 */ ++++++ xf86-input-vmmouse-X11R7.1-12.4.0.tar.bz2 -> xf86-input-vmmouse-12.4.1.tar.bz2 ++++++ ++++ 14315 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xf86-input-vmmouse-X11R7.1-12.4.0/configure.ac new/xf86-input-vmmouse-12.4.1/configure.ac --- old/xf86-input-vmmouse-X11R7.1-12.4.0/configure.ac 2006-04-07 20:17:10.000000000 +0200 +++ new/xf86-input-vmmouse-12.4.1/configure.ac 2007-02-28 03:03:07.000000000 +0100 @@ -22,7 +22,7 @@ AC_PREREQ(2.57) AC_INIT([xf86-input-vmmouse], - 12.4.0, + 12.4.1, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xf86-input-vmmouse) diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xf86-input-vmmouse-X11R7.1-12.4.0/man/Makefile.am new/xf86-input-vmmouse-12.4.1/man/Makefile.am --- old/xf86-input-vmmouse-X11R7.1-12.4.0/man/Makefile.am 2006-01-09 20:12:26.000000000 +0100 +++ new/xf86-input-vmmouse-12.4.1/man/Makefile.am 2006-07-01 08:18:52.000000000 +0200 @@ -1,4 +1,4 @@ -# $Id: Makefile.am,v 1.7 2005/12/06 22:48:31 kem Exp $ +# $Id$ # # Copyright 2005 Sun Microsystems, Inc. All rights reserved. # diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xf86-input-vmmouse-X11R7.1-12.4.0/src/vmmouse.c new/xf86-input-vmmouse-12.4.1/src/vmmouse.c --- old/xf86-input-vmmouse-X11R7.1-12.4.0/src/vmmouse.c 2006-04-07 20:17:10.000000000 +0200 +++ new/xf86-input-vmmouse-12.4.1/src/vmmouse.c 2007-02-28 03:03:22.000000000 +0100 @@ -81,7 +81,7 @@ */ #define VMMOUSE_MAJOR_VERSION 12 #define VMMOUSE_MINOR_VERSION 4 -#define VMMOUSE_PATCHLEVEL 0 +#define VMMOUSE_PATCHLEVEL 1 /***************************************************************************** * static function header @@ -919,9 +919,18 @@ int buttons, dx, dy, dz, dw; VMMOUSE_INPUT_DATA vmmouseInput; int ps2Buttons = 0; + int numPackets; pMse = pInfo->private; - while(VMMouseClient_GetInput(&vmmouseInput)){ + while((numPackets = VMMouseClient_GetInput(&vmmouseInput))){ + if (numPackets == VMMOUSE_ERROR) { + VMMouseClient_Disable(); + VMMouseClient_Enable(); + VMMouseClient_RequestAbsolute(); + xf86Msg(X_INFO, "VMWARE(0): re-requesting absolute mode after reset\n"); + break; + } + if(vmmouseInput.Buttons & VMMOUSE_MIDDLE_BUTTON) ps2Buttons |= 0x04; /* Middle*/ if(vmmouseInput.Buttons & VMMOUSE_RIGHT_BUTTON) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@Hilbert.suse.de