MRESULT EXPENTRY SalFrameWndProc()

in main/vcl/os2/source/window/salframe.cxx [3455:3722]


MRESULT EXPENTRY SalFrameWndProc( HWND hWnd, ULONG nMsg,
                                  MPARAM nMP1, MPARAM nMP2 )
{
    Os2SalFrame*   	pFrame      = (Os2SalFrame*)GetWindowPtr( hWnd );
    MRESULT     	nRet        = (MRESULT)0;
    sal_Bool        	bDef     	= TRUE;
	bool 			bCheckTimers= false;

#if OSL_DEBUG_LEVEL>10
    if (nMsg!=WM_TIMER && nMsg!=WM_MOUSEMOVE)
        debug_printf( "SalFrameWndProc hWnd 0x%x nMsg 0x%x\n", hWnd, nMsg);
#endif

    switch( nMsg )
    {
        case WM_MOUSEMOVE:
        case WM_BUTTON1DOWN:
        case WM_BUTTON2DOWN:
        case WM_BUTTON3DOWN:
        case WM_BUTTON1DBLCLK:
        case WM_BUTTON2DBLCLK:
        case WM_BUTTON3DBLCLK:
        case WM_BUTTON1UP:
        case WM_BUTTON2UP:
        case WM_BUTTON3UP:
        case SAL_MSG_MOUSELEAVE:
            // ButtonUp/Down nie an die WinDefWindowProc weiterleiten, weil sonst
            // die Message an den Owner weitergeleitet wird
            ImplSalYieldMutexAcquireWithWait();
            bDef = !ImplHandleMouseMsg( hWnd, nMsg, nMP1, nMP2 );
            ImplSalYieldMutexRelease();
            break;

        case WM_CHAR:
            if ( pFrame->mbConversionMode )
                bDef = FALSE;
            else
                bDef = !ImplHandleKeyMsg( hWnd, nMsg, nMP1, nMP2 );
            break;

        case WM_ERASEBACKGROUND:
            nRet = (MRESULT)FALSE;
            bDef = FALSE;
            break;

        case WM_PAINT:
            bCheckTimers = ImplHandlePaintMsg( hWnd );
            bDef = FALSE;
            break;
        case SAL_MSG_POSTPAINT:
        	ImplHandlePaintMsg2( hWnd, (RECTL*)nMP1 );
			bCheckTimers = true;
        	bDef = FALSE;
			break;

        case WM_MOVE:
        case SAL_MSG_POSTMOVE:
            ImplHandleMoveMsg( hWnd );
            bDef = FALSE;
            break;

        case WM_SIZE:
            if ( ImplSalYieldMutexTryToAcquire() )
            {
                ImplHandleSizeMsg( hWnd, nMP2 );
                ImplSalYieldMutexRelease();
            }
            else
                WinPostMsg( hWnd, SAL_MSG_POSTSIZE, nMP1, nMP2 );
            break;
        case SAL_MSG_POSTSIZE:
            ImplHandleSizeMsg( hWnd, nMP2 );
            break;
		case WM_MINMAXFRAME:
            if ( ImplSalYieldMutexTryToAcquire() )
            {
				PSWP pswp = (PSWP) nMP1;
                ImplHandleSizeMsg( hWnd, MPFROM2SHORT( pswp->cx, pswp->cy) );
                ImplSalYieldMutexRelease();
            }
            else
                WinPostMsg( hWnd, SAL_MSG_POSTSIZE, 0, nMP2 );
			break;

        case WM_CALCVALIDRECTS:
            return (MRESULT)(CVR_ALIGNLEFT | CVR_ALIGNTOP);

        case WM_SETFOCUS:
            if ( ImplSalYieldMutexTryToAcquire() )
            {
                ImplHandleFocusMsg( pFrame, nMP2 );
                ImplSalYieldMutexRelease();
            }
            else
                WinPostMsg( hWnd, SAL_MSG_POSTFOCUS, 0, nMP2 );
            break;
        case SAL_MSG_POSTFOCUS:
            ImplHandleFocusMsg( pFrame, nMP2 );
            break;

        case WM_TRANSLATEACCEL:
            {
            // Da uns OS/2 zu viele Tasten abfaegnt, unternehmen wir etwas,
            // damit wir Shift+F1, Shift+F10 und Shift+Enter bekommen
            PQMSG   pMsg        = (PQMSG)nMP1;
            USHORT  nKeyFlags   = SHORT1FROMMP( pMsg->mp1 );
            USHORT  nKeyCode    = (UCHAR)SHORT2FROMMP( pMsg->mp2 );

            if ( !(nKeyFlags & KC_KEYUP) && (nKeyFlags & KC_VIRTUALKEY) &&
                 (nKeyFlags & KC_SHIFT) && (nKeyCode != VK_ESC) )
                return (MRESULT)FALSE;

            if ( nKeyCode == VK_F1 )
                return (MRESULT)FALSE;
            }
            break;

        case WM_CREATE:
            {
				HWND hWndFrame = WinQueryWindow(hWnd, QW_PARENT);
				if (hWndFrame == 0)
					debug_printf(" WARNING NULL FRAME!!\n");
				SalData* pSalData = GetSalData();
				// Window-Instanz am Windowhandle speichern
				pFrame = pSalData->mpCreateFrame;
				pSalData->mpCreateFrame = NULL;
				SetWindowPtr( hWnd, pFrame );
				SetWindowPtr( hWndFrame, pFrame);
				// HWND schon hier setzen, da schon auf den Instanzdaten
				// gearbeitet werden kann, wenn Messages waehrend
				// CreateWindow() gesendet werden
				pFrame->mhWndClient = hWnd;
				pFrame->mhWndFrame = hWndFrame;
				pFrame->maSysData.hWnd = hWnd;
            }
            break;

        case WM_CLOSE:
            ImplHandleCloseMsg( hWnd );
            bDef = FALSE;
            break;

        case WM_SYSVALUECHANGED:
            if ( pFrame->mbFullScreen )
                ImplSalFrameFullScreenPos( pFrame );
            // kein break, da der Rest auch noch verarbeitet werden soll
        case PL_ALTERED:
        case WM_SYSCOLORCHANGE:
            ImplSalYieldMutexAcquire();
            pFrame->CallCallback( SALEVENT_SETTINGSCHANGED, 0 );
            ImplSalYieldMutexRelease();
            break;

        case SAL_MSG_USEREVENT:
            ImplHandleUserEvent( hWnd, nMP2 );
            bDef = FALSE;
            break;
        case SAL_MSG_TOTOP:
            ImplSalToTop( hWnd, (ULONG)nMP1 );
            bDef = FALSE;
            break;
        case SAL_MSG_SHOW:
            ImplSalShow( hWnd, (ULONG)nMP1, (ULONG)nMP2 );
            bDef = FALSE;
            break;

		case WM_KBDLAYERCHANGED:
			debug_printf("hWnd 0x%08x WM_KBDLAYERCHANGED\n", hWnd);
            ImplHandleInputLangChange( hWnd );
            break;

		case WM_HSCROLL:
		case WM_VSCROLL:
			ImplHandleWheelMsg( hWnd, nMsg, nMP1, nMP2 );
            bDef = FALSE;
			break;

        case WM_COMMAND:
        case SAL_MSG_SYSPROCESSMENU:
            if ( SalImplHandleProcessMenu( pFrame, nMsg, nMP1, nMP2 ) )
            {
                bDef = FALSE;
                nRet = (MRESULT)1;
            }
            break;

#ifdef ENABLE_IME
        case WM_IMEREQUEST:
            if ( (ULONG)nMP1 == IMR_CONVRESULT )
            {
                if ( pFrame->mbHandleIME )
                {
                    // Nur im Conversionmodus akzeptieren wir den IME-Input
                    if ( pFrame->mbConversionMode )
                    {
                        ImplSalYieldMutexAcquire();
                        if ( ImplHandleIMEConversion( pFrame, nMP2 ) )
                        {
                            bDef = FALSE;
                            nRet = (MRESULT)TRUE;
                        }
                        ImplSalYieldMutexRelease();
                    }
                }
            }
            else if ( (ULONG)nMP1 == IMR_CANDIDATE )
            {
                if ( pFrame->mbHandleIME )
                {
                    ImplSalYieldMutexAcquire();
                    if ( (ULONG)nMP2 & IMR_CANDIDATE_SHOW )
                        ImplHandleIMEOpenCandidate( pFrame );
                    else if ( (ULONG)nMP2 & IMR_CANDIDATE_HIDE )
                        ImplHandleIMECloseCandidate( pFrame );
                    ImplSalYieldMutexRelease();
                }
            }
            break;

        case WM_IMENOTIFY:
            if ( (ULONG)nMP1 == IMN_STARTCONVERSION )
            {
                ImplSalYieldMutexAcquire();
                if ( ImplHandleIMEStartConversion( pFrame ) )
                {
                    bDef = FALSE;
                    nRet = (MRESULT)TRUE;
                }
                ImplSalYieldMutexRelease();
            }
            else if ( (ULONG)nMP1 == IMN_ENDCONVERSION )
            {
                if ( pFrame->mbHandleIME )
                {
                    ImplSalYieldMutexAcquire();
                    if ( ImplHandleIMEEndConversion( pFrame ) )
                    {
                        bDef = FALSE;
                        nRet = (MRESULT)TRUE;
                    }
                    ImplSalYieldMutexRelease();
                }
            }
            break;
#endif
    }

	if( bCheckTimers )
	{
		SalData* pSalData = GetSalData();
		if( pSalData->mnNextTimerTime )
		{
			ULONG nCurTime;
			DosQuerySysInfo( QSV_MS_COUNT, QSV_MS_COUNT, (PVOID)&nCurTime, sizeof(ULONG));
			if( pSalData->mnNextTimerTime < nCurTime )
			{
				QMSG aMsg;
				if (!WinPeekMsg( pFrame->mhAB, &aMsg, 0, WM_PAINT, WM_PAINT, PM_NOREMOVE ) )
					WinPostMsg( pSalData->mpFirstInstance->mhComWnd, SAL_MSG_POSTTIMER, 0, (MPARAM)nCurTime );
			}
		}
	}

    if ( bDef )
        nRet = WinDefWindowProc( hWnd, nMsg, nMP1, nMP2 );

    return nRet;
}