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
<[email protected]> 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 <[email protected]>
---
  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

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel




_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to