<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <br>
    <br>
    <div class="moz-cite-prefix">On 3/24/25 3:43 PM, Daniel Gredler
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:CAPA+ug76CTCg7KbXjhPxP99D3F5ei253P3HgXV15qZ+=_OmNRw@mail.gmail.com">
      
      <div dir="ltr">
        <div>Interesting, what are the advantages of removing all of the
          "exports"? Are they just code smells?</div>
      </div>
    </blockquote>
    <br>
    Bad code smells.<br>
    <br>
    <blockquote type="cite" cite="mid:CAPA+ug76CTCg7KbXjhPxP99D3F5ei253P3HgXV15qZ+=_OmNRw@mail.gmail.com">
      <div dir="ltr">
        <div><br>
        </div>
        <div>In an ideal world where there were none of these "exports",
          java.desktop would need to reimplement this OS detection
          functionality, no? Or would something like
          jdk.internal.util.OperatingSystem be promoted to a public API?</div>
      </div>
    </blockquote>
    <br>
    I can't see that being a public API. Internals that we use today is
    stuff that was<br>
    not considered suitable for public API, or it already would be.<br>
    <br>
    <blockquote type="cite" cite="mid:CAPA+ug76CTCg7KbXjhPxP99D3F5ei253P3HgXV15qZ+=_OmNRw@mail.gmail.com">
      <div dir="ltr">
        <div><br>
        </div>
        <div>More immediately, in your opinion is it worth keeping
          OSInfo around as a 10-line wrapper around
          jdk.internal.util.OperatingSystem in order to limit the "blast
          radius" of the dependency? Or does it not matter whether 1
          class uses it or 20 classes use it, once the dependency has
          been created?</div>
      </div>
    </blockquote>
    <br>
    Keeping the blast radius to no more than it is today is the first
    thing.<br>
    I would prefer re-implementation over the export, but it hasn't
    bubbled up.<br>
    And I can imagine that even today we might want to know more
    specifically which windows version.<br>
    Windows 10 is a range of "versions" and Windows 11 is really just
    more<br>
    Windows 10 versions. And we'll see about Windows 12.<br>
    <br>
    -phil.<br>
    <br>
    <blockquote type="cite" cite="mid:CAPA+ug76CTCg7KbXjhPxP99D3F5ei253P3HgXV15qZ+=_OmNRw@mail.gmail.com">
      <div dir="ltr">
        <div><br>
        </div>
        <div>Take care,</div>
        <div><br>
        </div>
        <div>Daniel</div>
        <div><br>
        </div>
        <div><br>
        </div>
      </div>
      <br>
      <div class="gmail_quote gmail_quote_container">
        <div dir="ltr" class="gmail_attr">On Mon, Mar 24, 2025 at
          11:25 PM Philip Race <<a href="mailto:philip.race@oracle.com" moz-do-not-send="true" class="moz-txt-link-freetext">philip.race@oracle.com</a>>
          wrote:<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I
          am not a huge fan of sun.awt.OSInfo and I know a lot of uses
          are <br>
          out-dated,<br>
          and probably could be removed.<br>
          Whether that ends up in not needing OSInfo is another a
          question.<br>
          But I would *not* want to migrate to a jdk.internal API.<br>
          I have a goal of someday having zero cases of java.base
          "exports FOO to <br>
          java.desktop"<br>
          Its not a top priority to complete, but at the same time I
          don't want to <br>
          needlessly go in the opposite direction.<br>
          <br>
          <br>
          -phil.<br>
          <br>
          On 3/24/25 3:18 PM, Daniel Gredler wrote:<br>
          > Hi all,<br>
          ><br>
          > The sun.awt.OSInfo class seems to replicate the
          functionality in <br>
          > jdk.internal.util.OperatingSystem, with one additional
          capability: <br>
          > distinguishing between different versions of Windows.
          However, the <br>
          > Windows versions included are Windows 95 through Windows
          7, which <br>
          > hasn't been an officially-supported platform for the JDK
          since Java 7. <br>
          > There are Windows version checks which rely on OSInfo
          sprinkled <br>
          > throughout the java.desktop module, but all of them are
          checking for <br>
          > Windows versions which are not even supported anymore, as
          far as I can <br>
          > tell. Would a PR which removes OSInfo be accepted, or is
          there a <br>
          > reason to keep it around that I'm missing?<br>
          ><br>
          > Thanks!<br>
          ><br>
          > Daniel<br>
          ><br>
          > (Somewhat related: <a href="https://bugs.openjdk.org/browse/JDK-8305777" rel="noreferrer" target="_blank" moz-do-not-send="true" class="moz-txt-link-freetext">https://bugs.openjdk.org/browse/JDK-8305777</a>)<br>
          ><br>
          > ---<br>
          ><br>
          > $ grep -r --include "*.java" OSInfo src/java.desktop/<br>
          >
src/java.desktop/windows/classes/sun/awt/windows/WTaskbarPeer.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/windows/classes/sun/awt/windows/WTaskbarPeer.java:
            <br>
          >      supported = OSInfo.getWindowsVersion()<br>
          >
          src/java.desktop/windows/classes/sun/awt/windows/WTaskbarPeer.java:
            <br>
          >              .compareTo(OSInfo.WINDOWS_7) >= 0<br>
          >
src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
src/java.desktop/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java:
          <br>
          >                if (recentFolder != null && <br>
          > OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_2000)
          >= 0) {<br>
          >
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
          <br>
          >        return OSInfo.getOSType() ==
          OSInfo.OSType.WINDOWS;<br>
          >
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
          <br>
          >        if
          (OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_95) <=
          0) {<br>
          >
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
          <br>
          >        isClassicWindows = <br>
          > OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_95)
          <= 0;<br>
          >
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
          <br>
          >                (OSInfo.getOSType() ==
          OSInfo.OSType.WINDOWS &&<br>
          >
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
          <br>
          >  OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP)
          >= 0)) {<br>
          >
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
          <br>
          >        return OSInfo.getOSType() == OSInfo.OSType.WINDOWS<br>
          >
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
          <br>
          >                && <br>
          >
          OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_VISTA)
          >= 0;<br>
          >
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
          <br>
          >        return OSInfo.getOSType() == OSInfo.OSType.WINDOWS<br>
          >
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
          <br>
          >                && <br>
          > OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_7)
          >= 0;<br>
          >
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
          <br>
          >            if (OSInfo.getOSType() ==
          OSInfo.OSType.WINDOWS &&<br>
          >
src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/WindowsLookAndFeel.java:
          <br>
          >  OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP)
          < 0) {<br>
          >
src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java:
          <br>
          >        return OSInfo.getOSType() == OSInfo.OSType.MACOSX;<br>
          >
          src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java:
          <br>
          >        return OSInfo.getOSType() == OSInfo.OSType.LINUX;<br>
          >
          src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java:
          <br>
          >        return (OSInfo.getOSType() == OSInfo.OSType.LINUX
          ||<br>
          >
          src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java:
          <br>
          >                OSInfo.getOSType() ==
          OSInfo.OSType.MACOSX);<br>
          >
          src/java.desktop/unix/classes/sun/print/PrintServiceLookupProvider.java:
          <br>
          >        return OSInfo.getOSType() == OSInfo.OSType.AIX;<br>
          >
          src/java.desktop/unix/classes/sun/awt/X11/XScrollbarPeer.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/unix/classes/sun/awt/X11/XScrollbarPeer.java:
                <br>
          >  if (OSInfo.getOSType() == OSInfo.OSType.LINUX) {<br>
          >
src/java.desktop/unix/classes/sun/awt/X11/MotifColorUtilities.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/unix/classes/sun/awt/X11/MotifColorUtilities.java:
            <br>
          >  int numOfColor = OSInfo.getOSType() == OSInfo.OSType.AIX
          ? 8 : 4;<br>
          >
          src/java.desktop/unix/classes/sun/awt/X11/MotifColorUtilities.java:
            <br>
          >  if (OSInfo.getOSType() == OSInfo.OSType.LINUX) { // Load
          motif <br>
          > default colors on Linux.<br>
          >
          src/java.desktop/share/classes/javax/swing/PopupFactory.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/share/classes/javax/swing/PopupFactory.java:
                  <br>
          >    if ((OSInfo.getOSType() == OSInfo.OSType.MACOSX)
          && (owner != null) &&<br>
          >
src/java.desktop/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
src/java.desktop/share/classes/javax/swing/plaf/nimbus/NimbusLookAndFeel.java:
          <br>
          >            boolean isWindows = OSInfo.getOSType() == <br>
          > OSInfo.OSType.WINDOWS;<br>
          >
src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java:
          <br>
          >            if (OSInfo.getOSType() ==
          OSInfo.OSType.WINDOWS) {<br>
          >
          src/java.desktop/share/classes/javax/swing/UIManager.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/share/classes/javax/swing/UIManager.java:   <br>
          >  OSInfo.OSType osType = OSInfo.getOSType();<br>
          >
          src/java.desktop/share/classes/javax/swing/UIManager.java:  
           if <br>
          > (osType == OSInfo.OSType.WINDOWS) {<br>
          >
          src/java.desktop/share/classes/javax/swing/UIManager.java:  
           else if <br>
          > (osType == OSInfo.OSType.MACOSX) {<br>
          >
          src/java.desktop/share/classes/javax/swing/UIManager.java:   <br>
          >  OSInfo.OSType osType = OSInfo.getOSType();<br>
          >
          src/java.desktop/share/classes/javax/swing/UIManager.java:  
           if <br>
          > (osType == OSInfo.OSType.WINDOWS) {<br>
          >
          src/java.desktop/share/classes/javax/swing/UIManager.java:    
             if <br>
          > (osType == OSInfo.OSType.MACOSX) {<br>
          >
          src/java.desktop/share/classes/javax/swing/UIManager.java:    
             if <br>
          > (OSInfo.getOSType() == OSInfo.OSType.MACOSX) {<br>
          > src/java.desktop/share/classes/sun/awt/OSInfo.java:import
          static <br>
          > sun.awt.OSInfo.OSType.*;<br>
          > src/java.desktop/share/classes/sun/awt/OSInfo.java:public
          class OSInfo {<br>
          > src/java.desktop/share/classes/sun/awt/OSInfo.java:  
           private static <br>
          > final Map<String, WindowsVersion> windowsVersionMap
          = new <br>
          > HashMap<String, OSInfo.WindowsVersion>();<br>
          > src/java.desktop/share/classes/sun/awt/OSInfo.java:  
           private OSInfo() {<br>
          >
          src/java.desktop/share/classes/sun/awt/FontConfiguration.java:
                  <br>
          >        if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS) {<br>
          >
          src/java.desktop/share/classes/sun/awt/shell/ShellFolder.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/share/classes/sun/awt/shell/ShellFolder.java:
                <br>
          >  if (f.equals(canonical) || OSInfo.getOSType() ==
          OSInfo.OSType.WINDOWS) {<br>
          >
          src/java.desktop/share/classes/sun/print/PSPrinterJob.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/share/classes/sun/print/PSPrinterJob.java:  
             isMac <br>
          > = OSInfo.getOSType() == OSInfo.OSType.MACOSX;<br>
          >
          src/java.desktop/share/classes/sun/print/PSPrinterJob.java:  
             if <br>
          > (OSInfo.getOSType() == OSInfo.OSType.LINUX ||<br>
          >
          src/java.desktop/share/classes/sun/print/PSPrinterJob.java:  
                  <br>
          >    OSInfo.getOSType() == OSInfo.OSType.MACOSX) {<br>
          >
          src/java.desktop/share/classes/sun/print/ServiceDialog.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/share/classes/sun/print/ServiceDialog.java:  
                <br>
          >  if (OSInfo.getOSType() != OSInfo.OSType.WINDOWS) {<br>
          >
src/java.desktop/share/classes/sun/font/FontManagerNativeLibrary.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/share/classes/sun/font/FontManagerNativeLibrary.java:
          <br>
          >     if (OSInfo.getOSType() == OSInfo.OSType.WINDOWS) {<br>
          >
          src/java.desktop/share/classes/sun/font/FontUtilities.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/share/classes/sun/font/FontUtilities.java:  
            <br>
          >  isLinux = OSInfo.getOSType() == OSInfo.OSType.LINUX;<br>
          >
          src/java.desktop/share/classes/sun/font/FontUtilities.java:  
            <br>
          >  isMacOSX = OSInfo.getOSType() == OSInfo.OSType.MACOSX;<br>
          >
          src/java.desktop/share/classes/sun/font/FontUtilities.java:  
            <br>
          >  isWindows = OSInfo.getOSType() == OSInfo.OSType.WINDOWS;<br>
          >
          src/java.desktop/share/classes/sun/swing/WindowsPlacesBar.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/share/classes/sun/swing/WindowsPlacesBar.java:
          <br>
          >  boolean isXPPlatform = (OSInfo.getOSType() ==
          OSInfo.OSType.WINDOWS &&<br>
          >
          src/java.desktop/share/classes/sun/swing/WindowsPlacesBar.java:
                <br>
          >  OSInfo.getWindowsVersion().compareTo(OSInfo.WINDOWS_XP)
          >= 0);<br>
          >
src/java.desktop/share/classes/com/sun/media/sound/SoftSynthesizer.java:import
          <br>
          > sun.awt.OSInfo;<br>
          >
          src/java.desktop/share/classes/com/sun/media/sound/SoftSynthesizer.java:
          <br>
          >                    if (OSInfo.getOSType() ==
          OSInfo.OSType.LINUX) {<br>
          >
          src/java.desktop/share/classes/com/sun/media/sound/SoftSynthesizer.java:
          <br>
          >                    if (OSInfo.getOSType() ==
          OSInfo.OSType.WINDOWS) {<br>
          ><br>
          <br>
        </blockquote>
      </div>
    </blockquote>
    <br>
  </body>
</html>