Alexandre Julliard : user: Unify the mapping of listbox and combobox messages.

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 18 09:44:04 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 6efb68cb0e8e8371684bdceb0f7ba7dba83d889c
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=6efb68cb0e8e8371684bdceb0f7ba7dba83d889c

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu May 18 12:43:40 2006 +0200

user: Unify the mapping of listbox and combobox messages.

---

 dlls/user/winproc.c |  164 ++++++++++++---------------------------------------
 1 files changed, 39 insertions(+), 125 deletions(-)

diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c
index 7c82591..3111bb7 100644
--- a/dlls/user/winproc.c
+++ b/dlls/user/winproc.c
@@ -590,24 +590,17 @@ BOOL WINPROC_IsUnicode( WNDPROC proc, BO
 
 
 /**********************************************************************
- *	     WINPROC_TestCBForStr
- *
- * Return TRUE if the lparam is a string
- */
-inline static BOOL WINPROC_TestCBForStr( HWND hwnd )
-{
-    DWORD style = GetWindowLongA( hwnd, GWL_STYLE );
-    return (!(style & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE)) || (style & CBS_HASSTRINGS));
-}
-/**********************************************************************
  *	     WINPROC_TestLBForStr
  *
  * Return TRUE if the lparam is a string
  */
-inline static BOOL WINPROC_TestLBForStr( HWND hwnd )
+inline static BOOL WINPROC_TestLBForStr( HWND hwnd, UINT msg )
 {
     DWORD style = GetWindowLongA( hwnd, GWL_STYLE );
-    return (!(style & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE)) || (style & LBS_HASSTRINGS));
+    if (msg <= CB_MSGMAX)
+        return (!(style & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE)) || (style & CBS_HASSTRINGS));
+    else
+        return (!(style & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE)) || (style & LBS_HASSTRINGS));
 
 }
 /**********************************************************************
@@ -721,39 +714,19 @@ INT WINPROC_MapMsg32ATo32W( HWND hwnd, U
         }
         return 1;
 
-/* Listbox */
+/* Listbox / Combobox */
     case LB_ADDSTRING:
     case LB_INSERTSTRING:
     case LB_FINDSTRING:
     case LB_FINDSTRINGEXACT:
     case LB_SELECTSTRING:
-        if(!*plparam) return 0;
-        if ( WINPROC_TestLBForStr( hwnd ))
-        {
-            UNICODE_STRING usBuffer;
-            RtlCreateUnicodeStringFromAsciiz(&usBuffer,(LPCSTR)*plparam);
-            *plparam = (LPARAM)usBuffer.Buffer;
-        }
-        return (*plparam ? 1 : -1);
-
-    case LB_GETTEXT:                /* FIXME: fixed sized buffer */
-        { if ( WINPROC_TestLBForStr( hwnd ))
-          { LPARAM *ptr = HeapAlloc( GetProcessHeap(), 0, 512 * sizeof(WCHAR) + sizeof(LPARAM) );
-            if (!ptr) return -1;
-            *ptr++ = *plparam;  /* Store previous lParam */
-            *plparam = (LPARAM)ptr;
-          }
-        }
-        return 1;
-
-/* Combobox */
     case CB_ADDSTRING:
     case CB_INSERTSTRING:
     case CB_FINDSTRINGEXACT:
     case CB_FINDSTRING:
     case CB_SELECTSTRING:
         if(!*plparam) return 0;
-        if ( WINPROC_TestCBForStr( hwnd ))
+        if ( WINPROC_TestLBForStr( hwnd, msg ))
         {
             UNICODE_STRING usBuffer;
             RtlCreateUnicodeStringFromAsciiz(&usBuffer,(LPCSTR)*plparam);
@@ -761,13 +734,14 @@ INT WINPROC_MapMsg32ATo32W( HWND hwnd, U
         }
         return (*plparam ? 1 : -1);
 
-    case CB_GETLBTEXT:    /* FIXME: fixed sized buffer */
-        { if ( WINPROC_TestCBForStr( hwnd ))
-          { LPARAM *ptr = HeapAlloc( GetProcessHeap(), 0, 512 * sizeof(WCHAR) + sizeof(LPARAM) );
+    case LB_GETTEXT:                /* FIXME: fixed sized buffer */
+    case CB_GETLBTEXT:
+        if ( WINPROC_TestLBForStr( hwnd, msg ))
+        {
+            LPARAM *ptr = HeapAlloc( GetProcessHeap(), 0, 512 * sizeof(WCHAR) + sizeof(LPARAM) );
             if (!ptr) return -1;
             *ptr++ = *plparam;  /* Store previous lParam */
             *plparam = (LPARAM)ptr;
-          }
         }
         return 1;
 
@@ -920,48 +894,29 @@ LRESULT WINPROC_UnmapMsg32ATo32W( HWND h
         HeapFree( GetProcessHeap(), 0, (void *)lParam );
         break;
 
-/* Listbox */
+/* Listbox / Combobox */
     case LB_ADDSTRING:
     case LB_INSERTSTRING:
     case LB_FINDSTRING:
     case LB_FINDSTRINGEXACT:
     case LB_SELECTSTRING:
-        if ( WINPROC_TestLBForStr( hwnd ))
-          HeapFree( GetProcessHeap(), 0, (void *)lParam );
-        break;
-
-    case LB_GETTEXT:
-        if ( WINPROC_TestLBForStr( hwnd ))
-        {
-            LPARAM *ptr = (LPARAM *)lParam - 1;
-            if (result >= 0)
-                result = WideCharToMultiByte( CP_ACP, 0, (LPWSTR)lParam, -1,
-                                              (LPSTR)*ptr, 0x7fffffff, NULL, NULL ) - 1;
-            HeapFree( GetProcessHeap(), 0, ptr );
-        }
-        break;
-
-/* Combobox */
     case CB_ADDSTRING:
     case CB_INSERTSTRING:
     case CB_FINDSTRING:
     case CB_FINDSTRINGEXACT:
     case CB_SELECTSTRING:
-        if ( WINPROC_TestCBForStr( hwnd ))
+        if ( WINPROC_TestLBForStr( hwnd, msg ))
           HeapFree( GetProcessHeap(), 0, (void *)lParam );
         break;
 
+    case LB_GETTEXT:
     case CB_GETLBTEXT:
-        if ( result < 0) /* CB_ERR and CB_ERRSPACE */
+        if ( WINPROC_TestLBForStr( hwnd, msg ))
         {
             LPARAM *ptr = (LPARAM *)lParam - 1;
-            HeapFree( GetProcessHeap(), 0, ptr );
-        }
-        else if ( WINPROC_TestCBForStr( hwnd ))
-        {
-            LPARAM *ptr = (LPARAM *)lParam - 1;
-            result = WideCharToMultiByte( CP_ACP, 0, (LPWSTR)lParam, -1,
-                                          (LPSTR)*ptr, 0x7fffffff, NULL, NULL ) - 1;
+            if (result >= 0)
+                result = WideCharToMultiByte( CP_ACP, 0, (LPWSTR)lParam, -1,
+                                              (LPSTR)*ptr, 0x7fffffff, NULL, NULL ) - 1;
             HeapFree( GetProcessHeap(), 0, ptr );
         }
         break;
@@ -2533,20 +2488,12 @@ INT WINPROC_MapMsg32WTo16( HWND hwnd, UI
         *plparam = map_str_32W_to_16( (LPWSTR)*plparam );
         return 1;
     case LB_GETTEXT:
-        if ( WINPROC_TestLBForStr( hwnd ))
-        {
-            LPSTR str = HeapAlloc( GetProcessHeap(), 0, 512 ); /* FIXME: fixed sized buffer */
-            if (!str) return -1;
-            *pmsg16    = LB_GETTEXT16;
-            *plparam   = (LPARAM)MapLS(str);
-        }
-        return 1;
     case CB_GETLBTEXT:
-        if ( WINPROC_TestCBForStr( hwnd ))
+        if ( WINPROC_TestLBForStr( hwnd, msg32 ))
         {
             LPSTR str = HeapAlloc( GetProcessHeap(), 0, 512 ); /* FIXME: fixed sized buffer */
             if (!str) return -1;
-            *pmsg16    = CB_GETLBTEXT16;
+            *pmsg16    = (msg32 == LB_GETTEXT) ? LB_GETTEXT16 : CB_GETLBTEXT16;
             *plparam   = (LPARAM)MapLS(str);
         }
         return 1;
@@ -2658,16 +2605,8 @@ void WINPROC_UnmapMsg32WTo16( HWND hwnd,
         }
         break;
     case LB_GETTEXT:
-        if ( WINPROC_TestLBForStr( hwnd ))
-        {
-            LPSTR str = MapSL(p16->lParam);
-            UnMapLS( p16->lParam );
-            p16->lResult = MultiByteToWideChar( CP_ACP, 0, str, -1, (LPWSTR)lParam, 0x7fffffff ) - 1;
-            HeapFree( GetProcessHeap(), 0, (LPARAM *)str );
-        }
-        break;
     case CB_GETLBTEXT:
-        if ( WINPROC_TestCBForStr( hwnd ))
+        if ( WINPROC_TestLBForStr( hwnd, msg ))
         {
             LPSTR str = MapSL(p16->lParam);
             UnMapLS( p16->lParam );
@@ -2814,6 +2753,22 @@ static LRESULT WINPROC_CallProc32WTo32A(
         }
         break;
 
+    case LB_ADDSTRING:
+    case LB_INSERTSTRING:
+    case LB_FINDSTRING:
+    case LB_FINDSTRINGEXACT:
+    case LB_SELECTSTRING:
+    case CB_ADDSTRING:
+    case CB_INSERTSTRING:
+    case CB_FINDSTRING:
+    case CB_FINDSTRINGEXACT:
+    case CB_SELECTSTRING:
+        if (!lParam || !WINPROC_TestLBForStr( hwnd, msg ))
+        {
+            ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
+            break;
+        }
+        /* fall through */
     case WM_SETTEXT:
     case WM_WININICHANGE:
     case WM_DEVMODECHANGE:
@@ -2821,7 +2776,6 @@ static LRESULT WINPROC_CallProc32WTo32A(
     case LB_DIR:
     case LB_ADDFILE:
     case EM_REPLACESEL:
-    handle_wm_settext:
         if (!lParam) ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
         else
         {
@@ -2876,48 +2830,9 @@ static LRESULT WINPROC_CallProc32WTo32A(
         }
         break;
 
-/* Listbox */
-    case LB_ADDSTRING:
-    case LB_INSERTSTRING:
-    case LB_FINDSTRING:
-    case LB_FINDSTRINGEXACT:
-    case LB_SELECTSTRING:
-        if (lParam && WINPROC_TestLBForStr( hwnd )) goto handle_wm_settext;
-        ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
-        break;
-
     case LB_GETTEXT:
-        if (lParam && WINPROC_TestLBForStr( hwnd ))
-        {
-            char buffer[512];  /* FIXME: fixed sized buffer */
-            LRESULT result;
-
-            ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, (LPARAM)buffer );
-            result = dialog ? GetWindowLongPtrW( hwnd, DWLP_MSGRESULT ) : ret;
-            if (result >= 0)
-            {
-                DWORD len;
-                RtlMultiByteToUnicodeN( (LPWSTR)lParam, ~0u, &len, buffer, strlen(buffer) + 1 );
-                result = len / sizeof(WCHAR) - 1;
-                if (dialog) SetWindowLongPtrW( hwnd, DWLP_MSGRESULT, result );
-                else ret = result;
-            }
-        }
-        else ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
-        break;
-
-/* Combobox */
-    case CB_ADDSTRING:
-    case CB_INSERTSTRING:
-    case CB_FINDSTRING:
-    case CB_FINDSTRINGEXACT:
-    case CB_SELECTSTRING:
-        if (lParam && WINPROC_TestCBForStr( hwnd )) goto handle_wm_settext;
-        ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
-        break;
-
     case CB_GETLBTEXT:
-        if (lParam && WINPROC_TestCBForStr( hwnd ))
+        if (lParam && WINPROC_TestLBForStr( hwnd, msg ))
         {
             char buffer[512];  /* FIXME: fixed sized buffer */
             LRESULT result;
@@ -2936,7 +2851,6 @@ static LRESULT WINPROC_CallProc32WTo32A(
         else ret = WINPROC_CallWndProc( func, hwnd, msg, wParam, lParam );
         break;
 
-/* Multiline edit */
     case EM_GETLINE:
         {
             char *ptr, buffer[512];




More information about the wine-cvs mailing list