From: Danny Kukawka <dkukawka@suse.de>
Subject: add Touch support for Wacom TabletPCs to SaX2

Added support for the new Touch support of Wacom TabletPC devices
(as e.g. the WACf008 in the Lenovo ThinkPad X61t) to Sax2. This patch
includes:
 * new pen type Touch 
 * extended Wacom template for Touch devices and an updated Lenovo 
   ThinkPad X61t entry
 * removed Multitouch parameter from supported Wacom parameter list
 * update for German po-file
 * fixed Makefile to prevent trouble with RPM if a patch get added
   (ignore *.orig files)

Signed-off-by: Danny Kukawka <dkukawka@suse.de>
---
 Makefile                      |    2
 api/data/TabletModules        |    2
 api/data/cdb/Pens             |   18 ++++++-
 api/data/cdb/Tablets          |    4 +
 api/data/xapi.gtx             |    6 ++
 api/tablet.cpp                |   15 +++++-
 api/tablet/tabletpens.cpp     |   78 ++++++++++++++++++++++++++++++++--
 api/tablet/tabletpens.h       |    8 +++
 libsax/device.cpp             |    1
 libsax/device.h               |    1
 libsax/pointers.cpp           |   50 +++++++++++++++++++++
 libsax/pointers.h             |    7 ++-
 locale/de/LC_MESSAGES/sax.po  |   18 ++++++-
 profile/automatic/input/wacom |   24 +++++++++-
 14 files changed, 213 insertions(+), 21 deletions(-)

diff --git a/sax/Makefile b/sax/Makefile
index 26adafa..ddf89e3 100644
--- a/sax/Makefile
+++ b/sax/Makefile
@@ -249,7 +249,7 @@ install:install-docs
 	#============================================
 	# install API data files...
 	#--------------------------------------------
-	for i in `find ./api/data -maxdepth 1 -name "*"`; do \
+	for i in `find ./api/data -maxdepth 1 -name "*" | grep -v .orig`; do \
 	if [ -f $$i ];then \
 		install -m 644 $$i  ${APIDATAVZ} ;\
 	fi \
diff --git a/sax/api/data/TabletModules b/sax/api/data/TabletModules
index f938f4d..ff64c5d 100644
--- a/sax/api/data/TabletModules
+++ b/sax/api/data/TabletModules
@@ -1,4 +1,4 @@
-wacom=USB:bool Tilt:bool KeepShape:bool AlwaysCore:bool TopX:any TopY:any BottomX:any BottomY:any DeviceName:any Suppress:any HistorySize:any DebugLevel:any BaudRate:string%38400,19200,9600 Serial:any Threshold:any ForceDevice:any Button2:string%1,2,3 TPCButton:string%on,off Rotate:string%NONE,CW,CCW,HALF MultiTouch:string%on,off
+wacom=USB:bool Tilt:bool KeepShape:bool AlwaysCore:bool TopX:any TopY:any BottomX:any BottomY:any DeviceName:any Suppress:any HistorySize:any DebugLevel:any BaudRate:string%38400,19200,9600 Serial:any Threshold:any ForceDevice:any Button2:string%1,2,3 TPCButton:string%on,off Rotate:string%NONE,CW,CCW,HALF
 hyperpen=AlwaysCore:bool XSize:any YSize:any Cursor:string%Stylus,Pen
 summa=Compatible:bool AlwaysCore:bool Cursor:string%Stylus,Pen
 acecad=Model:any ReportSpeed:any
diff --git a/sax/api/data/cdb/Pens b/sax/api/data/cdb/Pens
index 7666acd..82f0fea 100644
--- a/sax/api/data/cdb/Pens
+++ b/sax/api/data/cdb/Pens
@@ -211,11 +211,11 @@ TABLET PCs:Lenovo X61 TABLET PC Eraser (SERIAL) {
  Driver              = wacom
  Protocol            = Auto
  TabletType          = eraser
- RawOption           = "ForceDevice" "ISDV4","MultiTouch" "off"
+ RawOption           = "ForceDevice" "ISDV4"
 }
 
 #-----------------------------------------#
-# TABLET PCs: IBM X41 TabletPC Stylus     #
+# TABLET PCs: IBM X61 TabletPC Stylus     #
 #-----------------------------------------#
 TABLET PCs:Lenovo X61 TABLET PC Stylus (SERIAL) {
  Device              = /dev/ttyS0
@@ -223,7 +223,19 @@ TABLET PCs:Lenovo X61 TABLET PC Stylus (SERIAL) {
  Driver              = wacom
  Protocol            = Auto
  TabletType          = stylus
- RawOption           = "ForceDevice" "ISDV4","MultiTouch" "off"
+ RawOption           = "ForceDevice" "ISDV4"
+}
+
+#-----------------------------------------#
+# TABLET PCs: IBM X61 TabletPC Touch      #
+#-----------------------------------------#
+TABLET PCs:Lenovo X61 TABLET PC Touch (SERIAL) {
+ Device              = /dev/ttyS0
+ TabletMode          = Absolute
+ Driver              = wacom
+ Protocol            = Auto
+ TabletType          = touch
+ RawOption           = "ForceDevice" "ISDV4"
 }
 
 #-------------------------------------------#
diff --git a/sax/api/data/cdb/Tablets b/sax/api/data/cdb/Tablets
index 8d08ad8..1c62941 100644
--- a/sax/api/data/cdb/Tablets
+++ b/sax/api/data/cdb/Tablets
@@ -23,6 +23,7 @@
 #  KernelLoad           = string,string
 #  StylusLink           = string
 #  EraserLink           = string
+#  TouchLink            = string
 # }
 
 #-------------------------------#
@@ -215,9 +216,10 @@ TABLET PCs:Lenovo X61 TABLET PC (SERIAL) {
  Driver           = wacom
  Device           = /dev/ttyS0
  SendCoreEvents   = on
- RawOption        = "ForceDevice" "ISDV4","MultiTouch" "off"
+ RawOption        = "ForceDevice" "ISDV4"
  StylusLink       = Lenovo X61 TABLET PC Stylus (SERIAL)
  EraserLink       = Lenovo X61 TABLET PC Eraser (SERIAL)
+ TouchLink        = Lenovo X61 TABLET PC Touch (SERIAL)
 }
 
 #----------------------------------#
diff --git a/sax/api/data/xapi.gtx b/sax/api/data/xapi.gtx
index ab99cbe..485434a 100644
--- a/sax/api/data/xapi.gtx
+++ b/sax/api/data/xapi.gtx
@@ -952,6 +952,9 @@ AddPen=Add Pen
 # Add Eraser Checkbox
 AddEraser=Add Eraser
 
+# Add Touch Checkbox
+AddTouch=Add Touch
+
 # Add Pad Checkbox
 AddPad=Add Pad
 
@@ -967,6 +970,9 @@ PadProperties=Pad Properties
 # Tab title: Eraser properties
 EraserProperties=Eraser Properties
 
+# Tab title: Touch properties
+TouchProperties=Touch Properties
+
 # Tab text for a touchscreen tab of the touchscreen dialog
 Touchscreen=Touchscreen %1
 
diff --git a/sax/api/tablet.cpp b/sax/api/tablet.cpp
index 8716ef0..5e16248 100644
--- a/sax/api/tablet.cpp
+++ b/sax/api/tablet.cpp
@@ -192,6 +192,9 @@ bool SCCTablet::exportData ( void ) {
 		if (saxTablet.isEraser()) {
 			saxDevice.removeInputDevice (i);
 		}
+		if (saxTablet.isTouch()) {
+			saxDevice.removeInputDevice (i);
+		}
 		if (saxTablet.isPad()) {
 			saxDevice.removeInputDevice (i);
 		}
@@ -263,7 +266,7 @@ bool SCCTablet::exportData ( void ) {
 			} else {
 				saxTablet.setMode ("Absolute");
 			}
-			int sticks[2] = {-1,-1};
+			int sticks[3] = {-1,-1,-1};
 			//====================================
 			// handle Tablet Pen
 			//------------------------------------
@@ -279,6 +282,13 @@ bool SCCTablet::exportData ( void ) {
 				sticks[1] = saxTablet.addPen ( vendor,eraserLink );
 			}
 			//====================================
+			// handle Tablet Touch
+			//------------------------------------
+			if (mTabletPens->hasTouch()) {
+				QString TouchLink = *tabletDict["TouchLink"];
+				sticks[2] = saxTablet.addPen ( vendor,TouchLink );
+			}
+			//====================================
 			// handle Tablet Pad
 			//------------------------------------
 			if (mTabletPens->hasPad()) {
@@ -289,12 +299,13 @@ bool SCCTablet::exportData ( void ) {
 			//====================================
 			// save pen/eraser data
 			//------------------------------------
-			for (int n=0;n<2;n++) {
+			for (int n=0;n<3;n++) {
 			if (sticks[n] > 0) {
 				SCCTabletPenProperty* pen = 0;
 				switch (n) {
 					case 0: pen = mTabletPens->getPenPropertyData();    break;
 					case 1: pen = mTabletPens->getEraserPropertyData(); break;
+					case 2: pen = mTabletPens->getTouchPropertyData();  break;
 				}
 				//====================================
 				// create manipulators... 
diff --git a/sax/api/tablet/tabletpens.cpp b/sax/api/tablet/tabletpens.cpp
index cc4ceba..841e93d 100644
--- a/sax/api/tablet/tabletpens.cpp
+++ b/sax/api/tablet/tabletpens.cpp
@@ -61,6 +61,14 @@ SCCTabletPens::SCCTabletPens (
 		mText["Properties"],mEraserBox
 	);
 	mEraserBox -> setStretchFactor ( mCheckEraser,10 );
+	mTouchBox = new Q3HBox ( mToolGroup );
+	mCheckTouch = new QCheckBox (
+		mText["AddTouch"],mTouchBox
+	);
+	mTouchProperties = new QPushButton (
+		mText["Properties"],mTouchBox
+	);
+	mTouchBox -> setStretchFactor ( mCheckTouch,10 );
 	mPadBox    = new Q3HBox ( mToolGroup );
 	mCheckPad = new QCheckBox (
 		mText["AddPad"],mPadBox
@@ -76,6 +84,9 @@ SCCTabletPens::SCCTabletPens (
 	mEraserPropertyDialog = new SCCTabletPenProperty (
 		text,section,mText["EraserProperties"],0,this
 	);
+	mTouchPropertyDialog = new SCCTabletPenProperty (
+		text,section,mText["TouchProperties"],0,this
+	);
 	mPadPropertyDialog = new SCCTabletPadProperty (
 		text,section,mText["PadProperties"],0,this
 	);
@@ -91,6 +102,10 @@ SCCTabletPens::SCCTabletPens (
 		this              , SLOT   ( slotEraser         ( void ))
 	);
 	QObject::connect (
+		mTouchProperties  , SIGNAL ( clicked            ( void )),
+		this              , SLOT   ( slotTouch          ( void ))
+	);
+	QObject::connect (
 		mCheckPen         , SIGNAL ( clicked            ( void )),
 		this              , SLOT   ( slotActivatePen    ( void ))
 	);
@@ -98,6 +113,10 @@ SCCTabletPens::SCCTabletPens (
 		mCheckEraser      , SIGNAL ( clicked            ( void )),
 		this              , SLOT   ( slotActivateEraser ( void ))
 	);
+	QObject::connect (
+		mCheckTouch       , SIGNAL ( clicked            ( void )),
+		this              , SLOT   ( slotActivateTouch  ( void ))
+	);
 	//=====================================
 	// add widgets to the layout
 	//-------------------------------------
@@ -120,6 +139,7 @@ void SCCTabletPens::init ( void ) {
 	//-------------------------------------
 	int penID    = 0;
 	int eraserID = 0;
+	int touchID  = 0;
 	int padID    = 0;
 	for (int i=SAX_CORE_POINTER;i<mSection["Pointers"]->getCount();i+=2) {
 		if (mSaxTablet->selectPointer (i)) {
@@ -129,6 +149,9 @@ void SCCTabletPens::init ( void ) {
 		if (mSaxTablet->isEraser()) {
 			eraserID = i;
 		}
+		if (mSaxTablet->isTouch()) {
+			touchID = i;
+		}
 		if (mSaxTablet->isPad()) {
 			padID = i;
 		}
@@ -141,6 +164,8 @@ void SCCTabletPens::init ( void ) {
 	mPenPropertyDialog    -> init();
 	mEraserPropertyDialog -> setID ( eraserID );
 	mEraserPropertyDialog -> init();
+	mTouchPropertyDialog  -> setID ( touchID );
+	mTouchPropertyDialog  -> init();
 	mPadPropertyDialog    -> setID ( padID );
 
 	//====================================
@@ -148,6 +173,7 @@ void SCCTabletPens::init ( void ) {
 	//------------------------------------
 	mPenProperties    -> setDisabled ( true );
 	mEraserProperties -> setDisabled ( true );
+	mTouchProperties  -> setDisabled ( true );
 }
 //====================================
 // import
@@ -208,6 +234,10 @@ void SCCTabletPens::import ( void ) {
 		mCheckEraser -> setChecked ( true );
 		slotActivateEraser();
 	} 
+	if (mTouchPropertyDialog -> getID() > 0) {
+		mCheckTouch -> setChecked ( true );
+		slotActivateTouch();
+	} 
 	if (mPadPropertyDialog -> getID() > 0) {
 		mCheckPad -> setChecked ( true );
 	}
@@ -220,6 +250,9 @@ void SCCTabletPens::import ( void ) {
 	if (mEraserPropertyDialog -> getID() > 0) {
 		mEraserPropertyDialog -> import();
 	}
+	if (mTouchPropertyDialog -> getID() > 0) {
+		mTouchPropertyDialog -> import();
+	}
 }
 //====================================
 // hasPen
@@ -234,6 +267,12 @@ bool SCCTabletPens::hasEraser ( void ) {
 	return mCheckEraser->isChecked();
 }
 //====================================
+// hasTouch
+//------------------------------------
+bool SCCTabletPens::hasTouch ( void ) {
+	return mCheckTouch->isChecked();
+}
+//====================================
 // hasPad
 //------------------------------------
 bool SCCTabletPens::hasPad ( void ) {
@@ -275,6 +314,18 @@ void SCCTabletPens::slotTablet (
 		hasEraser = true;
 	}
 	//====================================
+	// check for touch support
+	//------------------------------------
+	bool hasTouch = false;
+	mTouchBox -> setDisabled ( true );
+	if (tabletDict["TouchLink"]) {
+		mTouchPropertyDialog -> setupPen ( vendor, *tabletDict["TouchLink"] );
+		mTouchBox -> setDisabled ( false );
+		mCheckTouch -> setChecked ( false );
+		slotActivateTouch();
+		hasTouch = true;
+	}
+	//====================================
 	// check for pad support
 	//------------------------------------
 	bool hasPad = false;
@@ -294,16 +345,22 @@ void SCCTabletPens::slotTablet (
 	}
 }
 //====================================
+// slotPen
+//------------------------------------
+void SCCTabletPens::slotPen ( void ) {
+	mPenPropertyDialog -> show();
+}
+//====================================
 // slotEraser
 //------------------------------------
 void SCCTabletPens::slotEraser ( void ) {
 	mEraserPropertyDialog -> show();
 }
 //====================================
-// slotPen
+// slotTouch
 //------------------------------------
-void SCCTabletPens::slotPen ( void ) {
-	mPenPropertyDialog -> show();
+void SCCTabletPens::slotTouch ( void ) {
+	mTouchPropertyDialog -> show();
 }
 //====================================
 // slotActivatePen
@@ -324,6 +381,15 @@ void SCCTabletPens::slotActivateEraser ( void ) {
 	}
 }
 //====================================
+// slotActivateTouch
+//------------------------------------
+void SCCTabletPens::slotActivateTouch ( void ) {
+	mTouchProperties -> setDisabled ( true );
+	if (mCheckTouch->isChecked()) {
+		mTouchProperties -> setDisabled ( false );
+	}
+}
+//====================================
 // getPenPropertyData
 //------------------------------------
 SCCTabletPenProperty* SCCTabletPens::getPenPropertyData ( void ) {
@@ -335,4 +401,10 @@ SCCTabletPenProperty* SCCTabletPens::getPenPropertyData ( void ) {
 SCCTabletPenProperty* SCCTabletPens::getEraserPropertyData ( void ) {
 	return mEraserPropertyDialog;
 }
+//====================================
+// getTouchPropertyData
+//------------------------------------
+SCCTabletPenProperty* SCCTabletPens::getTouchPropertyData ( void ) {
+	return mTouchPropertyDialog;
+}
 } // end namespace
diff --git a/sax/api/tablet/tabletpens.h b/sax/api/tablet/tabletpens.h
index 54f8c60..25a5a8b 100644
--- a/sax/api/tablet/tabletpens.h
+++ b/sax/api/tablet/tabletpens.h
@@ -62,23 +62,29 @@ class SCCTabletPens : public SCCDialog {
 	private:
 	Q3HBox*                mPenBox;
 	Q3HBox*                mEraserBox;
+	Q3HBox*                mTouchBox;
 	Q3HBox*                mPadBox;
 	Q3ButtonGroup*         mToolGroup;
 	QCheckBox*            mCheckPen;
 	QCheckBox*            mCheckEraser;
+	QCheckBox*            mCheckTouch;
 	QCheckBox*            mCheckPad;
 	QPushButton*          mPenProperties;
 	QPushButton*          mEraserProperties;
+	QPushButton*          mTouchProperties;
 	SCCTabletPenProperty* mPenPropertyDialog;
 	SCCTabletPenProperty* mEraserPropertyDialog;
+	SCCTabletPenProperty* mTouchPropertyDialog;
 	SCCTabletPadProperty* mPadPropertyDialog;
 
 	public:
 	bool hasPen    ( void );
 	bool hasEraser ( void );
+	bool hasTouch  ( void );
 	bool hasPad    ( void );
 	SCCTabletPenProperty* getPenPropertyData    ( void );
 	SCCTabletPenProperty* getEraserPropertyData ( void );
+	SCCTabletPenProperty* getTouchPropertyData  ( void );
 
 	public:
 	void init   ( void );
@@ -88,7 +94,9 @@ class SCCTabletPens : public SCCDialog {
 	void slotTablet ( const QString&,const QString& );
 	void slotActivatePen ( void );
 	void slotActivateEraser ( void );
+	void slotActivateTouch ( void );
 	void slotEraser ( void );
+	void slotTouch  ( void );
 	void slotPen    ( void );
 
 	public:
diff --git a/sax/libsax/device.cpp b/sax/libsax/device.cpp
index b3710fe..4f9a3e3 100644
--- a/sax/libsax/device.cpp
+++ b/sax/libsax/device.cpp
@@ -175,6 +175,7 @@ int SaXManipulateDevices::addInputDevice (const char* fashion) {
 		(inputFashion != SAX_INPUT_TOUCHPANEL) &&
 		(inputFashion != SAX_INPUT_TABLET)     &&
 		(inputFashion != SAX_INPUT_PEN)        &&
+		(inputFashion != SAX_INPUT_TOUCH)      &&
 		(inputFashion != SAX_INPUT_PAD)        &&
 		(inputFashion != SAX_INPUT_ERASER)     &&
 		(inputFashion != SAX_INPUT_MOUSE)      &&
diff --git a/sax/libsax/device.h b/sax/libsax/device.h
index 0fa60b1..c00a942 100644
--- a/sax/libsax/device.h
+++ b/sax/libsax/device.h
@@ -35,6 +35,7 @@ namespace SaX {
 #define SAX_INPUT_PEN         "Pen"
 #define SAX_INPUT_PAD         "Pad"
 #define SAX_INPUT_ERASER      "Eraser"
+#define SAX_INPUT_TOUCH       "Touch"
 #define SAX_INPUT_MOUSE       "Mouse"
 #define SAX_INPUT_VNC         "VNC"
 #define SAX_INPUT_KEYBOARD    "Keyboard"
diff --git a/sax/libsax/pointers.cpp b/sax/libsax/pointers.cpp
index 02b728b..a1ac28d 100644
--- a/sax/libsax/pointers.cpp
+++ b/sax/libsax/pointers.cpp
@@ -537,6 +537,8 @@ bool SaXManipulateMice::isMouse (void) {
 	if ((fashion != "Tablet")     &&
 		(fashion != "Pen")        &&
 		(fashion != "Eraser")     &&
+		(fashion != "Touch")      &&
+		(fashion != "Pad")        &&
 		(fashion != "VNC")        &&
 		(fashion != "Keyboard")   &&
 		(fashion != "Touchpanel")
@@ -942,6 +944,25 @@ bool SaXManipulateTablets::isEraser (void) {
 }
 
 //====================================
+// isTouch
+//------------------------------------
+bool SaXManipulateTablets::isTouch (void) {
+	// .../
+	//! check if the current device is a tablet touch device.
+	//! This is done by checking the InputFashion
+	//! parameter.
+	// ----
+	if (! mImport) {
+		return false;
+	}
+	QString fashion = mImport -> getItem ("InputFashion");
+	if (fashion == "Touch") {
+		return true;
+	}
+	return false;
+}
+
+//====================================
 // isPad
 //------------------------------------
 bool SaXManipulateTablets::isPad (void) {
@@ -1413,7 +1434,7 @@ int SaXManipulateTablets::addPen (const QString& group) {
 		qError (errorString(),EXC_POINTERFASHIONTYPEFAILED);
 		return -1;
 	}
-	if ((*type != "stylus") && (*type != "eraser")) {
+	if ((*type != "stylus") && (*type != "eraser") && (*type != "touch")) {
 		excPointerFashionTypeFailed (*type);
 		qError (errorString(),EXC_POINTERFASHIONTYPEFAILED);
 		return -1;
@@ -1422,6 +1443,9 @@ int SaXManipulateTablets::addPen (const QString& group) {
 	if (*type == "eraser") {
 		fashion = SAX_INPUT_ERASER;
 	}
+	if (*type == "touch") {
+		fashion = SAX_INPUT_TOUCH;
+	}
 	// .../
 	// create new input device for the pen and make
 	// it the current pointer device
@@ -1494,6 +1518,30 @@ int SaXManipulateTablets::removePen ( int id ) {
 }
 
 //====================================
+// removeTouch
+//------------------------------------
+int SaXManipulateTablets::removeTouch ( int id ) {
+	// .../
+	//! remove the Touch located at section ID (id)
+	//! If the InputFashion type is a valid SAX_INPUT_TOUCH
+	//! the method will remove the pointer device and return
+	//! the new current ID
+	// ----
+	if (! selectPointer ( id )) {
+		return -1;
+	}
+	QString fashion (
+		mImport->getItem("InputFashion")
+	);
+	if (fashion != QString(SAX_INPUT_TOUCH)) {
+		excPointerFashionTypeFailed (fashion);
+		qError (errorString(),EXC_POINTERFASHIONTYPEFAILED);
+		return -1;
+	}
+	return mManipInputDevices->removeInputDevice (id);
+}
+
+//====================================
 // removePad
 //------------------------------------
 int SaXManipulateTablets::removePad ( int id ) {
diff --git a/sax/libsax/pointers.h b/sax/libsax/pointers.h
index e744075..59874c3 100644
--- a/sax/libsax/pointers.h
+++ b/sax/libsax/pointers.h
@@ -286,6 +286,7 @@ class SaXManipulateTabletsIF : public SaXManipulatePointers {
 	virtual bool isTablet     ( void ) = 0;
 	virtual bool isPen        ( void ) = 0;
 	virtual bool isEraser     ( void ) = 0;
+	virtual bool isTouch      ( void ) = 0;
 	virtual bool isPad        ( void ) = 0;
 
 	public:
@@ -398,8 +399,9 @@ class SaXManipulateTablets : public SaXManipulateTabletsIF {
 	int  addPen    ( const QString&,const QString& );
 	int  addPad    ( const QString& );
 	int  addPad    ( const QString&,const QString& );
-	int  removePen ( int );
-	int  removePad ( int );
+	int  removePen   ( int );
+	int  removeTouch ( int );
+	int  removePad   ( int );
 
 	public:
 	QString getName   ( void );
@@ -409,6 +411,7 @@ class SaXManipulateTablets : public SaXManipulateTabletsIF {
 	bool isTablet     ( void );
 	bool isPen        ( void );
 	bool isEraser     ( void );
+	bool isTouch      ( void );
 	bool isPad        ( void );
 
 	public:
diff --git a/sax/locale/de/LC_MESSAGES/sax.po b/sax/locale/de/LC_MESSAGES/sax.po
index 217957f..7d31d05 100644
--- a/sax/locale/de/LC_MESSAGES/sax.po
+++ b/sax/locale/de/LC_MESSAGES/sax.po
@@ -171,9 +171,8 @@ msgid "Display %1"
 msgstr "Bildschirm %1"
 
 #. Tab text for a display tab of the mouse dialog
-#, fuzzy
 msgid "Mouse %1"
-msgstr "Maus"
+msgstr "Maus %1"
 
 #. Activate display checkbox, Display=screen
 msgid "Activate This Display"
@@ -912,6 +911,10 @@ msgstr ""
 msgid "CapsLock uses internal capitalization. Shift "
 msgstr "Die Feststelltaste verwendet die interne Großschreibung. Umschalttaste"
 
+#, fuzzy
+msgid " CapsLock."
+msgstr "Tausche ESC und Feststelltaste."
+
 #. XKBFile extension text
 msgid "Space key output nobreakspace at third level."
 msgstr ""
@@ -1358,6 +1361,10 @@ msgstr "Stift hinzufügen"
 msgid "Add Eraser"
 msgstr "Radierer hinzufügen"
 
+#. Add Touch Checkbox
+msgid "Add Touch"
+msgstr "Touchscreen hinzufügen"
+
 #. Add Pad Checkbox
 msgid "Add Pad"
 msgstr "Feld hinzufügen"
@@ -1378,10 +1385,13 @@ msgstr "Feldeigenschaften"
 msgid "Eraser Properties"
 msgstr "Radierereigenschaften"
 
+#. Tab title: Touch properties
+msgid "Touch Properties"
+msgstr "Touchscreen Eigenschaften"
+
 #. Tab text for a touchscreen tab of the touchscreen dialog
-#, fuzzy
 msgid "Touchscreen %1"
-msgstr "Touchscreen"
+msgstr "Touchscreen %1"
 
 #. Activate/Assign touchscreen checkbox
 msgid "Assign a Touchscreen to Display Number %1"
diff --git a/sax/profile/automatic/input/wacom b/sax/profile/automatic/input/wacom
index f6ee154..5fa28dd 100644
--- a/sax/profile/automatic/input/wacom
+++ b/sax/profile/automatic/input/wacom
@@ -58,9 +58,27 @@ ServerLayout -> all -> InputDevice -> [X+4] -> id = Mouse[[X+4]]
 ServerLayout -> all -> InputDevice -> [X+4] -> usage = SendCoreEvents
 
 #====================================
+# Add Touch
+#------------------------------------
+InputDevice -> [X+4] -> Identifier = Mouse[[X+6]]
+InputDevice -> [X+4] -> Driver     = wacom
+InputDevice -> [X+4] -> Option -> InputFashion   = Touch
+InputDevice -> [X+4] -> Option -> Vendor         = WACOM
+InputDevice -> [X+4] -> Option -> Name           = GRAPHIRE v1-4 Eraser __OB__USB__CB__
+InputDevice -> [X+4] -> Option -> Mode           = Absolute
+InputDevice -> [X+4] -> Option -> SendCoreEvents = on
+InputDevice -> [X+4] -> Option -> Type           = touch
+InputDevice -> [X+4] -> Option -> USB            = on
+InputDevice -> [X+4] -> Option -> Protocol       = Auto
+InputDevice -> [X+4] -> Option -> Device         = ${Device}
+
+ServerLayout -> all -> InputDevice -> [X+6] -> id = Mouse[[X+6]]
+ServerLayout -> all -> InputDevice -> [X+6] -> usage = SendCoreEvents
+
+#====================================
 # Add pad (ExpressKeys)
 #------------------------------------
-InputDevice -> [X+6] -> Identifier = Mouse[[X+6]]
+InputDevice -> [X+6] -> Identifier = Mouse[[X+8]]
 InputDevice -> [X+6] -> Driver     = wacom
 InputDevice -> [X+6] -> Option -> InputFashion   = Pad
 InputDevice -> [X+6] -> Option -> Vendor         = WACOM
@@ -69,5 +87,5 @@ InputDevice -> [X+6] -> Option -> Type           = pad
 InputDevice -> [X+6] -> Option -> USB            = on
 InputDevice -> [X+6] -> Option -> Device         = ${Device}
 
-ServerLayout -> all -> InputDevice -> [X+6] -> id = Mouse[[X+6]]
-ServerLayout -> all -> InputDevice -> [X+6] -> usage = none
+ServerLayout -> all -> InputDevice -> [X+8] -> id = Mouse[[X+8]]
+ServerLayout -> all -> InputDevice -> [X+8] -> usage = none
