# HG changeset patch # User lana # Date 1341374184 25200 # Node ID 578ac31dc2f900eeddaf4e66cde5db3da85def23 # Parent 49a600ad8d1e0e0ad3a810b5bb2d8b9f715a99f4# Parent eada40c7d74db15afdc570482268771f19de0155 Merge diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/LWButtonPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWButtonPeer.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/LWButtonPeer.java Tue Jul 03 20:56:24 2012 -0700 @@ -47,8 +47,8 @@ } @Override - public void initialize() { - super.initialize(); + void initializeImpl() { + super.initializeImpl(); setLabel(getTarget().getLabel()); synchronized (getDelegateLock()) { getDelegate().addActionListener(this); diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/LWCheckboxPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWCheckboxPeer.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/LWCheckboxPeer.java Tue Jul 03 20:56:24 2012 -0700 @@ -61,8 +61,8 @@ } @Override - public void initialize() { - super.initialize(); + void initializeImpl() { + super.initializeImpl(); setLabel(getTarget().getLabel()); setState(getTarget().getState()); setCheckboxGroup(getTarget().getCheckboxGroup()); diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/LWChoicePeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWChoicePeer.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/LWChoicePeer.java Tue Jul 03 20:56:24 2012 -0700 @@ -55,8 +55,8 @@ } @Override - public void initialize() { - super.initialize(); + void initializeImpl() { + super.initializeImpl(); final Choice choice = getTarget(); final JComboBox combo = getDelegate(); synchronized (getDelegateLock()) { diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/LWComponentPeer.java Tue Jul 03 20:56:24 2012 -0700 @@ -81,19 +81,10 @@ // lock is not used as there are many peers related ops // to be done on the toolkit thread, and we don't want to // depend on a public lock on this thread - private final static Object peerTreeLock = + private static final Object peerTreeLock = new StringBuilder("LWComponentPeer.peerTreeLock"); - /** - * A custom tree-lock used for the hierarchy of the delegate Swing - * components. - * The lock synchronizes access to the delegate - * internal state. Think of it as a 'virtual EDT'. - */ -// private final Object delegateTreeLock = -// new StringBuilder("LWComponentPeer.delegateTreeLock"); - - private T target; + private final T target; // Container peer. It may not be the peer of the target's direct // parent, for example, in the case of hw/lw mixing. However, @@ -108,10 +99,10 @@ // be updated when the component is reparented to another container private LWWindowPeer windowPeer; - private AtomicBoolean disposed = new AtomicBoolean(false); + private final AtomicBoolean disposed = new AtomicBoolean(false); // Bounds are relative to parent peer - private Rectangle bounds = new Rectangle(); + private final Rectangle bounds = new Rectangle(); private Region region; // Component state. Should be accessed under the state lock @@ -122,9 +113,11 @@ private Color foreground; private Font font; - // Paint area to coalesce all the paint events and store - // the target dirty area - private RepaintArea targetPaintArea; + /** + * Paint area to coalesce all the paint events and store the target dirty + * area. + */ + private final RepaintArea targetPaintArea; // private volatile boolean paintPending; private volatile boolean isLayouting; @@ -137,7 +130,7 @@ private int fNumDropTargets = 0; private CDropTarget fDropTarget = null; - private PlatformComponent platformComponent; + private final PlatformComponent platformComponent; private final class DelegateContainer extends Container { { @@ -175,6 +168,7 @@ } public LWComponentPeer(T target, PlatformComponent platformComponent) { + targetPaintArea = new LWRepaintArea(); this.target = target; this.platformComponent = platformComponent; @@ -201,10 +195,13 @@ synchronized (getDelegateLock()) { delegate = createDelegate(); if (delegate != null) { + delegate.setVisible(false); delegateContainer = new DelegateContainer(); delegateContainer.add(delegate); delegateContainer.addNotify(); delegate.addNotify(); + resetColorsAndFont(delegate); + delegate.setOpaque(true); } else { return; } @@ -278,27 +275,28 @@ return getDelegate(); } - /* - * Initializes this peer by fetching all the properties from the target. - * The call to initialize() is not placed to LWComponentPeer ctor to - * let the subclass ctor to finish completely first. Instead, it's the - * LWToolkit object who is responsible for initialization. + /** + * Initializes this peer. The call to initialize() is not placed to + * LWComponentPeer ctor to let the subclass ctor to finish completely first. + * Instead, it's the LWToolkit object who is responsible for initialization. + * Note that we call setVisible() at the end of initialization. */ - public void initialize() { + public final void initialize() { platformComponent.initialize(target, this, getPlatformWindow()); - targetPaintArea = new LWRepaintArea(); - if (getDelegate() != null) { - synchronized (getDelegateLock()) { - resetColorsAndFont(delegate); - getDelegate().setOpaque(true); - } - } + initializeImpl(); + setVisible(target.isVisible()); + } + + /** + * Fetching general properties from the target. Should be overridden in + * subclasses to initialize specific peers properties. + */ + void initializeImpl() { setBackground(target.getBackground()); setForeground(target.getForeground()); setFont(target.getFont()); setBounds(target.getBounds()); setEnabled(target.isEnabled()); - setVisible(target.isVisible()); } private static void resetColorsAndFont(final Container c) { @@ -314,15 +312,18 @@ return stateLock; } - // Synchronize all operations with the Swing delegates under - // AWT tree lock, using a new separate lock to synchronize - // access to delegates may lead deadlocks + /** + * Synchronize all operations with the Swing delegates under AWT tree lock, + * using a new separate lock to synchronize access to delegates may lead + * deadlocks. Think of it as a 'virtual EDT'. + * + * @return DelegateLock + */ final Object getDelegateLock() { - //return delegateTreeLock; return getTarget().getTreeLock(); } - protected final static Object getPeerTreeLock() { + protected static final Object getPeerTreeLock() { return peerTreeLock; } @@ -758,14 +759,17 @@ } @Override - public void setVisible(boolean v) { + public void setVisible(final boolean v) { synchronized (getStateLock()) { if (visible == v) { return; } visible = v; } + setVisibleImpl(v); + } + protected void setVisibleImpl(final boolean v) { final D delegate = getDelegate(); if (delegate != null) { @@ -1355,7 +1359,7 @@ * * @see #isVisible() */ - protected boolean isShowing() { + protected final boolean isShowing() { synchronized (getPeerTreeLock()) { if (isVisible()) { final LWContainerPeer container = getContainerPeer(); diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/LWLabelPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWLabelPeer.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/LWLabelPeer.java Tue Jul 03 20:56:24 2012 -0700 @@ -60,8 +60,8 @@ } @Override - public void initialize() { - super.initialize(); + void initializeImpl() { + super.initializeImpl(); setText(getTarget().getText()); setAlignment(getTarget().getAlignment()); } diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/LWListPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWListPeer.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/LWListPeer.java Tue Jul 03 20:56:24 2012 -0700 @@ -49,8 +49,8 @@ } @Override - public void initialize() { - super.initialize(); + void initializeImpl() { + super.initializeImpl(); setMultipleMode(getTarget().isMultipleMode()); final int[] selectedIndices = getTarget().getSelectedIndexes(); synchronized (getDelegateLock()) { diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/LWScrollBarPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWScrollBarPeer.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/LWScrollBarPeer.java Tue Jul 03 20:56:24 2012 -0700 @@ -54,8 +54,8 @@ } @Override - public void initialize() { - super.initialize(); + void initializeImpl() { + super.initializeImpl(); final Scrollbar target = getTarget(); setValues(target.getValue(), target.getVisibleAmount(), target.getMinimum(), target.getMaximum()); diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/LWScrollPanePeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWScrollPanePeer.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/LWScrollPanePeer.java Tue Jul 03 20:56:24 2012 -0700 @@ -70,8 +70,8 @@ } @Override - public void initialize() { - super.initialize(); + void initializeImpl() { + super.initializeImpl(); final int policy = getTarget().getScrollbarDisplayPolicy(); synchronized (getDelegateLock()) { getDelegate().getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE); diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/LWTextAreaPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWTextAreaPeer.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/LWTextAreaPeer.java Tue Jul 03 20:56:24 2012 -0700 @@ -59,8 +59,8 @@ } @Override - public void initialize() { - super.initialize(); + void initializeImpl() { + super.initializeImpl(); final int visibility = getTarget().getScrollbarVisibility(); synchronized (getDelegateLock()) { setScrollBarVisibility(visibility); diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/LWTextComponentPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWTextComponentPeer.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/LWTextComponentPeer.java Tue Jul 03 20:56:24 2012 -0700 @@ -63,8 +63,8 @@ } @Override - public void initialize() { - super.initialize(); + void initializeImpl() { + super.initializeImpl(); synchronized (getDelegateLock()) { // This listener should be added before setText(). getTextComponent().getDocument().addDocumentListener(this); diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/LWTextFieldPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWTextFieldPeer.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/LWTextFieldPeer.java Tue Jul 03 20:56:24 2012 -0700 @@ -58,8 +58,8 @@ } @Override - public void initialize() { - super.initialize(); + void initializeImpl() { + super.initializeImpl(); setEchoChar(getTarget().getEchoChar()); synchronized (getDelegateLock()) { getDelegate().addActionListener(this); diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java --- a/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Tue Jul 03 20:56:24 2012 -0700 @@ -145,8 +145,6 @@ // similar to what Apple's Java do. // Since JDK7 we should rely on setOpacity() only. // this.opacity = c.getAlpha(); - // System.out.println("Delegate assigns alpha (we ignore setOpacity()):" - // +this.opacity); } if (!target.isForegroundSet()) { @@ -159,23 +157,29 @@ } @Override - public void initialize() { + void initializeImpl() { + super.initializeImpl(); if (getTarget() instanceof Frame) { - setTitle(((Frame)getTarget()).getTitle()); - setState(((Frame)getTarget()).getExtendedState()); + setTitle(((Frame) getTarget()).getTitle()); + setState(((Frame) getTarget()).getExtendedState()); } else if (getTarget() instanceof Dialog) { - setTitle(((Dialog)getTarget()).getTitle()); + setTitle(((Dialog) getTarget()).getTitle()); } setAlwaysOnTop(getTarget().isAlwaysOnTop()); updateMinimumSize(); - setOpacity(getTarget().getOpacity()); + final float opacity = getTarget().getOpacity(); + if (opacity < 1.0f) { + setOpacity(opacity); + } + setOpaque(getTarget().isOpaque()); - super.initialize(); - updateInsets(platformWindow.getInsets()); + if (getSurfaceData() == null) { + replaceSurfaceData(); + } } // Just a helper method @@ -213,50 +217,29 @@ } @Override - public void setVisible(final boolean visible) { - if (getSurfaceData() == null) { - replaceSurfaceData(); - } - - if (isVisible() == visible) { - return; - } - super.setVisible(visible); - + protected void setVisibleImpl(final boolean visible) { + super.setVisibleImpl(visible); // TODO: update graphicsConfig, see 4868278 - // TODO: don't notify the delegate if our visibility is unchanged + platformWindow.setVisible(visible); + if (isSimpleWindow()) { + LWKeyboardFocusManagerPeer manager = LWKeyboardFocusManagerPeer. + getInstance(getAppContext()); - // it is important to call this method on EDT - // to prevent the deadlocks during the painting of the lightweight delegates - //TODO: WHY? This is a native-system related call. Perhaps NOT calling - // the painting procedure right from the setVisible(), but rather relying - // on the native Expose event (or, scheduling the repainting asynchronously) - // is better? - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - platformWindow.setVisible(visible); - if (isSimpleWindow()) { - LWKeyboardFocusManagerPeer manager = LWKeyboardFocusManagerPeer. - getInstance(getAppContext()); - - if (visible) { - if (!getTarget().isAutoRequestFocus()) { - return; - } else { - requestWindowFocus(CausedFocusEvent.Cause.ACTIVATION); - } - // Focus the owner in case this window is focused. - } else if (manager.getCurrentFocusedWindow() == getTarget()) { - // Transfer focus to the owner. - LWWindowPeer owner = getOwnerFrameDialog(LWWindowPeer.this); - if (owner != null) { - owner.requestWindowFocus(CausedFocusEvent.Cause.ACTIVATION); - } - } + if (visible) { + if (!getTarget().isAutoRequestFocus()) { + return; + } else { + requestWindowFocus(CausedFocusEvent.Cause.ACTIVATION); + } + // Focus the owner in case this window is focused. + } else if (manager.getCurrentFocusedWindow() == getTarget()) { + // Transfer focus to the owner. + LWWindowPeer owner = getOwnerFrameDialog(LWWindowPeer.this); + if (owner != null) { + owner.requestWindowFocus(CausedFocusEvent.Cause.ACTIVATION); } } - }); + } } @Override @@ -983,6 +966,9 @@ try { Rectangle r = getBounds(); g.setColor(getBackground()); + if (g instanceof Graphics2D) { + ((Graphics2D) g).setComposite(AlphaComposite.Src); + } g.fillRect(0, 0, r.width, r.height); if (oldBB != null) { // Draw the old back buffer to the new one diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Tue Jul 03 20:56:24 2012 -0700 @@ -56,7 +56,6 @@ private static native void nativePushNSWindowToBack(long nsWindowPtr); private static native void nativePushNSWindowToFront(long nsWindowPtr); private static native void nativeSetNSWindowTitle(long nsWindowPtr, String title); - private static native void nativeSetNSWindowAlpha(long nsWindowPtr, float alpha); private static native void nativeRevalidateNSWindowShadow(long nsWindowPtr); private static native void nativeSetNSWindowMinimizedIcon(long nsWindowPtr, long nsImage); private static native void nativeSetNSWindowRepresentedFilename(long nsWindowPtr, String representedFilename); @@ -244,17 +243,6 @@ // TODO: implement on top of JObjC bridged class // NSWindow window = JObjC.getInstance().AppKit().NSWindow().getInstance(nativeWindowPtr, JObjCRuntime.getInstance()); - // Since JDK7 we have standard way to set opacity, so we should not pick - // background's alpha. - // TODO: set appropriate opacity value - // this.opacity = target.getOpacity(); - // this.setOpacity(this.opacity); - - final float windowAlpha = target.getOpacity(); - if (windowAlpha != 1.0f) { - nativeSetNSWindowAlpha(nativeWindowPtr, windowAlpha); - } - if (target instanceof javax.swing.RootPaneContainer) { final javax.swing.JRootPane rootpane = ((javax.swing.RootPaneContainer)target).getRootPane(); if (rootpane != null) rootpane.addPropertyChangeListener("ancestor", new PropertyChangeListener() { @@ -419,15 +407,9 @@ if (owner != null) { CWrapper.NSWindow.removeChildWindow(owner.getNSWindowPtr(), getNSWindowPtr()); } - // Make sure window is ordered out before it is disposed, we could order it out right here or - // we could postpone the disposal, I think postponing is probably better. - EventQueue.invokeLater(new Runnable() { - public void run() { - contentView.dispose(); - nativeDispose(getNSWindowPtr()); - CPlatformWindow.super.dispose(); - } - }); + contentView.dispose(); + nativeDispose(getNSWindowPtr()); + CPlatformWindow.super.dispose(); } @Override // PlatformWindow diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java --- a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Tue Jul 03 20:56:24 2012 -0700 @@ -216,7 +216,6 @@ @Override public SystemTrayPeer createSystemTray(SystemTray target) { SystemTrayPeer peer = new CSystemTray(); - targetCreatedPeer(target, peer); return peer; } diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/macosx/native/sun/awt/AWTWindow.m --- a/jdk/src/macosx/native/sun/awt/AWTWindow.m Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/macosx/native/sun/awt/AWTWindow.m Tue Jul 03 20:56:24 2012 -0700 @@ -934,27 +934,6 @@ /* * Class: sun_lwawt_macosx_CPlatformWindow - * Method: nativeSetNSWindowAlpha - * Signature: (JF)V - */ -JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeSetNSWindowAlpha -(JNIEnv *env, jclass clazz, jlong windowPtr, jfloat alpha) -{ -JNF_COCOA_ENTER(env); -AWT_ASSERT_NOT_APPKIT_THREAD; - - NSWindow *nsWindow = OBJC(windowPtr); - [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ - AWT_ASSERT_APPKIT_THREAD; - - [nsWindow setAlphaValue:alpha]; - }]; - -JNF_COCOA_EXIT(env); -} - -/* - * Class: sun_lwawt_macosx_CPlatformWindow * Method: nativeRevalidateNSWindowShadow * Signature: (J)V */ diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKLookAndFeel.java Tue Jul 03 20:56:24 2012 -0700 @@ -796,9 +796,10 @@ "Menu.margin", zeroInsets, "Menu.cancelMode", "hideMenuTree", "Menu.alignAcceleratorText", Boolean.FALSE, + "Menu.useMenuBarForTopLevelMenus", Boolean.TRUE, - "MenuBar.windowBindings", new Object[] { + "MenuBar.windowBindings", new Object[] { "F10", "takeFocus" }, "MenuBar.font", new FontLazyValue(Region.MENU_BAR), diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKStyleFactory.java --- a/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKStyleFactory.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/GTKStyleFactory.java Tue Jul 03 20:56:24 2012 -0700 @@ -92,7 +92,13 @@ boolean defaultCapable = btn.isDefaultCapable(); key = new ComplexKey(wt, toolButton, defaultCapable); } + } else if (id == Region.MENU) { + if (c instanceof JMenu && ((JMenu) c).isTopLevelMenu() && + UIManager.getBoolean("Menu.useMenuBarForTopLevelMenus")) { + wt = WidgetType.MENU_BAR; + } } + if (key == null) { // Otherwise, just use the WidgetType as the key. key = wt; diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java --- a/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/share/classes/javax/swing/plaf/synth/SynthMenuUI.java Tue Jul 03 20:56:24 2012 -0700 @@ -299,7 +299,8 @@ */ @Override public void propertyChange(PropertyChangeEvent e) { - if (SynthLookAndFeel.shouldUpdateStyle(e)) { + if (SynthLookAndFeel.shouldUpdateStyle(e) || + (e.getPropertyName().equals("ancestor") && UIManager.getBoolean("Menu.useMenuBarForTopLevelMenus"))) { updateStyle((JMenu)e.getSource()); } } diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/windows/native/sun/windows/awt_Component.cpp --- a/jdk/src/windows/native/sun/windows/awt_Component.cpp Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp Tue Jul 03 20:56:24 2012 -0700 @@ -1474,9 +1474,7 @@ ::GetClientRect( GetHWnd(), &r ); mr = WmSize(static_cast(wParam), r.right - r.left, r.bottom - r.top); //mr = WmSize(wParam, LOWORD(lParam), HIWORD(lParam)); - if (ImmGetContext() != NULL) { - SetCompositionWindow(r); - } + SetCompositionWindow(r); break; } case WM_SIZING: @@ -1535,7 +1533,10 @@ // When the window is deactivated, send WM_IME_ENDCOMPOSITION // message to deactivate the composition window so that // it won't receive keyboard input focus. - if (ImmGetContext() != NULL) { + HIMC hIMC; + HWND hwnd = ImmGetHWnd(); + if ((hIMC = ImmGetContext(hwnd)) != NULL) { + ImmReleaseContext(hwnd, hIMC); DefWindowProc(WM_IME_ENDCOMPOSITION, 0, 0); } } @@ -1718,11 +1719,9 @@ case WM_IME_SETCONTEXT: // lParam is passed as pointer and it can be modified. mr = WmImeSetContext(static_cast(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(); @@ -3723,12 +3722,14 @@ // support IME Composition messages void AwtComponent::SetCompositionWindow(RECT& r) { - HIMC hIMC = ImmGetContext(); + HWND hwnd = ImmGetHWnd(); + HIMC hIMC = ImmGetContext(hwnd); if (hIMC == NULL) { return; } COMPOSITIONFORM cf = {CFS_DEFAULT, {0, 0}, {0, 0, 0, 0}}; ImmSetCompositionWindow(hIMC, &cf); + ImmReleaseContext(hwnd, hIMC); } void AwtComponent::OpenCandidateWindow(int x, int y) @@ -3742,16 +3743,16 @@ SetCandidateWindow(iCandType, x-rc.left, y-rc.top); } if (m_bitsCandType != 0) { - HWND proxy = GetProxyFocusOwner(); // REMIND: is there any chance GetProxyFocusOwner() returns NULL here? - ::DefWindowProc((proxy != NULL) ? proxy : GetHWnd(), + ::DefWindowProc(ImmGetHWnd(), WM_IME_NOTIFY, IMN_OPENCANDIDATE, m_bitsCandType); } } void AwtComponent::SetCandidateWindow(int iCandType, int x, int y) { - HIMC hIMC = ImmGetContext(); + HWND hwnd = ImmGetHWnd(); + HIMC hIMC = ImmGetContext(hwnd); CANDIDATEFORM cf; cf.dwIndex = iCandType; cf.dwStyle = CFS_CANDIDATEPOS; @@ -3759,17 +3760,20 @@ cf.ptCurrentPos.y = y; ImmSetCandidateWindow(hIMC, &cf); + ImmReleaseContext(hwnd, hIMC); } MsgRouting AwtComponent::WmImeSetContext(BOOL fSet, LPARAM *lplParam) { // If the Windows input context is disabled, do not let Windows // display any UIs. - HIMC hIMC = ImmGetContext(); + HWND hwnd = ImmGetHWnd(); + HIMC hIMC = ImmGetContext(hwnd); if (hIMC == NULL) { *lplParam = 0; return mrDoDefault; } + ImmReleaseContext(hwnd, hIMC); if (fSet) { LPARAM lParam = *lplParam; @@ -3824,11 +3828,13 @@ AwtInputTextInfor* textInfor = NULL; try { - HIMC hIMC = ImmGetContext(); + HWND hwnd = ImmGetHWnd(); + HIMC hIMC = ImmGetContext(hwnd); DASSERT(hIMC!=0); textInfor = new AwtInputTextInfor; textInfor->GetContextData(hIMC, flags); + ImmReleaseContext(hwnd, hIMC); jstring jtextString = textInfor->GetText(); /* The conditions to send the input method event to AWT EDT are: @@ -4012,16 +4018,15 @@ DASSERT(!safe_ExceptionOccurred(env)); } -HIMC AwtComponent::ImmGetContext() +HWND AwtComponent::ImmGetHWnd() { HWND proxy = GetProxyFocusOwner(); - return ::ImmGetContext((proxy != NULL) ? proxy : GetHWnd()); + return (proxy != NULL) ? proxy : GetHWnd(); } HIMC AwtComponent::ImmAssociateContext(HIMC himc) { - HWND proxy = GetProxyFocusOwner(); - return ::ImmAssociateContext((proxy != NULL) ? proxy : GetHWnd(), himc); + return ::ImmAssociateContext(ImmGetHWnd(), himc); } HWND AwtComponent::GetProxyFocusOwner() diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/windows/native/sun/windows/awt_Component.h --- a/jdk/src/windows/native/sun/windows/awt_Component.h Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/windows/native/sun/windows/awt_Component.h Tue Jul 03 20:56:24 2012 -0700 @@ -464,7 +464,7 @@ int caretPos, int visiblePos); void InquireCandidatePosition(); INLINE LPARAM GetCandidateType() { return m_bitsCandType; } - HIMC ImmGetContext(); + HWND ImmGetHWnd(); HIMC ImmAssociateContext(HIMC himc); HWND GetProxyFocusOwner(); diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/windows/native/sun/windows/awt_FileDialog.cpp --- a/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/windows/native/sun/windows/awt_FileDialog.cpp Tue Jul 03 20:56:24 2012 -0700 @@ -156,6 +156,7 @@ HIMC hIMC = ::ImmGetContext(hdlg); if (hIMC != NULL) { ::ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL, 0); + ::ImmReleaseContext(hdlg, hIMC); } WNDPROC lpfnWndProc = (WNDPROC)(::GetProp(parent, NativeDialogWndProcProp)); diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/windows/native/sun/windows/awt_Frame.cpp --- a/jdk/src/windows/native/sun/windows/awt_Frame.cpp Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/windows/native/sun/windows/awt_Frame.cpp Tue Jul 03 20:56:24 2012 -0700 @@ -319,8 +319,6 @@ case WM_IME_STARTCOMPOSITION: case WM_IME_ENDCOMPOSITION: case WM_IME_COMPOSITION: - case WM_IME_SETCONTEXT: - case WM_IME_NOTIFY: case WM_IME_CONTROL: case WM_IME_COMPOSITIONFULL: case WM_IME_SELECT: diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/src/windows/native/sun/windows/awt_TextComponent.cpp --- a/jdk/src/windows/native/sun/windows/awt_TextComponent.cpp Tue Jul 03 20:54:45 2012 -0700 +++ b/jdk/src/windows/native/sun/windows/awt_TextComponent.cpp Tue Jul 03 20:56:24 2012 -0700 @@ -336,7 +336,8 @@ //im --- override to over the spot composition void AwtTextComponent::SetCompositionWindow(RECT& rc) { - HIMC hIMC = ImmGetContext(); + HWND hwnd = ImmGetHWnd(); + HIMC hIMC = ImmGetContext(hwnd); // rc is not used for text component. COMPOSITIONFORM cf = { CFS_FORCE_POSITION, {0,0}, {0,0,0,0} }; GetCaretPos(&(cf.ptCurrentPos)); @@ -348,6 +349,7 @@ LOGFONT lf; GetObject(m_hFont, sizeof(LOGFONT), &lf); ImmSetCompositionFont(hIMC, &lf); + ImmReleaseContext(hwnd, hIMC); } //im --- end diff -r 49a600ad8d1e -r 578ac31dc2f9 jdk/test/java/awt/Frame/7024749/bug7024749.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Frame/7024749/bug7024749.java Tue Jul 03 20:56:24 2012 -0700 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7024749 + * @summary JDK7 b131---a crash in: Java_sun_awt_windows_ThemeReader_isGetThemeTransitionDurationDefined+0x75 + * @library ../../../regtesthelpers + * @build Util + * @author Oleg Pekhovskiy: area=awt.toplevel + @run main bug7024749 + */ + +import java.awt.*; +import test.java.awt.regtesthelpers.Util; + +public class bug7024749 { + public static void main(String[] args) { + final Frame f = new Frame("F"); + f.setBounds(0,0,200,200); + f.setEnabled(false); // <- disable the top-level + f.setVisible(true); + + Window w = new Window(f); + w.setBounds(300,300,300,300); + w.add(new TextField(20)); + w.setVisible(true); + + Robot robot = Util.createRobot(); + robot.setAutoDelay(1000); + Util.waitForIdle(robot); + robot.delay(1000); + Util.clickOnTitle(f, robot); + Util.waitForIdle(robot); + + f.dispose(); + System.out.println("Test passed!"); + } +}