in src/java.desktop/windows/native/libawt/windows/awt_Component.cpp [1352:2080]
LRESULT AwtComponent::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
CounterHelper ch(&m_MessagesProcessing);
JNILocalFrame lframe(AwtToolkit::GetEnv(), 10);
SpyWinMessage(GetHWnd(), message,
(message == WM_AWT_RELEASE_ALL_DCS) ? TEXT("Disposed Component") : GetClassName());
LRESULT retValue = 0;
MsgRouting mr = mrDoDefault;
AwtToolkit::GetInstance().eventNumber++;
static BOOL ignoreNextLBTNUP = FALSE; //Ignore next LBUTTONUP msg?
lastMessage = message;
if (message == WmAwtIsComponent) {
// special message to identify AWT HWND's without using
// resource hogging ::SetProp
return (LRESULT)TRUE;
}
static const BOOL PROCESS_TOUCH_EVENTS = !IsDefaultTouch();
DWORD curPos = 0;
UINT switchMessage = message;
switch (switchMessage) {
case WM_AWT_GETDC:
{
HDC hDC;
// First, release the DCs scheduled for deletion
ReleaseDCList(passiveDCList);
GetDCReturnStruct *returnStruct = new GetDCReturnStruct;
returnStruct->gdiLimitReached = FALSE;
if (AwtGDIObject::IncrementIfAvailable()) {
hDC = ::GetDCEx(GetHWnd(), NULL,
DCX_CACHE | DCX_CLIPCHILDREN |
DCX_CLIPSIBLINGS);
if (hDC != NULL) {
// Add new DC to list of DC's associated with this Component
activeDCList.AddDC(hDC, GetHWnd());
} else {
// Creation failed; decrement counter in AwtGDIObject
AwtGDIObject::Decrement();
}
} else {
hDC = NULL;
returnStruct->gdiLimitReached = TRUE;
}
returnStruct->hDC = hDC;
retValue = (LRESULT)returnStruct;
mr = mrConsume;
break;
}
case WM_AWT_RELEASEDC:
{
HDC hDC = (HDC)wParam;
MoveDCToPassiveList(hDC, GetHWnd());
ReleaseDCList(passiveDCList);
mr = mrConsume;
break;
}
case WM_AWT_RELEASE_ALL_DCS:
{
// Called during Component destruction. Gets current list of
// DC's associated with Component and releases each DC.
ReleaseDCList(GetHWnd(), activeDCList);
ReleaseDCList(passiveDCList);
mr = mrConsume;
break;
}
case WM_CREATE: mr = WmCreate(); break;
case WM_CLOSE: mr = WmClose(); break;
case WM_DESTROY: mr = WmDestroy(); break;
case WM_NCDESTROY: mr = WmNcDestroy(); break;
case WM_ERASEBKGND:
mr = WmEraseBkgnd((HDC)wParam, *(BOOL*)&retValue); break;
case WM_PAINT:
CheckFontSmoothingSettings(GetHWnd());
/* Set draw state */
SetDrawState(GetDrawState() | JAWT_LOCK_CLIP_CHANGED);
mr = WmPaint((HDC)wParam);
break;
case WM_GETMINMAXINFO:
mr = WmGetMinMaxInfo((LPMINMAXINFO)lParam);
break;
case WM_WINDOWPOSCHANGING:
{
// We process this message so that we can synchronize access to
// a moving window. The Scale/Blt functions in Win32BlitLoops
// take the same windowMoveLock to ensure that a window is not
// moving while we are trying to copy pixels into it.
WINDOWPOS *lpPosInfo = (WINDOWPOS *)lParam;
if ((lpPosInfo->flags & (SWP_NOMOVE | SWP_NOSIZE)) !=
(SWP_NOMOVE | SWP_NOSIZE))
{
// Move or Size command.
// Windows tends to send erroneous events that the window
// is about to move when the coordinates are exactly the
// same as the last time. This can cause problems with
// our windowMoveLock CriticalSection because we enter it
// here and never get to WM_WINDOWPOSCHANGED to release it.
// So make sure this is a real move/size event before bothering
// to grab the critical section.
BOOL takeLock = FALSE;
if (!(lpPosInfo->flags & SWP_NOMOVE) &&
((windowMoveLockPosX != lpPosInfo->x) ||
(windowMoveLockPosY != lpPosInfo->y)))
{
// Real move event
takeLock = TRUE;
windowMoveLockPosX = lpPosInfo->x;
windowMoveLockPosY = lpPosInfo->y;
}
if (!(lpPosInfo->flags & SWP_NOSIZE) &&
((windowMoveLockPosCX != lpPosInfo->cx) ||
(windowMoveLockPosCY != lpPosInfo->cy)))
{
// Real size event
takeLock = TRUE;
windowMoveLockPosCX = lpPosInfo->cx;
windowMoveLockPosCY = lpPosInfo->cy;
}
if (takeLock) {
if (!windowMoveLockHeld) {
windowMoveLock.Enter();
windowMoveLockHeld = TRUE;
}
}
}
mr = WmWindowPosChanging(lParam);
break;
}
case WM_WINDOWPOSCHANGED:
{
// Release lock grabbed in the POSCHANGING message
if (windowMoveLockHeld) {
windowMoveLockHeld = FALSE;
windowMoveLock.Leave();
}
mr = WmWindowPosChanged(lParam);
break;
}
case WM_MOVE: {
RECT r;
::GetWindowRect(GetHWnd(), &r);
mr = WmMove(r.left, r.top);
break;
}
case WM_SIZE:
{
RECT r;
// fix 4128317 : use GetWindowRect for full 32-bit int precision and
// to avoid negative client area dimensions overflowing 16-bit params - robi
::GetWindowRect(GetHWnd(), &r);
mr = WmSize(static_cast<UINT>(wParam), r.right - r.left, r.bottom - r.top);
//mr = WmSize(wParam, LOWORD(lParam), HIWORD(lParam));
SetCompositionWindow(r);
break;
}
case WM_SIZING:
mr = WmSizing();
break;
case WM_SHOWWINDOW:
mr = WmShowWindow(static_cast<BOOL>(wParam),
static_cast<UINT>(lParam)); break;
case WM_SYSCOMMAND:
mr = WmSysCommand(static_cast<UINT>(wParam & 0xFFF0),
GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
break;
case WM_ENTERSIZEMOVE:
mr = WmEnterSizeMove();
break;
case WM_EXITSIZEMOVE:
mr = WmExitSizeMove();
break;
// Bug #4039858 (Selecting menu item causes bogus mouse click event)
case WM_ENTERMENULOOP:
mr = WmEnterMenuLoop((BOOL)wParam);
sm_bMenuLoop = TRUE;
// we need to release grab if menu is shown
if (AwtWindow::GetGrabbedWindow() != NULL) {
AwtWindow::GetGrabbedWindow()->Ungrab();
}
break;
case WM_EXITMENULOOP:
mr = WmExitMenuLoop((BOOL)wParam);
sm_bMenuLoop = FALSE;
break;
// We don't expect any focus messages on non-proxy component,
// except those that came from Java.
case WM_SETFOCUS:
if (sm_inSynthesizeFocus) {
mr = WmSetFocus((HWND)wParam);
} else {
mr = mrConsume;
}
break;
case WM_KILLFOCUS:
if (sm_inSynthesizeFocus) {
mr = WmKillFocus((HWND)wParam);
} else {
mr = mrConsume;
}
break;
case WM_ACTIVATE: {
UINT nState = LOWORD(wParam);
BOOL fMinimized = (BOOL)HIWORD(wParam);
mr = mrConsume;
if (!sm_suppressFocusAndActivation &&
(!fMinimized || (nState == WA_INACTIVE)))
{
mr = WmActivate(nState, fMinimized, (HWND)lParam);
// When the window is deactivated, send WM_IME_ENDCOMPOSITION
// message to deactivate the composition window so that
// it won't receive keyboard input focus.
HIMC hIMC;
HWND hwnd = ImmGetHWnd();
if ((hIMC = ImmGetContext(hwnd)) != NULL) {
ImmReleaseContext(hwnd, hIMC);
DefWindowProc(WM_IME_ENDCOMPOSITION, 0, 0);
}
}
break;
}
case WM_ACTIVATEAPP:
if (wParam == TRUE) {
// the window is being activated, let's check if we still own the clipboard
AwtClipboard::ExtraCheckOfOwnership();
}
break;
case WM_MOUSEACTIVATE: {
AwtWindow *window = GetContainer();
if (window && window->IsFocusableWindow()) {
// AWT/Swing will later request focus to a proper component
// on handling the Java mouse event. Anyway, we have to
// activate the window here as it works both for AWT & Swing.
// Do it in our own fassion,
window->AwtSetActiveWindow(TRUE, LOWORD(lParam)/*hittest*/);
}
mr = mrConsume;
retValue = AwtToolkit::GetInstance().IsActiveWindowTrackingEnabled() ? MA_ACTIVATE : MA_NOACTIVATE;
break;
}
case WM_CTLCOLORMSGBOX:
case WM_CTLCOLOREDIT:
case WM_CTLCOLORLISTBOX:
case WM_CTLCOLORBTN:
case WM_CTLCOLORDLG:
case WM_CTLCOLORSCROLLBAR:
case WM_CTLCOLORSTATIC:
mr = WmCtlColor((HDC)wParam, (HWND)lParam,
message-WM_CTLCOLORMSGBOX+CTLCOLOR_MSGBOX,
*(HBRUSH*)&retValue);
break;
case WM_HSCROLL:
mr = WmHScroll(LOWORD(wParam), HIWORD(wParam), (HWND)lParam);
break;
case WM_VSCROLL:
mr = WmVScroll(LOWORD(wParam), HIWORD(wParam), (HWND)lParam);
break;
// 4664415: We're seeing a WM_LBUTTONUP when the user releases the
// mouse button after a WM_NCLBUTTONDBLCLK. We want to ignore this
// WM_LBUTTONUP, so we set a flag in WM_NCLBUTTONDBLCLK and look for the
// flag on a WM_LBUTTONUP. -bchristi
case WM_NCLBUTTONDBLCLK:
mr = WmNcMouseDown(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), LEFT_BUTTON | DBL_CLICK);
if (mr == mrDoDefault) {
ignoreNextLBTNUP = TRUE;
}
break;
case WM_NCLBUTTONDOWN:
mr = WmNcMouseDown(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), LEFT_BUTTON);
ignoreNextLBTNUP = FALSE;
break;
case WM_NCLBUTTONUP:
mr = WmNcMouseUp(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), LEFT_BUTTON);
break;
case WM_NCRBUTTONDOWN:
case WM_NCRBUTTONDBLCLK:
mr = WmNcMouseDown(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), RIGHT_BUTTON);
break;
case WM_NCRBUTTONUP:
mr = WmNcMouseUp(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), RIGHT_BUTTON);
break;
case WM_NCMBUTTONDOWN:
case WM_NCMBUTTONDBLCLK:
mr = WmNcMouseDown(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), MIDDLE_BUTTON);
break;
case WM_NCMBUTTONUP:
mr = WmNcMouseUp(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), MIDDLE_BUTTON);
break;
case WM_NCXBUTTONDOWN:
case WM_NCXBUTTONDBLCLK:
if (AwtToolkit::GetInstance().areExtraMouseButtonsEnabled()) {
int b = 0;
if (HIWORD(wParam) == 1) b = X1_BUTTON;
else if (HIWORD(wParam) == 2) b = X2_BUTTON;
if (b != 0) mr = WmNcMouseDown(LOWORD(wParam), GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), b);
}
break;
case WM_NCXBUTTONUP:
if (AwtToolkit::GetInstance().areExtraMouseButtonsEnabled()) {
int b = 0;
if (HIWORD(wParam) == 1) b = X1_BUTTON;
else if (HIWORD(wParam) == 2) b = X2_BUTTON;
if (b != 0) mr = WmNcMouseUp(LOWORD(wParam), GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), b);
}
break;
case WM_NCMOUSEMOVE:
mr = WmNcMouseMove(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
break;
case WM_LBUTTONUP:
if (ignoreNextLBTNUP) {
ignoreNextLBTNUP = FALSE;
return mrDoDefault;
}
//fall-through
case WM_LBUTTONDOWN:
ignoreNextLBTNUP = FALSE;
//fall-through
case WM_LBUTTONDBLCLK:
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
case WM_RBUTTONUP:
case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK:
case WM_MBUTTONUP:
case WM_XBUTTONDBLCLK:
case WM_XBUTTONDOWN:
case WM_XBUTTONUP:
case WM_MOUSEMOVE:
case WM_MOUSEWHEEL:
case WM_MOUSEHWHEEL:
case WM_AWT_MOUSEENTER:
case WM_AWT_MOUSEEXIT:
if (IsMouseEventFromTouch() && PROCESS_TOUCH_EVENTS) {
break;
}
curPos = ::GetMessagePos();
POINT myPos;
myPos.x = GET_X_LPARAM(curPos);
myPos.y = GET_Y_LPARAM(curPos);
::ScreenToClient(GetHWnd(), &myPos);
switch(switchMessage) {
case WM_AWT_MOUSEENTER:
mr = WmMouseEnter(static_cast<UINT>(wParam), myPos.x, myPos.y);
break;
case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
LEFT_BUTTON);
break;
case WM_LBUTTONUP:
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
LEFT_BUTTON);
break;
case WM_MOUSEMOVE:
mr = WmMouseMove(static_cast<UINT>(wParam), myPos.x, myPos.y);
break;
case WM_MBUTTONDOWN:
case WM_MBUTTONDBLCLK:
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
MIDDLE_BUTTON);
break;
case WM_XBUTTONDOWN:
case WM_XBUTTONDBLCLK:
if (AwtToolkit::GetInstance().areExtraMouseButtonsEnabled()) {
if (HIWORD(wParam) == 1) {
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
X1_BUTTON);
}
if (HIWORD(wParam) == 2) {
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
X2_BUTTON);
}
}
break;
case WM_XBUTTONUP:
if (AwtToolkit::GetInstance().areExtraMouseButtonsEnabled()) {
if (HIWORD(wParam) == 1) {
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
X1_BUTTON);
}
if (HIWORD(wParam) == 2) {
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
X2_BUTTON);
}
}
break;
case WM_RBUTTONDOWN:
case WM_RBUTTONDBLCLK:
mr = WmMouseDown(static_cast<UINT>(wParam), myPos.x, myPos.y,
RIGHT_BUTTON);
break;
case WM_RBUTTONUP:
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
RIGHT_BUTTON);
break;
case WM_MBUTTONUP:
mr = WmMouseUp(static_cast<UINT>(wParam), myPos.x, myPos.y,
MIDDLE_BUTTON);
break;
case WM_AWT_MOUSEEXIT:
mr = WmMouseExit(static_cast<UINT>(wParam), myPos.x, myPos.y);
break;
case WM_MOUSEWHEEL:
case WM_MOUSEHWHEEL:
mr = WmMouseWheel(GET_KEYSTATE_WPARAM(wParam),
GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam),
GET_WHEEL_DELTA_WPARAM(wParam),
switchMessage == WM_MOUSEHWHEEL);
break;
}
break;
case WM_TOUCH:
if (PROCESS_TOUCH_EVENTS) {
WmTouch(wParam, lParam);
break;
}
case WM_SETCURSOR:
mr = mrDoDefault;
if (LOWORD(lParam) == HTCLIENT || AwtFrame::IsTitleBarHitTest(LOWORD(lParam))) {
if (AwtComponent* comp =
AwtComponent::GetComponent((HWND)wParam)) {
if (AwtFrame::IsTitleBarHitTest(LOWORD(lParam))) {
AwtWindow* window = comp->GetContainer();
if (window == NULL || window->IsSimpleWindow() ||
!((AwtFrame*) window)->HasCustomTitleBar()) break;
// When custom title bar is enabled, WM_SETCURSOR is sent to root Frame, so find actual component under cursor
HWND hwnd = (HWND) wParam;
POINT p;
::GetCursorPos(&p);
ScreenToBottommostChild(hwnd, p.x, p.y);
comp = AwtComponent::GetComponent(hwnd);
if (!comp) break;
}
AwtCursor::UpdateCursor(comp);
mr = mrConsume;
}
}
break;
case WM_KEYDOWN:
mr = WmKeyDown(static_cast<UINT>(wParam),
LOWORD(lParam), HIWORD(lParam), FALSE);
break;
case WM_KEYUP:
mr = WmKeyUp(static_cast<UINT>(wParam),
LOWORD(lParam), HIWORD(lParam), FALSE);
break;
case WM_SYSKEYDOWN:
mr = WmKeyDown(static_cast<UINT>(wParam),
LOWORD(lParam), HIWORD(lParam), TRUE);
break;
case WM_SYSKEYUP:
mr = WmKeyUp(static_cast<UINT>(wParam),
LOWORD(lParam), HIWORD(lParam), TRUE);
break;
case WM_IME_SETCONTEXT:
// lParam is passed as pointer and it can be modified.
mr = WmImeSetContext(static_cast<BOOL>(wParam), &lParam);
CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
break;
case WM_IME_NOTIFY:
mr = WmImeNotify(wParam, lParam);
CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
break;
case WM_IME_STARTCOMPOSITION:
mr = WmImeStartComposition();
CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
break;
case WM_IME_ENDCOMPOSITION:
mr = WmImeEndComposition();
CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
break;
case WM_IME_COMPOSITION: {
WORD dbcschar = static_cast<WORD>(wParam);
mr = WmImeComposition(dbcschar, lParam);
CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
break;
}
case WM_IME_CONTROL:
case WM_IME_COMPOSITIONFULL:
case WM_IME_SELECT:
case WM_IME_KEYUP:
case WM_IME_KEYDOWN:
case WM_IME_REQUEST:
CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
break;
case WM_CHAR:
mr = WmChar(static_cast<UINT>(wParam),
LOWORD(lParam), HIWORD(lParam), FALSE);
break;
case WM_SYSCHAR:
mr = WmChar(static_cast<UINT>(wParam),
LOWORD(lParam), HIWORD(lParam), TRUE);
break;
case WM_IME_CHAR:
mr = WmIMEChar(static_cast<UINT>(wParam),
LOWORD(lParam), HIWORD(lParam), FALSE);
break;
case WM_INPUTLANGCHANGEREQUEST: {
DTRACE_PRINTLN4("WM_INPUTLANGCHANGEREQUEST: hwnd = 0x%X (%s);"//
"0x%08X -> 0x%08X",
GetHWnd(), GetClassName(),
(UINT_PTR)GetKeyboardLayout(), (UINT_PTR)lParam);
// 4267428: make sure keyboard layout is turned undead.
static BYTE keyboardState[AwtToolkit::KB_STATE_SIZE];
AwtToolkit::GetKeyboardState(keyboardState);
WORD ignored;
::ToAsciiEx(VK_SPACE, ::MapVirtualKey(VK_SPACE, 0),
keyboardState, &ignored, 0, GetKeyboardLayout());
CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
break;
}
case WM_INPUTLANGCHANGE:
DTRACE_PRINTLN3("WM_INPUTLANGCHANGE: hwnd = 0x%X (%s);"//
"new = 0x%08X",
GetHWnd(), GetClassName(), (UINT)lParam);
mr = WmInputLangChange(static_cast<UINT>(wParam), reinterpret_cast<HKL>(lParam));
CallProxyDefWindowProc(message, wParam, lParam, retValue, mr);
// should return non-zero if we process this message
retValue = 1;
break;
case WM_AWT_FORWARD_CHAR:
mr = WmForwardChar(LOWORD(wParam), lParam, HIWORD(wParam));
break;
case WM_PASTE:
mr = WmPaste();
break;
case WM_TIMER:
mr = WmTimer(wParam);
break;
case WM_COMMAND:
mr = WmCommand(LOWORD(wParam), (HWND)lParam, HIWORD(wParam));
break;
case WM_COMPAREITEM:
mr = WmCompareItem(static_cast<UINT>(wParam),
*(COMPAREITEMSTRUCT*)lParam, retValue);
break;
case WM_DELETEITEM:
mr = WmDeleteItem(static_cast<UINT>(wParam),
*(DELETEITEMSTRUCT*)lParam);
break;
case WM_DRAWITEM:
mr = WmDrawItem(static_cast<UINT>(wParam),
*(DRAWITEMSTRUCT*)lParam);
break;
case WM_MEASUREITEM:
mr = WmMeasureItem(static_cast<UINT>(wParam),
*(MEASUREITEMSTRUCT*)lParam);
break;
case WM_AWT_HANDLE_EVENT:
mr = HandleEvent( (MSG *) lParam, (BOOL) wParam);
break;
case WM_PRINT:
mr = WmPrint((HDC)wParam, lParam);
break;
case WM_PRINTCLIENT:
mr = WmPrintClient((HDC)wParam, lParam);
break;
case WM_NCCALCSIZE:
mr = WmNcCalcSize((BOOL)wParam, (LPNCCALCSIZE_PARAMS)lParam,
retValue);
break;
case WM_NCPAINT:
mr = WmNcPaint((HRGN)wParam);
break;
case WM_NCHITTEST:
mr = WmNcHitTest(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), retValue);
break;
case WM_AWT_RESHAPE_COMPONENT: {
RECT* r = (RECT*)lParam;
WPARAM checkEmbedded = wParam;
if (checkEmbedded == CHECK_EMBEDDED && IsEmbeddedFrame()) {
::OffsetRect(r, -r->left, -r->top);
}
Reshape(r->left, r->top, r->right - r->left, r->bottom - r->top);
delete r;
mr = mrConsume;
break;
}
case WM_AWT_SETALWAYSONTOP: {
AwtWindow* w = (AwtWindow*)lParam;
BOOL value = (BOOL)wParam;
UINT flags = SWP_NOMOVE | SWP_NOSIZE;
// transient windows shouldn't change the owner window's position in the z-order
if (w->IsRetainingHierarchyZOrder()) {
flags |= SWP_NOOWNERZORDER;
}
::SetWindowPos(w->GetHWnd(), (value != 0 ? HWND_TOPMOST : HWND_NOTOPMOST),
0,0,0,0, flags);
break;
}
case WM_AWT_BEGIN_VALIDATE:
BeginValidate();
mr = mrConsume;
break;
case WM_AWT_END_VALIDATE:
EndValidate();
mr = mrConsume;
break;
case WM_PALETTEISCHANGING:
mr = WmPaletteIsChanging((HWND)wParam);
mr = mrDoDefault;
break;
case WM_QUERYNEWPALETTE:
mr = WmQueryNewPalette(retValue);
break;
case WM_PALETTECHANGED:
mr = WmPaletteChanged((HWND)wParam);
break;
case WM_STYLECHANGED:
mr = WmStyleChanged(static_cast<int>(wParam), (LPSTYLESTRUCT)lParam);
break;
case WM_SETTINGCHANGE:
CheckFontSmoothingSettings(NULL);
mr = WmSettingChange(static_cast<UINT>(wParam), (LPCTSTR)lParam);
break;
case WM_CONTEXTMENU:
mr = WmContextMenu((HWND)wParam,
GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
break;
/*
* These messages are used to route Win32 calls to the
* creating thread, since these calls fail unless executed
* there.
*/
case WM_AWT_COMPONENT_SHOW:
Show();
mr = mrConsume;
break;
case WM_AWT_COMPONENT_HIDE:
Hide();
mr = mrConsume;
break;
case WM_AWT_COMPONENT_SETFOCUS:
if ((BOOL)wParam) {
retValue = SynthesizeWmSetFocus(GetHWnd(), NULL);
} else {
retValue = SynthesizeWmKillFocus(GetHWnd(), NULL);
}
mr = mrConsume;
break;
case WM_AWT_WINDOW_SETACTIVE:
retValue = (LRESULT)((AwtWindow*)this)->AwtSetActiveWindow((BOOL)wParam);
mr = mrConsume;
break;
case WM_AWT_WINDOW_TOFRONT:
((AwtWindow*)this)->ToFront();
mr = mrConsume;
break;
case WM_AWT_CREATE_PRINTED_PIXELS: {
CreatePrintedPixelsStruct* cpps = (CreatePrintedPixelsStruct*)wParam;
SIZE loc = { cpps->srcx, cpps->srcy };
SIZE size = { cpps->srcw, cpps->srch };
retValue = (LRESULT)CreatePrintedPixels(loc, size, cpps->alpha);
mr = mrConsume;
break;
}
case WM_UNDOCUMENTED_CLICKMENUBAR:
{
if (::IsWindow(AwtWindow::GetModalBlocker(GetHWnd()))) {
mr = mrConsume;
}
break;
}
case WM_GETOBJECT:
{
// We've got a WM_GETOBJECT message which was likely sent by an assistive tool.
// Therefore, we can start generating native caret accessibility events.
DWORD objId = static_cast<DWORD>(static_cast<DWORD_PTR>(lParam));
if (objId == OBJID_CLIENT) {
JNIEnv *env = (JNIEnv *) JNU_GetEnv(jvm, JNI_VERSION_1_2);
if (env != nullptr) {
jclass cls = env->FindClass("sun/awt/windows/AccessibleCaretLocationNotifier");
if (cls != nullptr) {
jmethodID mid = env->GetStaticMethodID(cls, "startCaretNotifier", "(J)V");
if (mid != nullptr) {
env->CallStaticVoidMethod(cls, mid, reinterpret_cast<jlong>(GetHWnd()));
}
}
}
} else if (objId == OBJID_CARET) {
AccessibleCaret *caret = AccessibleCaret::getInstanceIfPresent();
if (caret != nullptr) {
retValue = LresultFromObject(IID_IAccessible, wParam, caret);
mr = mrConsume;
}
}
break;
}
}
/*
* If not a specific Consume, it was a specific DoDefault, or a
* PassAlong (since the default is the next in chain), then call the
* default proc.
*/
if (mr != mrConsume) {
retValue = DefWindowProc(message, wParam, lParam);
}
return retValue;
}