Alexandre Julliard : user32: Store the 16-bit edit handle directly in the window extra bytes.

Alexandre Julliard julliard at winehq.org
Mon Dec 14 09:51:09 CST 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Dec 11 18:13:03 2009 +0100

user32: Store the 16-bit edit handle directly in the window extra bytes.

---

 dlls/user32/edit.c |   56 ++++++++++++++++++++++++++++-----------------------
 1 files changed, 31 insertions(+), 25 deletions(-)

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 @@ typedef struct
 	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 @@ static inline void text_buffer_changed(EDITSTATE *es)
     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_LockBuffer16(EDITSTATE *es)
 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 @@ static HLOCAL16 EDIT_EM_GetHandle16(EDITSTATE *es)
         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 @@ static HLOCAL16 EDIT_EM_GetHandle16(EDITSTATE *es)
 	}
 
 	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 @@ static void EDIT_EM_SetHandle16(EDITSTATE *es, HLOCAL16 hloc16)
             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_Create(EDITSTATE *es, LPCWSTR name)
 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 @@ static LRESULT EDIT_WM_NCDestroy(EDITSTATE *es)
 	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 @@ const struct builtin_class_descr EDIT_builtin_class =
     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 */




More information about the wine-cvs mailing list