Zebediah Figura : user32: Implement RegisterDeviceNotification().
Alexandre Julliard
julliard at winehq.org
Wed May 6 15:34:28 CDT 2020
Module: wine
Branch: master
Commit: e6df76770ee59b34fc7eafffb92e3500f4b9faa4
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e6df76770ee59b34fc7eafffb92e3500f4b9faa4
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Tue May 5 11:25:40 2020 -0500
user32: Implement RegisterDeviceNotification().
Based on a patch by Micah N Gorrell.
This fixes controller hotplugging in Into the Breach.
Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/Makefile.in | 2 +-
dlls/user32/misc.c | 81 ++++++++++++++++++++++++++++++-------------------
include/winuser.h | 4 ++-
3 files changed, 53 insertions(+), 34 deletions(-)
diff --git a/dlls/user32/Makefile.in b/dlls/user32/Makefile.in
index a91dd89c94..2d45552bcb 100644
--- a/dlls/user32/Makefile.in
+++ b/dlls/user32/Makefile.in
@@ -1,7 +1,7 @@
EXTRADEFS = -D_USER32_ -D_WINABLE_
MODULE = user32.dll
IMPORTLIB = user32
-IMPORTS = setupapi gdi32 version advapi32 kernelbase
+IMPORTS = setupapi gdi32 version sechost advapi32 kernelbase
EXTRAINCL = $(PNG_CFLAGS)
DELAYIMPORTS = hid imm32 usp10
diff --git a/dlls/user32/misc.c b/dlls/user32/misc.c
index 6e1f60612b..41909f9071 100644
--- a/dlls/user32/misc.c
+++ b/dlls/user32/misc.c
@@ -4,6 +4,7 @@
* Copyright 1995 Thomas Sandford
* Copyright 1997 Marcus Meissner
* Copyright 1998 Turchanov Sergey
+ * Copyright 2019 Micah N Gorrell for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,6 +31,7 @@
#include "wingdi.h"
#include "controls.h"
#include "user_private.h"
+#include "dbt.h"
#include "wine/unicode.h"
#include "wine/debug.h"
@@ -277,57 +279,72 @@ DWORD WINAPI RegisterTasklist (DWORD x)
return TRUE;
}
+static DWORD CALLBACK devnotify_window_callback(HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header)
+{
+ SendMessageTimeoutW(handle, WM_DEVICECHANGE, flags, (LPARAM)header, SMTO_ABORTIFHUNG, 2000, NULL);
+ return 0;
+}
+
+static DWORD CALLBACK devnotify_service_callback(HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header)
+{
+ FIXME("Support for service handles is not yet implemented!\n");
+ return 0;
+}
+
+struct device_notification_details
+{
+ DWORD (CALLBACK *cb)(HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header);
+ HANDLE handle;
+};
+
+extern HDEVNOTIFY WINAPI I_ScRegisterDeviceNotification( struct device_notification_details *details,
+ void *filter, DWORD flags );
+extern BOOL WINAPI I_ScUnregisterDeviceNotification( HDEVNOTIFY handle );
/***********************************************************************
* RegisterDeviceNotificationA (USER32.@)
*
* See RegisterDeviceNotificationW.
*/
-HDEVNOTIFY WINAPI RegisterDeviceNotificationA(HANDLE hnd, LPVOID notifyfilter, DWORD flags)
+HDEVNOTIFY WINAPI RegisterDeviceNotificationA(HANDLE hRecipient, LPVOID pNotificationFilter, DWORD dwFlags)
{
- FIXME("(hwnd=%p, filter=%p,flags=0x%08x) returns a fake device notification handle!\n",
- hnd,notifyfilter,flags );
- return (HDEVNOTIFY) 0xcafecafe;
+ TRACE("(hwnd=%p, filter=%p,flags=0x%08x)\n",
+ hRecipient,pNotificationFilter,dwFlags);
+ if (pNotificationFilter)
+ FIXME("The notification filter will requires an A->W when filter support is implemented\n");
+ return RegisterDeviceNotificationW(hRecipient, pNotificationFilter, dwFlags);
}
/***********************************************************************
* RegisterDeviceNotificationW (USER32.@)
- *
- * Registers a window with the system so that it will receive
- * notifications about a device.
- *
- * PARAMS
- * hRecipient [I] Window or service status handle that
- * will receive notifications.
- * pNotificationFilter [I] DEV_BROADCAST_HDR followed by some
- * type-specific data.
- * dwFlags [I] See notes
- *
- * RETURNS
- *
- * A handle to the device notification.
- *
- * NOTES
- *
- * The dwFlags parameter can be one of two values:
- *| DEVICE_NOTIFY_WINDOW_HANDLE - hRecipient is a window handle
- *| DEVICE_NOTIFY_SERVICE_HANDLE - hRecipient is a service status handle
*/
-HDEVNOTIFY WINAPI RegisterDeviceNotificationW(HANDLE hRecipient, LPVOID pNotificationFilter, DWORD dwFlags)
+HDEVNOTIFY WINAPI RegisterDeviceNotificationW( HANDLE handle, void *filter, DWORD flags )
{
- FIXME("(hwnd=%p, filter=%p,flags=0x%08x) returns a fake device notification handle!\n",
- hRecipient,pNotificationFilter,dwFlags );
- return (HDEVNOTIFY) 0xcafeaffe;
+ struct device_notification_details details;
+
+ TRACE("handle %p, filter %p, flags %#x\n", handle, filter, flags);
+
+ if (flags & ~(DEVICE_NOTIFY_SERVICE_HANDLE | DEVICE_NOTIFY_ALL_INTERFACE_CLASSES))
+ FIXME("unhandled flags %#x\n", flags);
+
+ details.handle = handle;
+
+ if (flags & DEVICE_NOTIFY_SERVICE_HANDLE)
+ details.cb = devnotify_service_callback;
+ else
+ details.cb = devnotify_window_callback;
+
+ return I_ScRegisterDeviceNotification( &details, filter, 0 );
}
/***********************************************************************
* UnregisterDeviceNotification (USER32.@)
- *
*/
-BOOL WINAPI UnregisterDeviceNotification(HDEVNOTIFY hnd)
+BOOL WINAPI UnregisterDeviceNotification( HDEVNOTIFY handle )
{
- FIXME("(handle=%p), STUB!\n", hnd);
- return TRUE;
+ TRACE("%p\n", handle);
+
+ return I_ScUnregisterDeviceNotification( handle );
}
/***********************************************************************
diff --git a/include/winuser.h b/include/winuser.h
index 5fd774d295..aa392d636c 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -3114,7 +3114,9 @@ typedef struct tagTRACKMOUSEEVENT {
typedef PVOID HDEVNOTIFY;
typedef HDEVNOTIFY *PHDEVNOTIFY;
-#define DEVICE_NOTIFY_WINDOW_HANDLE 0x00000000
+#define DEVICE_NOTIFY_WINDOW_HANDLE 0x00000000
+#define DEVICE_NOTIFY_SERVICE_HANDLE 0x00000001
+#define DEVICE_NOTIFY_ALL_INTERFACE_CLASSES 0x00000004
/* used for GetWindowInfo() */
More information about the wine-cvs
mailing list