From 507a3076ded1e381233c0d0358ea455bd5ec052f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Mon, 6 Sep 2021 09:17:31 +0200 Subject: [PATCH] winebus.sys: Return an event from SDL bus wait on device creation. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of calling bus_create_hid_device. Signed-off-by: RĂ©mi Bernon Signed-off-by: Alexandre Julliard --- dlls/winebus.sys/bus_sdl.c | 14 ++++---------- dlls/winebus.sys/main.c | 10 ++++++++++ dlls/winebus.sys/unix_private.h | 1 + dlls/winebus.sys/unixlib.c | 14 ++++++++++++++ dlls/winebus.sys/unixlib.h | 7 +++++++ 5 files changed, 36 insertions(+), 10 deletions(-) diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c index 1f7cf237e25..80252e7e6b1 100644 --- a/dlls/winebus.sys/bus_sdl.c +++ b/dlls/winebus.sys/bus_sdl.c @@ -741,7 +741,6 @@ static void sdl_add_device(unsigned int index) .serial = {'0','0','0','0',0}, }; struct platform_private *private; - DEVICE_OBJECT *device = NULL; char guid_str[34]; SDL_Joystick* joystick; @@ -791,16 +790,11 @@ static void sdl_add_device(unsigned int index) if (!(private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*private)))) return; private->unix_device.vtbl = &sdl_device_vtbl; + private->sdl_joystick = joystick; + private->sdl_controller = controller; + private->id = id; - device = bus_create_hid_device(&desc, &private->unix_device); - if (!device) HeapFree(GetProcessHeap(), 0, private); - else - { - private->sdl_joystick = joystick; - private->sdl_controller = controller; - private->id = id; - IoInvalidateDeviceRelations(bus_pdo, BusRelations); - } + bus_event_queue_device_created(&event_queue, &private->unix_device, &desc); } static void process_device_event(SDL_Event *event) diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c index 6093a0b79eb..8a565bc3c46 100644 --- a/dlls/winebus.sys/main.c +++ b/dlls/winebus.sys/main.c @@ -578,6 +578,16 @@ static DWORD CALLBACK bus_main_thread(void *args) LeaveCriticalSection(&device_list_cs); IoInvalidateDeviceRelations(bus_pdo, BusRelations); break; + case BUS_EVENT_TYPE_DEVICE_CREATED: + device = bus_create_hid_device(&event->device_created.desc, event->device_created.device); + if (device) IoInvalidateDeviceRelations(bus_pdo, BusRelations); + else + { + WARN("failed to create device for %s bus device %p\n", + debugstr_w(bus.name), event->device_created.device); + winebus_call(device_remove, event->device_created.device); + } + break; } } diff --git a/dlls/winebus.sys/unix_private.h b/dlls/winebus.sys/unix_private.h index 81c4658068b..5cf999fff86 100644 --- a/dlls/winebus.sys/unix_private.h +++ b/dlls/winebus.sys/unix_private.h @@ -61,6 +61,7 @@ extern NTSTATUS iohid_bus_stop(void *) DECLSPEC_HIDDEN; extern void bus_event_queue_destroy(struct list *queue) DECLSPEC_HIDDEN; extern BOOL bus_event_queue_device_removed(struct list *queue, const WCHAR *bus_id, void *context) DECLSPEC_HIDDEN; +extern BOOL bus_event_queue_device_created(struct list *queue, struct unix_device *device, struct device_desc *desc) DECLSPEC_HIDDEN; extern BOOL bus_event_queue_pop(struct list *queue, struct bus_event *event) DECLSPEC_HIDDEN; struct hid_descriptor diff --git a/dlls/winebus.sys/unixlib.c b/dlls/winebus.sys/unixlib.c index 2337cb3706d..9b0ccc0ae1a 100644 --- a/dlls/winebus.sys/unixlib.c +++ b/dlls/winebus.sys/unixlib.c @@ -327,6 +327,20 @@ BOOL bus_event_queue_device_removed(struct list *queue, const WCHAR *bus_id, voi return TRUE; } +BOOL bus_event_queue_device_created(struct list *queue, struct unix_device *device, struct device_desc *desc) +{ + ULONG size = sizeof(struct bus_event); + struct bus_event *event = HeapAlloc(GetProcessHeap(), 0, size); + if (!event) return FALSE; + + event->type = BUS_EVENT_TYPE_DEVICE_CREATED; + event->device_created.device = device; + event->device_created.desc = *desc; + list_add_tail(queue, &event->entry); + + return TRUE; +} + BOOL bus_event_queue_pop(struct list *queue, struct bus_event *event) { struct list *entry = list_head(queue); diff --git a/dlls/winebus.sys/unixlib.h b/dlls/winebus.sys/unixlib.h index 96671de0cac..85a03dd17ee 100644 --- a/dlls/winebus.sys/unixlib.h +++ b/dlls/winebus.sys/unixlib.h @@ -65,6 +65,7 @@ enum bus_event_type { BUS_EVENT_TYPE_NONE, BUS_EVENT_TYPE_DEVICE_REMOVED, + BUS_EVENT_TYPE_DEVICE_CREATED, }; struct bus_event @@ -79,6 +80,12 @@ struct bus_event const WCHAR *bus_id; void *context; } device_removed; + + struct + { + struct unix_device *device; + struct device_desc desc; + } device_created; }; };