--- 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);
--- 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());
--- 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<String> combo = getDelegate();
synchronized (getDelegateLock()) {
--- 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();
--- 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());
}
--- 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()) {
--- 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());
--- 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);
--- 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);
--- 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);
--- 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);
--- 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
--- 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
--- 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;
}
--- 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
*/
--- 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),
--- 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;
--- 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());
}
}
--- 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<UINT>(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<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();
@@ -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()
--- 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();
--- 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));
--- 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:
--- 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
--- /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!");
+ }
+}