Rémi Bernon : winebus.sys: Allocate mouse and keyboard devices dynamically.

Alexandre Julliard julliard at winehq.org
Tue Sep 14 16:00:11 CDT 2021


Module: wine
Branch: master
Commit: bf1446523cb8592f83fc6e7289371c2cbccb099d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=bf1446523cb8592f83fc6e7289371c2cbccb099d

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Tue Sep 14 08:58:23 2021 +0200

winebus.sys: Allocate mouse and keyboard devices dynamically.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winebus.sys/unixlib.c | 67 +++++++++++++++++++++++++++++++++-------------
 1 file changed, 49 insertions(+), 18 deletions(-)

diff --git a/dlls/winebus.sys/unixlib.c b/dlls/winebus.sys/unixlib.c
index b37d9534540..b433c0dcbdf 100644
--- a/dlls/winebus.sys/unixlib.c
+++ b/dlls/winebus.sys/unixlib.c
@@ -34,11 +34,22 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(plugplay);
 
-static struct hid_descriptor mouse_desc;
-static struct hid_descriptor keyboard_desc;
+struct mouse_device
+{
+    struct unix_device unix_device;
+    struct hid_descriptor desc;
+};
+
+static inline struct mouse_device *mouse_from_unix_device(struct unix_device *iface)
+{
+    return CONTAINING_RECORD(iface, struct mouse_device, unix_device);
+}
 
 static void mouse_destroy(struct unix_device *iface)
 {
+    struct mouse_device *impl = mouse_from_unix_device(iface);
+    hid_descriptor_free(&impl->desc);
+    unix_device_destroy(iface);
 }
 
 static int mouse_compare(struct unix_device *iface, void *context)
@@ -48,11 +59,13 @@ static int mouse_compare(struct unix_device *iface, void *context)
 
 static NTSTATUS mouse_start(struct unix_device *iface, DEVICE_OBJECT *device)
 {
-    if (!hid_descriptor_begin(&mouse_desc, HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_MOUSE))
+    struct mouse_device *impl = mouse_from_unix_device(iface);
+
+    if (!hid_descriptor_begin(&impl->desc, HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_MOUSE))
         return STATUS_NO_MEMORY;
-    if (!hid_descriptor_add_buttons(&mouse_desc, HID_USAGE_PAGE_BUTTON, 1, 3))
+    if (!hid_descriptor_add_buttons(&impl->desc, HID_USAGE_PAGE_BUTTON, 1, 3))
         return STATUS_NO_MEMORY;
-    if (!hid_descriptor_end(&mouse_desc))
+    if (!hid_descriptor_end(&impl->desc))
         return STATUS_NO_MEMORY;
 
     return STATUS_SUCCESS;
@@ -64,12 +77,14 @@ static void mouse_stop(struct unix_device *iface)
 
 static NTSTATUS mouse_get_report_descriptor(struct unix_device *iface, BYTE *buffer, DWORD length, DWORD *ret_length)
 {
+    struct mouse_device *impl = mouse_from_unix_device(iface);
+
     TRACE("buffer %p, length %u.\n", buffer, length);
 
-    *ret_length = mouse_desc.size;
-    if (length < mouse_desc.size) return STATUS_BUFFER_TOO_SMALL;
+    *ret_length = impl->desc.size;
+    if (length < impl->desc.size) return STATUS_BUFFER_TOO_SMALL;
 
-    memcpy(buffer, mouse_desc.data, mouse_desc.size);
+    memcpy(buffer, impl->desc.data, impl->desc.size);
     return STATUS_SUCCESS;
 }
 
@@ -115,18 +130,31 @@ static const struct device_desc mouse_device_desc =
     .product = {"Wine HID mouse"},
     .serialnumber = {"0000"},
 };
-static struct unix_device mouse_device = {.vtbl = &mouse_vtbl};
 
 static NTSTATUS mouse_device_create(void *args)
 {
     struct device_create_params *params = args;
     params->desc = mouse_device_desc;
-    params->device = &mouse_device;
+    params->device = unix_device_create(&mouse_vtbl, sizeof(struct mouse_device));
     return STATUS_SUCCESS;
 }
 
+struct keyboard_device
+{
+    struct unix_device unix_device;
+    struct hid_descriptor desc;
+};
+
+static inline struct keyboard_device *keyboard_from_unix_device(struct unix_device *iface)
+{
+    return CONTAINING_RECORD(iface, struct keyboard_device, unix_device);
+}
+
 static void keyboard_destroy(struct unix_device *iface)
 {
+    struct keyboard_device *impl = keyboard_from_unix_device(iface);
+    hid_descriptor_free(&impl->desc);
+    unix_device_destroy(iface);
 }
 
 static int keyboard_compare(struct unix_device *iface, void *context)
@@ -136,11 +164,13 @@ static int keyboard_compare(struct unix_device *iface, void *context)
 
 static NTSTATUS keyboard_start(struct unix_device *iface, DEVICE_OBJECT *device)
 {
-    if (!hid_descriptor_begin(&keyboard_desc, HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_KEYBOARD))
+    struct keyboard_device *impl = keyboard_from_unix_device(iface);
+
+    if (!hid_descriptor_begin(&impl->desc, HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_KEYBOARD))
         return STATUS_NO_MEMORY;
-    if (!hid_descriptor_add_buttons(&keyboard_desc, HID_USAGE_PAGE_KEYBOARD, 0, 101))
+    if (!hid_descriptor_add_buttons(&impl->desc, HID_USAGE_PAGE_KEYBOARD, 0, 101))
         return STATUS_NO_MEMORY;
-    if (!hid_descriptor_end(&keyboard_desc))
+    if (!hid_descriptor_end(&impl->desc))
         return STATUS_NO_MEMORY;
 
     return STATUS_SUCCESS;
@@ -152,12 +182,14 @@ static void keyboard_stop(struct unix_device *iface)
 
 static NTSTATUS keyboard_get_report_descriptor(struct unix_device *iface, BYTE *buffer, DWORD length, DWORD *ret_length)
 {
+    struct keyboard_device *impl = keyboard_from_unix_device(iface);
+
     TRACE("buffer %p, length %u.\n", buffer, length);
 
-    *ret_length = keyboard_desc.size;
-    if (length < keyboard_desc.size) return STATUS_BUFFER_TOO_SMALL;
+    *ret_length = impl->desc.size;
+    if (length < impl->desc.size) return STATUS_BUFFER_TOO_SMALL;
 
-    memcpy(buffer, keyboard_desc.data, keyboard_desc.size);
+    memcpy(buffer, impl->desc.data, impl->desc.size);
     return STATUS_SUCCESS;
 }
 
@@ -203,13 +235,12 @@ static const struct device_desc keyboard_device_desc =
     .product = {"Wine HID keyboard"},
     .serialnumber = {"0000"},
 };
-static struct unix_device keyboard_device = {.vtbl = &keyboard_vtbl};
 
 static NTSTATUS keyboard_device_create(void *args)
 {
     struct device_create_params *params = args;
     params->desc = keyboard_device_desc;
-    params->device = &keyboard_device;
+    params->device = unix_device_create(&keyboard_vtbl, sizeof(struct keyboard_device));
     return STATUS_SUCCESS;
 }
 




More information about the wine-cvs mailing list