Hi, Rename src/wcmXCommand.c -> src/wcmProperties.c as per "the approved guidelines" ;-)
-- Przemo
>From cd7683d5df5b9c4308013d52699174528a4246c0 Mon Sep 17 00:00:00 2001 From: Przemo Firszt <[email protected]> Date: Wed, 23 Dec 2009 15:28:39 +0000 Subject: [PATCH 2/2] Rename src/wcmXCommand.c -> src/wcmProperties.c --- src/Makefile.am | 2 +- src/wcmProperties.c | 739 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/wcmXCommand.c | 739 --------------------------------------------------- src/xf86Wacom.h | 2 +- 4 files changed, 741 insertions(+), 741 deletions(-) create mode 100644 src/wcmProperties.c delete mode 100644 src/wcmXCommand.c diff --git a/src/Makefile.am b/src/Makefile.am index 461089f..edb8fc3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -35,6 +35,6 @@ INCLUDES=-I$(top_srcdir)/include/ @driver_n...@_drv_la_sources = xf86Wacom.c xf86Wacom.h \ wcmCommon.c wcmConfig.c wcmISDV4.c \ wcmFilter.c wcmFilter.h xf86WacomDefs.h \ - wcmTilt2Rotation.c wcmUSB.c wcmXCommand.c \ + wcmTilt2Rotation.c wcmUSB.c wcmProperties.c \ wcmValidateDevice.c wcmTouchFilter.c diff --git a/src/wcmProperties.c b/src/wcmProperties.c new file mode 100644 index 0000000..f1abc72 --- /dev/null +++ b/src/wcmProperties.c @@ -0,0 +1,739 @@ +/* + * Copyright 2007-2009 by Ping Cheng, Wacom Technology. <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include <wacom-properties.h> + +#include "xf86Wacom.h" +#include "wcmFilter.h" + +extern void xf86WcmInitialCoordinates(LocalDevicePtr local, int axes); +extern void wcmRotateTablet(LocalDevicePtr local, int value); +extern void wcmInitialScreens(LocalDevicePtr local); + +int xf86WcmDevSwitchModeCall(LocalDevicePtr local, int mode); +int xf86WcmDevSwitchMode(ClientPtr client, DeviceIntPtr dev, int mode); +void xf86WcmChangeScreen(LocalDevicePtr local, int value); + +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3 + int xf86WcmSetProperty(DeviceIntPtr dev, Atom property, + XIPropertyValuePtr prop, BOOL checkonly); + void InitWcmDeviceProperties(LocalDevicePtr local); +#endif + +/***************************************************************************** + * xf86WcmSetPadCoreMode + ****************************************************************************/ + +int xf86WcmSetPadCoreMode(LocalDevicePtr local) +{ + WacomDevicePtr priv = (WacomDevicePtr)local->private; + int is_core = local->flags & (XI86_ALWAYS_CORE | XI86_CORE_POINTER); + + /* Pad is always in relative mode when it's a core device. + * Always in absolute mode when it is not a core device. + */ + DBG(10, priv, "%p" + " is always in %s mode when it %s core device\n", + (void *)local->dev, + !is_core ? "absolute" : "relative", + is_core ? "is" : "isn't"); + if (is_core) + priv->flags &= ~ABSOLUTE_FLAG; + else + priv->flags |= ABSOLUTE_FLAG; + return Success; +} + +/***************************************************************************** +* xf86WcmDevSwitchModeCall -- +*****************************************************************************/ + +int xf86WcmDevSwitchModeCall(LocalDevicePtr local, int mode) +{ + WacomDevicePtr priv = (WacomDevicePtr)local->private; + int is_absolute = priv->flags & ABSOLUTE_FLAG; + + DBG(3, priv, "to mode=%d\n", mode); + + /* Pad is always in relative mode when it's a core device. + * Always in absolute mode when it is not a core device. + */ + if (IsPad(priv)) + return xf86WcmSetPadCoreMode(local); + + if ((mode == Absolute) && !is_absolute) + { + priv->flags |= ABSOLUTE_FLAG; + xf86ReplaceStrOption(local->options, "Mode", "Absolute"); + xf86WcmInitialCoordinates(local, 0); + xf86WcmInitialCoordinates(local, 1); + } + else if ((mode == Relative) && is_absolute) + { + priv->flags &= ~ABSOLUTE_FLAG; + xf86ReplaceStrOption(local->options, "Mode", "Relative"); + xf86WcmInitialCoordinates(local, 0); + xf86WcmInitialCoordinates(local, 1); + } + else if ( (mode != Absolute) && (mode != Relative)) + { + DBG(10, priv, "invalid mode=%d\n", mode); + return BadMatch; + } + + return Success; +} + +/***************************************************************************** +* xf86WcmDevSwitchMode -- +*****************************************************************************/ + +int xf86WcmDevSwitchMode(ClientPtr client, DeviceIntPtr dev, int mode) +{ + LocalDevicePtr local = (LocalDevicePtr)dev->public.devicePrivate; +#ifdef DEBUG + WacomDevicePtr priv = (WacomDevicePtr)local->private; + + DBG(3, priv, "dev=%p mode=%d\n", + (void *)dev, mode); +#endif + /* Share this call with sendAButton in wcmCommon.c */ + return xf86WcmDevSwitchModeCall(local, mode); +} + +/***************************************************************************** + * xf86WcmChangeScreen + ****************************************************************************/ + +void xf86WcmChangeScreen(LocalDevicePtr local, int value) +{ + WacomDevicePtr priv = (WacomDevicePtr)local->private; + + if (priv->screen_no != value) + { + priv->screen_no = value; + xf86ReplaceIntOption(local->options, "ScreenNo", value); + } + + if (priv->screen_no != -1) + priv->currentScreen = priv->screen_no; + wcmInitialScreens(local); + xf86WcmInitialCoordinates(local, 0); + xf86WcmInitialCoordinates(local, 1); +} + +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3 + +Atom prop_rotation; +Atom prop_tablet_area; +Atom prop_screen_area; +Atom prop_pressurecurve; +Atom prop_serials; +Atom prop_strip_buttons; +Atom prop_wheel_buttons; +Atom prop_display; +Atom prop_tv_resolutions; +Atom prop_screen; +Atom prop_cursorprox; +Atom prop_capacity; +Atom prop_threshold; +Atom prop_suppress; +Atom prop_touch; +Atom prop_hover; +Atom prop_tooltype; +Atom prop_btnactions; +#ifdef DEBUG +Atom prop_debuglevels; +#endif + +/* Special case: format -32 means type is XA_ATOM */ +static Atom InitWcmAtom(DeviceIntPtr dev, char *name, int format, int nvalues, int *values) +{ + int i; + Atom atom; + uint8_t val_8[WCM_MAX_MOUSE_BUTTONS]; + uint16_t val_16[WCM_MAX_MOUSE_BUTTONS]; + uint32_t val_32[WCM_MAX_MOUSE_BUTTONS]; + pointer converted = val_32; + Atom type = XA_INTEGER; + + if (format == -32) + { + type = XA_ATOM; + format = 32; + } + + for (i = 0; i < nvalues; i++) + { + switch(format) + { + case 8: val_8[i] = values[i]; break; + case 16: val_16[i] = values[i]; break; + case 32: val_32[i] = values[i]; break; + } + } + + switch(format) + { + case 8: converted = val_8; break; + case 16: converted = val_16; break; + case 32: converted = val_32; break; + } + + atom = MakeAtom(name, strlen(name), TRUE); + XIChangeDeviceProperty(dev, atom, type, format, + PropModeReplace, nvalues, + converted, FALSE); + XISetDevicePropertyDeletable(dev, atom, FALSE); + return atom; +} + +void InitWcmDeviceProperties(LocalDevicePtr local) +{ + WacomDevicePtr priv = (WacomDevicePtr) local->private; + WacomCommonPtr common = priv->common; + int values[WCM_MAX_MOUSE_BUTTONS]; + + DBG(10, priv, "\n"); + + values[0] = priv->topX; + values[1] = priv->topY; + values[2] = priv->bottomX; + values[3] = priv->bottomY; + prop_tablet_area = InitWcmAtom(local->dev, WACOM_PROP_TABLET_AREA, 32, 4, values); + + values[0] = common->wcmRotate; + prop_rotation = InitWcmAtom(local->dev, WACOM_PROP_ROTATION, 8, 1, values); + + values[0] = 0; + values[1] = 0; + values[2] = 100; + values[3] = 100; + prop_pressurecurve = InitWcmAtom(local->dev, WACOM_PROP_PRESSURECURVE, 32, 4, values); + + values[0] = common->tablet_id; + values[1] = priv->old_serial; + values[2] = priv->old_device_id; + values[3] = priv->serial; + prop_serials = InitWcmAtom(local->dev, WACOM_PROP_SERIALIDS, 32, 4, values); + + values[0] = priv->striplup; + values[1] = priv->stripldn; + values[2] = priv->striprup; + values[3] = priv->striprdn; + prop_strip_buttons = InitWcmAtom(local->dev, WACOM_PROP_STRIPBUTTONS, 8, 4, values); + + values[0] = priv->relup; + values[1] = priv->reldn; + values[2] = priv->wheelup; + values[3] = priv->wheeldn; + prop_wheel_buttons = InitWcmAtom(local->dev, WACOM_PROP_WHEELBUTTONS, 8, 4, values); + + values[0] = priv->tvResolution[0]; + values[1] = priv->tvResolution[1]; + values[2] = priv->tvResolution[2]; + values[3] = priv->tvResolution[3]; + prop_tv_resolutions = InitWcmAtom(local->dev, WACOM_PROP_TWINVIEW_RES, 32, 4, values); + + + values[0] = priv->screen_no; + values[1] = priv->twinview; + values[2] = priv->wcmMMonitor; + prop_display = InitWcmAtom(local->dev, WACOM_PROP_DISPLAY_OPTS, 8, 3, values); + + values[0] = priv->screenTopX[priv->currentScreen]; + values[1] = priv->screenTopY[priv->currentScreen]; + values[2] = priv->screenBottomX[priv->currentScreen]; + values[3] = priv->screenBottomY[priv->currentScreen]; + prop_screen = InitWcmAtom(local->dev, WACOM_PROP_SCREENAREA, 32, 4, values); + + values[0] = common->wcmCursorProxoutDist; + prop_cursorprox = InitWcmAtom(local->dev, WACOM_PROP_PROXIMITY_THRESHOLD, 32, 1, values); + + values[0] = common->wcmCapacity; + prop_capacity = InitWcmAtom(local->dev, WACOM_PROP_CAPACITY, 32, 1, values); + + values[0] = (!common->wcmMaxZ) ? 0 : common->wcmThreshold; + prop_threshold = InitWcmAtom(local->dev, WACOM_PROP_PRESSURE_THRESHOLD, 32, 1, values); + + values[0] = common->wcmSuppress; + values[1] = common->wcmRawSample; + prop_suppress = InitWcmAtom(local->dev, WACOM_PROP_SAMPLE, 32, 2, values); + + values[0] = common->wcmTouch; + prop_touch = InitWcmAtom(local->dev, WACOM_PROP_TOUCH, 8, 1, values); + + values[0] = !common->wcmTPCButton; + prop_hover = InitWcmAtom(local->dev, WACOM_PROP_HOVER, 8, 1, values); + + + values[0] = MakeAtom(local->type_name, strlen(local->type_name), TRUE); + prop_tooltype = InitWcmAtom(local->dev, WACOM_PROP_TOOL_TYPE, -32, 1, values); + + /* default to no actions */ + memset(values, 0, sizeof(values)); + prop_btnactions = InitWcmAtom(local->dev, WACOM_PROP_BUTTON_ACTIONS, -32, WCM_MAX_MOUSE_BUTTONS, values); + +#ifdef DEBUG + values[0] = priv->debugLevel; + values[1] = common->debugLevel; + prop_debuglevels = InitWcmAtom(local->dev, WACOM_PROP_DEBUGLEVELS, 8, 2, values); +#endif +} + +int xf86WcmSetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop, + BOOL checkonly) +{ + LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate; + WacomDevicePtr priv = (WacomDevicePtr) local->private; + WacomCommonPtr common = priv->common; + + DBG(10, priv, "\n"); + + if (property == prop_tablet_area) + { + INT32 *values = (INT32*)prop->data; + WacomToolAreaPtr area = priv->toolarea; + + if (prop->size != 4 || prop->format != 32) + return BadValue; + + /* value validation is unnecessary since we let utility programs, such as + * xsetwacom and userland control panel take care of the validation role. + * when all four values are set to -1, it is an area reset (xydefault) */ + if ((values[0] != -1) || (values[1] != -1) || + (values[2] != -1) || (values[3] != -1)) + { + WacomToolArea tmp_area = *area; + + area->topX = values[0]; + area->topY = values[1]; + area->bottomX = values[2]; + area->bottomY = values[3]; + + /* validate the area */ + if (wcmAreaListOverlap(area, priv->tool->arealist)) + { + *area = tmp_area; + return BadValue; + } + *area = tmp_area; + } + + if (!checkonly) + { + if ((values[0] == -1) && (values[1] == -1) && + (values[2] == -1) && (values[3] == -1)) + { + values[0] = 0; + values[1] = 0; + if (!IsTouch(priv)) + values[2] = common->wcmMaxX; + else + values[2] = common->wcmMaxTouchX; + if (!IsTouch(priv)) + values[3] = common->wcmMaxY; + else + values[3] = common->wcmMaxTouchY; + } + + priv->topX = area->topX = values[0]; + priv->topY = area->topY = values[1]; + priv->bottomX = area->bottomX = values[2]; + priv->bottomY = area->bottomY = values[3]; + xf86WcmInitialCoordinates(local, 0); + xf86WcmInitialCoordinates(local, 1); + } + } else if (property == prop_pressurecurve) + { + INT32 *pcurve; + + if (prop->size != 4 || prop->format != 32) + return BadValue; + + pcurve = (INT32*)prop->data; + + if ((pcurve[0] > 100) || (pcurve[1] > 100) || + (pcurve[2] > 100) || (pcurve[3] > 100)) + return BadValue; + + if (IsCursor(priv) || IsPad (priv) || IsTouch (priv)) + return BadValue; + + if (!checkonly) + wcmSetPressureCurve (priv, pcurve[0], pcurve[1], + pcurve[2], pcurve[3]); + } else if (property == prop_suppress) + { + CARD32 *values; + + if (prop->size != 2 || prop->format != 32) + return BadValue; + + values = (CARD32*)prop->data; + + if ((values[0] < 0) || (values[0] > 100)) + return BadValue; + + if ((values[1] < 0) || (values[1] > XWACOM_MAX_SAMPLES)) + return BadValue; + + if (!checkonly) + { + common->wcmSuppress = values[0]; + common->wcmRawSample = values[1]; + } + } else if (property == prop_rotation) + { + CARD8 value; + if (prop->size != 1 || prop->format != 8) + return BadValue; + + value = *(CARD8*)prop->data; + + if (value > 3) + return BadValue; + + if (!checkonly && common->wcmRotate != value) + wcmRotateTablet(local, value); + } else if (property == prop_serials) + { + return BadValue; /* Read-only */ + } else if (property == prop_strip_buttons) + { + CARD8 *values; + + if (prop->size != 4 || prop->format != 8) + return BadValue; + + values = (CARD8*)prop->data; + + if (values[0] > WCM_MAX_MOUSE_BUTTONS || + values[1] > WCM_MAX_MOUSE_BUTTONS || + values[2] > WCM_MAX_MOUSE_BUTTONS || + values[3] > WCM_MAX_MOUSE_BUTTONS) + return BadValue; + + if (!checkonly) + { + /* FIXME: needs to take AC_* into account */ + priv->striplup = values[0]; + priv->stripldn = values[1]; + priv->striprup = values[2]; + priv->striprdn = values[3]; + } + + } else if (property == prop_wheel_buttons) + { + CARD8 *values; + + if (prop->size != 4 || prop->format != 8) + return BadValue; + + values = (CARD8*)prop->data; + + if (values[0] > WCM_MAX_MOUSE_BUTTONS || + values[1] > WCM_MAX_MOUSE_BUTTONS || + values[2] > WCM_MAX_MOUSE_BUTTONS || + values[3] > WCM_MAX_MOUSE_BUTTONS) + return BadValue; + + if (!checkonly) + { + /* FIXME: needs to take AC_* into account */ + priv->relup = values[0]; + priv->reldn = values[1]; + priv->wheelup = values[2]; + priv->wheeldn = values[3]; + } + } else if (property == prop_screen) + { + /* Long-term, this property should be removed, there's other ways to + * get the screen resolution. For now, we leave it in for backwards + * compat */ + return BadValue; /* Read-only */ + } else if (property == prop_display) + { + INT8 *values; + + if (prop->size != 3 || prop->format != 8) + return BadValue; + + values = (INT8*)prop->data; + + if (values[0] < -1 || values[0] >= priv->numScreen) + return BadValue; + + if (values[1] < TV_NONE || values[1] > TV_MAX) + return BadValue; + + if ((values[2] != 0) && (values[2] != 1)) + return BadValue; + + if (!checkonly) + { + if (priv->screen_no != values[0]) + xf86WcmChangeScreen(local, values[0]); + priv->screen_no = values[0]; + + if (priv->twinview != values[1]) + { + int screen = priv->screen_no; + priv->twinview = values[1]; + + /* Can not restrict the cursor to a particular screen */ + if (!values[1] && (screenInfo.numScreens == 1)) + { + screen = -1; + priv->currentScreen = 0; + DBG(10, priv, "TwinView sets to " + "TV_NONE: can't change screen_no. \n"); + } + xf86WcmChangeScreen(local, screen); + } + + priv->wcmMMonitor = values[2]; + } + } else if (property == prop_cursorprox) + { + CARD32 value; + + if (prop->size != 1 || prop->format != 32) + return BadValue; + + if (!IsCursor (priv)) + return BadValue; + + value = *(CARD32*)prop->data; + + if (value > 255) + return BadValue; + + if (!checkonly) + common->wcmCursorProxoutDist = value; + } else if (property == prop_capacity) + { + INT32 value; + + if (prop->size != 1 || prop->format != 32) + return BadValue; + + value = *(INT32*)prop->data; + + if ((value < -1) || (value > 5)) + return BadValue; + + if (!checkonly) + common->wcmCapacity = value; + + } else if (property == prop_threshold) + { + CARD32 value; + + if (prop->size != 1 || prop->format != 32) + return BadValue; + + value = *(CARD32*)prop->data; + + if ((value < 1) || (value > 21)) + return BadValue; + + if (!checkonly) + common->wcmThreshold = value; + } else if (property == prop_touch) + { + CARD8 *values = (CARD8*)prop->data; + + if (prop->size != 1 || prop->format != 8) + return BadValue; + + if ((values[0] != 0) && (values[0] != 1)) + return BadValue; + + if (!checkonly && common->wcmTouch != values[0]) + common->wcmTouch = values[0]; + } else if (property == prop_hover) + { + CARD8 *values = (CARD8*)prop->data; + + if (prop->size != 1 || prop->format != 8) + return BadValue; + + if ((values[0] != 0) && (values[0] != 1)) + return BadValue; + + if (!checkonly && common->wcmTPCButton != !values[0]) + common->wcmTPCButton = !values[0]; + } else if (property == prop_tv_resolutions) + { + CARD32 *values; + + if (prop->size != 4 || prop->format != 32) + return BadValue; + + values = (CARD32*)prop->data; + + /* non-TwinView settings can not set TwinView RESOLUTION */ + if ((priv->twinview == TV_NONE) || (values[0] < 0) || + (values[1] < 0) || (values[2] < 0) || (values[3] < 0) || + ((values[0] + values[2]) != screenInfo.screens[0]->width) || + ((values[1] + values[3]) != screenInfo.screens[0]->height)) + return BadValue; + + if (!checkonly) + { + priv->tvResolution[0] = values[0]; + priv->tvResolution[1] = values[1]; + priv->tvResolution[2] = values[2]; + priv->tvResolution[3] = values[3]; + + /* reset screen info */ + xf86WcmChangeScreen(local, priv->screen_no); + } +#ifdef DEBUG + } else if (property == prop_debuglevels) + { + CARD8 *values; + + if (prop->size != 2 || prop->format != 8) + return BadMatch; + + values = (CARD8*)prop->data; + if (values[0] > 10 || values[1] > 10) + return BadValue; + + if (!checkonly) + { + priv->debugLevel = values[0]; + common->debugLevel = values[1]; + } +#endif + } else if (property == prop_btnactions) + { + Atom *values; + int i, j; + XIPropertyValuePtr val; + + if (prop->size != WCM_MAX_MOUSE_BUTTONS || prop->format != 32 || + prop->type != XA_ATOM) + return BadMatch; + + /* How this works: + * prop_btnactions has a list of atoms stored. Any atom references + * another property on that device that contains the actual action. + * If this property changes, all action-properties are queried for + * their value and their value is stored in priv->key[button]. + * + * If the button is pressed, the actions are executed. + * + * Any button action property needs to be monitored by this property + * handler too. + */ + + values = (Atom*)prop->data; + + for (i = 0; i < prop->size; i++) + { + if (!values[i]) + continue; + + if (values[i] == property || !ValidAtom(values[i])) + return BadValue; + + if (XIGetDeviceProperty(local->dev, values[i], &val) != Success) + return BadValue; + } + + if (!checkonly) + { + /* any action property needs to be registered for this handler. */ + for (i = 0; i < prop->size; i++) + priv->btn_actions[i] = values[i]; + + for (i = 0; i < prop->size; i++) + { + if (!values[i]) + continue; + + XIGetDeviceProperty(local->dev, values[i], &val); + + memset(priv->keys[i], 0, sizeof(priv->keys[i])); + for (j = 0; j < val->size; j++) + priv->keys[i][j] = ((unsigned int*)val->data)[j]; + } + + } + } else + { + int i, j; + + /* check all properties used for button actions */ + for (i = 0; i < ARRAY_SIZE(priv->btn_actions); i++) + if (priv->btn_actions[i] == property) + break; + + if (i < ARRAY_SIZE(priv->btn_actions)) + { + CARD32 *data; + int code; + int type; + + if (prop->size >= 255 || prop->format != 32 || + prop->type != XA_INTEGER) + return BadMatch; + + data = (CARD32*)prop->data; + + for (j = 0;j < prop->size; j++) + { + code = data[j] & AC_CODE; + type = data[j] & AC_TYPE; + + switch(type) + { + case AC_KEY: + break; + case AC_BUTTON: + if (code > WCM_MAX_MOUSE_BUTTONS) + return BadValue; + break; + case AC_DISPLAYTOGGLE: + case AC_MODETOGGLE: + case AC_DBLCLICK: + break; + default: + return BadValue; + } + + if (!checkonly) + { + memset(priv->keys[i], 0, sizeof(priv->keys[i])); + for (j = 0; j < prop->size; j++) + priv->keys[i][j] = data[j]; + } + } + } + } + + return Success; +} +#endif /* GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3 */ +/* vim: set noexpandtab shiftwidth=8: */ diff --git a/src/wcmXCommand.c b/src/wcmXCommand.c deleted file mode 100644 index f1abc72..0000000 --- a/src/wcmXCommand.c +++ /dev/null @@ -1,739 +0,0 @@ -/* - * Copyright 2007-2009 by Ping Cheng, Wacom Technology. <[email protected]> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include <wacom-properties.h> - -#include "xf86Wacom.h" -#include "wcmFilter.h" - -extern void xf86WcmInitialCoordinates(LocalDevicePtr local, int axes); -extern void wcmRotateTablet(LocalDevicePtr local, int value); -extern void wcmInitialScreens(LocalDevicePtr local); - -int xf86WcmDevSwitchModeCall(LocalDevicePtr local, int mode); -int xf86WcmDevSwitchMode(ClientPtr client, DeviceIntPtr dev, int mode); -void xf86WcmChangeScreen(LocalDevicePtr local, int value); - -#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3 - int xf86WcmSetProperty(DeviceIntPtr dev, Atom property, - XIPropertyValuePtr prop, BOOL checkonly); - void InitWcmDeviceProperties(LocalDevicePtr local); -#endif - -/***************************************************************************** - * xf86WcmSetPadCoreMode - ****************************************************************************/ - -int xf86WcmSetPadCoreMode(LocalDevicePtr local) -{ - WacomDevicePtr priv = (WacomDevicePtr)local->private; - int is_core = local->flags & (XI86_ALWAYS_CORE | XI86_CORE_POINTER); - - /* Pad is always in relative mode when it's a core device. - * Always in absolute mode when it is not a core device. - */ - DBG(10, priv, "%p" - " is always in %s mode when it %s core device\n", - (void *)local->dev, - !is_core ? "absolute" : "relative", - is_core ? "is" : "isn't"); - if (is_core) - priv->flags &= ~ABSOLUTE_FLAG; - else - priv->flags |= ABSOLUTE_FLAG; - return Success; -} - -/***************************************************************************** -* xf86WcmDevSwitchModeCall -- -*****************************************************************************/ - -int xf86WcmDevSwitchModeCall(LocalDevicePtr local, int mode) -{ - WacomDevicePtr priv = (WacomDevicePtr)local->private; - int is_absolute = priv->flags & ABSOLUTE_FLAG; - - DBG(3, priv, "to mode=%d\n", mode); - - /* Pad is always in relative mode when it's a core device. - * Always in absolute mode when it is not a core device. - */ - if (IsPad(priv)) - return xf86WcmSetPadCoreMode(local); - - if ((mode == Absolute) && !is_absolute) - { - priv->flags |= ABSOLUTE_FLAG; - xf86ReplaceStrOption(local->options, "Mode", "Absolute"); - xf86WcmInitialCoordinates(local, 0); - xf86WcmInitialCoordinates(local, 1); - } - else if ((mode == Relative) && is_absolute) - { - priv->flags &= ~ABSOLUTE_FLAG; - xf86ReplaceStrOption(local->options, "Mode", "Relative"); - xf86WcmInitialCoordinates(local, 0); - xf86WcmInitialCoordinates(local, 1); - } - else if ( (mode != Absolute) && (mode != Relative)) - { - DBG(10, priv, "invalid mode=%d\n", mode); - return BadMatch; - } - - return Success; -} - -/***************************************************************************** -* xf86WcmDevSwitchMode -- -*****************************************************************************/ - -int xf86WcmDevSwitchMode(ClientPtr client, DeviceIntPtr dev, int mode) -{ - LocalDevicePtr local = (LocalDevicePtr)dev->public.devicePrivate; -#ifdef DEBUG - WacomDevicePtr priv = (WacomDevicePtr)local->private; - - DBG(3, priv, "dev=%p mode=%d\n", - (void *)dev, mode); -#endif - /* Share this call with sendAButton in wcmCommon.c */ - return xf86WcmDevSwitchModeCall(local, mode); -} - -/***************************************************************************** - * xf86WcmChangeScreen - ****************************************************************************/ - -void xf86WcmChangeScreen(LocalDevicePtr local, int value) -{ - WacomDevicePtr priv = (WacomDevicePtr)local->private; - - if (priv->screen_no != value) - { - priv->screen_no = value; - xf86ReplaceIntOption(local->options, "ScreenNo", value); - } - - if (priv->screen_no != -1) - priv->currentScreen = priv->screen_no; - wcmInitialScreens(local); - xf86WcmInitialCoordinates(local, 0); - xf86WcmInitialCoordinates(local, 1); -} - -#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3 - -Atom prop_rotation; -Atom prop_tablet_area; -Atom prop_screen_area; -Atom prop_pressurecurve; -Atom prop_serials; -Atom prop_strip_buttons; -Atom prop_wheel_buttons; -Atom prop_display; -Atom prop_tv_resolutions; -Atom prop_screen; -Atom prop_cursorprox; -Atom prop_capacity; -Atom prop_threshold; -Atom prop_suppress; -Atom prop_touch; -Atom prop_hover; -Atom prop_tooltype; -Atom prop_btnactions; -#ifdef DEBUG -Atom prop_debuglevels; -#endif - -/* Special case: format -32 means type is XA_ATOM */ -static Atom InitWcmAtom(DeviceIntPtr dev, char *name, int format, int nvalues, int *values) -{ - int i; - Atom atom; - uint8_t val_8[WCM_MAX_MOUSE_BUTTONS]; - uint16_t val_16[WCM_MAX_MOUSE_BUTTONS]; - uint32_t val_32[WCM_MAX_MOUSE_BUTTONS]; - pointer converted = val_32; - Atom type = XA_INTEGER; - - if (format == -32) - { - type = XA_ATOM; - format = 32; - } - - for (i = 0; i < nvalues; i++) - { - switch(format) - { - case 8: val_8[i] = values[i]; break; - case 16: val_16[i] = values[i]; break; - case 32: val_32[i] = values[i]; break; - } - } - - switch(format) - { - case 8: converted = val_8; break; - case 16: converted = val_16; break; - case 32: converted = val_32; break; - } - - atom = MakeAtom(name, strlen(name), TRUE); - XIChangeDeviceProperty(dev, atom, type, format, - PropModeReplace, nvalues, - converted, FALSE); - XISetDevicePropertyDeletable(dev, atom, FALSE); - return atom; -} - -void InitWcmDeviceProperties(LocalDevicePtr local) -{ - WacomDevicePtr priv = (WacomDevicePtr) local->private; - WacomCommonPtr common = priv->common; - int values[WCM_MAX_MOUSE_BUTTONS]; - - DBG(10, priv, "\n"); - - values[0] = priv->topX; - values[1] = priv->topY; - values[2] = priv->bottomX; - values[3] = priv->bottomY; - prop_tablet_area = InitWcmAtom(local->dev, WACOM_PROP_TABLET_AREA, 32, 4, values); - - values[0] = common->wcmRotate; - prop_rotation = InitWcmAtom(local->dev, WACOM_PROP_ROTATION, 8, 1, values); - - values[0] = 0; - values[1] = 0; - values[2] = 100; - values[3] = 100; - prop_pressurecurve = InitWcmAtom(local->dev, WACOM_PROP_PRESSURECURVE, 32, 4, values); - - values[0] = common->tablet_id; - values[1] = priv->old_serial; - values[2] = priv->old_device_id; - values[3] = priv->serial; - prop_serials = InitWcmAtom(local->dev, WACOM_PROP_SERIALIDS, 32, 4, values); - - values[0] = priv->striplup; - values[1] = priv->stripldn; - values[2] = priv->striprup; - values[3] = priv->striprdn; - prop_strip_buttons = InitWcmAtom(local->dev, WACOM_PROP_STRIPBUTTONS, 8, 4, values); - - values[0] = priv->relup; - values[1] = priv->reldn; - values[2] = priv->wheelup; - values[3] = priv->wheeldn; - prop_wheel_buttons = InitWcmAtom(local->dev, WACOM_PROP_WHEELBUTTONS, 8, 4, values); - - values[0] = priv->tvResolution[0]; - values[1] = priv->tvResolution[1]; - values[2] = priv->tvResolution[2]; - values[3] = priv->tvResolution[3]; - prop_tv_resolutions = InitWcmAtom(local->dev, WACOM_PROP_TWINVIEW_RES, 32, 4, values); - - - values[0] = priv->screen_no; - values[1] = priv->twinview; - values[2] = priv->wcmMMonitor; - prop_display = InitWcmAtom(local->dev, WACOM_PROP_DISPLAY_OPTS, 8, 3, values); - - values[0] = priv->screenTopX[priv->currentScreen]; - values[1] = priv->screenTopY[priv->currentScreen]; - values[2] = priv->screenBottomX[priv->currentScreen]; - values[3] = priv->screenBottomY[priv->currentScreen]; - prop_screen = InitWcmAtom(local->dev, WACOM_PROP_SCREENAREA, 32, 4, values); - - values[0] = common->wcmCursorProxoutDist; - prop_cursorprox = InitWcmAtom(local->dev, WACOM_PROP_PROXIMITY_THRESHOLD, 32, 1, values); - - values[0] = common->wcmCapacity; - prop_capacity = InitWcmAtom(local->dev, WACOM_PROP_CAPACITY, 32, 1, values); - - values[0] = (!common->wcmMaxZ) ? 0 : common->wcmThreshold; - prop_threshold = InitWcmAtom(local->dev, WACOM_PROP_PRESSURE_THRESHOLD, 32, 1, values); - - values[0] = common->wcmSuppress; - values[1] = common->wcmRawSample; - prop_suppress = InitWcmAtom(local->dev, WACOM_PROP_SAMPLE, 32, 2, values); - - values[0] = common->wcmTouch; - prop_touch = InitWcmAtom(local->dev, WACOM_PROP_TOUCH, 8, 1, values); - - values[0] = !common->wcmTPCButton; - prop_hover = InitWcmAtom(local->dev, WACOM_PROP_HOVER, 8, 1, values); - - - values[0] = MakeAtom(local->type_name, strlen(local->type_name), TRUE); - prop_tooltype = InitWcmAtom(local->dev, WACOM_PROP_TOOL_TYPE, -32, 1, values); - - /* default to no actions */ - memset(values, 0, sizeof(values)); - prop_btnactions = InitWcmAtom(local->dev, WACOM_PROP_BUTTON_ACTIONS, -32, WCM_MAX_MOUSE_BUTTONS, values); - -#ifdef DEBUG - values[0] = priv->debugLevel; - values[1] = common->debugLevel; - prop_debuglevels = InitWcmAtom(local->dev, WACOM_PROP_DEBUGLEVELS, 8, 2, values); -#endif -} - -int xf86WcmSetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop, - BOOL checkonly) -{ - LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate; - WacomDevicePtr priv = (WacomDevicePtr) local->private; - WacomCommonPtr common = priv->common; - - DBG(10, priv, "\n"); - - if (property == prop_tablet_area) - { - INT32 *values = (INT32*)prop->data; - WacomToolAreaPtr area = priv->toolarea; - - if (prop->size != 4 || prop->format != 32) - return BadValue; - - /* value validation is unnecessary since we let utility programs, such as - * xsetwacom and userland control panel take care of the validation role. - * when all four values are set to -1, it is an area reset (xydefault) */ - if ((values[0] != -1) || (values[1] != -1) || - (values[2] != -1) || (values[3] != -1)) - { - WacomToolArea tmp_area = *area; - - area->topX = values[0]; - area->topY = values[1]; - area->bottomX = values[2]; - area->bottomY = values[3]; - - /* validate the area */ - if (wcmAreaListOverlap(area, priv->tool->arealist)) - { - *area = tmp_area; - return BadValue; - } - *area = tmp_area; - } - - if (!checkonly) - { - if ((values[0] == -1) && (values[1] == -1) && - (values[2] == -1) && (values[3] == -1)) - { - values[0] = 0; - values[1] = 0; - if (!IsTouch(priv)) - values[2] = common->wcmMaxX; - else - values[2] = common->wcmMaxTouchX; - if (!IsTouch(priv)) - values[3] = common->wcmMaxY; - else - values[3] = common->wcmMaxTouchY; - } - - priv->topX = area->topX = values[0]; - priv->topY = area->topY = values[1]; - priv->bottomX = area->bottomX = values[2]; - priv->bottomY = area->bottomY = values[3]; - xf86WcmInitialCoordinates(local, 0); - xf86WcmInitialCoordinates(local, 1); - } - } else if (property == prop_pressurecurve) - { - INT32 *pcurve; - - if (prop->size != 4 || prop->format != 32) - return BadValue; - - pcurve = (INT32*)prop->data; - - if ((pcurve[0] > 100) || (pcurve[1] > 100) || - (pcurve[2] > 100) || (pcurve[3] > 100)) - return BadValue; - - if (IsCursor(priv) || IsPad (priv) || IsTouch (priv)) - return BadValue; - - if (!checkonly) - wcmSetPressureCurve (priv, pcurve[0], pcurve[1], - pcurve[2], pcurve[3]); - } else if (property == prop_suppress) - { - CARD32 *values; - - if (prop->size != 2 || prop->format != 32) - return BadValue; - - values = (CARD32*)prop->data; - - if ((values[0] < 0) || (values[0] > 100)) - return BadValue; - - if ((values[1] < 0) || (values[1] > XWACOM_MAX_SAMPLES)) - return BadValue; - - if (!checkonly) - { - common->wcmSuppress = values[0]; - common->wcmRawSample = values[1]; - } - } else if (property == prop_rotation) - { - CARD8 value; - if (prop->size != 1 || prop->format != 8) - return BadValue; - - value = *(CARD8*)prop->data; - - if (value > 3) - return BadValue; - - if (!checkonly && common->wcmRotate != value) - wcmRotateTablet(local, value); - } else if (property == prop_serials) - { - return BadValue; /* Read-only */ - } else if (property == prop_strip_buttons) - { - CARD8 *values; - - if (prop->size != 4 || prop->format != 8) - return BadValue; - - values = (CARD8*)prop->data; - - if (values[0] > WCM_MAX_MOUSE_BUTTONS || - values[1] > WCM_MAX_MOUSE_BUTTONS || - values[2] > WCM_MAX_MOUSE_BUTTONS || - values[3] > WCM_MAX_MOUSE_BUTTONS) - return BadValue; - - if (!checkonly) - { - /* FIXME: needs to take AC_* into account */ - priv->striplup = values[0]; - priv->stripldn = values[1]; - priv->striprup = values[2]; - priv->striprdn = values[3]; - } - - } else if (property == prop_wheel_buttons) - { - CARD8 *values; - - if (prop->size != 4 || prop->format != 8) - return BadValue; - - values = (CARD8*)prop->data; - - if (values[0] > WCM_MAX_MOUSE_BUTTONS || - values[1] > WCM_MAX_MOUSE_BUTTONS || - values[2] > WCM_MAX_MOUSE_BUTTONS || - values[3] > WCM_MAX_MOUSE_BUTTONS) - return BadValue; - - if (!checkonly) - { - /* FIXME: needs to take AC_* into account */ - priv->relup = values[0]; - priv->reldn = values[1]; - priv->wheelup = values[2]; - priv->wheeldn = values[3]; - } - } else if (property == prop_screen) - { - /* Long-term, this property should be removed, there's other ways to - * get the screen resolution. For now, we leave it in for backwards - * compat */ - return BadValue; /* Read-only */ - } else if (property == prop_display) - { - INT8 *values; - - if (prop->size != 3 || prop->format != 8) - return BadValue; - - values = (INT8*)prop->data; - - if (values[0] < -1 || values[0] >= priv->numScreen) - return BadValue; - - if (values[1] < TV_NONE || values[1] > TV_MAX) - return BadValue; - - if ((values[2] != 0) && (values[2] != 1)) - return BadValue; - - if (!checkonly) - { - if (priv->screen_no != values[0]) - xf86WcmChangeScreen(local, values[0]); - priv->screen_no = values[0]; - - if (priv->twinview != values[1]) - { - int screen = priv->screen_no; - priv->twinview = values[1]; - - /* Can not restrict the cursor to a particular screen */ - if (!values[1] && (screenInfo.numScreens == 1)) - { - screen = -1; - priv->currentScreen = 0; - DBG(10, priv, "TwinView sets to " - "TV_NONE: can't change screen_no. \n"); - } - xf86WcmChangeScreen(local, screen); - } - - priv->wcmMMonitor = values[2]; - } - } else if (property == prop_cursorprox) - { - CARD32 value; - - if (prop->size != 1 || prop->format != 32) - return BadValue; - - if (!IsCursor (priv)) - return BadValue; - - value = *(CARD32*)prop->data; - - if (value > 255) - return BadValue; - - if (!checkonly) - common->wcmCursorProxoutDist = value; - } else if (property == prop_capacity) - { - INT32 value; - - if (prop->size != 1 || prop->format != 32) - return BadValue; - - value = *(INT32*)prop->data; - - if ((value < -1) || (value > 5)) - return BadValue; - - if (!checkonly) - common->wcmCapacity = value; - - } else if (property == prop_threshold) - { - CARD32 value; - - if (prop->size != 1 || prop->format != 32) - return BadValue; - - value = *(CARD32*)prop->data; - - if ((value < 1) || (value > 21)) - return BadValue; - - if (!checkonly) - common->wcmThreshold = value; - } else if (property == prop_touch) - { - CARD8 *values = (CARD8*)prop->data; - - if (prop->size != 1 || prop->format != 8) - return BadValue; - - if ((values[0] != 0) && (values[0] != 1)) - return BadValue; - - if (!checkonly && common->wcmTouch != values[0]) - common->wcmTouch = values[0]; - } else if (property == prop_hover) - { - CARD8 *values = (CARD8*)prop->data; - - if (prop->size != 1 || prop->format != 8) - return BadValue; - - if ((values[0] != 0) && (values[0] != 1)) - return BadValue; - - if (!checkonly && common->wcmTPCButton != !values[0]) - common->wcmTPCButton = !values[0]; - } else if (property == prop_tv_resolutions) - { - CARD32 *values; - - if (prop->size != 4 || prop->format != 32) - return BadValue; - - values = (CARD32*)prop->data; - - /* non-TwinView settings can not set TwinView RESOLUTION */ - if ((priv->twinview == TV_NONE) || (values[0] < 0) || - (values[1] < 0) || (values[2] < 0) || (values[3] < 0) || - ((values[0] + values[2]) != screenInfo.screens[0]->width) || - ((values[1] + values[3]) != screenInfo.screens[0]->height)) - return BadValue; - - if (!checkonly) - { - priv->tvResolution[0] = values[0]; - priv->tvResolution[1] = values[1]; - priv->tvResolution[2] = values[2]; - priv->tvResolution[3] = values[3]; - - /* reset screen info */ - xf86WcmChangeScreen(local, priv->screen_no); - } -#ifdef DEBUG - } else if (property == prop_debuglevels) - { - CARD8 *values; - - if (prop->size != 2 || prop->format != 8) - return BadMatch; - - values = (CARD8*)prop->data; - if (values[0] > 10 || values[1] > 10) - return BadValue; - - if (!checkonly) - { - priv->debugLevel = values[0]; - common->debugLevel = values[1]; - } -#endif - } else if (property == prop_btnactions) - { - Atom *values; - int i, j; - XIPropertyValuePtr val; - - if (prop->size != WCM_MAX_MOUSE_BUTTONS || prop->format != 32 || - prop->type != XA_ATOM) - return BadMatch; - - /* How this works: - * prop_btnactions has a list of atoms stored. Any atom references - * another property on that device that contains the actual action. - * If this property changes, all action-properties are queried for - * their value and their value is stored in priv->key[button]. - * - * If the button is pressed, the actions are executed. - * - * Any button action property needs to be monitored by this property - * handler too. - */ - - values = (Atom*)prop->data; - - for (i = 0; i < prop->size; i++) - { - if (!values[i]) - continue; - - if (values[i] == property || !ValidAtom(values[i])) - return BadValue; - - if (XIGetDeviceProperty(local->dev, values[i], &val) != Success) - return BadValue; - } - - if (!checkonly) - { - /* any action property needs to be registered for this handler. */ - for (i = 0; i < prop->size; i++) - priv->btn_actions[i] = values[i]; - - for (i = 0; i < prop->size; i++) - { - if (!values[i]) - continue; - - XIGetDeviceProperty(local->dev, values[i], &val); - - memset(priv->keys[i], 0, sizeof(priv->keys[i])); - for (j = 0; j < val->size; j++) - priv->keys[i][j] = ((unsigned int*)val->data)[j]; - } - - } - } else - { - int i, j; - - /* check all properties used for button actions */ - for (i = 0; i < ARRAY_SIZE(priv->btn_actions); i++) - if (priv->btn_actions[i] == property) - break; - - if (i < ARRAY_SIZE(priv->btn_actions)) - { - CARD32 *data; - int code; - int type; - - if (prop->size >= 255 || prop->format != 32 || - prop->type != XA_INTEGER) - return BadMatch; - - data = (CARD32*)prop->data; - - for (j = 0;j < prop->size; j++) - { - code = data[j] & AC_CODE; - type = data[j] & AC_TYPE; - - switch(type) - { - case AC_KEY: - break; - case AC_BUTTON: - if (code > WCM_MAX_MOUSE_BUTTONS) - return BadValue; - break; - case AC_DISPLAYTOGGLE: - case AC_MODETOGGLE: - case AC_DBLCLICK: - break; - default: - return BadValue; - } - - if (!checkonly) - { - memset(priv->keys[i], 0, sizeof(priv->keys[i])); - for (j = 0; j < prop->size; j++) - priv->keys[i][j] = data[j]; - } - } - } - } - - return Success; -} -#endif /* GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3 */ -/* vim: set noexpandtab shiftwidth=8: */ diff --git a/src/xf86Wacom.h b/src/xf86Wacom.h index 77ce87c..b5cbf03 100644 --- a/src/xf86Wacom.h +++ b/src/xf86Wacom.h @@ -167,7 +167,7 @@ void wcmEvent(WacomCommonPtr common, unsigned int channel, const WacomDeviceStat /* dispatches data to XInput event system */ void xf86WcmSendEvents(LocalDevicePtr local, const WacomDeviceState* ds); -/* generic area check for xf86Wacom.c, wcmCommon.c and wcmXCommand.c */ +/* generic area check for xf86Wacom.c, wcmCommon.c and wcmProperties.c */ Bool wcmPointInArea(WacomToolAreaPtr area, int x, int y); Bool wcmAreaListOverlap(WacomToolAreaPtr area, WacomToolAreaPtr list); -- 1.6.5.6
------------------------------------------------------------------------------ This SF.Net email is sponsored by the Verizon Developer Community Take advantage of Verizon's best-in-class app development support A streamlined, 14 day to market process makes app distribution fast and easy Join now and get one step closer to millions of Verizon customers http://p.sf.net/sfu/verizon-dev2dev
_______________________________________________ Linuxwacom-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel
