diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatScreenInfo.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatScreenInfo.java new file mode 100644 index 00000000..d7c0e745 --- /dev/null +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatScreenInfo.java @@ -0,0 +1,112 @@ +/* + * Copyright 2020 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf.testing; + +import java.awt.DisplayMode; +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; +import java.awt.Insets; +import java.awt.Rectangle; +import java.awt.Toolkit; +import java.awt.geom.AffineTransform; +import javax.swing.SwingUtilities; + +/** + * Displays information about screens connected to a computer. + * + * This is a single-file program that can be compiled/run without any other + * FlatLaf code or dependencies. + * + * Since Java 11, you can run this program from source with: + * java FlatScreenInfo.java + * + * @author Karl Tauber + */ +public class FlatScreenInfo +{ + public static void main( String[] args ) { + SwingUtilities.invokeLater( () -> { + printScreenInfo(); + } ); + } + + private static void printScreenInfo() { + Toolkit toolkit = Toolkit.getDefaultToolkit(); + GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice defaultScreenDevice = graphicsEnvironment.getDefaultScreenDevice(); + GraphicsDevice[] screenDevices = graphicsEnvironment.getScreenDevices(); + + System.out.print( "Scale factors: " ); + for( GraphicsDevice gd : screenDevices ) { + GraphicsConfiguration gc = gd.getDefaultConfiguration(); + + if( gd != screenDevices[0] ) + System.out.print( " / " ); + + System.out.print( (int) (gc.getDefaultTransform().getScaleX() * 100) ); + System.out.print( "%" ); + } + System.out.println(); + + System.out.println( "Java version: " + System.getProperty( "java.version" ) ); + + for( GraphicsDevice gd : screenDevices ) { + GraphicsConfiguration gc = gd.getDefaultConfiguration(); + DisplayMode displayMode = gd.getDisplayMode(); + Rectangle bounds = gc.getBounds(); + int width = displayMode.getWidth(); + int height = displayMode.getHeight(); + double boundsScaleX = (bounds.width > width) + ? (double) bounds.width / (double) width + : -((double) width / (double) bounds.width); + double boundsScaleY = (bounds.height > height) + ? (double) bounds.height / (double) height + : -((double) height / (double) bounds.height); + boundsScaleX = Math.round( boundsScaleX * 1000. ) / 1000.; + boundsScaleY = Math.round( boundsScaleY * 1000. ) / 1000.; + Insets screenInsets = toolkit.getScreenInsets( gc ); + AffineTransform defaultTransform = gc.getDefaultTransform(); + double scaleX = defaultTransform.getScaleX(); + double scaleY = defaultTransform.getScaleY(); + + System.out.println(); + System.out.print( "ID: " + gd.getIDstring() ); + if( gd == defaultScreenDevice ) + System.out.print( " (main)" ); + System.out.println(); + + System.out.printf( "Size: %d x %d / %d Bit / %d Hz%n", + displayMode.getWidth(), displayMode.getHeight(), + displayMode.getBitDepth(), displayMode.getRefreshRate() ); + System.out.printf( "Bounds: %d x %d / x %d / y %d", + bounds.width, bounds.height, bounds.x, bounds.y ); + if( Math.abs( boundsScaleX ) != 1 || Math.abs( boundsScaleY ) != 1 ) + System.out.printf( " (scale %s)", toString( boundsScaleX, boundsScaleY ) ); + System.out.println(); + System.out.printf( "Insets: left %d / right %d / top %d / bottom %d%n", + screenInsets.left, screenInsets.right, screenInsets.top, screenInsets.bottom ); + System.out.println( "Scale: " + toString( scaleX, scaleY ) ); + } + } + + private static String toString( double scaleX, double scaleY ) { + return (scaleX == scaleY) + ? String.valueOf( scaleX ) + : scaleX + " / " + scaleY; + } +}