From: Egbert Eich <eich@suse.com>
Date: Fri Feb 7 23:06:26 2014 +0100
Subject: [PATCH 1/4]Add option to enable logging
Patch-Mainline: never
Git-commit: 9717547311abfe18b7edad9e0b45f16b902e2f2d
Git-repo: git://linuxwacom.git.sourceforge.net/gitroot/linuxwacom/xf86-input-wacom
References: FATE#
Signed-off-by: Egbert Eich <eich@suse.com>

This patch adds an option to set a bitmask marking events to be logged
to the Xserver log file.
Currently the list contains the following bits:
 PROXIMITY low level event  1
 PRESSURE low level event   2
 BUTTON high level event    7

Signed-off-by: Egbert Eich <eich@suse.com>
---
 configure.ac               | 11 +++++++++++
 include/wacom-properties.h |  9 +++++++++
 man/wacom.man              | 19 +++++++++++++++++++
 man/xsetwacom.man          | 19 ++++++++++++++++++-
 src/wcmCommon.c            | 35 +++++++++++++++++++++++++++++++++++
 src/wcmConfig.c            |  4 ++++
 src/wcmUSB.c               | 25 +++++++++++++++++++++++++
 src/wcmXCommand.c          | 22 +++++++++++++++++++++-
 src/xf86Wacom.h            | 22 ++++++++++++++++++++++
 src/xf86WacomDefs.h        |  4 +++-
 tools/xsetwacom.c          | 10 ++++++++++
 11 files changed, 177 insertions(+), 3 deletions(-)

Index: xf86-input-wacom-0.34.2/configure.ac
===================================================================
--- xf86-input-wacom-0.34.2.orig/configure.ac
+++ xf86-input-wacom-0.34.2/configure.ac
@@ -87,6 +87,17 @@ if test "x$DEBUGGING" = xyes; then
        AC_DEFINE(DEBUG, 1, [Enable debugging code])
 fi
 
+# Define a configure option for event logging
+AC_ARG_ENABLE(logging,
+              AS_HELP_STRING([--enable-logging],
+                             [Enable logging (default: disabled)]),
+                             [LOGGING=$enableval], [LOGGING=yes])
+
+# Define the C preprocessor macro LOGGING in config.h
+if test "x$LOGGING" = xyes; then
+       AC_DEFINE(LOGGING, 1, [Enable logging code])
+fi
+
 # Define a configure option for an alternate input module directory
 AC_ARG_WITH(xorg-module-dir,
             AS_HELP_STRING([--with-xorg-module-dir=DIR],
Index: xf86-input-wacom-0.34.2/include/wacom-properties.h
===================================================================
--- xf86-input-wacom-0.34.2.orig/include/wacom-properties.h
+++ xf86-input-wacom-0.34.2/include/wacom-properties.h
@@ -111,6 +111,15 @@
 */
 #define WACOM_PROP_PRESSURE_RECAL "Wacom Pressure Recalibration"
 
+/* 8 bit, values:
+  Type                       bit
+  PROXIMITY_LOW_LEVEL event  1
+  PRESSURE_LOW_LEVEL event   2
+  BUTTON_HIGH_LEVEL event    7
+  Log event of the types specified in the type mask.
+*/
+#define WACOM_PROP_LOGMASK "Wacom Log Mask"
+
 /* The following are tool types used by the driver in WACOM_PROP_TOOL_TYPE
  * or in the 'type' field for XI1 clients. Clients may check for one of
  * these types to identify tool types.
Index: xf86-input-wacom-0.34.2/man/wacom.man
===================================================================
--- xf86-input-wacom-0.34.2.orig/man/wacom.man
+++ xf86-input-wacom-0.34.2/man/wacom.man
@@ -269,6 +269,25 @@ initial pressure reading may be unequal
 good pen. If the consecutive pressure readings are not higher than
 the initial pressure by a threshold no button event will be generated.
 This option allows to disable the recalibration.
+.TP 4
+.B Option \fI"LogMask" \fI"number"\fP
+bitmask that enables logging of a group of events.
+.RS
+.PD 0
+.TP
+Bit
+Event
+.TP
+0
+proximity low level
+.TP
+1
+pressure low level
+.TP
+7
+button high level
+.PD
+
 .RE
 .SH "TOUCH GESTURES"
 .SS Single finger (1FG)
Index: xf86-input-wacom-0.34.2/man/xsetwacom.man
===================================================================
--- xf86-input-wacom-0.34.2.orig/man/xsetwacom.man
+++ xf86-input-wacom-0.34.2/man/xsetwacom.man
@@ -273,7 +273,24 @@ initial pressure reading may be unequal
 good pen. If the consecutive pressure readings are not higher than
 the initial pressure by a threshold no button event will be generated.
 This option allows to disable the recalibration.  Default:  on
-
+.TP
+\fBLogMask\fR mask
+bitmask that enables logging of a group of events.
+.RS
+.PD 0
+.TP
+Bit
+Event
+.TP
+0
+proximity low level
+.TP
+1
+pressure low level
+.TP
+7
+button high level
+.PD
 
 .SH "AUTHORS"
 Peter Hutterer <peter.hutterer@redhat.com>
Index: xf86-input-wacom-0.34.2/src/wcmCommon.c
===================================================================
--- xf86-input-wacom-0.34.2.orig/src/wcmCommon.c
+++ xf86-input-wacom-0.34.2/src/wcmCommon.c
@@ -27,6 +27,9 @@
 #include "wcmTouchFilter.h"
 #include <xkbsrv.h>
 #include <xf86_OSproc.h>
+#ifdef LOGGING
+#include <time.h>
+#endif
 
 
 struct _WacomDriverRec WACOM_DRIVER = {
@@ -89,6 +92,35 @@ void set_absolute(InputInfoPtr pInfo, Bo
 		priv->flags &= ~ABSOLUTE_FLAG;
 }
 
+#ifdef LOGGING
+void wcm_timestr(char *str, int str_n)
+{
+	struct timespec tp;
+	struct tm tm;
+	static char wday_name[7][3] = {
+			"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+	};
+	static char mon_name[12][3] = {
+			"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+			"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+	};
+
+	str[0] = '\0';
+	if (clock_gettime(CLOCK_REALTIME, &tp) < 0)
+		return;
+	localtime_r(&tp.tv_sec, &tm);
+
+	snprintf(str, str_n, " %.3s %.3s%3d %.2d:%.2d:%.2d.%.6d - ",
+		 wday_name[tm.tm_wday],
+		 mon_name[tm.tm_mon],
+		 tm.tm_mday, tm.tm_hour,
+		 tm.tm_min, tm.tm_sec, (int)tp.tv_nsec);
+
+	return;
+
+}
+#endif
+
 /*****************************************************************************
  * wcmSendButtons --
  *   Send button events by comparing the current button mask with the
@@ -1469,6 +1501,9 @@ WacomCommonPtr wcmNewCommon(void)
 	common->wcmRawSample = DEFAULT_SAMPLES;
 			/* number of raw data to be used to for filtering */
 	common->wcmPressureRecalibration = 1;
+#ifdef LOGGING
+	common->LogMask = 0;
+#endif
 	return common;
 }
 
Index: xf86-input-wacom-0.34.2/src/wcmConfig.c
===================================================================
--- xf86-input-wacom-0.34.2.orig/src/wcmConfig.c
+++ xf86-input-wacom-0.34.2/src/wcmConfig.c
@@ -646,6 +646,10 @@ static int wcmPreInit(InputDriverPtr drv
 
 	common->debugLevel = xf86SetIntOption(pInfo->options,
 					      "CommonDBG", common->debugLevel);
+#ifdef LOGGING
+	common->LogMask = xf86SetIntOption(pInfo->options,
+					   "LogMask", common->LogMask);
+#endif
 	oldname = strdup(pInfo->name);
 
 	if (wcmIsHotpluggedDevice(pInfo))
Index: xf86-input-wacom-0.34.2/src/wcmUSB.c
===================================================================
--- xf86-input-wacom-0.34.2.orig/src/wcmUSB.c
+++ xf86-input-wacom-0.34.2/src/wcmUSB.c
@@ -1138,6 +1138,31 @@ static int usbIdToType(int id)
 	return type;
 }
 
+#ifdef LOGGING
+/**
+ * Return type name string.
+ * @param type
+ * @return string
+ */
+static const char *usbTypeName(unsigned long type)
+{
+	switch (type) {
+	case STYLUS_ID:
+		return "PEN";
+	case ERASER_ID:
+		return "RUBBER";
+	case CURSOR_ID:
+		return "MOUSE";
+	case TOUCH_ID:
+		return "TOUCH";
+	case PAD_ID:
+		return "PAD";
+	default:
+		return "UNKNOWN";
+	}
+}
+#endif
+
 /**
  * Find the tool type (STYLUS_ID, etc.) based on the device_id.
  *
Index: xf86-input-wacom-0.34.2/src/wcmXCommand.c
===================================================================
--- xf86-input-wacom-0.34.2.orig/src/wcmXCommand.c
+++ xf86-input-wacom-0.34.2/src/wcmXCommand.c
@@ -99,6 +99,9 @@ static Atom prop_tooltype;
 static Atom prop_btnactions;
 static Atom prop_product_id;
 static Atom prop_pressure_recal;
+#ifdef LOGGING
+static Atom prop_logmask;
+#endif
 #ifdef DEBUG
 static Atom prop_debuglevels;
 #endif
@@ -337,7 +340,10 @@ void InitWcmDeviceProperties(InputInfoPt
 	values[0] = common->vendor_id;
 	values[1] = common->tablet_id;
 	prop_product_id = InitWcmAtom(pInfo->dev, XI_PROP_PRODUCT_ID, XA_INTEGER, 32, 2, values);
-
+#ifdef LOGGING
+	values[0] = common->LogMask;
+	prop_logmask = InitWcmAtom(pInfo->dev, WACOM_PROP_LOGMASK, XA_INTEGER, 8, 1, values);
+#endif
 #ifdef DEBUG
 	values[0] = priv->debugLevel;
 	values[1] = common->debugLevel;
@@ -951,6 +957,20 @@ int wcmSetProperty(DeviceIntPtr dev, Ato
 			common->debugLevel = values[1];
 		}
 #endif
+#ifdef LOGGING
+	} else if (property == prop_logmask) {
+		CARD8 *values;
+
+		if (prop->size != 1 || prop->format != 8)
+			return BadMatch;
+
+		values = (CARD8*)prop->data;
+
+		if (!checkonly)
+		{
+			common->LogMask = values[0];
+		}
+#endif
 	} else if (property == prop_btnactions)
 	{
 		int nbuttons = priv->nbuttons < 4 ? priv->nbuttons : priv->nbuttons + 4;
Index: xf86-input-wacom-0.34.2/src/xf86Wacom.h
===================================================================
--- xf86-input-wacom-0.34.2.orig/src/xf86Wacom.h
+++ xf86-input-wacom-0.34.2/src/xf86Wacom.h
@@ -69,6 +69,28 @@
 #define DBG(lvl, priv, ...)
 #endif
 
+#ifdef LOG
+#undef LOG
+#endif
+#ifdef LOGGING
+void wcm_timestr(char *str, int str_n);
+#define DO_LOG(m, v) (m->LogMask & v)
+#define LOG(m, v, f, ...) do {			\
+	if (DO_LOG(m, v)) { \
+		char tstr[30]; \
+		wcm_timestr(tstr, sizeof(tstr));	\
+		LogMessageVerbSigSafe(X_NONE, -1, "[LOG]%s " f, tstr, __VA_ARGS__); \
+	} \
+} while (0)
+#define LOG_PROXIMITY_LOW 1 << 0
+#define LOG_PRESSURE_LOW  1 << 1
+#define LOG_BUTTON_HIGH   1 << 7
+#else
+#define DO_LOG(m, v) (0)
+#define LOG(m, v, f, ...) do {			\
+	} while (0)
+#endif
+
 /******************************************************************************
  * WacomModule - all globals are packed in a single structure to keep the
  *               global namespaces as clean as possible.
Index: xf86-input-wacom-0.34.2/src/xf86WacomDefs.h
===================================================================
--- xf86-input-wacom-0.34.2.orig/src/xf86WacomDefs.h
+++ xf86-input-wacom-0.34.2/src/xf86WacomDefs.h
@@ -460,7 +460,9 @@ struct _WacomCommonRec
 	int wcmRawSample;	     /* Number of raw data used to filter an event */
 	int wcmPressureRecalibration; /* Determine if pressure recalibration of
 					 worn pens should be performed */
-
+#ifdef LOGGING
+	int LogMask;		     /* Mask to determine which event types to log. */
+#endif
 	int bufpos;                        /* position with buffer */
 	unsigned char buffer[BUFFER_SIZE]; /* data read from device */
 
Index: xf86-input-wacom-0.34.2/tools/xsetwacom.c
===================================================================
--- xf86-input-wacom-0.34.2.orig/tools/xsetwacom.c
+++ xf86-input-wacom-0.34.2/tools/xsetwacom.c
@@ -158,6 +158,16 @@ static param_t parameters[] =
 		.arg_count = 1,
 	},
 	{
+		.name = "LogMask",
+		.desc = "Mask whose bits determine which events to log: "
+		"0  PROXIMITY event, 1  BUTTON event, 2  MOTION event, "
+		"3  PRESSURE event",
+		.prop_name = WACOM_PROP_LOGMASK,
+		.prop_format = 8,
+		.prop_offset = 0,
+		.arg_count = 1,
+	},
+	{
 		.name = "Suppress",
 		.x11name = "Suppress",
 		.desc = "Number of points trimmed (default is 2). ",
@@ -2974,7 +2984,7 @@ static void test_parameter_number(void)
 	 * deprecated them.
 	 * Numbers include trailing NULL entry.
 	 */
-	assert(ARRAY_SIZE(parameters) == 39);
+	assert(ARRAY_SIZE(parameters) == 40);
 	assert(ARRAY_SIZE(deprecated_parameters) == 17);
 }
 
