configure.ac                  |    4 
 include/libinput-properties.h |    6 +
 man/libinput.man              |    8 +
 src/xf86libinput.c            |  177 ++++++++++++++++++++++++++++++++++++++----
 4 files changed, 178 insertions(+), 17 deletions(-)

New commits:
commit 8136113139dd2a27fcfa4552da89aa110bc8fbe3
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Fri Feb 26 15:57:48 2016 +1000

    xf86-input-libinput 0.17.0
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/configure.ac b/configure.ac
index 6fc95e3..cdb8aed 100644
--- a/configure.ac
+++ b/configure.ac
@@ -23,7 +23,7 @@
 # Initialize Autoconf
 AC_PREREQ([2.60])
 AC_INIT([xf86-input-libinput],
-        [0.16.0],
+        [0.17.0],
         [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
         [xf86-input-libinput])
 AC_CONFIG_SRCDIR([Makefile.am])

commit 202eb68dc061510d57900d29b3a76fe2ed811998
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Thu Jan 28 15:02:54 2016 +1000

    Fix compiler warnings about missing tablet event cases
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/src/xf86libinput.c b/src/xf86libinput.c
index b520b26..32bc9f8 100644
--- a/src/xf86libinput.c
+++ b/src/xf86libinput.c
@@ -1131,6 +1131,11 @@ xf86libinput_handle_event(struct libinput_event *event)
                case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
                case LIBINPUT_EVENT_GESTURE_PINCH_END:
                        break;
+               case LIBINPUT_EVENT_TABLET_TOOL_AXIS:
+               case LIBINPUT_EVENT_TABLET_TOOL_BUTTON:
+               case LIBINPUT_EVENT_TABLET_TOOL_PROXIMITY:
+               case LIBINPUT_EVENT_TABLET_TOOL_TIP:
+                       break;
        }
 }
 

commit e8f5394b0734db41abd15ab72457aea99c25d9ab
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Wed Jan 27 11:04:40 2016 +1000

    Add property/option for enabling/disabling tap-n-drag
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
    Reviewed-by: Hans de Goede <hdego...@redhat.com>

diff --git a/configure.ac b/configure.ac
index 67bebdc..6fc95e3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -45,7 +45,7 @@ XORG_DEFAULT_OPTIONS
 
 # Obtain compiler/linker options from server and required extensions
 PKG_CHECK_MODULES(XORG, [xorg-server >= 1.10] xproto [inputproto >= 2.2])
-PKG_CHECK_MODULES(LIBINPUT, [libinput >= 1.0.901])
+PKG_CHECK_MODULES(LIBINPUT, [libinput >= 1.1.901])
 
 # Define a configure option for an alternate input module directory
 AC_ARG_WITH(xorg-module-dir,
diff --git a/include/libinput-properties.h b/include/libinput-properties.h
index 098ce48..d117729 100644
--- a/include/libinput-properties.h
+++ b/include/libinput-properties.h
@@ -30,6 +30,12 @@
 /* Tapping default enabled/disabled: BOOL, 1 value, read-only */
 #define LIBINPUT_PROP_TAP_DEFAULT "libinput Tapping Enabled Default"
 
+/* Tap drag enabled/disabled: BOOL, 1 value */
+#define LIBINPUT_PROP_TAP_DRAG "libinput Tapping Drag Enabled"
+
+/* Tap drag default enabled/disabled: BOOL, 1 value */
+#define LIBINPUT_PROP_TAP_DRAG_DEFAULT "libinput Tapping Drag Enabled Default"
+
 /* Tap drag lock enabled/disabled: BOOL, 1 value */
 #define LIBINPUT_PROP_TAP_DRAG_LOCK "libinput Tapping Drag Lock Enabled"
 
diff --git a/man/libinput.man b/man/libinput.man
index b6f476e..43beda7 100644
--- a/man/libinput.man
+++ b/man/libinput.man
@@ -129,6 +129,14 @@ mouse is connected".
 .BI "Option \*qTapping\*q \*q" bool \*q
 Enables or disables tap-to-click behavior.
 .TP 7
+.BI "Option \*qTappingDrag\*q \*q" bool \*q
+Enables or disables drag during tapping behavior ("tap-and-drag"). When
+enabled, a tap followed by a finger held down causes a single button down
+only, all motions of that finger thus translate into dragging motion.
+Tap-and-drag requires option
+.B Tapping
+to be enabled.
+.TP 7
 .BI "Option \*qTappingDragLock\*q \*q" bool \*q
 Enables or disables drag lock during tapping behavior. When enabled, a
 finger up during tap-and-drag will not immediately release the button. If
diff --git a/src/xf86libinput.c b/src/xf86libinput.c
index fd07cf3..b520b26 100644
--- a/src/xf86libinput.c
+++ b/src/xf86libinput.c
@@ -112,6 +112,7 @@ struct xf86libinput {
 
        struct options {
                BOOL tapping;
+               BOOL tap_drag;
                BOOL tap_drag_lock;
                BOOL natural_scrolling;
                BOOL left_handed;
@@ -386,6 +387,13 @@ LibinputApplyConfig(DeviceIntPtr dev)
                            "Failed to set Tapping DragLock to %d\n",
                            driver_data->options.tap_drag_lock);
 
+       if (libinput_device_config_tap_get_finger_count(device) > 0 &&
+           libinput_device_config_tap_set_drag_enabled(device,
+                                                       
driver_data->options.tap_drag) != LIBINPUT_CONFIG_STATUS_SUCCESS)
+               xf86IDrvMsg(pInfo, X_ERROR,
+                           "Failed to set Tapping Drag to %d\n",
+                           driver_data->options.tap_drag);
+
        if (libinput_device_config_calibration_has_matrix(device) &&
            libinput_device_config_calibration_set_matrix(device,
                                                          
driver_data->options.matrix) != LIBINPUT_CONFIG_STATUS_SUCCESS)
@@ -1277,6 +1285,30 @@ xf86libinput_parse_tap_option(InputInfoPtr pInfo,
 }
 
 static inline BOOL
+xf86libinput_parse_tap_drag_option(InputInfoPtr pInfo,
+                                  struct libinput_device *device)
+{
+       BOOL drag;
+
+       if (libinput_device_config_tap_get_finger_count(device) == 0)
+               return FALSE;
+
+       drag = xf86SetBoolOption(pInfo->options,
+                                "TappingDrag",
+                                
libinput_device_config_tap_get_drag_enabled(device));
+
+       if (libinput_device_config_tap_set_drag_enabled(device, drag) !=
+           LIBINPUT_CONFIG_STATUS_SUCCESS) {
+               xf86IDrvMsg(pInfo, X_ERROR,
+                           "Failed to set Tapping Drag Lock to %d\n",
+                           drag);
+               drag = libinput_device_config_tap_get_drag_enabled(device);
+       }
+
+       return drag;
+}
+
+static inline BOOL
 xf86libinput_parse_tap_drag_lock_option(InputInfoPtr pInfo,
                                        struct libinput_device *device)
 {
@@ -1683,6 +1715,7 @@ xf86libinput_parse_options(InputInfoPtr pInfo,
 
        /* libinput options */
        options->tapping = xf86libinput_parse_tap_option(pInfo, device);
+       options->tap_drag = xf86libinput_parse_tap_drag_option(pInfo, device);
        options->tap_drag_lock = xf86libinput_parse_tap_drag_lock_option(pInfo, 
device);
        options->speed = xf86libinput_parse_accel_option(pInfo, device);
        options->accel_profile = xf86libinput_parse_accel_profile_option(pInfo, 
device);
@@ -2046,6 +2079,8 @@ _X_EXPORT XF86ModuleData libinputModuleData = {
 /* libinput-specific properties */
 static Atom prop_tap;
 static Atom prop_tap_default;
+static Atom prop_tap_drag;
+static Atom prop_tap_drag_default;
 static Atom prop_tap_drag_lock;
 static Atom prop_tap_drag_lock_default;
 static Atom prop_calibration;
@@ -2136,6 +2171,37 @@ LibinputSetPropertyTap(DeviceIntPtr dev,
 }
 
 static inline int
+LibinputSetPropertyTapDrag(DeviceIntPtr dev,
+                          Atom atom,
+                          XIPropertyValuePtr val,
+                          BOOL checkonly)
+{
+       InputInfoPtr pInfo = dev->public.devicePrivate;
+       struct xf86libinput *driver_data = pInfo->private;
+       struct libinput_device *device = driver_data->shared_device->device;
+       BOOL* data;
+
+       if (val->format != 8 || val->size != 1 || val->type != XA_INTEGER)
+               return BadMatch;
+
+       data = (BOOL*)val->data;
+       if (checkonly) {
+               if (*data != 0 && *data != 1)
+                       return BadValue;
+
+               if (!xf86libinput_check_device(dev, atom))
+                       return BadMatch;
+
+               if (libinput_device_config_tap_get_finger_count(device) == 0)
+                       return BadMatch;
+       } else {
+               driver_data->options.tap_drag = *data;
+       }
+
+       return Success;
+}
+
+static inline int
 LibinputSetPropertyTapDragLock(DeviceIntPtr dev,
                               Atom atom,
                               XIPropertyValuePtr val,
@@ -2673,6 +2739,8 @@ LibinputSetProperty(DeviceIntPtr dev, Atom atom, 
XIPropertyValuePtr val,
 
        if (atom == prop_tap)
                rc = LibinputSetPropertyTap(dev, atom, val, checkonly);
+       else if (atom == prop_tap_drag)
+               rc = LibinputSetPropertyTapDrag(dev, atom, val, checkonly);
        else if (atom == prop_tap_drag_lock)
                rc = LibinputSetPropertyTapDragLock(dev, atom, val, checkonly);
        else if (atom == prop_calibration)
@@ -2704,6 +2772,7 @@ LibinputSetProperty(DeviceIntPtr dev, Atom atom, 
XIPropertyValuePtr val,
                rc = LibinputSetPropertyHorizScroll(dev, atom, val, checkonly);
        else if (atom == prop_device || atom == prop_product_id ||
                 atom == prop_tap_default ||
+                atom == prop_tap_drag_default ||
                 atom == prop_tap_drag_lock_default ||
                 atom == prop_calibration_default ||
                 atom == prop_accel_default ||
@@ -2778,6 +2847,30 @@ LibinputInitTapProperty(DeviceIntPtr dev,
 }
 
 static void
+LibinputInitTapDragProperty(DeviceIntPtr dev,
+                           struct xf86libinput *driver_data,
+                           struct libinput_device *device)
+{
+       BOOL drag = driver_data->options.tap_drag;
+
+       if (libinput_device_config_tap_get_finger_count(device) == 0)
+               return;
+
+       prop_tap_drag = LibinputMakeProperty(dev,
+                                            LIBINPUT_PROP_TAP_DRAG,
+                                            XA_INTEGER, 8,
+                                            1, &drag);
+       if (!prop_tap_drag)
+               return;
+
+       drag = libinput_device_config_tap_get_default_drag_enabled(device);
+       prop_tap_drag_default = LibinputMakeProperty(dev,
+                                                    
LIBINPUT_PROP_TAP_DRAG_DEFAULT,
+                                                    XA_INTEGER, 8,
+                                                    1, &drag);
+}
+
+static void
 LibinputInitTapDragLockProperty(DeviceIntPtr dev,
                                struct xf86libinput *driver_data,
                                struct libinput_device *device)
@@ -3293,6 +3386,7 @@ LibinputInitProperty(DeviceIntPtr dev)
        prop_float = XIGetKnownProperty("FLOAT");
 
        LibinputInitTapProperty(dev, driver_data, device);
+       LibinputInitTapDragProperty(dev, driver_data, device);
        LibinputInitTapDragLockProperty(dev, driver_data, device);
        LibinputInitCalibrationProperty(dev, driver_data, device);
        LibinputInitAccelProperty(dev, driver_data, device);

commit 20f5269a29b6f3697984872d689fbe8589e53b08
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Wed Jan 27 11:12:48 2016 +1000

    Fix default tapping drack lock property value
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/src/xf86libinput.c b/src/xf86libinput.c
index 5e5b11b..fd07cf3 100644
--- a/src/xf86libinput.c
+++ b/src/xf86libinput.c
@@ -2794,7 +2794,7 @@ LibinputInitTapDragLockProperty(DeviceIntPtr dev,
        if (!prop_tap_drag_lock)
                return;
 
-       drag_lock = libinput_device_config_tap_get_default_enabled(device);
+       drag_lock = 
libinput_device_config_tap_get_default_drag_lock_enabled(device);
        prop_tap_drag_lock_default = LibinputMakeProperty(dev,
                                                          
LIBINPUT_PROP_TAP_DRAG_LOCK_DEFAULT,
                                                          XA_INTEGER, 8,

commit 3dacb28b206098f261d731195ed7556fc83837ed
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Tue Nov 24 13:00:52 2015 +1000

    Allow hotplugging a device immediately
    
    This splits the hotplugging code up so we can use it through a callback but
    also as an immediate call that gives us back the device just hotplugged. 
Also
    added is the ability to add extra options to the device.
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/src/xf86libinput.c b/src/xf86libinput.c
index 78aa832..5e5b11b 100644
--- a/src/xf86libinput.c
+++ b/src/xf86libinput.c
@@ -136,6 +136,11 @@ struct xf86libinput {
        struct xorg_list shared_device_link;
 };
 
+enum hotplug_when {
+       HOTPLUG_LATER,
+       HOTPLUG_NOW,
+};
+
 static inline int
 use_server_fd(const InputInfoPtr pInfo) {
        return pInfo->fd > -1 && (pInfo->flags & XI86_SERVER_FD);
@@ -1740,25 +1745,38 @@ struct xf86libinput_hotplug_info {
        InputOption *input_options;
 };
 
-static Bool
-xf86libinput_hotplug_device(ClientPtr client, pointer closure)
+static DeviceIntPtr
+xf86libinput_hotplug_device(struct xf86libinput_hotplug_info *hotplug)
 {
-       struct xf86libinput_hotplug_info *hotplug = closure;
-       DeviceIntPtr unused;
+       DeviceIntPtr dev;
 
-       NewInputDeviceRequest(hotplug->input_options,
-                             hotplug->attrs,
-                             &unused);
+       if (NewInputDeviceRequest(hotplug->input_options,
+                                 hotplug->attrs,
+                                 &dev) != Success)
+               dev = NULL;
 
        input_option_free_list(&hotplug->input_options);
        FreeInputAttributes(hotplug->attrs);
        free(hotplug);
 
+       return dev;
+}
+
+static Bool
+xf86libinput_hotplug_device_cb(ClientPtr client, pointer closure)
+{
+       struct xf86libinput_hotplug_info *hotplug = closure;
+
+       xf86libinput_hotplug_device(hotplug);
+
        return TRUE;
 }
 
-static void
-xf86libinput_create_subdevice(InputInfoPtr pInfo, uint32_t capabilities)
+static DeviceIntPtr
+xf86libinput_create_subdevice(InputInfoPtr pInfo,
+                             uint32_t capabilities,
+                             enum hotplug_when when,
+                             XF86OptionPtr extra_options)
 {
        struct xf86libinput *driver_data = pInfo->private;
        struct xf86libinput_device *shared_device;
@@ -1773,6 +1791,7 @@ xf86libinput_create_subdevice(InputInfoPtr pInfo, 
uint32_t capabilities)
 
        options = xf86OptionListDuplicate(pInfo->options);
        options = xf86ReplaceStrOption(options, "_source", "_driver/libinput");
+       options = xf86OptionListMerge(options, extra_options);
 
        if (capabilities & CAP_KEYBOARD)
                options = xf86ReplaceBoolOption(options, 
"_libinput/cap-keyboard", 1);
@@ -1793,13 +1812,18 @@ xf86libinput_create_subdevice(InputInfoPtr pInfo, 
uint32_t capabilities)
 
        hotplug = calloc(1, sizeof(*hotplug));
        if (!hotplug)
-               return;
+               return NULL;
 
        hotplug->input_options = iopts;
        hotplug->attrs = DuplicateInputAttributes(pInfo->attrs);
 
        xf86IDrvMsg(pInfo, X_INFO, "needs a virtual subdevice\n");
-       QueueWorkProc(xf86libinput_hotplug_device, serverClient, hotplug);
+       if (when == HOTPLUG_LATER)
+               QueueWorkProc(xf86libinput_hotplug_device_cb, serverClient, 
hotplug);
+       else
+               return xf86libinput_hotplug_device(hotplug);
+
+       return NULL;
 }
 
 static BOOL
@@ -1939,7 +1963,10 @@ xf86libinput_pre_init(InputDriverPtr drv,
            driver_data->capabilities & CAP_KEYBOARD &&
            driver_data->capabilities & (CAP_POINTER|CAP_TOUCH)) {
                driver_data->capabilities &= ~CAP_KEYBOARD;
-               xf86libinput_create_subdevice(pInfo, CAP_KEYBOARD);
+               xf86libinput_create_subdevice(pInfo,
+                                             CAP_KEYBOARD,
+                                             HOTPLUG_LATER,
+                                             NULL);
        }
 
        pInfo->type_name = xf86libinput_get_type_name(device, driver_data);

commit db8e73141c3ebb09c19e95aab5dee46d331835df
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Mon Nov 23 15:31:59 2015 +1000

    Change creating subdevices to something more generic
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/src/xf86libinput.c b/src/xf86libinput.c
index 7008fac..78aa832 100644
--- a/src/xf86libinput.c
+++ b/src/xf86libinput.c
@@ -1758,7 +1758,7 @@ xf86libinput_hotplug_device(ClientPtr client, pointer 
closure)
 }
 
 static void
-xf86libinput_create_keyboard_subdevice(InputInfoPtr pInfo)
+xf86libinput_create_subdevice(InputInfoPtr pInfo, uint32_t capabilities)
 {
        struct xf86libinput *driver_data = pInfo->private;
        struct xf86libinput_device *shared_device;
@@ -1773,7 +1773,13 @@ xf86libinput_create_keyboard_subdevice(InputInfoPtr 
pInfo)
 
        options = xf86OptionListDuplicate(pInfo->options);
        options = xf86ReplaceStrOption(options, "_source", "_driver/libinput");
-       options = xf86ReplaceStrOption(options, "_libinput/caps", "keyboard");
+
+       if (capabilities & CAP_KEYBOARD)
+               options = xf86ReplaceBoolOption(options, 
"_libinput/cap-keyboard", 1);
+       if (capabilities & CAP_POINTER)
+               options = xf86ReplaceBoolOption(options, 
"_libinput/cap-pointer", 1);
+       if (capabilities & CAP_TOUCH)
+               options = xf86ReplaceBoolOption(options, "_libinput/cap-touch", 
1);
 
        /* need convert from one option list to the other. woohoo. */
        o = options;
@@ -1809,6 +1815,21 @@ xf86libinput_is_subdevice(InputInfoPtr pInfo)
        return is_subdevice;
 }
 
+static inline uint32_t
+caps_from_options(InputInfoPtr pInfo)
+{
+       uint32_t capabilities = 0;
+
+       if (xf86CheckBoolOption(pInfo->options, "_libinput/cap-keyboard", 0))
+               capabilities |= CAP_KEYBOARD;
+       if (xf86CheckBoolOption(pInfo->options, "_libinput/cap-pointer", 0))
+               capabilities |= CAP_POINTER;
+       if (xf86CheckBoolOption(pInfo->options, "_libinput/cap-touch", 0))
+               capabilities |= CAP_TOUCH;
+
+       return capabilities;
+}
+
 static int
 xf86libinput_pre_init(InputDriverPtr drv,
                      InputInfoPtr pInfo,
@@ -1903,7 +1924,7 @@ xf86libinput_pre_init(InputDriverPtr drv,
                if (libinput_device_has_capability(device, 
LIBINPUT_DEVICE_CAP_TOUCH))
                        driver_data->capabilities |= CAP_TOUCH;
        } else {
-               driver_data->capabilities = CAP_KEYBOARD;
+               driver_data->capabilities = caps_from_options(pInfo);
        }
 
        /* Disable acceleration in the server, libinput does it for us */
@@ -1918,7 +1939,7 @@ xf86libinput_pre_init(InputDriverPtr drv,
            driver_data->capabilities & CAP_KEYBOARD &&
            driver_data->capabilities & (CAP_POINTER|CAP_TOUCH)) {
                driver_data->capabilities &= ~CAP_KEYBOARD;
-               xf86libinput_create_keyboard_subdevice(pInfo);
+               xf86libinput_create_subdevice(pInfo, CAP_KEYBOARD);
        }
 
        pInfo->type_name = xf86libinput_get_type_name(device, driver_data);

Reply via email to