From a49bb2661d11b4a6e5226250f326dfaf7a23e91f Mon Sep 17 00:00:00 2001 From: Joshua Thielen <thielen@netperson.net> Date: Sun, 4 Jul 1999 12:55:10 +0000 Subject: [PATCH] Fixed DestroyAcceleratorTable and implemented CreateAcceleratorTableW. --- include/winuser.h | 3 +++ loader/resource.c | 59 ++++++++++++++++++++++++++++++++++++++++++--- relay32/user32.spec | 2 +- 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/include/winuser.h b/include/winuser.h index 0af79afd4b1..d6c70fa738f 100644 --- a/include/winuser.h +++ b/include/winuser.h @@ -2921,6 +2921,9 @@ WORD WINAPI CascadeWindows(HWND, UINT, const LPRECT, UINT, const HWND *); INT WINAPI CopyAcceleratorTableA(HACCEL,LPACCEL,INT); INT WINAPI CopyAcceleratorTableW(HACCEL,LPACCEL,INT); #define CopyAcceleratorTable WINELIB_NAME_AW(CopyAcceleratorTable) +HACCEL WINAPI CreateAcceleratorTableA(LPACCEL,INT); +HACCEL WINAPI CreateAcceleratorTableW(LPACCEL,INT); +#define CreateAcceleratorTable WINELIB_NAME_AW(CreateAcceleratorTable) HICON WINAPI CreateIconIndirect(LPICONINFO); BOOL WINAPI DestroyAcceleratorTable(HACCEL); BOOL WINAPI EnumDisplayMonitors(HDC,LPRECT,MONITORENUMPROC,LPARAM); diff --git a/loader/resource.c b/loader/resource.c index 38f412e1645..8b66bf654e6 100644 --- a/loader/resource.c +++ b/loader/resource.c @@ -31,6 +31,7 @@ #include "libres.h" #include "winerror.h" #include "debugstr.h" +#include "winnls.h" DECLARE_DEBUG_CHANNEL(accel) DECLARE_DEBUG_CHANNEL(resource) @@ -777,6 +778,60 @@ HACCEL WINAPI CreateAcceleratorTableA(LPACCEL lpaccel, INT cEntries) return hAccel; } +/********************************************************************* + * CreateAcceleratorTableW (USER32.64) + * + * + */ +HACCEL WINAPI CreateAcceleratorTableW(LPACCEL lpaccel, INT cEntries) +{ + HACCEL hAccel; + LPACCEL16 accel; + int i; + char ckey; + + /* Do parameter checking just in case someone's trying to be + funny. */ + if(cEntries < 1) { + WARN_(accel)("Application sent invalid parameters (%p %d).\n", + lpaccel, cEntries); + SetLastError(ERROR_INVALID_PARAMETER); + return (HACCEL)NULL; + } + FIXME_(accel)("should check that the accelerator descriptions are valid," + " return NULL and SetLastError() if not.\n"); + + + /* Allocate memory and copy the table. */ + hAccel = GlobalAlloc16(0,cEntries*sizeof(ACCEL16)); + + TRACE_(accel)("handle %x\n", hAccel); + if(!hAccel) { + ERR_(accel)("Out of memory.\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return (HACCEL)NULL; + } + accel = GlobalLock16(hAccel); + + + for (i=0;i<cEntries;i++) { + accel[i].fVirt = lpaccel[i].fVirt; + if( !(accel[i].fVirt & FVIRTKEY) ) { + ckey = (char) lpaccel[i].key; + if(!MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, &ckey, 1, &accel[i].key, 1)) + WARN_(accel)("Error converting ASCII accelerator table to Unicode"); + } + else + accel[i].key = lpaccel[i].key; + accel[i].cmd = lpaccel[i].cmd; + } + + /* Set the end-of-table terminator. */ + accel[cEntries-1].fVirt |= 0x80; + + TRACE_(accel)("Allocated accelerator handle %x\n", hAccel); + return hAccel; +} /****************************************************************************** * DestroyAcceleratorTable [USER32.130] @@ -792,9 +847,7 @@ HACCEL WINAPI CreateAcceleratorTableA(LPACCEL lpaccel, INT cEntries) */ BOOL WINAPI DestroyAcceleratorTable( HACCEL handle ) { - FIXME_(accel)("(0x%x): stub\n", handle); - /* FIXME: GlobalFree16(handle); */ - return TRUE; + return GlobalFree16(handle); } /********************************************************************** diff --git a/relay32/user32.spec b/relay32/user32.spec index 4b059a292e7..db1be117f98 100644 --- a/relay32/user32.spec +++ b/relay32/user32.spec @@ -66,7 +66,7 @@ init MAIN_UserInit 62 stdcall CopyRect(ptr ptr) CopyRect 63 stdcall CountClipboardFormats() CountClipboardFormats 64 stdcall CreateAcceleratorTableA(ptr long) CreateAcceleratorTableA - 65 stub CreateAcceleratorTableW + 65 stdcall CreateAcceleratorTableW(ptr long) CreateAcceleratorTableW 66 stdcall CreateCaret(long long long long) CreateCaret 67 stdcall CreateCursor(long long long long long ptr ptr) CreateCursor 68 stub CreateDesktopA -- GitLab