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 <[email protected]>
---
 src/xf86libinput.c | 51 +++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 39 insertions(+), 12 deletions(-)

diff --git a/src/xf86libinput.c b/src/xf86libinput.c
index e20d821..5ff80e4 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);
@@ -1735,25 +1740,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;
@@ -1768,6 +1786,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);
@@ -1788,13 +1807,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
@@ -1934,7 +1958,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);
-- 
2.5.0

_______________________________________________
[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