diff --git a/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/internal/DPIUtil.java b/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/internal/DPIUtil.java index befdbd6baa..a2dbb25bab 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/internal/DPIUtil.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/common/org/eclipse/swt/internal/DPIUtil.java @@ -650,11 +650,49 @@ public static int getZoomForAutoscaleProperty (int nativeDeviceZoom) { return zoom; } -public static boolean isAutoScaleOnRuntimeActive() { +public static boolean isMonitorSpecificScalingActive() { boolean updateOnRuntimeValue = Boolean.getBoolean (SWT_AUTOSCALE_UPDATE_ON_RUNTIME); return updateOnRuntimeValue; } +public static void setAutoScaleForMonitorSpecificScaling() { + boolean isDefaultAutoScale = autoScaleValue == null; + if (isDefaultAutoScale) { + autoScaleValue = "quarter"; + } else if (!isSupportedAutoScaleForMonitorSpecificScaling()) { + throw new SWTError(SWT.ERROR_NOT_IMPLEMENTED, + "monitor-specific scaling is only implemented for auto-scale values \"quarter\", \"exact\", \"false\" or a concrete zoom value, but \"" + + autoScaleValue + "\" has been specified"); + } +} + +/** + * Monitor-specific scaling on Windows only supports auto-scale modes in which + * all elements (font, images, control bounds etc.) are scaled equally or almost + * equally. The previously default mode "integer"/"integer200", which rounded + * the scale factor for everything but fonts to multiples of 100, is complex and + * difficult to realize with monitor-specific rescaling of UI elements. Since a + * uniform scale factor for everything should perspectively be used anyway, + * there will be support for complex auto-scale modes for monitor-specific + * scaling. + * + * The supported modes are "quarter" and "exact" or explicit zoom values given + * by the value itself or "false". Every other value will be treated as + * "integer"/"integer200" and is thus not supported. + */ +private static boolean isSupportedAutoScaleForMonitorSpecificScaling() { + switch (autoScaleValue) { + case "false", "quarter", "exact": return true; + } + try { + Integer.parseInt(autoScaleValue); + return true; + } catch (NumberFormatException e) { + // unsupported value, use default + } + return false; +} + /** * AutoScale ImageDataProvider. */ diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java index 70576d85ce..cc19d1cf3f 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Display.java @@ -948,8 +948,9 @@ public void close () { protected void create (DeviceData data) { checkSubclass (); checkDisplay (thread = Thread.currentThread (), true); - if (DPIUtil.isAutoScaleOnRuntimeActive()) { + if (DPIUtil.isMonitorSpecificScalingActive()) { setRescalingAtRuntime(true); + DPIUtil.setAutoScaleForMonitorSpecificScaling(); } createDisplay (data); register (this);