[USER32] Sync combo.c with Wine Staging 1.7.37. CORE-9246
authorAmine Khaldi <amine.khaldi@reactos.org>
Fri, 29 May 2015 22:06:52 +0000 (22:06 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Fri, 29 May 2015 22:06:52 +0000 (22:06 +0000)
svn path=/trunk/; revision=67960

reactos/media/doc/README.WINE
reactos/win32ss/user/user32/controls/combo.c

index f397228..b871eb9 100644 (file)
@@ -293,7 +293,7 @@ msvcrt -
 
 User32 -
   reactos/win32ss/user/user32/controls/button.c    # Synced to WineStaging-1.7.37
-  reactos/win32ss/user/user32/controls/combo.c     # Synced to Wine-1.5.10
+  reactos/win32ss/user/user32/controls/combo.c     # Synced to WineStaging-1.7.37
   reactos/win32ss/user/user32/controls/edit.c      # Synced to Wine-1_1_40
   reactos/win32ss/user/user32/controls/icontitle.c # Synced to WineStaging-1.7.37
   reactos/win32ss/user/user32/controls/listbox.c   # Synced to Wine-1_1_39
index 54c08d3..d12e6dc 100644 (file)
@@ -49,8 +49,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(combo);
 #define CB_OWNERDRAWN( lphc ) ((lphc)->dwStyle & (CBS_OWNERDRAWFIXED | CBS_OWNERDRAWVARIABLE))
 #define CB_HASSTRINGS( lphc ) ((lphc)->dwStyle & CBS_HASSTRINGS)
 #define CB_HWND( lphc )       ((lphc)->self)
-// ReactOS already define in include/controls.h We have it here as a sync note.
-//#define CB_GETTYPE( lphc )    ((lphc)->dwStyle & (CBS_DROPDOWNLIST))
+#ifndef __REACTOS__
+/* ReactOS already define in include/controls.h We have it here as a sync note. */
+#define CB_GETTYPE( lphc )    ((lphc)->dwStyle & (CBS_DROPDOWNLIST))
+#endif
 
 #define ISWIN31 (LOWORD(GetVersion()) == 0x0a03)
 
@@ -78,8 +80,12 @@ const struct builtin_class_descr COMBO_builtin_class =
 {
     comboboxW,            /* name */
     CS_PARENTDC | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW, /* style  */
+#ifdef __REACTOS__
     ComboWndProcA,        /* procA */
     ComboWndProcW,        /* procW */
+#else
+    WINPROC_COMBO,        /* proc */
+#endif
     sizeof(HEADCOMBO *),  /* extra */
     IDC_ARROW,            /* cursor */
     0                     /* brush */
@@ -123,7 +129,7 @@ static BOOL COMBO_Init(void)
   return FALSE;
 }
 
-
+#ifdef __REACTOS__
 /* Retrieve the UI state for the control */
 static BOOL COMBO_update_uistate(LPHEADCOMBO lphc)
 {
@@ -133,6 +139,7 @@ static BOOL COMBO_update_uistate(LPHEADCOMBO lphc)
     lphc->UIState = DefWindowProcW(lphc->self, WM_QUERYUISTATE, 0, 0);
     return prev_flags != lphc->UIState;
 }
+#endif
 
 /***********************************************************************
  *           COMBO_NCCreate
@@ -146,7 +153,9 @@ static LRESULT COMBO_NCCreate(HWND hwnd, LONG style)
         lphc->self = hwnd;
         SetWindowLongPtrW( hwnd, 0, (LONG_PTR)lphc );
 
+#ifdef __REACTOS__
         COMBO_update_uistate(lphc);
+#endif
 
        /* some braindead apps do try to use scrollbar/border flags */
 
@@ -717,7 +726,7 @@ static void CBPaintText(
        dis.itemState   = itemState;
        dis.hDC         = hdc;
        dis.rcItem      = rectEdit;
-       dis.itemData    = SendMessageW(lphc->hWndLBox, LB_GETITEMDATA, id, 0 );
+       dis.itemData     = SendMessageW(lphc->hWndLBox, LB_GETITEMDATA, id, 0);
 
        /*
        * Clip the DC and have the parent draw the item.
@@ -726,7 +735,7 @@ static void CBPaintText(
 
        SendMessageW(lphc->owner, WM_DRAWITEM, ctlid, (LPARAM)&dis );
 
-       SelectClipRgn( hdc, clipRegion);
+       SelectClipRgn( hdc, clipRegion );
        if (clipRegion) DeleteObject( clipRegion );
      }
      else
@@ -749,15 +758,22 @@ static void CBPaintText(
                    &rectEdit,
                    pText ? pText : empty_stringW , size, NULL );
 
-       if(lphc->wState & CBF_FOCUSED && !(lphc->wState & CBF_DROPPED) &&
+#ifdef __REACTOS__
+       if(lphc->wState & CBF_FOCUSED &&
+          !(lphc->wState & CBF_DROPPED) &&
           !(lphc->UIState & UISF_HIDEFOCUS))
+#else
+       if(lphc->wState & CBF_FOCUSED && !(lphc->wState & CBF_DROPPED))
+#endif
         DrawFocusRect( hdc, &rectEdit );
      }
 
      if( hPrevFont )
        SelectObject(hdc, hPrevFont );
    }
+#ifdef __REACTOS__
    if (pText)
+#endif
        HeapFree( GetProcessHeap(), 0, pText );
 }
 
@@ -805,7 +821,12 @@ static HBRUSH COMBO_PrepareColors(
    */
   if (CB_DISABLED(lphc))
   {
-     hBkgBrush = GetControlColor(lphc->owner, lphc->self, hDC, WM_CTLCOLORSTATIC);
+#ifdef __REACTOS__
+    hBkgBrush = GetControlColor(lphc->owner, lphc->self, hDC, WM_CTLCOLORSTATIC);
+#else
+    hBkgBrush = (HBRUSH)SendMessageW(lphc->owner, WM_CTLCOLORSTATIC,
+                                    (WPARAM)hDC, (LPARAM)lphc->self );
+#endif
     /*
      * We have to change the text color since WM_CTLCOLORSTATIC will
      * set it to the "enabled" color. This is the same behavior as the
@@ -816,7 +837,12 @@ static HBRUSH COMBO_PrepareColors(
   else
   {
       /* FIXME: In which cases WM_CTLCOLORLISTBOX should be sent? */
-     hBkgBrush = GetControlColor(lphc->owner, lphc->self, hDC, WM_CTLCOLOREDIT);
+#ifdef __REACTOS__
+      hBkgBrush = GetControlColor(lphc->owner, lphc->self, hDC, WM_CTLCOLOREDIT);
+#else
+      hBkgBrush = (HBRUSH)SendMessageW(lphc->owner, WM_CTLCOLOREDIT,
+                                      (WPARAM)hDC, (LPARAM)lphc->self );
+#endif
   }
 
   /*
@@ -910,8 +936,7 @@ static INT CBUpdateLBox( LPHEADCOMBO lphc, BOOL bSelect )
    if( pText )
    {
        GetWindowTextW( lphc->hWndEdit, pText, length + 1);
-       idx = SendMessageW(lphc->hWndLBox, LB_FINDSTRING,
-                            (WPARAM)(-1), (LPARAM)pText );
+       idx = SendMessageW(lphc->hWndLBox, LB_FINDSTRING, (WPARAM)(-1), (LPARAM)pText);
        HeapFree( GetProcessHeap(), 0, pText );
    }
 
@@ -944,8 +969,7 @@ static void CBUpdateEdit( LPHEADCOMBO lphc , INT index )
        {
           if( (pText = HeapAlloc( GetProcessHeap(), 0, (length + 1) * sizeof(WCHAR))) )
           {
-               SendMessageW(lphc->hWndLBox, LB_GETTEXT,
-                               (WPARAM)index, (LPARAM)pText );
+               SendMessageW(lphc->hWndLBox, LB_GETTEXT, (WPARAM)index, (LPARAM)pText );
           }
        }
    }
@@ -996,7 +1020,7 @@ static void CBDropDown( LPHEADCOMBO lphc )
        lphc->droppedIndex = SendMessageW(lphc->hWndLBox, LB_GETCURSEL, 0, 0);
 
        SendMessageW(lphc->hWndLBox, LB_SETTOPINDEX,
-                     (WPARAM)(lphc->droppedIndex == LB_ERR ? 0 : lphc->droppedIndex), 0 );
+                    (WPARAM)(lphc->droppedIndex == LB_ERR ? 0 : lphc->droppedIndex), 0 );
        SendMessageW(lphc->hWndLBox, LB_CARETON, 0, 0);
    }
 
@@ -1052,14 +1076,14 @@ static void CBDropDown( LPHEADCOMBO lphc )
    mon_info.cbSize = sizeof(mon_info);
    GetMonitorInfoW( monitor, &mon_info );
 
-   if (r.bottom > mon_info.rcWork.bottom )
+   if (r.bottom > mon_info.rcWork.bottom)
    {
        r.top = max( rect.top - nDroppedHeight, mon_info.rcWork.top );
        r.bottom = min( r.top + nDroppedHeight, mon_info.rcWork.bottom );
    }
-   //// ReactOS : Use HWND_TOPMOST See Bug 5705 or CORE-5186....
+
    SetWindowPos( lphc->hWndLBox, HWND_TOPMOST, r.left, r.top, r.right - r.left, r.bottom - r.top,
-                SWP_NOACTIVATE | SWP_SHOWWINDOW);
+                 SWP_NOACTIVATE | SWP_SHOWWINDOW );
 
 
    if( !(lphc->wState & CBF_NOREDRAW) )
@@ -1297,7 +1321,7 @@ static LRESULT COMBO_Command( LPHEADCOMBO lphc, WPARAM wParam, HWND hWnd )
                       lphc->wState |= CBF_NOLBSELECT;
                       CBUpdateEdit( lphc, index );
                       /* select text in edit, as Windows does */
-                      SendMessageW(lphc->hWndEdit, EM_SETSEL, 0, (LPARAM)(-1));
+               SendMessageW(lphc->hWndEdit, EM_SETSEL, 0, (LPARAM)(-1));
                   }
                   else
                    {
@@ -1557,7 +1581,7 @@ static void COMBO_Size( LPHEADCOMBO lphc )
                  &lphc->buttonRect,
                  &lphc->droppedRect);
 
-  CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, TRUE );  
+  CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, TRUE );
 }
 
 
@@ -1633,8 +1657,7 @@ static LRESULT COMBO_SetItemHeight( LPHEADCOMBO lphc, INT index, INT height )
        }
    }
    else if ( CB_OWNERDRAWN(lphc) )     /* set listbox item height */
-       lRet = SendMessageW(lphc->hWndLBox, LB_SETITEMHEIGHT,
-                             (WPARAM)index, (LPARAM)height );
+       lRet = SendMessageW(lphc->hWndLBox, LB_SETITEMHEIGHT, (WPARAM)index, (LPARAM)height);
    return lRet;
 }
 
@@ -1799,7 +1822,9 @@ static char *strdupA(LPCSTR str)
 
     len = strlen(str);
     ret = HeapAlloc(GetProcessHeap(), 0, len + 1);
+#ifdef __REACTOS__
     if (ret != NULL)
+#endif
         memcpy(ret, str, len + 1);
     return ret;
 }
@@ -1807,8 +1832,7 @@ static char *strdupA(LPCSTR str)
 /***********************************************************************
  *           ComboWndProc_common
  */
-LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
-                                  WPARAM wParam, LPARAM lParam, BOOL unicode )
+LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, BOOL unicode )
 {
       LPHEADCOMBO lphc = (LPHEADCOMBO)GetWindowLongPtrW( hwnd, 0 );
 #ifdef __REACTOS__
@@ -1829,12 +1853,16 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                return 0;
             }
          }
-      }    
-#endif    
+      }
+#endif
 
       TRACE("[%p]: msg %s wp %08lx lp %08lx\n",
             hwnd, SPY_GetMsgName(message, hwnd), wParam, lParam );
 
+#ifndef __REACTOS__
+      if (!IsWindow(hwnd)) return 0;
+#endif
+
       if( lphc || message == WM_NCCREATE )
       switch(message)
       {
@@ -1850,7 +1878,7 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
        case WM_NCDESTROY:
                COMBO_NCDestroy(lphc);
 #ifdef __REACTOS__
-                NtUserSetWindowFNID(hwnd, FNID_DESTROY);
+               NtUserSetWindowFNID(hwnd, FNID_DESTROY);
 #endif
                break;/* -> DefWindowProc */
 
@@ -1911,8 +1939,8 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                        lphc->wState |= CBF_BEENFOCUSED;
                    }
                }
-                else
-                    COMBO_SetFocus( lphc );
+               else
+                   COMBO_SetFocus( lphc );
                return  TRUE;
        case WM_KILLFOCUS:
             {
@@ -1981,7 +2009,11 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                SendMessageW(lphc->hWndLBox, message, wParam, lParam);
                return  0;
        case WM_SYSKEYDOWN:
-               if( KF_ALTDOWN & HIWORD(lParam) ) // ReactOS (wine) KEYDATA_ALT
+#ifdef __REACTOS__
+               if( KF_ALTDOWN & HIWORD(lParam) )
+#else
+               if( KEYDATA_ALT & HIWORD(lParam) )
+#endif
                    if( wParam == VK_UP || wParam == VK_DOWN )
                        COMBO_FlipListbox( lphc, FALSE, FALSE );
                 return  0;
@@ -2001,7 +2033,7 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                /* fall through */
        case WM_CHAR:
        case WM_IME_CHAR:
-        {
+       {
                HWND hwndTarget;
 
                if( lphc->wState & CBF_EDIT )
@@ -2122,20 +2154,20 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                return SendMessageW(lphc->hWndLBox, LB_GETLOCALE, 0, 0);
        case CB_SETLOCALE:
                return SendMessageW(lphc->hWndLBox, LB_SETLOCALE, wParam, 0);
-        case CB_SETDROPPEDWIDTH:
-                if( (CB_GETTYPE(lphc) == CBS_SIMPLE) ||
-                    (INT)wParam >= 32768 )
-                    return CB_ERR;
-                /* new value must be higher than combobox width */
-                if((INT)wParam >= lphc->droppedRect.right - lphc->droppedRect.left)
-                    lphc->droppedWidth = wParam;
-                else if(wParam)
-                    lphc->droppedWidth = 0;
-
-                /* recalculate the combobox area */
-                CBCalcPlacement(hwnd, lphc, &lphc->textRect, &lphc->buttonRect, &lphc->droppedRect );
-
-                /* fall through */
+       case CB_SETDROPPEDWIDTH:
+               if( (CB_GETTYPE(lphc) == CBS_SIMPLE) ||
+                   (INT)wParam >= 32768 )
+                   return CB_ERR;
+               /* new value must be higher than combobox width */
+               if((INT)wParam >= lphc->droppedRect.right - lphc->droppedRect.left)
+                   lphc->droppedWidth = wParam;
+               else if(wParam)
+                   lphc->droppedWidth = 0;
+
+               /* recalculate the combobox area */
+               CBCalcPlacement(hwnd, lphc, &lphc->textRect, &lphc->buttonRect, &lphc->droppedRect );
+
+               /* fall through */
        case CB_GETDROPPEDWIDTH:
                if( lphc->droppedWidth )
                     return  lphc->droppedWidth;
@@ -2144,7 +2176,7 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                if( lParam ) CBGetDroppedControlRect(lphc, (LPRECT)lParam );
                return  CB_OKAY;
        case CB_GETDROPPEDSTATE:
-               return  (lphc->wState & CBF_DROPPED) ? TRUE : FALSE;
+               return (lphc->wState & CBF_DROPPED) != 0;
        case CB_DIR:
                return unicode ? SendMessageW(lphc->hWndLBox, LB_DIR, wParam, lParam) :
                                 SendMessageA(lphc->hWndLBox, LB_DIR, wParam, lParam);
@@ -2206,14 +2238,15 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                else lphc->wState &= ~CBF_EUI;
                return  CB_OKAY;
        case CB_GETEXTENDEDUI:
-               return  (lphc->wState & CBF_EUI) ? TRUE : FALSE;
+               return (lphc->wState & CBF_EUI) != 0;
        case CB_GETCOMBOBOXINFO:
                return COMBO_GetComboBoxInfo(lphc, (COMBOBOXINFO *)lParam);
        case CB_LIMITTEXT:
                if( lphc->wState & CBF_EDIT )
                        return SendMessageW(lphc->hWndEdit, EM_LIMITTEXT, wParam, lParam);
-                return  TRUE;
+               return  TRUE;
 
+#ifdef __REACTOS__
     case WM_UPDATEUISTATE:
         if (unicode)
             DefWindowProcW(lphc->self, message, wParam, lParam);
@@ -2227,6 +2260,7 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                 NtUserInvalidateRect(lphc->self, &lphc->textRect, TRUE);
         }
         break;
+#endif
 
        default:
                if (message >= WM_USER)
@@ -2238,6 +2272,8 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                        DefWindowProcA(hwnd, message, wParam, lParam);
 }
 
+#ifdef __REACTOS__
+
 /***********************************************************************
  *           ComboWndProcA
  *
@@ -2259,6 +2295,8 @@ LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
     return ComboWndProc_common( hwnd, message, wParam, lParam, TRUE );
 }
 
+#endif /* __REACTOS__ */
+
 /*************************************************************************
  *           GetComboBoxInfo   (USER32.@)
  */
@@ -2266,9 +2304,9 @@ BOOL WINAPI GetComboBoxInfo(HWND hwndCombo,      /* [in] handle to combo box */
                            PCOMBOBOXINFO pcbi   /* [in/out] combo box information */)
 {
     TRACE("(%p, %p)\n", hwndCombo, pcbi);
-#ifndef __REACTOS__
-    return SendMessageW(hwndCombo, CB_GETCOMBOBOXINFO, 0, (LPARAM)pcbi);
-#else
+#ifdef __REACTOS__
     return NtUserGetComboBoxInfo(hwndCombo, pcbi);
+#else
+    return SendMessageW(hwndCombo, CB_GETCOMBOBOXINFO, 0, (LPARAM)pcbi);
 #endif
 }