~ubuntu-branches/ubuntu/utopic/xf86-input-wacom/utopic-updates

« back to all changes in this revision

Viewing changes to src/wcmXCommand.c

  • Committer: Package Import Robot
  • Author(s): Timo Aaltonen
  • Date: 2012-03-22 00:44:18 UTC
  • mfrom: (1.1.9)
  • Revision ID: package-import@ubuntu.com-20120322004418-x2wboeaknvnoohzz
Tags: 1:0.14.0-0ubuntu1
New upstream release (LP: #961743).

Show diffs side-by-side

added added

removed removed

Lines of Context:
122
122
{
123
123
        int i;
124
124
        Atom atom;
125
 
        uint8_t val_8[WCM_MAX_MOUSE_BUTTONS];
126
 
        uint16_t val_16[WCM_MAX_MOUSE_BUTTONS];
127
 
        uint32_t val_32[WCM_MAX_MOUSE_BUTTONS];
 
125
        uint8_t val_8[WCM_MAX_BUTTONS];
 
126
        uint16_t val_16[WCM_MAX_BUTTONS];
 
127
        uint32_t val_32[WCM_MAX_BUTTONS];
128
128
        pointer converted = val_32;
129
129
 
130
130
        for (i = 0; i < nvalues; i++)
156
156
{
157
157
        WacomDevicePtr priv = (WacomDevicePtr) pInfo->private;
158
158
        WacomCommonPtr common = priv->common;
159
 
        int values[WCM_MAX_MOUSE_BUTTONS];
 
159
        int values[WCM_MAX_BUTTONS];
 
160
        int nbuttons;
160
161
 
161
162
        DBG(10, priv, "\n");
162
163
 
189
190
        values[1] = priv->old_serial;
190
191
        values[2] = priv->old_device_id;
191
192
        values[3] = priv->cur_serial;
192
 
        prop_serials = InitWcmAtom(pInfo->dev, WACOM_PROP_SERIALIDS, XA_INTEGER, 32, 4, values);
 
193
        values[4] = priv->cur_device_id;
 
194
        prop_serials = InitWcmAtom(pInfo->dev, WACOM_PROP_SERIALIDS, XA_INTEGER, 32, 5, values);
193
195
 
194
196
        values[0] = priv->serial;
195
197
        prop_serial_binding = InitWcmAtom(pInfo->dev, WACOM_PROP_SERIAL_BIND, XA_INTEGER, 32, 1, values);
225
227
        values[0] = MakeAtom(pInfo->type_name, strlen(pInfo->type_name), TRUE);
226
228
        prop_tooltype = InitWcmAtom(pInfo->dev, WACOM_PROP_TOOL_TYPE, XA_ATOM, 32, 1, values);
227
229
 
 
230
 
228
231
        /* default to no actions */
 
232
        nbuttons = min(max(priv->nbuttons + 4, 7), WCM_MAX_BUTTONS);
229
233
        memset(values, 0, sizeof(values));
230
 
        prop_btnactions = InitWcmAtom(pInfo->dev, WACOM_PROP_BUTTON_ACTIONS, XA_ATOM, 32, WCM_MAX_MOUSE_BUTTONS, values);
 
234
        prop_btnactions = InitWcmAtom(pInfo->dev, WACOM_PROP_BUTTON_ACTIONS, XA_ATOM, 32, nbuttons, values);
231
235
 
232
236
        if (IsPad(priv)) {
233
237
                memset(values, 0, sizeof(values));
288
292
                        case AC_KEY:
289
293
                                break;
290
294
                        case AC_BUTTON:
291
 
                                if (code > WCM_MAX_MOUSE_BUTTONS)
 
295
                                if (code > WCM_MAX_BUTTONS)
292
296
                                        return BadValue;
293
297
                                break;
294
298
                        case AC_DISPLAYTOGGLE:
492
496
        switch (prop->format)
493
497
        {
494
498
                case 8:
495
 
                        if (values.v8[0] > WCM_MAX_MOUSE_BUTTONS ||
496
 
                            values.v8[1] > WCM_MAX_MOUSE_BUTTONS ||
497
 
                            values.v8[2] > WCM_MAX_MOUSE_BUTTONS ||
498
 
                            values.v8[3] > WCM_MAX_MOUSE_BUTTONS ||
499
 
                            values.v8[4] > WCM_MAX_MOUSE_BUTTONS ||
500
 
                            values.v8[5] > WCM_MAX_MOUSE_BUTTONS)
 
499
                        if (values.v8[0] > WCM_MAX_BUTTONS ||
 
500
                            values.v8[1] > WCM_MAX_BUTTONS ||
 
501
                            values.v8[2] > WCM_MAX_BUTTONS ||
 
502
                            values.v8[3] > WCM_MAX_BUTTONS ||
 
503
                            values.v8[4] > WCM_MAX_BUTTONS ||
 
504
                            values.v8[5] > WCM_MAX_BUTTONS)
501
505
                                return BadValue;
502
506
 
503
507
                        if (!checkonly) {
715
719
                 * set it at runtime. If we get here from wcmUpdateSerial,
716
720
                 * we know the serial has ben set internally already, so we
717
721
                 * can reply with success. */
718
 
                if (prop->size == 4 && prop->format == 32)
 
722
                if (prop->size == 5 && prop->format == 32)
719
723
                        if (((CARD32*)prop->data)[3] == priv->cur_serial)
720
724
                                return Success;
721
725
 
755
759
                        common->wcmCursorProxoutDist = value;
756
760
        } else if (property == prop_threshold)
757
761
        {
758
 
                CARD32 value;
 
762
                INT32 value;
759
763
 
760
764
                if (prop->size != 1 || prop->format != 32)
761
765
                        return BadValue;
762
766
 
763
 
                value = *(CARD32*)prop->data;
 
767
                value = *(INT32*)prop->data;
764
768
 
765
 
                if ((value < 1) || (value > FILTER_PRESSURE_RES))
 
769
                if (value == -1)
 
770
                        value = DEFAULT_THRESHOLD;
 
771
                else if ((value < 1) || (value > FILTER_PRESSURE_RES))
766
772
                        return BadValue;
767
773
 
768
774
                if (!checkonly)
844
850
#endif
845
851
        } else if (property == prop_btnactions)
846
852
        {
847
 
                if (prop->size != WCM_MAX_MOUSE_BUTTONS)
 
853
                int nbuttons = min(max(priv->nbuttons + 4, 7), WCM_MAX_BUTTONS);
 
854
                if (prop->size != nbuttons)
848
855
                        return BadMatch;
849
856
                wcmSetPropertyButtonActions(dev, property, prop, checkonly);
850
857
        } else
863
870
 
864
871
        if (property == prop_serials)
865
872
        {
866
 
                uint32_t values[4];
 
873
                uint32_t values[5];
867
874
 
868
875
                values[0] = common->tablet_id;
869
876
                values[1] = priv->old_serial;
870
877
                values[2] = priv->old_device_id;
871
878
                values[3] = priv->cur_serial;
 
879
                values[4] = priv->cur_device_id;
872
880
 
873
881
                DBG(10, priv, "Update to serial: %d\n", priv->old_serial);
874
882
 
875
883
                return XIChangeDeviceProperty(dev, property, XA_INTEGER, 32,
876
 
                                              PropModeReplace, 4,
 
884
                                              PropModeReplace, 5,
877
885
                                              values, FALSE);
878
886
        }
879
887
 
886
894
        InputInfoPtr pInfo = arg;
887
895
        WacomDevicePtr priv = pInfo->private;
888
896
        XIPropertyValuePtr prop;
889
 
        CARD32 prop_value[4];
 
897
        CARD32 prop_value[5];
890
898
        int sigstate;
891
899
        int rc;
892
900
 
893
901
        sigstate = xf86BlockSIGIO();
894
902
 
895
903
        rc = XIGetDeviceProperty(pInfo->dev, prop_serials, &prop);
896
 
        if (rc != Success || prop->format != 32 || prop->size != 4)
 
904
        if (rc != Success || prop->format != 32 || prop->size != 5)
897
905
        {
898
906
                xf86Msg(X_ERROR, "%s: Failed to update serial number.\n",
899
907
                        pInfo->name);
902
910
 
903
911
        memcpy(prop_value, prop->data, sizeof(prop_value));
904
912
        prop_value[3] = priv->cur_serial;
 
913
        prop_value[4] = priv->cur_device_id;
905
914
 
906
915
        XIChangeDeviceProperty(pInfo->dev, prop_serials, XA_INTEGER,
907
916
                               prop->format, PropModeReplace,
913
922
}
914
923
 
915
924
void
916
 
wcmUpdateSerial(InputInfoPtr pInfo, unsigned int serial)
 
925
wcmUpdateSerial(InputInfoPtr pInfo, unsigned int serial, int id)
917
926
{
918
927
        WacomDevicePtr priv = pInfo->private;
919
928
 
921
930
                return;
922
931
 
923
932
        priv->cur_serial = serial;
 
933
        priv->cur_device_id = id;
924
934
 
925
935
        /* This function is called during SIGIO. Schedule timer for property
926
936
         * event delivery outside of signal handler. */