6826397: PIT : Frame System Menu is not seen for when ALT + Space Bar is pressed in jdk7 b55 build.
Reviewed-by: art, ant
--- a/jdk/src/windows/native/sun/windows/awt_Frame.cpp Tue Mar 01 13:49:56 2011 +0300
+++ b/jdk/src/windows/native/sun/windows/awt_Frame.cpp Tue Mar 01 15:24:46 2011 +0300
@@ -109,7 +109,6 @@
m_isMenuDropped = FALSE;
m_isInputMethodWindow = FALSE;
m_isUndecorated = FALSE;
- m_proxyFocusOwner = NULL;
m_lastProxiedFocusOwner = NULL;
m_actualFocusedWindow = NULL;
m_iconic = FALSE;
@@ -127,7 +126,6 @@
void AwtFrame::Dispose()
{
- DestroyProxyFocusOwner();
AwtWindow::Dispose();
}
@@ -308,22 +306,9 @@
return frame;
}
-LRESULT CALLBACK AwtFrame::ProxyWindowProc(HWND hwnd, UINT message,
- WPARAM wParam, LPARAM lParam)
+LRESULT AwtFrame::ProxyWindowProc(UINT message, WPARAM wParam, LPARAM lParam, MsgRouting &mr)
{
- TRY;
-
- DASSERT(::IsWindow(hwnd));
-
- AwtFrame *parent = (AwtFrame *)
- AwtComponent::GetComponentImpl(::GetParent(hwnd));
-
- if (!parent || parent->GetProxyFocusOwner() != hwnd ||
- message == AwtComponent::WmAwtIsComponent ||
- message == WM_GETOBJECT)
- {
- return ComCtl32Util::GetInstance().DefWindowProc(NULL, hwnd, message, wParam, lParam);
- }
+ LRESULT retValue = 0L;
AwtComponent *focusOwner = NULL;
// IME and input language related messages need to be sent to a window
@@ -346,19 +331,23 @@
// TODO: when a Choice's list is dropped down and we're scrolling in
// the list WM_MOUSEWHEEL messages come to the poxy, not to the list. Why?
case WM_MOUSEWHEEL:
- focusOwner = AwtComponent::GetComponent(parent->GetLastProxiedFocusOwner());
- if (focusOwner != NULL) {
- return focusOwner->WindowProc(message, wParam, lParam);
+ focusOwner = AwtComponent::GetComponent(GetLastProxiedFocusOwner());
+ if (focusOwner != NULL &&
+ focusOwner != this) // avoid recursive calls
+ {
+ retValue = focusOwner->WindowProc(message, wParam, lParam);
+ mr = mrConsume;
}
break;
case WM_SETFOCUS:
- if (!sm_suppressFocusAndActivation && parent->IsEmbeddedFrame()) {
- parent->AwtSetActiveWindow();
+ if (!sm_suppressFocusAndActivation && IsEmbeddedFrame()) {
+ AwtSetActiveWindow();
}
- return 0;
+ mr = mrConsume;
+ break;
case WM_KILLFOCUS:
- if (!sm_suppressFocusAndActivation && parent->IsEmbeddedFrame()) {
- AwtWindow::SynthesizeWmActivate(FALSE, parent->GetHWnd(), NULL);
+ if (!sm_suppressFocusAndActivation && IsEmbeddedFrame()) {
+ AwtWindow::SynthesizeWmActivate(FALSE, GetHWnd(), NULL);
} else if (sm_restoreFocusAndActivation) {
if (AwtComponent::GetFocusedWindow() != NULL) {
@@ -369,64 +358,28 @@
}
}
}
- return 0;
+ mr = mrConsume;
+ break;
case 0x0127: // WM_CHANGEUISTATE
case 0x0128: // WM_UPDATEUISTATE
- return 0;
+ mr = mrConsume;
+ break;
}
- return parent->WindowProc(message, wParam, lParam);
-
- CATCH_BAD_ALLOC_RET(0);
-}
-void AwtFrame::CreateProxyFocusOwner()
-{
- if (AwtToolkit::IsMainThread()) {
- AwtFrame::_CreateProxyFocusOwner((void *)this);
- } else {
- AwtToolkit::GetInstance().InvokeFunction(AwtFrame::_CreateProxyFocusOwner, (void *)this);
- }
+ return retValue;
}
-void AwtFrame::_CreateProxyFocusOwner(void *param)
-{
- DASSERT(AwtToolkit::IsMainThread());
-
- AwtFrame *f = (AwtFrame *)param;
- DASSERT(f->m_proxyFocusOwner == NULL);
-
- f->m_proxyFocusOwner = ::CreateWindow(TEXT("STATIC"),
- TEXT("ProxyFocusOwner"),
- WS_CHILD,
- 0, 0, 0, 0, f->GetHWnd(), NULL,
- AwtToolkit::GetInstance().
- GetModuleHandle(),
- NULL);
-
- f->m_proxyDefWindowProc = ComCtl32Util::GetInstance().SubclassHWND(f->m_proxyFocusOwner, ProxyWindowProc);
-}
-
-void AwtFrame::DestroyProxyFocusOwner()
+LRESULT AwtFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
- // proxy focus owner must be destroyed on toolkit thread only
- if (AwtToolkit::IsMainThread()) {
- AwtFrame::_DestroyProxyFocusOwner((void *)this);
- } else {
- AwtToolkit::GetInstance().InvokeFunction(AwtFrame::_DestroyProxyFocusOwner, (void *)this);
- }
-}
+ MsgRouting mr = mrDoDefault;
+ LRESULT retValue = 0L;
+
+ retValue = ProxyWindowProc(message, wParam, lParam, mr);
-void AwtFrame::_DestroyProxyFocusOwner(void *param)
-{
- DASSERT(AwtToolkit::IsMainThread());
-
- AwtFrame *f = (AwtFrame *)param;
- if (f->m_proxyFocusOwner != NULL) {
- HWND toDestroy = f->m_proxyFocusOwner;
- f->m_proxyFocusOwner = NULL;
- ComCtl32Util::GetInstance().UnsubclassHWND(toDestroy, ProxyWindowProc, f->m_proxyDefWindowProc);
- ::DestroyWindow(toDestroy);
+ if (mr != mrConsume) {
+ retValue = AwtWindow::WindowProc(message, wParam, lParam);
}
+ return retValue;
}
MsgRouting AwtFrame::WmShowWindow(BOOL show, UINT status)
--- a/jdk/src/windows/native/sun/windows/awt_Frame.h Tue Mar 01 13:49:56 2011 +0300
+++ b/jdk/src/windows/native/sun/windows/awt_Frame.h Tue Mar 01 15:24:46 2011 +0300
@@ -96,6 +96,8 @@
AwtMenuBar* GetMenuBar();
void SetMenuBar(AwtMenuBar*);
+ virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
+
MsgRouting WmGetMinMaxInfo(LPMINMAXINFO lpmmi);
MsgRouting WmSize(UINT type, int w, int h);
MsgRouting WmActivate(UINT nState, BOOL fMinimized, HWND opposite);
@@ -117,10 +119,7 @@
INLINE BOOL IsUndecorated() { return m_isUndecorated; }
INLINE HWND GetProxyFocusOwner() {
- if (m_proxyFocusOwner == NULL) {
- CreateProxyFocusOwner();
- }
- return m_proxyFocusOwner;
+ return GetHWnd();
}
void SetMaximizedBounds(int x, int y, int w, int h);
@@ -159,15 +158,7 @@
BOOL m_isUndecorated;
private:
- static LRESULT CALLBACK ProxyWindowProc(HWND hwnd, UINT message,
- WPARAM wParam, LPARAM lParam);
- void CreateProxyFocusOwner();
- void DestroyProxyFocusOwner();
-
- /* creates proxy focus owner, called on Toolkit thread */
- static void _CreateProxyFocusOwner(void *param);
- /* destroys proxy focus owner, called on Toolkit thread */
- static void _DestroyProxyFocusOwner(void *param);
+ LRESULT ProxyWindowProc(UINT message, WPARAM wParam, LPARAM lParam, MsgRouting &mr);
/* The frame's embedding parent (if any) */
HWND m_parentWnd;
@@ -188,10 +179,6 @@
/* The frame is an InputMethodWindow */
BOOL m_isInputMethodWindow;
- /* Receives all keyboard input when an AwtWindow which is not an AwtFrame
- or an AwtDialog (or one of its children) has the logical input focus. */
- HWND m_proxyFocusOwner;
-
/* Retains the last/current sm_focusOwner proxied. Actually, it should be
* a component of an owned window last/currently active. */
HWND m_lastProxiedFocusOwner;