user32: Store the 16-bit edit handle directly in the window extra bytes.
diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c
index 7f7520b..c91abc1 100644
--- a/dlls/user32/edit.c
+++ b/dlls/user32/edit.c
@@ -149,8 +149,6 @@
LPINT tabs;
LINEDEF *first_line_def; /* linked list of (soft) linebreaks */
HLOCAL hloc32W; /* our unicode local memory block */
- HLOCAL16 hloc16; /* alias for 16-bit control receiving EM_GETHANDLE16
- or EM_SETHANDLE16 */
HLOCAL hloc32A; /* alias for ANSI control receiving EM_GETHANDLE
or EM_SETHANDLE */
/*
@@ -1176,29 +1174,32 @@
es->text_length = (UINT)-1;
}
+#define GWW_HANDLE16 sizeof(EDITSTATE*)
+
/*********************************************************************
* EDIT_LockBuffer16
*/
static void EDIT_LockBuffer16(EDITSTATE *es)
{
STACK16FRAME* stack16 = MapSL(PtrToUlong(NtCurrentTeb()->WOW32Reserved));
+ HLOCAL16 hloc16 = GetWindowWord( es->hwndSelf, GWW_HANDLE16 );
HANDLE16 oldDS;
HLOCAL hloc32;
UINT size;
- if (!es->hloc16) return;
+ if (!hloc16) return;
if (!(hloc32 = es->hloc32A)) return;
oldDS = stack16->ds;
stack16->ds = GetWindowLongPtrW( es->hwndSelf, GWLP_HINSTANCE );
- size = LocalSize16(es->hloc16);
+ size = LocalSize16(hloc16);
if (LocalReAlloc( hloc32, size, LMEM_MOVEABLE ))
{
- char *text = MapSL( LocalLock16( es->hloc16 ));
+ char *text = MapSL( LocalLock16( hloc16 ));
char *dest = LocalLock( hloc32 );
memcpy( dest, text, size );
LocalUnlock( hloc32 );
- LocalUnlock16( es->hloc16 );
+ LocalUnlock16( hloc16 );
}
stack16->ds = oldDS;
@@ -1211,23 +1212,24 @@
static void EDIT_UnlockBuffer16(EDITSTATE *es)
{
STACK16FRAME* stack16 = MapSL(PtrToUlong(NtCurrentTeb()->WOW32Reserved));
+ HLOCAL16 hloc16 = GetWindowWord( es->hwndSelf, GWW_HANDLE16 );
HANDLE16 oldDS;
HLOCAL hloc32;
UINT size;
- if (!es->hloc16) return;
+ if (!hloc16) return;
if (!(hloc32 = es->hloc32A)) return;
size = LocalSize( hloc32 );
oldDS = stack16->ds;
stack16->ds = GetWindowLongPtrW( es->hwndSelf, GWLP_HINSTANCE );
- if (LocalReAlloc16( es->hloc16, size, LMEM_MOVEABLE ))
+ if (LocalReAlloc16( hloc16, size, LMEM_MOVEABLE ))
{
char *text = LocalLock( hloc32 );
- char *dest = MapSL( LocalLock16( es->hloc16 ));
+ char *dest = MapSL( LocalLock16( hloc16 ));
memcpy( dest, text, size );
LocalUnlock( hloc32 );
- LocalUnlock16( es->hloc16 );
+ LocalUnlock16( hloc16 );
}
stack16->ds = oldDS;
}
@@ -2472,8 +2474,9 @@
HLOCAL hloc;
STACK16FRAME* stack16;
HANDLE16 oldDS;
+ HLOCAL16 hloc16 = GetWindowWord( es->hwndSelf, GWW_HANDLE16 );
- if (es->hloc16) return es->hloc16;
+ if (hloc16) return hloc16;
if (!(hloc = EDIT_EM_GetHandle(es))) return 0;
alloc_size = LocalSize( hloc );
@@ -2492,26 +2495,27 @@
}
TRACE("Allocating 16-bit ANSI alias buffer\n");
- if (!(es->hloc16 = LocalAlloc16(LMEM_MOVEABLE | LMEM_ZEROINIT, alloc_size))) {
+ if (!(hloc16 = LocalAlloc16(LMEM_MOVEABLE | LMEM_ZEROINIT, alloc_size))) {
ERR("could not allocate new 16 bit buffer\n");
goto done;
}
- if (!(textA = MapSL(LocalLock16( es->hloc16)))) {
+ if (!(textA = MapSL(LocalLock16( hloc16)))) {
ERR("could not lock new 16 bit buffer\n");
- LocalFree16(es->hloc16);
- es->hloc16 = 0;
+ LocalFree16(hloc16);
+ hloc16 = 0;
goto done;
}
memcpy( textA, LocalLock( hloc ), alloc_size );
LocalUnlock( hloc );
- LocalUnlock16(es->hloc16);
+ LocalUnlock16( hloc16 );
+ SetWindowWord( es->hwndSelf, GWW_HANDLE16, hloc16 );
- TRACE("Returning %04X, LocalSize() = %d\n", es->hloc16, LocalSize16(es->hloc16));
+ TRACE("Returning %04X, LocalSize() = %d\n", hloc16, alloc_size);
done:
stack16->ds = oldDS;
- return es->hloc16;
+ return hloc16;
}
@@ -2893,7 +2897,7 @@
memcpy( LocalLock(hloc32), text, count );
LocalUnlock(hloc32);
LocalUnlock16(hloc16);
- es->hloc16 = hloc16;
+ SetWindowWord( es->hwndSelf, GWW_HANDLE16, hloc16 );
}
stack16->ds = oldDS;
@@ -4683,6 +4687,7 @@
static LRESULT EDIT_WM_NCDestroy(EDITSTATE *es)
{
LINEDEF *pc, *pp;
+ HLOCAL16 hloc16 = GetWindowWord( es->hwndSelf, GWW_HANDLE16 );
if (es->hloc32W) {
LocalFree(es->hloc32W);
@@ -4690,14 +4695,15 @@
if (es->hloc32A) {
LocalFree(es->hloc32A);
}
- if (es->hloc16) {
+ if (hloc16) {
STACK16FRAME* stack16 = MapSL(PtrToUlong(NtCurrentTeb()->WOW32Reserved));
HANDLE16 oldDS = stack16->ds;
stack16->ds = GetWindowLongPtrW( es->hwndSelf, GWLP_HINSTANCE );
- while (LocalUnlock16(es->hloc16)) ;
- LocalFree16(es->hloc16);
+ while (LocalUnlock16(hloc16)) ;
+ LocalFree16(hloc16);
stack16->ds = oldDS;
+ SetWindowWord( es->hwndSelf, GWW_HANDLE16, 0 );
}
pc = es->first_line_def;
@@ -5411,10 +5417,10 @@
CS_DBLCLKS | CS_PARENTDC, /* style */
EditWndProcA, /* procA */
EditWndProcW, /* procW */
-#ifdef _WIN64
- sizeof(EDITSTATE *), /* extra */
+#ifdef __i386__
+ sizeof(EDITSTATE *) + sizeof(HLOCAL16), /* extra */
#else
- sizeof(EDITSTATE *) + sizeof(HANDLE16), /* extra */
+ sizeof(EDITSTATE *), /* extra */
#endif
IDC_IBEAM, /* cursor */
0 /* brush */