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;
}