This commit is contained in:
Lana Steuck 2009-04-13 22:34:29 -07:00
commit 9769fa9e3b
184 changed files with 13646 additions and 3543 deletions

View File

@ -71,6 +71,7 @@ STUBFILES = \
$(STUBDIR)/Ole2.h \
$(STUBDIR)/Zmouse.h \
$(STUBDIR)/cderr.h \
$(STUBDIR)/commctrl.h \
$(STUBDIR)/commdlg.h \
$(STUBDIR)/direct.h \
$(STUBDIR)/d3dcom.h \

View File

@ -1,5 +1,5 @@
#
# Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
# Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -104,7 +104,8 @@ FILES_c = \
OGLVertexCache.c \
WGLGraphicsConfig.c \
WGLSurfaceData.c \
AccelGlyphCache.c
AccelGlyphCache.c \
rect.c
FILES_cpp = \
CmdIDList.cpp \
@ -199,5 +200,6 @@ FILES_cpp = \
ShellFolder2.cpp \
ThemeReader.cpp \
ComCtl32Util.cpp \
DllUtil.cpp \
initIDs.cpp \
MouseInfo.cpp

View File

@ -1,5 +1,5 @@
#
# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
# Copyright 2000-2009 Sun Microsystems, Inc. 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
@ -107,7 +107,8 @@ FILES_export = \
sun/java2d/x11/X11Renderer.java \
sun/java2d/x11/X11SurfaceData.java \
com/sun/java/swing/plaf/gtk/GTKEngine.java \
com/sun/java/swing/plaf/gtk/GTKStyle.java
com/sun/java/swing/plaf/gtk/GTKStyle.java \
sun/awt/ExtendedKeyCodes.java
FILES_export2 = \

View File

@ -1,5 +1,5 @@
#
# Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
# Copyright 2000-2009 Sun Microsystems, Inc. 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
@ -214,6 +214,7 @@ FILES_export3 = \
sun/awt/windows/WBufferStrategy.java \
sun/awt/windows/WTrayIconPeer.java \
sun/awt/image/ImagingLib.java \
sun/awt/ExtendedKeyCodes.java \
sun/java2d/pipe/hw/AccelSurface.java \
sun/java2d/pipe/hw/AccelDeviceEventNotifier.java \
sun/java2d/pipe/hw/ContextCapabilities.java \

View File

@ -1,5 +1,5 @@
#
# Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
# Copyright 1995-2009 Sun Microsystems, Inc. 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
@ -219,6 +219,7 @@ vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/image/cvutils
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/shell
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/medialib
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/debug
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/utility
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/loops
vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/pipe

View File

@ -6,11 +6,9 @@ runtime, it will probably work with other versions of that compiler.
Included in this project is a generated file, make.depend, which lists
all interdependencies of the source files. This file is generated *on
Solaris* with the following commands:
Solaris or Linux* with the following command:
% sccs edit make.depend
% gnumake -f Depend.mak
% sccs delget make.depend
This step only needs to be run when new files are added to the project,
or include statements are changed.

File diff suppressed because one or more lines are too long

View File

@ -291,6 +291,7 @@ SUNWprivate_1.1 {
Java_sun_awt_X11GraphicsConfig_createBackBuffer;
Java_sun_awt_X11GraphicsConfig_destroyBackBuffer;
Java_sun_awt_X11GraphicsConfig_swapBuffers;
Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable;
Java_sun_awt_X11GraphicsDevice_isDBESupported;
Java_sun_awt_X11GraphicsDevice_getDisplay;
Java_sun_awt_X11GraphicsDevice_getDoubleBufferVisuals;

View File

@ -407,6 +407,7 @@ SUNWprivate_1.1 {
Java_sun_awt_X11GraphicsConfig_getNumColors;
Java_sun_awt_X11GraphicsConfig_getXResolution;
Java_sun_awt_X11GraphicsConfig_getYResolution;
Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable;
Java_sun_awt_X11GraphicsDevice_isDBESupported;
Java_sun_awt_X11GraphicsDevice_getDisplay;
Java_sun_awt_X11GraphicsDevice_getDoubleBufferVisuals;

View File

@ -78,4 +78,5 @@ FILES_c = \
awt_Plugin.c \
gtk2_interface.c \
swing_GTKEngine.c \
swing_GTKStyle.c
swing_GTKStyle.c \
rect.c

View File

@ -79,6 +79,7 @@ vpath %.c $(SHARE_SRC)/native/sun/java2d
vpath %.c $(SHARE_SRC)/native/sun/java2d/loops
vpath %.c $(SHARE_SRC)/native/sun/java2d/pipe
vpath %.c $(SHARE_SRC)/native/sun/awt/medialib
vpath %.c $(SHARE_SRC)/native/sun/awt/utility
vpath %.cpp $(SHARE_SRC)/native/sun/image
vpath %.c $(SHARE_SRC)/native/sun/font
vpath %.c $(PLATFORM_SRC)/native/sun/awt/robot_child
@ -274,6 +275,23 @@ ICONS = \
$(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon32.png \
$(ICONS_PATH_PREFIX)/classes/sun/awt/X11/java-icon48.png
ICONPATH=$(PLATFORM_SRC)/classes/sun/awt/X11
ICONS += \
$(ICONPATH)/security-icon-bw16.png \
$(ICONPATH)/security-icon-interim16.png \
$(ICONPATH)/security-icon-yellow16.png \
$(ICONPATH)/security-icon-bw24.png \
$(ICONPATH)/security-icon-interim24.png \
$(ICONPATH)/security-icon-yellow24.png \
$(ICONPATH)/security-icon-bw32.png \
$(ICONPATH)/security-icon-interim32.png \
$(ICONPATH)/security-icon-yellow32.png \
$(ICONPATH)/security-icon-bw48.png \
$(ICONPATH)/security-icon-interim48.png \
$(ICONPATH)/security-icon-yellow48.png
TEMPDIR_CLASSES = $(TEMPDIR)/classes
$(TEMPDIR_CLASSES)/sun/awt/X11/ToBin.class: ToBin.java

View File

@ -1,5 +1,5 @@
#
# Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
# Copyright 2002-2009 Sun Microsystems, Inc. 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
@ -93,6 +93,9 @@ SUNWprivate_1.1 {
Java_sun_awt_X11_XlibWrapper_XGetWMHints;
Java_sun_awt_X11_XlibWrapper_XShapeQueryExtension;
Java_sun_awt_X11_XlibWrapper_SetRectangularShape;
Java_sun_awt_X11_XlibWrapper_SetBitmapShape;
Java_sun_awt_X11_XlibWrapper_XConfigureWindow;
Java_sun_awt_X11_XlibWrapper_SetZOrder;
Java_sun_awt_X11_XToolkit_initIDs;
Java_sun_awt_X11_XWindow_getNativeColor;
Java_sun_awt_X11_XWindow_getWMInsets;
@ -217,6 +220,7 @@ SUNWprivate_1.1 {
Java_sun_awt_X11GraphicsConfig_createBackBuffer;
Java_sun_awt_X11GraphicsConfig_destroyBackBuffer;
Java_sun_awt_X11GraphicsConfig_swapBuffers;
Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable;
Java_java_awt_Insets_initIDs;
Java_java_awt_KeyboardFocusManager_initIDs;
Java_java_awt_Font_initIDs;
@ -290,6 +294,16 @@ SUNWprivate_1.1 {
Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym;
Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode;
Java_sun_awt_X11_XlibWrapper_XQueryKeymap;
Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup;
Java_sun_awt_X11_XlibWrapper_XkbSelectEvents;
Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails;
Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym;
Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion;
Java_sun_awt_X11_XlibWrapper_XkbQueryExtension;
Java_sun_awt_X11_XlibWrapper_XkbGetMap;
Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap;
Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard;
Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode;
Java_sun_awt_X11_XlibWrapper_XGetModifierMapping;
Java_sun_awt_X11_XlibWrapper_XFreeModifiermap;
Java_sun_awt_X11_XlibWrapper_XChangeActivePointerGrab;

View File

@ -1,5 +1,5 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2008-2009 Sun Microsystems, Inc. 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
@ -26,17 +26,37 @@
package com.sun.awt;
import java.awt.*;
import sun.awt.AWTAccessor;
import sun.awt.AWTAccessor;
import sun.awt.SunToolkit;
/**
* A collection of utility methods for AWT.
*
* The functionality provided by the static methods of the class includes:
* <ul>
* <li>Setting shapes on top-level windows
* <li>Setting a constant alpha value for each pixel of a top-level window
* <li>Making a window non-opaque, after that it paints only explicitly
* painted pixels on the screen, with arbitrary alpha values for every pixel.
* <li>Setting a 'mixing-cutout' shape for a component.
* </ul>
* <p>
* A "top-level window" is an instance of the {@code Window} class (or its
* descendant, such as {@code JFrame}).
* <p>
* Some of the mentioned features may not be supported by the native platform.
* To determine whether a particular feature is supported, the user must use
* the {@code isTranslucencySupported()} method of the class passing a desired
* translucency kind (a member of the {@code Translucency} enum) as an
* argument.
* <p>
* The per-pixel alpha feature also requires the user to create her/his
* windows using a translucency-capable graphics configuration.
* The {@code isTranslucencyCapable()} method must
* be used to verify whether any given GraphicsConfiguration supports
* the trasnlcency effects.
* <p>
* <b>WARNING</b>: This class is an implementation detail and only meant
* for limited use outside of the core platform. This API may change
* drastically between update release, and it may even be
@ -50,6 +70,344 @@ public final class AWTUtilities {
private AWTUtilities() {
}
/** Kinds of translucency supported by the underlying system.
* @see #isTranslucencySupported
*/
public static enum Translucency {
/**
* Represents support in the underlying system for windows each pixel
* of which is guaranteed to be either completely opaque, with
* an alpha value of 1.0, or completely transparent, with an alpha
* value of 0.0.
*/
PERPIXEL_TRANSPARENT,
/**
* Represents support in the underlying system for windows all of
* the pixels of which have the same alpha value between or including
* 0.0 and 1.0.
*/
TRANSLUCENT,
/**
* Represents support in the underlying system for windows that
* contain or might contain pixels with arbitrary alpha values
* between and including 0.0 and 1.0.
*/
PERPIXEL_TRANSLUCENT;
}
/**
* Returns whether the given level of translucency is supported by
* the underlying system.
*
* Note that this method may sometimes return the value
* indicating that the particular level is supported, but
* the native windowing system may still not support the
* given level of translucency (due to the bugs in
* the windowing system).
*
* @param translucencyKind a kind of translucency support
* (either PERPIXEL_TRANSPARENT,
* TRANSLUCENT, or PERPIXEL_TRANSLUCENT)
* @return whether the given translucency kind is supported
*/
public static boolean isTranslucencySupported(Translucency translucencyKind) {
switch (translucencyKind) {
case PERPIXEL_TRANSPARENT:
return isWindowShapingSupported();
case TRANSLUCENT:
return isWindowOpacitySupported();
case PERPIXEL_TRANSLUCENT:
return isWindowTranslucencySupported();
}
return false;
}
/**
* Returns whether the windowing system supports changing the opacity
* value of top-level windows.
* Note that this method may sometimes return true, but the native
* windowing system may still not support the concept of
* translucency (due to the bugs in the windowing system).
*/
private static boolean isWindowOpacitySupported() {
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
return ((SunToolkit)curToolkit).isWindowOpacitySupported();
}
/**
* Set the opacity of the window. The opacity is at the range [0..1].
* Note that setting the opacity level of 0 may or may not disable
* the mouse event handling on this window. This is
* a platform-dependent behavior.
*
* In order for this method to enable the translucency effect,
* the isTranslucencySupported() method should indicate that the
* TRANSLUCENT level of translucency is supported.
*
* <p>Also note that the window must not be in the full-screen mode
* when setting the opacity value &lt; 1.0f. Otherwise
* the IllegalArgumentException is thrown.
*
* @param window the window to set the opacity level to
* @param opacity the opacity level to set to the window
* @throws NullPointerException if the window argument is null
* @throws IllegalArgumentException if the opacity is out of
* the range [0..1]
* @throws IllegalArgumentException if the window is in full screen mode,
* and the opacity is less than 1.0f
* @throws UnsupportedOperationException if the TRANSLUCENT translucency
* kind is not supported
*/
public static void setWindowOpacity(Window window, float opacity) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
AWTAccessor.getWindowAccessor().setOpacity(window, opacity);
}
/**
* Get the opacity of the window. If the opacity has not
* yet being set, this method returns 1.0.
*
* @param window the window to get the opacity level from
* @throws NullPointerException if the window argument is null
*/
public static float getWindowOpacity(Window window) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
return AWTAccessor.getWindowAccessor().getOpacity(window);
}
/**
* Returns whether the windowing system supports changing the shape
* of top-level windows.
* Note that this method may sometimes return true, but the native
* windowing system may still not support the concept of
* shaping (due to the bugs in the windowing system).
*/
public static boolean isWindowShapingSupported() {
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
return ((SunToolkit)curToolkit).isWindowShapingSupported();
}
/**
* Returns an object that implements the Shape interface and represents
* the shape previously set with the call to the setWindowShape() method.
* If no shape has been set yet, or the shape has been reset to null,
* this method returns null.
*
* @param window the window to get the shape from
* @return the current shape of the window
* @throws NullPointerException if the window argument is null
*/
public static Shape getWindowShape(Window window) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
return AWTAccessor.getWindowAccessor().getShape(window);
}
/**
* Sets a shape for the given window.
* If the shape argument is null, this methods restores
* the default shape making the window rectangular.
* <p>Note that in order to set a shape, the window must be undecorated.
* If the window is decorated, this method ignores the {@code shape}
* argument and resets the shape to null.
* <p>Also note that the window must not be in the full-screen mode
* when setting a non-null shape. Otherwise the IllegalArgumentException
* is thrown.
* <p>Depending on the platform, the method may return without
* effecting the shape of the window if the window has a non-null warning
* string ({@link Window#getWarningString()}). In this case the passed
* shape object is ignored.
*
* @param window the window to set the shape to
* @param shape the shape to set to the window
* @throws NullPointerException if the window argument is null
* @throws IllegalArgumentException if the window is in full screen mode,
* and the shape is not null
* @throws UnsupportedOperationException if the PERPIXEL_TRANSPARENT
* translucency kind is not supported
*/
public static void setWindowShape(Window window, Shape shape) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
AWTAccessor.getWindowAccessor().setShape(window, shape);
}
private static boolean isWindowTranslucencySupported() {
/*
* Per-pixel alpha is supported if all the conditions are TRUE:
* 1. The toolkit is a sort of SunToolkit
* 2. The toolkit supports translucency in general
* (isWindowTranslucencySupported())
* 3. There's at least one translucency-capable
* GraphicsConfiguration
*/
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
if (!((SunToolkit)curToolkit).isWindowTranslucencySupported()) {
return false;
}
GraphicsEnvironment env =
GraphicsEnvironment.getLocalGraphicsEnvironment();
// If the default GC supports translucency return true.
// It is important to optimize the verification this way,
// see CR 6661196 for more details.
if (isTranslucencyCapable(env.getDefaultScreenDevice()
.getDefaultConfiguration()))
{
return true;
}
// ... otherwise iterate through all the GCs.
GraphicsDevice[] devices = env.getScreenDevices();
for (int i = 0; i < devices.length; i++) {
GraphicsConfiguration[] configs = devices[i].getConfigurations();
for (int j = 0; j < configs.length; j++) {
if (isTranslucencyCapable(configs[j])) {
return true;
}
}
}
return false;
}
/**
* Enables the per-pixel alpha support for the given window.
* Once the window becomes non-opaque (the isOpaque is set to false),
* the drawing sub-system is starting to respect the alpha value of each
* separate pixel. If a pixel gets painted with alpha color component
* equal to zero, it becomes visually transparent, if the alpha of the
* pixel is equal to 255, the pixel is fully opaque. Interim values
* of the alpha color component make the pixel semi-transparent (i.e.
* translucent).
* <p>Note that in order for the window to support the per-pixel alpha
* mode, the window must be created using the GraphicsConfiguration
* for which the {@link #isTranslucencyCapable}
* method returns true.
* <p>Also note that some native systems enable the per-pixel translucency
* mode for any window created using the translucency-compatible
* graphics configuration. However, it is highly recommended to always
* invoke the setWindowOpaque() method for these windows, at least for
* the sake of cross-platform compatibility reasons.
* <p>Also note that the window must not be in the full-screen mode
* when making it non-opaque. Otherwise the IllegalArgumentException
* is thrown.
* <p>If the window is a {@code Frame} or a {@code Dialog}, the window must
* be undecorated prior to enabling the per-pixel translucency effect (see
* {@link Frame#setUndecorated()} and/or {@link Dialog#setUndecorated()}).
* If the window becomes decorated through a subsequent call to the
* corresponding {@code setUndecorated()} method, the per-pixel
* translucency effect will be disabled and the opaque property reset to
* {@code true}.
* <p>Depending on the platform, the method may return without
* effecting the opaque property of the window if the window has a non-null
* warning string ({@link Window#getWarningString()}). In this case
* the passed 'isOpaque' value is ignored.
*
* @param window the window to set the shape to
* @param isOpaque whether the window must be opaque (true),
* or translucent (false)
* @throws NullPointerException if the window argument is null
* @throws IllegalArgumentException if the window uses
* a GraphicsConfiguration for which the
* {@code isTranslucencyCapable()}
* method returns false
* @throws IllegalArgumentException if the window is in full screen mode,
* and the isOpaque is false
* @throws IllegalArgumentException if the window is decorated and the
* isOpaque argument is {@code false}.
* @throws UnsupportedOperationException if the PERPIXEL_TRANSLUCENT
* translucency kind is not supported
*/
public static void setWindowOpaque(Window window, boolean isOpaque) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
if (!isOpaque && !isTranslucencySupported(Translucency.PERPIXEL_TRANSLUCENT)) {
throw new UnsupportedOperationException(
"The PERPIXEL_TRANSLUCENT translucency kind is not supported");
}
AWTAccessor.getWindowAccessor().setOpaque(window, isOpaque);
}
/**
* Returns whether the window is opaque or translucent.
*
* @param window the window to set the shape to
* @return whether the window is currently opaque (true)
* or translucent (false)
* @throws NullPointerException if the window argument is null
*/
public static boolean isWindowOpaque(Window window) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
return AWTAccessor.getWindowAccessor().isOpaque(window);
}
/**
* Verifies whether a given GraphicsConfiguration supports
* the PERPIXEL_TRANSLUCENT kind of translucency.
* All windows that are intended to be used with the {@link #setWindowOpaque}
* method must be created using a GraphicsConfiguration for which this method
* returns true.
* <p>Note that some native systems enable the per-pixel translucency
* mode for any window created using a translucency-capable
* graphics configuration. However, it is highly recommended to always
* invoke the setWindowOpaque() method for these windows, at least
* for the sake of cross-platform compatibility reasons.
*
* @param gc GraphicsConfiguration
* @throws NullPointerException if the gc argument is null
* @return whether the given GraphicsConfiguration supports
* the translucency effects.
*/
public static boolean isTranslucencyCapable(GraphicsConfiguration gc) {
if (gc == null) {
throw new NullPointerException("The gc argument should not be null");
}
/*
return gc.isTranslucencyCapable();
*/
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
return ((SunToolkit)curToolkit).isTranslucencyCapable(gc);
}
/**
* Sets a 'mixing-cutout' shape for the given component.
*

View File

@ -0,0 +1,169 @@
/*
* Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.awt;
import java.awt.*;
import java.awt.geom.*;
import sun.awt.AWTAccessor;
/**
* Security Warning control interface.
*
* This class provides a couple of methods that help a developer relocate
* the AWT security warning to an appropriate position relative to the current
* window size. A "top-level window" is an instance of the {@code Window}
* class (or its descendant, such as {@code JFrame}). The security warning
* is applied to all windows created by an untrusted code. All such windows
* have a non-null "warning string" (see {@link Window#getWarningString()}).
* <p>
* <b>WARNING</b>: This class is an implementation detail and only meant
* for limited use outside of the core platform. This API may change
* drastically between update release, and it may even be
* removed or be moved to some other packages or classes.
*/
public final class SecurityWarning {
/**
* The SecurityWarning class should not be instantiated
*/
private SecurityWarning() {
}
/**
* Gets the size of the security warning.
*
* The returned value is not valid until the peer has been created. Before
* invoking this method a developer must call the {@link Window#pack()},
* {@link Window#setVisible()}, or some other method that creates the peer.
*
* @param window the window to get the security warning size for
*
* @throws NullPointerException if the window argument is null
* @throws IllegalArgumentException if the window is trusted (i.e.
* the {@code getWarningString()} returns null)
*/
public static Dimension getSize(Window window) {
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
if (window.getWarningString() == null) {
throw new IllegalArgumentException(
"The window must have a non-null warning string.");
}
// We don't check for a non-null peer since it may be destroyed
// after assigning a valid value to the security warning size.
return AWTAccessor.getWindowAccessor().getSecurityWarningSize(window);
}
/**
* Sets the position of the security warning.
* <p>
* The {@code alignmentX} and {@code alignmentY} arguments specify the
* origin of the coordinate system used to calculate the position of the
* security warning. The values must be in the range [0.0f...1.0f]. The
* {@code 0.0f} value represents the left (top) edge of the rectangular
* bounds of the window. The {@code 1.0f} value represents the right
* (bottom) edge of the bounds. Whenever the size of the window changes,
* the origin of the coordinate system gets relocated accordingly. For
* convenience a developer may use the {@code Component.*_ALIGNMENT}
* constants to pass predefined values for these arguments.
* <p>
* The {@code point} argument specifies the location of the security
* warning in the coordinate system described above. If both {@code x} and
* {@code y} coordinates of the point are equal to zero, the warning will
* be located right in the origin of the coordinate system. On the other
* hand, if both {@code alignmentX} and {@code alignmentY} are equal to
* zero (i.e. the origin of the coordinate system is placed at the top-left
* corner of the window), then the {@code point} argument represents the
* absolute location of the security warning relative to the location of
* the window. The "absolute" in this case means that the position of the
* security warning is not effected by resizing of the window.
* <p>
* Note that the security warning managment code guarantees that:
* <ul>
* <li>The security warning cannot be located farther than two pixels from
* the rectangular bounds of the window (see {@link Window#getBounds}), and
* <li>The security warning is always visible on the screen.
* </ul>
* If either of the conditions is violated, the calculated position of the
* security warning is adjusted by the system to meet both these
* conditions.
* <p>
* The default position of the security warning is in the upper-right
* corner of the window, two pixels to the right from the right edge. This
* corresponds to the following arguments passed to this method:
* <ul>
* <li>{@code alignmentX = Component.RIGHT_ALIGNMENT}
* <li>{@code alignmentY = Component.TOP_ALIGNMENT}
* <li>{@code point = (2, 0)}
* </ul>
*
* @param window the window to set the position of the security warning for
* @param alignmentX the horizontal origin of the coordinate system
* @param alignmentY the vertical origin of the coordinate system
* @param point the position of the security warning in the specified
* coordinate system
*
* @throws NullPointerException if the window argument is null
* @throws NullPointerException if the point argument is null
* @throws IllegalArgumentException if the window is trusted (i.e.
* the {@code getWarningString()} returns null
* @throws IllegalArgumentException if the alignmentX or alignmentY
* arguments are not within the range [0.0f ... 1.0f]
*/
public static void setPosition(Window window, Point2D point,
float alignmentX, float alignmentY)
{
if (window == null) {
throw new NullPointerException(
"The window argument should not be null.");
}
if (window.getWarningString() == null) {
throw new IllegalArgumentException(
"The window must have a non-null warning string.");
}
if (point == null) {
throw new NullPointerException(
"The point argument must not be null");
}
if (alignmentX < 0.0f || alignmentX > 1.0f) {
throw new IllegalArgumentException(
"alignmentX must be in the range [0.0f ... 1.0f].");
}
if (alignmentY < 0.0f || alignmentY > 1.0f) {
throw new IllegalArgumentException(
"alignmentY must be in the range [0.0f ... 1.0f].");
}
AWTAccessor.getWindowAccessor().setSecurityWarningPosition(window,
point, alignmentX, alignmentY);
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2000-2009 Sun Microsystems, Inc. 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
@ -329,6 +329,9 @@ public class AWTKeyStroke implements Serializable {
* <li><code>java.awt.event.KeyEvent.VK_TAB</code>
* <li><code>java.awt.event.KeyEvent.VK_SPACE</code>
* </ul>
* Alternatively, the key code may be obtained by calling
* <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>.
*
* The modifiers consist of any combination of:<ul>
* <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK
* <li>java.awt.event.InputEvent.CTRL_DOWN_MASK

View File

@ -25,6 +25,7 @@
package java.awt;
import java.awt.image.BufferStrategy;
import java.awt.peer.CanvasPeer;
import javax.accessibility.*;
/**
@ -65,7 +66,17 @@ public class Canvas extends Component implements Accessible {
*/
public Canvas(GraphicsConfiguration config) {
this();
graphicsConfig = config;
setGraphicsConfiguration(config);
}
@Override
void setGraphicsConfiguration(GraphicsConfiguration gc) {
CanvasPeer peer = (CanvasPeer)getPeer();
if (peer != null) {
gc = peer.getAppropriateGraphicsConfiguration(gc);
}
super.setGraphicsConfiguration(gc);
}
/**

View File

@ -1,5 +1,5 @@
/*
* Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1995-2009 Sun Microsystems, Inc. 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
@ -300,7 +300,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
* @see GraphicsConfiguration
* @see #getGraphicsConfiguration
*/
transient GraphicsConfiguration graphicsConfig = null;
private transient GraphicsConfiguration graphicsConfig = null;
/**
* A reference to a <code>BufferStrategy</code> object
@ -799,8 +799,24 @@ public abstract class Component implements ImageObserver, MenuContainer,
}
}
// Whether this Component has had the background erase flag
// specified via SunToolkit.disableBackgroundErase(). This is
// needed in order to make this function work on X11 platforms,
// where currently there is no chance to interpose on the creation
// of the peer and therefore the call to XSetBackground.
transient boolean backgroundEraseDisabled;
static {
AWTAccessor.setComponentAccessor(new AWTAccessor.ComponentAccessor() {
public void setBackgroundEraseDisabled(Component comp, boolean disabled) {
comp.backgroundEraseDisabled = disabled;
}
public boolean getBackgroundEraseDisabled(Component comp) {
return comp.backgroundEraseDisabled;
}
public Rectangle getBounds(Component comp) {
return new Rectangle(comp.x, comp.y, comp.width, comp.height);
}
public void setMixingCutoutShape(Component comp, Shape shape) {
Region region = shape == null ? null :
Region.getInstance(shape, null);
@ -829,6 +845,22 @@ public abstract class Component implements ImageObserver, MenuContainer,
}
}
}
public void setGraphicsConfiguration(Component comp,
GraphicsConfiguration gc)
{
comp.setGraphicsConfiguration(gc);
}
public boolean requestFocus(Component comp, CausedFocusEvent.Cause cause) {
return comp.requestFocus(cause);
}
public boolean canBeFocusOwner(Component comp) {
return comp.canBeFocusOwner();
}
public boolean isVisible_NoClientCode(Component comp) {
return comp.isVisible_NoClientCode();
}
});
}
@ -996,50 +1028,21 @@ public abstract class Component implements ImageObserver, MenuContainer,
*/
public GraphicsConfiguration getGraphicsConfiguration() {
synchronized(getTreeLock()) {
if (graphicsConfig != null) {
return graphicsConfig;
} else if (getParent() != null) {
return getParent().getGraphicsConfiguration();
} else {
return null;
}
return getGraphicsConfiguration_NoClientCode();
}
}
final GraphicsConfiguration getGraphicsConfiguration_NoClientCode() {
GraphicsConfiguration graphicsConfig = this.graphicsConfig;
Container parent = this.parent;
if (graphicsConfig != null) {
return graphicsConfig;
} else if (parent != null) {
return parent.getGraphicsConfiguration_NoClientCode();
} else {
return null;
}
}
/**
* Resets this <code>Component</code>'s
* <code>GraphicsConfiguration</code> back to a default
* value. For most componenets, this is <code>null</code>.
* Called from the Toolkit thread, so NO CLIENT CODE.
*/
void resetGC() {
void setGraphicsConfiguration(GraphicsConfiguration gc) {
synchronized(getTreeLock()) {
graphicsConfig = null;
}
}
graphicsConfig = gc;
/*
* Not called on Component, but needed for Canvas and Window
*/
void setGCFromPeer() {
synchronized(getTreeLock()) {
if (peer != null) { // can't imagine how this will be false,
// but just in case
graphicsConfig = peer.getGraphicsConfiguration();
} else {
graphicsConfig = null;
ComponentPeer peer = getPeer();
if (peer != null) {
peer.updateGraphicsData(gc);
}
}
}
@ -6663,23 +6666,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
// Update stacking order
if (parent != null && parent.peer != null) {
ContainerPeer parentContPeer = (ContainerPeer) parent.peer;
// if our parent is lightweight and we are not
// we should call restack on nearest heavyweight
// container.
if (parentContPeer instanceof LightweightPeer
&& ! (peer instanceof LightweightPeer))
{
Container hwParent = getNativeContainer();
if (hwParent != null && hwParent.peer != null) {
parentContPeer = (ContainerPeer) hwParent.peer;
}
}
if (parentContPeer.isRestackSupported()) {
parentContPeer.restack();
}
}
peer.setZOrder(getHWPeerAboveMe());
if (!isAddNotifyComplete) {
mixOnShowing();
@ -7170,8 +7157,8 @@ public abstract class Component implements ImageObserver, MenuContainer,
requestFocusHelper(false, true);
}
void requestFocus(CausedFocusEvent.Cause cause) {
requestFocusHelper(false, true, cause);
boolean requestFocus(CausedFocusEvent.Cause cause) {
return requestFocusHelper(false, true, cause);
}
/**
@ -7456,7 +7443,7 @@ public abstract class Component implements ImageObserver, MenuContainer,
// sometimes most recent focus owner may be null, but focus owner is not
// e.g. we reset most recent focus owner if user removes focus owner
focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
if (focusOwner != null && getContainingWindow(focusOwner) != window) {
if (focusOwner != null && focusOwner.getContainingWindow() != window) {
focusOwner = null;
}
}
@ -8689,30 +8676,8 @@ public abstract class Component implements ImageObserver, MenuContainer,
* null, if component is not a part of window hierarchy
*/
Window getContainingWindow() {
return getContainingWindow(this);
return SunToolkit.getContainingWindow(this);
}
/**
* Returns the <code>Window</code> ancestor of the component <code>comp</code>.
* @return Window ancestor of the component or component by itself if it is Window;
* null, if component is not a part of window hierarchy
*/
static Window getContainingWindow(Component comp) {
while (comp != null && !(comp instanceof Window)) {
comp = comp.getParent();
}
return (Window)comp;
}
/**
* Initialize JNI field and method IDs
@ -9575,6 +9540,27 @@ public abstract class Component implements ImageObserver, MenuContainer,
return nextAbove < 0 ? -1 : nextAbove;
}
final ComponentPeer getHWPeerAboveMe() {
checkTreeLock();
Container cont = getContainer();
int indexAbove = getSiblingIndexAbove();
while (cont != null) {
for (int i = indexAbove; i > -1; i--) {
Component comp = cont.getComponent(i);
if (comp != null && comp.isDisplayable() && !comp.isLightweight()) {
return comp.getPeer();
}
}
indexAbove = cont.getSiblingIndexAbove();
cont = cont.getContainer();
}
return null;
}
final int getSiblingIndexBelow() {
checkTreeLock();
Container parent = getContainer();
@ -9827,4 +9813,29 @@ public abstract class Component implements ImageObserver, MenuContainer,
}
// ****************** END OF MIXING CODE ********************************
private static boolean doesClassImplement(Class cls, String interfaceName) {
if (cls == null) return false;
for (Class c : cls.getInterfaces()) {
if (c.getName().equals(interfaceName)) {
return true;
}
}
return doesClassImplement(cls.getSuperclass(), interfaceName);
}
/**
* Checks that the given object implements the given interface.
* @param obj Object to be checked
* @param interfaceName The name of the interface. Must be fully-qualified interface name.
* @return true, if this object implements the given interface,
* false, otherwise, or if obj or interfaceName is null
*/
static boolean doesImplement(Object obj, String interfaceName) {
if (obj == null) return false;
if (interfaceName == null) return false;
return doesClassImplement(obj.getClass(), interfaceName);
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1995-2009 Sun Microsystems, Inc. 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
@ -167,6 +167,9 @@ public class Container extends Component {
transient int listeningBoundsChildren;
transient int descendantsCount;
/* Non-opaque window support -- see Window.setLayersOpaque */
transient Color preserveBackgroundColor = null;
/**
* JDK 1.1 serialVersionUID
*/
@ -267,9 +270,13 @@ public class Container extends Component {
/**
* Gets the number of components in this panel.
* <p>
* Note: This method should be called under AWT tree lock.
*
* @return the number of components in this panel.
* @see #getComponent
* @since JDK1.1
* @see Component#getTreeLock()
*/
public int getComponentCount() {
return countComponents();
@ -281,43 +288,65 @@ public class Container extends Component {
*/
@Deprecated
public int countComponents() {
synchronized (getTreeLock()) {
// This method is not synchronized under AWT tree lock.
// Instead, the calling code is responsible for the
// synchronization. See 6784816 for details.
return component.size();
}
}
/**
* Gets the nth component in this container.
* <p>
* Note: This method should be called under AWT tree lock.
*
* @param n the index of the component to get.
* @return the n<sup>th</sup> component in this container.
* @exception ArrayIndexOutOfBoundsException
* if the n<sup>th</sup> value does not exist.
* @see Component#getTreeLock()
*/
public Component getComponent(int n) {
synchronized (getTreeLock()) {
if ((n < 0) || (n >= component.size())) {
throw new ArrayIndexOutOfBoundsException("No such child: " + n);
}
// This method is not synchronized under AWT tree lock.
// Instead, the calling code is responsible for the
// synchronization. See 6784816 for details.
try {
return component.get(n);
} catch (IndexOutOfBoundsException z) {
throw new ArrayIndexOutOfBoundsException("No such child: " + n);
}
}
/**
* Gets all the components in this container.
* <p>
* Note: This method should be called under AWT tree lock.
*
* @return an array of all the components in this container.
* @see Component#getTreeLock()
*/
public Component[] getComponents() {
// This method is not synchronized under AWT tree lock.
// Instead, the calling code is responsible for the
// synchronization. See 6784816 for details.
return getComponents_NoClientCode();
}
// NOTE: This method may be called by privileged threads.
// This functionality is implemented in a package-private method
// to insure that it cannot be overridden by client subclasses.
// DO NOT INVOKE CLIENT CODE ON THIS THREAD!
final Component[] getComponents_NoClientCode() {
synchronized (getTreeLock()) {
return component.toArray(EMPTY_ARRAY);
}
} // getComponents_NoClientCode()
/*
* Wrapper for getComponents() method with a proper synchronization.
*/
Component[] getComponentsSync() {
synchronized (getTreeLock()) {
return getComponents();
}
}
/**
* Determines the insets of this container, which indicate the size
@ -503,6 +532,9 @@ public class Container extends Component {
adjustDescendants(-(comp.countHierarchyMembers()));
comp.parent = null;
if (needRemoveNotify) {
comp.setGraphicsConfiguration(null);
}
component.remove(index);
invalidateIfValid();
@ -643,10 +675,7 @@ public class Container extends Component {
// each HW descendant independently.
return !comp.peer.isReparentSupported();
} else {
// if container didn't change we still might need to recreate component's window as
// changes to zorder should be reflected in native window stacking order and it might
// not be supported by the platform. This is important only for heavyweight child
return !((ContainerPeer)(newNativeContainer.peer)).isRestackSupported();
return false;
}
}
@ -786,6 +815,7 @@ public class Container extends Component {
component.add(index, comp);
}
comp.parent = this;
comp.setGraphicsConfiguration(getGraphicsConfiguration());
adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK,
comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK));
@ -802,11 +832,6 @@ public class Container extends Component {
if (peer != null) {
if (comp.peer == null) { // Remove notify was called or it didn't have peer - create new one
comp.addNotify();
// New created peer creates component on top of the stacking order
Container newNativeContainer = getHeavyweightContainer();
if (((ContainerPeer)newNativeContainer.getPeer()).isRestackSupported()) {
((ContainerPeer)newNativeContainer.getPeer()).restack();
}
} else { // Both container and child have peers, it means child peer should be reparented.
// In both cases we need to reparent native widgets.
Container newNativeContainer = getHeavyweightContainer();
@ -815,13 +840,8 @@ public class Container extends Component {
// Native container changed - need to reparent native widgets
newNativeContainer.reparentChild(comp);
}
// If component still has a peer and it is either container or heavyweight
// and restack is supported we have to restack native windows since order might have changed
if ((!comp.isLightweight() || (comp instanceof Container))
&& ((ContainerPeer)newNativeContainer.getPeer()).isRestackSupported())
{
((ContainerPeer)newNativeContainer.getPeer()).restack();
}
comp.peer.setZOrder(comp.getHWPeerAboveMe());
if (!comp.isLightweight() && isLightweight()) {
// If component is heavyweight and one of the containers is lightweight
// the location of the component should be fixed.
@ -1053,6 +1073,7 @@ public class Container extends Component {
component.add(index, comp);
}
comp.parent = this;
comp.setGraphicsConfiguration(thisGC);
adjustListeningChildren(AWTEvent.HIERARCHY_EVENT_MASK,
comp.numListening(AWTEvent.HIERARCHY_EVENT_MASK));
@ -1091,6 +1112,19 @@ public class Container extends Component {
}
}
@Override
void setGraphicsConfiguration(GraphicsConfiguration gc) {
synchronized (getTreeLock()) {
super.setGraphicsConfiguration(gc);
for (Component comp : component) {
if (comp != null) {
comp.setGraphicsConfiguration(gc);
}
}
}
}
/**
* Checks that all Components that this Container contains are on
* the same GraphicsDevice as this Container. If not, throws an
@ -1148,6 +1182,7 @@ public class Container extends Component {
comp.parent = null;
component.remove(index);
comp.setGraphicsConfiguration(null);
invalidateIfValid();
if (containerListener != null ||
@ -1224,6 +1259,7 @@ public class Container extends Component {
layoutMgr.removeLayoutComponent(comp);
}
comp.parent = null;
comp.setGraphicsConfiguration(null);
if (containerListener != null ||
(eventMask & AWTEvent.CONTAINER_EVENT_MASK) != 0 ||
Toolkit.enabledOnToolkit(AWTEvent.CONTAINER_EVENT_MASK)) {
@ -1339,7 +1375,7 @@ public class Container extends Component {
}
private int getListenersCount(int id, boolean enabledOnToolkit) {
assert Thread.holdsLock(getTreeLock());
checkTreeLock();
if (enabledOnToolkit) {
return descendantsCount;
}
@ -1357,7 +1393,7 @@ public class Container extends Component {
final int createHierarchyEvents(int id, Component changed,
Container changedParent, long changeFlags, boolean enabledOnToolkit)
{
assert Thread.holdsLock(getTreeLock());
checkTreeLock();
int listeners = getListenersCount(id, enabledOnToolkit);
for (int count = listeners, i = 0; count > 0; i++) {
@ -1372,7 +1408,7 @@ public class Container extends Component {
final void createChildHierarchyEvents(int id, long changeFlags,
boolean enabledOnToolkit)
{
assert Thread.holdsLock(getTreeLock());
checkTreeLock();
if (component.isEmpty()) {
return;
}
@ -1507,6 +1543,7 @@ public class Container extends Component {
* @see #validate
*/
protected void validateTree() {
checkTreeLock();
if (!isValid()) {
if (peer instanceof ContainerPeer) {
((ContainerPeer)peer).beginLayout();
@ -1783,7 +1820,7 @@ public class Container extends Component {
// super.paint(); -- Don't bother, since it's a NOP.
GraphicsCallback.PaintCallback.getInstance().
runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS);
runComponents(getComponentsSync(), g, GraphicsCallback.LIGHTWEIGHTS);
}
}
@ -1838,7 +1875,7 @@ public class Container extends Component {
}
GraphicsCallback.PrintCallback.getInstance().
runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS);
runComponents(getComponentsSync(), g, GraphicsCallback.LIGHTWEIGHTS);
}
}
@ -1851,7 +1888,7 @@ public class Container extends Component {
public void paintComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PaintAllCallback.getInstance().
runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.TWO_PASSES);
runComponents(getComponentsSync(), g, GraphicsCallback.TWO_PASSES);
}
}
@ -1873,8 +1910,8 @@ public class Container extends Component {
void paintHeavyweightComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PaintHeavyweightComponentsCallback.getInstance().
runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS |
GraphicsCallback.HEAVYWEIGHTS);
runComponents(getComponentsSync(), g,
GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS);
}
}
@ -1887,7 +1924,7 @@ public class Container extends Component {
public void printComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PrintAllCallback.getInstance().
runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.TWO_PASSES);
runComponents(getComponentsSync(), g, GraphicsCallback.TWO_PASSES);
}
}
@ -1909,8 +1946,8 @@ public class Container extends Component {
void printHeavyweightComponents(Graphics g) {
if (isShowing()) {
GraphicsCallback.PrintHeavyweightComponentsCallback.getInstance().
runComponents(component.toArray(EMPTY_ARRAY), g, GraphicsCallback.LIGHTWEIGHTS |
GraphicsCallback.HEAVYWEIGHTS);
runComponents(getComponentsSync(), g,
GraphicsCallback.LIGHTWEIGHTS | GraphicsCallback.HEAVYWEIGHTS);
}
}
@ -2460,10 +2497,8 @@ public class Container extends Component {
* @since 1.2
*/
public Component findComponentAt(int x, int y) {
synchronized (getTreeLock()) {
return findComponentAt(x, y, true);
}
}
/**
* Private version of findComponentAt which has a controllable
@ -2475,21 +2510,23 @@ public class Container extends Component {
* The addition of this feature is temporary, pending the
* adoption of new, public API which exports this feature.
*/
final Component findComponentAt(int x, int y, boolean ignoreEnabled)
{
final Component findComponentAt(int x, int y, boolean ignoreEnabled) {
synchronized (getTreeLock()) {
if (isRecursivelyVisible()){
return findComponentAtImpl(x, y, ignoreEnabled);
}
}
return null;
}
final Component findComponentAtImpl(int x, int y, boolean ignoreEnabled){
checkTreeLock();
if (!(contains(x, y) && visible && (ignoreEnabled || enabled))) {
return null;
}
// Two passes: see comment in sun.awt.SunGraphicsCallback
synchronized (getTreeLock()) {
for (int i = 0; i < component.size(); i++) {
Component comp = component.get(i);
if (comp != null &&
@ -2526,7 +2563,7 @@ public class Container extends Component {
}
}
}
}
return this;
}
@ -2584,13 +2621,6 @@ public class Container extends Component {
for (int i = 0; i < component.size(); i++) {
component.get(i).addNotify();
}
// Update stacking order if native platform allows
ContainerPeer cpeer = (ContainerPeer)peer;
if (cpeer.isRestackSupported()) {
cpeer.restack();
}
}
}
@ -3488,7 +3518,7 @@ public class Container extends Component {
private void writeObject(ObjectOutputStream s) throws IOException {
ObjectOutputStream.PutField f = s.putFields();
f.put("ncomponents", component.size());
f.put("component", component.toArray(EMPTY_ARRAY));
f.put("component", getComponentsSync());
f.put("layoutMgr", layoutMgr);
f.put("dispatcher", dispatcher);
f.put("maxSize", maxSize);

View File

@ -479,7 +479,7 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager {
// that a Component outside of the focused Window receives a
// FOCUS_GAINED event. We synthesize a WINDOW_GAINED_FOCUS
// event in that case.
final Window newFocusedWindow = Component.getContainingWindow(newFocusOwner);
final Window newFocusedWindow = SunToolkit.getContainingWindow(newFocusOwner);
final Window currentFocusedWindow = getGlobalFocusedWindow();
if (newFocusedWindow != null &&
newFocusedWindow != currentFocusedWindow)

View File

@ -1226,7 +1226,7 @@ public class Dialog extends Window {
synchronized (getTreeLock()) {
if (keepBlockingEDT) {
keepBlockingEDT = false;
PeerEvent wakingEvent = new PeerEvent(this, new WakingRunnable(), PeerEvent.PRIORITY_EVENT);
PeerEvent wakingEvent = new PeerEvent(getToolkit(), new WakingRunnable(), PeerEvent.PRIORITY_EVENT);
AppContext curAppContext = AppContext.getAppContext();
if (showAppContext != curAppContext) {
// Wake up event dispatch thread on which the dialog was

View File

@ -36,6 +36,7 @@ import java.io.ObjectInputStream;
import java.io.IOException;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
import sun.awt.AWTAccessor;
import java.lang.ref.WeakReference;
import javax.accessibility.*;
@ -738,11 +739,15 @@ public class Frame extends Window implements MenuContainer {
* @since 1.4
* @see java.awt.Window#addWindowStateListener
*/
public synchronized void setExtendedState(int state) {
public void setExtendedState(int state) {
if ( !isFrameStateSupported( state ) ) {
return;
}
synchronized (getObjectLock()) {
this.state = state;
}
// peer.setState must be called outside of object lock
// synchronization block to avoid possible deadlock
FramePeer peer = (FramePeer)this.peer;
if (peer != null) {
peer.setState(state);
@ -804,13 +809,28 @@ public class Frame extends Window implements MenuContainer {
* @see #setExtendedState(int)
* @since 1.4
*/
public synchronized int getExtendedState() {
FramePeer peer = (FramePeer)this.peer;
if (peer != null) {
state = peer.getState();
}
public int getExtendedState() {
synchronized (getObjectLock()) {
return state;
}
}
static {
AWTAccessor.setFrameAccessor(
new AWTAccessor.FrameAccessor() {
public void setExtendedState(Frame frame, int state) {
synchronized(frame.getObjectLock()) {
frame.state = state;
}
}
public int getExtendedState(Frame frame) {
synchronized(frame.getObjectLock()) {
return frame.state;
}
}
}
);
}
/**
* Sets the maximized bounds for this frame.
@ -967,7 +987,7 @@ public class Frame extends Window implements MenuContainer {
if (resizable) {
str += ",resizable";
}
getExtendedState(); // sync with peer
int state = getExtendedState();
if (state == NORMAL) {
str += ",normal";
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -434,4 +434,20 @@ public abstract class GraphicsConfiguration {
}
return defaultImageCaps;
}
/**
* Returns whether this GraphicsConfiguration supports
* the {@link GraphicsDevice.WindowTranslucency#PERPIXEL_TRANSLUCENT
* PERPIXEL_TRANSLUCENT} kind of translucency.
*
* @param gc GraphicsConfiguration
* @throws NullPointerException if the gc argument is null
* @return whether the given GraphicsConfiguration supports
* the translucency effects.
* @see Window#setBackground(Color)
*/
/*public */boolean isTranslucencyCapable() {
// Overridden in subclasses
return false;
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -27,7 +27,10 @@
package java.awt;
import java.awt.image.ColorModel;
import sun.awt.AWTAccessor;
import sun.awt.AppContext;
import sun.awt.SunToolkit;
/**
* The <code>GraphicsDevice</code> class describes the graphics devices
@ -109,6 +112,31 @@ public abstract class GraphicsDevice {
*/
public final static int TYPE_IMAGE_BUFFER = 2;
/** Kinds of translucency supported by the underlying system.
* @see #isTranslucencySupported
*/
/*public */static enum WindowTranslucency {
/**
* Represents support in the underlying system for windows each pixel
* of which is guaranteed to be either completely opaque, with
* an alpha value of 1.0, or completely transparent, with an alpha
* value of 0.0.
*/
PERPIXEL_TRANSPARENT,
/**
* Represents support in the underlying system for windows all of
* the pixels of which have the same alpha value between or including
* 0.0 and 1.0.
*/
TRANSLUCENT,
/**
* Represents support in the underlying system for windows that
* contain or might contain pixels with arbitrary alpha values
* between and including 0.0 and 1.0.
*/
PERPIXEL_TRANSLUCENT;
}
/**
* Returns the type of this <code>GraphicsDevice</code>.
* @return the type of this <code>GraphicsDevice</code>, which can
@ -235,6 +263,21 @@ public abstract class GraphicsDevice {
* @since 1.4
*/
public void setFullScreenWindow(Window w) {
if (w != null) {
//XXX: The actions should be documented in some non-update release.
/*
if (w.getShape() != null) {
w.setShape(w, null);
}
if (!w.isOpaque()) {
w.setOpaque(false);
}
if (w.getOpacity() < 1.0f) {
w.setOpacity(1.0f);
}
*/
}
if (fullScreenWindow != null && windowedModeBounds != null) {
// if the window went into fs mode before it was realized it may
// have (0,0) dimensions
@ -424,4 +467,94 @@ public abstract class GraphicsDevice {
public int getAvailableAcceleratedMemory() {
return -1;
}
/**
* Returns whether the given level of translucency is supported
* this graphics device.
*
* @param translucencyKind a kind of translucency support
* @return whether the given translucency kind is supported
*/
/*public */boolean isWindowTranslucencySupported(WindowTranslucency translucencyKind) {
switch (translucencyKind) {
case PERPIXEL_TRANSPARENT:
return isWindowShapingSupported();
case TRANSLUCENT:
return isWindowOpacitySupported();
case PERPIXEL_TRANSLUCENT:
return isWindowPerpixelTranslucencySupported();
}
return false;
}
/**
* Returns whether the windowing system supports changing the shape
* of top-level windows.
* Note that this method may sometimes return true, but the native
* windowing system may still not support the concept of
* shaping (due to the bugs in the windowing system).
*/
static boolean isWindowShapingSupported() {
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
return ((SunToolkit)curToolkit).isWindowShapingSupported();
}
/**
* Returns whether the windowing system supports changing the opacity
* value of top-level windows.
* Note that this method may sometimes return true, but the native
* windowing system may still not support the concept of
* translucency (due to the bugs in the windowing system).
*/
static boolean isWindowOpacitySupported() {
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
return ((SunToolkit)curToolkit).isWindowOpacitySupported();
}
boolean isWindowPerpixelTranslucencySupported() {
/*
* Per-pixel alpha is supported if all the conditions are TRUE:
* 1. The toolkit is a sort of SunToolkit
* 2. The toolkit supports translucency in general
* (isWindowTranslucencySupported())
* 3. There's at least one translucency-capable
* GraphicsConfiguration
*/
Toolkit curToolkit = Toolkit.getDefaultToolkit();
if (!(curToolkit instanceof SunToolkit)) {
return false;
}
if (!((SunToolkit)curToolkit).isWindowTranslucencySupported()) {
return false;
}
// TODO: cache translucency capable GC
return getTranslucencyCapableGC() != null;
}
GraphicsConfiguration getTranslucencyCapableGC() {
// If the default GC supports translucency return true.
// It is important to optimize the verification this way,
// see CR 6661196 for more details.
GraphicsConfiguration defaultGC = getDefaultConfiguration();
if (defaultGC.isTranslucencyCapable()) {
return defaultGC;
}
// ... otherwise iterate through all the GCs.
GraphicsConfiguration[] configs = getConfigurations();
for (int j = 0; j < configs.length; j++) {
if (configs[j].isTranslucencyCapable()) {
return configs[j];
}
}
return null;
}
}

View File

@ -61,6 +61,7 @@ import sun.awt.HeadlessToolkit;
import sun.awt.SunToolkit;
import sun.awt.CausedFocusEvent;
import sun.awt.KeyboardFocusManagerPeerProvider;
import sun.awt.AWTAccessor;
/**
* The KeyboardFocusManager is responsible for managing the active and focused
@ -118,6 +119,32 @@ public abstract class KeyboardFocusManager
if (!GraphicsEnvironment.isHeadless()) {
initIDs();
}
AWTAccessor.setKeyboardFocusManagerAccessor(
new AWTAccessor.KeyboardFocusManagerAccessor() {
public int shouldNativelyFocusHeavyweight(Component heavyweight,
Component descendant,
boolean temporary,
boolean focusedWindowChangeAllowed,
long time,
CausedFocusEvent.Cause cause)
{
return KeyboardFocusManager.shouldNativelyFocusHeavyweight(
heavyweight, descendant, temporary, focusedWindowChangeAllowed, time, cause);
}
public boolean processSynchronousLightweightTransfer(Component heavyweight,
Component descendant,
boolean temporary,
boolean focusedWindowChangeAllowed,
long time)
{
return KeyboardFocusManager.processSynchronousLightweightTransfer(
heavyweight, descendant, temporary, focusedWindowChangeAllowed, time);
}
public void removeLastFocusRequest(Component heavyweight) {
KeyboardFocusManager.removeLastFocusRequest(heavyweight);
}
}
);
}
transient KeyboardFocusManagerPeer peer;
@ -2208,7 +2235,7 @@ public abstract class KeyboardFocusManager
boolean temporary, boolean focusedWindowChangeAllowed,
long time)
{
Window parentWindow = Component.getContainingWindow(heavyweight);
Window parentWindow = SunToolkit.getContainingWindow(heavyweight);
if (parentWindow == null || !parentWindow.syncLWRequests) {
return false;
}
@ -2443,79 +2470,7 @@ public abstract class KeyboardFocusManager
}
}
}
static void heavyweightButtonDown(Component heavyweight, long time) {
heavyweightButtonDown(heavyweight, time, false);
}
static void heavyweightButtonDown(Component heavyweight, long time, boolean acceptDuplicates) {
if (log.isLoggable(Level.FINE)) {
if (heavyweight == null) {
log.log(Level.FINE, "Assertion (heavyweight != null) failed");
}
if (time == 0) {
log.log(Level.FINE, "Assertion (time != 0) failed");
}
}
KeyboardFocusManager manager = getCurrentKeyboardFocusManager(SunToolkit.targetToAppContext(heavyweight));
synchronized (heavyweightRequests) {
HeavyweightFocusRequest hwFocusRequest = getLastHWRequest();
Component currentNativeFocusOwner = (hwFocusRequest == null)
? manager.getNativeFocusOwner()
: hwFocusRequest.heavyweight;
// Behavior for all use cases:
// 1. Heavyweight leaf Components (e.g., Button, Checkbox, Choice,
// List, TextComponent, Canvas) that respond to button down.
//
// Native platform will generate a FOCUS_GAINED if and only if
// the Component is not the focus owner (or, will not be the
// focus owner when all outstanding focus requests are
// processed).
//
// 2. Panel with no descendants.
//
// Same as (1).
//
// 3. Panel with at least one heavyweight descendant.
//
// This function should NOT be called for this case!
//
// 4. Panel with only lightweight descendants.
//
// Native platform will generate a FOCUS_GAINED if and only if
// neither the Panel, nor any of its recursive, lightweight
// descendants, is the focus owner. However, we want a
// requestFocus() for any lightweight descendant to win out over
// the focus request for the Panel. To accomplish this, we
// differ from the algorithm for shouldNativelyFocusHeavyweight
// as follows:
// a. If the requestFocus() for a lightweight descendant has
// been fully handled by the time this function is invoked,
// then 'hwFocusRequest' will be null and 'heavyweight'
// will be the native focus owner. Do *not* synthesize a
// focus transfer to the Panel.
// b. If the requestFocus() for a lightweight descendant has
// been recorded, but not handled, then 'hwFocusRequest'
// will be non-null and 'hwFocusRequest.heavyweight' will
// equal 'heavyweight'. Do *not* append 'heavyweight' to
// hwFocusRequest.lightweightRequests.
// c. If the requestFocus() for a lightweight descendant is
// yet to be made, then post a new HeavyweightFocusRequest.
// If no lightweight descendant ever requests focus, then
// the Panel will get focus. If some descendant does, then
// the descendant will get focus by either a synthetic
// focus transfer, or a lightweightRequests focus transfer.
if (acceptDuplicates || heavyweight != currentNativeFocusOwner) {
getCurrentKeyboardFocusManager
(SunToolkit.targetToAppContext(heavyweight)).
enqueueKeyEvents(time, heavyweight);
heavyweightRequests.add
(new HeavyweightFocusRequest(heavyweight, heavyweight,
false, CausedFocusEvent.Cause.MOUSE_EVENT));
}
}
}
/**
* Returns the Window which will be active after processing this request,
* or null if this is a duplicate request. The active Window is useful
@ -2542,7 +2497,7 @@ public abstract class KeyboardFocusManager
(HeavyweightFocusRequest.CLEAR_GLOBAL_FOCUS_OWNER);
Component activeWindow = ((hwFocusRequest != null)
? Component.getContainingWindow(hwFocusRequest.heavyweight)
? SunToolkit.getContainingWindow(hwFocusRequest.heavyweight)
: nativeFocusedWindow);
while (activeWindow != null &&
!((activeWindow instanceof Frame) ||
@ -3013,8 +2968,8 @@ public abstract class KeyboardFocusManager
}
private static boolean focusedWindowChanged(Component to, Component from) {
Window wto = Component.getContainingWindow(to);
Window wfrom = Component.getContainingWindow(from);
Window wto = SunToolkit.getContainingWindow(to);
Window wfrom = SunToolkit.getContainingWindow(from);
if (wto == null && wfrom == null) {
return true;
}
@ -3028,8 +2983,8 @@ public abstract class KeyboardFocusManager
}
private static boolean isTemporary(Component to, Component from) {
Window wto = Component.getContainingWindow(to);
Window wfrom = Component.getContainingWindow(from);
Window wto = SunToolkit.getContainingWindow(to);
Window wfrom = SunToolkit.getContainingWindow(from);
if (wto == null && wfrom == null) {
return false;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1995-2009 Sun Microsystems, Inc. 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
@ -398,9 +398,11 @@ public class MenuItem extends MenuComponent implements Accessible {
boolean handleShortcut(KeyEvent e) {
MenuShortcut s = new MenuShortcut(e.getKeyCode(),
(e.getModifiers() & InputEvent.SHIFT_MASK) > 0);
MenuShortcut sE = new MenuShortcut(e.getExtendedKeyCode(),
(e.getModifiers() & InputEvent.SHIFT_MASK) > 0);
// Fix For 6185151: Menu shortcuts of all menuitems within a menu
// should be disabled when the menu itself is disabled
if (s.equals(shortcut) && isItemEnabled()) {
if ((s.equals(shortcut) || sE.equals(shortcut)) && isItemEnabled()) {
// MenuShortcut match -- issue an event on keydown.
if (e.getID() == KeyEvent.KEY_PRESSED) {
doMenuEvent(e.getWhen(), e.getModifiers());

View File

@ -1,5 +1,5 @@
/*
* Copyright 1996-2003 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1996-2009 Sun Microsystems, Inc. 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
@ -34,7 +34,21 @@ import java.awt.event.KeyEvent;
* For example, a menu shortcut for Ctrl-a (assuming that Control is
* the accelerator key) would be created with code like the following:
* <p>
* MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, false);
* <code>MenuShortcut ms = new MenuShortcut(KeyEvent.VK_A, false);</code>
* <p> or alternatively
* <p>
* <code>MenuShortcut ms = new MenuShortcut(KeyEvent.getExtendedKeyCodeForChar('A'), false);</code>
* <p>
* Menu shortcuts may also be constructed for a wider set of keycodes
* using the <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code> call.
* For example, a menu shortcut for "Ctrl+cyrillic ef" is created by
* <p>
* <code>MenuShortcut ms = new MenuShortcut(KeyEvent.getExtendedKeyCodeForChar('\u0444'), false);</code>
* <p>
* Note that shortcuts created with a keycode or an extended keycode defined as a constant in <code>KeyEvent</code>
* work regardless of the current keyboard layout. However, a shortcut made of
* an extended keycode not listed in <code>KeyEvent</code>
* only work if the current keyboard layout produces a corresponding letter.
* <p>
* The accelerator key is platform-dependent and may be obtained
* via {@link Toolkit#getMenuShortcutKeyMask}.

View File

@ -1,5 +1,5 @@
/*
* Copyright 1995-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1995-2009 Sun Microsystems, Inc. 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
@ -25,8 +25,10 @@
package java.awt;
import java.awt.event.*;
import java.awt.geom.Point2D;
import java.awt.im.InputContext;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.peer.ComponentPeer;
import java.awt.peer.WindowPeer;
import java.beans.PropertyChangeListener;
@ -49,6 +51,7 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.accessibility.*;
import sun.awt.AWTAccessor;
import sun.awt.AppContext;
import sun.awt.CausedFocusEvent;
import sun.awt.SunToolkit;
@ -291,6 +294,25 @@ public class Window extends Container implements Accessible {
*/
transient boolean isInShow = false;
/*
* Opacity level of the window
*
* @see #setOpacity(float)
* @see #getOpacity()
* @since 1.7
*/
private float opacity = 1.0f;
/*
* The shape assigned to this window. This field is set to null if
* no shape is set (rectangular window).
*
* @see #getShape()
* @see #setShape(Shape)
* @since 1.7
*/
private Shape shape = null;
private static final String base = "win";
private static int nameCounter = 0;
@ -305,6 +327,23 @@ public class Window extends Container implements Accessible {
transient boolean isTrayIconWindow = false;
/**
* These fields are initialized in the native peer code
* or via AWTAccessor's WindowAccessor.
*/
private transient volatile int securityWarningWidth = 0;
private transient volatile int securityWarningHeight = 0;
/**
* These fields represent the desired location for the security
* warning if this window is untrusted.
* See com.sun.awt.SecurityWarning for more details.
*/
private transient double securityWarningPointX = 2.0;
private transient double securityWarningPointY = 0.0;
private transient float securityWarningAlignmentX = RIGHT_ALIGNMENT;
private transient float securityWarningAlignmentY = TOP_ALIGNMENT;
static {
/* ensure that the necessary native libraries are loaded */
Toolkit.loadLibraries();
@ -373,6 +412,18 @@ public class Window extends Container implements Accessible {
}
}
private GraphicsConfiguration initGC(GraphicsConfiguration gc) {
GraphicsEnvironment.checkHeadless();
if (gc == null) {
gc = GraphicsEnvironment.getLocalGraphicsEnvironment().
getDefaultScreenDevice().getDefaultConfiguration();
}
setGraphicsConfiguration(gc);
return gc;
}
private void init(GraphicsConfiguration gc) {
GraphicsEnvironment.checkHeadless();
@ -384,14 +435,10 @@ public class Window extends Container implements Accessible {
setWarningString();
this.cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
this.visible = false;
if (gc == null) {
this.graphicsConfig =
GraphicsEnvironment.getLocalGraphicsEnvironment().
getDefaultScreenDevice().getDefaultConfiguration();
} else {
this.graphicsConfig = gc;
}
if (graphicsConfig.getDevice().getType() !=
gc = initGC(gc);
if (gc.getDevice().getType() !=
GraphicsDevice.TYPE_RASTER_SCREEN) {
throw new IllegalArgumentException("not a screen device");
}
@ -399,8 +446,8 @@ public class Window extends Container implements Accessible {
/* offset the initial location with the original of the screen */
/* and any insets */
Rectangle screenBounds = graphicsConfig.getBounds();
Insets screenInsets = getToolkit().getScreenInsets(graphicsConfig);
Rectangle screenBounds = gc.getBounds();
Insets screenInsets = getToolkit().getScreenInsets(gc);
int x = getX() + screenBounds.x + screenInsets.left;
int y = getY() + screenBounds.y + screenInsets.top;
if (x != this.x || y != this.y) {
@ -2744,7 +2791,7 @@ public class Window extends Container implements Accessible {
sun.java2d.Disposer.addRecord(anchor, new WindowDisposerRecord(appContext, this));
addToWindowList();
initGC(null);
}
private void deserializeResources(ObjectInputStream s)
@ -2849,6 +2896,15 @@ public class Window extends Container implements Accessible {
if(aot) {
setAlwaysOnTop(aot); // since 1.5; subject to permission check
}
shape = (Shape)f.get("shape", null);
opacity = (Float)f.get("opacity", 1.0f);
this.securityWarningWidth = 0;
this.securityWarningHeight = 0;
this.securityWarningPointX = 2.0;
this.securityWarningPointY = 0.0;
this.securityWarningAlignmentX = RIGHT_ALIGNMENT;
this.securityWarningAlignmentY = TOP_ALIGNMENT;
deserializeResources(s);
}
@ -2916,41 +2972,18 @@ public class Window extends Container implements Accessible {
} // inner class AccessibleAWTWindow
/**
* This method returns the GraphicsConfiguration used by this Window.
* @since 1.3
*/
public GraphicsConfiguration getGraphicsConfiguration() {
//NOTE: for multiscreen, this will need to take into account
//which screen the window is on/mostly on instead of returning the
//default or constructor argument config.
synchronized(getTreeLock()) {
if (graphicsConfig == null && !GraphicsEnvironment.isHeadless()) {
graphicsConfig =
GraphicsEnvironment. getLocalGraphicsEnvironment().
getDefaultScreenDevice().
getDefaultConfiguration();
}
return graphicsConfig;
}
}
/**
* Reset this Window's GraphicsConfiguration to match its peer.
*/
void resetGC() {
if (!GraphicsEnvironment.isHeadless()) {
// use the peer's GC
setGCFromPeer();
// if it's still null, use the default
if (graphicsConfig == null) {
graphicsConfig = GraphicsEnvironment.
@Override
void setGraphicsConfiguration(GraphicsConfiguration gc) {
if (gc == null) {
gc = GraphicsEnvironment.
getLocalGraphicsEnvironment().
getDefaultScreenDevice().
getDefaultConfiguration();
}
synchronized (getTreeLock()) {
super.setGraphicsConfiguration(gc);
if (log.isLoggable(Level.FINER)) {
log.finer("+ Window.resetGC(): new GC is \n+ " + graphicsConfig + "\n+ this is " + this);
log.finer("+ Window.setGraphicsConfiguration(): new GC is \n+ " + getGraphicsConfiguration_NoClientCode() + "\n+ this is " + this);
}
}
}
@ -3010,13 +3043,13 @@ public class Window extends Container implements Accessible {
// target location
int dx = 0, dy = 0;
// target GC
GraphicsConfiguration gc = this.graphicsConfig;
GraphicsConfiguration gc = getGraphicsConfiguration_NoClientCode();
Rectangle gcBounds = gc.getBounds();
Dimension windowSize = getSize();
// search a top-level of c
Window componentWindow = Component.getContainingWindow(c);
Window componentWindow = SunToolkit.getContainingWindow(c);
if ((c == null) || (componentWindow == null)) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
@ -3304,6 +3337,225 @@ public class Window extends Container implements Accessible {
}
// ******************** SHAPES & TRANSPARENCY CODE ********************
/**
* JavaDoc
*/
/*public */float getOpacity() {
synchronized (getTreeLock()) {
return opacity;
}
}
/**
* JavaDoc
*/
/*public */void setOpacity(float opacity) {
synchronized (getTreeLock()) {
if (opacity < 0.0f || opacity > 1.0f) {
throw new IllegalArgumentException(
"The value of opacity should be in the range [0.0f .. 1.0f].");
}
GraphicsConfiguration gc = getGraphicsConfiguration();
GraphicsDevice gd = gc.getDevice();
if (!gd.isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency.TRANSLUCENT)) {
throw new UnsupportedOperationException(
"TRANSLUCENT translucency is not supported.");
}
if ((gc.getDevice().getFullScreenWindow() == this) && (opacity < 1.0f)) {
throw new IllegalArgumentException(
"Setting opacity for full-screen window is not supported.");
}
this.opacity = opacity;
WindowPeer peer = (WindowPeer)getPeer();
if (peer != null) {
peer.setOpacity(opacity);
}
}
}
/**
* JavaDoc
*/
/*public */Shape getShape() {
synchronized (getTreeLock()) {
return shape;
}
}
/**
* JavaDoc
*
* @param window the window to set the shape to
* @param shape the shape to set to the window
* @throws IllegalArgumentException if the window is in full screen mode,
* and the shape is not null
*/
/*public */void setShape(Shape shape) {
synchronized (getTreeLock()) {
GraphicsConfiguration gc = getGraphicsConfiguration();
GraphicsDevice gd = gc.getDevice();
if (!gd.isWindowTranslucencySupported(
GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSPARENT))
{
throw new UnsupportedOperationException(
"PERPIXEL_TRANSPARENT translucency is not supported.");
}
if ((gc.getDevice().getFullScreenWindow() == this) && (shape != null)) {
throw new IllegalArgumentException(
"Setting shape for full-screen window is not supported.");
}
this.shape = shape;
WindowPeer peer = (WindowPeer)getPeer();
if (peer != null) {
peer.applyShape(shape == null ? null : Region.getInstance(shape, null));
}
}
}
/**
* JavaDoc
*/
/*
@Override
public void setBackground(Color bgColor) {
int alpha = bgColor.getAlpha();
if (alpha < 255) { // non-opaque window
GraphicsConfiguration gc = getGraphicsConfiguration();
GraphicsDevice gd = gc.getDevice();
if (gc.getDevice().getFullScreenWindow() == this) {
throw new IllegalArgumentException(
"Making full-screen window non opaque is not supported.");
}
if (!gc.isTranslucencyCapable()) {
GraphicsConfiguration capableGC = gd.getTranslucencyCapableGC();
if (capableGC == null) {
throw new IllegalArgumentException(
"PERPIXEL_TRANSLUCENT translucency is not supported");
}
// TODO: change GC
}
setLayersOpaque(this, false);
}
super.setBackground(bgColor);
WindowPeer peer = (WindowPeer)getPeer();
if (peer != null) {
peer.setOpaque(alpha == 255);
}
}
*/
private transient boolean opaque = true;
void setOpaque(boolean opaque) {
synchronized (getTreeLock()) {
GraphicsConfiguration gc = getGraphicsConfiguration();
if (!opaque && !com.sun.awt.AWTUtilities.isTranslucencyCapable(gc)) {
throw new IllegalArgumentException(
"The window must use a translucency-compatible graphics configuration");
}
if (!com.sun.awt.AWTUtilities.isTranslucencySupported(
com.sun.awt.AWTUtilities.Translucency.PERPIXEL_TRANSLUCENT))
{
throw new UnsupportedOperationException(
"PERPIXEL_TRANSLUCENT translucency is not supported.");
}
if ((gc.getDevice().getFullScreenWindow() == this) && !opaque) {
throw new IllegalArgumentException(
"Making full-screen window non opaque is not supported.");
}
setLayersOpaque(this, opaque);
this.opaque = opaque;
WindowPeer peer = (WindowPeer)getPeer();
if (peer != null) {
peer.setOpaque(opaque);
}
}
}
private void updateWindow(BufferedImage backBuffer) {
synchronized (getTreeLock()) {
WindowPeer peer = (WindowPeer)getPeer();
if (peer != null) {
peer.updateWindow(backBuffer);
}
}
}
private static final Color TRANSPARENT_BACKGROUND_COLOR = new Color(0, 0, 0, 0);
private static void setLayersOpaque(Component component, boolean isOpaque) {
// Shouldn't use instanceof to avoid loading Swing classes
// if it's a pure AWT application.
if (Component.doesImplement(component, "javax.swing.RootPaneContainer")) {
javax.swing.RootPaneContainer rpc = (javax.swing.RootPaneContainer)component;
javax.swing.JRootPane root = rpc.getRootPane();
javax.swing.JLayeredPane lp = root.getLayeredPane();
Container c = root.getContentPane();
javax.swing.JComponent content =
(c instanceof javax.swing.JComponent) ? (javax.swing.JComponent)c : null;
javax.swing.JComponent gp =
(rpc.getGlassPane() instanceof javax.swing.JComponent) ?
(javax.swing.JComponent)rpc.getGlassPane() : null;
if (gp != null) {
gp.setDoubleBuffered(isOpaque);
}
lp.setOpaque(isOpaque);
root.setOpaque(isOpaque);
root.setDoubleBuffered(isOpaque); //XXX: the "white rect" workaround
if (content != null) {
content.setOpaque(isOpaque);
content.setDoubleBuffered(isOpaque); //XXX: the "white rect" workaround
// Iterate down one level to see whether we have a JApplet
// (which is also a RootPaneContainer) which requires processing
int numChildren = content.getComponentCount();
if (numChildren > 0) {
Component child = content.getComponent(0);
// It's OK to use instanceof here because we've
// already loaded the RootPaneContainer class by now
if (child instanceof javax.swing.RootPaneContainer) {
setLayersOpaque(child, isOpaque);
}
}
}
}
Color bg = component.getBackground();
boolean hasTransparentBg = TRANSPARENT_BACKGROUND_COLOR.equals(bg);
Container container = null;
if (component instanceof Container) {
container = (Container) component;
}
if (isOpaque) {
if (hasTransparentBg) {
// Note: we use the SystemColor.window color as the default.
// This color is used in the WindowPeer implementations to
// initialize the background color of the window if it is null.
// (This might not be the right thing to do for other
// RootPaneContainers we might be invoked with)
Color newColor = null;
if (container != null && container.preserveBackgroundColor != null) {
newColor = container.preserveBackgroundColor;
} else {
newColor = SystemColor.window;
}
component.setBackground(newColor);
}
} else {
if (!hasTransparentBg && container != null) {
container.preserveBackgroundColor = bg;
}
component.setBackground(TRANSPARENT_BACKGROUND_COLOR);
}
}
// ************************** MIXING CODE *******************************
// A window has a parent, but it does NOT have a container
@ -3341,6 +3593,87 @@ public class Window extends Container implements Accessible {
// ****************** END OF MIXING CODE ********************************
// This method gets the window location/size as reported by the native
// system since the locally cached values may represent outdated data.
// NOTE: this method is invoked on the toolkit thread, and therefore
// is not supposed to become public/user-overridable.
private Point2D calculateSecurityWarningPosition(double x, double y,
double w, double h)
{
return new Point2D.Double(
x + w * securityWarningAlignmentX + securityWarningPointX,
y + h * securityWarningAlignmentY + securityWarningPointY);
}
static {
AWTAccessor.setWindowAccessor(new AWTAccessor.WindowAccessor() {
public float getOpacity(Window window) {
return window.opacity;
}
public void setOpacity(Window window, float opacity) {
window.setOpacity(opacity);
}
public Shape getShape(Window window) {
return window.getShape();
}
public void setShape(Window window, Shape shape) {
window.setShape(shape);
}
public boolean isOpaque(Window window) {
/*
return window.getBackground().getAlpha() < 255;
*/
synchronized (window.getTreeLock()) {
return window.opaque;
}
}
public void setOpaque(Window window, boolean opaque) {
/*
Color bg = window.getBackground();
window.setBackground(new Color(bg.getRed(), bg.getGreen(), bg.getBlue(),
opaque ? 255 : 0));
*/
window.setOpaque(opaque);
}
public void updateWindow(Window window, BufferedImage backBuffer) {
window.updateWindow(backBuffer);
}
public Dimension getSecurityWarningSize(Window window) {
return new Dimension(window.securityWarningWidth,
window.securityWarningHeight);
}
public void setSecurityWarningSize(Window window, int width, int height)
{
window.securityWarningWidth = width;
window.securityWarningHeight = height;
}
public void setSecurityWarningPosition(Window window,
Point2D point, float alignmentX, float alignmentY)
{
window.securityWarningPointX = point.getX();
window.securityWarningPointY = point.getY();
window.securityWarningAlignmentX = alignmentX;
window.securityWarningAlignmentY = alignmentY;
synchronized (window.getTreeLock()) {
WindowPeer peer = (WindowPeer)window.getPeer();
if (peer != null) {
peer.repositionSecurityWarning();
}
}
}
public Point2D calculateSecurityWarningPosition(Window window,
double x, double y, double w, double h)
{
return window.calculateSecurityWarningPosition(x, y, w, h);
}
}); // WindowAccessor
} // static
} // class Window

View File

@ -1,5 +1,5 @@
/*
* Copyright 1996-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1996-2009 Sun Microsystems, Inc. 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
@ -65,15 +65,16 @@ import java.io.ObjectInputStream;
* <p>
* For key pressed and key released events, the getKeyCode method returns
* the event's keyCode. For key typed events, the getKeyCode method
* always returns VK_UNDEFINED.
* always returns {@code VK_UNDEFINED}. The {@code getExtendedKeyCode} method
* may also be used with many international keyboard layouts.
*
* <p>
* <em>"Key pressed" and "key released" events</em> are lower-level and depend
* on the platform and keyboard layout. They are generated whenever a key is
* pressed or released, and are the only way to find out about keys that don't
* generate character input (e.g., action keys, modifier keys, etc.). The key
* being pressed or released is indicated by the getKeyCode method, which returns
* a virtual key code.
* being pressed or released is indicated by the {@code getKeyCode} and {@code getExtendedKeyCode}
* methods, which return a virtual key code.
*
* <p>
* <em>Virtual key codes</em> are used to report which keyboard key has
@ -111,6 +112,11 @@ import java.io.ObjectInputStream;
* platform and keyboard layout. For example, the key that generates VK_Q
* when using a U.S. keyboard layout will generate VK_A when using a French
* keyboard layout.
* <li>The key that generates {@code VK_Q} when using a U.S. keyboard layout also
* generates a unique code for Russian or Hebrew layout. There is no a
* {@code VK_} constant for these and many other codes in various layouts. These codes
* may be obtained by using {@code getExtendedKeyCode} and are used whenever
* a {@code VK_} constant is used.
* <li>Not all characters have a keycode associated with them. For example,
* there is no keycode for the question mark because there is no keyboard
* for which it appears on the primary layer.
@ -891,6 +897,12 @@ public class KeyEvent extends InputEvent {
*/
int keyLocation;
//set from native code.
private transient long rawCode = 0;
private transient long primaryLevelUnicode = 0;
private transient long scancode = 0; // for MS Windows only
private transient long extendedKeyCode = 0;
/*
* JDK 1.1 serialVersionUID
*/
@ -1315,6 +1327,9 @@ public class KeyEvent extends InputEvent {
return numpad + "-" + c;
}
if ((keyCode & 0x01000000) != 0) {
return String.valueOf((char)(keyCode ^ 0x01000000 ));
}
String unknown = Toolkit.getProperty("AWT.unknown", "Unknown");
return unknown + " keyCode: 0x" + Integer.toString(keyCode, 16);
}
@ -1551,9 +1566,44 @@ public class KeyEvent extends InputEvent {
str.append("KEY_LOCATION_UNKNOWN");
break;
}
str.append(",rawCode=").append(rawCode);
str.append(",primaryLevelUnicode=").append(primaryLevelUnicode);
str.append(",scancode=").append(scancode);
str.append(",extendedKeyCode=0x").append(Long.toHexString(extendedKeyCode));
return str.toString();
}
/**
* Returns an extended key code for the event.
* The extended key code is a unique id assigned to a key on the keyboard
* just like {@code keyCode}. However, unlike {@code keyCode}, this value depends on the
* current keyboard layout. For instance, pressing the left topmost letter key
* in a common English layout produces the same value as {@code keyCode}, {@code VK_Q}.
* Pressing the same key in a regular Russian layout gives another code, unique for the
* letter "Cyrillic I short".
*
* @since 1.7
*
*/
public int getExtendedKeyCode() {
return (int)extendedKeyCode;
}
/**
* Returns an extended key code for a unicode character.
*
* @return for a unicode character with a corresponding {@code VK_} constant -- this
* {@code VK_} constant; for a character appearing on the primary
* level of a known keyboard layout -- a unique integer.
* If a character does not appear on the primary level of a known keyboard,
* {@code VK_UNDEFINED} is returned.
*
* @since 1.7
*
*/
public static int getExtendedKeyCodeForChar(int c) {
// Return a keycode (if any) associated with a character.
return sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(c);
}
/**
* Sets new modifiers by the old ones. The key modifiers

View File

@ -25,6 +25,7 @@
package java.awt.peer;
import java.awt.Canvas;
import java.awt.GraphicsConfiguration;
/**
* The peer interface for {@link Canvas}.
@ -36,4 +37,13 @@ import java.awt.Canvas;
* instances.
*/
public interface CanvasPeer extends ComponentPeer {
/**
* Requests a GC that best suits this Canvas. The returned GC may differ
* from the requested GC passed as the argument to this method. This method
* must return a non-null value (given the argument is non-null as well).
*
* @since 1.7
*/
GraphicsConfiguration getAppropriateGraphicsConfiguration(
GraphicsConfiguration gc);
}

View File

@ -539,4 +539,16 @@ public interface ComponentPeer {
*/
void applyShape(Region shape);
/**
* Lowers this component at the bottom of the above HW peer. If the above parameter
* is null then the method places this component at the top of the Z-order.
*/
void setZOrder(ComponentPeer above);
/**
* Updates internal data structures related to the component's GC.
*
* @since 1.7
*/
void updateGraphicsData(GraphicsConfiguration gc);
}

View File

@ -76,21 +76,4 @@ public interface ContainerPeer extends ComponentPeer {
* @see Container#validateTree()
*/
void endLayout();
/**
* Restacks native windows - children of this native window - according to
* Java container order.
*
* @since 1.5
*/
void restack();
/**
* Indicates availability of restacking operation in this container.
*
* @return Returns true if restack is supported, false otherwise
*
* @since 1.5
*/
boolean isRestackSupported();
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1995-2007 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1995-2009 Sun Microsystems, Inc. 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
@ -27,6 +27,8 @@ package java.awt.peer;
import java.awt.*;
import java.awt.image.BufferedImage;
/**
* The peer interface for {@link Window}.
*
@ -92,4 +94,31 @@ public interface WindowPeer extends ContainerPeer {
* @see Window#setIconImages(java.util.List)
*/
void updateIconImages();
/**
* Sets the level of opacity for the window.
*
* @see Window#setOpacity(float)
*/
void setOpacity(float opacity);
/**
* Enables the per-pixel alpha support for the window.
*
* @see Window#setBackground(Color)
*/
void setOpaque(boolean isOpaque);
/**
* Updates the native part of non-opaque window using
* the given image with color+alpha values for each pixel.
*
* @see Window#setBackground(Color)
*/
void updateWindow(BufferedImage backBuffer);
/**
* Instructs the peer to update the position of the security warning.
*/
void repositionSecurityWarning();
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -1545,6 +1545,9 @@ public abstract class AbstractButton extends JComponent implements ItemSelectabl
* A mnemonic must correspond to a single key on the keyboard
* and should be specified using one of the <code>VK_XXX</code>
* keycodes defined in <code>java.awt.event.KeyEvent</code>.
* These codes and the wider array of codes for international
* keyboards may be obtained through
* <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>.
* Mnemonics are case-insensitive, therefore a key event
* with the corresponding keycode would cause the button to be
* activated whether or not the Shift modifier was pressed.

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -272,7 +272,9 @@ public interface Action extends ActionListener {
* one of the <code>KeyEvent</code> key codes. The value is
* commonly used to specify a mnemonic. For example:
* <code>myAction.putValue(Action.MNEMONIC_KEY, KeyEvent.VK_A)</code>
* sets the mnemonic of <code>myAction</code> to 'a'.
* sets the mnemonic of <code>myAction</code> to 'a', while
* <code>myAction.putValue(Action.MNEMONIC_KEY, KeyEvent.getExtendedKeyCodeForChar('\u0444'))</code>
* sets the mnemonic of <code>myAction</code> to Cyrillic letter "Ef".
*
* @since 1.3
*/

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -2888,7 +2888,10 @@ public abstract class JComponent extends Container implements Serializable,
return false;
}
// Get the KeyStroke
// There may be two keystrokes associated with a low-level key event;
// in this case a keystroke made of an extended key code has a priority.
KeyStroke ks;
KeyStroke ksE = null;
if (e.getID() == KeyEvent.KEY_TYPED) {
ks = KeyStroke.getKeyStroke(e.getKeyChar());
@ -2896,9 +2899,18 @@ public abstract class JComponent extends Container implements Serializable,
else {
ks = KeyStroke.getKeyStroke(e.getKeyCode(),e.getModifiers(),
(pressed ? false:true));
if (e.getKeyCode() != e.getExtendedKeyCode()) {
ksE = KeyStroke.getKeyStroke(e.getExtendedKeyCode(),e.getModifiers(),
(pressed ? false:true));
}
}
/* Do we have a key binding for e? */
// Do we have a key binding for e?
// If we have a binding by an extended code, use it.
// If not, check for regular code binding.
if(ksE != null && processKeyBinding(ksE, e, WHEN_FOCUSED, pressed)) {
return true;
}
if(processKeyBinding(ks, e, WHEN_FOCUSED, pressed))
return true;
@ -2910,6 +2922,9 @@ public abstract class JComponent extends Container implements Serializable,
while (parent != null && !(parent instanceof Window) &&
!(parent instanceof Applet)) {
if(parent instanceof JComponent) {
if(ksE != null && ((JComponent)parent).processKeyBinding(ksE, e,
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, pressed))
return true;
if(((JComponent)parent).processKeyBinding(ks, e,
WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, pressed))
return true;

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -503,11 +503,11 @@ public class JLabel extends JComponent implements SwingConstants, Accessible
* @see #setDisplayedMnemonic(int)
*/
public void setDisplayedMnemonic(char aChar) {
int vk = (int) aChar;
if(vk >= 'a' && vk <='z')
vk -= ('a' - 'A');
int vk = java.awt.event.KeyEvent.getExtendedKeyCodeForChar(aChar);
if (vk != java.awt.event.KeyEvent.VK_UNDEFINED) {
setDisplayedMnemonic(vk);
}
}
/**

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -1628,7 +1628,9 @@ public class JTabbedPane extends JComponent
* <p>
* A mnemonic must correspond to a single key on the keyboard
* and should be specified using one of the <code>VK_XXX</code>
* keycodes defined in <code>java.awt.event.KeyEvent</code>.
* keycodes defined in <code>java.awt.event.KeyEvent</code>
* or one of the extended keycodes obtained through
* <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>.
* Mnemonics are case-insensitive, therefore a key event
* with the corresponding keycode would cause the button to be
* activated whether or not the Shift modifier was pressed.

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -162,6 +162,9 @@ public class KeyStroke extends AWTKeyStroke {
* <li>java.awt.event.KeyEvent.VK_TAB
* <li>java.awt.event.KeyEvent.VK_SPACE
* </ul>
* Alternatively, the key code may be obtained by calling
* <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>.
*
* The modifiers consist of any combination of:<ul>
* <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK
* <li>java.awt.event.InputEvent.CTRL_DOWN_MASK
@ -210,6 +213,9 @@ public class KeyStroke extends AWTKeyStroke {
* <li>java.awt.event.KeyEvent.VK_TAB
* <li>java.awt.event.KeyEvent.VK_SPACE
* </ul>
* Alternatively, the key code may be obtained by calling
* <code>java.awt.event.KeyEvent.getExtendedKeyCodeForChar</code>.
*
* The modifiers consist of any combination of:<ul>
* <li>java.awt.event.InputEvent.SHIFT_DOWN_MASK
* <li>java.awt.event.InputEvent.CTRL_DOWN_MASK

View File

@ -1,5 +1,5 @@
/*
* Copyright 1998-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1998-2009 Sun Microsystems, Inc. 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
@ -212,19 +212,35 @@ class KeyboardManager {
Thread.dumpStack();
}
// There may be two keystrokes associated with a low-level key event;
// in this case a keystroke made of an extended key code has a priority.
KeyStroke ks;
KeyStroke ksE = null;
if(e.getID() == KeyEvent.KEY_TYPED) {
ks=KeyStroke.getKeyStroke(e.getKeyChar());
} else {
if(e.getKeyCode() != e.getExtendedKeyCode()) {
ksE=KeyStroke.getKeyStroke(e.getExtendedKeyCode(), e.getModifiers(), !pressed);
}
ks=KeyStroke.getKeyStroke(e.getKeyCode(), e.getModifiers(), !pressed);
}
Hashtable keyMap = containerMap.get(topAncestor);
if (keyMap != null) { // this container isn't registered, so bail
Object tmp = keyMap.get(ks);
Object tmp = null;
// extended code has priority
if( ksE != null ) {
tmp = keyMap.get(ksE);
if( tmp != null ) {
ks = ksE;
}
}
if( tmp == null ) {
tmp = keyMap.get(ks);
}
if (tmp == null) {
// don't do anything
@ -269,7 +285,12 @@ class KeyboardManager {
while (iter.hasMoreElements()) {
JMenuBar mb = (JMenuBar)iter.nextElement();
if ( mb.isShowing() && mb.isEnabled() ) { // don't want to give these out
if( !(ks.equals(ksE)) ) {
fireBinding(mb, ksE, e, pressed);
}
if(ks.equals(ksE) || !e.isConsumed()) {
fireBinding(mb, ks, e, pressed);
}
if (e.isConsumed()) {
return true;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -34,6 +34,7 @@ import java.security.AccessController;
import java.util.*;
import java.applet.*;
import sun.awt.AWTAccessor;
import sun.awt.AppContext;
import sun.awt.DisplayChangedListener;
import sun.awt.SunToolkit;
@ -716,6 +717,44 @@ public class RepaintManager
}
}
private Map<Component,Rectangle>
updateWindows(Map<Component,Rectangle> dirtyComponents)
{
Toolkit toolkit = Toolkit.getDefaultToolkit();
if (!(toolkit instanceof SunToolkit &&
((SunToolkit)toolkit).needUpdateWindow()))
{
return dirtyComponents;
}
Set<Window> windows = new HashSet<Window>();
Set<Component> dirtyComps = dirtyComponents.keySet();
for (Iterator<Component> it = dirtyComps.iterator(); it.hasNext();) {
Component dirty = it.next();
Window window = dirty instanceof Window ?
(Window)dirty :
SwingUtilities.getWindowAncestor(dirty);
if (window != null &&
!AWTAccessor.getWindowAccessor().isOpaque(window))
{
// if this component's toplevel is perpixel translucent, it will
// be repainted below
it.remove();
// add to the set of windows to update (so that we don't update
// the window many times for each component to be repainted that
// belongs to this window)
windows.add(window);
}
}
for (Window window : windows) {
AWTAccessor.getWindowAccessor().updateWindow(window, null);
}
return dirtyComponents;
}
/**
* Paint all of the components that have been marked dirty.
*
@ -749,6 +788,10 @@ public class RepaintManager
int localBoundsW;
Enumeration keys;
// the components belonging to perpixel-translucent windows will be
// removed from the list
tmpDirtyComponents = updateWindows(tmpDirtyComponents);
roots = new ArrayList<Component>(count);
for (Component dirty : tmpDirtyComponents.keySet()) {

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -1589,15 +1589,6 @@ public class SwingUtilities implements SwingConstants
* processing the key bindings associated with JComponents.
*/
static boolean isValidKeyEventForKeyBindings(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_TYPED) {
int mod = e.getModifiers();
if (((mod & ActionEvent.ALT_MASK) != 0) &&
((mod & ActionEvent.CTRL_MASK) == 0)) {
// filter out typed "alt-?" keys, but not those created
// with AltGr, and not control characters
return false;
}
}
return true;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2009 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2008-2009 Sun Microsystems, Inc. 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
@ -26,46 +26,229 @@
package sun.awt;
import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import sun.misc.Unsafe;
/** The AWTAccessor utility class.
/**
* The AWTAccessor utility class.
* The main purpose of this class is to enable accessing
* private and package-private fields of classes from
* different classes/packages. See sun.misc.SharedSecretes
* for another example.
*/
public final class AWTAccessor {
private static final Unsafe unsafe = Unsafe.getUnsafe();
/** We don't need any objects of this class.
/*
* We don't need any objects of this class.
* It's rather a collection of static methods
* and interfaces.
*/
private AWTAccessor() {
}
/** An accessor for the java.awt.Component class.
/*
* An interface of accessor for the java.awt.Component class.
*/
public interface ComponentAccessor {
// See 6797587
// Also see: 6776743, 6768307, and 6768332.
/**
/*
* Sets whether the native background erase for a component
* has been disabled via SunToolkit.disableBackgroundErase().
*/
void setBackgroundEraseDisabled(Component comp, boolean disabled);
/*
* Indicates whether the native background erase for a
* component has been disabled via
* SunToolkit.disableBackgroundErase().
*/
boolean getBackgroundEraseDisabled(Component comp);
/*
*
* Gets the bounds of this component in the form of a
* <code>Rectangle</code> object. The bounds specify this
* component's width, height, and location relative to
* its parent.
*/
Rectangle getBounds(Component comp);
/*
* Sets the shape of a lw component to cut out from hw components.
*
* See 6797587, 6776743, 6768307, and 6768332 for details
*/
void setMixingCutoutShape(Component comp, Shape shape);
/**
* Sets GraphicsConfiguration value for the component.
*/
void setGraphicsConfiguration(Component comp, GraphicsConfiguration gc);
/*
* Requests focus to the component.
*/
boolean requestFocus(Component comp, CausedFocusEvent.Cause cause);
/*
* Determines if the component can gain focus.
*/
boolean canBeFocusOwner(Component comp);
/**
* Returns whether the component is visible without invoking
* any client code.
*/
boolean isVisible_NoClientCode(Component comp);
}
/* The java.awt.Component class accessor object.
/*
* An interface of accessor for java.awt.Window class.
*/
public interface WindowAccessor {
/*
* Get opacity level of the given window.
*/
float getOpacity(Window window);
/*
* Set opacity level to the given window.
*/
void setOpacity(Window window, float opacity);
/*
* Get a shape assigned to the given window.
*/
Shape getShape(Window window);
/*
* Set a shape to the given window.
*/
void setShape(Window window, Shape shape);
/*
* Identify whether the given window is opaque (true)
* or translucent (false).
*/
boolean isOpaque(Window window);
/*
* Set the opaque preoperty to the given window.
*/
void setOpaque(Window window, boolean isOpaque);
/*
* Update the image of a non-opaque (translucent) window.
*/
void updateWindow(Window window, BufferedImage backBuffer);
/** Get the size of the security warning.
*/
Dimension getSecurityWarningSize(Window w);
/**
* Set the size of the security warning.
*/
void setSecurityWarningSize(Window w, int width, int height);
/** Set the position of the security warning.
*/
void setSecurityWarningPosition(Window w, Point2D point,
float alignmentX, float alignmentY);
/** Request to recalculate the new position of the security warning for
* the given window size/location as reported by the native system.
*/
Point2D calculateSecurityWarningPosition(Window window,
double x, double y, double w, double h);
}
/*
* An accessor for the AWTEvent class.
*/
public interface AWTEventAccessor {
/*
*
* Sets the flag on this AWTEvent indicating that it was
* generated by the system.
*/
void setSystemGenerated(AWTEvent ev);
/*
*
* Indicates whether this AWTEvent was generated by the system.
*/
boolean isSystemGenerated(AWTEvent ev);
}
/*
* An accessor for the java.awt.Frame class.
*/
public interface FrameAccessor {
/*
* Sets the state of this frame.
*/
void setExtendedState(Frame frame, int state);
/*
* Gets the state of this frame.
*/
int getExtendedState(Frame frame);
}
/*
* An interface of accessor for the java.awt.KeyboardFocusManager class.
*/
public interface KeyboardFocusManagerAccessor {
/*
* Indicates whether the native implementation should
* proceed with a pending focus request for the heavyweight.
*/
int shouldNativelyFocusHeavyweight(Component heavyweight,
Component descendant,
boolean temporary,
boolean focusedWindowChangeAllowed,
long time,
CausedFocusEvent.Cause cause);
/*
* Delivers focus for the lightweight descendant of the heavyweight
* synchronously.
*/
boolean processSynchronousLightweightTransfer(Component heavyweight,
Component descendant,
boolean temporary,
boolean focusedWindowChangeAllowed,
long time);
/*
* Removes the last focus request for the heavyweight from the queue.
*/
void removeLastFocusRequest(Component heavyweight);
}
/*
* The java.awt.Component class accessor object.
*/
private static ComponentAccessor componentAccessor;
/** Set an accessor object for the java.awt.Component class.
/*
* The java.awt.Window class accessor object.
*/
private static WindowAccessor windowAccessor;
/*
* The java.awt.AWTEvent class accessor object.
*/
private static AWTEventAccessor awtEventAccessor;
/*
* The java.awt.Frame class accessor object.
*/
private static FrameAccessor frameAccessor;
/*
* The java.awt.KeyboardFocusManager class accessor object.
*/
private static KeyboardFocusManagerAccessor kfmAccessor;
/*
* Set an accessor object for the java.awt.Component class.
*/
public static void setComponentAccessor(ComponentAccessor ca) {
componentAccessor = ca;
}
/** Retrieve the accessor object for the java.awt.Window class.
/*
* Retrieve the accessor object for the java.awt.Window class.
*/
public static ComponentAccessor getComponentAccessor() {
if (componentAccessor == null) {
@ -74,4 +257,69 @@ public final class AWTAccessor {
return componentAccessor;
}
/*
* Set an accessor object for the java.awt.Window class.
*/
public static void setWindowAccessor(WindowAccessor wa) {
windowAccessor = wa;
}
/*
* Retrieve the accessor object for the java.awt.Window class.
*/
public static WindowAccessor getWindowAccessor() {
if (windowAccessor == null) {
unsafe.ensureClassInitialized(Window.class);
}
return windowAccessor;
}
/*
* Set an accessor object for the java.awt.AWTEvent class.
*/
public static void setAWTEventAccessor(AWTEventAccessor aea) {
awtEventAccessor = aea;
}
/*
* Retrieve the accessor object for the java.awt.AWTEvent class.
*/
public static AWTEventAccessor getAWTEventAccessor() {
return awtEventAccessor;
}
/*
* Set an accessor object for the java.awt.Frame class.
*/
public static void setFrameAccessor(FrameAccessor fa) {
frameAccessor = fa;
}
/*
* Retrieve the accessor object for the java.awt.Frame class.
*/
public static FrameAccessor getFrameAccessor() {
if (frameAccessor == null) {
unsafe.ensureClassInitialized(Frame.class);
}
return frameAccessor;
}
/*
* Set an accessor object for the java.awt.KeyboardFocusManager class.
*/
public static void setKeyboardFocusManagerAccessor(KeyboardFocusManagerAccessor kfma) {
kfmAccessor = kfma;
}
/*
* Retrieve the accessor object for the java.awt.KeyboardFocusManager class.
*/
public static KeyboardFocusManagerAccessor getKeyboardFocusManagerAccessor() {
if (kfmAccessor == null) {
unsafe.ensureClassInitialized(KeyboardFocusManager.class);
}
return kfmAccessor;
}
}

View File

@ -73,7 +73,6 @@ public class ComponentAccessor
private static Field fieldPacked;
private static Field fieldIgnoreRepaint;
private static Field fieldPeer;
private static Method methodResetGC;
private static Field fieldVisible;
private static Method methodIsEnabledImpl;
private static Method methodGetCursorNoClientCode;
@ -124,9 +123,6 @@ public class ComponentAccessor
fieldPeer = componentClass.getDeclaredField("peer");
fieldPeer.setAccessible(true);
methodResetGC = componentClass.getDeclaredMethod("resetGC", (Class[]) null);
methodResetGC.setAccessible(true);
fieldVisible = componentClass.getDeclaredField("visible");
fieldVisible.setAccessible(true);
@ -425,18 +421,6 @@ public class ComponentAccessor
return false;
}
public static void resetGC(Component c) {
try {
methodResetGC.invoke(c, (Object[]) null);
}
catch (IllegalAccessException e) {
log.log(Level.FINE, "Unable to access the Component object", e);
}
catch (InvocationTargetException e) {
log.log(Level.FINE, "Unable to invoke on the Component object", e);
}
}
public static boolean getVisible(Component c) {
try {
return fieldVisible.getBoolean(c);

View File

@ -1,5 +1,5 @@
/*
* Copyright 1996-2006 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1996-2009 Sun Microsystems, Inc. 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
@ -585,5 +585,14 @@ public abstract class EmbeddedFrame extends Frame
}
public void updateMinimumSize() {
}
public void setOpacity(float opacity) {
}
public void setOpaque(boolean isOpaque) {
}
public void updateWindow(BufferedImage backBuffer) {
}
public void repositionSecurityWarning() {
}
}
} // class EmbeddedFrame

View File

@ -0,0 +1,670 @@
package sun.awt;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.awt.event.KeyEvent;
public class ExtendedKeyCodes {
/**
* ATTN: These are the readonly hashes with load factor == 1;
* adding a value, please set the inital capacity to exact number of items
* or higher.
*/
// Keycodes declared in KeyEvent.java with corresponding Unicode values.
private final static HashMap<Integer, Integer> regularKeyCodesMap =
new HashMap<Integer,Integer>(122, 1.0f);
// Keycodes derived from Unicode values. Here should be collected codes
// for characters appearing on the primary layer of at least one
// known keyboard layout. For instance, sterling sign is on the primary layer
// of the Mac Italian layout.
private final static HashSet<Integer> extendedKeyCodesSet =
new HashSet<Integer>(501, 1.0f);
final public static int getExtendedKeyCodeForChar( int c ) {
int rc = KeyEvent.VK_UNDEFINED;
int uc = Character.toUpperCase( c );
int lc = Character.toLowerCase( c );
if (regularKeyCodesMap.containsKey( c )) {
if(regularKeyCodesMap.containsKey(uc)) {
return regularKeyCodesMap.get( uc );
}
return regularKeyCodesMap.get( c );
}
uc += 0x01000000;
lc += 0x01000000;
if (extendedKeyCodesSet.contains( uc )) {
return uc;
}else if (extendedKeyCodesSet.contains( lc )) {
return lc;
}
return rc;
}
static {
regularKeyCodesMap.put(0x0a, KeyEvent.VK_ENTER);
regularKeyCodesMap.put(0x08, KeyEvent.VK_BACK_SPACE);
regularKeyCodesMap.put(0x09, KeyEvent.VK_TAB);
regularKeyCodesMap.put(0x1B, KeyEvent.VK_ESCAPE);
regularKeyCodesMap.put(0x20, KeyEvent.VK_SPACE);
regularKeyCodesMap.put(0x21, KeyEvent.VK_PAGE_UP);
regularKeyCodesMap.put(0x22, KeyEvent.VK_PAGE_DOWN);
regularKeyCodesMap.put(0x23, KeyEvent.VK_END);
regularKeyCodesMap.put(0x24, KeyEvent.VK_HOME);
regularKeyCodesMap.put(0x25, KeyEvent.VK_LEFT);
regularKeyCodesMap.put(0x26, KeyEvent.VK_UP);
regularKeyCodesMap.put(0x27, KeyEvent.VK_RIGHT);
regularKeyCodesMap.put(0x28, KeyEvent.VK_DOWN);
regularKeyCodesMap.put(0x2C, KeyEvent.VK_COMMA);
regularKeyCodesMap.put(0x2D, KeyEvent.VK_MINUS);
regularKeyCodesMap.put(0x2E, KeyEvent.VK_PERIOD);
regularKeyCodesMap.put(0x2F, KeyEvent.VK_SLASH);
regularKeyCodesMap.put(0x30, KeyEvent.VK_0);
regularKeyCodesMap.put(0x31, KeyEvent.VK_1);
regularKeyCodesMap.put(0x32, KeyEvent.VK_2);
regularKeyCodesMap.put(0x33, KeyEvent.VK_3);
regularKeyCodesMap.put(0x34, KeyEvent.VK_4);
regularKeyCodesMap.put(0x35, KeyEvent.VK_5);
regularKeyCodesMap.put(0x36, KeyEvent.VK_6);
regularKeyCodesMap.put(0x37, KeyEvent.VK_7);
regularKeyCodesMap.put(0x38, KeyEvent.VK_8);
regularKeyCodesMap.put(0x39, KeyEvent.VK_9);
regularKeyCodesMap.put(0x3B, KeyEvent.VK_SEMICOLON);
regularKeyCodesMap.put(0x3D, KeyEvent.VK_EQUALS);
regularKeyCodesMap.put(0x41, KeyEvent.VK_A);
regularKeyCodesMap.put(0x61, KeyEvent.VK_A);
regularKeyCodesMap.put(0x42, KeyEvent.VK_B);
regularKeyCodesMap.put(0x62, KeyEvent.VK_B);
regularKeyCodesMap.put(0x43, KeyEvent.VK_C);
regularKeyCodesMap.put(0x63, KeyEvent.VK_C);
regularKeyCodesMap.put(0x44, KeyEvent.VK_D);
regularKeyCodesMap.put(0x64, KeyEvent.VK_D);
regularKeyCodesMap.put(0x45, KeyEvent.VK_E);
regularKeyCodesMap.put(0x65, KeyEvent.VK_E);
regularKeyCodesMap.put(0x46, KeyEvent.VK_F);
regularKeyCodesMap.put(0x66, KeyEvent.VK_F);
regularKeyCodesMap.put(0x47, KeyEvent.VK_G);
regularKeyCodesMap.put(0x67, KeyEvent.VK_G);
regularKeyCodesMap.put(0x48, KeyEvent.VK_H);
regularKeyCodesMap.put(0x68, KeyEvent.VK_H);
regularKeyCodesMap.put(0x49, KeyEvent.VK_I);
regularKeyCodesMap.put(0x69, KeyEvent.VK_I);
regularKeyCodesMap.put(0x4A, KeyEvent.VK_J);
regularKeyCodesMap.put(0x6A, KeyEvent.VK_J);
regularKeyCodesMap.put(0x4B, KeyEvent.VK_K);
regularKeyCodesMap.put(0x6B, KeyEvent.VK_K);
regularKeyCodesMap.put(0x4C, KeyEvent.VK_L);
regularKeyCodesMap.put(0x6C, KeyEvent.VK_L);
regularKeyCodesMap.put(0x4D, KeyEvent.VK_M);
regularKeyCodesMap.put(0x6D, KeyEvent.VK_M);
regularKeyCodesMap.put(0x4E, KeyEvent.VK_N);
regularKeyCodesMap.put(0x6E, KeyEvent.VK_N);
regularKeyCodesMap.put(0x4F, KeyEvent.VK_O);
regularKeyCodesMap.put(0x6F, KeyEvent.VK_O);
regularKeyCodesMap.put(0x50, KeyEvent.VK_P);
regularKeyCodesMap.put(0x70, KeyEvent.VK_P);
regularKeyCodesMap.put(0x51, KeyEvent.VK_Q);
regularKeyCodesMap.put(0x71, KeyEvent.VK_Q);
regularKeyCodesMap.put(0x52, KeyEvent.VK_R);
regularKeyCodesMap.put(0x72, KeyEvent.VK_R);
regularKeyCodesMap.put(0x53, KeyEvent.VK_S);
regularKeyCodesMap.put(0x73, KeyEvent.VK_S);
regularKeyCodesMap.put(0x54, KeyEvent.VK_T);
regularKeyCodesMap.put(0x74, KeyEvent.VK_T);
regularKeyCodesMap.put(0x55, KeyEvent.VK_U);
regularKeyCodesMap.put(0x75, KeyEvent.VK_U);
regularKeyCodesMap.put(0x56, KeyEvent.VK_V);
regularKeyCodesMap.put(0x76, KeyEvent.VK_V);
regularKeyCodesMap.put(0x57, KeyEvent.VK_W);
regularKeyCodesMap.put(0x77, KeyEvent.VK_W);
regularKeyCodesMap.put(0x58, KeyEvent.VK_X);
regularKeyCodesMap.put(0x78, KeyEvent.VK_X);
regularKeyCodesMap.put(0x59, KeyEvent.VK_Y);
regularKeyCodesMap.put(0x79, KeyEvent.VK_Y);
regularKeyCodesMap.put(0x5A, KeyEvent.VK_Z);
regularKeyCodesMap.put(0x7A, KeyEvent.VK_Z);
regularKeyCodesMap.put(0x5B, KeyEvent.VK_OPEN_BRACKET);
regularKeyCodesMap.put(0x5C, KeyEvent.VK_BACK_SLASH);
regularKeyCodesMap.put(0x5D, KeyEvent.VK_CLOSE_BRACKET);
// regularKeyCodesMap.put(0x60, KeyEvent.VK_NUMPAD0);
// regularKeyCodesMap.put(0x61, KeyEvent.VK_NUMPAD1);
// regularKeyCodesMap.put(0x62, KeyEvent.VK_NUMPAD2);
// regularKeyCodesMap.put(0x63, KeyEvent.VK_NUMPAD3);
// regularKeyCodesMap.put(0x64, KeyEvent.VK_NUMPAD4);
// regularKeyCodesMap.put(0x65, KeyEvent.VK_NUMPAD5);
// regularKeyCodesMap.put(0x66, KeyEvent.VK_NUMPAD6);
// regularKeyCodesMap.put(0x67, KeyEvent.VK_NUMPAD7);
// regularKeyCodesMap.put(0x68, KeyEvent.VK_NUMPAD8);
// regularKeyCodesMap.put(0x69, KeyEvent.VK_NUMPAD9);
regularKeyCodesMap.put(0x6A, KeyEvent.VK_MULTIPLY);
regularKeyCodesMap.put(0x6B, KeyEvent.VK_ADD);
regularKeyCodesMap.put(0x6C, KeyEvent.VK_SEPARATER);
regularKeyCodesMap.put(0x6D, KeyEvent.VK_SUBTRACT);
regularKeyCodesMap.put(0x6E, KeyEvent.VK_DECIMAL);
regularKeyCodesMap.put(0x6F, KeyEvent.VK_DIVIDE);
regularKeyCodesMap.put(0x7F, KeyEvent.VK_DELETE);
regularKeyCodesMap.put(0xC0, KeyEvent.VK_BACK_QUOTE);
regularKeyCodesMap.put(0xDE, KeyEvent.VK_QUOTE);
regularKeyCodesMap.put(0x26, KeyEvent.VK_AMPERSAND);
regularKeyCodesMap.put(0x2A, KeyEvent.VK_ASTERISK);
regularKeyCodesMap.put(0x22, KeyEvent.VK_QUOTEDBL);
regularKeyCodesMap.put(0x3C, KeyEvent.VK_LESS);
regularKeyCodesMap.put(0x3E, KeyEvent.VK_GREATER);
regularKeyCodesMap.put(0x7B, KeyEvent.VK_BRACELEFT);
regularKeyCodesMap.put(0x7D, KeyEvent.VK_BRACERIGHT);
regularKeyCodesMap.put(0x40, KeyEvent.VK_AT);
regularKeyCodesMap.put(0x3A, KeyEvent.VK_COLON);
regularKeyCodesMap.put(0x5E, KeyEvent.VK_CIRCUMFLEX);
regularKeyCodesMap.put(0x24, KeyEvent.VK_DOLLAR);
regularKeyCodesMap.put(0x20AC, KeyEvent.VK_EURO_SIGN);
regularKeyCodesMap.put(0x21, KeyEvent.VK_EXCLAMATION_MARK);
regularKeyCodesMap.put(0xA1, KeyEvent.VK_INVERTED_EXCLAMATION_MARK);
regularKeyCodesMap.put(0x28, KeyEvent.VK_LEFT_PARENTHESIS);
regularKeyCodesMap.put(0x23, KeyEvent.VK_NUMBER_SIGN);
regularKeyCodesMap.put(0x2B, KeyEvent.VK_PLUS);
regularKeyCodesMap.put(0x29, KeyEvent.VK_RIGHT_PARENTHESIS);
regularKeyCodesMap.put(0x5F, KeyEvent.VK_UNDERSCORE);
extendedKeyCodesSet.add(0x01000000+0x0060);
extendedKeyCodesSet.add(0x01000000+0x007C);
extendedKeyCodesSet.add(0x01000000+0x007E);
extendedKeyCodesSet.add(0x01000000+0x00A2);
extendedKeyCodesSet.add(0x01000000+0x00A3);
extendedKeyCodesSet.add(0x01000000+0x00A5);
extendedKeyCodesSet.add(0x01000000+0x00A7);
extendedKeyCodesSet.add(0x01000000+0x00A8);
extendedKeyCodesSet.add(0x01000000+0x00AB);
extendedKeyCodesSet.add(0x01000000+0x00B0);
extendedKeyCodesSet.add(0x01000000+0x00B1);
extendedKeyCodesSet.add(0x01000000+0x00B2);
extendedKeyCodesSet.add(0x01000000+0x00B3);
extendedKeyCodesSet.add(0x01000000+0x00B4);
extendedKeyCodesSet.add(0x01000000+0x00B5);
extendedKeyCodesSet.add(0x01000000+0x00B6);
extendedKeyCodesSet.add(0x01000000+0x00B7);
extendedKeyCodesSet.add(0x01000000+0x00B9);
extendedKeyCodesSet.add(0x01000000+0x00BA);
extendedKeyCodesSet.add(0x01000000+0x00BB);
extendedKeyCodesSet.add(0x01000000+0x00BC);
extendedKeyCodesSet.add(0x01000000+0x00BD);
extendedKeyCodesSet.add(0x01000000+0x00BE);
extendedKeyCodesSet.add(0x01000000+0x00BF);
extendedKeyCodesSet.add(0x01000000+0x00C4);
extendedKeyCodesSet.add(0x01000000+0x00C5);
extendedKeyCodesSet.add(0x01000000+0x00C6);
extendedKeyCodesSet.add(0x01000000+0x00C7);
extendedKeyCodesSet.add(0x01000000+0x00D1);
extendedKeyCodesSet.add(0x01000000+0x00D6);
extendedKeyCodesSet.add(0x01000000+0x00D7);
extendedKeyCodesSet.add(0x01000000+0x00D8);
extendedKeyCodesSet.add(0x01000000+0x00DF);
extendedKeyCodesSet.add(0x01000000+0x00E0);
extendedKeyCodesSet.add(0x01000000+0x00E1);
extendedKeyCodesSet.add(0x01000000+0x00E2);
extendedKeyCodesSet.add(0x01000000+0x00E4);
extendedKeyCodesSet.add(0x01000000+0x00E5);
extendedKeyCodesSet.add(0x01000000+0x00E6);
extendedKeyCodesSet.add(0x01000000+0x00E7);
extendedKeyCodesSet.add(0x01000000+0x00E8);
extendedKeyCodesSet.add(0x01000000+0x00E9);
extendedKeyCodesSet.add(0x01000000+0x00EA);
extendedKeyCodesSet.add(0x01000000+0x00EB);
extendedKeyCodesSet.add(0x01000000+0x00EC);
extendedKeyCodesSet.add(0x01000000+0x00ED);
extendedKeyCodesSet.add(0x01000000+0x00EE);
extendedKeyCodesSet.add(0x01000000+0x00F0);
extendedKeyCodesSet.add(0x01000000+0x00F1);
extendedKeyCodesSet.add(0x01000000+0x00F2);
extendedKeyCodesSet.add(0x01000000+0x00F3);
extendedKeyCodesSet.add(0x01000000+0x00F4);
extendedKeyCodesSet.add(0x01000000+0x00F5);
extendedKeyCodesSet.add(0x01000000+0x00F6);
extendedKeyCodesSet.add(0x01000000+0x00F7);
extendedKeyCodesSet.add(0x01000000+0x00F8);
extendedKeyCodesSet.add(0x01000000+0x00F9);
extendedKeyCodesSet.add(0x01000000+0x00FA);
extendedKeyCodesSet.add(0x01000000+0x00FB);
extendedKeyCodesSet.add(0x01000000+0x00FC);
extendedKeyCodesSet.add(0x01000000+0x00FD);
extendedKeyCodesSet.add(0x01000000+0x00FE);
extendedKeyCodesSet.add(0x01000000+0x0105);
extendedKeyCodesSet.add(0x01000000+0x02DB);
extendedKeyCodesSet.add(0x01000000+0x0142);
extendedKeyCodesSet.add(0x01000000+0x013E);
extendedKeyCodesSet.add(0x01000000+0x015B);
extendedKeyCodesSet.add(0x01000000+0x0161);
extendedKeyCodesSet.add(0x01000000+0x015F);
extendedKeyCodesSet.add(0x01000000+0x0165);
extendedKeyCodesSet.add(0x01000000+0x017E);
extendedKeyCodesSet.add(0x01000000+0x017C);
extendedKeyCodesSet.add(0x01000000+0x0103);
extendedKeyCodesSet.add(0x01000000+0x0107);
extendedKeyCodesSet.add(0x01000000+0x010D);
extendedKeyCodesSet.add(0x01000000+0x0119);
extendedKeyCodesSet.add(0x01000000+0x011B);
extendedKeyCodesSet.add(0x01000000+0x0111);
extendedKeyCodesSet.add(0x01000000+0x0148);
extendedKeyCodesSet.add(0x01000000+0x0151);
extendedKeyCodesSet.add(0x01000000+0x0171);
extendedKeyCodesSet.add(0x01000000+0x0159);
extendedKeyCodesSet.add(0x01000000+0x016F);
extendedKeyCodesSet.add(0x01000000+0x0163);
extendedKeyCodesSet.add(0x01000000+0x02D9);
extendedKeyCodesSet.add(0x01000000+0x0130);
extendedKeyCodesSet.add(0x01000000+0x0127);
extendedKeyCodesSet.add(0x01000000+0x0125);
extendedKeyCodesSet.add(0x01000000+0x0131);
extendedKeyCodesSet.add(0x01000000+0x011F);
extendedKeyCodesSet.add(0x01000000+0x0135);
extendedKeyCodesSet.add(0x01000000+0x010B);
extendedKeyCodesSet.add(0x01000000+0x0109);
extendedKeyCodesSet.add(0x01000000+0x0121);
extendedKeyCodesSet.add(0x01000000+0x011D);
extendedKeyCodesSet.add(0x01000000+0x016D);
extendedKeyCodesSet.add(0x01000000+0x015D);
extendedKeyCodesSet.add(0x01000000+0x0138);
extendedKeyCodesSet.add(0x01000000+0x0157);
extendedKeyCodesSet.add(0x01000000+0x013C);
extendedKeyCodesSet.add(0x01000000+0x0113);
extendedKeyCodesSet.add(0x01000000+0x0123);
extendedKeyCodesSet.add(0x01000000+0x0167);
extendedKeyCodesSet.add(0x01000000+0x014B);
extendedKeyCodesSet.add(0x01000000+0x0101);
extendedKeyCodesSet.add(0x01000000+0x012F);
extendedKeyCodesSet.add(0x01000000+0x0117);
extendedKeyCodesSet.add(0x01000000+0x012B);
extendedKeyCodesSet.add(0x01000000+0x0146);
extendedKeyCodesSet.add(0x01000000+0x014D);
extendedKeyCodesSet.add(0x01000000+0x0137);
extendedKeyCodesSet.add(0x01000000+0x0173);
extendedKeyCodesSet.add(0x01000000+0x016B);
extendedKeyCodesSet.add(0x01000000+0x0153);
extendedKeyCodesSet.add(0x01000000+0x30FC);
extendedKeyCodesSet.add(0x01000000+0x30A2);
extendedKeyCodesSet.add(0x01000000+0x30A4);
extendedKeyCodesSet.add(0x01000000+0x30A6);
extendedKeyCodesSet.add(0x01000000+0x30A8);
extendedKeyCodesSet.add(0x01000000+0x30AA);
extendedKeyCodesSet.add(0x01000000+0x30AB);
extendedKeyCodesSet.add(0x01000000+0x30AD);
extendedKeyCodesSet.add(0x01000000+0x30AF);
extendedKeyCodesSet.add(0x01000000+0x30B1);
extendedKeyCodesSet.add(0x01000000+0x30B3);
extendedKeyCodesSet.add(0x01000000+0x30B5);
extendedKeyCodesSet.add(0x01000000+0x30B7);
extendedKeyCodesSet.add(0x01000000+0x30B9);
extendedKeyCodesSet.add(0x01000000+0x30BB);
extendedKeyCodesSet.add(0x01000000+0x30BD);
extendedKeyCodesSet.add(0x01000000+0x30BF);
extendedKeyCodesSet.add(0x01000000+0x30C1);
extendedKeyCodesSet.add(0x01000000+0x30C4);
extendedKeyCodesSet.add(0x01000000+0x30C6);
extendedKeyCodesSet.add(0x01000000+0x30C8);
extendedKeyCodesSet.add(0x01000000+0x30CA);
extendedKeyCodesSet.add(0x01000000+0x30CB);
extendedKeyCodesSet.add(0x01000000+0x30CC);
extendedKeyCodesSet.add(0x01000000+0x30CD);
extendedKeyCodesSet.add(0x01000000+0x30CE);
extendedKeyCodesSet.add(0x01000000+0x30CF);
extendedKeyCodesSet.add(0x01000000+0x30D2);
extendedKeyCodesSet.add(0x01000000+0x30D5);
extendedKeyCodesSet.add(0x01000000+0x30D8);
extendedKeyCodesSet.add(0x01000000+0x30DB);
extendedKeyCodesSet.add(0x01000000+0x30DE);
extendedKeyCodesSet.add(0x01000000+0x30DF);
extendedKeyCodesSet.add(0x01000000+0x30E0);
extendedKeyCodesSet.add(0x01000000+0x30E1);
extendedKeyCodesSet.add(0x01000000+0x30E2);
extendedKeyCodesSet.add(0x01000000+0x30E4);
extendedKeyCodesSet.add(0x01000000+0x30E6);
extendedKeyCodesSet.add(0x01000000+0x30E8);
extendedKeyCodesSet.add(0x01000000+0x30E9);
extendedKeyCodesSet.add(0x01000000+0x30EA);
extendedKeyCodesSet.add(0x01000000+0x30EB);
extendedKeyCodesSet.add(0x01000000+0x30EC);
extendedKeyCodesSet.add(0x01000000+0x30ED);
extendedKeyCodesSet.add(0x01000000+0x30EF);
extendedKeyCodesSet.add(0x01000000+0x30F3);
extendedKeyCodesSet.add(0x01000000+0x309B);
extendedKeyCodesSet.add(0x01000000+0x309C);
extendedKeyCodesSet.add(0x01000000+0x06F0);
extendedKeyCodesSet.add(0x01000000+0x06F1);
extendedKeyCodesSet.add(0x01000000+0x06F2);
extendedKeyCodesSet.add(0x01000000+0x06F3);
extendedKeyCodesSet.add(0x01000000+0x06F4);
extendedKeyCodesSet.add(0x01000000+0x06F5);
extendedKeyCodesSet.add(0x01000000+0x06F6);
extendedKeyCodesSet.add(0x01000000+0x06F7);
extendedKeyCodesSet.add(0x01000000+0x06F8);
extendedKeyCodesSet.add(0x01000000+0x06F9);
extendedKeyCodesSet.add(0x01000000+0x0670);
extendedKeyCodesSet.add(0x01000000+0x067E);
extendedKeyCodesSet.add(0x01000000+0x0686);
extendedKeyCodesSet.add(0x01000000+0x060C);
extendedKeyCodesSet.add(0x01000000+0x06D4);
extendedKeyCodesSet.add(0x01000000+0x0660);
extendedKeyCodesSet.add(0x01000000+0x0661);
extendedKeyCodesSet.add(0x01000000+0x0662);
extendedKeyCodesSet.add(0x01000000+0x0663);
extendedKeyCodesSet.add(0x01000000+0x0664);
extendedKeyCodesSet.add(0x01000000+0x0665);
extendedKeyCodesSet.add(0x01000000+0x0666);
extendedKeyCodesSet.add(0x01000000+0x0667);
extendedKeyCodesSet.add(0x01000000+0x0668);
extendedKeyCodesSet.add(0x01000000+0x0669);
extendedKeyCodesSet.add(0x01000000+0x061B);
extendedKeyCodesSet.add(0x01000000+0x0621);
extendedKeyCodesSet.add(0x01000000+0x0624);
extendedKeyCodesSet.add(0x01000000+0x0626);
extendedKeyCodesSet.add(0x01000000+0x0627);
extendedKeyCodesSet.add(0x01000000+0x0628);
extendedKeyCodesSet.add(0x01000000+0x0629);
extendedKeyCodesSet.add(0x01000000+0x062A);
extendedKeyCodesSet.add(0x01000000+0x062B);
extendedKeyCodesSet.add(0x01000000+0x062C);
extendedKeyCodesSet.add(0x01000000+0x062D);
extendedKeyCodesSet.add(0x01000000+0x062E);
extendedKeyCodesSet.add(0x01000000+0x062F);
extendedKeyCodesSet.add(0x01000000+0x0630);
extendedKeyCodesSet.add(0x01000000+0x0631);
extendedKeyCodesSet.add(0x01000000+0x0632);
extendedKeyCodesSet.add(0x01000000+0x0633);
extendedKeyCodesSet.add(0x01000000+0x0634);
extendedKeyCodesSet.add(0x01000000+0x0635);
extendedKeyCodesSet.add(0x01000000+0x0636);
extendedKeyCodesSet.add(0x01000000+0x0637);
extendedKeyCodesSet.add(0x01000000+0x0638);
extendedKeyCodesSet.add(0x01000000+0x0639);
extendedKeyCodesSet.add(0x01000000+0x063A);
extendedKeyCodesSet.add(0x01000000+0x0641);
extendedKeyCodesSet.add(0x01000000+0x0642);
extendedKeyCodesSet.add(0x01000000+0x0643);
extendedKeyCodesSet.add(0x01000000+0x0644);
extendedKeyCodesSet.add(0x01000000+0x0645);
extendedKeyCodesSet.add(0x01000000+0x0646);
extendedKeyCodesSet.add(0x01000000+0x0647);
extendedKeyCodesSet.add(0x01000000+0x0648);
extendedKeyCodesSet.add(0x01000000+0x0649);
extendedKeyCodesSet.add(0x01000000+0x064A);
extendedKeyCodesSet.add(0x01000000+0x064E);
extendedKeyCodesSet.add(0x01000000+0x064F);
extendedKeyCodesSet.add(0x01000000+0x0650);
extendedKeyCodesSet.add(0x01000000+0x0652);
extendedKeyCodesSet.add(0x01000000+0x0698);
extendedKeyCodesSet.add(0x01000000+0x06A4);
extendedKeyCodesSet.add(0x01000000+0x06A9);
extendedKeyCodesSet.add(0x01000000+0x06AF);
extendedKeyCodesSet.add(0x01000000+0x06BE);
extendedKeyCodesSet.add(0x01000000+0x06CC);
extendedKeyCodesSet.add(0x01000000+0x06CC);
extendedKeyCodesSet.add(0x01000000+0x06D2);
extendedKeyCodesSet.add(0x01000000+0x0493);
extendedKeyCodesSet.add(0x01000000+0x0497);
extendedKeyCodesSet.add(0x01000000+0x049B);
extendedKeyCodesSet.add(0x01000000+0x049D);
extendedKeyCodesSet.add(0x01000000+0x04A3);
extendedKeyCodesSet.add(0x01000000+0x04AF);
extendedKeyCodesSet.add(0x01000000+0x04B1);
extendedKeyCodesSet.add(0x01000000+0x04B3);
extendedKeyCodesSet.add(0x01000000+0x04B9);
extendedKeyCodesSet.add(0x01000000+0x04BB);
extendedKeyCodesSet.add(0x01000000+0x04D9);
extendedKeyCodesSet.add(0x01000000+0x04E9);
extendedKeyCodesSet.add(0x01000000+0x0452);
extendedKeyCodesSet.add(0x01000000+0x0453);
extendedKeyCodesSet.add(0x01000000+0x0451);
extendedKeyCodesSet.add(0x01000000+0x0454);
extendedKeyCodesSet.add(0x01000000+0x0455);
extendedKeyCodesSet.add(0x01000000+0x0456);
extendedKeyCodesSet.add(0x01000000+0x0457);
extendedKeyCodesSet.add(0x01000000+0x0458);
extendedKeyCodesSet.add(0x01000000+0x0459);
extendedKeyCodesSet.add(0x01000000+0x045A);
extendedKeyCodesSet.add(0x01000000+0x045B);
extendedKeyCodesSet.add(0x01000000+0x045C);
extendedKeyCodesSet.add(0x01000000+0x0491);
extendedKeyCodesSet.add(0x01000000+0x045E);
extendedKeyCodesSet.add(0x01000000+0x045F);
extendedKeyCodesSet.add(0x01000000+0x2116);
extendedKeyCodesSet.add(0x01000000+0x044E);
extendedKeyCodesSet.add(0x01000000+0x0430);
extendedKeyCodesSet.add(0x01000000+0x0431);
extendedKeyCodesSet.add(0x01000000+0x0446);
extendedKeyCodesSet.add(0x01000000+0x0434);
extendedKeyCodesSet.add(0x01000000+0x0435);
extendedKeyCodesSet.add(0x01000000+0x0444);
extendedKeyCodesSet.add(0x01000000+0x0433);
extendedKeyCodesSet.add(0x01000000+0x0445);
extendedKeyCodesSet.add(0x01000000+0x0438);
extendedKeyCodesSet.add(0x01000000+0x0439);
extendedKeyCodesSet.add(0x01000000+0x043A);
extendedKeyCodesSet.add(0x01000000+0x043B);
extendedKeyCodesSet.add(0x01000000+0x043C);
extendedKeyCodesSet.add(0x01000000+0x043D);
extendedKeyCodesSet.add(0x01000000+0x043E);
extendedKeyCodesSet.add(0x01000000+0x043F);
extendedKeyCodesSet.add(0x01000000+0x044F);
extendedKeyCodesSet.add(0x01000000+0x0440);
extendedKeyCodesSet.add(0x01000000+0x0441);
extendedKeyCodesSet.add(0x01000000+0x0442);
extendedKeyCodesSet.add(0x01000000+0x0443);
extendedKeyCodesSet.add(0x01000000+0x0436);
extendedKeyCodesSet.add(0x01000000+0x0432);
extendedKeyCodesSet.add(0x01000000+0x044C);
extendedKeyCodesSet.add(0x01000000+0x044B);
extendedKeyCodesSet.add(0x01000000+0x0437);
extendedKeyCodesSet.add(0x01000000+0x0448);
extendedKeyCodesSet.add(0x01000000+0x044D);
extendedKeyCodesSet.add(0x01000000+0x0449);
extendedKeyCodesSet.add(0x01000000+0x0447);
extendedKeyCodesSet.add(0x01000000+0x044A);
extendedKeyCodesSet.add(0x01000000+0x2015);
extendedKeyCodesSet.add(0x01000000+0x03B1);
extendedKeyCodesSet.add(0x01000000+0x03B2);
extendedKeyCodesSet.add(0x01000000+0x03B3);
extendedKeyCodesSet.add(0x01000000+0x03B4);
extendedKeyCodesSet.add(0x01000000+0x03B5);
extendedKeyCodesSet.add(0x01000000+0x03B6);
extendedKeyCodesSet.add(0x01000000+0x03B7);
extendedKeyCodesSet.add(0x01000000+0x03B8);
extendedKeyCodesSet.add(0x01000000+0x03B9);
extendedKeyCodesSet.add(0x01000000+0x03BA);
extendedKeyCodesSet.add(0x01000000+0x03BB);
extendedKeyCodesSet.add(0x01000000+0x03BC);
extendedKeyCodesSet.add(0x01000000+0x03BD);
extendedKeyCodesSet.add(0x01000000+0x03BE);
extendedKeyCodesSet.add(0x01000000+0x03BF);
extendedKeyCodesSet.add(0x01000000+0x03C0);
extendedKeyCodesSet.add(0x01000000+0x03C1);
extendedKeyCodesSet.add(0x01000000+0x03C3);
extendedKeyCodesSet.add(0x01000000+0x03C2);
extendedKeyCodesSet.add(0x01000000+0x03C4);
extendedKeyCodesSet.add(0x01000000+0x03C5);
extendedKeyCodesSet.add(0x01000000+0x03C6);
extendedKeyCodesSet.add(0x01000000+0x03C7);
extendedKeyCodesSet.add(0x01000000+0x03C8);
extendedKeyCodesSet.add(0x01000000+0x03C9);
extendedKeyCodesSet.add(0x01000000+0x2190);
extendedKeyCodesSet.add(0x01000000+0x2192);
extendedKeyCodesSet.add(0x01000000+0x2193);
extendedKeyCodesSet.add(0x01000000+0x2013);
extendedKeyCodesSet.add(0x01000000+0x201C);
extendedKeyCodesSet.add(0x01000000+0x201D);
extendedKeyCodesSet.add(0x01000000+0x201E);
extendedKeyCodesSet.add(0x01000000+0x05D0);
extendedKeyCodesSet.add(0x01000000+0x05D1);
extendedKeyCodesSet.add(0x01000000+0x05D2);
extendedKeyCodesSet.add(0x01000000+0x05D3);
extendedKeyCodesSet.add(0x01000000+0x05D4);
extendedKeyCodesSet.add(0x01000000+0x05D5);
extendedKeyCodesSet.add(0x01000000+0x05D6);
extendedKeyCodesSet.add(0x01000000+0x05D7);
extendedKeyCodesSet.add(0x01000000+0x05D8);
extendedKeyCodesSet.add(0x01000000+0x05D9);
extendedKeyCodesSet.add(0x01000000+0x05DA);
extendedKeyCodesSet.add(0x01000000+0x05DB);
extendedKeyCodesSet.add(0x01000000+0x05DC);
extendedKeyCodesSet.add(0x01000000+0x05DD);
extendedKeyCodesSet.add(0x01000000+0x05DE);
extendedKeyCodesSet.add(0x01000000+0x05DF);
extendedKeyCodesSet.add(0x01000000+0x05E0);
extendedKeyCodesSet.add(0x01000000+0x05E1);
extendedKeyCodesSet.add(0x01000000+0x05E2);
extendedKeyCodesSet.add(0x01000000+0x05E3);
extendedKeyCodesSet.add(0x01000000+0x05E4);
extendedKeyCodesSet.add(0x01000000+0x05E5);
extendedKeyCodesSet.add(0x01000000+0x05E6);
extendedKeyCodesSet.add(0x01000000+0x05E7);
extendedKeyCodesSet.add(0x01000000+0x05E8);
extendedKeyCodesSet.add(0x01000000+0x05E9);
extendedKeyCodesSet.add(0x01000000+0x05EA);
extendedKeyCodesSet.add(0x01000000+0x0E01);
extendedKeyCodesSet.add(0x01000000+0x0E02);
extendedKeyCodesSet.add(0x01000000+0x0E03);
extendedKeyCodesSet.add(0x01000000+0x0E04);
extendedKeyCodesSet.add(0x01000000+0x0E05);
extendedKeyCodesSet.add(0x01000000+0x0E07);
extendedKeyCodesSet.add(0x01000000+0x0E08);
extendedKeyCodesSet.add(0x01000000+0x0E0A);
extendedKeyCodesSet.add(0x01000000+0x0E0C);
extendedKeyCodesSet.add(0x01000000+0x0E14);
extendedKeyCodesSet.add(0x01000000+0x0E15);
extendedKeyCodesSet.add(0x01000000+0x0E16);
extendedKeyCodesSet.add(0x01000000+0x0E17);
extendedKeyCodesSet.add(0x01000000+0x0E19);
extendedKeyCodesSet.add(0x01000000+0x0E1A);
extendedKeyCodesSet.add(0x01000000+0x0E1B);
extendedKeyCodesSet.add(0x01000000+0x0E1C);
extendedKeyCodesSet.add(0x01000000+0x0E1D);
extendedKeyCodesSet.add(0x01000000+0x0E1E);
extendedKeyCodesSet.add(0x01000000+0x0E1F);
extendedKeyCodesSet.add(0x01000000+0x0E20);
extendedKeyCodesSet.add(0x01000000+0x0E21);
extendedKeyCodesSet.add(0x01000000+0x0E22);
extendedKeyCodesSet.add(0x01000000+0x0E23);
extendedKeyCodesSet.add(0x01000000+0x0E25);
extendedKeyCodesSet.add(0x01000000+0x0E27);
extendedKeyCodesSet.add(0x01000000+0x0E2A);
extendedKeyCodesSet.add(0x01000000+0x0E2B);
extendedKeyCodesSet.add(0x01000000+0x0E2D);
extendedKeyCodesSet.add(0x01000000+0x0E30);
extendedKeyCodesSet.add(0x01000000+0x0E31);
extendedKeyCodesSet.add(0x01000000+0x0E32);
extendedKeyCodesSet.add(0x01000000+0x0E33);
extendedKeyCodesSet.add(0x01000000+0x0E34);
extendedKeyCodesSet.add(0x01000000+0x0E35);
extendedKeyCodesSet.add(0x01000000+0x0E36);
extendedKeyCodesSet.add(0x01000000+0x0E37);
extendedKeyCodesSet.add(0x01000000+0x0E38);
extendedKeyCodesSet.add(0x01000000+0x0E39);
extendedKeyCodesSet.add(0x01000000+0x0E3F);
extendedKeyCodesSet.add(0x01000000+0x0E40);
extendedKeyCodesSet.add(0x01000000+0x0E41);
extendedKeyCodesSet.add(0x01000000+0x0E43);
extendedKeyCodesSet.add(0x01000000+0x0E44);
extendedKeyCodesSet.add(0x01000000+0x0E45);
extendedKeyCodesSet.add(0x01000000+0x0E46);
extendedKeyCodesSet.add(0x01000000+0x0E47);
extendedKeyCodesSet.add(0x01000000+0x0E48);
extendedKeyCodesSet.add(0x01000000+0x0E49);
extendedKeyCodesSet.add(0x01000000+0x0E50);
extendedKeyCodesSet.add(0x01000000+0x0E51);
extendedKeyCodesSet.add(0x01000000+0x0E52);
extendedKeyCodesSet.add(0x01000000+0x0E53);
extendedKeyCodesSet.add(0x01000000+0x0E54);
extendedKeyCodesSet.add(0x01000000+0x0E55);
extendedKeyCodesSet.add(0x01000000+0x0E56);
extendedKeyCodesSet.add(0x01000000+0x0E57);
extendedKeyCodesSet.add(0x01000000+0x0E58);
extendedKeyCodesSet.add(0x01000000+0x0E59);
extendedKeyCodesSet.add(0x01000000+0x0587);
extendedKeyCodesSet.add(0x01000000+0x0589);
extendedKeyCodesSet.add(0x01000000+0x0589);
extendedKeyCodesSet.add(0x01000000+0x055D);
extendedKeyCodesSet.add(0x01000000+0x055D);
extendedKeyCodesSet.add(0x01000000+0x055B);
extendedKeyCodesSet.add(0x01000000+0x055B);
extendedKeyCodesSet.add(0x01000000+0x055E);
extendedKeyCodesSet.add(0x01000000+0x055E);
extendedKeyCodesSet.add(0x01000000+0x0561);
extendedKeyCodesSet.add(0x01000000+0x0562);
extendedKeyCodesSet.add(0x01000000+0x0563);
extendedKeyCodesSet.add(0x01000000+0x0564);
extendedKeyCodesSet.add(0x01000000+0x0565);
extendedKeyCodesSet.add(0x01000000+0x0566);
extendedKeyCodesSet.add(0x01000000+0x0567);
extendedKeyCodesSet.add(0x01000000+0x0568);
extendedKeyCodesSet.add(0x01000000+0x0569);
extendedKeyCodesSet.add(0x01000000+0x056A);
extendedKeyCodesSet.add(0x01000000+0x056B);
extendedKeyCodesSet.add(0x01000000+0x056C);
extendedKeyCodesSet.add(0x01000000+0x056D);
extendedKeyCodesSet.add(0x01000000+0x056E);
extendedKeyCodesSet.add(0x01000000+0x056F);
extendedKeyCodesSet.add(0x01000000+0x0570);
extendedKeyCodesSet.add(0x01000000+0x0571);
extendedKeyCodesSet.add(0x01000000+0x0572);
extendedKeyCodesSet.add(0x01000000+0x0573);
extendedKeyCodesSet.add(0x01000000+0x0574);
extendedKeyCodesSet.add(0x01000000+0x0575);
extendedKeyCodesSet.add(0x01000000+0x0576);
extendedKeyCodesSet.add(0x01000000+0x0577);
extendedKeyCodesSet.add(0x01000000+0x0578);
extendedKeyCodesSet.add(0x01000000+0x0579);
extendedKeyCodesSet.add(0x01000000+0x057A);
extendedKeyCodesSet.add(0x01000000+0x057B);
extendedKeyCodesSet.add(0x01000000+0x057C);
extendedKeyCodesSet.add(0x01000000+0x057D);
extendedKeyCodesSet.add(0x01000000+0x057E);
extendedKeyCodesSet.add(0x01000000+0x057F);
extendedKeyCodesSet.add(0x01000000+0x0580);
extendedKeyCodesSet.add(0x01000000+0x0581);
extendedKeyCodesSet.add(0x01000000+0x0582);
extendedKeyCodesSet.add(0x01000000+0x0583);
extendedKeyCodesSet.add(0x01000000+0x0584);
extendedKeyCodesSet.add(0x01000000+0x0585);
extendedKeyCodesSet.add(0x01000000+0x0586);
extendedKeyCodesSet.add(0x01000000+0x10D0);
extendedKeyCodesSet.add(0x01000000+0x10D1);
extendedKeyCodesSet.add(0x01000000+0x10D2);
extendedKeyCodesSet.add(0x01000000+0x10D3);
extendedKeyCodesSet.add(0x01000000+0x10D4);
extendedKeyCodesSet.add(0x01000000+0x10D5);
extendedKeyCodesSet.add(0x01000000+0x10D6);
extendedKeyCodesSet.add(0x01000000+0x10D7);
extendedKeyCodesSet.add(0x01000000+0x10D8);
extendedKeyCodesSet.add(0x01000000+0x10D9);
extendedKeyCodesSet.add(0x01000000+0x10DA);
extendedKeyCodesSet.add(0x01000000+0x10DB);
extendedKeyCodesSet.add(0x01000000+0x10DC);
extendedKeyCodesSet.add(0x01000000+0x10DD);
extendedKeyCodesSet.add(0x01000000+0x10DE);
extendedKeyCodesSet.add(0x01000000+0x10DF);
extendedKeyCodesSet.add(0x01000000+0x10E0);
extendedKeyCodesSet.add(0x01000000+0x10E1);
extendedKeyCodesSet.add(0x01000000+0x10E2);
extendedKeyCodesSet.add(0x01000000+0x10E3);
extendedKeyCodesSet.add(0x01000000+0x10E4);
extendedKeyCodesSet.add(0x01000000+0x10E5);
extendedKeyCodesSet.add(0x01000000+0x10E6);
extendedKeyCodesSet.add(0x01000000+0x10E7);
extendedKeyCodesSet.add(0x01000000+0x10E8);
extendedKeyCodesSet.add(0x01000000+0x10E9);
extendedKeyCodesSet.add(0x01000000+0x10EA);
extendedKeyCodesSet.add(0x01000000+0x10EB);
extendedKeyCodesSet.add(0x01000000+0x10EC);
extendedKeyCodesSet.add(0x01000000+0x10ED);
extendedKeyCodesSet.add(0x01000000+0x10EE);
extendedKeyCodesSet.add(0x01000000+0x10EF);
extendedKeyCodesSet.add(0x01000000+0x10F0);
extendedKeyCodesSet.add(0x01000000+0x01E7);
extendedKeyCodesSet.add(0x01000000+0x0259);
extendedKeyCodesSet.add(0x01000000+0x1EB9);
extendedKeyCodesSet.add(0x01000000+0x1ECB);
extendedKeyCodesSet.add(0x01000000+0x1ECD);
extendedKeyCodesSet.add(0x01000000+0x1EE5);
extendedKeyCodesSet.add(0x01000000+0x01A1);
extendedKeyCodesSet.add(0x01000000+0x01B0);
extendedKeyCodesSet.add(0x01000000+0x20AB);
}
}

View File

@ -179,9 +179,9 @@ public class HeadlessToolkit extends Toolkit
throw new HeadlessException();
}
public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) throws HeadlessException {
KeyboardFocusManagerPeerImpl peer = new KeyboardFocusManagerPeerImpl(manager);
return peer;
public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager)
throws HeadlessException {
throw new HeadlessException();
}
public TrayIconPeer createTrayIcon(TrayIcon target)

View File

@ -1,5 +1,5 @@
/*
* Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2003-2009 Sun Microsystems, Inc. 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
@ -27,47 +27,150 @@ package sun.awt;
import java.awt.Component;
import java.awt.KeyboardFocusManager;
import java.awt.Window;
import java.awt.Canvas;
import java.awt.Scrollbar;
import java.awt.Panel;
import java.awt.event.FocusEvent;
import java.awt.peer.KeyboardFocusManagerPeer;
import java.awt.peer.ComponentPeer;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;
public class KeyboardFocusManagerPeerImpl implements KeyboardFocusManagerPeer {
static native Window getNativeFocusedWindow();
static native Component getNativeFocusOwner();
static native void clearNativeGlobalFocusOwner(Window activeWindow);
public abstract class KeyboardFocusManagerPeerImpl implements KeyboardFocusManagerPeer {
KeyboardFocusManagerPeerImpl(KeyboardFocusManager manager) {
private static final Logger focusLog = Logger.getLogger("sun.awt.focus.KeyboardFocusManagerPeerImpl");
private static AWTAccessor.KeyboardFocusManagerAccessor kfmAccessor =
AWTAccessor.getKeyboardFocusManagerAccessor();
// The constants are copied from java.awt.KeyboardFocusManager
public static final int SNFH_FAILURE = 0;
public static final int SNFH_SUCCESS_HANDLED = 1;
public static final int SNFH_SUCCESS_PROCEED = 2;
protected KeyboardFocusManager manager;
public KeyboardFocusManagerPeerImpl(KeyboardFocusManager manager) {
this.manager = manager;
}
public Window getCurrentFocusedWindow() {
return getNativeFocusedWindow();
}
public void setCurrentFocusOwner(Component comp) {
}
public Component getCurrentFocusOwner() {
return getNativeFocusOwner();
}
@Override
public void clearGlobalFocusOwner(Window activeWindow) {
clearNativeGlobalFocusOwner(activeWindow);
if (activeWindow != null) {
Component focusOwner = activeWindow.getFocusOwner();
if (focusLog.isLoggable(Level.FINE)) focusLog.fine("Clearing global focus owner " + focusOwner);
if (focusOwner != null) {
FocusEvent fl = new CausedFocusEvent(focusOwner, FocusEvent.FOCUS_LOST, false, null,
CausedFocusEvent.Cause.CLEAR_GLOBAL_FOCUS_OWNER);
SunToolkit.postPriorityEvent(fl);
}
}
}
/*
* WARNING: Don't call it on the Toolkit thread.
*
* Checks if the component:
* 1) accepts focus on click (in general)
* 2) may be a focus owner (in particular)
*/
public static boolean shouldFocusOnClick(Component component) {
boolean acceptFocusOnClick = false;
// A component is generally allowed to accept focus on click
// if its peer is focusable. There're some exceptions though.
// CANVAS & SCROLLBAR accept focus on click
if (component instanceof Canvas ||
component instanceof Scrollbar)
{
acceptFocusOnClick = true;
// PANEL, empty only, accepts focus on click
} else if (component instanceof Panel) {
acceptFocusOnClick = (((Panel)component).getComponentCount() == 0);
// Other components
} else {
ComponentPeer peer = (component != null ? component.getPeer() : null);
acceptFocusOnClick = (peer != null ? peer.isFocusable() : false);
}
return acceptFocusOnClick &&
AWTAccessor.getComponentAccessor().canBeFocusOwner(component);
}
/*
* Posts proper lost/gain focus events to the event queue.
*/
public static boolean deliverFocus(Component lightweightChild,
Component target,
boolean temporary,
boolean focusedWindowChangeAllowed,
long time,
CausedFocusEvent.Cause cause,
Component currentFocusOwner) // provided by the descendant peers
{
if (lightweightChild == null) {
lightweightChild = (Component)target;
}
Component currentOwner = currentFocusOwner;
if (currentOwner != null && currentOwner.getPeer() == null) {
currentOwner = null;
}
if (currentOwner != null) {
FocusEvent fl = new CausedFocusEvent(currentOwner, FocusEvent.FOCUS_LOST,
false, lightweightChild, cause);
if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Posting focus event: " + fl);
SunToolkit.postPriorityEvent(fl);
}
FocusEvent fg = new CausedFocusEvent(lightweightChild, FocusEvent.FOCUS_GAINED,
false, currentOwner, cause);
if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Posting focus event: " + fg);
SunToolkit.postPriorityEvent(fg);
return true;
}
// WARNING: Don't call it on the Toolkit thread.
public static boolean requestFocusFor(Component target, CausedFocusEvent.Cause cause) {
return AWTAccessor.getComponentAccessor().requestFocus(target, cause);
}
// WARNING: Don't call it on the Toolkit thread.
public static int shouldNativelyFocusHeavyweight(Component heavyweight,
Component descendant,
boolean temporary,
boolean focusedWindowChangeAllowed,
long time,
CausedFocusEvent.Cause cause)
{
return kfmAccessor.shouldNativelyFocusHeavyweight(
heavyweight, descendant, temporary, focusedWindowChangeAllowed, time, cause);
}
static Method m_removeLastFocusRequest = null;
public static void removeLastFocusRequest(Component heavyweight) {
try {
if (m_removeLastFocusRequest == null) {
m_removeLastFocusRequest = SunToolkit.getMethod(KeyboardFocusManager.class, "removeLastFocusRequest",
new Class[] {Component.class});
}
m_removeLastFocusRequest.invoke(null, new Object[]{heavyweight});
} catch (InvocationTargetException ite) {
ite.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
kfmAccessor.removeLastFocusRequest(heavyweight);
}
// WARNING: Don't call it on the Toolkit thread.
public static boolean processSynchronousLightweightTransfer(Component heavyweight,
Component descendant,
boolean temporary,
boolean focusedWindowChangeAllowed,
long time)
{
return kfmAccessor.processSynchronousLightweightTransfer(
heavyweight, descendant, temporary, focusedWindowChangeAllowed, time);
}
}

View File

@ -278,19 +278,6 @@ public class NullComponentPeer implements LightweightPeer,
throw new UnsupportedOperationException();
}
/**
* @see java.awt.peer.ContainerPeer#restack
*/
public void restack() {
throw new UnsupportedOperationException();
}
/**
* @see java.awt.peer.ContainerPeer#isRestackSupported
*/
public boolean isRestackSupported() {
return false;
}
public void layout() {
}
@ -305,4 +292,19 @@ public class NullComponentPeer implements LightweightPeer,
*/
public void applyShape(Region shape) {
}
/**
* Lowers this component at the bottom of the above HW peer. If the above parameter
* is null then the method places this component at the top of the Z-order.
*/
public void setZOrder(ComponentPeer above) {
}
public void updateGraphicsData(GraphicsConfiguration gc) {}
public GraphicsConfiguration getAppropriateGraphicsConfiguration(
GraphicsConfiguration gc)
{
return gc;
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -32,14 +32,10 @@ import java.awt.dnd.peer.DragSourceContextPeer;
import java.awt.peer.*;
import java.awt.event.WindowEvent;
import java.awt.event.KeyEvent;
import java.awt.im.spi.InputMethodDescriptor;
import java.awt.image.*;
import java.awt.geom.AffineTransform;
import java.awt.TrayIcon;
import java.awt.SystemTray;
import java.io.*;
import java.net.URL;
import java.net.JarURLConnection;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
@ -49,7 +45,6 @@ import java.util.logging.Logger;
import sun.misc.SoftCache;
import sun.font.FontDesignMetrics;
import sun.awt.im.InputContext;
import sun.awt.im.SimpleInputMethodWindow;
import sun.awt.image.*;
import sun.security.action.GetPropertyAction;
import sun.security.action.GetBooleanAction;
@ -225,10 +220,8 @@ public abstract class SunToolkit extends Toolkit
public abstract RobotPeer createRobot(Robot target, GraphicsDevice screen)
throws AWTException;
public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) throws HeadlessException {
KeyboardFocusManagerPeerImpl peer = new KeyboardFocusManagerPeerImpl(manager);
return peer;
}
public abstract KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager)
throws HeadlessException;
/**
* The AWT lock is typically only used on Unix platforms to synchronize
@ -824,16 +817,31 @@ public abstract class SunToolkit extends Toolkit
}
/**
* Disables erasing of background on the canvas before painting
* if this is supported by the current toolkit.
*
* @throws IllegalStateException if the canvas is not displayable
* @see java.awt.Component#isDisplayable
* Disables erasing of background on the canvas before painting if
* this is supported by the current toolkit. It is recommended to
* call this method early, before the Canvas becomes displayable,
* because some Toolkit implementations do not support changing
* this property once the Canvas becomes displayable.
*/
public void disableBackgroundErase(Canvas canvas) {
if (!canvas.isDisplayable()) {
throw new IllegalStateException("Canvas must have a valid peer");
disableBackgroundEraseImpl(canvas);
}
/**
* Disables the native erasing of the background on the given
* component before painting if this is supported by the current
* toolkit. This only has an effect for certain components such as
* Canvas, Panel and Window. It is recommended to call this method
* early, before the Component becomes displayable, because some
* Toolkit implementations do not support changing this property
* once the Component becomes displayable.
*/
public void disableBackgroundErase(Component component) {
disableBackgroundEraseImpl(component);
}
private void disableBackgroundEraseImpl(Component component) {
AWTAccessor.getComponentAccessor().setBackgroundEraseDisabled(component, true);
}
/**
@ -1972,6 +1980,18 @@ public abstract class SunToolkit extends Toolkit
AWTAutoShutdown.getInstance().dumpPeers(aLog);
}
/**
* Returns the <code>Window</code> ancestor of the component <code>comp</code>.
* @return Window ancestor of the component or component by itself if it is Window;
* null, if component is not a part of window hierarchy
*/
public static Window getContainingWindow(Component comp) {
while (comp != null && !(comp instanceof Window)) {
comp = comp.getParent();
}
return (Window)comp;
}
private static Boolean sunAwtDisableMixing = null;
/**
@ -1995,6 +2015,73 @@ public abstract class SunToolkit extends Toolkit
public boolean isNativeGTKAvailable() {
return false;
}
// Cosntant alpha
public boolean isWindowOpacitySupported() {
return false;
}
// Shaping
public boolean isWindowShapingSupported() {
return false;
}
// Per-pixel alpha
public boolean isWindowTranslucencySupported() {
return false;
}
public boolean isTranslucencyCapable(GraphicsConfiguration gc) {
return false;
}
/**
* Returns whether or not a containing top level window for the passed
* component is
* {@link com.sun.awt.AWTUtilities.Translucency#PERPIXEL_TRANSLUCENT PERPIXEL_TRANSLUCENT}.
*
* @param c a Component which toplevel's to check
* @return {@code true} if the passed component is not null and has a
* containing toplevel window which is opaque (so per-pixel translucency
* is not enabled), {@code false} otherwise
* @see com.sun.awt.AWTUtilities.Translucency#PERPIXEL_TRANSLUCENT
* @see com.sun.awt.AWTUtilities#isWindowOpaque(Window)
*/
public static boolean isContainingTopLevelOpaque(Component c) {
Window w = getContainingWindow(c);
// return w != null && (w).isOpaque();
return w != null && com.sun.awt.AWTUtilities.isWindowOpaque(w);
}
/**
* Returns whether or not a containing top level window for the passed
* component is
* {@link com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT TRANSLUCENT}.
*
* @param c a Component which toplevel's to check
* @return {@code true} if the passed component is not null and has a
* containing toplevel window which has opacity less than
* 1.0f (which means that it is translucent), {@code false} otherwise
* @see com.sun.awt.AWTUtilities.Translucency#TRANSLUCENT
* @see com.sun.awt.AWTUtilities#getWindowOpacity(Window)
*/
public static boolean isContainingTopLevelTranslucent(Component c) {
Window w = getContainingWindow(c);
// return w != null && (w).getOpacity() < 1.0f;
return w != null && com.sun.awt.AWTUtilities.getWindowOpacity((Window)w) < 1.0f;
}
/**
* Returns whether the native system requires using the peer.updateWindow()
* method to update the contents of a non-opaque window, or if usual
* painting procedures are sufficient. The default return value covers
* the X11 systems. On MS Windows this method is overriden in WToolkit
* to return true.
*/
public boolean needUpdateWindow() {
return false;
}
} // class SunToolkit

View File

@ -0,0 +1,102 @@
/*
* Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
#include "utility/rect.h"
#if defined(__cplusplus)
extern "C" {
#endif
/**
* bitsPerPixel must be 32 for now.
* outBuf must be large enough to conatin all the rectangles.
*/
int BitmapToYXBandedRectangles(int bitsPerPixel, int width, int height, unsigned char * buf, RECT_T * outBuf)
{
//XXX: we might want to reuse the code in the splashscreen library,
// though we'd have to deal with the ALPHA_THRESHOLD and different
// image formats in this case.
int widthBytes = width * bitsPerPixel / 8;
int alignedWidth = (((widthBytes - 1) / 4) + 1) * 4;
RECT_T * out = outBuf;
RECT_T *pPrevLine = NULL, *pFirst = out, *pThis = pFirst;
int i, j, i0;
int length;
for (j = 0; j < height; j++) {
/* generate data for a scanline */
unsigned char *pSrc = (unsigned char *) buf + j * alignedWidth;
RECT_T *pLine = pThis;
i = 0;
do {
// pSrc[0,1,2] == B,G,R; pSrc[3] == Alpha
while (i < width && !pSrc[3]) {
pSrc += 4;
++i;
}
if (i >= width)
break;
i0 = i;
while (i < width && pSrc[3]) {
pSrc += 4;
++i;
}
RECT_SET(*pThis, i0, j, i - i0, 1);
++pThis;
} while (i < width);
/* check if the previous scanline is exactly the same, merge if so
(this is the only optimization we can use for YXBanded rectangles,
and win32 supports YXBanded only */
length = pThis - pLine;
if (pPrevLine && pLine - pPrevLine == length) {
for (i = 0; i < length && RECT_EQ_X(pPrevLine[i], pLine[i]); ++i) {
}
if (i == pLine - pPrevLine) {
// do merge
for (i = 0; i < length; i++) {
RECT_INC_HEIGHT(pPrevLine[i]);
}
pThis = pLine;
continue;
}
}
/* or else use the generated scanline */
pPrevLine = pLine;
}
return pThis - pFirst;
}
#if defined(__cplusplus)
}
#endif

View File

@ -0,0 +1,495 @@
/*
* Copyright 2009 Sun Microsystems, Inc. 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. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package sun.awt.X11;
import java.awt.*;
import java.awt.event.*;
import java.awt.peer.TrayIconPeer;
import sun.awt.*;
import java.awt.image.*;
import java.text.BreakIterator;
import java.util.logging.Logger;
import java.util.logging.Level;
import java.util.concurrent.ArrayBlockingQueue;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.lang.reflect.InvocationTargetException;
/**
* An utility window class. This is a base class for Tooltip and Balloon.
*/
public abstract class InfoWindow extends Window {
private Container container;
private Closer closer;
protected InfoWindow(Frame parent, Color borderColor) {
super(parent);
container = new Container() {
@Override
public Insets getInsets() {
return new Insets(1, 1, 1, 1);
}
};
setLayout(new BorderLayout());
setBackground(borderColor);
add(container, BorderLayout.CENTER);
container.setLayout(new BorderLayout());
closer = new Closer();
}
public Component add(Component c) {
container.add(c, BorderLayout.CENTER);
return c;
}
protected void setCloser(Runnable action, int time) {
closer.set(action, time);
}
// Must be executed on EDT.
protected void show(Point corner, int indent) {
assert SunToolkit.isDispatchThreadForAppContext(this);
pack();
Dimension size = getSize();
// TODO: When 6356322 is fixed we should get screen bounds in
// this way: eframe.getGraphicsConfiguration().getBounds().
Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
if (corner.x < scrSize.width/2 && corner.y < scrSize.height/2) { // 1st square
setLocation(corner.x + indent, corner.y + indent);
} else if (corner.x >= scrSize.width/2 && corner.y < scrSize.height/2) { // 2nd square
setLocation(corner.x - indent - size.width, corner.y + indent);
} else if (corner.x < scrSize.width/2 && corner.y >= scrSize.height/2) { // 3rd square
setLocation(corner.x + indent, corner.y - indent - size.height);
} else if (corner.x >= scrSize.width/2 && corner.y >= scrSize.height/2) { // 4th square
setLocation(corner.x - indent - size.width, corner.y - indent - size.height);
}
super.show();
closer.schedule();
}
public void hide() {
closer.close();
}
private class Closer implements Runnable {
Runnable action;
int time;
public void run() {
doClose();
}
void set(Runnable action, int time) {
this.action = action;
this.time = time;
}
void schedule() {
XToolkit.schedule(this, time);
}
void close() {
XToolkit.remove(this);
doClose();
}
// WARNING: this method may be executed on Toolkit thread.
private void doClose() {
SunToolkit.executeOnEventHandlerThread(InfoWindow.this, new Runnable() {
public void run() {
InfoWindow.super.hide();
invalidate();
if (action != null) {
action.run();
}
}
});
}
}
private interface LiveArguments {
/** Whether the target of the InfoWindow is disposed. */
boolean isDisposed();
/** The bounds of the target of the InfoWindow. */
Rectangle getBounds();
}
public static class Tooltip extends InfoWindow {
public interface LiveArguments extends InfoWindow.LiveArguments {
/** The tooltip to be displayed. */
String getTooltipString();
}
private final Object target;
private final LiveArguments liveArguments;
private final Label textLabel = new Label("");
private final Runnable starter = new Runnable() {
public void run() {
display();
}};
private final static int TOOLTIP_SHOW_TIME = 10000;
private final static int TOOLTIP_START_DELAY_TIME = 1000;
private final static int TOOLTIP_MAX_LENGTH = 64;
private final static int TOOLTIP_MOUSE_CURSOR_INDENT = 5;
private final static Color TOOLTIP_BACKGROUND_COLOR = new Color(255, 255, 220);
private final static Font TOOLTIP_TEXT_FONT = XWindow.getDefaultFont();
public Tooltip(Frame parent, Object target,
LiveArguments liveArguments)
{
super(parent, Color.black);
this.target = target;
this.liveArguments = liveArguments;
XTrayIconPeer.suppressWarningString(this);
setCloser(null, TOOLTIP_SHOW_TIME);
textLabel.setBackground(TOOLTIP_BACKGROUND_COLOR);
textLabel.setFont(TOOLTIP_TEXT_FONT);
add(textLabel);
}
/*
* WARNING: this method is executed on Toolkit thread!
*/
private void display() {
String tooltipString = liveArguments.getTooltipString();
if (tooltipString == null) {
return;
} else if (tooltipString.length() > TOOLTIP_MAX_LENGTH) {
textLabel.setText(tooltipString.substring(0, TOOLTIP_MAX_LENGTH));
} else {
textLabel.setText(tooltipString);
}
// Execute on EDT to avoid deadlock (see 6280857).
SunToolkit.executeOnEventHandlerThread(target, new Runnable() {
public void run() {
if (liveArguments.isDisposed()) {
return;
}
Point pointer = (Point)AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
if (!isPointerOverTrayIcon(liveArguments.getBounds())) {
return null;
}
return MouseInfo.getPointerInfo().getLocation();
}
});
if (pointer == null) {
return;
}
show(new Point(pointer.x, pointer.y), TOOLTIP_MOUSE_CURSOR_INDENT);
}
});
}
public void enter() {
XToolkit.schedule(starter, TOOLTIP_START_DELAY_TIME);
}
public void exit() {
XToolkit.remove(starter);
if (isVisible()) {
hide();
}
}
private boolean isPointerOverTrayIcon(Rectangle trayRect) {
Point p = MouseInfo.getPointerInfo().getLocation();
return !(p.x < trayRect.x || p.x > (trayRect.x + trayRect.width) ||
p.y < trayRect.y || p.y > (trayRect.y + trayRect.height));
}
}
public static class Balloon extends InfoWindow {
public interface LiveArguments extends InfoWindow.LiveArguments {
/** The action to be performed upon clicking the baloon. */
String getActionCommand();
}
private final LiveArguments liveArguments;
private final Object target;
private final static int BALLOON_SHOW_TIME = 10000;
private final static int BALLOON_TEXT_MAX_LENGTH = 256;
private final static int BALLOON_WORD_LINE_MAX_LENGTH = 16;
private final static int BALLOON_WORD_LINE_MAX_COUNT = 4;
private final static int BALLOON_ICON_WIDTH = 32;
private final static int BALLOON_ICON_HEIGHT = 32;
private final static int BALLOON_TRAY_ICON_INDENT = 0;
private final static Color BALLOON_CAPTION_BACKGROUND_COLOR = new Color(200, 200 ,255);
private final static Font BALLOON_CAPTION_FONT = new Font(Font.DIALOG, Font.BOLD, 12);
private Panel mainPanel = new Panel();
private Panel captionPanel = new Panel();
private Label captionLabel = new Label("");
private Button closeButton = new Button("X");
private Panel textPanel = new Panel();
private XTrayIconPeer.IconCanvas iconCanvas = new XTrayIconPeer.IconCanvas(BALLOON_ICON_WIDTH, BALLOON_ICON_HEIGHT);
private Label[] lineLabels = new Label[BALLOON_WORD_LINE_MAX_COUNT];
private ActionPerformer ap = new ActionPerformer();
private Image iconImage;
private Image errorImage;
private Image warnImage;
private Image infoImage;
private boolean gtkImagesLoaded;
private Displayer displayer = new Displayer();
public Balloon(Frame parent, Object target, LiveArguments liveArguments) {
super(parent, new Color(90, 80 ,190));
this.liveArguments = liveArguments;
this.target = target;
XTrayIconPeer.suppressWarningString(this);
setCloser(new Runnable() {
public void run() {
if (textPanel != null) {
textPanel.removeAll();
textPanel.setSize(0, 0);
iconCanvas.setSize(0, 0);
XToolkit.awtLock();
try {
displayer.isDisplayed = false;
XToolkit.awtLockNotifyAll();
} finally {
XToolkit.awtUnlock();
}
}
}
}, BALLOON_SHOW_TIME);
add(mainPanel);
captionLabel.setFont(BALLOON_CAPTION_FONT);
captionLabel.addMouseListener(ap);
captionPanel.setLayout(new BorderLayout());
captionPanel.add(captionLabel, BorderLayout.WEST);
captionPanel.add(closeButton, BorderLayout.EAST);
captionPanel.setBackground(BALLOON_CAPTION_BACKGROUND_COLOR);
captionPanel.addMouseListener(ap);
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
hide();
}
});
mainPanel.setLayout(new BorderLayout());
mainPanel.setBackground(Color.white);
mainPanel.add(captionPanel, BorderLayout.NORTH);
mainPanel.add(iconCanvas, BorderLayout.WEST);
mainPanel.add(textPanel, BorderLayout.CENTER);
iconCanvas.addMouseListener(ap);
for (int i = 0; i < BALLOON_WORD_LINE_MAX_COUNT; i++) {
lineLabels[i] = new Label();
lineLabels[i].addMouseListener(ap);
lineLabels[i].setBackground(Color.white);
}
displayer.start();
}
public void display(String caption, String text, String messageType) {
if (!gtkImagesLoaded) {
loadGtkImages();
}
displayer.display(caption, text, messageType);
}
private void _display(String caption, String text, String messageType) {
captionLabel.setText(caption);
BreakIterator iter = BreakIterator.getWordInstance();
if (text != null) {
iter.setText(text);
int start = iter.first(), end;
int nLines = 0;
do {
end = iter.next();
if (end == BreakIterator.DONE ||
text.substring(start, end).length() >= 50)
{
lineLabels[nLines].setText(text.substring(start, end == BreakIterator.DONE ?
iter.last() : end));
textPanel.add(lineLabels[nLines++]);
start = end;
}
if (nLines == BALLOON_WORD_LINE_MAX_COUNT) {
if (end != BreakIterator.DONE) {
lineLabels[nLines - 1].setText(
new String(lineLabels[nLines - 1].getText() + " ..."));
}
break;
}
} while (end != BreakIterator.DONE);
textPanel.setLayout(new GridLayout(nLines, 1));
}
if ("ERROR".equals(messageType)) {
iconImage = errorImage;
} else if ("WARNING".equals(messageType)) {
iconImage = warnImage;
} else if ("INFO".equals(messageType)) {
iconImage = infoImage;
} else {
iconImage = null;
}
if (iconImage != null) {
Dimension tpSize = textPanel.getSize();
iconCanvas.setSize(BALLOON_ICON_WIDTH, (BALLOON_ICON_HEIGHT > tpSize.height ?
BALLOON_ICON_HEIGHT : tpSize.height));
iconCanvas.validate();
}
SunToolkit.executeOnEventHandlerThread(target, new Runnable() {
public void run() {
if (liveArguments.isDisposed()) {
return;
}
Point parLoc = getParent().getLocationOnScreen();
Dimension parSize = getParent().getSize();
show(new Point(parLoc.x + parSize.width/2, parLoc.y + parSize.height/2),
BALLOON_TRAY_ICON_INDENT);
if (iconImage != null) {
iconCanvas.updateImage(iconImage); // call it after the show(..) above
}
}
});
}
public void dispose() {
displayer.interrupt();
super.dispose();
}
private void loadGtkImages() {
if (!gtkImagesLoaded) {
errorImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
"gtk.icon.gtk-dialog-error.6.rtl");
warnImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
"gtk.icon.gtk-dialog-warning.6.rtl");
infoImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
"gtk.icon.gtk-dialog-info.6.rtl");
gtkImagesLoaded = true;
}
}
private class ActionPerformer extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
// hide the balloon by any click
hide();
if (e.getButton() == MouseEvent.BUTTON1) {
ActionEvent aev = new ActionEvent(target, ActionEvent.ACTION_PERFORMED,
liveArguments.getActionCommand(),
e.getWhen(), e.getModifiers());
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(aev);
}
}
}
private class Displayer extends Thread {
final int MAX_CONCURRENT_MSGS = 10;
ArrayBlockingQueue<Message> messageQueue = new ArrayBlockingQueue<Message>(MAX_CONCURRENT_MSGS);
boolean isDisplayed;
Displayer() {
setDaemon(true);
}
public void run() {
while (true) {
Message msg = null;
try {
msg = (Message)messageQueue.take();
} catch (InterruptedException e) {
return;
}
/*
* Wait till the previous message is displayed if any
*/
XToolkit.awtLock();
try {
while (isDisplayed) {
try {
XToolkit.awtLockWait();
} catch (InterruptedException e) {
return;
}
}
isDisplayed = true;
} finally {
XToolkit.awtUnlock();
}
_display(msg.caption, msg.text, msg.messageType);
}
}
void display(String caption, String text, String messageType) {
messageQueue.offer(new Message(caption, text, messageType));
}
}
private static class Message {
String caption, text, messageType;
Message(String caption, String text, String messageType) {
this.caption = caption;
this.text = text;
this.messageType = messageType;
}
}
}
}

View File

@ -842,6 +842,13 @@ public class XBaseWindow {
| XConstants.ButtonMotionMask);
final int ownerEvents = 1;
//6714678: IDE (Netbeans, Eclipse, JDeveloper) Debugger hangs
//process on Linux
//The user must pass the sun.awt.disablegrab property to disable
//taking grabs. This prevents hanging of the GUI when a breakpoint
//is hit while a popup window taking the grab is open.
if (!XToolkit.getSunAwtDisableGrab()) {
int ptrGrab = XlibWrapper.XGrabPointer(XToolkit.getDisplay(),
getContentWindow(), ownerEvents, eventMask, XConstants.GrabModeAsync,
XConstants.GrabModeAsync, XConstants.None, (XWM.isMotif() ? XToolkit.arrowCursor : XConstants.None),
@ -864,6 +871,7 @@ public class XBaseWindow {
grabLog.fine(" Grab Failure - keyboard");
return false;
}
}
if (prevGrabWindow != null) {
prevGrabWindow.ungrabInputImpl();
}
@ -882,8 +890,10 @@ public class XBaseWindow {
grabLog.log(Level.FINE, "UnGrab input on {0}", new Object[] {grabWindow});
if (grabWindow != null) {
grabWindow.ungrabInputImpl();
if (!XToolkit.getSunAwtDisableGrab()) {
XlibWrapper.XUngrabPointer(XToolkit.getDisplay(), XConstants.CurrentTime);
XlibWrapper.XUngrabKeyboard(XToolkit.getDisplay(), XConstants.CurrentTime);
}
XAwtState.setGrabWindow(null);
// we need to call XFlush() here to force ungrab
// see 6384219 for details

View File

@ -27,7 +27,6 @@ package sun.awt.X11;
import java.awt.*;
import java.awt.peer.*;
import sun.awt.ComponentAccessor;
import sun.awt.SunToolkit;
import sun.awt.X11GraphicsConfig;
@ -54,36 +53,19 @@ class XCanvasPeer extends XComponentPeer implements CanvasPeer {
}
}
void resetTargetGC(Component target) {
ComponentAccessor.resetGC(target);
}
/*
* Called when the Window this
* Canvas is on is moved onto another Xinerama screen.
*
* Canvases can be created with a non-defulat GraphicsConfiguration. The
* GraphicsConfiguration needs to be changed to one on the new screen,
* preferably with the same visual ID.
*
* Up-called for other windows peer instances (XPanelPeer, XWindowPeer).
*
* Should only be called from the event thread.
*/
public void displayChanged(int screenNum) {
resetLocalGC(screenNum);
resetTargetGC(target);
}
/* Set graphicsConfig to a GraphicsConfig with the same visual on the new
/* Get a GraphicsConfig with the same visual on the new
* screen, which should be easy in Xinerama mode.
*
* Should only be called from displayChanged(), and therefore only from
* the event thread.
*/
void resetLocalGC(int screenNum) {
public GraphicsConfiguration getAppropriateGraphicsConfiguration(
GraphicsConfiguration gc)
{
if (graphicsConfig == null || gc == null) {
return gc;
}
// Opt: Only need to do if we're not using the default GC
if (graphicsConfig != null) {
int screenNum = ((X11GraphicsDevice)gc.getDevice()).getScreen();
X11GraphicsConfig parentgc;
// save vis id of current gc
int visual = graphicsConfig.getVisual();
@ -106,8 +88,10 @@ class XCanvasPeer extends XComponentPeer implements CanvasPeer {
getScreenDevices()[screenNum].
getDefaultConfiguration();
}
return graphicsConfig;
}
}
protected boolean shouldFocusOnClick() {
// Canvas should always be able to be focused by mouse clicks.
return true;

View File

@ -35,6 +35,7 @@ import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Insets;
import java.awt.KeyboardFocusManager;
@ -76,11 +77,6 @@ import sun.java2d.pipe.Region;
public class XComponentPeer extends XWindow implements ComponentPeer, DropTargetPeer,
BackBufferCapsProvider
{
/* FIX ME: these constants copied from java.awt.KeyboardFocusManager */
static final int SNFH_FAILURE = 0;
static final int SNFH_SUCCESS_HANDLED = 1;
static final int SNFH_SUCCESS_PROCEED = 2;
private static final Logger log = Logger.getLogger("sun.awt.X11.XComponentPeer");
private static final Logger buffersLog = Logger.getLogger("sun.awt.X11.XComponentPeer.multibuffer");
private static final Logger focusLog = Logger.getLogger("sun.awt.X11.focus.XComponentPeer");
@ -166,7 +162,7 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
enableLog.log(Level.FINE, "Initial enable state: {0}", new Object[] {Boolean.valueOf(enabled)});
if (target.isVisible()) {
show();
setVisible(true);
}
}
@ -314,113 +310,27 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
return null;
}
/**
* Returns whether or not this component should be given focus on mouse click.
* Default implementation return whether or not this peer is "focusable"
* Descendants might want to override it to extend/restrict conditions at which this
* component should be focused by click (see MCanvasPeer and MPanelPeer)
*/
protected boolean shouldFocusOnClick() {
return isFocusable();
}
/**
* Checks whether or not this component would be focused by native system if it would be allowed to do so.
* Currently it checks that it displayable, visible, enabled and focusable.
*/
static boolean canBeFocusedByClick(Component component) {
if (component == null) {
return false;
} else {
return component.isDisplayable() && component.isVisible() && component.isEnabled() && component.isFocusable();
}
}
static Window getContainingWindow(Component comp) {
while (comp != null && !(comp instanceof Window)) {
comp = comp.getParent();
}
return (Window)comp;
}
static Method processSynchronousLightweightTransferMethod;
static boolean processSynchronousLightweightTransfer(Component heavyweight, Component descendant,
boolean temporary, boolean focusedWindowChangeAllowed,
long time)
{
try {
if (processSynchronousLightweightTransferMethod == null) {
processSynchronousLightweightTransferMethod =
(Method)AccessController.doPrivileged(
new PrivilegedExceptionAction() {
public Object run() throws IllegalAccessException, NoSuchMethodException
{
Method m = KeyboardFocusManager.class.
getDeclaredMethod("processSynchronousLightweightTransfer",
new Class[] {Component.class, Component.class,
Boolean.TYPE, Boolean.TYPE,
Long.TYPE});
m.setAccessible(true);
return m;
}
});
}
Object[] params = new Object[] {
heavyweight,
descendant,
Boolean.valueOf(temporary),
Boolean.valueOf(focusedWindowChangeAllowed),
Long.valueOf(time)
};
return ((Boolean)processSynchronousLightweightTransferMethod.invoke(null, params)).booleanValue();
} catch (PrivilegedActionException pae) {
pae.printStackTrace();
return false;
} catch (IllegalAccessException iae) {
iae.printStackTrace();
return false;
} catch (IllegalArgumentException iaee) {
iaee.printStackTrace();
return false;
} catch (InvocationTargetException ite) {
ite.printStackTrace();
return false;
}
}
static Method requestFocusWithCause;
static void callRequestFocus(Component target, CausedFocusEvent.Cause cause) {
if (requestFocusWithCause == null) {
requestFocusWithCause = SunToolkit.getMethod(Component.class, "requestFocus", new Class[] {CausedFocusEvent.Cause.class});
}
if (requestFocusWithCause != null) {
try {
requestFocusWithCause.invoke(target, new Object[] {cause});
} catch (Exception e) {
e.printStackTrace();
}
}
}
// TODO: consider moving it to KeyboardFocusManagerPeerImpl
final public boolean requestFocus(Component lightweightChild, boolean temporary,
boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause)
boolean focusedWindowChangeAllowed, long time,
CausedFocusEvent.Cause cause)
{
if (processSynchronousLightweightTransfer(target, lightweightChild, temporary,
if (XKeyboardFocusManagerPeer.
processSynchronousLightweightTransfer(target, lightweightChild, temporary,
focusedWindowChangeAllowed, time))
{
return true;
}
int result = XKeyboardFocusManagerPeer
.shouldNativelyFocusHeavyweight(target, lightweightChild,
temporary, focusedWindowChangeAllowed, time, cause);
int result = XKeyboardFocusManagerPeer.
shouldNativelyFocusHeavyweight(target, lightweightChild,
temporary, focusedWindowChangeAllowed,
time, cause);
switch (result) {
case SNFH_FAILURE:
case XKeyboardFocusManagerPeer.SNFH_FAILURE:
return false;
case SNFH_SUCCESS_PROCEED:
case XKeyboardFocusManagerPeer.SNFH_SUCCESS_PROCEED:
// Currently we just generate focus events like we deal with lightweight instead of calling
// XSetInputFocus on native window
if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Proceeding with request to " +
@ -433,7 +343,7 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
* focus owner which had focus before WLF. So, we should not add request record for such requests
* but store this component in mostRecent - and return true as before for compatibility.
*/
Window parentWindow = getContainingWindow(target);
Window parentWindow = SunToolkit.getContainingWindow(target);
if (parentWindow == null) {
return rejectFocusRequestHelper("WARNING: Parent window is null");
}
@ -454,14 +364,13 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
if (!(res && parentWindow.isFocused())) {
return rejectFocusRequestHelper("Waiting for asynchronous processing of the request");
}
// NOTE: We simulate heavyweight behavior of Motif - component receives focus right
// after request, not after event. Normally, we should better listen for event
// by listeners.
return XKeyboardFocusManagerPeer.simulateMotifRequestFocus(lightweightChild, target, temporary,
focusedWindowChangeAllowed, time, cause);
return XKeyboardFocusManagerPeer.deliverFocus(lightweightChild,
(Component)target,
temporary,
focusedWindowChangeAllowed,
time, cause);
// Motif compatibility code
case SNFH_SUCCESS_HANDLED:
case XKeyboardFocusManagerPeer.SNFH_SUCCESS_HANDLED:
// Either lightweight or excessive request - all events are generated.
return true;
}
@ -470,7 +379,7 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
private boolean rejectFocusRequestHelper(String logMsg) {
if (focusLog.isLoggable(Level.FINER)) focusLog.finer(logMsg);
KeyboardFocusManagerPeerImpl.removeLastFocusRequest(target);
XKeyboardFocusManagerPeer.removeLastFocusRequest(target);
return false;
}
@ -496,10 +405,6 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
xSetVisible(b);
}
public void show() {
setVisible(true);
}
public void hide() {
setVisible(false);
}
@ -618,8 +523,9 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
void handleJavaMouseEvent(MouseEvent e) {
switch (e.getID()) {
case MouseEvent.MOUSE_PRESSED:
if (target == e.getSource() && shouldFocusOnClick()
&& !target.isFocusOwner() && canBeFocusedByClick(target))
if (target == e.getSource() &&
!target.isFocusOwner() &&
XKeyboardFocusManagerPeer.shouldFocusOnClick(target))
{
XWindowPeer parentXWindow = getParentTopLevel();
Window parentWindow = ((Window)parentXWindow.getTarget());
@ -633,7 +539,7 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
// WindowEvent wfg = new WindowEvent(parentWindow, WindowEvent.WINDOW_GAINED_FOCUS);
// parentWindow.dispatchEvent(wfg);
// }
callRequestFocus(target, CausedFocusEvent.Cause.MOUSE_EVENT);
XKeyboardFocusManagerPeer.requestFocusFor(target, CausedFocusEvent.Cause.MOUSE_EVENT);
}
break;
}
@ -1418,58 +1324,20 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
}
}
public void restack() {
synchronized(target.getTreeLock()) {
// Build the list of X windows in the window corresponding to this container
// This list is already in correct Java stacking order
Container cont = (Container)target;
Vector order = new Vector(cont.getComponentCount());
HashSet set = new HashSet();
addTree(order, set, cont);
/**
* Lowers this component at the bottom of the above HW peer. If the above parameter
* is null then the method places this component at the top of the Z-order.
*/
public void setZOrder(ComponentPeer above) {
long aboveWindow = (above != null) ? ((XComponentPeer)above).getWindow() : 0;
XToolkit.awtLock();
try{
// Get the current list of X window in X window. Some of the windows
// might be only native
XQueryTree qt = new XQueryTree(getContentWindow());
try {
if (qt.execute() != 0) {
if (qt.get_nchildren() != 0) {
long pchildren = qt.get_children();
int j = 0; // index to insert
for (int i = 0; i < qt.get_nchildren(); i++) {
Long w = Long.valueOf(Native.getLong(pchildren, i));
if (!set.contains(w)) {
set.add(w);
order.add(j++, w);
}
}
}
}
if (order.size() != 0) {
// Create native array of the windows
long windows = Native.allocateLongArray(order.size());
Native.putLong(windows, order);
// Restack native window according to the new order
XlibWrapper.XRestackWindows(XToolkit.getDisplay(), windows, order.size());
XlibWrapper.unsafe.freeMemory(windows);
}
} finally {
qt.dispose();
}
XlibWrapper.SetZOrder(XToolkit.getDisplay(), getWindow(), aboveWindow);
}finally{
XToolkit.awtUnlock();
}
}
}
public boolean isRestackSupported() {
return true;
}
private void addTree(Collection order, Set set, Container cont) {
for (int i = 0; i < cont.getComponentCount(); i++) {
@ -1560,4 +1428,8 @@ public class XComponentPeer extends XWindow implements ComponentPeer, DropTarget
}
}
}
public void updateGraphicsData(GraphicsConfiguration gc) {
initGraphicsConfiguration();
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2003-2009 Sun Microsystems, Inc. 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
@ -684,4 +684,19 @@ final public class XConstants {
public static final int LSBFirst = 0 ;
public static final int MSBFirst = 1 ;
/* XKB support */
public static final int XkbUseCoreKbd = 0x0100 ;
public static final int XkbNewKeyboardNotify = 0;
public static final int XkbMapNotify = 1;
public static final int XkbStateNotify = 2;
public static final long XkbNewKeyboardNotifyMask = (1L << 0);
public static final long XkbMapNotifyMask = (1L << 1);
public static final long XkbStateNotifyMask = (1L << 2);
public static final long XkbGroupStateMask = (1L << 4);
public static final long XkbKeyTypesMask = (1L<<0);
public static final long XkbKeySymsMask = (1L<<1);
public static final long XkbModifierMapMask = (1L<<2);
public static final long XkbVirtualModsMask = (1L<<6); //server map
}

View File

@ -383,7 +383,7 @@ abstract class XDecoratedPeer extends XWindowPeer {
dimensions.setInsets(getRealInsets());
insets_corrected = true;
if (isMaximized() || isNull(correction)) {
if (isMaximized()) {
return;
}
@ -451,7 +451,7 @@ abstract class XDecoratedPeer extends XWindowPeer {
public Insets getInsets() {
Insets in = copy(getRealInsets());
in.top += getMenuBarHeight() + getWarningWindowHeight();
in.top += getMenuBarHeight();
if (insLog.isLoggable(Level.FINEST)) {
insLog.log(Level.FINEST, "Get insets returns {0}", new Object[] {in});
}
@ -802,6 +802,8 @@ abstract class XDecoratedPeer extends XWindowPeer {
}
reconfigureContentWindow(newDimensions);
updateChildrenSizes();
repositionSecurityWarning();
}
private void checkShellRectSize(Rectangle shellRect) {

View File

@ -184,6 +184,7 @@ public class XEmbedChildProxyPeer implements ComponentPeer, XEventDispatcher{
fl = new FocusEvent(currentOwner, FocusEvent.FOCUS_LOST, false, lightweightChild);
}
// TODO: do we need to wrap in sequenced?
if (fl != null) {
postEvent(XComponentPeer.wrapInSequenced(fl));
}
@ -203,9 +204,9 @@ public class XEmbedChildProxyPeer implements ComponentPeer, XEventDispatcher{
temporary, false, time, cause);
switch (result) {
case XComponentPeer.SNFH_FAILURE:
case XKeyboardFocusManagerPeer.SNFH_FAILURE:
return false;
case XComponentPeer.SNFH_SUCCESS_PROCEED:
case XKeyboardFocusManagerPeer.SNFH_SUCCESS_PROCEED:
// Currently we just generate focus events like we deal with lightweight instead of calling
// XSetInputFocus on native window
@ -235,9 +236,11 @@ public class XEmbedChildProxyPeer implements ComponentPeer, XEventDispatcher{
// NOTE: We simulate heavyweight behavior of Motif - component receives focus right
// after request, not after event. Normally, we should better listen for event
// by listeners.
// TODO: consider replacing with XKeyboardFocusManagerPeer.deliverFocus
return simulateMotifRequestFocus(lightweightChild, temporary, focusedWindowChangeAllowed, time);
// Motif compatibility code
case XComponentPeer.SNFH_SUCCESS_HANDLED:
case XKeyboardFocusManagerPeer.SNFH_SUCCESS_HANDLED:
// Either lightweight or excessive requiest - all events are generated.
return true;
}
@ -379,4 +382,9 @@ public class XEmbedChildProxyPeer implements ComponentPeer, XEventDispatcher{
public void applyShape(Region shape) {
}
public void setZOrder(ComponentPeer above) {
}
public void updateGraphicsData(GraphicsConfiguration gc) {}
}

View File

@ -739,7 +739,17 @@ class XFileDialogPeer extends XDialogPeer implements FileDialogPeer, ActionListe
this.filter = filter;
}
public void show() {
public void dispose() {
FileDialog fd = (FileDialog)fileDialog;
if (fd != null) {
fd.removeAll();
}
super.dispose();
}
// 03/02/2005 b5097243 Pressing 'ESC' on a file dlg does not dispose the dlg on Xtoolkit
public void setVisible(boolean b){
if (fileDialog == null) {
init((FileDialog)target);
}
@ -754,34 +764,20 @@ class XFileDialogPeer extends XDialogPeer implements FileDialogPeer, ActionListe
setFile(savedFile);
}
super.show();
selectionField.requestFocusInWindow();
}
public void dispose() {
FileDialog fd = (FileDialog)fileDialog;
if (fd != null) {
fd.removeAll();
}
super.dispose();
}
// 03/02/2005 b5097243 Pressing 'ESC' on a file dlg does not dispose the dlg on Xtoolkit
public void setVisible(boolean b){
super.setVisible(b);
if (b == true){
// See 6240074 for more information
XChoicePeer choicePeer = (XChoicePeer)pathChoice.getPeer();
choicePeer.addXChoicePeerListener(this);
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);
}else{
// See 6240074 for more information
XChoicePeer choicePeer = (XChoicePeer)pathChoice.getPeer();
choicePeer.removeXChoicePeerListener();
KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this);
}
selectionField.requestFocusInWindow();
}
/*

View File

@ -36,6 +36,7 @@ import java.awt.Rectangle;
import java.awt.peer.FramePeer;
import java.util.logging.Level;
import java.util.logging.Logger;
import sun.awt.AWTAccessor;
class XFramePeer extends XDecoratedPeer implements FramePeer {
private static Logger log = Logger.getLogger("sun.awt.X11.XFramePeer");
@ -231,14 +232,20 @@ class XFramePeer extends XDecoratedPeer implements FramePeer {
}
}
public int getState() { return state; }
public int getState() {
synchronized(getStateLock()) {
return state;
}
}
public void setState(int newState) {
synchronized(getStateLock()) {
if (!isShowing()) {
stateLog.finer("Frame is not showing");
state = newState;
return;
}
}
changeState(newState);
}
@ -296,6 +303,9 @@ class XFramePeer extends XDecoratedPeer implements FramePeer {
int old_state = state;
state = newState;
// sync target with peer
AWTAccessor.getFrameAccessor().setExtendedState((Frame)target, state);
if ((changed & Frame.ICONIFIED) != 0) {
if ((state & Frame.ICONIFIED) != 0) {
stateLog.finer("Iconified");

View File

@ -31,6 +31,7 @@ import java.awt.Window;
import java.awt.event.FocusEvent;
import java.awt.peer.KeyboardFocusManagerPeer;
import java.awt.peer.ComponentPeer;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@ -40,136 +41,90 @@ import java.util.logging.Logger;
import sun.awt.CausedFocusEvent;
import sun.awt.SunToolkit;
import sun.awt.KeyboardFocusManagerPeerImpl;
public class XKeyboardFocusManagerPeer implements KeyboardFocusManagerPeer {
public class XKeyboardFocusManagerPeer extends KeyboardFocusManagerPeerImpl {
private static final Logger focusLog = Logger.getLogger("sun.awt.X11.focus.XKeyboardFocusManagerPeer");
KeyboardFocusManager manager;
XKeyboardFocusManagerPeer(KeyboardFocusManager manager) {
this.manager = manager;
}
private static Object lock = new Object() {};
private static Component currentFocusOwner;
private static Window currentFocusedWindow;
static void setCurrentNativeFocusOwner(Component comp) {
if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Setting current native focus owner " + comp);
XKeyboardFocusManagerPeer(KeyboardFocusManager manager) {
super(manager);
}
@Override
public void setCurrentFocusOwner(Component comp) {
setCurrentNativeFocusOwner(comp);
}
@Override
public Component getCurrentFocusOwner() {
return getCurrentNativeFocusOwner();
}
@Override
public Window getCurrentFocusedWindow() {
return getCurrentNativeFocusedWindow();
}
public static void setCurrentNativeFocusOwner(Component comp) {
synchronized (lock) {
currentFocusOwner = comp;
}
}
static void setCurrentNativeFocusedWindow(Window win) {
if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Setting current native focused window " + win);
synchronized(lock) {
currentFocusedWindow = win;
}
}
static Component getCurrentNativeFocusOwner() {
public static Component getCurrentNativeFocusOwner() {
synchronized(lock) {
return currentFocusOwner;
}
}
static Window getCurrentNativeFocusedWindow() {
public static void setCurrentNativeFocusedWindow(Window win) {
if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Setting current native focused window " + win);
XWindowPeer from = null, to = null;
synchronized(lock) {
if (currentFocusedWindow != null) {
from = (XWindowPeer)currentFocusedWindow.getPeer();
}
currentFocusedWindow = win;
if (currentFocusedWindow != null) {
to = (XWindowPeer)currentFocusedWindow.getPeer();
}
}
if (from != null) {
from.updateSecurityWarningVisibility();
}
if (to != null) {
to.updateSecurityWarningVisibility();
}
}
public static Window getCurrentNativeFocusedWindow() {
synchronized(lock) {
return currentFocusedWindow;
}
}
public Window getCurrentFocusedWindow() {
return getCurrentNativeFocusedWindow();
}
public void setCurrentFocusOwner(Component comp) {
setCurrentNativeFocusOwner(comp);
}
public Component getCurrentFocusOwner() {
return getCurrentNativeFocusOwner();
}
public void clearGlobalFocusOwner(Window activeWindow) {
if (activeWindow != null) {
Component focusOwner = activeWindow.getFocusOwner();
if (focusLog.isLoggable(Level.FINE)) focusLog.fine("Clearing global focus owner " + focusOwner);
if (focusOwner != null) {
// XComponentPeer nativePeer = XComponentPeer.getNativeContainer(focusOwner);
// if (nativePeer != null) {
FocusEvent fl = new CausedFocusEvent(focusOwner, FocusEvent.FOCUS_LOST, false, null,
CausedFocusEvent.Cause.CLEAR_GLOBAL_FOCUS_OWNER);
XWindow.sendEvent(fl);
// }
}
}
}
static boolean simulateMotifRequestFocus(Component lightweightChild, Component target, boolean temporary,
boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause)
// TODO: do something to eliminate this forwarding
public static boolean deliverFocus(Component lightweightChild,
Component target,
boolean temporary,
boolean focusedWindowChangeAllowed,
long time,
CausedFocusEvent.Cause cause)
{
if (lightweightChild == null) {
lightweightChild = (Component)target;
}
Component currentOwner = XKeyboardFocusManagerPeer.getCurrentNativeFocusOwner();
if (currentOwner != null && currentOwner.getPeer() == null) {
currentOwner = null;
}
if (focusLog.isLoggable(Level.FINER)) focusLog.finer("Simulating transfer from " + currentOwner + " to " + lightweightChild);
FocusEvent fg = new CausedFocusEvent(lightweightChild, FocusEvent.FOCUS_GAINED, false, currentOwner, cause);
FocusEvent fl = null;
if (currentOwner != null) {
fl = new CausedFocusEvent(currentOwner, FocusEvent.FOCUS_LOST, false, lightweightChild, cause);
}
if (fl != null) {
XWindow.sendEvent(fl);
}
XWindow.sendEvent(fg);
return true;
}
static Method shouldNativelyFocusHeavyweightMethod;
static int shouldNativelyFocusHeavyweight(Component heavyweight,
Component descendant, boolean temporary,
boolean focusedWindowChangeAllowed, long time, CausedFocusEvent.Cause cause)
{
if (shouldNativelyFocusHeavyweightMethod == null) {
Class[] arg_types =
new Class[] { Component.class,
Component.class,
Boolean.TYPE,
Boolean.TYPE,
Long.TYPE,
CausedFocusEvent.Cause.class
};
shouldNativelyFocusHeavyweightMethod =
SunToolkit.getMethod(KeyboardFocusManager.class,
"shouldNativelyFocusHeavyweight",
arg_types);
}
Object[] args = new Object[] { heavyweight,
descendant,
Boolean.valueOf(temporary),
Boolean.valueOf(focusedWindowChangeAllowed),
Long.valueOf(time), cause};
int result = XComponentPeer.SNFH_FAILURE;
if (shouldNativelyFocusHeavyweightMethod != null) {
try {
result = ((Integer) shouldNativelyFocusHeavyweightMethod.invoke(null, args)).intValue();
}
catch (IllegalAccessException e) {
assert false;
}
catch (InvocationTargetException e) {
assert false;
}
}
return result;
return KeyboardFocusManagerPeerImpl.deliverFocus(lightweightChild,
target,
temporary,
focusedWindowChangeAllowed,
time,
cause,
getCurrentNativeFocusOwner());
}
}

View File

@ -1,7 +1,7 @@
// This is a generated file: do not edit! Edit keysym2ucs.h if necessary.
/*
* Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2005-2009 Sun Microsystems, Inc. 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
@ -89,7 +89,7 @@ public class XKeysym {
Character ch = keysym2UCSHash.get(ks);
return ch == null ? (char)0 : ch.charValue();
}
static long xkeycode2keysym(XKeyEvent ev, int ndx) {
static long xkeycode2keysym_noxkb(XKeyEvent ev, int ndx) {
XToolkit.awtLock();
try {
return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx);
@ -97,6 +97,39 @@ public class XKeysym {
XToolkit.awtUnlock();
}
}
static long xkeycode2keysym_xkb(XKeyEvent ev, int ndx) {
XToolkit.awtLock();
try {
int mods = ev.get_state();
if ((ndx == 0) && ((mods & XConstants.ShiftMask) != 0)) {
// I don't know all possible meanings of 'ndx' in case of XKB
// and don't want to speculate. But this particular case
// clearly means that caller needs a so called primary keysym.
mods ^= XConstants.ShiftMask;
}
XlibWrapper.XkbTranslateKeyCode(XToolkit.getXKBKbdDesc(), ev.get_keycode(),
mods, XlibWrapper.iarg1, XlibWrapper.larg3);
//XXX unconsumed modifiers?
return Native.getLong(XlibWrapper.larg3);
} finally {
XToolkit.awtUnlock();
}
}
static long xkeycode2keysym(XKeyEvent ev, int ndx) {
XToolkit.awtLock();
try {
if (XToolkit.canUseXKBCalls()) {
return xkeycode2keysym_xkb(ev, ndx);
}else{
return xkeycode2keysym_noxkb(ev, ndx);
}
} finally {
XToolkit.awtUnlock();
}
}
static long xkeycode2primary_keysym(XKeyEvent ev) {
return xkeycode2keysym(ev, 0);
}
public static boolean isKPEvent( XKeyEvent ev )
{
// Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event.
@ -198,6 +231,27 @@ public class XKeysym {
Keysym2JavaKeycode jkc = getJavaKeycode( ev );
return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode();
}
/**
* Return an integer java keycode apprx as it was before extending keycodes range.
* This call would ignore for instance XKB and process whatever is on the bottom
* of keysym stack. Result will not depend on actual locale, will differ between
* dual/multiple keyboard setup systems (e.g. English+Russian vs French+Russian)
* but will be someway compatible with old releases.
*/
static int getLegacyJavaKeycodeOnly( XKeyEvent ev ) {
long keysym = XConstants.NoSymbol;
int ndx = 0;
if( (ev.get_state() & XToolkit.numLockMask) != 0 &&
isKPEvent(ev)) {
keysym = getKeypadKeysym( ev );
} else {
// we only need primary-layer keysym to derive a java keycode.
ndx = 0;
keysym = xkeycode2keysym_noxkb(ev, ndx);
}
Keysym2JavaKeycode jkc = keysym2JavaKeycodeHash.get( keysym );
return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode();
}
static long javaKeycode2Keysym( int jkey ) {
Long ks = javaKeycode2KeysymHash.get( jkey );
return (ks == null ? 0 : ks.longValue());

View File

@ -1,5 +1,5 @@
/*
* Copyright 2003-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2003-2009 Sun Microsystems, Inc. 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
@ -169,29 +169,18 @@ final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProt
return ((layer == LAYER_ALWAYS_ON_TOP) || (layer == LAYER_NORMAL)) && doLayerProtocol();
}
/**
* Helper function to set/reset one state in NET_WM_STATE
* If window is showing then it uses ClientMessage, otherwise adjusts NET_WM_STATE list
* @param window Window which NET_WM_STATE property is being modified
* @param state State atom to be set/reset
* @param reset Indicates operation, 'set' if false, 'reset' if true
*/
private void setStateHelper(XWindowPeer window, XAtom state, boolean set) {
log.log(Level.FINER, "Window visibility is: withdrawn={0}, visible={1}, mapped={2} showing={3}",
new Object[] {Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()),
Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing())});
if (window.isShowing()) {
public void requestState(XWindow window, XAtom state, boolean isAdd) {
XClientMessageEvent req = new XClientMessageEvent();
try {
req.set_type((int)XConstants.ClientMessage);
req.set_window(window.getWindow());
req.set_message_type(XA_NET_WM_STATE.getAtom());
req.set_format(32);
req.set_data(0, (!set) ? _NET_WM_STATE_REMOVE : _NET_WM_STATE_ADD);
req.set_data(0, isAdd ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE);
req.set_data(1, state.getAtom());
// Fix for 6735584: req.data[2] must be set to 0 when only one property is changed
req.set_data(2, 0);
log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}", new Object[] {state, window, Boolean.valueOf(set)});
log.log(Level.FINE, "Setting _NET_STATE atom {0} on {1} for {2}", new Object[] {state, window, Boolean.valueOf(isAdd)});
XToolkit.awtLock();
try {
XlibWrapper.XSendEvent(XToolkit.getDisplay(),
@ -206,6 +195,21 @@ final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProt
} finally {
req.dispose();
}
}
/**
* Helper function to set/reset one state in NET_WM_STATE
* If window is showing then it uses ClientMessage, otherwise adjusts NET_WM_STATE list
* @param window Window which NET_WM_STATE property is being modified
* @param state State atom to be set/reset
* @param reset Indicates operation, 'set' if false, 'reset' if true
*/
private void setStateHelper(XWindowPeer window, XAtom state, boolean set) {
log.log(Level.FINER, "Window visibility is: withdrawn={0}, visible={1}, mapped={2} showing={3}",
new Object[] {Boolean.valueOf(window.isWithdrawn()), Boolean.valueOf(window.isVisible()),
Boolean.valueOf(window.isMapped()), Boolean.valueOf(window.isShowing())});
if (window.isShowing()) {
requestState(window, state, set);
} else {
XAtomList net_wm_state = window.getNETWMState();
log.log(Level.FINE, "Current state on {0} is {1}", new Object[] {window, net_wm_state});
@ -252,6 +256,8 @@ final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProt
XAtom XA_NET_WM_WINDOW_TYPE = XAtom.get("_NET_WM_WINDOW_TYPE");
XAtom XA_NET_WM_WINDOW_TYPE_DIALOG = XAtom.get("_NET_WM_WINDOW_TYPE_DIALOG");
XAtom XA_NET_WM_WINDOW_OPACITY = XAtom.get("_NET_WM_WINDOW_OPACITY");
/* For _NET_WM_STATE ClientMessage requests */
final static int _NET_WM_STATE_REMOVE =0; /* remove/unset property */
final static int _NET_WM_STATE_ADD =1; /* add/set property */
@ -289,6 +295,12 @@ final class XNETProtocol extends XProtocol implements XStateProtocol, XLayerProt
boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_STATE_MODAL);
return res;
}
boolean doOpacityProtocol() {
boolean res = active() && checkProtocol(XA_NET_SUPPORTED, XA_NET_WM_WINDOW_OPACITY);
return res;
}
boolean isWMName(String name) {
if (!active()) {
return false;

View File

@ -130,39 +130,6 @@ public class XPanelPeer extends XCanvasPeer implements PanelPeer {
return getInsets();
}
/*
* This method is called from XWindowPeer.displayChanged, when
* the window this Panel is on is moved to the new screen, or
* display mode is changed.
*
* The notification is propagated to the child Canvas components.
* Top-level windows and other Panels are notified too as their
* peers are subclasses of XCanvasPeer.
*/
public void displayChanged(int screenNum) {
super.displayChanged(screenNum);
displayChanged((Container)target, screenNum);
}
/*
* Recursively iterates through all the HW and LW children
* of the container and calls displayChanged() for HW peers.
* Iteration through children peers only is not enough as the
* displayChanged notification may not be propagated to HW
* components inside LW containers, see 4452373 for details.
*/
private static void displayChanged(Container target, int screenNum) {
Component children[] = ((Container)target).getComponents();
for (Component child : children) {
ComponentPeer cpeer = child.getPeer();
if (cpeer instanceof XCanvasPeer) {
((XCanvasPeer)cpeer).displayChanged(screenNum);
} else if (child instanceof Container) {
displayChanged((Container)child, screenNum);
}
}
}
public void dispose() {
if (embedder != null) {
embedder.deinstall();

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2002-2009 Sun Microsystems, Inc. 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
@ -54,6 +54,7 @@ import sun.awt.*;
import sun.font.FontManager;
import sun.misc.PerformanceLogger;
import sun.print.PrintJob2D;
import sun.security.action.GetBooleanAction;
public final class XToolkit extends UNIXToolkit implements Runnable {
private static Logger log = Logger.getLogger("sun.awt.X11.XToolkit");
@ -291,6 +292,7 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
if (XlibWrapper.XSetLocaleModifiers("") == null) {
log.finer("X locale modifiers are not supported, using default");
}
tryXKB();
AwtScreenData defaultScreen = new AwtScreenData(XToolkit.getDefaultScreenData());
awt_defaultFg = defaultScreen.get_blackpixel();
@ -313,6 +315,7 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
if (xs != null) {
((XAWTXSettings)xs).dispose();
}
freeXKB();
if (log.isLoggable(Level.FINE)) {
dumpPeers();
}
@ -591,6 +594,9 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
if (ev.get_type() != XConstants.NoExpose) {
eventNumber++;
}
if (awt_UseXKB_Calls && ev.get_type() == awt_XKBBaseEventCode) {
processXkbChanges(ev);
}
if (XDropTargetEventProcessor.processEvent(ev) ||
XDragSourceContextPeer.processEvent(ev)) {
@ -2093,8 +2099,12 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
static boolean awt_ServerInquired = false;
static boolean awt_IsXsunServer = false;
static boolean awt_XKBInquired = false;
static boolean awt_UseXKB = false;
static boolean awt_UseXKB_Calls = false;
static int awt_XKBBaseEventCode = 0;
static int awt_XKBEffectiveGroup = 0; // so far, I don't use it leaving all calculations
// to XkbTranslateKeyCode
static long awt_XKBDescPtr = 0;
/**
Try to understand if it is Xsun server.
By now (2005) Sun is vendor of Xsun and Xorg servers; we only return true if Xsun is running.
@ -2124,24 +2134,144 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
awtUnlock();
}
}
/**
Query XKEYBOARD extension.
*/
static boolean isXKBenabled() {
awtLock();
try {
if( awt_XKBInquired ) {
return awt_UseXKB;
}
awt_XKBInquired = true;
String name = "XKEYBOARD";
awt_UseXKB = XlibWrapper.XQueryExtension( getDisplay(), name, XlibWrapper.larg1, XlibWrapper.larg2, XlibWrapper.larg3);
return awt_UseXKB;
} finally {
awtUnlock();
}
}
/**
Query XKEYBOARD extension.
If possible, initialize xkb library.
*/
static boolean tryXKB() {
awtLock();
try {
String name = "XKEYBOARD";
// First, if there is extension at all.
awt_UseXKB = XlibWrapper.XQueryExtension( getDisplay(), name, XlibWrapper.larg1, XlibWrapper.larg2, XlibWrapper.larg3);
if( awt_UseXKB ) {
// There is a keyboard extension. Check if a client library is compatible.
// If not, don't use xkb calls.
// In this case we still may be Xkb-capable application.
awt_UseXKB_Calls = XlibWrapper.XkbLibraryVersion( XlibWrapper.larg1, XlibWrapper.larg2);
if( awt_UseXKB_Calls ) {
awt_UseXKB_Calls = XlibWrapper.XkbQueryExtension( getDisplay(), XlibWrapper.larg1, XlibWrapper.larg2,
XlibWrapper.larg3, XlibWrapper.larg4, XlibWrapper.larg5);
if( awt_UseXKB_Calls ) {
awt_XKBBaseEventCode = Native.getInt(XlibWrapper.larg2);
XlibWrapper.XkbSelectEvents (getDisplay(),
XConstants.XkbUseCoreKbd,
XConstants.XkbNewKeyboardNotifyMask |
XConstants.XkbMapNotifyMask ,//|
//XConstants.XkbStateNotifyMask,
XConstants.XkbNewKeyboardNotifyMask |
XConstants.XkbMapNotifyMask );//|
//XConstants.XkbStateNotifyMask);
XlibWrapper.XkbSelectEventDetails(getDisplay(), XConstants.XkbUseCoreKbd,
XConstants.XkbStateNotify,
XConstants.XkbGroupStateMask,
XConstants.XkbGroupStateMask);
//XXX ? XkbGroupLockMask last, XkbAllStateComponentsMask before last?
awt_XKBDescPtr = XlibWrapper.XkbGetMap(getDisplay(),
XConstants.XkbKeyTypesMask |
XConstants.XkbKeySymsMask |
XConstants.XkbModifierMapMask |
XConstants.XkbVirtualModsMask,
XConstants.XkbUseCoreKbd);
}
}
}
return awt_UseXKB;
} finally {
awtUnlock();
}
}
static boolean canUseXKBCalls() {
awtLock();
try {
return awt_UseXKB_Calls;
} finally {
awtUnlock();
}
}
static int getXKBEffectiveGroup() {
awtLock();
try {
return awt_XKBEffectiveGroup;
} finally {
awtUnlock();
}
}
static int getXKBBaseEventCode() {
awtLock();
try {
return awt_XKBBaseEventCode;
} finally {
awtUnlock();
}
}
static long getXKBKbdDesc() {
awtLock();
try {
return awt_XKBDescPtr;
} finally {
awtUnlock();
}
}
void freeXKB() {
awtLock();
try {
if (awt_UseXKB_Calls && awt_XKBDescPtr != 0) {
XlibWrapper.XkbFreeKeyboard(awt_XKBDescPtr, 0xFF, true);
}
} finally {
awtUnlock();
}
}
private void processXkbChanges(XEvent ev) {
// mapping change --> refresh kbd map
// state change --> get a new effective group; do I really need it
// or that should be left for XkbTranslateKeyCode?
XkbEvent xke = new XkbEvent( ev.getPData() );
int xkb_type = xke.get_any().get_xkb_type();
switch( xkb_type ) {
case XConstants.XkbNewKeyboardNotify :
if( awt_XKBDescPtr != 0 ) {
freeXKB();
}
awt_XKBDescPtr = XlibWrapper.XkbGetMap(getDisplay(),
XConstants.XkbKeyTypesMask |
XConstants.XkbKeySymsMask |
XConstants.XkbModifierMapMask |
XConstants.XkbVirtualModsMask,
XConstants.XkbUseCoreKbd);
//System.out.println("XkbNewKeyboard:"+(xke.get_new_kbd()));
break;
case XConstants.XkbMapNotify :
//TODO: provide a simple unit test.
XlibWrapper.XkbGetUpdatedMap(getDisplay(),
XConstants.XkbKeyTypesMask |
XConstants.XkbKeySymsMask |
XConstants.XkbModifierMapMask |
XConstants.XkbVirtualModsMask,
awt_XKBDescPtr);
//System.out.println("XkbMap:"+(xke.get_map()));
break;
case XConstants.XkbStateNotify :
// May use it later e.g. to obtain an effective group etc.
//System.out.println("XkbState:"+(xke.get_state()));
break;
default:
//System.out.println("XkbEvent of xkb_type "+xkb_type);
break;
}
}
private static long eventNumber;
public static long getEventNumber() {
awtLock();
@ -2273,4 +2403,44 @@ public final class XToolkit extends UNIXToolkit implements Runnable {
public boolean areExtraMouseButtonsEnabled() throws HeadlessException {
return areExtraMouseButtonsEnabled;
}
@Override
public boolean isWindowOpacitySupported() {
XNETProtocol net_protocol = XWM.getWM().getNETProtocol();
if (net_protocol == null) {
return false;
}
return net_protocol.doOpacityProtocol();
}
@Override
public boolean isWindowShapingSupported() {
return XlibUtil.isShapingSupported();
}
@Override
public boolean isWindowTranslucencySupported() {
//NOTE: it may not be supported. The actual check is being performed
// at com.sun.awt.AWTUtilities(). In X11 we need to check
// whether there's any translucency-capable GC available.
return true;
}
@Override
public boolean isTranslucencyCapable(GraphicsConfiguration gc) {
if (!(gc instanceof X11GraphicsConfig)) {
return false;
}
return ((X11GraphicsConfig)gc).isTranslucencyCapable();
}
/**
* Returns the value of "sun.awt.disablegrab" property. Default
* value is {@code false}.
*/
public static boolean getSunAwtDisableGrab() {
return AccessController.doPrivileged(new GetBooleanAction("sun.awt.disablegrab"));
}
}

View File

@ -38,15 +38,18 @@ import java.security.AccessController;
import java.security.PrivilegedAction;
import java.lang.reflect.InvocationTargetException;
public class XTrayIconPeer implements TrayIconPeer {
public class XTrayIconPeer implements TrayIconPeer,
InfoWindow.Balloon.LiveArguments,
InfoWindow.Tooltip.LiveArguments
{
private static final Logger ctrLog = Logger.getLogger("sun.awt.X11.XTrayIconPeer.centering");
TrayIcon target;
TrayIconEventProxy eventProxy;
XTrayIconEmbeddedFrame eframe;
TrayIconCanvas canvas;
Balloon balloon;
Tooltip tooltip;
InfoWindow.Balloon balloon;
InfoWindow.Tooltip tooltip;
PopupMenu popup;
String tooltipString;
boolean isTrayIconDisplayed;
@ -255,8 +258,8 @@ public class XTrayIconPeer implements TrayIconPeer {
eframe.setVisible(true);
updateImage();
balloon = new Balloon(this, eframe);
tooltip = new Tooltip(this, eframe);
balloon = new InfoWindow.Balloon(eframe, target, this);
tooltip = new InfoWindow.Tooltip(eframe, target, this);
addListeners();
}
@ -300,6 +303,10 @@ public class XTrayIconPeer implements TrayIconPeer {
tooltipString = tooltip;
}
public String getTooltipString() {
return tooltipString;
}
public void updateImage() {
Runnable r = new Runnable() {
public void run() {
@ -385,7 +392,7 @@ public class XTrayIconPeer implements TrayIconPeer {
return eframe.getLocationOnScreen();
}
private Rectangle getBounds() {
public Rectangle getBounds() {
Point loc = getLocationOnScreen();
return new Rectangle(loc.x, loc.y, loc.x + TRAY_ICON_WIDTH, loc.y + TRAY_ICON_HEIGHT);
}
@ -399,10 +406,14 @@ public class XTrayIconPeer implements TrayIconPeer {
return ((XEmbeddedFramePeer)eframe.getPeer()).getWindow();
}
boolean isDisposed() {
public boolean isDisposed() {
return isDisposed;
}
public String getActionCommand() {
return target.getActionCommand();
}
static class TrayIconEventProxy implements MouseListener, MouseMotionListener {
XTrayIconPeer xtiPeer;
@ -474,8 +485,8 @@ public class XTrayIconPeer implements TrayIconPeer {
}
static boolean isTrayIconStuffWindow(Window w) {
return (w instanceof Tooltip) ||
(w instanceof Balloon) ||
return (w instanceof InfoWindow.Tooltip) ||
(w instanceof InfoWindow.Balloon) ||
(w instanceof XTrayIconEmbeddedFrame);
}
@ -530,7 +541,7 @@ public class XTrayIconPeer implements TrayIconPeer {
}
}
static class IconCanvas extends Canvas {
public static class IconCanvas extends Canvas {
volatile Image image;
IconObserver observer;
int width, height;
@ -608,429 +619,4 @@ public class XTrayIconPeer implements TrayIconPeer {
}
}
}
// ***************************************
// Classes for toolitp and balloon windows
// ***************************************
static class Tooltip extends InfoWindow {
XTrayIconPeer xtiPeer;
Label textLabel = new Label("");
Runnable starter = new Runnable() {
public void run() {
display();
}};
final static int TOOLTIP_SHOW_TIME = 10000;
final static int TOOLTIP_START_DELAY_TIME = 1000;
final static int TOOLTIP_MAX_LENGTH = 64;
final static int TOOLTIP_MOUSE_CURSOR_INDENT = 5;
final static Color TOOLTIP_BACKGROUND_COLOR = new Color(255, 255, 220);
final static Font TOOLTIP_TEXT_FONT = XWindow.getDefaultFont();
Tooltip(XTrayIconPeer xtiPeer, Frame parent) {
super(parent, Color.black);
this.xtiPeer = xtiPeer;
suppressWarningString(this);
setCloser(null, TOOLTIP_SHOW_TIME);
textLabel.setBackground(TOOLTIP_BACKGROUND_COLOR);
textLabel.setFont(TOOLTIP_TEXT_FONT);
add(textLabel);
}
/*
* WARNING: this method is executed on Toolkit thread!
*/
void display() {
String tip = xtiPeer.tooltipString;
if (tip == null) {
return;
} else if (tip.length() > TOOLTIP_MAX_LENGTH) {
textLabel.setText(tip.substring(0, TOOLTIP_MAX_LENGTH));
} else {
textLabel.setText(tip);
}
// Execute on EDT to avoid deadlock (see 6280857).
SunToolkit.executeOnEventHandlerThread(xtiPeer.target, new Runnable() {
public void run() {
if (xtiPeer.isDisposed()) {
return;
}
Point pointer = (Point)AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
if (!isPointerOverTrayIcon(xtiPeer.getBounds())) {
return null;
}
return MouseInfo.getPointerInfo().getLocation();
}
});
if (pointer == null) {
return;
}
show(new Point(pointer.x, pointer.y), TOOLTIP_MOUSE_CURSOR_INDENT);
}
});
}
void enter() {
XToolkit.schedule(starter, TOOLTIP_START_DELAY_TIME);
}
void exit() {
XToolkit.remove(starter);
if (isVisible()) {
hide();
}
}
boolean isPointerOverTrayIcon(Rectangle trayRect) {
Point p = MouseInfo.getPointerInfo().getLocation();
return !(p.x < trayRect.x || p.x > (trayRect.x + trayRect.width) ||
p.y < trayRect.y || p.y > (trayRect.y + trayRect.height));
}
}
static class Balloon extends InfoWindow {
final static int BALLOON_SHOW_TIME = 10000;
final static int BALLOON_TEXT_MAX_LENGTH = 256;
final static int BALLOON_WORD_LINE_MAX_LENGTH = 16;
final static int BALLOON_WORD_LINE_MAX_COUNT = 4;
final static int BALLOON_ICON_WIDTH = 32;
final static int BALLOON_ICON_HEIGHT = 32;
final static int BALLOON_TRAY_ICON_INDENT = 0;
final static Color BALLOON_CAPTION_BACKGROUND_COLOR = new Color(200, 200 ,255);
final static Font BALLOON_CAPTION_FONT = new Font(Font.DIALOG, Font.BOLD, 12);
XTrayIconPeer xtiPeer;
Panel mainPanel = new Panel();
Panel captionPanel = new Panel();
Label captionLabel = new Label("");
Button closeButton = new Button("X");
Panel textPanel = new Panel();
IconCanvas iconCanvas = new IconCanvas(BALLOON_ICON_WIDTH, BALLOON_ICON_HEIGHT);
Label[] lineLabels = new Label[BALLOON_WORD_LINE_MAX_COUNT];
ActionPerformer ap = new ActionPerformer();
Image iconImage;
Image errorImage;
Image warnImage;
Image infoImage;
boolean gtkImagesLoaded;
Displayer displayer = new Displayer();
Balloon(final XTrayIconPeer xtiPeer, Frame parent) {
super(parent, new Color(90, 80 ,190));
this.xtiPeer = xtiPeer;
suppressWarningString(this);
setCloser(new Runnable() {
public void run() {
if (textPanel != null) {
textPanel.removeAll();
textPanel.setSize(0, 0);
iconCanvas.setSize(0, 0);
XToolkit.awtLock();
try {
displayer.isDisplayed = false;
XToolkit.awtLockNotifyAll();
} finally {
XToolkit.awtUnlock();
}
}
}
}, BALLOON_SHOW_TIME);
add(mainPanel);
captionLabel.setFont(BALLOON_CAPTION_FONT);
captionLabel.addMouseListener(ap);
captionPanel.setLayout(new BorderLayout());
captionPanel.add(captionLabel, BorderLayout.WEST);
captionPanel.add(closeButton, BorderLayout.EAST);
captionPanel.setBackground(BALLOON_CAPTION_BACKGROUND_COLOR);
captionPanel.addMouseListener(ap);
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
hide();
}
});
mainPanel.setLayout(new BorderLayout());
mainPanel.setBackground(Color.white);
mainPanel.add(captionPanel, BorderLayout.NORTH);
mainPanel.add(iconCanvas, BorderLayout.WEST);
mainPanel.add(textPanel, BorderLayout.CENTER);
iconCanvas.addMouseListener(ap);
for (int i = 0; i < BALLOON_WORD_LINE_MAX_COUNT; i++) {
lineLabels[i] = new Label();
lineLabels[i].addMouseListener(ap);
lineLabels[i].setBackground(Color.white);
}
displayer.start();
}
void display(String caption, String text, String messageType) {
if (!gtkImagesLoaded) {
loadGtkImages();
}
displayer.display(caption, text, messageType);
}
private void _display(String caption, String text, String messageType) {
captionLabel.setText(caption);
BreakIterator iter = BreakIterator.getWordInstance();
if (text != null) {
iter.setText(text);
int start = iter.first(), end;
int nLines = 0;
do {
end = iter.next();
if (end == BreakIterator.DONE ||
text.substring(start, end).length() >= 50)
{
lineLabels[nLines].setText(text.substring(start, end == BreakIterator.DONE ?
iter.last() : end));
textPanel.add(lineLabels[nLines++]);
start = end;
}
if (nLines == BALLOON_WORD_LINE_MAX_COUNT) {
if (end != BreakIterator.DONE) {
lineLabels[nLines - 1].setText(
new String(lineLabels[nLines - 1].getText() + " ..."));
}
break;
}
} while (end != BreakIterator.DONE);
textPanel.setLayout(new GridLayout(nLines, 1));
}
if ("ERROR".equals(messageType)) {
iconImage = errorImage;
} else if ("WARNING".equals(messageType)) {
iconImage = warnImage;
} else if ("INFO".equals(messageType)) {
iconImage = infoImage;
} else {
iconImage = null;
}
if (iconImage != null) {
Dimension tpSize = textPanel.getSize();
iconCanvas.setSize(BALLOON_ICON_WIDTH, (BALLOON_ICON_HEIGHT > tpSize.height ?
BALLOON_ICON_HEIGHT : tpSize.height));
iconCanvas.validate();
}
SunToolkit.executeOnEventHandlerThread(xtiPeer.target, new Runnable() {
public void run() {
if (xtiPeer.isDisposed()) {
return;
}
Point parLoc = getParent().getLocationOnScreen();
Dimension parSize = getParent().getSize();
show(new Point(parLoc.x + parSize.width/2, parLoc.y + parSize.height/2),
BALLOON_TRAY_ICON_INDENT);
if (iconImage != null) {
iconCanvas.updateImage(iconImage); // call it after the show(..) above
}
}
});
}
public void dispose() {
displayer.interrupt();
super.dispose();
}
void loadGtkImages() {
if (!gtkImagesLoaded) {
errorImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
"gtk.icon.gtk-dialog-error.6.rtl");
warnImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
"gtk.icon.gtk-dialog-warning.6.rtl");
infoImage = (Image)Toolkit.getDefaultToolkit().getDesktopProperty(
"gtk.icon.gtk-dialog-info.6.rtl");
gtkImagesLoaded = true;
}
}
class ActionPerformer extends MouseAdapter {
public void mouseClicked(MouseEvent e) {
// hide the balloon by any click
hide();
if (e.getButton() == MouseEvent.BUTTON1) {
ActionEvent aev = new ActionEvent(xtiPeer.target, ActionEvent.ACTION_PERFORMED,
xtiPeer.target.getActionCommand(),
e.getWhen(), e.getModifiers());
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(aev);
}
}
}
class Displayer extends Thread {
final int MAX_CONCURRENT_MSGS = 10;
ArrayBlockingQueue<Message> messageQueue = new ArrayBlockingQueue<Message>(MAX_CONCURRENT_MSGS);
boolean isDisplayed;
Displayer() {
setDaemon(true);
}
public void run() {
while (true) {
Message msg = null;
try {
msg = (Message)messageQueue.take();
} catch (InterruptedException e) {
return;
}
/*
* Wait till the previous message is displayed if any
*/
XToolkit.awtLock();
try {
while (isDisplayed) {
try {
XToolkit.awtLockWait();
} catch (InterruptedException e) {
return;
}
}
isDisplayed = true;
} finally {
XToolkit.awtUnlock();
}
_display(msg.caption, msg.text, msg.messageType);
}
}
void display(String caption, String text, String messageType) {
messageQueue.offer(new Message(caption, text, messageType));
}
}
class Message {
String caption, text, messageType;
Message(String caption, String text, String messageType) {
this.caption = caption;
this.text = text;
this.messageType = messageType;
}
}
}
static class InfoWindow extends Window {
Container container;
Closer closer;
InfoWindow(Frame parent, Color borderColor) {
super(parent);
container = new Container() {
public Insets getInsets() {
return new Insets(1, 1, 1, 1);
}
};
setLayout(new BorderLayout());
setBackground(borderColor);
add(container, BorderLayout.CENTER);
container.setLayout(new BorderLayout());
closer = new Closer();
}
public Component add(Component c) {
container.add(c, BorderLayout.CENTER);
return c;
}
void setCloser(Runnable action, int time) {
closer.set(action, time);
}
// Must be executed on EDT.
protected void show(Point corner, int indent) {
assert SunToolkit.isDispatchThreadForAppContext(InfoWindow.this);
pack();
Dimension size = getSize();
// TODO: When 6356322 is fixed we should get screen bounds in
// this way: eframe.getGraphicsConfiguration().getBounds().
Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
if (corner.x < scrSize.width/2 && corner.y < scrSize.height/2) { // 1st square
setLocation(corner.x + indent, corner.y + indent);
} else if (corner.x >= scrSize.width/2 && corner.y < scrSize.height/2) { // 2nd square
setLocation(corner.x - indent - size.width, corner.y + indent);
} else if (corner.x < scrSize.width/2 && corner.y >= scrSize.height/2) { // 3rd square
setLocation(corner.x + indent, corner.y - indent - size.height);
} else if (corner.x >= scrSize.width/2 && corner.y >= scrSize.height/2) { // 4th square
setLocation(corner.x - indent - size.width, corner.y - indent - size.height);
}
InfoWindow.super.show();
InfoWindow.this.closer.schedule();
}
public void hide() {
closer.close();
}
class Closer implements Runnable {
Runnable action;
int time;
public void run() {
doClose();
}
void set(Runnable action, int time) {
this.action = action;
this.time = time;
}
void schedule() {
XToolkit.schedule(this, time);
}
void close() {
XToolkit.remove(this);
doClose();
}
// WARNING: this method may be executed on Toolkit thread.
private void doClose() {
SunToolkit.executeOnEventHandlerThread(InfoWindow.this, new Runnable() {
public void run() {
InfoWindow.super.hide();
invalidate();
if (action != null) {
action.run();
}
}
});
}
}
}
}

View File

@ -896,7 +896,7 @@ final class XWM
/*
* Set MWM decorations. Set MWM functions depending on resizability.
*/
static void setMotifDecor(XWindowPeer window, boolean resizable, int decorations, int functions) {
static void setMotifDecor(XWindow window, boolean resizable, int decorations, int functions) {
/* Apparently some WMs don't implement MWM_*_ALL semantic correctly */
if ((decorations & MWMConstants.MWM_DECOR_ALL) != 0
&& (decorations != MWMConstants.MWM_DECOR_ALL))

View File

@ -25,16 +25,194 @@
package sun.awt.X11;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Point2D;
import java.lang.ref.WeakReference;
import sun.java2d.SunGraphics2D;
import sun.java2d.pipe.Region;
import sun.awt.AWTAccessor;
import sun.awt.SunToolkit;
class XWarningWindow extends XWindow {
final static int defaultHeight = 27;
private final static int showingDelay = 330;
private final static int hidingDelay = 2000;
Window ownerWindow;
XWarningWindow(Window ownerWindow, long parentWindow) {
super(ownerWindow, parentWindow);
private final Window ownerWindow;
private WeakReference<XWindowPeer> ownerPeer;
public final Window getOwnerWindow() {
return ownerWindow;
}
private long parentWindow;
private final static String OWNER = "OWNER";
private static XIconInfo[][] icons;
private InfoWindow.Tooltip tooltip;
private static synchronized XIconInfo getSecurityIconInfo(int size, int num) {
if (icons == null) {
icons = new XIconInfo[4][3];
if (XlibWrapper.dataModel == 32) {
icons[0][0] = new XIconInfo(XAWTIcon32_security_icon_bw16_png.security_icon_bw16_png);
icons[0][1] = new XIconInfo(XAWTIcon32_security_icon_interim16_png.security_icon_interim16_png);
icons[0][2] = new XIconInfo(XAWTIcon32_security_icon_yellow16_png.security_icon_yellow16_png);
icons[1][0] = new XIconInfo(XAWTIcon32_security_icon_bw24_png.security_icon_bw24_png);
icons[1][1] = new XIconInfo(XAWTIcon32_security_icon_interim24_png.security_icon_interim24_png);
icons[1][2] = new XIconInfo(XAWTIcon32_security_icon_yellow24_png.security_icon_yellow24_png);
icons[2][0] = new XIconInfo(XAWTIcon32_security_icon_bw32_png.security_icon_bw32_png);
icons[2][1] = new XIconInfo(XAWTIcon32_security_icon_interim32_png.security_icon_interim32_png);
icons[2][2] = new XIconInfo(XAWTIcon32_security_icon_yellow32_png.security_icon_yellow32_png);
icons[3][0] = new XIconInfo(XAWTIcon32_security_icon_bw48_png.security_icon_bw48_png);
icons[3][1] = new XIconInfo(XAWTIcon32_security_icon_interim48_png.security_icon_interim48_png);
icons[3][2] = new XIconInfo(XAWTIcon32_security_icon_yellow48_png.security_icon_yellow48_png);
} else {
icons[0][0] = new XIconInfo(XAWTIcon64_security_icon_bw16_png.security_icon_bw16_png);
icons[0][1] = new XIconInfo(XAWTIcon64_security_icon_interim16_png.security_icon_interim16_png);
icons[0][2] = new XIconInfo(XAWTIcon64_security_icon_yellow16_png.security_icon_yellow16_png);
icons[1][0] = new XIconInfo(XAWTIcon64_security_icon_bw24_png.security_icon_bw24_png);
icons[1][1] = new XIconInfo(XAWTIcon64_security_icon_interim24_png.security_icon_interim24_png);
icons[1][2] = new XIconInfo(XAWTIcon64_security_icon_yellow24_png.security_icon_yellow24_png);
icons[2][0] = new XIconInfo(XAWTIcon64_security_icon_bw32_png.security_icon_bw32_png);
icons[2][1] = new XIconInfo(XAWTIcon64_security_icon_interim32_png.security_icon_interim32_png);
icons[2][2] = new XIconInfo(XAWTIcon64_security_icon_yellow32_png.security_icon_yellow32_png);
icons[3][0] = new XIconInfo(XAWTIcon64_security_icon_bw48_png.security_icon_bw48_png);
icons[3][1] = new XIconInfo(XAWTIcon64_security_icon_interim48_png.security_icon_interim48_png);
icons[3][2] = new XIconInfo(XAWTIcon64_security_icon_yellow48_png.security_icon_yellow48_png);
}
}
final int sizeIndex = size % icons.length;
return icons[sizeIndex][num % icons[sizeIndex].length];
}
private volatile int currentIcon = 0;
/* -1 - uninitialized yet
* 0 - 16x16
* 1 - 24x24
* 2 - 32x32
* 3 - 48x48
*/
private volatile int currentSize = -1;
/** Indicates whether the shape of the window must be updated
*/
private volatile boolean sizeUpdated = true;
private synchronized boolean updateIconSize() {
int newSize = currentSize;
if (ownerWindow != null) {
Insets insets = ownerWindow.getInsets();
int max = Math.max(insets.top, Math.max(insets.bottom,
Math.max(insets.left, insets.right)));
if (max < 24) {
newSize = 0;
} else if (max < 32) {
newSize = 1;
} else if (max < 48) {
newSize = 2;
} else {
newSize = 3;
}
}
if (newSize != currentSize) {
currentSize = newSize;
sizeUpdated = true;
}
return sizeUpdated;
}
private synchronized XIconInfo getSecurityIconInfo() {
updateIconSize();
return getSecurityIconInfo(currentSize, currentIcon);
}
XWarningWindow(final Window ownerWindow, long parentWindow, XWindowPeer ownerPeer) {
super(new XCreateWindowParams(new Object[] {
TARGET, ownerWindow,
OWNER, Long.valueOf(parentWindow)
}));
this.ownerWindow = ownerWindow;
xSetVisible(true);
toFront();
this.parentWindow = parentWindow;
this.tooltip = new InfoWindow.Tooltip(null, getTarget(),
new InfoWindow.Tooltip.LiveArguments() {
public boolean isDisposed() {
return XWarningWindow.this.isDisposed();
}
public Rectangle getBounds() {
return XWarningWindow.this.getBounds();
}
public String getTooltipString() {
return XWarningWindow.this.ownerWindow.getWarningString();
}
});
this.ownerPeer = new WeakReference<XWindowPeer>(ownerPeer);
}
private void requestNoTaskbar() {
XNETProtocol netProtocol = XWM.getWM().getNETProtocol();
if (netProtocol != null) {
netProtocol.requestState(this, netProtocol.XA_NET_WM_STATE_SKIP_TASKBAR, true);
}
}
@Override
void postInit(XCreateWindowParams params) {
super.postInit(params);
XToolkit.awtLock();
try {
XWM.setMotifDecor(this, false, 0, 0);
XWM.setOLDecor(this, false, 0);
long parentWindow = ((Long)params.get(OWNER)).longValue();
XlibWrapper.XSetTransientFor(XToolkit.getDisplay(),
getWindow(), parentWindow);
XWMHints hints = getWMHints();
hints.set_flags(hints.get_flags() | (int)XUtilConstants.InputHint | (int)XUtilConstants.StateHint);
hints.set_input(false);
hints.set_initial_state(XUtilConstants.NormalState);
XlibWrapper.XSetWMHints(XToolkit.getDisplay(), getWindow(), hints.pData);
initWMProtocols();
requestNoTaskbar();
} finally {
XToolkit.awtUnlock();
}
}
private void updateWarningWindowBounds() {
XWindowPeer peer = ownerPeer.get();
if (peer != null) {
synchronized (this) {
if (updateIconSize()) {
XIconInfo ico = getSecurityIconInfo();
XToolkit.awtLock();
try {
XlibWrapper.SetBitmapShape(XToolkit.getDisplay(), getWindow(),
ico.getWidth(), ico.getHeight(), ico.getIntData());
} finally {
XToolkit.awtUnlock();
}
sizeUpdated = false;
AWTAccessor.getWindowAccessor().setSecurityWarningSize(
ownerWindow, ico.getWidth(), ico.getHeight());
}
}
peer.repositionSecurityWarning();
}
}
/**
* @param x,y,w,h coordinates of the untrusted window
*/
public void reposition(int x, int y, int w, int h) {
Point2D point = AWTAccessor.getWindowAccessor().
calculateSecurityWarningPosition(ownerWindow,
x, y, w, h);
reshape((int)point.getX(), (int)point.getY(), getWidth(), getHeight());
}
protected String getWMName() {
@ -49,33 +227,19 @@ class XWarningWindow extends XWindow {
getFont());
}
void paint(Graphics g, int x, int y, int width, int height) {
String warningString = getWarningString();
Rectangle bounds = getBounds();
bounds.x = 0;
bounds.y = 0;
Rectangle updateRect = new Rectangle(x, y, width, height);
if (updateRect.intersects(bounds)) {
Rectangle updateArea = updateRect.intersection(bounds);
g.setClip(updateArea);
g.setColor(getBackground());
g.fillRect(updateArea.x, updateArea.y, updateArea.width, updateArea.height);
g.setColor(getColor());
g.setFont(getFont());
FontMetrics fm = g.getFontMetrics();
int warningWidth = fm.stringWidth(warningString);
int w_x = (bounds.width - warningWidth)/2;
int w_y = (bounds.height + fm.getMaxAscent() - fm.getMaxDescent())/2;
g.drawString(warningString, w_x, w_y);
g.drawLine(bounds.x, bounds.y+bounds.height-1, bounds.x+bounds.width-1, bounds.y+bounds.height-1);
}
g.drawImage(getSecurityIconInfo().getImage(), 0, 0, null);
}
String getWarningString() {
return ownerWindow.getWarningString();
}
int getWidth() {
return getSecurityIconInfo().getWidth();
}
int getHeight() {
return defaultHeight; // should implement depending on Font
return getSecurityIconInfo().getHeight();
}
Color getBackground() {
@ -97,6 +261,7 @@ class XWarningWindow extends XWindow {
}
}
@Override
public void handleExposeEvent(XEvent xev) {
super.handleExposeEvent(xev);
@ -105,7 +270,8 @@ class XWarningWindow extends XWindow {
final int y = xe.get_y();
final int width = xe.get_width();
final int height = xe.get_height();
EventQueue.invokeLater(new Runnable() {
SunToolkit.executeOnEventHandlerThread(target,
new Runnable() {
public void run() {
Graphics g = getGraphics();
try {
@ -116,7 +282,144 @@ class XWarningWindow extends XWindow {
}
});
}
@Override
protected boolean isEventDisabled(XEvent e) {
return true;
}
/** Send a synthetic UnmapNotify in order to withdraw the window.
*/
private void withdraw() {
XEvent req = new XEvent();
try {
long root;
XToolkit.awtLock();
try {
root = XlibWrapper.RootWindow(XToolkit.getDisplay(), getScreenNumber());
}
finally {
XToolkit.awtUnlock();
}
req.set_type(XConstants.UnmapNotify);
XUnmapEvent umev = req.get_xunmap();
umev.set_event(root);
umev.set_window(getWindow());
umev.set_from_configure(false);
XToolkit.awtLock();
try {
XlibWrapper.XSendEvent(XToolkit.getDisplay(),
root,
false,
XConstants.SubstructureRedirectMask | XConstants.SubstructureNotifyMask,
req.pData);
}
finally {
XToolkit.awtUnlock();
}
} finally {
req.dispose();
}
}
@Override
protected void stateChanged(long time, int oldState, int newState) {
if (newState == XUtilConstants.IconicState) {
super.xSetVisible(false);
withdraw();
}
}
@Override
protected void setMouseAbove(boolean above) {
super.setMouseAbove(above);
XWindowPeer p = ownerPeer.get();
if (p != null) {
p.updateSecurityWarningVisibility();
}
}
@Override
protected void enterNotify(long window) {
super.enterNotify(window);
if (window == getWindow()) {
tooltip.enter();
}
}
@Override
protected void leaveNotify(long window) {
super.leaveNotify(window);
if (window == getWindow()) {
tooltip.exit();
}
}
@Override
public void xSetVisible(boolean visible) {
super.xSetVisible(visible);
// The _NET_WM_STATE_SKIP_TASKBAR got reset upon hiding/showing,
// so we request it every time whenever we change the visibility.
requestNoTaskbar();
}
private final Runnable hidingTask = new Runnable() {
public void run() {
xSetVisible(false);
}
};
private final Runnable showingTask = new Runnable() {
public void run() {
new Thread() {
public void run() {
if (!isVisible()) {
xSetVisible(true);
updateWarningWindowBounds();
}
repaint();
if (currentIcon > 0) {
currentIcon--;
XToolkit.schedule(showingTask, showingDelay);
}
}}.start();
}
};
public void setSecurityWarningVisible(boolean visible) {
setSecurityWarningVisible(visible, true);
}
public void setSecurityWarningVisible(boolean visible, boolean doSchedule) {
if (visible) {
XToolkit.remove(hidingTask);
XToolkit.remove(showingTask);
if (isVisible()) {
currentIcon = 0;
} else {
currentIcon = 3;
}
if (doSchedule) {
XToolkit.schedule(showingTask, 1);
} else {
showingTask.run();
}
} else {
XToolkit.remove(showingTask);
XToolkit.remove(hidingTask);
if (!isVisible()) {
return;
}
if (doSchedule) {
XToolkit.schedule(hidingTask, hidingDelay);
} else {
hidingTask.run();
}
}
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2002-2009 Sun Microsystems, Inc. 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
@ -68,6 +68,15 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
int oldWidth = -1;
int oldHeight = -1;
protected PropMwmHints mwm_hints;
protected static XAtom wm_protocols;
protected static XAtom wm_delete_window;
protected static XAtom wm_take_focus;
private boolean stateChanged; // Indicates whether the value on savedState is valid
private int savedState; // Holds last known state of the top-level window
XWindowAttributesData winAttr;
protected X11GraphicsConfig graphicsConfig;
protected AwtGraphicsConfigData graphicsConfigData;
@ -119,6 +128,9 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
private native static void initIDs();
private static Field isPostedField;
private static Field rawCodeField;
private static Field primaryLevelUnicodeField;
private static Field extendedKeyCodeField;
static {
initIDs();
}
@ -218,6 +230,20 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
}
params.putIfNull(BACKING_STORE, XToolkit.getBackingStoreType());
XToolkit.awtLock();
try {
if (wm_protocols == null) {
wm_protocols = XAtom.get("WM_PROTOCOLS");
wm_delete_window = XAtom.get("WM_DELETE_WINDOW");
wm_take_focus = XAtom.get("WM_TAKE_FOCUS");
}
}
finally {
XToolkit.awtUnlock();
}
winAttr = new XWindowAttributesData();
savedState = XUtilConstants.WithdrawnState;
}
void postInit(XCreateWindowParams params) {
@ -832,12 +858,42 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
public native boolean x11inputMethodLookupString(long event, long [] keysymArray);
native boolean haveCurrentX11InputMethodInstance();
private boolean mouseAboveMe;
public boolean isMouseAbove() {
synchronized (getStateLock()) {
return mouseAboveMe;
}
}
protected void setMouseAbove(boolean above) {
synchronized (getStateLock()) {
mouseAboveMe = above;
}
}
protected void enterNotify(long window) {
if (window == getWindow()) {
setMouseAbove(true);
}
}
protected void leaveNotify(long window) {
if (window == getWindow()) {
setMouseAbove(false);
}
}
public void handleXCrossingEvent(XEvent xev) {
super.handleXCrossingEvent(xev);
XCrossingEvent xce = xev.get_xcrossing();
if (eventLog.isLoggable(Level.FINEST)) eventLog.finest(xce.toString());
if (xce.get_type() == XConstants.EnterNotify) {
enterNotify(xce.get_window());
} else { // LeaveNotify:
leaveNotify(xce.get_window());
}
// Skip event If it was caused by a grab
// This is needed because on displays with focus-follows-mouse on MousePress X system generates
// two XCrossing events with mode != NormalNotify. First of them notifies that the mouse has left
@ -984,7 +1040,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
Parameter is a keysym basically from keysymdef.h
XXX: how about vendor keys? Is there some with Unicode value and not in the list?
*/
char keysymToUnicode( long keysym, int state ) {
int keysymToUnicode( long keysym, int state ) {
return XKeysym.convertKeysym( keysym, state );
}
int keyEventType2Id( int xEventType ) {
@ -994,6 +1050,13 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
static private long xkeycodeToKeysym(XKeyEvent ev) {
return XKeysym.getKeysym( ev );
}
private long xkeycodeToPrimaryKeysym(XKeyEvent ev) {
return XKeysym.xkeycode2primary_keysym( ev );
}
static private int primaryUnicode2JavaKeycode(int uni) {
return (uni > 0? sun.awt.ExtendedKeyCodes.getExtendedKeyCodeForChar(uni) : 0);
//return (uni > 0? uni + 0x01000000 : 0);
}
void logIncomingKeyEvent(XKeyEvent ev) {
keyEventLog.fine("--XWindow.java:handleKeyEvent:"+ev);
dumpKeysymArray(ev);
@ -1012,7 +1075,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
// un-final it if you need to override it in a subclass.
final void handleKeyPress(XKeyEvent ev) {
long keysym[] = new long[2];
char unicodeKey = 0;
int unicodeKey = 0;
keysym[0] = XConstants.NoSymbol;
if (keyEventLog.isLoggable(Level.FINE)) {
@ -1057,19 +1120,36 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
if( jkc == null ) {
jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN);
}
// Take the first keysym from a keysym array associated with the XKeyevent
// and convert it to Unicode. Then, even if a Java keycode for the keystroke
// is undefined, we still have a guess of what has been engraved on a keytop.
int unicodeFromPrimaryKeysym = keysymToUnicode( xkeycodeToPrimaryKeysym(ev) ,0);
if (keyEventLog.isLoggable(Level.FINE)) {
keyEventLog.fine(">>>Fire Event:"+
(ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+
"jkeycode:decimal="+jkc.getJavaKeycode()+
", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "
", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "+
" legacy jkeycode: decimal="+XKeysym.getLegacyJavaKeycodeOnly(ev)+
", hex=0x"+Integer.toHexString(XKeysym.getLegacyJavaKeycodeOnly(ev))+"; "
);
}
int jkeyToReturn = XKeysym.getLegacyJavaKeycodeOnly(ev); // someway backward compatible
int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ?
primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) :
jkc.getJavaKeycode();
postKeyEvent( java.awt.event.KeyEvent.KEY_PRESSED,
ev.get_time(),
jkc.getJavaKeycode(),
jkeyToReturn,
(unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey),
jkc.getKeyLocation(),
ev.get_state(),ev.getPData(), XKeyEvent.getSize());
ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()),
unicodeFromPrimaryKeysym,
jkeyExtended);
if( unicodeKey > 0 ) {
keyEventLog.fine("fire _TYPED on "+unicodeKey);
postKeyEvent( java.awt.event.KeyEvent.KEY_TYPED,
@ -1077,7 +1157,10 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
java.awt.event.KeyEvent.VK_UNDEFINED,
unicodeKey,
java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN,
ev.get_state(),ev.getPData(), XKeyEvent.getSize());
ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)0,
unicodeFromPrimaryKeysym,
java.awt.event.KeyEvent.VK_UNDEFINED);
}
@ -1095,7 +1178,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
// un-private it if you need to call it from elsewhere
private void handleKeyRelease(XKeyEvent ev) {
long keysym[] = new long[2];
char unicodeKey = 0;
int unicodeKey = 0;
keysym[0] = XConstants.NoSymbol;
if (keyEventLog.isLoggable(Level.FINE)) {
@ -1113,7 +1196,9 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
keyEventLog.fine(">>>Fire Event:"+
(ev.get_type() == XConstants.KeyPress ? "KEY_PRESSED; " : "KEY_RELEASED; ")+
"jkeycode:decimal="+jkc.getJavaKeycode()+
", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "
", hex=0x"+Integer.toHexString(jkc.getJavaKeycode())+"; "+
" legacy jkeycode: decimal="+XKeysym.getLegacyJavaKeycodeOnly(ev)+
", hex=0x"+Integer.toHexString(XKeysym.getLegacyJavaKeycodeOnly(ev))+"; "
);
}
// We obtain keysym from IM and derive unicodeKey from it for KeyPress only.
@ -1124,13 +1209,74 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
// That's why we use the same procedure as if there was no IM instance: do-it-yourself unicode.
unicodeKey = keysymToUnicode( xkeycodeToKeysym(ev), ev.get_state() );
// Take a first keysym from a keysym array associated with the XKeyevent
// and convert it to Unicode. Then, even if Java keycode for the keystroke
// is undefined, we still will have a guess of what was engraved on a keytop.
int unicodeFromPrimaryKeysym = keysymToUnicode( xkeycodeToPrimaryKeysym(ev) ,0);
int jkeyToReturn = XKeysym.getLegacyJavaKeycodeOnly(ev); // someway backward compatible
int jkeyExtended = jkc.getJavaKeycode() == java.awt.event.KeyEvent.VK_UNDEFINED ?
primaryUnicode2JavaKeycode( unicodeFromPrimaryKeysym ) :
jkc.getJavaKeycode();
postKeyEvent( java.awt.event.KeyEvent.KEY_RELEASED,
ev.get_time(),
jkc.getJavaKeycode(),
jkeyToReturn,
(unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey),
jkc.getKeyLocation(),
ev.get_state(),ev.getPData(), XKeyEvent.getSize());
ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()),
unicodeFromPrimaryKeysym,
jkeyExtended);
}
/*
* XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are
* unreliable, since mapping changes can happen for a virtual desktop
* switch or MacOS style shading that became quite popular under X as
* well. Yes, it probably should not be this way, as it violates
* ICCCM, but reality is that quite a lot of window managers abuse
* mapping state.
*/
int getWMState() {
if (stateChanged) {
stateChanged = false;
WindowPropertyGetter getter =
new WindowPropertyGetter(window, XWM.XA_WM_STATE, 0, 1, false,
XWM.XA_WM_STATE);
try {
int status = getter.execute();
if (status != XConstants.Success || getter.getData() == 0) {
return savedState = XUtilConstants.WithdrawnState;
}
if (getter.getActualType() != XWM.XA_WM_STATE.getAtom() && getter.getActualFormat() != 32) {
return savedState = XUtilConstants.WithdrawnState;
}
savedState = (int)Native.getCard32(getter.getData());
} finally {
getter.dispose();
}
}
return savedState;
}
/**
* Override this methods to get notifications when top-level window state changes. The state is
* meant in terms of ICCCM: WithdrawnState, IconicState, NormalState
*/
protected void stateChanged(long time, int oldState, int newState) {
}
@Override
public void handlePropertyNotify(XEvent xev) {
super.handlePropertyNotify(xev);
XPropertyEvent ev = xev.get_xproperty();
if (ev.get_atom() == XWM.XA_WM_STATE.getAtom()) {
// State has changed, invalidate saved value
stateChanged = true;
stateChanged(ev.get_time(), savedState, getWMState());
}
}
public void reshape(Rectangle bounds) {
@ -1277,20 +1423,77 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer {
}
}
public void postKeyEvent(int id, long when, int keyCode, char keyChar,
int keyLocation, int state, long event, int eventSize)
public void postKeyEvent(int id, long when, int keyCode, int keyChar,
int keyLocation, int state, long event, int eventSize, long rawCode,
int unicodeFromPrimaryKeysym, int extendedKeyCode)
{
long jWhen = XToolkit.nowMillisUTC_offset(when);
int modifiers = getModifiers(state, 0, keyCode);
if (rawCodeField == null) {
rawCodeField = XToolkit.getField(KeyEvent.class, "rawCode");
}
if (primaryLevelUnicodeField == null) {
primaryLevelUnicodeField = XToolkit.getField(KeyEvent.class, "primaryLevelUnicode");
}
if (extendedKeyCodeField == null) {
extendedKeyCodeField = XToolkit.getField(KeyEvent.class, "extendedKeyCode");
}
KeyEvent ke = new KeyEvent((Component)getEventSource(), id, jWhen,
modifiers, keyCode, keyChar, keyLocation);
modifiers, keyCode, (char)keyChar, keyLocation);
if (event != 0) {
byte[] data = Native.toBytes(event, eventSize);
setBData(ke, data);
}
try {
rawCodeField.set(ke, rawCode);
primaryLevelUnicodeField.set(ke, (long)unicodeFromPrimaryKeysym);
extendedKeyCodeField.set(ke, (long)extendedKeyCode);
} catch (IllegalArgumentException e) {
assert(false);
} catch (IllegalAccessException e) {
assert(false);
}
postEventToEventQueue(ke);
}
static native int getAWTKeyCodeForKeySym(int keysym);
static native int getKeySymForAWTKeyCode(int keycode);
/* These two methods are actually applicable to toplevel windows only.
* However, the functionality is required by both the XWindowPeer and
* XWarningWindow, both of which have the XWindow as a common ancestor.
* See XWM.setMotifDecor() for details.
*/
public PropMwmHints getMWMHints() {
if (mwm_hints == null) {
mwm_hints = new PropMwmHints();
if (!XWM.XA_MWM_HINTS.getAtomData(getWindow(), mwm_hints.pData, MWMConstants.PROP_MWM_HINTS_ELEMENTS)) {
mwm_hints.zero();
}
}
return mwm_hints;
}
public void setMWMHints(PropMwmHints hints) {
mwm_hints = hints;
if (hints != null) {
XWM.XA_MWM_HINTS.setAtomData(getWindow(), mwm_hints.pData, MWMConstants.PROP_MWM_HINTS_ELEMENTS);
}
}
protected final void initWMProtocols() {
wm_protocols.setAtomListProperty(this, getWMProtocols());
}
/**
* Returns list of protocols which should be installed on this window.
* Descendants can override this method to add class-specific protocols
*/
protected XAtomList getWMProtocols() {
// No protocols on simple window
return new XAtomList();
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2002-2009 Sun Microsystems, Inc. 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
@ -30,6 +30,8 @@ import java.awt.event.ComponentEvent;
import java.awt.event.FocusEvent;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.peer.ComponentPeer;
import java.awt.peer.WindowPeer;
@ -42,13 +44,17 @@ import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import sun.awt.AWTAccessor;
import sun.awt.ComponentAccessor;
import sun.awt.WindowAccessor;
import sun.awt.AWTAccessor;
import sun.awt.DisplayChangedListener;
import sun.awt.SunToolkit;
import sun.awt.X11GraphicsDevice;
import sun.awt.X11GraphicsEnvironment;
import sun.java2d.pipe.Region;
class XWindowPeer extends XPanelPeer implements WindowPeer,
DisplayChangedListener {
@ -61,16 +67,11 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
// should be synchronized on awtLock
private static Set<XWindowPeer> windows = new HashSet<XWindowPeer>();
static XAtom wm_protocols;
static XAtom wm_delete_window;
static XAtom wm_take_focus;
XWindowAttributesData winAttr;
private boolean cachedFocusableWindow;
XWarningWindow warningWindow;
private boolean alwaysOnTop;
PropMwmHints mwm_hints;
private boolean locationByPlatform;
Dialog modalBlocker;
@ -87,8 +88,6 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
private boolean grab = false; // Whether to do a grab during showing
private boolean isMapped = false; // Is this window mapped or not
private boolean stateChanged; // Indicates whether the value on savedState is valid
private int savedState; // Holds last known state of the top-level window
private boolean mustControlStackPosition = false; // Am override-redirect not on top
private XEventDispatcher rootPropertyEventDispatcher = null;
@ -135,25 +134,18 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
super.preInit(params);
params.putIfNull(BIT_GRAVITY, Integer.valueOf(XConstants.NorthWestGravity));
savedState = XUtilConstants.WithdrawnState;
long eventMask = 0;
if (params.containsKey(EVENT_MASK)) {
eventMask = ((Long)params.get(EVENT_MASK));
}
eventMask |= XConstants.VisibilityChangeMask;
params.put(EVENT_MASK, eventMask);
XA_NET_WM_STATE = XAtom.get("_NET_WM_STATE");
winAttr = new XWindowAttributesData();
params.put(OVERRIDE_REDIRECT, Boolean.valueOf(isOverrideRedirect()));
SunToolkit.awtLock();
try {
windows.add(this);
if (wm_protocols == null) {
wm_protocols = XAtom.get("WM_PROTOCOLS");
wm_delete_window = XAtom.get("WM_DELETE_WINDOW");
wm_take_focus = XAtom.get("WM_TAKE_FOCUS");
}
}
finally {
SunToolkit.awtUnlock();
}
cachedFocusableWindow = isFocusableWindow();
Font f = target.getFont();
@ -186,20 +178,6 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
params.put(BOUNDS, constrainBounds(bounds.x, bounds.y, bounds.width, bounds.height));
}
private void initWMProtocols() {
wm_protocols.setAtomListProperty(this, getWMProtocols());
}
/**
* Returns list of protocols which should be installed on this window.
* Descendants can override this method to add class-specific protocols
*/
protected XAtomList getWMProtocols() {
// No protocols on simple window
return new XAtomList();
}
protected String getWMName() {
String name = target.getName();
if (name == null || name.trim().equals("")) {
@ -253,13 +231,17 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
// accessSystemTray permission allows to display TrayIcon, TrayIcon tooltip
// and TrayIcon balloon windows without a warning window.
if (!WindowAccessor.isTrayIconWindow((Window)target)) {
warningWindow = new XWarningWindow((Window)target, getWindow());
warningWindow = new XWarningWindow((Window)target, getWindow(), this);
}
}
setSaveUnder(true);
updateIconImages();
updateShape();
updateOpacity();
// no need in updateOpaque() as it is no-op
}
public void updateIconImages() {
@ -417,6 +399,22 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
return defaultIconInfo;
}
private void updateShape() {
// Shape shape = ((Window)target).getShape();
Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target);
if (shape != null) {
applyShape(Region.getInstance(shape, null));
}
}
private void updateOpacity() {
// float opacity = ((Window)target).getOpacity();
float opacity = AWTAccessor.getWindowAccessor().getOpacity((Window)target);
if (opacity < 1.0f) {
setOpacity(opacity);
}
}
public void updateMinimumSize() {
//This function only saves minimumSize value in XWindowPeer
//Setting WMSizeHints is implemented in XDecoratedPeer
@ -513,10 +511,15 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
}
if (!bounds.getSize().equals(oldBounds.getSize())) {
boolean isResized = !bounds.getSize().equals(oldBounds.getSize());
boolean isMoved = !bounds.getLocation().equals(oldBounds.getLocation());
if (isMoved || isResized) {
repositionSecurityWarning();
}
if (isResized) {
postEventToEventQueue(new ComponentEvent(getEventSource(), ComponentEvent.COMPONENT_RESIZED));
}
if (!bounds.getLocation().equals(oldBounds.getLocation())) {
if (isMoved) {
postEventToEventQueue(new ComponentEvent(getEventSource(), ComponentEvent.COMPONENT_MOVED));
}
} finally {
@ -539,7 +542,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
}
public Insets getInsets() {
return new Insets(getWarningWindowHeight(), 0, 0, 0);
return new Insets(0, 0, 0, 0);
}
// NOTE: This method may be called by privileged threads.
@ -686,6 +689,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
int curScreenNum = ((X11GraphicsDevice)getGraphicsConfiguration().getDevice()).getScreen();
int newScreenNum = 0;
GraphicsDevice gds[] = XToolkit.localEnv.getScreenDevices();
GraphicsConfiguration newGC = null;
Rectangle screenBounds;
for (int i = 0; i < gds.length; i++) {
@ -701,11 +705,13 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
if (intAmt == area) {
// Completely on this screen - done!
newScreenNum = i;
newGC = gds[i].getDefaultConfiguration();
break;
}
if (intAmt > largestAmt) {
largestAmt = intAmt;
newScreenNum = i;
newGC = gds[i].getDefaultConfiguration();
}
}
}
@ -713,28 +719,20 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
if (log.isLoggable(Level.FINEST)) {
log.finest("XWindowPeer: Moved to a new screen");
}
draggedToNewScreen(newScreenNum);
executeDisplayChangedOnEDT(newGC);
}
}
/* Xinerama
* called to update our GC when dragged onto another screen
*/
public void draggedToNewScreen(int screenNum) {
executeDisplayChangedOnEDT(screenNum);
}
/**
* Helper method that executes the displayChanged(screen) method on
* the event dispatch thread. This method is used in the Xinerama case
* and after display mode change events.
*/
private void executeDisplayChangedOnEDT(final int screenNum) {
private void executeDisplayChangedOnEDT(final GraphicsConfiguration gc) {
Runnable dc = new Runnable() {
public void run() {
// Updates this window's GC and notifies all the children.
// See XPanelPeer/XCanvasPeer.displayChanged(int) for details.
displayChanged(screenNum);
AWTAccessor.getComponentAccessor().
setGraphicsConfiguration((Component)target, gc);
}
};
SunToolkit.executeOnEventHandlerThread((Component)target, dc);
@ -745,9 +743,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
* X11GraphicsDevice when the display mode has been changed.
*/
public void displayChanged() {
GraphicsConfiguration gc = getGraphicsConfiguration();
int curScreenNum = ((X11GraphicsDevice)gc.getDevice()).getScreen();
executeDisplayChangedOnEDT(curScreenNum);
executeDisplayChangedOnEDT(getGraphicsConfiguration());
}
/**
@ -761,6 +757,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
* Overridden to check if we need to update our GraphicsDevice/Config
* Added for 4934052.
*/
@Override
public void handleConfigureNotifyEvent(XEvent xev) {
// TODO: We create an XConfigureEvent every time we override
// handleConfigureNotify() - too many!
@ -774,8 +771,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
// there could be a race condition in which a ComponentListener could
// see the old screen.
super.handleConfigureNotifyEvent(xev);
// for 5085647: no applet warning window visible
updateChildrenSizes();
repositionSecurityWarning();
}
final void requestXFocus(long time) {
@ -1053,6 +1049,9 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
}
updateFocusability();
promoteDefaultPosition();
if (!vis && warningWindow != null) {
warningWindow.setSecurityWarningVisible(false, false);
}
super.setVisible(vis);
if (!vis && !isWithdrawn()) {
// ICCCM, 4.1.4. Changing Window State:
@ -1082,6 +1081,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
if (isOverrideRedirect() && vis) {
updateChildrenSizes();
}
repositionSecurityWarning();
}
protected void suppressWmTakeFocus(boolean doSuppress) {
@ -1099,21 +1099,64 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
return 0;
}
// The height of area used to display Applet's warning about securit
int getWarningWindowHeight() {
if (warningWindow != null) {
return warningWindow.getHeight();
} else {
return 0;
}
}
// Called when shell changes its size and requires children windows
// to update their sizes appropriately
void updateChildrenSizes() {
if (warningWindow != null) {
warningWindow.reshape(0, getMenuBarHeight(), getSize().width, warningWindow.getHeight());
}
public void repositionSecurityWarning() {
// NOTE: On KWin if the window/border snapping option is enabled,
// the Java window may be swinging while it's being moved.
// This doesn't make the application unusable though looks quite ugly.
// Probobly we need to find some hint to assign to our Security
// Warning window in order to exclude it from the snapping option.
// We are not currently aware of existance of such a property.
if (warningWindow != null) {
// We can't use the coordinates stored in the XBaseWindow since
// they are zeros for decorated frames.
int x = ComponentAccessor.getX(target);
int y = ComponentAccessor.getY(target);
int width = ComponentAccessor.getWidth(target);
int height = ComponentAccessor.getHeight(target);
warningWindow.reposition(x, y, width, height);
}
}
@Override
protected void setMouseAbove(boolean above) {
super.setMouseAbove(above);
updateSecurityWarningVisibility();
}
public void updateSecurityWarningVisibility() {
if (warningWindow == null) {
return;
}
boolean show = false;
int state = getWMState();
if (!isVisible()) {
return; // The warning window should already be hidden.
}
// getWMState() always returns 0 (Withdrawn) for simple windows. Hence
// we ignore the state for such windows.
if (isVisible() && (state == XUtilConstants.NormalState || isSimpleWindow())) {
if (XKeyboardFocusManagerPeer.getCurrentNativeFocusedWindow() ==
getTarget())
{
show = true;
}
if (isMouseAbove() || warningWindow.isMouseAbove())
{
show = true;
}
}
warningWindow.setSecurityWarningVisible(show);
}
boolean isOverrideRedirect() {
@ -1165,16 +1208,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
// if (ve.get_state() == XlibWrapper.VisibilityUnobscured) {
// // raiseInputMethodWindow
// }
}
public void handlePropertyNotify(XEvent xev) {
super.handlePropertyNotify(xev);
XPropertyEvent ev = xev.get_xproperty();
if (ev.get_atom() == XWM.XA_WM_STATE.getAtom()) {
// State has changed, invalidate saved value
stateChanged = true;
stateChanged(ev.get_time(), savedState, getWMState());
}
repositionSecurityWarning();
}
void handleRootPropertyNotify(XEvent xev) {
@ -1275,6 +1309,7 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
* Override this methods to get notifications when top-level window state changes. The state is
* meant in terms of ICCCM: WithdrawnState, IconicState, NormalState
*/
@Override
protected void stateChanged(long time, int oldState, int newState) {
// Fix for 6401700, 6412803
// If this window is modal blocked, it is put into the transient_for
@ -1288,38 +1323,8 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
for (ToplevelStateListener topLevelListenerTmp : toplevelStateListeners) {
topLevelListenerTmp.stateChangedICCCM(oldState, newState);
}
}
/*
* XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are
* unreliable, since mapping changes can happen for a virtual desktop
* switch or MacOS style shading that became quite popular under X as
* well. Yes, it probably should not be this way, as it violates
* ICCCM, but reality is that quite a lot of window managers abuse
* mapping state.
*/
int getWMState() {
if (stateChanged) {
stateChanged = false;
WindowPropertyGetter getter =
new WindowPropertyGetter(window, XWM.XA_WM_STATE, 0, 1, false,
XWM.XA_WM_STATE);
try {
int status = getter.execute();
if (status != XConstants.Success || getter.getData() == 0) {
return savedState = XUtilConstants.WithdrawnState;
}
if (getter.getActualType() != XWM.XA_WM_STATE.getAtom() && getter.getActualFormat() != 32) {
return savedState = XUtilConstants.WithdrawnState;
}
savedState = (int)Native.getCard32(getter.getData());
} finally {
getter.dispose();
}
}
return savedState;
updateSecurityWarningVisibility();
}
boolean isWithdrawn() {
@ -2064,4 +2069,44 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
}
super.handleButtonPressRelease(xev);
}
public void print(Graphics g) {
// We assume we print the whole frame,
// so we expect no clip was set previously
Shape shape = AWTAccessor.getWindowAccessor().getShape((Window)target);
if (shape != null) {
g.setClip(shape);
}
super.print(g);
}
@Override
public void setOpacity(float opacity) {
final long maxOpacity = 0xffffffffl;
long iOpacity = (long)(opacity * maxOpacity);
if (iOpacity < 0) {
iOpacity = 0;
}
if (iOpacity > maxOpacity) {
iOpacity = maxOpacity;
}
XAtom netWmWindowOpacityAtom = XAtom.get("_NET_WM_WINDOW_OPACITY");
if (iOpacity == maxOpacity) {
netWmWindowOpacityAtom.DeleteProperty(getWindow());
} else {
netWmWindowOpacityAtom.setCard32Property(getWindow(), iOpacity);
}
}
@Override
public void setOpaque(boolean isOpaque) {
// no-op
}
@Override
public void updateWindow(BufferedImage backBuffer) {
// no-op
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2002-2009 Sun Microsystems, Inc. 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
@ -156,6 +156,8 @@ Window w;
static native void XLowerWindow(long display, long window);
static native void XRestackWindows(long display, long windows, int length);
static native void XConfigureWindow(long display, long window,
long value_mask, long values);
static native void XSetInputFocus(long display, long window);
static native void XSetInputFocus2(long display, long window, long time);
static native long XGetInputFocus(long display);
@ -490,6 +492,21 @@ static native String XSetLocaleModifiers(String modifier_list);
static native int XKeysymToKeycode(long display, long keysym);
// xkb-related
static native int XkbGetEffectiveGroup(long display);
static native long XkbKeycodeToKeysym(long display, int keycode, int group, int level);
static native void XkbSelectEvents(long display, long device, long bits_to_change, long values_for_bits);
static native void XkbSelectEventDetails(long display, long device, long event_type,
long bits_to_change, long values_for_bits);
static native boolean XkbQueryExtension(long display, long opcode_rtrn, long event_rtrn,
long error_rtrn, long major_in_out, long minor_in_out);
static native boolean XkbLibraryVersion(long lib_major_in_out, long lib_minor_in_out);
static native long XkbGetMap(long display, long which, long device_spec);
static native long XkbGetUpdatedMap(long display, long which, long xkb);
static native void XkbFreeKeyboard(long xkb, long which, boolean free_all);
static native boolean XkbTranslateKeyCode(long xkb, int keycode, long mods, long mods_rtrn, long keysym_rtrn);
static native void XConvertCase(long keysym,
long keysym_lowercase,
long keysym_uppercase);
@ -533,6 +550,13 @@ static native String XSetLocaleModifiers(String modifier_list);
static native void SetRectangularShape(long display, long window,
int lox, int loy, int hix, int hiy,
sun.java2d.pipe.Region region);
/** Each int in the bitmap array is one pixel with a 32-bit color:
* R, G, B, and Alpha.
*/
static native void SetBitmapShape(long display, long window,
int width, int height, int[] bitmap);
static native void SetZOrder(long display, long window, long above);
/* Global memory area used for X lib parameter passing */
@ -608,6 +632,15 @@ static native String XSetLocaleModifiers(String modifier_list);
}
return buf.toString();
}
static String getEventToString( int type ) {
if( (type >= 0) && (type < eventToString.length)) {
return eventToString[type];
}else if( type == XToolkit.getXKBBaseEventCode() ) {
//XXX TODO various xkb types
return "XkbEvent";
}
return eventToString[0];
}
private static boolean getBuildInternal() {
String javaVersion = XToolkit.getSystemProperty("java.version");

View File

@ -1,5 +1,5 @@
/*
* Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2003-2009 Sun Microsystems, Inc. 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
@ -859,14 +859,14 @@ public class WrapperGenerator {
pw.println("\n\tlong pData;");
pw.println("\n\tpublic long getPData() { return pData; }");
pw.println("\n\n\t" + stp.getJavaClassName() + "(long addr) {");
pw.println("\n\n\tpublic " + stp.getJavaClassName() + "(long addr) {");
if (generateLog) {
pw.println("\t\tlog.finest(\"Creating\");");
}
pw.println("\t\tpData=addr;");
pw.println("\t\tshould_free_memory = false;");
pw.println("\t}");
pw.println("\n\n\t" + stp.getJavaClassName() + "() {");
pw.println("\n\n\tpublic " + stp.getJavaClassName() + "() {");
if (generateLog) {
pw.println("\t\tlog.finest(\"Creating\");");
}
@ -1138,6 +1138,7 @@ public class WrapperGenerator {
pw.println("/* This file is an automatically generated file, please do not edit this file, modify the XlibParser.java file instead !*/\n" );
pw.println("#include <X11/Xlib.h>\n#include <X11/Xutil.h>\n#include <X11/Xos.h>\n#include <X11/Xatom.h>\n#include <stdio.h>\n");
pw.println("#include <X11/extensions/Xdbe.h>");
pw.println("#include <X11/XKBlib.h>");
pw.println("#include \"awt_p.h\"");
pw.println("#include \"color.h\"");
pw.println("#include \"colordata.h\"");

View File

@ -16,10 +16,38 @@ XIMStringConversionCallbackStruct.operation 8
XIMStringConversionCallbackStruct.factor 10
XIMStringConversionCallbackStruct.text 16
XIMStringConversionCallbackStruct 24
XkbNewKeyboardNotifyEvent.type 0
XkbNewKeyboardNotifyEvent.serial 8
XkbNewKeyboardNotifyEvent.send_event 16
XkbNewKeyboardNotifyEvent.display 24
XkbNewKeyboardNotifyEvent.time 32
XkbNewKeyboardNotifyEvent.xkb_type 40
XkbNewKeyboardNotifyEvent.device 44
XkbNewKeyboardNotifyEvent.old_device 48
XkbNewKeyboardNotifyEvent.min_key_code 52
XkbNewKeyboardNotifyEvent.max_key_code 56
XkbNewKeyboardNotifyEvent.old_min_key_code 60
XkbNewKeyboardNotifyEvent.old_max_key_code 64
XkbNewKeyboardNotifyEvent.changed 68
XkbNewKeyboardNotifyEvent.req_major 72
XkbNewKeyboardNotifyEvent.req_minor 73
XkbNewKeyboardNotifyEvent 80
XTimeCoord.time 0
XTimeCoord.x 8
XTimeCoord.y 10
XTimeCoord 16
XkbCompatMapNotifyEvent.type 0
XkbCompatMapNotifyEvent.serial 8
XkbCompatMapNotifyEvent.send_event 16
XkbCompatMapNotifyEvent.display 24
XkbCompatMapNotifyEvent.time 32
XkbCompatMapNotifyEvent.xkb_type 40
XkbCompatMapNotifyEvent.device 44
XkbCompatMapNotifyEvent.changed_groups 48
XkbCompatMapNotifyEvent.first_si 52
XkbCompatMapNotifyEvent.num_si 56
XkbCompatMapNotifyEvent.num_total_si 60
XkbCompatMapNotifyEvent 64
XIMStatusDrawCallbackStruct.type 0
XIMStatusDrawCallbackStruct.data 8
XIMStatusDrawCallbackStruct 16
@ -289,6 +317,22 @@ XVisualInfo.blue_mask 48
XVisualInfo.colormap_size 56
XVisualInfo.bits_per_rgb 60
XVisualInfo 64
XkbControlsNotifyEvent.type 0
XkbControlsNotifyEvent.serial 8
XkbControlsNotifyEvent.send_event 16
XkbControlsNotifyEvent.display 24
XkbControlsNotifyEvent.time 32
XkbControlsNotifyEvent.xkb_type 40
XkbControlsNotifyEvent.device 44
XkbControlsNotifyEvent.changed_ctrls 48
XkbControlsNotifyEvent.enabled_ctrls 52
XkbControlsNotifyEvent.enabled_ctrl_changes 56
XkbControlsNotifyEvent.num_groups 60
XkbControlsNotifyEvent.keycode 64
XkbControlsNotifyEvent.event_type 65
XkbControlsNotifyEvent.req_major 66
XkbControlsNotifyEvent.req_minor 67
XkbControlsNotifyEvent 72
PropMwmHints.flags 0
PropMwmHints.functions 8
PropMwmHints.decorations 16
@ -310,8 +354,26 @@ XAnyEvent.send_event 16
XAnyEvent.display 24
XAnyEvent.window 32
XAnyEvent 40
XkbIndicatorNotifyEvent.type 0
XkbIndicatorNotifyEvent.serial 8
XkbIndicatorNotifyEvent.send_event 16
XkbIndicatorNotifyEvent.display 24
XkbIndicatorNotifyEvent.time 32
XkbIndicatorNotifyEvent.xkb_type 40
XkbIndicatorNotifyEvent.device 44
XkbIndicatorNotifyEvent.changed 48
XkbIndicatorNotifyEvent.state 52
XkbIndicatorNotifyEvent 56
XIMPreeditStateNotifyCallbackStruct.state 0
XIMPreeditStateNotifyCallbackStruct 8
XkbAnyEvent.type 0
XkbAnyEvent.serial 8
XkbAnyEvent.send_event 16
XkbAnyEvent.display 24
XkbAnyEvent.time 32
XkbAnyEvent.xkb_type 40
XkbAnyEvent.device 44
XkbAnyEvent 48
XMotionEvent.type 0
XMotionEvent.serial 8
XMotionEvent.send_event 16
@ -334,6 +396,23 @@ XIMHotKeyTriggers 16
XIMStyles.count_styles 0
XIMStyles.supported_styles 8
XIMStyles 16
XkbExtensionDeviceNotifyEvent.type 0
XkbExtensionDeviceNotifyEvent.serial 8
XkbExtensionDeviceNotifyEvent.send_event 16
XkbExtensionDeviceNotifyEvent.display 24
XkbExtensionDeviceNotifyEvent.time 32
XkbExtensionDeviceNotifyEvent.xkb_type 40
XkbExtensionDeviceNotifyEvent.device 44
XkbExtensionDeviceNotifyEvent.reason 48
XkbExtensionDeviceNotifyEvent.supported 52
XkbExtensionDeviceNotifyEvent.unsupported 56
XkbExtensionDeviceNotifyEvent.first_btn 60
XkbExtensionDeviceNotifyEvent.num_btns 64
XkbExtensionDeviceNotifyEvent.leds_defined 68
XkbExtensionDeviceNotifyEvent.led_state 72
XkbExtensionDeviceNotifyEvent.led_class 76
XkbExtensionDeviceNotifyEvent.led_id 80
XkbExtensionDeviceNotifyEvent 88
XwcTextItem.chars 0
XwcTextItem.nchars 8
XwcTextItem.delta 12
@ -419,6 +498,20 @@ XKeyEvent.state 80
XKeyEvent.keycode 84
XKeyEvent.same_screen 88
XKeyEvent 96
XkbActionMessageEvent.type 0
XkbActionMessageEvent.serial 8
XkbActionMessageEvent.send_event 16
XkbActionMessageEvent.display 24
XkbActionMessageEvent.time 32
XkbActionMessageEvent.xkb_type 40
XkbActionMessageEvent.device 44
XkbActionMessageEvent.keycode 48
XkbActionMessageEvent.press 52
XkbActionMessageEvent.key_event_follows 56
XkbActionMessageEvent.group 60
XkbActionMessageEvent.mods 64
XkbActionMessageEvent.message 68
XkbActionMessageEvent 80
XdbeSwapInfo.swap_window 0
XdbeSwapInfo.swap_action 8
XdbeSwapInfo 16
@ -458,6 +551,18 @@ Visual 56
XOMOrientation.num_orientation 0
XOMOrientation.orientation 8
XOMOrientation 16
XkbAccessXNotifyEvent.type 0
XkbAccessXNotifyEvent.serial 8
XkbAccessXNotifyEvent.send_event 16
XkbAccessXNotifyEvent.display 24
XkbAccessXNotifyEvent.time 32
XkbAccessXNotifyEvent.xkb_type 40
XkbAccessXNotifyEvent.device 44
XkbAccessXNotifyEvent.detail 48
XkbAccessXNotifyEvent.keycode 52
XkbAccessXNotifyEvent.sk_delay 56
XkbAccessXNotifyEvent.debounce_delay 60
XkbAccessXNotifyEvent 64
XWindowAttributes.x 0
XWindowAttributes.y 4
XWindowAttributes.width 8
@ -528,6 +633,33 @@ awtImageData.wsImageFormat 4
awtImageData.clrdata 16
awtImageData.convert 48
awtImageData 560
XkbStateNotifyEvent.type 0
XkbStateNotifyEvent.serial 8
XkbStateNotifyEvent.send_event 16
XkbStateNotifyEvent.display 24
XkbStateNotifyEvent.time 32
XkbStateNotifyEvent.xkb_type 40
XkbStateNotifyEvent.device 44
XkbStateNotifyEvent.changed 48
XkbStateNotifyEvent.group 52
XkbStateNotifyEvent.base_group 56
XkbStateNotifyEvent.latched_group 60
XkbStateNotifyEvent.locked_group 64
XkbStateNotifyEvent.mods 68
XkbStateNotifyEvent.base_mods 72
XkbStateNotifyEvent.latched_mods 76
XkbStateNotifyEvent.locked_mods 80
XkbStateNotifyEvent.compat_state 84
XkbStateNotifyEvent.grab_mods 88
XkbStateNotifyEvent.compat_grab_mods 89
XkbStateNotifyEvent.lookup_mods 90
XkbStateNotifyEvent.compat_lookup_mods 91
XkbStateNotifyEvent.ptr_buttons 92
XkbStateNotifyEvent.keycode 96
XkbStateNotifyEvent.event_type 97
XkbStateNotifyEvent.req_major 98
XkbStateNotifyEvent.req_minor 99
XkbStateNotifyEvent 104
XExposeEvent.type 0
XExposeEvent.serial 8
XExposeEvent.send_event 16
@ -539,6 +671,33 @@ XExposeEvent.width 48
XExposeEvent.height 52
XExposeEvent.count 56
XExposeEvent 64
XkbMapNotifyEvent.type 0
XkbMapNotifyEvent.serial 8
XkbMapNotifyEvent.send_event 16
XkbMapNotifyEvent.display 24
XkbMapNotifyEvent.time 32
XkbMapNotifyEvent.xkb_type 40
XkbMapNotifyEvent.device 44
XkbMapNotifyEvent.changed 48
XkbMapNotifyEvent.flags 52
XkbMapNotifyEvent.first_type 56
XkbMapNotifyEvent.num_types 60
XkbMapNotifyEvent.min_key_code 64
XkbMapNotifyEvent.max_key_code 65
XkbMapNotifyEvent.first_key_sym 66
XkbMapNotifyEvent.first_key_act 67
XkbMapNotifyEvent.first_key_behavior 68
XkbMapNotifyEvent.first_key_explicit 69
XkbMapNotifyEvent.first_modmap_key 70
XkbMapNotifyEvent.first_vmodmap_key 71
XkbMapNotifyEvent.num_key_syms 72
XkbMapNotifyEvent.num_key_acts 76
XkbMapNotifyEvent.num_key_behaviors 80
XkbMapNotifyEvent.num_key_explicit 84
XkbMapNotifyEvent.num_modmap_keys 88
XkbMapNotifyEvent.num_vmodmap_keys 92
XkbMapNotifyEvent.vmods 96
XkbMapNotifyEvent 104
XGCValues.function 0
XGCValues.plane_mask 8
XGCValues.foreground 16
@ -583,6 +742,22 @@ XMapEvent.event 32
XMapEvent.window 40
XMapEvent.override_redirect 48
XMapEvent 56
XkbBellNotifyEvent.type 0
XkbBellNotifyEvent.serial 8
XkbBellNotifyEvent.send_event 16
XkbBellNotifyEvent.display 24
XkbBellNotifyEvent.time 32
XkbBellNotifyEvent.xkb_type 40
XkbBellNotifyEvent.device 44
XkbBellNotifyEvent.percent 48
XkbBellNotifyEvent.pitch 52
XkbBellNotifyEvent.duration 56
XkbBellNotifyEvent.bell_class 60
XkbBellNotifyEvent.bell_id 64
XkbBellNotifyEvent.name 72
XkbBellNotifyEvent.window 80
XkbBellNotifyEvent.event_only 88
XkbBellNotifyEvent 96
XIMStringConversionText.length 0
XIMStringConversionText.feedback 8
XIMStringConversionText.encoding_is_wchar 16
@ -596,6 +771,21 @@ XKeyboardState.led_mask 16
XKeyboardState.global_auto_repeat 24
XKeyboardState.auto_repeats 28
XKeyboardState 64
XkbEvent.type 0
XkbEvent.any 0
XkbEvent.new_kbd 0
XkbEvent.map 0
XkbEvent.state 0
XkbEvent.ctrls 0
XkbEvent.indicators 0
XkbEvent.names 0
XkbEvent.compat 0
XkbEvent.bell 0
XkbEvent.message 0
XkbEvent.accessx 0
XkbEvent.device 0
XkbEvent.core 0
XkbEvent 192
XPoint.x 0
XPoint.y 2
XPoint 4
@ -633,6 +823,26 @@ XRectangle.y 2
XRectangle.width 4
XRectangle.height 6
XRectangle 8
XkbNamesNotifyEvent.type 0
XkbNamesNotifyEvent.serial 8
XkbNamesNotifyEvent.send_event 16
XkbNamesNotifyEvent.display 24
XkbNamesNotifyEvent.time 32
XkbNamesNotifyEvent.xkb_type 40
XkbNamesNotifyEvent.device 44
XkbNamesNotifyEvent.changed 48
XkbNamesNotifyEvent.first_type 52
XkbNamesNotifyEvent.num_types 56
XkbNamesNotifyEvent.first_lvl 60
XkbNamesNotifyEvent.num_lvls 64
XkbNamesNotifyEvent.num_aliases 68
XkbNamesNotifyEvent.num_radio_groups 72
XkbNamesNotifyEvent.changed_vmods 76
XkbNamesNotifyEvent.changed_groups 80
XkbNamesNotifyEvent.changed_indicators 84
XkbNamesNotifyEvent.first_key 88
XkbNamesNotifyEvent.num_keys 92
XkbNamesNotifyEvent 96
XCreateWindowEvent.type 0
XCreateWindowEvent.serial 8
XCreateWindowEvent.send_event 16
@ -774,7 +984,8 @@ AwtGraphicsConfigData.monoPixmapGC 128
AwtGraphicsConfigData.pixelStride 136
AwtGraphicsConfigData.color_data 144
AwtGraphicsConfigData.glxInfo 152
AwtGraphicsConfigData 160
AwtGraphicsConfigData.isTranslucencySupported 160
AwtGraphicsConfigData 168
XColor.pixel 0
XColor.red 8
XColor.green 10

View File

@ -750,6 +750,7 @@ AwtGraphicsConfigData
pixelStride int
color_data pointer ColorData
glxInfo pointer
isTranslucencySupported int
AwtScreenData
numConfigs int
@ -797,3 +798,227 @@ XEvent
xerror struct XErrorEvent
xkeymap struct XKeymapEvent
pad array long 24
XkbAnyEvent
type int
serial ulong
send_event Bool
display long
time ulong
xkb_type int
device int
XkbNewKeyboardNotifyEvent
type int
serial ulong
send_event Bool
display long
time ulong
xkb_type int
device int
old_device int
min_key_code int
max_key_code int
old_min_key_code int
old_max_key_code int
changed int
req_major byte
req_minor byte
XkbMapNotifyEvent
type int
serial ulong
send_event Bool
display long
time ulong
xkb_type int
device int
changed int
flags int
first_type int
num_types int
min_key_code int
max_key_code int
first_key_sym int
first_key_act int
first_key_behavior int
first_key_explicit int
first_modmap_key int
first_vmodmap_key int
num_key_syms int
num_key_acts int
num_key_behaviors int
num_key_explicit int
num_modmap_keys int
num_vmodmap_keys int
vmods int
XkbStateNotifyEvent
type int
serial ulong
send_event Bool
display long
time ulong
xkb_type int
device int
changed int
group int
base_group int
latched_group int
locked_group int
mods int
base_mods int
latched_mods int
locked_mods int
compat_state int
grab_mods byte
compat_grab_mods byte
lookup_mods byte
compat_lookup_mods byte
ptr_buttons int
keycode int
event_type byte
req_major byte
req_minor byte
XkbControlsNotifyEvent
type int
serial ulong
send_event Bool
display long
time ulong
xkb_type int
device int
changed_ctrls int
enabled_ctrls int
enabled_ctrl_changes int
num_groups int
keycode int
event_type byte
req_major byte
req_minor byte
XkbIndicatorNotifyEvent
type int
serial ulong
send_event Bool
display long
time ulong
xkb_type int
device int
changed int
state int
XkbNamesNotifyEvent
type int
serial ulong
send_event Bool
display long
time ulong
xkb_type int
device int
changed int
first_type int
num_types int
first_lvl int
num_lvls int
num_aliases int
num_radio_groups int
changed_vmods int
changed_groups int
changed_indicators int
first_key int
num_keys int
XkbCompatMapNotifyEvent
type int
serial ulong
send_event Bool
display long
time ulong
xkb_type int
device int
changed_groups int
first_si int
num_si int
num_total_si int
XkbBellNotifyEvent
type int
serial ulong
send_event Bool
display long
time ulong
xkb_type int
device int
percent int
pitch int
duration int
bell_class int
bell_id int
name Atom
window long
event_only Bool
XkbActionMessageEvent
type int
serial ulong
send_event Bool
display long
time ulong
xkb_type int
device int
keycode int
press Bool
key_event_follows Bool
group int
mods int
message array byte 7 //XkbActionMessageLength+1
XkbAccessXNotifyEvent
type int
serial ulong
send_event Bool
display long
time ulong
xkb_type int
device int
detail int
keycode int
sk_delay int
debounce_delay int
XkbExtensionDeviceNotifyEvent
type int
serial ulong
send_event Bool
display long
time ulong
xkb_type int
device int
reason int
supported int
unsupported int
first_btn int
num_btns int
leds_defined int
led_state int
led_class int
led_id int
XkbEvent
type int
any struct XkbAnyEvent
new_kbd struct XkbNewKeyboardNotifyEvent
map struct XkbMapNotifyEvent
state struct XkbStateNotifyEvent
ctrls struct XkbControlsNotifyEvent
indicators struct XkbIndicatorNotifyEvent
names struct XkbNamesNotifyEvent
compat struct XkbCompatMapNotifyEvent
bell struct XkbBellNotifyEvent
message struct XkbActionMessageEvent
accessx struct XkbAccessXNotifyEvent
device struct XkbExtensionDeviceNotifyEvent
core struct XEvent

View File

@ -1,5 +1,5 @@
/*
* Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2005-2009 Sun Microsystems, Inc. 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
@ -39,7 +39,7 @@
*/
tojava /*
tojava * Copyright 2005-2008 Sun Microsystems, Inc. All Rights Reserved.
tojava * Copyright 2005-2009 Sun Microsystems, Inc. All Rights Reserved.
tojava * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
tojava *
tojava * This code is free software; you can redistribute it and/or modify it
@ -127,7 +127,7 @@ tojava
tojava Character ch = keysym2UCSHash.get(ks);
tojava return ch == null ? (char)0 : ch.charValue();
tojava }
tojava static long xkeycode2keysym(XKeyEvent ev, int ndx) {
tojava static long xkeycode2keysym_noxkb(XKeyEvent ev, int ndx) {
tojava XToolkit.awtLock();
tojava try {
tojava return XlibWrapper.XKeycodeToKeysym(ev.get_display(), ev.get_keycode(), ndx);
@ -135,6 +135,39 @@ tojava } finally {
tojava XToolkit.awtUnlock();
tojava }
tojava }
tojava static long xkeycode2keysym_xkb(XKeyEvent ev, int ndx) {
tojava XToolkit.awtLock();
tojava try {
tojava int mods = ev.get_state();
tojava if ((ndx == 0) && ((mods & XConstants.ShiftMask) != 0)) {
tojava // I don't know all possible meanings of 'ndx' in case of XKB
tojava // and don't want to speculate. But this particular case
tojava // clearly means that caller needs a so called primary keysym.
tojava mods ^= XConstants.ShiftMask;
tojava }
tojava XlibWrapper.XkbTranslateKeyCode(XToolkit.getXKBKbdDesc(), ev.get_keycode(),
tojava mods, XlibWrapper.iarg1, XlibWrapper.larg3);
tojava //XXX unconsumed modifiers?
tojava return Native.getLong(XlibWrapper.larg3);
tojava } finally {
tojava XToolkit.awtUnlock();
tojava }
tojava }
tojava static long xkeycode2keysym(XKeyEvent ev, int ndx) {
tojava XToolkit.awtLock();
tojava try {
tojava if (XToolkit.canUseXKBCalls()) {
tojava return xkeycode2keysym_xkb(ev, ndx);
tojava }else{
tojava return xkeycode2keysym_noxkb(ev, ndx);
tojava }
tojava } finally {
tojava XToolkit.awtUnlock();
tojava }
tojava }
tojava static long xkeycode2primary_keysym(XKeyEvent ev) {
tojava return xkeycode2keysym(ev, 0);
tojava }
tojava public static boolean isKPEvent( XKeyEvent ev )
tojava {
tojava // Xsun without XKB uses keysymarray[2] keysym to determine if it is KP event.
@ -236,6 +269,27 @@ tojava static int getJavaKeycodeOnly( XKeyEvent ev ) {
tojava Keysym2JavaKeycode jkc = getJavaKeycode( ev );
tojava return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode();
tojava }
tojava /**
tojava * Return an integer java keycode apprx as it was before extending keycodes range.
tojava * This call would ignore for instance XKB and process whatever is on the bottom
tojava * of keysym stack. Result will not depend on actual locale, will differ between
tojava * dual/multiple keyboard setup systems (e.g. English+Russian vs French+Russian)
tojava * but will be someway compatible with old releases.
tojava */
tojava static int getLegacyJavaKeycodeOnly( XKeyEvent ev ) {
tojava long keysym = XConstants.NoSymbol;
tojava int ndx = 0;
tojava if( (ev.get_state() & XToolkit.numLockMask) != 0 &&
tojava isKPEvent(ev)) {
tojava keysym = getKeypadKeysym( ev );
tojava } else {
tojava // we only need primary-layer keysym to derive a java keycode.
tojava ndx = 0;
tojava keysym = xkeycode2keysym_noxkb(ev, ndx);
tojava }
tojava Keysym2JavaKeycode jkc = keysym2JavaKeycodeHash.get( keysym );
tojava return jkc == null ? java.awt.event.KeyEvent.VK_UNDEFINED : jkc.getJavaKeycode();
tojava }
tojava static long javaKeycode2Keysym( int jkey ) {
tojava Long ks = javaKeycode2KeysymHash.get( jkey );
tojava return (ks == null ? 0 : ks.longValue());

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 795 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 741 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -450,4 +450,13 @@ public class X11GraphicsConfig extends GraphicsConfiguration
return 0x00; // UNDEFINED
}
}
/*
@Override
*/
public boolean isTranslucencyCapable() {
return isTranslucencyCapable(getAData());
}
private native boolean isTranslucencyCapable(long x11ConfigData);
}

View File

@ -336,6 +336,10 @@ public class MToolkit extends UNIXToolkit implements Runnable {
return null;
}
public KeyboardFocusManagerPeer createKeyboardFocusManagerPeer(KeyboardFocusManager manager) {
return null;
}
//public MEmbeddedFramePeer createEmbeddedFrame(MEmbeddedFrame target)
//{
//MEmbeddedFramePeer peer = new MEmbeddedFramePeer(target);

View File

@ -41,7 +41,6 @@ struct ComponentIDs {
jfieldID appContext;
jmethodID getParent;
jmethodID getLocationOnScreen;
jmethodID resetGCMID;
};
/* field and method IDs for Container */
@ -65,7 +64,3 @@ struct MComponentPeerIDs {
extern void processTree(Widget from, Widget to, Boolean action);
#endif // HEADLESS
/* fieldIDs for Canvas fields that may be accessed from C */
struct CanvasIDs {
jmethodID setGCFromPeerMID;
};

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -354,6 +354,48 @@ makeDefaultConfig(JNIEnv *env, int screen) {
return NULL;
}
/* Note: until we include the <X11/extensions/Xrender.h> explicitly
* we have to define a couple of things ourselves.
*/
typedef unsigned long PictFormat;
#define PictTypeIndexed 0
#define PictTypeDirect 1
typedef struct {
short red;
short redMask;
short green;
short greenMask;
short blue;
short blueMask;
short alpha;
short alphaMask;
} XRenderDirectFormat;
typedef struct {
PictFormat id;
int type;
int depth;
XRenderDirectFormat direct;
Colormap colormap;
} XRenderPictFormat;
#define PictFormatID (1 << 0)
#define PictFormatType (1 << 1)
#define PictFormatDepth (1 << 2)
#define PictFormatRed (1 << 3)
#define PictFormatRedMask (1 << 4)
#define PictFormatGreen (1 << 5)
#define PictFormatGreenMask (1 << 6)
#define PictFormatBlue (1 << 7)
#define PictFormatBlueMask (1 << 8)
#define PictFormatAlpha (1 << 9)
#define PictFormatAlphaMask (1 << 10)
#define PictFormatColormap (1 << 11)
typedef XRenderPictFormat *
XRenderFindVisualFormatFunc (Display *dpy, _Xconst Visual *visual);
static void
getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) {
@ -367,6 +409,9 @@ getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) {
int ind;
char errmsg[128];
int xinawareScreen;
void* xrenderLibHandle = NULL;
XRenderFindVisualFormatFunc *XRenderFindVisualFormat = NULL;
int major_opcode, first_event, first_error;
if (usingXinerama) {
xinawareScreen = 0;
@ -449,6 +494,26 @@ getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) {
graphicsConfigs[0] = defaultConfig;
nConfig = 1; /* reserve index 0 for default config */
// Only use the RENDER extension if it is available on the X server
if (XQueryExtension(awt_display, "RENDER",
&major_opcode, &first_event, &first_error))
{
xrenderLibHandle = dlopen("libXrender.so.1", RTLD_LAZY | RTLD_GLOBAL);
#ifndef __linux__ /* SOLARIS */
if (xrenderLibHandle == NULL) {
xrenderLibHandle = dlopen("/usr/sfw/lib/libXrender.so.1",
RTLD_LAZY | RTLD_GLOBAL);
}
#endif
if (xrenderLibHandle != NULL) {
XRenderFindVisualFormat =
(XRenderFindVisualFormatFunc*)dlsym(xrenderLibHandle,
"XRenderFindVisualFormat");
}
}
for (i = 0; i < nTrue; i++) {
if (XVisualIDFromVisual(pVITrue[i].visual) ==
XVisualIDFromVisual(defaultConfig->awt_visInfo.visual) ||
@ -462,6 +527,21 @@ getAllConfigs (JNIEnv *env, int screen, AwtScreenDataPtr screenDataPtr) {
graphicsConfigs [ind]->awt_depth = pVITrue [i].depth;
memcpy (&graphicsConfigs [ind]->awt_visInfo, &pVITrue [i],
sizeof (XVisualInfo));
if (XRenderFindVisualFormat != NULL) {
XRenderPictFormat *format = XRenderFindVisualFormat (awt_display,
pVITrue [i].visual);
if (format &&
format->type == PictTypeDirect &&
format->direct.alphaMask)
{
graphicsConfigs [ind]->isTranslucencySupported = 1;
}
}
}
if (xrenderLibHandle != NULL) {
dlclose(xrenderLibHandle);
xrenderLibHandle = NULL;
}
for (i = 0; i < n8p; i++) {
@ -1505,6 +1585,26 @@ Java_sun_awt_X11GraphicsConfig_swapBuffers
AWT_FLUSH_UNLOCK();
}
/*
* Class: sun_awt_X11GraphicsConfig
* Method: isTranslucencyCapable
* Signature: (J)V
*/
JNIEXPORT jboolean JNICALL
Java_sun_awt_X11GraphicsConfig_isTranslucencyCapable
(JNIEnv *env, jobject this, jlong configData)
{
#ifdef HEADLESS
return JNI_FALSE;
#else
AwtGraphicsConfigDataPtr aData = (AwtGraphicsConfigDataPtr)jlong_to_ptr(configData);
if (aData == NULL) {
return JNI_FALSE;
}
return (jboolean)aData->isTranslucencySupported;
#endif
}
/*
* Class: sun_awt_X11GraphicsDevice
* Method: isDBESupported

View File

@ -28,7 +28,6 @@
/* fieldIDs for Window fields that may be accessed from C */
struct WindowIDs {
jfieldID warningString;
jmethodID resetGCMID;
jfieldID locationByPlatform;
jfieldID isAutoRequestFocus;
};

View File

@ -1,5 +1,5 @@
/*
* Copyright 1995-2005 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1995-2009 Sun Microsystems, Inc. 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
@ -135,6 +135,7 @@ typedef struct _AwtGraphicsConfigData {
int pixelStride; /* Used in X11SurfaceData.c */
ColorData *color_data;
struct _GLXGraphicsConfigInfo *glxInfo;
int isTranslucencySupported; /* Uses Xrender to find this out. */
} AwtGraphicsConfigData;
typedef AwtGraphicsConfigData* AwtGraphicsConfigDataPtr;

View File

@ -43,4 +43,15 @@ typedef XRectangle RECT_T;
#define RECT_INC_HEIGHT(r) (r).height++
#if defined(__cplusplus)
extern "C" {
#endif
int BitmapToYXBandedRectangles(int bitsPerPixel, int width, int height,
unsigned char * buf, RECT_T * outBuf);
#if defined(__cplusplus)
}
#endif
#endif // _AWT_RECT_H

View File

@ -182,9 +182,6 @@ Java_java_awt_Component_initIDs
(*env)->GetMethodID(env, cls, "getLocationOnScreen_NoTreeLock",
"()Ljava/awt/Point;");
componentIDs.resetGCMID =
(*env)->GetMethodID(env, cls, "resetGC", "()V");
keyclass = (*env)->FindClass(env, "java/awt/event/KeyEvent");
DASSERT (keyclass != NULL);
@ -197,9 +194,6 @@ Java_java_awt_Component_initIDs
"Lsun/awt/AppContext;");
(*env)->DeleteLocalRef(env, keyclass);
DASSERT(componentIDs.resetGCMID);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2002-2009 Sun Microsystems, Inc. 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
@ -42,7 +42,9 @@
#include <jvm.h>
#include <Region.h>
#include "utility/rect.h"
#include <X11/XKBlib.h>
#if defined(DEBUG) || defined(INTERNAL_BUILD)
static jmethodID lockIsHeldMID = NULL;
@ -303,6 +305,20 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XRestackWindows
}
/*
* Class: XlibWrapper
* Method: XConfigureWindow
* Signature: (JJJJ)V
*/
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XConfigureWindow
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong value_mask,
jlong values)
{
AWT_CHECK_HAVE_LOCK();
XConfigureWindow((Display*)jlong_to_ptr(display), (Window)window,
(unsigned int)value_mask, (XWindowChanges*)jlong_to_ptr(values));
}
/*
* Class: XlibWrapper
* Method: XSetInputFocus
@ -434,6 +450,79 @@ JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XSelectInput
XSelectInput((Display *) jlong_to_ptr(display), (Window) window, mask);
}
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEvents
(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong bits_to_change, jlong values_for_bits)
{
AWT_CHECK_HAVE_LOCK();
XkbSelectEvents((Display *) jlong_to_ptr(display), (unsigned int)device,
(unsigned long)bits_to_change,
(unsigned long)values_for_bits);
}
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbSelectEventDetails
(JNIEnv *env, jclass clazz, jlong display, jlong device, jlong event_type, jlong bits_to_change, jlong values_for_bits)
{
AWT_CHECK_HAVE_LOCK();
XkbSelectEventDetails((Display *) jlong_to_ptr(display), (unsigned int)device,
(unsigned int) event_type,
(unsigned long)bits_to_change,
(unsigned long)values_for_bits);
}
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbQueryExtension
(JNIEnv *env, jclass clazz, jlong display, jlong opcode_rtrn, jlong event_rtrn,
jlong error_rtrn, jlong major_in_out, jlong minor_in_out)
{
AWT_CHECK_HAVE_LOCK();
return XkbQueryExtension( (Display *) jlong_to_ptr(display),
(int *) jlong_to_ptr(opcode_rtrn),
(int *) jlong_to_ptr(event_rtrn),
(int *) jlong_to_ptr(error_rtrn),
(int *) jlong_to_ptr(major_in_out),
(int *) jlong_to_ptr(minor_in_out));
}
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbLibraryVersion
(JNIEnv *env, jclass clazz, jlong lib_major_in_out, jlong lib_minor_in_out)
{
AWT_CHECK_HAVE_LOCK();
*((int *)lib_major_in_out) = XkbMajorVersion;
*((int *)lib_minor_in_out) = XkbMinorVersion;
return XkbLibraryVersion((int *)jlong_to_ptr(lib_major_in_out), (int *)jlong_to_ptr(lib_minor_in_out));
}
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetMap
(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong device_spec)
{
AWT_CHECK_HAVE_LOCK();
return (jlong) XkbGetMap( (Display *) jlong_to_ptr(display),
(unsigned int) which,
(unsigned int) device_spec);
}
JNIEXPORT jlong JNICALL Java_sun_awt_X11_XlibWrapper_XkbGetUpdatedMap
(JNIEnv *env, jclass clazz, jlong display, jlong which, jlong xkb)
{
AWT_CHECK_HAVE_LOCK();
return (jlong) XkbGetUpdatedMap( (Display *) jlong_to_ptr(display),
(unsigned int) which,
(XkbDescPtr) jlong_to_ptr(xkb));
}
JNIEXPORT void JNICALL Java_sun_awt_X11_XlibWrapper_XkbFreeKeyboard
(JNIEnv *env, jclass clazz, jlong xkb, jlong which, jboolean free_all)
{
AWT_CHECK_HAVE_LOCK();
XkbFreeKeyboard(jlong_to_ptr(xkb), (unsigned int)which, free_all);
}
JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XlibWrapper_XkbTranslateKeyCode
(JNIEnv *env, jclass clazz, jlong xkb, jint keycode, jlong mods, jlong mods_rtrn, jlong keysym_rtrn)
{
Bool b;
b = XkbTranslateKeyCode((XkbDescPtr)xkb, (unsigned int)keycode, (unsigned int)mods,
(unsigned int *)jlong_to_ptr(mods_rtrn),
(KeySym *)jlong_to_ptr(keysym_rtrn));
//printf("native, input: keycode:0x%0X; mods:0x%0X\n", keycode, mods);
//printf("native, output: keysym:0x%0X; mods:0x%0X\n", *(unsigned int *)jlong_to_ptr(keysym_rtrn), *(unsigned int *)jlong_to_ptr(mods_rtrn));
return b;
}
/*
* Class: sun_awt_X11_XlibWrapper
* Method: XNextEvent
@ -1657,6 +1746,39 @@ Java_sun_awt_X11_XlibWrapper_XKeycodeToKeysym(JNIEnv *env, jclass clazz,
return XKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (int)index);
}
JNIEXPORT jint JNICALL
Java_sun_awt_X11_XlibWrapper_XkbGetEffectiveGroup(JNIEnv *env, jclass clazz,
jlong display) {
XkbStateRec sr;
AWT_CHECK_HAVE_LOCK();
memset(&sr, 0, sizeof(XkbStateRec));
XkbGetState((Display*) jlong_to_ptr(display), XkbUseCoreKbd, &sr);
// printf("-------------------------------------VVVV\n");
// printf(" group:0x%0X\n",sr.group);
// printf(" base_group:0x%0X\n",sr.base_group);
// printf(" latched_group:0x%0X\n",sr.latched_group);
// printf(" locked_group:0x%0X\n",sr.locked_group);
// printf(" mods:0x%0X\n",sr.mods);
// printf(" base_mods:0x%0X\n",sr.base_mods);
// printf(" latched_mods:0x%0X\n",sr.latched_mods);
// printf(" locked_mods:0x%0X\n",sr.locked_mods);
// printf(" compat_state:0x%0X\n",sr.compat_state);
// printf(" grab_mods:0x%0X\n",sr.grab_mods);
// printf(" compat_grab_mods:0x%0X\n",sr.compat_grab_mods);
// printf(" lookup_mods:0x%0X\n",sr.lookup_mods);
// printf(" compat_lookup_mods:0x%0X\n",sr.compat_lookup_mods);
// printf(" ptr_buttons:0x%0X\n",sr.ptr_buttons);
// printf("-------------------------------------^^^^\n");
return (jint)(sr.group);
}
JNIEXPORT jlong JNICALL
Java_sun_awt_X11_XlibWrapper_XkbKeycodeToKeysym(JNIEnv *env, jclass clazz,
jlong display, jint keycode,
jint group, jint level) {
AWT_CHECK_HAVE_LOCK();
return XkbKeycodeToKeysym((Display*) jlong_to_ptr(display), (unsigned int)keycode, (unsigned int)group, (unsigned int)level);
}
JNIEXPORT jint JNICALL
Java_sun_awt_X11_XlibWrapper_XKeysymToKeycode(JNIEnv *env, jclass clazz,
jlong display, jlong keysym) {
@ -1945,3 +2067,77 @@ Java_sun_awt_X11_XlibWrapper_SetRectangularShape
ShapeBounding, 0, 0, None, ShapeSet);
}
}
/*
* Class: XlibWrapper
* Method: SetZOrder
*/
JNIEXPORT void JNICALL
Java_sun_awt_X11_XlibWrapper_SetZOrder
(JNIEnv *env, jclass clazz, jlong display, jlong window, jlong above)
{
AWT_CHECK_HAVE_LOCK();
XWindowChanges wc;
wc.sibling = (Window)jlong_to_ptr(above);
unsigned int value_mask = CWStackMode;
if (above == 0) {
wc.stack_mode = Above;
} else {
wc.stack_mode = Below;
value_mask |= CWSibling;
}
XConfigureWindow((Display *)jlong_to_ptr(display),
(Window)jlong_to_ptr(window),
value_mask, &wc );
}
/*
* Class: XlibWrapper
* Method: SetBitmapShape
*/
JNIEXPORT void JNICALL
Java_sun_awt_X11_XlibWrapper_SetBitmapShape
(JNIEnv *env, jclass clazz, jlong display, jlong window,
jint width, jint height, jintArray bitmap)
{
jsize len;
jint *values;
jboolean isCopy = JNI_FALSE;
size_t worstBufferSize = (size_t)((width / 2 + 1) * height);
RECT_T * pRect;
AWT_CHECK_HAVE_LOCK();
len = (*env)->GetArrayLength(env, bitmap);
if (len == 0 || len < width * height) {
return;
}
values = (*env)->GetIntArrayElements(env, bitmap, &isCopy);
if (JNU_IsNull(env, values)) {
return;
}
pRect = (RECT_T *)malloc(worstBufferSize * sizeof(RECT_T));
/* Note: the values[0] and values[1] are supposed to contain the width
* and height (see XIconInfo.getIntData() for details). So, we do +2.
*/
int numrects = BitmapToYXBandedRectangles(32, (int)width, (int)height,
(unsigned char *)(values + 2), pRect);
XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
ShapeClip, 0, 0, pRect, numrects, ShapeSet, YXBanded);
XShapeCombineRectangles((Display *)jlong_to_ptr(display), (Window)jlong_to_ptr(window),
ShapeBounding, 0, 0, pRect, numrects, ShapeSet, YXBanded);
free(pRect);
(*env)->ReleaseIntArrayElements(env, bitmap, values, JNI_ABORT);
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -331,4 +331,12 @@ public class Win32GraphicsConfig extends GraphicsConfiguration
}
// the rest of the flip actions are not supported
}
/*
@Override
*/
public boolean isTranslucencyCapable() {
//XXX: worth checking if 8-bit? Anyway, it doesn't hurt.
return true;
}
}

View File

@ -380,7 +380,6 @@ public class Win32GraphicsDevice extends GraphicsDevice implements
// fix for 4868278
peer.updateGC();
peer.resetTargetGC();
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1997-2008 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-2009 Sun Microsystems, Inc. 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
@ -398,4 +398,11 @@ public class Win32GraphicsEnvironment
public boolean isDisplayLocal() {
return true;
}
/**
* Used to find out if the OS is Windows Vista or later.
*
* @return {@code true} if the OS is Vista or later, {@code false} otherwise
*/
public static native boolean isVistaOS();
}

View File

@ -0,0 +1,398 @@
/*
* Copyright 2008-2009 Sun Microsystems, Inc. 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. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package sun.awt.windows;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Window;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import java.awt.image.VolatileImage;
import java.lang.ref.WeakReference;
import java.security.AccessController;
import sun.awt.image.BufImgSurfaceData;
import sun.java2d.DestSurfaceProvider;
import sun.java2d.InvalidPipeException;
import sun.java2d.Surface;
import sun.java2d.pipe.RenderQueue;
import sun.java2d.pipe.hw.AccelGraphicsConfig;
import sun.java2d.pipe.hw.AccelSurface;
import sun.security.action.GetPropertyAction;
import static java.awt.image.VolatileImage.*;
import static java.awt.Transparency.*;
import static sun.java2d.pipe.hw.AccelSurface.*;
import static sun.java2d.pipe.hw.ContextCapabilities.*;
/**
* This class handles the updates of the non-opaque windows.
* The window associated with the peer is updated either given an image or
* the window is repainted to an internal buffer which is then used to update
* the window.
*
* Note: this class does not attempt to be thread safe, it is expected to be
* called from a single thread (EDT).
*/
public abstract class TranslucentWindowPainter {
protected Window window;
protected WWindowPeer peer;
// REMIND: we probably would want to remove this later
private static final boolean forceOpt =
Boolean.valueOf(AccessController.doPrivileged(
new GetPropertyAction("sun.java2d.twp.forceopt", "false")));
private static final boolean forceSW =
Boolean.valueOf(AccessController.doPrivileged(
new GetPropertyAction("sun.java2d.twp.forcesw", "false")));
/**
* Creates an instance of the painter for particular peer.
*/
public static TranslucentWindowPainter createInstance(WWindowPeer peer) {
GraphicsConfiguration gc = peer.getGraphicsConfiguration();
if (!forceSW && gc instanceof AccelGraphicsConfig) {
String gcName = gc.getClass().getSimpleName();
AccelGraphicsConfig agc = (AccelGraphicsConfig)gc;
// this is a heuristic to check that we have a pcix board
// (those have higher transfer rate from gpu to cpu)
if ((agc.getContextCapabilities().getCaps() & CAPS_PS30) != 0 ||
forceOpt)
{
// we check for name to avoid loading classes unnecessarily if
// a pipeline isn't enabled
if (gcName.startsWith("D3D")) {
return new VIOptD3DWindowPainter(peer);
} else if (forceOpt && gcName.startsWith("WGL")) {
// on some boards (namely, ATI, even on pcix bus) ogl is
// very slow reading pixels back so for now it is disabled
// unless forced
return new VIOptWGLWindowPainter(peer);
}
}
}
return new BIWindowPainter(peer);
}
protected TranslucentWindowPainter(WWindowPeer peer) {
this.peer = peer;
this.window = (Window)peer.getTarget();
}
/**
* Creates (if needed), clears and returns the buffer for this painter.
*/
protected abstract Image getBackBuffer();
/**
* Updates the the window associated with this painter with the contents
* of the passed image.
* The image can not be null, and NPE will be thrown if it is.
*/
protected abstract boolean update(Image bb);
/**
* Flushes the resources associated with the painter. They will be
* recreated as needed.
*/
public abstract void flush();
/**
* Updates the window associated with the painter given the passed image.
* If the passed image is null the painter will use its own buffer for
* rendering the contents of the window into it and updating the window.
*
* If the passed buffer has dimensions different from the window, it is
* copied into the internal buffer first and the latter is used to update
* the window.
*
* @param bb the image to update the non opaque window with, or null.
* If not null, the image must be of ARGB_PRE type.
*/
public void updateWindow(Image bb) {
boolean done = false;
if (bb != null && (window.getWidth() != bb.getWidth(null) ||
window.getHeight() != bb.getHeight(null)))
{
Image ourBB = getBackBuffer();
Graphics2D g = (Graphics2D)ourBB.getGraphics();
g.drawImage(bb, 0, 0, null);
g.dispose();
bb = ourBB;
}
do {
if (bb == null) {
bb = getBackBuffer();
Graphics2D g = (Graphics2D)bb.getGraphics();
try {
window.paintAll(g);
} finally {
g.dispose();
}
}
peer.paintAppletWarning((Graphics2D)bb.getGraphics(),
bb.getWidth(null), bb.getHeight(null));
done = update(bb);
// in case they passed us a lost VI, next time around we'll use our
// own bb because we can not validate and restore the contents of
// their VI
if (!done) {
bb = null;
}
} while (!done);
}
private static final Image clearImage(Image bb) {
Graphics2D g = (Graphics2D)bb.getGraphics();
int w = bb.getWidth(null);
int h = bb.getHeight(null);
g.setComposite(AlphaComposite.Src);
g.setColor(new Color(0, 0, 0, 0));
g.fillRect(0, 0, w, h);
return bb;
}
/**
* A painter which uses BufferedImage as the internal buffer. The window
* is painted into this buffer, and the contents then are uploaded
* into the layered window.
*
* This painter handles all types of images passed to its paint(Image)
* method (VI, BI, regular Images).
*/
private static class BIWindowPainter extends TranslucentWindowPainter {
private WeakReference<BufferedImage> biRef;
protected BIWindowPainter(WWindowPeer peer) {
super(peer);
}
private BufferedImage getBIBackBuffer() {
int w = window.getWidth();
int h = window.getHeight();
BufferedImage bb = biRef == null ? null : biRef.get();
if (bb == null || bb.getWidth() != w || bb.getHeight() != h) {
if (bb != null) {
bb.flush();
bb = null;
}
bb = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);
biRef = new WeakReference<BufferedImage>(bb);
}
return (BufferedImage)clearImage(bb);
}
@Override
protected Image getBackBuffer() {
return getBIBackBuffer();
}
@Override
protected boolean update(Image bb) {
VolatileImage viBB = null;
if (bb instanceof BufferedImage) {
BufferedImage bi = (BufferedImage)bb;
int data[] =
((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
peer.updateWindowImpl(data, bi.getWidth(), bi.getHeight());
return true;
} else if (bb instanceof VolatileImage) {
viBB = (VolatileImage)bb;
if (bb instanceof DestSurfaceProvider) {
Surface s = ((DestSurfaceProvider)bb).getDestSurface();
if (s instanceof BufImgSurfaceData) {
// the image is probably lost, upload the data from the
// backup surface to avoid creating another heap-based
// image (the parent's buffer)
int w = viBB.getWidth();
int h = viBB.getHeight();
BufImgSurfaceData bisd = (BufImgSurfaceData)s;
int data[] = ((DataBufferInt)bisd.getRaster(0,0,w,h).
getDataBuffer()).getData();
peer.updateWindowImpl(data, w, h);
return true;
}
}
}
// copy the passed image into our own buffer, then upload
BufferedImage bi = getBIBackBuffer();
Graphics2D g = (Graphics2D)bi.getGraphics();
g.setComposite(AlphaComposite.Src);
g.drawImage(bb, 0, 0, null);
int data[] =
((DataBufferInt)bi.getRaster().getDataBuffer()).getData();
peer.updateWindowImpl(data, bi.getWidth(), bi.getHeight());
return (viBB != null ? !viBB.contentsLost() : true);
}
public void flush() {
if (biRef != null) {
biRef.clear();
}
}
}
/**
* A version of the painter which uses VolatileImage as the internal buffer.
* The window is painted into this VI and then copied into the parent's
* Java heap-based buffer (which is then uploaded to the layered window)
*/
private static class VIWindowPainter extends BIWindowPainter {
private WeakReference<VolatileImage> viRef;
protected VIWindowPainter(WWindowPeer peer) {
super(peer);
}
@Override
protected Image getBackBuffer() {
int w = window.getWidth();
int h = window.getHeight();
GraphicsConfiguration gc = peer.getGraphicsConfiguration();
VolatileImage viBB = viRef == null ? null : viRef.get();
if (viBB == null || viBB.getWidth() != w || viBB.getHeight() != h ||
viBB.validate(gc) == IMAGE_INCOMPATIBLE)
{
if (viBB != null) {
viBB.flush();
viBB = null;
}
if (gc instanceof AccelGraphicsConfig) {
AccelGraphicsConfig agc = ((AccelGraphicsConfig)gc);
viBB = agc.createCompatibleVolatileImage(w, h,
TRANSLUCENT,
RT_PLAIN);
}
if (viBB == null) {
viBB = gc.createCompatibleVolatileImage(w, h, TRANSLUCENT);
}
viBB.validate(gc);
viRef = new WeakReference<VolatileImage>(viBB);
}
return clearImage(viBB);
}
@Override
public void flush() {
if (viRef != null) {
VolatileImage viBB = viRef.get();
if (viBB != null) {
viBB.flush();
viBB = null;
}
viRef.clear();
}
}
}
/**
* Optimized version of hw painter. Uses VolatileImages for the
* buffer, and uses an optimized path to pull the data from those into
* the layered window, bypassing Java heap-based image.
*/
private abstract static class VIOptWindowPainter extends VIWindowPainter {
protected VIOptWindowPainter(WWindowPeer peer) {
super(peer);
}
protected abstract boolean updateWindowAccel(long psdops, int w, int h);
@Override
protected boolean update(Image bb) {
if (bb instanceof DestSurfaceProvider) {
Surface s = ((DestSurfaceProvider)bb).getDestSurface();
if (s instanceof AccelSurface) {
final int w = bb.getWidth(null);
final int h = bb.getHeight(null);
final boolean arr[] = { false };
final AccelSurface as = (AccelSurface)s;
RenderQueue rq = as.getContext().getRenderQueue();
rq.lock();
try {
as.getContext().validateContext(as);
rq.flushAndInvokeNow(new Runnable() {
public void run() {
long psdops = as.getNativeOps();
arr[0] = updateWindowAccel(psdops, w, h);
}
});
} catch (InvalidPipeException e) {
// ignore, false will be returned
} finally {
rq.unlock();
}
return arr[0];
}
}
return super.update(bb);
}
}
private static class VIOptD3DWindowPainter extends VIOptWindowPainter {
protected VIOptD3DWindowPainter(WWindowPeer peer) {
super(peer);
}
@Override
protected boolean updateWindowAccel(long psdops, int w, int h) {
// note: this method is executed on the toolkit thread, no sync is
// necessary at the native level, and a pointer to peer can be used
return sun.java2d.d3d.D3DSurfaceData.
updateWindowAccelImpl(psdops, peer.getData(), w, h);
}
}
private static class VIOptWGLWindowPainter extends VIOptWindowPainter {
protected VIOptWGLWindowPainter(WWindowPeer peer) {
super(peer);
}
@Override
protected boolean updateWindowAccel(long psdops, int w, int h) {
// note: part of this method which deals with GDI will be on the
// toolkit thread
return sun.java2d.opengl.WGLSurfaceData.
updateWindowAccelImpl(psdops, peer, w, h);
}
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright 1996-2007 Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1996-2009 Sun Microsystems, Inc. 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
@ -28,6 +28,7 @@ import java.awt.*;
import java.awt.peer.*;
import java.lang.ref.WeakReference;
import java.lang.reflect.Method;
import sun.awt.AWTAccessor;
import sun.awt.ComponentAccessor;
import sun.awt.SunToolkit;
import sun.awt.Win32GraphicsDevice;
@ -37,44 +38,12 @@ class WCanvasPeer extends WComponentPeer implements CanvasPeer {
private boolean eraseBackground;
Method resetGCMethod;
// Toolkit & peer internals
WCanvasPeer(Component target) {
super(target);
}
/*
* From the DisplayChangedListener interface.
*
* Overrides WComponentPeer version because Canvases can be created with
* a non-defulat GraphicsConfiguration, which is no longer valid.
* Up-called for other windows peer instances (WPanelPeer, WWindowPeer).
*/
public void displayChanged() {
clearLocalGC();
resetTargetGC();
super.displayChanged();
}
/*
* Reset the graphicsConfiguration member of our target Component.
* Component.resetGC() is a package-private method, so we have to call it
* through reflection.
*/
public void resetTargetGC() {
ComponentAccessor.resetGC((Component)target);
}
/*
* Clears the peer's winGraphicsConfig member.
* Overridden by WWindowPeer, which shouldn't have a null winGraphicsConfig.
*/
void clearLocalGC() {
winGraphicsConfig = null;
}
native void create(WComponentPeer parent);
void initialize() {
@ -110,6 +79,9 @@ class WCanvasPeer extends WComponentPeer implements CanvasPeer {
}
public void print(Graphics g) {
if (!(target instanceof Window) ||
AWTAccessor.getWindowAccessor().isOpaque((Window)target))
{
Dimension d = ((Component)target).getSize();
if (g instanceof Graphics2D ||
g instanceof sun.awt.Graphics2Delegate) {
@ -121,6 +93,7 @@ class WCanvasPeer extends WComponentPeer implements CanvasPeer {
g.fillRect(0, 0, d.width, d.height);
g.setColor(((Component)target).getForeground());
}
}
super.print(g);
}
@ -147,4 +120,10 @@ class WCanvasPeer extends WComponentPeer implements CanvasPeer {
*/
private native void setNativeBackgroundErase(boolean doErase,
boolean doEraseOnResize);
public GraphicsConfiguration getAppropriateGraphicsConfiguration(
GraphicsConfiguration gc)
{
return gc;
}
}

Some files were not shown because too many files have changed in this diff Show More