Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8280812

Toolkit.getScreenResolution() doesn't change on linux when screen zoom

XMLWordPrintable

    • 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


        1. 100.png
          1.00 MB
          Praveen Narayanaswamy
        2. 125.png
          2.29 MB
          Praveen Narayanaswamy
        3. 200.PNG
          287 kB
          Praveen Narayanaswamy
        4. report-9168682-100%.png
          1.31 MB
          Praveen Narayanaswamy
        5. report-9168682-200%.png
          284 kB
          Praveen Narayanaswamy
        6. TestDpi.java
          0.2 kB
          Praveen Narayanaswamy

            azvegint Alexander Zvegintsev
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: