Vincent Povirk : user32: Notify the user driver of hotkey changes.

Alexandre Julliard julliard at winehq.org
Tue Jul 5 12:59:06 CDT 2011


Module: wine
Branch: master
Commit: 8c0d568c32c4ce5938e825a35e92356af5829060
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=8c0d568c32c4ce5938e825a35e92356af5829060

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Thu Jun 23 12:34:26 2011 -0500

user32: Notify the user driver of hotkey changes.

---

 dlls/user32/driver.c       |   25 +++++++++++++++++++++++++
 dlls/user32/input.c        |   25 ++++++++++++++++++++-----
 dlls/user32/user_private.h |    2 ++
 3 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c
index d152f86..6e21ca2 100644
--- a/dlls/user32/driver.c
+++ b/dlls/user32/driver.c
@@ -80,8 +80,10 @@ static const USER_DRIVER *load_driver(void)
         GET_USER_FUNC(GetKeyboardLayoutName);
         GET_USER_FUNC(LoadKeyboardLayout);
         GET_USER_FUNC(MapVirtualKeyEx);
+        GET_USER_FUNC(RegisterHotKey);
         GET_USER_FUNC(ToUnicodeEx);
         GET_USER_FUNC(UnloadKeyboardLayout);
+        GET_USER_FUNC(UnregisterHotKey);
         GET_USER_FUNC(VkKeyScanEx);
         GET_USER_FUNC(CreateCursorIcon);
         GET_USER_FUNC(DestroyCursorIcon);
@@ -193,6 +195,11 @@ static UINT CDECL nulldrv_MapVirtualKeyEx( UINT code, UINT type, HKL layout )
     return 0;
 }
 
+static BOOL CDECL nulldrv_RegisterHotKey( HWND hwnd, UINT modifiers, UINT vk )
+{
+    return TRUE;
+}
+
 static INT CDECL nulldrv_ToUnicodeEx( UINT virt, UINT scan, const BYTE *state, LPWSTR str,
                                       int size, UINT flags, HKL layout )
 {
@@ -204,6 +211,10 @@ static BOOL CDECL nulldrv_UnloadKeyboardLayout( HKL layout )
     return 0;
 }
 
+static void CDECL nulldrv_UnregisterHotKey( HWND hwnd, UINT modifiers, UINT vk )
+{
+}
+
 static SHORT CDECL nulldrv_VkKeyScanEx( WCHAR ch, HKL layout )
 {
     return -1;
@@ -430,8 +441,10 @@ static USER_DRIVER null_driver =
     nulldrv_GetKeyboardLayoutName,
     nulldrv_LoadKeyboardLayout,
     nulldrv_MapVirtualKeyEx,
+    nulldrv_RegisterHotKey,
     nulldrv_ToUnicodeEx,
     nulldrv_UnloadKeyboardLayout,
+    nulldrv_UnregisterHotKey,
     nulldrv_VkKeyScanEx,
     /* cursor/icon functions */
     nulldrv_CreateCursorIcon,
@@ -528,6 +541,11 @@ static UINT CDECL loaderdrv_MapVirtualKeyEx( UINT code, UINT type, HKL layout )
     return load_driver()->pMapVirtualKeyEx( code, type, layout );
 }
 
+static BOOL CDECL loaderdrv_RegisterHotKey( HWND hwnd, UINT modifiers, UINT vk )
+{
+    return load_driver()->pRegisterHotKey( hwnd, modifiers, vk );
+}
+
 static INT CDECL loaderdrv_ToUnicodeEx( UINT virt, UINT scan, const BYTE *state, LPWSTR str,
                                   int size, UINT flags, HKL layout )
 {
@@ -539,6 +557,11 @@ static BOOL CDECL loaderdrv_UnloadKeyboardLayout( HKL layout )
     return load_driver()->pUnloadKeyboardLayout( layout );
 }
 
+static void CDECL loaderdrv_UnregisterHotKey( HWND hwnd, UINT modifiers, UINT vk )
+{
+    load_driver()->pUnregisterHotKey( hwnd, modifiers, vk );
+}
+
 static SHORT CDECL loaderdrv_VkKeyScanEx( WCHAR ch, HKL layout )
 {
     return load_driver()->pVkKeyScanEx( ch, layout );
@@ -765,8 +788,10 @@ static USER_DRIVER lazy_load_driver =
     loaderdrv_GetKeyboardLayoutName,
     loaderdrv_LoadKeyboardLayout,
     loaderdrv_MapVirtualKeyEx,
+    loaderdrv_RegisterHotKey,
     loaderdrv_ToUnicodeEx,
     loaderdrv_UnloadKeyboardLayout,
+    loaderdrv_UnregisterHotKey,
     loaderdrv_VkKeyScanEx,
     /* cursor/icon functions */
     loaderdrv_CreateCursorIcon,
diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index 335be1f..1ffce8d 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -984,10 +984,13 @@ UINT WINAPI GetKeyboardLayoutList(INT nBuff, HKL *layouts)
 BOOL WINAPI RegisterHotKey(HWND hwnd,INT id,UINT modifiers,UINT vk)
 {
     BOOL ret;
+    int replaced=0;
 
     TRACE_(keyboard)("(%p,%d,0x%08x,%X)\n",hwnd,id,modifiers,vk);
 
-    /* FIXME: Register hotkey with user driver. */
+    if ((hwnd == NULL || WIN_IsCurrentThread(hwnd)) &&
+        !USER_Driver->pRegisterHotKey(hwnd, modifiers, vk))
+        return FALSE;
 
     SERVER_START_REQ( register_hotkey )
     {
@@ -995,11 +998,17 @@ BOOL WINAPI RegisterHotKey(HWND hwnd,INT id,UINT modifiers,UINT vk)
         req->id = id;
         req->flags = modifiers;
         req->vkey = vk;
-        ret = !wine_server_call_err( req );
+        if ((ret = !wine_server_call_err( req )))
+        {
+            replaced = reply->replaced;
+            modifiers = reply->flags;
+            vk = reply->vkey;
+        }
     }
     SERVER_END_REQ;
 
-    /* FIXME: Unregister new or replaced hotkey with user driver if necessary. */
+    if (ret && replaced)
+        USER_Driver->pUnregisterHotKey(hwnd, modifiers, vk);
 
     return ret;
 }
@@ -1010,6 +1019,7 @@ BOOL WINAPI RegisterHotKey(HWND hwnd,INT id,UINT modifiers,UINT vk)
 BOOL WINAPI UnregisterHotKey(HWND hwnd,INT id)
 {
     BOOL ret;
+    UINT modifiers, vk;
 
     TRACE_(keyboard)("(%p,%d)\n",hwnd,id);
 
@@ -1017,11 +1027,16 @@ BOOL WINAPI UnregisterHotKey(HWND hwnd,INT id)
     {
         req->window = wine_server_user_handle( hwnd );
         req->id = id;
-        ret = !wine_server_call_err( req );
+        if ((ret = !wine_server_call_err( req )))
+        {
+            modifiers = reply->flags;
+            vk = reply->vkey;
+        }
     }
     SERVER_END_REQ;
 
-    /* FIXME: Unregister hotkey with user driver if necessary. */
+    if (ret)
+        USER_Driver->pUnregisterHotKey(hwnd, modifiers, vk);
 
     return ret;
 }
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 92b52a3..399974e 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -62,8 +62,10 @@ typedef struct tagUSER_DRIVER {
     BOOL   (CDECL *pGetKeyboardLayoutName)(LPWSTR);
     HKL    (CDECL *pLoadKeyboardLayout)(LPCWSTR, UINT);
     UINT   (CDECL *pMapVirtualKeyEx)(UINT, UINT, HKL);
+    BOOL   (CDECL *pRegisterHotKey)(HWND, UINT, UINT);
     INT    (CDECL *pToUnicodeEx)(UINT, UINT, const BYTE *, LPWSTR, int, UINT, HKL);
     BOOL   (CDECL *pUnloadKeyboardLayout)(HKL);
+    void   (CDECL *pUnregisterHotKey)(HWND, UINT, UINT);
     SHORT  (CDECL *pVkKeyScanEx)(WCHAR, HKL);
     /* cursor/icon functions */
     void   (CDECL *pCreateCursorIcon)(HCURSOR);




More information about the wine-cvs mailing list