-
Bug
-
Resolution: Unresolved
-
P3
-
8, 11, 17, 18
-
x86_64
-
linux
ADDITIONAL SYSTEM INFORMATION :
Linux and JDK8
A DESCRIPTION OF THE PROBLEM :
On linux system, I set screen zoom from 100% to 125%, Toolkit.getDefaultToolkit().getScreenResolution() still return 96. The right value is 120.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1, Set screen zoom from 100% to 125%.
2, call Toolkit.getDefaultToolkit().getScreenResolution().
---------- BEGIN SOURCE ----------
import java.awt.Toolkit;
public class TestDpi
{
public static void main(String[] args)
{
System.out.println(Toolkit.getDefaultToolkit().getScreenResolution());
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
1, jdk/make/mapfiles/libawt_xawt/mapfile-vers
add code:
Java_sun_awt_X11_XlibWrapper_DisplayDpi;
2, jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java
add code:
static native int DisplayDpi(long display);
3, jdk/src/solaris/native/sun/xawt/XlibWrapper.c
add code:
/**
XResourceManagerString() like:
Xcursor.size: 24
Xcursor.theme: dark-sense
Xft.antialias: 1
Xft.dpi: 96
Xft.hinting: 1
Xft.hintstyle: hintslight
Xft.lcdfilter: lcddefault
Xft.rgba: rgb
The sepatator is tab(\t)
*/
#define KEY_XFT_DPI "Xft.dpi"
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_DisplayDpi
(JNIEnv *env, jclass clazz, jlong display) {
AWT_CHECK_HAVE_LOCK_RETURN(0);
char* psInfo = NULL;
char* pEnd = NULL;
char caDpi[32] = {0};
psInfo = XResourceManagerString((Display *) jlong_to_ptr(display));
if (psInfo == NULL)
{
return 0;
}
psInfo = strstr(psInfo, KEY_XFT_DPI);
psInfo = strchr(psInfo, ':' ) + 1;
pEnd = strchr(psInfo, '\n');
strncpy(caDpi, psInfo, (pEnd-psInfo));
return atoi(caDpi);
}
4, jdk/src/solaris/classes/sun/awt/X11/XToolkit.java
public int getScreenResolution() {
long display = getDisplay();
awtLock();
try {
/*
return (int) ((XlibWrapper.DisplayWidth(display,
XlibWrapper.DefaultScreen(display)) * 25.4) /
XlibWrapper.DisplayWidthMM(display,
XlibWrapper.DefaultScreen(display)));
*/
return XlibWrapper.DisplayDpi(display);
} finally {
awtUnlock();
}
}
FREQUENCY : always
Linux and JDK8
A DESCRIPTION OF THE PROBLEM :
On linux system, I set screen zoom from 100% to 125%, Toolkit.getDefaultToolkit().getScreenResolution() still return 96. The right value is 120.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1, Set screen zoom from 100% to 125%.
2, call Toolkit.getDefaultToolkit().getScreenResolution().
---------- BEGIN SOURCE ----------
import java.awt.Toolkit;
public class TestDpi
{
public static void main(String[] args)
{
System.out.println(Toolkit.getDefaultToolkit().getScreenResolution());
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
1, jdk/make/mapfiles/libawt_xawt/mapfile-vers
add code:
Java_sun_awt_X11_XlibWrapper_DisplayDpi;
2, jdk/src/solaris/classes/sun/awt/X11/XlibWrapper.java
add code:
static native int DisplayDpi(long display);
3, jdk/src/solaris/native/sun/xawt/XlibWrapper.c
add code:
/**
XResourceManagerString() like:
Xcursor.size: 24
Xcursor.theme: dark-sense
Xft.antialias: 1
Xft.dpi: 96
Xft.hinting: 1
Xft.hintstyle: hintslight
Xft.lcdfilter: lcddefault
Xft.rgba: rgb
The sepatator is tab(\t)
*/
#define KEY_XFT_DPI "Xft.dpi"
JNIEXPORT jint JNICALL Java_sun_awt_X11_XlibWrapper_DisplayDpi
(JNIEnv *env, jclass clazz, jlong display) {
AWT_CHECK_HAVE_LOCK_RETURN(0);
char* psInfo = NULL;
char* pEnd = NULL;
char caDpi[32] = {0};
psInfo = XResourceManagerString((Display *) jlong_to_ptr(display));
if (psInfo == NULL)
{
return 0;
}
psInfo = strstr(psInfo, KEY_XFT_DPI);
psInfo = strchr(psInfo, ':' ) + 1;
pEnd = strchr(psInfo, '\n');
strncpy(caDpi, psInfo, (pEnd-psInfo));
return atoi(caDpi);
}
4, jdk/src/solaris/classes/sun/awt/X11/XToolkit.java
public int getScreenResolution() {
long display = getDisplay();
awtLock();
try {
/*
return (int) ((XlibWrapper.DisplayWidth(display,
XlibWrapper.DefaultScreen(display)) * 25.4) /
XlibWrapper.DisplayWidthMM(display,
XlibWrapper.DefaultScreen(display)));
*/
return XlibWrapper.DisplayDpi(display);
} finally {
awtUnlock();
}
}
FREQUENCY : always