summaryrefslogblamecommitdiffstats
path: root/private/mvdm/wow32/wmsgsbm.c
blob: 009e35244cee6354458acebdde316dc6be5667ed (plain) (tree)







































































































































                                                                                                       
/*++
 *
 *  WOW v1.0
 *
 *  Copyright (c) 1991, Microsoft Corporation
 *
 *  WMSGSBM.C
 *  WOW32 16-bit message thunks for SCROLLBARs
 *
 *  History:
 *  Created 10-Jun-1992 by Bob Day (bobday)
--*/


#include "precomp.h"
#pragma hdrstop

MODNAME(wmsgbm.c);


#ifdef DEBUG

MSGINFO amiSBM[] = {
   {OLDSBM_SETPOS,      "SBM_SETPOS"},                          // 0x0400
   {OLDSBM_GETPOS,      "SBM_GETPOS"},                          // 0x0401
   {OLDSBM_SETRANGE,    "SBM_SETRANGE"},                        // 0x0402
   {OLDSBM_GETRANGE,    "SBM_GETRANGE"},                        // 0x0403
   {OLDSBM_ENABLEARROWS,"SBM_ENABLE_ARROWS"},                   // 0x0404
};

PSZ GetSBMMsgName(WORD wMsg)
{
    INT i;
    register PMSGINFO pmi;

    for (pmi=amiSBM,i=NUMEL(amiSBM); i>0; i--,pmi++)
        if ((WORD)pmi->uMsg == wMsg)
        return pmi->pszMsgName;
    return GetWMMsgName(wMsg);
}

#endif


BOOL FASTCALL ThunkSBMMsg16(LPMSGPARAMEX lpmpex)
{
    WORD wMsg = lpmpex->Parm16.WndProc.wMsg;
    LOGDEBUG(7,("    Thunking 16-bit scrollbar message %s(%04x)\n", (LPSZ)GetSBMMsgName(wMsg), wMsg));

    wMsg -= WM_USER;

    //
    // For app defined (control) messages that are out of range
    // return TRUE.
    //
    // ChandanC Sept-15-1992
    //


    if (wMsg < (SBM_ENABLE_ARROWS - SBM_SETPOS + 1)) {
        switch(lpmpex->uMsg = wMsg + SBM_SETPOS) {
    
            // The following messages should not require thunking, because
            // they contain no pointers, handles, or rearranged message parameters,
            // so consequently they are not documented in great detail here:
            //
            // SBM_SETPOS   (requires minimal thunking)
            // SBM_GETPOS
            // SBM_ENABLE_ARROWS
            //
    
            case SBM_GETRANGE:
    
                //
                // Changed semantics for this message to support 32-bit
                // scroll bar ranges (vs. 16-bit).
                //
                // Win16:
                //   posMin = LOWORD(SendMessage(hwnd, SBM_GETRANGE, 0, 0));
                //   posMax = HIWORD(SendMessage(hwnd, SBM_GETRANGE, 0, 0));
                //
                // Win32:
                //   SendMessage(hwnd, SBM_GETRANGE,
                //               (WPARAM) &posMin, (LPARAM) &posMax);
                //
    
                // Allocate buffers for 32-bit scrollbar proc to put
                // posMin and posMax in.
    
                lpmpex->uParam = (UINT)lpmpex->MsgBuffer;
                lpmpex->lParam = (LONG)((UINT *)lpmpex->uParam + 1);
                break;
    
            case SBM_SETRANGE:
    
                //
                // Changed semantics to support 32-bit scroll bar range:
                //
                // Win16:
                //   SendMessage(hwnd, SBM_SETRANGE, fRedraw, MAKELONG(posMin, posMax);
                //
                // Win32:
                //   SendMessage(hwnd, fRedraw ? SBM_SETRANGE : SBM_SETRANGEREDRAW,
                //               posMin, posMax);
                //
    
                if (lpmpex->Parm16.WndProc.wParam)
                    lpmpex->uMsg = SBM_SETRANGEREDRAW;
    
                lpmpex->uParam = INT32(LOWORD(lpmpex->Parm16.WndProc.lParam));
                lpmpex->lParam = INT32(HIWORD(lpmpex->Parm16.WndProc.lParam));
                break;
    
            case SBM_SETPOS:
                lpmpex->uParam = INT32(lpmpex->Parm16.WndProc.wParam);      // sign-extend the position
                break;
        }
    }
    return TRUE;
}


VOID FASTCALL UnThunkSBMMsg16(LPMSGPARAMEX lpmpex)
{
    switch (lpmpex->uMsg) {

        case SBM_GETRANGE:

            if (lpmpex->uParam && lpmpex->lParam) {
                lpmpex->lReturn = MAKELONG(*(UINT *)lpmpex->uParam, 
                                                     *(UINT *)lpmpex->lParam);
            }
            break;
    }

}