--- old/src/java.desktop/unix/classes/sun/print/UnixPrintService.java 2018-06-05 12:26:20.488041743 -0700 +++ new/src/java.desktop/unix/classes/sun/print/UnixPrintService.java 2018-06-05 12:26:20.232041753 -0700 @@ -31,6 +31,8 @@ import java.util.ArrayList; import java.util.Locale; +import java.awt.GraphicsEnvironment; +import java.awt.Toolkit; import javax.print.DocFlavor; import javax.print.DocPrintJob; import javax.print.PrintService; @@ -54,6 +56,8 @@ import javax.print.attribute.standard.Copies; import javax.print.attribute.standard.CopiesSupported; import javax.print.attribute.standard.Destination; +import javax.print.attribute.standard.DialogOwner; +import javax.print.attribute.standard.DialogTypeSelection; import javax.print.attribute.standard.Fidelity; import javax.print.attribute.standard.Media; import javax.print.attribute.standard.MediaPrintableArea; @@ -619,10 +623,15 @@ } public Class[] getSupportedAttributeCategories() { - int totalCats = otherAttrCats.length; - Class[] cats = new Class[totalCats]; - System.arraycopy(otherAttrCats, 0, cats, 0, otherAttrCats.length); - return cats; + ArrayList> categList = new ArrayList<>(otherAttrCats.length); + for (Class c : otherAttrCats) { + categList.add(c); + } + if (GraphicsEnvironment.isHeadless() == false) { + categList.add(DialogOwner.class); + categList.add(DialogTypeSelection.class); + } + return categList.toArray(new Class[categList.size()]); } public boolean @@ -1023,6 +1032,24 @@ flavor.equals(DocFlavor.SERVICE_FORMATTED.PRINTABLE))) { return false; } + } else if (attr.getCategory() == DialogOwner.class) { + DialogOwner owner = (DialogOwner)attr; + // ID not supported on any dialog type on Unix platforms. + if (DialogOwnerAccessor.getID(owner) != 0) { + return false; + } + // UnixPrintService is not used on Mac, so this is + // always some Unix system that does not have CUPS/IPP + // Which means we always use a Swing dialog and we need + // only check if alwaysOnTop is supported by the toolkit. + if (owner.getOwner() != null) { + return true; + } else { + return Toolkit.getDefaultToolkit().isAlwaysOnTopSupported(); + } + } else if (attr.getCategory() == DialogTypeSelection.class) { + DialogTypeSelection dts = (DialogTypeSelection)attr; + return dts == DialogTypeSelection.COMMON; } return true; }