[PATCH xf86-input-libinput 4/4] Add option "ButtonMapping" (#9206)

Peter Hutterer peter.hutterer at who-t.net
Wed Apr 29 02:59:28 PDT 2015


On 29/04/2015 16:30 , Jasper St. Pierre wrote:
> Are you sure that's the correct Xorg bug? Goes to something related to
> x86emu for me.

oops sorry, there's a 0 missing, this should be
http://bugs.freedesktop.org/show_bug.cgi?id=90206

Cheers,
   Peter



> On Tue, Apr 28, 2015 at 4:51 PM, Peter Hutterer
> <peter.hutterer at who-t.net> wrote:
>> With a long entry in the man page to detail what this option does.
>> Specifically, it's the xorg.conf equivalent to XSetPointerMapping(3), it
>> doesn't do any physical button remappings, merely the logical ones. If the
>> physical button isn't mapped to the right logical button by default, that's
>> either a libiput bug or an xkcd 1172 issue.
>>
>> X.Org Bug 9206 <http://bugs.freedesktop.org/show_bug.cgi?id=9206>
>>
>> Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
>> ---
>>   man/libinput.man | 38 +++++++++++++++++++++++++++++++++++++
>>   src/libinput.c   | 57 +++++++++++++++++++++++++++++++++++++++++++++++++-------
>>   2 files changed, 88 insertions(+), 7 deletions(-)
>>
>> diff --git a/man/libinput.man b/man/libinput.man
>> index c5eaea5..3b2697e 100644
>> --- a/man/libinput.man
>> +++ b/man/libinput.man
>> @@ -50,6 +50,19 @@ The mapping from device node to hardware is system-dependent. Property:
>>   .BI "Option \*qAccelSpeed\*q \*q" float \*q
>>   Sets the pointer acceleration speed within the range [-1, 1]
>>   .TP 7
>> +.BI "Option \*qButtonMapping\*q \*q" string \*q
>> +Sets the logical button mapping for this device, see
>> +XSetPointerMapping(__libmansuffix__). The string must be a
>> +space-separated list of button mappings in the order of the
>> +logical buttons on the device, starting with button 1.
>> +The default mapping is "1 2 3 ... 32". A mapping of 0
>> +deactivates the button. Multiple buttons can have the same mapping.
>> +Invalid mapping strings are discarded and the default mapping
>> +is used for all buttons. Buttons not specified in the user's mapping use the
>> +default mapping. See section
>> +.B BUTTON MAPPING
>> +for more details.
>> +.TP 7
>>   .BI "Option \*qCalibrationMatrix\*q \*q" string \*q
>>   A string of 9 space-separated floating point numbers.
>>   Sets the calibration matrix to the 3x3 matrix where the first row is (abc),
>> @@ -167,6 +180,31 @@ The above properties have a
>>   .BI "libinput <property name> Default"
>>   equivalent that indicates the default value for this setting on this device.
>>
>> +.SH BUTTON MAPPING
>> +X clients receive events with logical button numbers, where 1, 2, 3
>> +are usually interpreted as left, middle, right and logical buttons 4, 5, 6,
>> +7 are usually interpreted as scroll up, down, left, right. The fourth and
>> +fifth physical buttons on a device will thus send logical buttons 8 and 9.
>> +The
>> +.B ButtonMapping
>> +option adjusts the logical button mapping, it does not affect how a physical
>> +button is mapped to a logical button.
>> +.PP
>> +Traditionally, a device was set to left-handed button mode by applying a
>> +button mapping of
>> +.B "\*q3 2 1 ...\*q"
>> +On systems using the
>> +.B libinput
>> +__xservername__ input driver it is recommended to use the
>> +.B LeftHanded
>> +option instead. Adjusting the
>> +.PP
>> +The
>> +.B libinput
>> +__xservername__ input driver does not use the button mapping after setup.
>> +Use XSetPointerMapping(__libmansuffix__) to modify the button mapping at
>> +runtime.
>> +
>>   .SH AUTHORS
>>   Peter Hutterer
>>   .SH "SEE ALSO"
>> diff --git a/src/libinput.c b/src/libinput.c
>> index 2db62ba..c7ab18c 100644
>> --- a/src/libinput.c
>> +++ b/src/libinput.c
>> @@ -96,6 +96,8 @@ struct xf86libinput {
>>                  float matrix[9];
>>                  enum libinput_config_scroll_method scroll_method;
>>                  enum libinput_config_click_method click_method;
>> +
>> +               unsigned char btnmap[MAX_BUTTONS + 1];
>>          } options;
>>   };
>>
>> @@ -440,7 +442,6 @@ xf86libinput_init_pointer(InputInfoPtr pInfo)
>>          int nbuttons = 7;
>>          int i;
>>
>> -       unsigned char btnmap[MAX_BUTTONS + 1];
>>          Atom btnlabels[MAX_BUTTONS];
>>          Atom axislabels[TOUCHPAD_NUM_AXES];
>>
>> @@ -451,11 +452,11 @@ xf86libinput_init_pointer(InputInfoPtr pInfo)
>>                  }
>>          }
>>
>> -       init_button_map(btnmap, ARRAY_SIZE(btnmap));
>>          init_button_labels(btnlabels, ARRAY_SIZE(btnlabels));
>>          init_axis_labels(axislabels, ARRAY_SIZE(axislabels));
>>
>> -       InitPointerDeviceStruct((DevicePtr)dev, btnmap,
>> +       InitPointerDeviceStruct((DevicePtr)dev,
>> +                               driver_data->options.btnmap,
>>                                  nbuttons,
>>                                  btnlabels,
>>                                  xf86libinput_ptr_ctl,
>> @@ -488,7 +489,6 @@ xf86libinput_init_pointer_absolute(InputInfoPtr pInfo)
>>          int nbuttons = 7;
>>          int i;
>>
>> -       unsigned char btnmap[MAX_BUTTONS + 1];
>>          Atom btnlabels[MAX_BUTTONS];
>>          Atom axislabels[TOUCHPAD_NUM_AXES];
>>
>> @@ -499,11 +499,11 @@ xf86libinput_init_pointer_absolute(InputInfoPtr pInfo)
>>                  }
>>          }
>>
>> -       init_button_map(btnmap, ARRAY_SIZE(btnmap));
>>          init_button_labels(btnlabels, ARRAY_SIZE(btnlabels));
>>          init_axis_labels(axislabels, ARRAY_SIZE(axislabels));
>>
>> -       InitPointerDeviceStruct((DevicePtr)dev, btnmap,
>> +       InitPointerDeviceStruct((DevicePtr)dev,
>> +                               driver_data->options.btnmap,
>>                                  nbuttons,
>>                                  btnlabels,
>>                                  xf86libinput_ptr_ctl,
>> @@ -589,6 +589,7 @@ static void
>>   xf86libinput_init_touch(InputInfoPtr pInfo)
>>   {
>>          DeviceIntPtr dev = pInfo->dev;
>> +       struct xf86libinput *driver_data = pInfo->private;
>>          int min, max, res;
>>          unsigned char btnmap[MAX_BUTTONS + 1];
>>          Atom btnlabels[MAX_BUTTONS];
>> @@ -599,7 +600,8 @@ xf86libinput_init_touch(InputInfoPtr pInfo)
>>          init_button_labels(btnlabels, ARRAY_SIZE(btnlabels));
>>          init_axis_labels(axislabels, ARRAY_SIZE(axislabels));
>>
>> -       InitPointerDeviceStruct((DevicePtr)dev, btnmap,
>> +       InitPointerDeviceStruct((DevicePtr)dev,
>> +                               driver_data->options.btnmap,
>>                                  nbuttons,
>>                                  btnlabels,
>>                                  xf86libinput_ptr_ctl,
>> @@ -1264,12 +1266,48 @@ xf86libinput_parse_middleemulation_option(InputInfoPtr pInfo,
>>   }
>>
>>   static void
>> +xf86libinput_parse_buttonmap_option(InputInfoPtr pInfo,
>> +                                   unsigned char *btnmap,
>> +                                   size_t size)
>> +{
>> +       const int MAXBUTTONS = 32;
>> +       char *mapping, *map, *s = NULL;
>> +       int idx = 1;
>> +
>> +       init_button_map(btnmap, size);
>> +
>> +       mapping = xf86SetStrOption(pInfo->options, "ButtonMapping", NULL);
>> +       if (!mapping)
>> +               return;
>> +
>> +       map = mapping;
>> +       do
>> +       {
>> +               unsigned long int btn = strtoul(map, &s, 10);
>> +
>> +               if (s == map || btn > MAXBUTTONS)
>> +               {
>> +                       xf86IDrvMsg(pInfo, X_ERROR,
>> +                                   "... Invalid button mapping. Using defaults\n");
>> +                       init_button_map(btnmap, size);
>> +                       break;
>> +               }
>> +
>> +               btnmap[idx++] = btn;
>> +               map = s;
>> +       } while (s && *s != '\0' && idx < MAXBUTTONS);
>> +
>> +       free(mapping);
>> +}
>> +
>> +static void
>>   xf86libinput_parse_options(InputInfoPtr pInfo,
>>                             struct xf86libinput *driver_data,
>>                             struct libinput_device *device)
>>   {
>>          struct options *options = &driver_data->options;
>>
>> +       /* libinput options */
>>          options->tapping = xf86libinput_parse_tap_option(pInfo, device);
>>          options->speed = xf86libinput_parse_accel_option(pInfo, device);
>>          options->natural_scrolling = xf86libinput_parse_natscroll_option(pInfo, device);
>> @@ -1280,6 +1318,11 @@ xf86libinput_parse_options(InputInfoPtr pInfo,
>>          options->click_method = xf86libinput_parse_clickmethod_option(pInfo, device);
>>          options->middle_emulation = xf86libinput_parse_middleemulation_option(pInfo, device);
>>          xf86libinput_parse_calibration_option(pInfo, device, driver_data->options.matrix);
>> +
>> +       /* non-libinput options */
>> +       xf86libinput_parse_buttonmap_option(pInfo,
>> +                                           options->btnmap,
>> +                                           sizeof(options->btnmap));
>>   }
>>
>>   static int
>> --
>> 2.3.5
>>
>> _______________________________________________
>> xorg-devel at lists.x.org: X.Org development
>> Archives: http://lists.x.org/archives/xorg-devel
>> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
>
>



More information about the xorg-devel mailing list