From 93baf2c7ad2f3355ebc0d53fdf99f99ae98bf43b Mon Sep 17 00:00:00 2001 From: "KJK::Hyperion" Date: Sun, 20 Jul 2003 03:45:31 +0000 Subject: [PATCH] Fixed a bug in the accelerators code svn path=/trunk/; revision=5176 --- reactos/include/user32/accel.h | 38 ++++++++++++++++++++++++++++++ reactos/lib/user32/misc/dllmain.c | 3 +++ reactos/lib/user32/windows/accel.c | 32 ++++--------------------- 3 files changed, 45 insertions(+), 28 deletions(-) create mode 100644 reactos/include/user32/accel.h diff --git a/reactos/include/user32/accel.h b/reactos/include/user32/accel.h new file mode 100644 index 00000000000..68bfec4a291 --- /dev/null +++ b/reactos/include/user32/accel.h @@ -0,0 +1,38 @@ +/* $Id: accel.h,v 1.1 2003/07/20 03:45:31 hyperion Exp $ +*/ + +#ifndef __USER32_ACCEL_H_INCLUDED__ +#define __USER32_ACCEL_H_INCLUDED__ + +/* RT_ACCELERATOR resources are arrays of RES_ACCEL structures */ +typedef struct _RES_ACCEL +{ + WORD fVirt; + WORD key; + DWORD cmd; +} +RES_ACCEL; + +/* ACCELERATOR TABLES CACHE */ +/* Cache entry */ +typedef struct _USER_ACCEL_CACHE_ENTRY +{ + struct _USER_ACCEL_CACHE_ENTRY * Next; + ULONG_PTR Usage; /* how many times the table has been loaded */ + HACCEL Object; /* handle to the NtUser accelerator table object */ + HGLOBAL Data; /* base address of the resource data */ +} +U32_ACCEL_CACHE_ENTRY; + +/* Lock guarding the cache */ +extern CRITICAL_SECTION U32AccelCacheLock; + +/* Cache */ +extern U32_ACCEL_CACHE_ENTRY * U32AccelCache; + +extern U32_ACCEL_CACHE_ENTRY ** WINAPI U32AccelCacheFind(HANDLE, HGLOBAL); +extern void WINAPI U32AccelCacheAdd(HACCEL, HGLOBAL); + +#endif + +/* EOF */ diff --git a/reactos/lib/user32/misc/dllmain.c b/reactos/lib/user32/misc/dllmain.c index cc1d1e1bd79..ed62c950220 100644 --- a/reactos/lib/user32/misc/dllmain.c +++ b/reactos/lib/user32/misc/dllmain.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #ifdef DBG @@ -43,6 +44,8 @@ Init(VOID) (PVOID)User32SendSTYLECHANGEDMessageForKernel; UserSetupInternalPos(); + + RtlInitializeCriticalSection(&U32AccelCacheLock); GdiDllInitialize(NULL, DLL_PROCESS_ATTACH, NULL); diff --git a/reactos/lib/user32/windows/accel.c b/reactos/lib/user32/windows/accel.c index b0c91e3eb79..6ae6f157037 100644 --- a/reactos/lib/user32/windows/accel.c +++ b/reactos/lib/user32/windows/accel.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: accel.c,v 1.9 2003/07/11 17:08:44 chorns Exp $ +/* $Id: accel.c,v 1.10 2003/07/20 03:45:31 hyperion Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/windows/input.c @@ -28,42 +28,18 @@ */ /* INCLUDES ******************************************************************/ -#include #include -#include -#include +#include +#include /* FUNCTIONS *****************************************************************/ -/* RT_ACCELERATOR resources are arrays of RES_ACCEL structures */ -typedef struct _RES_ACCEL -{ - WORD fVirt; - WORD key; - DWORD cmd; -} -RES_ACCEL; - -/* ACCELERATOR TABLES CACHE */ -/* Cache entry */ -typedef struct _USER_ACCEL_CACHE_ENTRY -{ - struct _USER_ACCEL_CACHE_ENTRY * Next; - ULONG_PTR Usage; /* how many times the table has been loaded */ - HACCEL Object; /* handle to the NtUser accelerator table object */ - HGLOBAL Data; /* base address of the resource data */ -} -U32_ACCEL_CACHE_ENTRY; - /* Lock guarding the cache */ CRITICAL_SECTION U32AccelCacheLock; /* Cache */ U32_ACCEL_CACHE_ENTRY * U32AccelCache = NULL; -U32_ACCEL_CACHE_ENTRY ** WINAPI U32AccelCacheFind(HANDLE, HGLOBAL); -void WINAPI U32AccelCacheAdd(HACCEL, HGLOBAL); - /* Look up a handle or resource address in the cache */ U32_ACCEL_CACHE_ENTRY ** WINAPI U32AccelCacheFind(HANDLE Object, HGLOBAL Data) { @@ -220,7 +196,7 @@ BOOL WINAPI DestroyAcceleratorTable(HACCEL hAccel) U32_ACCEL_CACHE_ENTRY * pEntry = *ppEntry; /* decrement the reference count */ - nUsage = pEntry->Usage= pEntry->Usage - 1; + nUsage = pEntry->Usage = pEntry->Usage - 1; /* reference count now zero: destroy the cache entry */ if(nUsage == 0)