Ignore:
Timestamp:
Nov 14, 2001, 3:36:06 PM (24 years ago)
Author:
phaller
Message:

optimized set/get window text, heap pressure reduced

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/win32wbase.cpp

    r7294 r7338  
    1 /* $Id: win32wbase.cpp,v 1.298 2001-11-07 15:36:10 sandervl Exp $ */
     1/* $Id: win32wbase.cpp,v 1.299 2001-11-14 14:36:06 phaller Exp $ */
    22/*
    33 * Win32 Window Base Class for OS/2
     
    152152  windowNameA      = NULL;
    153153  windowNameW      = NULL;
    154 
     154  windowNameLength = 0;
     155 
    155156  userWindowBytes  = NULL;;
    156157  nrUserWindowBytes= 0;
     
    600601        vertScrollInfo->flags  = ESB_ENABLE_BOTH;
    601602    }
    602 
     603 
     604    // initially allocate the window name fields
    603605    if(HIWORD(cs->lpszName))
    604606    {
    605607        if (!isUnicode)
    606608        {
    607             int wndNameLength = strlen(cs->lpszName);
    608             windowNameA = (LPSTR)_smalloc(wndNameLength+1);
    609             strcpy(windowNameA,cs->lpszName);
    610             windowNameW = (LPWSTR)_smalloc((wndNameLength+1)*sizeof(WCHAR));
    611             lstrcpyAtoW(windowNameW,windowNameA);
    612             windowNameA[wndNameLength] = 0;
    613             windowNameW[wndNameLength] = 0;
     609            windowNameLength = strlen(cs->lpszName);
     610            windowNameA = (LPSTR)_smalloc(windowNameLength+1);
     611            memcpy(windowNameA,cs->lpszName,windowNameLength+1);
     612            windowNameW = (LPWSTR)_smalloc((windowNameLength+1)*sizeof(WCHAR));
     613            lstrcpynAtoW(windowNameW,windowNameA,windowNameLength+1);
     614            windowNameA[windowNameLength] = 0;
     615            windowNameW[windowNameLength] = 0;
    614616        }
    615617        else
    616618        {
    617619            // Wide
    618             int wndNameLength = lstrlenW((LPWSTR)cs->lpszName);
    619             windowNameW = (LPWSTR)_smalloc((wndNameLength+1)*sizeof(WCHAR));
    620             lstrcpyW(windowNameW,(LPWSTR)cs->lpszName);
    621             windowNameW[lstrlenW((LPWSTR)cs->lpszName)] = 0; // need ?
     620            windowNameLength = lstrlenW((LPWSTR)cs->lpszName);
     621            windowNameW = (LPWSTR)_smalloc( (windowNameLength+1)*sizeof(WCHAR) );
     622            memcpy(windowNameW,(LPWSTR)cs->lpszName, (windowNameLength+1)*sizeof(WCHAR) );
     623         
     624            // windowNameW[lstrlenW((LPWSTR)cs->lpszName)] = 0; // need ?
     625         
    622626            // Ascii
    623             LPSTR tmp = HEAP_strdupWtoA(GetProcessHeap(), 0, (LPWSTR)cs->lpszName);
    624             if(tmp) {
    625                 long tmpLength = strlen( tmp );
    626                 windowNameA = (LPSTR)_smalloc(tmpLength+1);
    627                 strcpy(windowNameA,tmp);
    628                 windowNameA[tmpLength] = 0; // need ?
    629                 HEAP_free(tmp);
    630             } else {
    631                 windowNameA = (LPSTR)_smalloc(1);
    632                 windowNameA[0] = 0;
    633             }
    634         }
     627            windowNameA = (LPSTR)_smalloc(windowNameLength+1);
     628            WideCharToMultiByte(CP_ACP,
     629                                0,
     630                                windowNameW,
     631                                windowNameLength,
     632                                windowNameA,
     633                                windowNameLength + 1,
     634                                0,
     635                                NULL);
     636            windowNameA[windowNameLength] = 0;
     637        }
     638     
    635639        if(fOS2Look) {
    636640            OSLibWinSetTitleBarText(OS2HwndFrame, windowNameA);
     
    14691473
    14701474    case WM_GETTEXTLENGTH:
    1471         if(windowNameA) {
    1472           return strlen(windowNameA);
    1473         }
    1474         else {
     1475        return windowNameLength;
     1476
     1477    case WM_GETTEXT:
     1478        if (!lParam || !wParam)
    14751479          return 0;
    1476         }
    1477 
    1478     case WM_GETTEXT:
    1479         if (!lParam || !wParam) return 0;
    1480         if (!windowNameA) ((LPSTR)lParam)[0] = 0;
    1481         else lstrcpynA((LPSTR)lParam, windowNameA, wParam);
    1482         return min((windowNameA ? strlen(windowNameA) : 0), wParam);
     1480        if (!windowNameA)
     1481          ((LPSTR)lParam)[0] = 0;
     1482        else
     1483          memcpy((LPSTR)lParam, windowNameA, min(windowNameLength+1, wParam) );
     1484        return min(windowNameLength, wParam);
    14831485
    14841486    case WM_SETTEXT:
    14851487    {
    14861488        LPCSTR lpsz = (LPCSTR)lParam;
    1487 
    1488         if(windowNameA) free(windowNameA);
    1489         if(windowNameW) free(windowNameW);
    1490         if (lParam)
    1491         {
    1492             int wndNameLength = strlen(lpsz);
    1493             windowNameA = (LPSTR)_smalloc(wndNameLength+1);
    1494             strcpy(windowNameA, lpsz);
    1495             windowNameW = (LPWSTR)_smalloc((wndNameLength+1)*sizeof(WCHAR));
    1496             lstrcpyAtoW(windowNameW, windowNameA);
     1489     
     1490        // reallocate if new buffer is larger
     1491        if (!lParam)
     1492        {
     1493          free(windowNameA);
     1494          free(windowNameW);
     1495          windowNameLength = 0;
     1496          windowNameA      = NULL;
     1497          windowNameW      = NULL;
    14971498        }
    14981499        else
    14991500        {
    1500             windowNameA = NULL;
    1501             windowNameW = NULL;
    1502         }
     1501          // determine length of new text
     1502          int iTextLength = strlen(lpsz);
     1503         
     1504          if (windowNameLength < iTextLength)
     1505          {
     1506            if (windowNameA)
     1507            {
     1508              free(windowNameA);
     1509              windowNameA = NULL;
     1510            }
     1511         
     1512            if (windowNameW)
     1513            {
     1514              free(windowNameW);
     1515              windowNameW = NULL;
     1516            }
     1517          }
     1518     
     1519          windowNameLength = iTextLength;
     1520          if(!windowNameA)
     1521            windowNameA = (LPSTR)_smalloc(windowNameLength+1);
     1522          memcpy(windowNameA, lpsz, windowNameLength+1);
     1523          if(!windowNameW)
     1524            windowNameW = (LPWSTR)_smalloc((windowNameLength+1)*sizeof(WCHAR));
     1525          lstrcpynAtoW(windowNameW, windowNameA, windowNameLength+1);
     1526        }
     1527     
    15031528        dprintf(("WM_SETTEXT of %x to %s\n", Win32Hwnd, lParam));
    15041529        if ((dwStyle & WS_CAPTION) == WS_CAPTION)
     
    19641989    {
    19651990    case WM_GETTEXTLENGTH:
    1966         if(windowNameW) {
    1967              return lstrlenW(windowNameW);
    1968         }
    1969         else return 0;
     1991        return windowNameLength;
    19701992
    19711993    case WM_GETTEXT:
    1972         if (!lParam || !wParam) return 0;
    1973         if (!windowNameW) ((LPWSTR)lParam)[0] = 0;
    1974         else lstrcpynW((LPWSTR)lParam,windowNameW,wParam);
    1975         return min((windowNameW ? lstrlenW(windowNameW) : 0),wParam);
     1994        if (!lParam || !wParam)
     1995          return 0;
     1996        if (!windowNameW)
     1997          ((LPWSTR)lParam)[0] = 0;
     1998        else
     1999          memcpy((LPSTR)lParam, windowNameW, min( sizeof(WCHAR) * (windowNameLength+1), wParam) );
     2000        return min(windowNameLength, wParam);
    19762001
    19772002    case WM_SETTEXT:
    19782003    {
    19792004        LPWSTR lpsz = (LPWSTR)lParam;
    1980 
    1981         if(windowNameA) free(windowNameA);
    1982         if(windowNameW) free(windowNameW);
    1983         if (lParam)
    1984         {
    1985             // Wide
    1986             int wndNameLength = lstrlenW(lpsz);
    1987             windowNameW = (LPWSTR)_smalloc((wndNameLength+1)*sizeof(WCHAR));
    1988             lstrcpyW(windowNameW,lpsz);
    1989             // Ascii
    1990             LPSTR tmp = HEAP_strdupWtoA(GetProcessHeap(), 0, lpsz);
    1991             if(tmp) {
    1992                 long tmpLength = strlen( tmp );
    1993                 windowNameA = (LPSTR)_smalloc(tmpLength+1);
    1994                 strcpy(windowNameA,tmp);
    1995                 windowNameA[tmpLength] = 0; // need ?
    1996                 HEAP_free(tmp);
    1997             }
    1998             else {
    1999                 windowNameA = (LPSTR)_smalloc(1);
    2000                 windowNameA[0] = 0;
    2001             }
     2005     
     2006        // reallocate if new buffer is larger
     2007        if (!lParam)
     2008        {
     2009          free(windowNameA);
     2010          free(windowNameW);
     2011          windowNameLength = 0;
     2012          windowNameA      = NULL;
     2013          windowNameW      = NULL;
    20022014        }
    20032015        else
    20042016        {
    2005             windowNameA = NULL;
    2006             windowNameW = NULL;
    2007         }
     2017          // determine length of new text
     2018          int iTextLength = lstrlenW(lpsz);
     2019         
     2020          if (windowNameLength < iTextLength)
     2021          {
     2022            if (windowNameA)
     2023            {
     2024              free(windowNameA);
     2025              windowNameA = NULL;
     2026            }
     2027         
     2028            if (windowNameW)
     2029            {
     2030              free(windowNameW);
     2031              windowNameW = NULL;
     2032            }
     2033          }
     2034     
     2035          windowNameLength = iTextLength;
     2036          if(!windowNameA)
     2037            windowNameA = (LPSTR)_smalloc(windowNameLength+1);
     2038          lstrcpynWtoA(windowNameA, windowNameW, windowNameLength+1);
     2039          if(!windowNameW)
     2040            windowNameW = (LPWSTR)_smalloc((windowNameLength+1)*sizeof(WCHAR));
     2041          memcpy(windowNameW, lpsz, (windowNameLength+1) * sizeof(WCHAR));
     2042        }
     2043
    20082044        dprintf(("WM_SETTEXT of %x\n",Win32Hwnd));
    20092045        if ((dwStyle & WS_CAPTION) == WS_CAPTION)
     
    35323568    //else get data directory from window structure
    35333569    //TODO: must lock window structure.... (TODO)
    3534     if(fUnicode) {
    3535         if(windowNameW) {
    3536              return strlenW(windowNameW);
    3537         }
    3538         else return 0;
    3539     }
    3540     else {
    3541         if(windowNameA) {
    3542              return strlen(windowNameA);
    3543         }
    3544         else return 0;
    3545     }
     3570    return windowNameLength;
    35463571}
    35473572//******************************************************************************
     
    35553580        return SendInternalMessageA(WM_GETTEXT,(WPARAM)cch,(LPARAM)lpsz);
    35563581    }
     3582 
    35573583    //else get data directory from window structure
    35583584    if (!lpsz || !cch) return 0;
    35593585    if (!windowNameA) lpsz[0] = 0;
    3560     else lstrcpynA(lpsz, windowNameA, cch);
    3561     return min((windowNameA ? strlen(windowNameA) : 0), cch);
     3586    else memcpy(lpsz, windowNameA, min(windowNameLength + 1, cch) );
     3587    return min(windowNameLength, cch);
    35623588}
    35633589//******************************************************************************
     
    35723598    }
    35733599    //else get data directory from window structure
    3574     if (!lpsz || !cch) return 0;
    3575     if (!windowNameW) lpsz[0] = 0;
    3576     else lstrcpynW(lpsz, windowNameW, cch);
    3577     return min((windowNameW ? strlenW(windowNameW) : 0), cch);
     3600  if (!lpsz || !cch)
     3601    return 0;
     3602  if (!windowNameW)
     3603    lpsz[0] = 0;
     3604  else
     3605    memcpy(lpsz, windowNameW, min( sizeof(WCHAR) * (windowNameLength+1), cch));
     3606           
     3607  return min(windowNameLength, cch);
    35783608}
    35793609//******************************************************************************
Note: See TracChangeset for help on using the changeset viewer.