This commit is contained in:
Yuri Nesterenko 2009-09-09 00:48:59 -07:00
commit 0767c39799
9 changed files with 91 additions and 30 deletions

View file

@ -6665,6 +6665,9 @@ public abstract class Component implements ImageObserver, MenuContainer,
Container parent = this.parent; Container parent = this.parent;
if (parent != null && parent.peer instanceof LightweightPeer) { if (parent != null && parent.peer instanceof LightweightPeer) {
relocateComponent(); relocateComponent();
if (!isRecursivelyVisible()) {
peer.setVisible(false);
}
} }
} }
invalidate(); invalidate();
@ -9572,6 +9575,13 @@ public abstract class Component implements ImageObserver, MenuContainer,
return comp.getPeer(); return comp.getPeer();
} }
} }
// traversing the hierarchy up to the closest HW container;
// further traversing may return a component that is not actually
// a native sibling of this component and this kind of z-order
// request may not be allowed by the underlying system (6852051).
if (!cont.isLightweight()) {
break;
}
indexAbove = cont.getSiblingIndexAbove(); indexAbove = cont.getSiblingIndexAbove();
cont = cont.getContainer(); cont = cont.getContainer();

View file

@ -71,8 +71,8 @@ public abstract class XErrorHandler {
return super.handleError(display, err); return super.handleError(display, err);
} }
// Shared instance // Shared instance
private static IgnoreBadWindowHandler theInstance = new IgnoreBadWindowHandler(); private static VerifyChangePropertyHandler theInstance = new VerifyChangePropertyHandler();
public static IgnoreBadWindowHandler getInstance() { public static VerifyChangePropertyHandler getInstance() {
return theInstance; return theInstance;
} }
} }

View file

@ -354,6 +354,7 @@ public class XKeysym {
keysym2UCSHash.put( (long)0xFFB7, (char)0x0037); // XK_KP_7 --> DIGIT SEVEN keysym2UCSHash.put( (long)0xFFB7, (char)0x0037); // XK_KP_7 --> DIGIT SEVEN
keysym2UCSHash.put( (long)0xFFB8, (char)0x0038); // XK_KP_8 --> DIGIT EIGHT keysym2UCSHash.put( (long)0xFFB8, (char)0x0038); // XK_KP_8 --> DIGIT EIGHT
keysym2UCSHash.put( (long)0xFFB9, (char)0x0039); // XK_KP_9 --> DIGIT NINE keysym2UCSHash.put( (long)0xFFB9, (char)0x0039); // XK_KP_9 --> DIGIT NINE
keysym2UCSHash.put( (long)0xFE20, (char)0x0009); // XK_ISO_Left_Tab --> <control>
keysym2UCSHash.put( (long)0x1a1, (char)0x0104); // XK_Aogonek --> LATIN CAPITAL LETTER A WITH OGONEK keysym2UCSHash.put( (long)0x1a1, (char)0x0104); // XK_Aogonek --> LATIN CAPITAL LETTER A WITH OGONEK
keysym2UCSHash.put( (long)0x1a2, (char)0x02d8); // XK_breve --> BREVE keysym2UCSHash.put( (long)0x1a2, (char)0x02d8); // XK_breve --> BREVE
keysym2UCSHash.put( (long)0x1a3, (char)0x0141); // XK_Lstroke --> LATIN CAPITAL LETTER L WITH STROKE keysym2UCSHash.put( (long)0x1a3, (char)0x0141); // XK_Lstroke --> LATIN CAPITAL LETTER L WITH STROKE

View file

@ -166,6 +166,9 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
} }
public static void RESTORE_XERROR_HANDLER() { public static void RESTORE_XERROR_HANDLER() {
// wait until all requests are processed by the X server
// and only then uninstall the error handler
XSync();
current_error_handler = null; current_error_handler = null;
} }

View file

@ -649,7 +649,7 @@ SOFTWARE.
0x0000 #define XK_ISO_Last_Group 0xFE0E 0x0000 #define XK_ISO_Last_Group 0xFE0E
0x0000 #define XK_ISO_Last_Group_Lock 0xFE0F 0x0000 #define XK_ISO_Last_Group_Lock 0xFE0F
0x0000 #define XK_ISO_Left_Tab 0xFE20 0x0009 #define XK_ISO_Left_Tab 0xFE20
0x0000 #define XK_ISO_Move_Line_Up 0xFE21 0x0000 #define XK_ISO_Move_Line_Up 0xFE21
0x0000 #define XK_ISO_Move_Line_Down 0xFE22 0x0000 #define XK_ISO_Move_Line_Down 0xFE22
0x0000 #define XK_ISO_Partial_Line_Up 0xFE23 0x0000 #define XK_ISO_Partial_Line_Up 0xFE23

View file

@ -364,6 +364,7 @@ void AwtDialog::Show()
if (locationByPlatform) { if (locationByPlatform) {
moveToDefaultLocation(); moveToDefaultLocation();
} }
EnableTranslucency(TRUE);
if (IsFocusableWindow() && (IsAutoRequestFocus() || IsFocusedWindowModalBlocker())) { if (IsFocusableWindow() && (IsAutoRequestFocus() || IsFocusedWindowModalBlocker())) {
::ShowWindow(GetHWnd(), SW_SHOW); ::ShowWindow(GetHWnd(), SW_SHOW);
} else { } else {

View file

@ -690,6 +690,8 @@ AwtFrame::Show()
if (locationByPlatform) { if (locationByPlatform) {
moveToDefaultLocation(); moveToDefaultLocation();
} }
EnableTranslucency(TRUE);
BOOL autoRequestFocus = IsAutoRequestFocus(); BOOL autoRequestFocus = IsAutoRequestFocus();
if (m_iconic) { if (m_iconic) {

View file

@ -218,12 +218,7 @@ AwtWindow::~AwtWindow()
if (warningString != NULL) { if (warningString != NULL) {
delete [] warningString; delete [] warningString;
} }
::EnterCriticalSection(&contentBitmapCS); DeleteContentBitmap();
if (hContentBitmap != NULL) {
::DeleteObject(hContentBitmap);
hContentBitmap = NULL;
}
::LeaveCriticalSection(&contentBitmapCS);
::DeleteCriticalSection(&contentBitmapCS); ::DeleteCriticalSection(&contentBitmapCS);
} }
@ -372,6 +367,10 @@ MsgRouting AwtWindow::WmWindowPosChanged(LPARAM windowPos) {
} }
} }
if (wp->flags & SWP_HIDEWINDOW) {
EnableTranslucency(FALSE);
}
return mrDoDefault; return mrDoDefault;
} }
@ -1130,6 +1129,8 @@ void AwtWindow::Show()
moveToDefaultLocation(); moveToDefaultLocation();
} }
EnableTranslucency(TRUE);
// The following block exists to support Menu/Tooltip animation for // The following block exists to support Menu/Tooltip animation for
// Swing programs in a way which avoids introducing any new public api into // Swing programs in a way which avoids introducing any new public api into
// AWT or Swing. // AWT or Swing.
@ -2494,27 +2495,73 @@ void AwtWindow::RedrawWindow()
} }
} }
void AwtWindow::SetTranslucency(BYTE opacity, BOOL opaque) // Deletes the hContentBitmap if it is non-null
void AwtWindow::DeleteContentBitmap()
{ {
BYTE old_opacity = getOpacity(); ::EnterCriticalSection(&contentBitmapCS);
BOOL old_opaque = isOpaque(); if (hContentBitmap != NULL) {
::DeleteObject(hContentBitmap);
hContentBitmap = NULL;
}
::LeaveCriticalSection(&contentBitmapCS);
}
// The effects are enabled only upon showing the window.
// See 6780496 for details.
void AwtWindow::EnableTranslucency(BOOL enable)
{
if (enable) {
SetTranslucency(getOpacity(), isOpaque(), FALSE, TRUE);
} else {
SetTranslucency(0xFF, TRUE, FALSE);
}
}
/**
* Sets the translucency effects.
*
* This method is used to:
*
* 1. Apply the translucency effects upon showing the window
* (setValues == FALSE, useDefaultForOldValues == TRUE);
* 2. Turn off the effects upon hiding the window
* (setValues == FALSE, useDefaultForOldValues == FALSE);
* 3. Set the effects per user's request
* (setValues == TRUE, useDefaultForOldValues == FALSE);
*
* In case #3 the effects may or may not be applied immediately depending on
* the current visibility status of the window.
*
* The setValues argument indicates if we need to preserve the passed values
* in local fields for further use.
* The useDefaultForOldValues argument indicates whether we should consider
* the window as if it has not any effects applied at the moment.
*/
void AwtWindow::SetTranslucency(BYTE opacity, BOOL opaque, BOOL setValues,
BOOL useDefaultForOldValues)
{
BYTE old_opacity = useDefaultForOldValues ? 0xFF : getOpacity();
BOOL old_opaque = useDefaultForOldValues ? TRUE : isOpaque();
if (opacity == old_opacity && opaque == old_opaque) { if (opacity == old_opacity && opaque == old_opaque) {
return; return;
} }
setOpacity(opacity); if (setValues) {
setOpaque(opaque); m_opacity = opacity;
m_opaque = opaque;
}
// If we're invisible and are storing the values, return
// Otherwise, apply the effects immediately
if (!IsVisible() && setValues) {
return;
}
HWND hwnd = GetHWnd(); HWND hwnd = GetHWnd();
if (opaque != old_opaque) { if (opaque != old_opaque) {
::EnterCriticalSection(&contentBitmapCS); DeleteContentBitmap();
if (hContentBitmap != NULL) {
::DeleteObject(hContentBitmap);
hContentBitmap = NULL;
}
::LeaveCriticalSection(&contentBitmapCS);
} }
if (opaque && opacity == 0xff) { if (opaque && opacity == 0xff) {
@ -2634,9 +2681,7 @@ void AwtWindow::UpdateWindow(JNIEnv* env, jintArray data, int width, int height,
} }
::EnterCriticalSection(&contentBitmapCS); ::EnterCriticalSection(&contentBitmapCS);
if (hContentBitmap != NULL) { DeleteContentBitmap();
::DeleteObject(hContentBitmap);
}
hContentBitmap = hBitmap; hContentBitmap = hBitmap;
contentWidth = width; contentWidth = width;
contentHeight = height; contentHeight = height;

View file

@ -262,32 +262,29 @@ private:
// from its hierarchy when shown. Currently applied to instances of // from its hierarchy when shown. Currently applied to instances of
// javax/swing/Popup$HeavyWeightWindow class. // javax/swing/Popup$HeavyWeightWindow class.
// SetTranslucency() is the setter for the following two fields
BYTE m_opacity; // The opacity level. == 0xff by default (when opacity mode is disabled) BYTE m_opacity; // The opacity level. == 0xff by default (when opacity mode is disabled)
BOOL m_opaque; // Whether the window uses the perpixel translucency (false), or not (true). BOOL m_opaque; // Whether the window uses the perpixel translucency (false), or not (true).
inline BYTE getOpacity() { inline BYTE getOpacity() {
return m_opacity; return m_opacity;
} }
inline void setOpacity(BYTE opacity) {
m_opacity = opacity;
}
inline BOOL isOpaque() { inline BOOL isOpaque() {
return m_opaque; return m_opaque;
} }
inline void setOpaque(BOOL opaque) {
m_opaque = opaque;
}
CRITICAL_SECTION contentBitmapCS; CRITICAL_SECTION contentBitmapCS;
HBITMAP hContentBitmap; HBITMAP hContentBitmap;
UINT contentWidth; UINT contentWidth;
UINT contentHeight; UINT contentHeight;
void SetTranslucency(BYTE opacity, BOOL opaque); void SetTranslucency(BYTE opacity, BOOL opaque, BOOL setValues = TRUE,
BOOL useDefaultForOldValues = FALSE);
void UpdateWindow(int width, int height, HBITMAP hBitmap); void UpdateWindow(int width, int height, HBITMAP hBitmap);
void UpdateWindowImpl(int width, int height, HBITMAP hBitmap); void UpdateWindowImpl(int width, int height, HBITMAP hBitmap);
void RedrawWindow(); void RedrawWindow();
void DeleteContentBitmap();
static UINT untrustedWindowsCounter; static UINT untrustedWindowsCounter;
@ -352,6 +349,8 @@ protected:
UINT currentWmSizeState; UINT currentWmSizeState;
void EnableTranslucency(BOOL enable);
private: private:
int m_screenNum; int m_screenNum;