8039269: images/cursors should not be in ${java.home}/lib
Reviewed-by: mchung, alanb, erikj
@ -100,34 +100,3 @@ $(LIB_DST_DIR)/%: $(PSFONTPROPFILE_SRC_DIR)/%
|
|||||||
TARGETS += $(PSFONTPROPFILE_TARGET_FILES)
|
TARGETS += $(PSFONTPROPFILE_TARGET_FILES)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
#
|
|
||||||
# Copy cursor.properties and cursors gif files to LIB_DST_DIR
|
|
||||||
#
|
|
||||||
ifneq ($(OPENJDK_TARGET_OS), macosx)
|
|
||||||
OPENJDK_TARGET_OS_LIB_SRC := $(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/conf
|
|
||||||
else
|
|
||||||
OPENJDK_TARGET_OS_LIB_SRC := $(JDK_TOPDIR)/src/java.desktop/macosx/conf
|
|
||||||
endif
|
|
||||||
|
|
||||||
CURSORS_DEST_DIR := $(LIB_DST_DIR)/images/cursors
|
|
||||||
CURSORS_OPENJDK_TARGET_OS_LIB_SRC := $(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/conf/images/cursors
|
|
||||||
|
|
||||||
$(CURSORS_DEST_DIR)/cursors.properties: $(CURSORS_OPENJDK_TARGET_OS_LIB_SRC)/cursors.properties
|
|
||||||
$(call install-file)
|
|
||||||
|
|
||||||
TARGETS += $(CURSORS_DEST_DIR)/cursors.properties
|
|
||||||
|
|
||||||
CURSORS_LIB_SRC := $(JDK_TOPDIR)/src/java.desktop/share/conf/images/cursors
|
|
||||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
|
||||||
CURSORS_SRC_FILES := $(CURSORS_LIB_SRC)/invalid32x32.gif $(wildcard $(CURSORS_LIB_SRC)/win32_*.gif)
|
|
||||||
else # OPENJDK_TARGET_OS
|
|
||||||
CURSORS_SRC_FILES := $(CURSORS_LIB_SRC)/invalid32x32.gif $(wildcard $(CURSORS_LIB_SRC)/motif_*.gif)
|
|
||||||
endif # OPENJDK_TARGET_OS
|
|
||||||
CURSORS_TARGET_FILES := $(subst $(CURSORS_LIB_SRC),$(CURSORS_DEST_DIR),$(CURSORS_SRC_FILES))
|
|
||||||
|
|
||||||
$(CURSORS_DEST_DIR)/%: $(CURSORS_LIB_SRC)/%
|
|
||||||
$(call install-file)
|
|
||||||
|
|
||||||
TARGETS += $(CURSORS_TARGET_FILES)
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
@ -66,8 +66,11 @@ else
|
|||||||
PROP_SRC_DIRS += $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/resources
|
PROP_SRC_DIRS += $(JDK_TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/resources
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
PROP_SRC_FILES := $(filter-out %cursors.properties, \
|
||||||
|
$(filter %.properties, $(call CacheFind, $(PROP_SRC_DIRS))))
|
||||||
|
|
||||||
$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \
|
$(eval $(call SetupCompileProperties,COMPILE_PROPERTIES, \
|
||||||
$(filter %.properties, $(call CacheFind, $(PROP_SRC_DIRS))), ListResourceBundle))
|
$(PROP_SRC_FILES), ListResourceBundle))
|
||||||
|
|
||||||
GENSRC_JAVA_DESKTOP += $(COMPILE_PROPERTIES)
|
GENSRC_JAVA_DESKTOP += $(COMPILE_PROPERTIES)
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -24,18 +24,17 @@
|
|||||||
*/
|
*/
|
||||||
package java.awt;
|
package java.awt;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
|
|
||||||
import java.beans.ConstructorProperties;
|
import java.beans.ConstructorProperties;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.security.AccessController;
|
||||||
|
import java.security.PrivilegedExceptionAction;
|
||||||
import java.util.Hashtable;
|
import java.util.Hashtable;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
import java.security.AccessController;
|
|
||||||
|
|
||||||
import sun.util.logging.PlatformLogger;
|
|
||||||
import sun.awt.AWTAccessor;
|
import sun.awt.AWTAccessor;
|
||||||
|
import sun.util.logging.PlatformLogger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A class to encapsulate the bitmap representation of the mouse cursor.
|
* A class to encapsulate the bitmap representation of the mouse cursor.
|
||||||
@ -160,28 +159,19 @@ public class Cursor implements java.io.Serializable {
|
|||||||
public static final int CUSTOM_CURSOR = -1;
|
public static final int CUSTOM_CURSOR = -1;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* hashtable, filesystem dir prefix, filename, and properties for custom cursors support
|
* hashtable, resource prefix, filename, and properties for custom cursors
|
||||||
|
* support
|
||||||
*/
|
*/
|
||||||
|
|
||||||
private static final Hashtable<String,Cursor> systemCustomCursors = new Hashtable<>(1);
|
private static final Hashtable<String,Cursor> systemCustomCursors = new Hashtable<>(1);
|
||||||
private static final String systemCustomCursorDirPrefix = initCursorDir();
|
private static final String RESOURCE_PREFIX = "/sun/awt/resources/cursors/";
|
||||||
|
private static final String PROPERTIES_FILE = RESOURCE_PREFIX + "cursors.properties";
|
||||||
private static String initCursorDir() {
|
|
||||||
String jhome = java.security.AccessController.doPrivileged(
|
|
||||||
new sun.security.action.GetPropertyAction("java.home"));
|
|
||||||
return jhome +
|
|
||||||
File.separator + "lib" + File.separator + "images" +
|
|
||||||
File.separator + "cursors" + File.separator;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String systemCustomCursorPropertiesFile = systemCustomCursorDirPrefix + "cursors.properties";
|
|
||||||
|
|
||||||
private static Properties systemCustomCursorProperties = null;
|
private static Properties systemCustomCursorProperties = null;
|
||||||
|
|
||||||
private static final String CursorDotPrefix = "Cursor.";
|
private static final String CURSOR_DOT_PREFIX = "Cursor.";
|
||||||
private static final String DotFileSuffix = ".File";
|
private static final String DOT_FILE_SUFFIX = ".File";
|
||||||
private static final String DotHotspotSuffix = ".HotSpot";
|
private static final String DOT_HOTSPOT_SUFFIX = ".HotSpot";
|
||||||
private static final String DotNameSuffix = ".Name";
|
private static final String DOT_NAME_SUFFIX = ".Name";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* JDK 1.1 serialVersionUID
|
* JDK 1.1 serialVersionUID
|
||||||
@ -307,8 +297,8 @@ public class Cursor implements java.io.Serializable {
|
|||||||
loadSystemCustomCursorProperties();
|
loadSystemCustomCursorProperties();
|
||||||
}
|
}
|
||||||
|
|
||||||
String prefix = CursorDotPrefix + name;
|
String prefix = CURSOR_DOT_PREFIX + name;
|
||||||
String key = prefix + DotFileSuffix;
|
String key = prefix + DOT_FILE_SUFFIX;
|
||||||
|
|
||||||
if (!systemCustomCursorProperties.containsKey(key)) {
|
if (!systemCustomCursorProperties.containsKey(key)) {
|
||||||
if (log.isLoggable(PlatformLogger.Level.FINER)) {
|
if (log.isLoggable(PlatformLogger.Level.FINER)) {
|
||||||
@ -320,11 +310,10 @@ public class Cursor implements java.io.Serializable {
|
|||||||
final String fileName =
|
final String fileName =
|
||||||
systemCustomCursorProperties.getProperty(key);
|
systemCustomCursorProperties.getProperty(key);
|
||||||
|
|
||||||
String localized = systemCustomCursorProperties.getProperty(prefix + DotNameSuffix);
|
final String localized = systemCustomCursorProperties.getProperty(
|
||||||
|
prefix + DOT_NAME_SUFFIX, name);
|
||||||
|
|
||||||
if (localized == null) localized = name;
|
String hotspot = systemCustomCursorProperties.getProperty(prefix + DOT_HOTSPOT_SUFFIX);
|
||||||
|
|
||||||
String hotspot = systemCustomCursorProperties.getProperty(prefix + DotHotspotSuffix);
|
|
||||||
|
|
||||||
if (hotspot == null)
|
if (hotspot == null)
|
||||||
throw new AWTException("no hotspot property defined for cursor: " + name);
|
throw new AWTException("no hotspot property defined for cursor: " + name);
|
||||||
@ -334,31 +323,25 @@ public class Cursor implements java.io.Serializable {
|
|||||||
if (st.countTokens() != 2)
|
if (st.countTokens() != 2)
|
||||||
throw new AWTException("failed to parse hotspot property for cursor: " + name);
|
throw new AWTException("failed to parse hotspot property for cursor: " + name);
|
||||||
|
|
||||||
int x = 0;
|
final Point hotPoint;
|
||||||
int y = 0;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
x = Integer.parseInt(st.nextToken());
|
hotPoint = new Point(Integer.parseInt(st.nextToken()),
|
||||||
y = Integer.parseInt(st.nextToken());
|
Integer.parseInt(st.nextToken()));
|
||||||
} catch (NumberFormatException nfe) {
|
} catch (NumberFormatException nfe) {
|
||||||
throw new AWTException("failed to parse hotspot property for cursor: " + name);
|
throw new AWTException("failed to parse hotspot property for cursor: " + name);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
final int fx = x;
|
final Toolkit toolkit = Toolkit.getDefaultToolkit();
|
||||||
final int fy = y;
|
final String file = RESOURCE_PREFIX + fileName;
|
||||||
final String flocalized = localized;
|
|
||||||
|
|
||||||
cursor = java.security.AccessController.<Cursor>doPrivileged(
|
cursor = AccessController.doPrivileged(
|
||||||
new java.security.PrivilegedExceptionAction<Cursor>() {
|
(PrivilegedExceptionAction<Cursor>) () -> {
|
||||||
public Cursor run() throws Exception {
|
URL url = Cursor.class.getResource(file);
|
||||||
Toolkit toolkit = Toolkit.getDefaultToolkit();
|
Image image = toolkit.getImage(url);
|
||||||
Image image = toolkit.getImage(
|
return toolkit.createCustomCursor(image, hotPoint,
|
||||||
systemCustomCursorDirPrefix + fileName);
|
localized);
|
||||||
return toolkit.createCustomCursor(
|
});
|
||||||
image, new Point(fx,fy), flocalized);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new AWTException(
|
throw new AWTException(
|
||||||
"Exception: " + e.getClass() + " " + e.getMessage() +
|
"Exception: " + e.getClass() + " " + e.getMessage() +
|
||||||
@ -452,26 +435,19 @@ public class Cursor implements java.io.Serializable {
|
|||||||
systemCustomCursorProperties = new Properties();
|
systemCustomCursorProperties = new Properties();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
AccessController.<Object>doPrivileged(
|
AccessController.doPrivileged(
|
||||||
new java.security.PrivilegedExceptionAction<Object>() {
|
(PrivilegedExceptionAction<Object>) () -> {
|
||||||
public Object run() throws Exception {
|
try (InputStream is = Cursor.class
|
||||||
FileInputStream fis = null;
|
.getResourceAsStream(PROPERTIES_FILE)) {
|
||||||
try {
|
systemCustomCursorProperties.load(is);
|
||||||
fis = new FileInputStream(
|
}
|
||||||
systemCustomCursorPropertiesFile);
|
return null;
|
||||||
systemCustomCursorProperties.load(fis);
|
});
|
||||||
} finally {
|
|
||||||
if (fis != null)
|
|
||||||
fis.close();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
systemCustomCursorProperties = null;
|
systemCustomCursorProperties = null;
|
||||||
throw new AWTException("Exception: " + e.getClass() + " " +
|
throw new AWTException("Exception: " + e.getClass() + " " +
|
||||||
e.getMessage() + " occurred while loading: " +
|
e.getMessage() + " occurred while loading: " +
|
||||||
systemCustomCursorPropertiesFile);
|
PROPERTIES_FILE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 158 B After Width: | Height: | Size: 158 B |
Before Width: | Height: | Size: 162 B After Width: | Height: | Size: 162 B |
Before Width: | Height: | Size: 141 B After Width: | Height: | Size: 141 B |
@ -11,27 +11,27 @@
|
|||||||
# Cursor.<name>.<geom>.HotSpot=<x>,<y>
|
# Cursor.<name>.<geom>.HotSpot=<x>,<y>
|
||||||
# Cursor.<name>.<geom>.Name=<localized name>
|
# Cursor.<name>.<geom>.Name=<localized name>
|
||||||
#
|
#
|
||||||
Cursor.CopyDrop.32x32.File=motif_CopyDrop32x32.gif
|
Cursor.CopyDrop.32x32.File=CopyDrop32x32.gif
|
||||||
Cursor.CopyDrop.32x32.HotSpot=0,0
|
Cursor.CopyDrop.32x32.HotSpot=0,0
|
||||||
Cursor.CopyDrop.32x32.Name=CopyDrop32x32
|
Cursor.CopyDrop.32x32.Name=CopyDrop32x32
|
||||||
#
|
#
|
||||||
Cursor.MoveDrop.32x32.File=motif_MoveDrop32x32.gif
|
Cursor.MoveDrop.32x32.File=MoveDrop32x32.gif
|
||||||
Cursor.MoveDrop.32x32.HotSpot=0,0
|
Cursor.MoveDrop.32x32.HotSpot=0,0
|
||||||
Cursor.MoveDrop.32x32.Name=MoveDrop32x32
|
Cursor.MoveDrop.32x32.Name=MoveDrop32x32
|
||||||
#
|
#
|
||||||
Cursor.LinkDrop.32x32.File=motif_LinkDrop32x32.gif
|
Cursor.LinkDrop.32x32.File=LinkDrop32x32.gif
|
||||||
Cursor.LinkDrop.32x32.HotSpot=0,0
|
Cursor.LinkDrop.32x32.HotSpot=0,0
|
||||||
Cursor.LinkDrop.32x32.Name=LinkDrop32x32
|
Cursor.LinkDrop.32x32.Name=LinkDrop32x32
|
||||||
#
|
#
|
||||||
Cursor.CopyNoDrop.32x32.File=motif_CopyNoDrop32x32.gif
|
Cursor.CopyNoDrop.32x32.File=invalid32x32.gif
|
||||||
Cursor.CopyNoDrop.32x32.HotSpot=6,2
|
Cursor.CopyNoDrop.32x32.HotSpot=6,2
|
||||||
Cursor.CopyNoDrop.32x32.Name=CopyNoDrop32x32
|
Cursor.CopyNoDrop.32x32.Name=CopyNoDrop32x32
|
||||||
#
|
#
|
||||||
Cursor.MoveNoDrop.32x32.File=motif_MoveNoDrop32x32.gif
|
Cursor.MoveNoDrop.32x32.File=invalid32x32.gif
|
||||||
Cursor.MoveNoDrop.32x32.HotSpot=6,2
|
Cursor.MoveNoDrop.32x32.HotSpot=6,2
|
||||||
Cursor.MoveNoDrop.32x32.Name=MoveNoDrop32x32
|
Cursor.MoveNoDrop.32x32.Name=MoveNoDrop32x32
|
||||||
#
|
#
|
||||||
Cursor.LinkNoDrop.32x32.File=motif_LinkNoDrop32x32.gif
|
Cursor.LinkNoDrop.32x32.File=invalid32x32.gif
|
||||||
Cursor.LinkNoDrop.32x32.HotSpot=6,2
|
Cursor.LinkNoDrop.32x32.HotSpot=6,2
|
||||||
Cursor.LinkNoDrop.32x32.Name=LinkNoDrop32x32
|
Cursor.LinkNoDrop.32x32.Name=LinkNoDrop32x32
|
||||||
#
|
#
|
Before Width: | Height: | Size: 153 B After Width: | Height: | Size: 153 B |
Before Width: | Height: | Size: 153 B |
Before Width: | Height: | Size: 153 B |
Before Width: | Height: | Size: 153 B |
Before Width: | Height: | Size: 153 B |
Before Width: | Height: | Size: 153 B |
Before Width: | Height: | Size: 153 B |
Before Width: | Height: | Size: 165 B After Width: | Height: | Size: 165 B |
Before Width: | Height: | Size: 168 B After Width: | Height: | Size: 168 B |
Before Width: | Height: | Size: 147 B After Width: | Height: | Size: 147 B |
@ -1,40 +0,0 @@
|
|||||||
#
|
|
||||||
#
|
|
||||||
# Cursors Properties file
|
|
||||||
#
|
|
||||||
# Names GIF89 sources for Custom Cursors and their associated HotSpots
|
|
||||||
#
|
|
||||||
# Note: the syntax of the property name is significant and is parsed
|
|
||||||
# by java.awt.Cursor
|
|
||||||
#
|
|
||||||
# The syntax is: Cursor.<name>.<geom>.File=win32_<filename>
|
|
||||||
# Cursor.<name>.<geom>.HotSpot=<x>,<y>
|
|
||||||
# Cursor.<name>.<geom>.Name=<localized name>
|
|
||||||
#
|
|
||||||
Cursor.CopyDrop.32x32.File=win32_CopyDrop32x32.gif
|
|
||||||
Cursor.CopyDrop.32x32.HotSpot=0,0
|
|
||||||
Cursor.CopyDrop.32x32.Name=CopyDrop32x32
|
|
||||||
#
|
|
||||||
Cursor.MoveDrop.32x32.File=win32_MoveDrop32x32.gif
|
|
||||||
Cursor.MoveDrop.32x32.HotSpot=0,0
|
|
||||||
Cursor.MoveDrop.32x32.Name=MoveDrop32x32
|
|
||||||
#
|
|
||||||
Cursor.LinkDrop.32x32.File=win32_LinkDrop32x32.gif
|
|
||||||
Cursor.LinkDrop.32x32.HotSpot=0,0
|
|
||||||
Cursor.LinkDrop.32x32.Name=LinkDrop32x32
|
|
||||||
#
|
|
||||||
Cursor.CopyNoDrop.32x32.File=win32_CopyNoDrop32x32.gif
|
|
||||||
Cursor.CopyNoDrop.32x32.HotSpot=6,2
|
|
||||||
Cursor.CopyNoDrop.32x32.Name=CopyNoDrop32x32
|
|
||||||
#
|
|
||||||
Cursor.MoveNoDrop.32x32.File=win32_MoveNoDrop32x32.gif
|
|
||||||
Cursor.MoveNoDrop.32x32.HotSpot=6,2
|
|
||||||
Cursor.MoveNoDrop.32x32.Name=MoveNoDrop32x32
|
|
||||||
#
|
|
||||||
Cursor.LinkNoDrop.32x32.File=win32_LinkNoDrop32x32.gif
|
|
||||||
Cursor.LinkNoDrop.32x32.HotSpot=6,2
|
|
||||||
Cursor.LinkNoDrop.32x32.Name=LinkNoDrop32x32
|
|
||||||
#
|
|
||||||
Cursor.Invalid.32x32.File=invalid32x32.gif
|
|
||||||
Cursor.Invalid.32x32.HotSpot=6,2
|
|
||||||
Cursor.Invalid.32x32.Name=Invalid32x32
|
|
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.awt.AWTException;
|
||||||
|
import java.awt.Cursor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
* @bug 8039269
|
||||||
|
* @author Sergey Bylokhov
|
||||||
|
*/
|
||||||
|
public final class GetSystemCustomCursor {
|
||||||
|
|
||||||
|
public static void main(final String[] args) throws AWTException {
|
||||||
|
// This list is copied from cursors.properties
|
||||||
|
String[] names = {"CopyDrop.32x32", "MoveDrop.32x32", "LinkDrop.32x32",
|
||||||
|
"CopyNoDrop.32x32", "MoveNoDrop.32x32",
|
||||||
|
"LinkNoDrop.32x32", "Invalid.32x32"};
|
||||||
|
for (final String name : names) {
|
||||||
|
if (Cursor.getSystemCustomCursor(name) == null) {
|
||||||
|
throw new RuntimeException("Cursor is null: " + name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println("Test passed");
|
||||||
|
}
|
||||||
|
}
|