Skip to content

Commit 1553d4d

Browse files
committed
Deprecate DefaultSWTFontRegistry and Completely switch to ScalingSWTFontRegistry
1)Always use ScalingSWTFontRegistry 2)Rename DefaultSWTFontRegistry -> LegacySWTFontRegistry as this is not default anymore 3)Add a system property to use LegacySWTFontRegistry without monitor specific scaling active 3)Deprecate the LegacySWTFontRegistry(DefaultSWTFontRegistry)
1 parent 0a68dea commit 1553d4d

File tree

5 files changed

+79
-23
lines changed

5 files changed

+79
-23
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@
2323
import org.junit.jupiter.api.extension.*;
2424

2525
@ExtendWith(PlatformSpecificExecutionExtension.class)
26-
class DefaultSWTFontRegistryTests {
26+
class LegacySWTFontRegistryTests {
2727
private static String TEST_FONT = "Helvetica";
2828
private Display display;
2929
private SWTFontRegistry fontRegistry;
3030

3131
@BeforeEach
3232
public void setUp() {
3333
this.display = Display.getDefault();
34-
this.fontRegistry = new DefaultSWTFontRegistry(display);
34+
this.fontRegistry = new LegacySWTFontRegistry(display);
3535
}
3636

3737
@AfterEach

bundles/org.eclipse.swt/Eclipse SWT Tests/win32/org/eclipse/swt/widgets/ControlWin32Tests.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,41 @@ public void testScaleFontCorrectlyInAutoScaleSzenario() {
4444
}
4545

4646
@Test
47-
public void testDoNotScaleFontCorrectlyInNoAutoScaleSzenario() {
47+
public void testScaleFontCorrectlyInNoAutoScaleSzenario() {
4848
DPIUtil.setMonitorSpecificScaling(false);
4949
Display display = Display.getDefault();
5050

51-
assertFalse("Autoscale property is not set to false", display.isRescalingAtRuntime());
51+
assertFalse("Autoscale property is not set to true", display.isRescalingAtRuntime());
5252
int scalingFactor = 2;
5353
FontComparison fontComparison = updateFont(scalingFactor);
54-
assertEquals("Font height in pixels is different when setting the same font again",
55-
fontComparison.originalFontHeight, fontComparison.currentFontHeight);
54+
assertEquals("Font height in pixels is not adjusted according to the scale factor",
55+
fontComparison.originalFontHeight * scalingFactor, fontComparison.currentFontHeight);
56+
}
57+
58+
@Test
59+
public void testDoNotScaleFontCorrectlyInNoAutoScaleSzenarioWithLegacyFontRegistry() {
60+
DPIUtil.setMonitorSpecificScaling(false);
61+
String originalValue = System.getProperty("swt.fontRegistry");
62+
System.setProperty("swt.fontRegistry", "LEGACY");
63+
try {
64+
Display display = Display.getDefault();
65+
66+
assertFalse("Autoscale property is not set to false", display.isRescalingAtRuntime());
67+
int scalingFactor = 2;
68+
FontComparison fontComparison = updateFont(scalingFactor);
69+
assertEquals("Font height in pixels is different when setting the same font again",
70+
fontComparison.originalFontHeight, fontComparison.currentFontHeight);
71+
72+
73+
}
74+
finally {
75+
if (originalValue != null) {
76+
System.setProperty("swt.fontRegistry", originalValue);
77+
} else {
78+
System.clearProperty("swt.fontRegistry");
79+
}
80+
}
81+
5682
}
5783

5884
@Test
Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,25 @@
1919
import org.eclipse.swt.internal.win32.*;
2020

2121
/**
22-
* This class is used in the win32 implementation only to support
23-
* unscaled fonts in multiple DPI zoom levels.
22+
* <p>
23+
* Formerly {@code DefaultSWTFontRegistry}, this class is deprecated. Use {@code ScalingSWTFontRegistry} instead.
24+
* To temporarily fall back to legacy font behavior ({@code LegacySWTFontRegistry})
25+
* (e.g., if issues arise in existing RCP products), set the system property: {@code
26+
* -Dswt.fontRegistry=LEGACY
27+
* }
28+
* </p>
2429
*
2530
* As this class is only intended to be used internally via {@code SWTFontProvider},
2631
* it should neither be instantiated nor referenced in a client application.
2732
* The behavior can change any time in a future release.
2833
*/
29-
final class DefaultSWTFontRegistry implements SWTFontRegistry {
34+
@Deprecated(forRemoval= true, since= "2025-09")
35+
final class LegacySWTFontRegistry implements SWTFontRegistry {
3036
private static FontData KEY_SYSTEM_FONTS = new FontData();
3137
private Map<FontData, Font> fontsMap = new HashMap<>();
3238
private Device device;
3339

34-
DefaultSWTFontRegistry(Device device) {
40+
LegacySWTFontRegistry(Device device) {
3541
this.device = device;
3642
}
3743

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/SWTFontProvider.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,32 @@ public static void disposeFontRegistry(Device device) {
105105
}
106106
}
107107

108+
private static enum FontRegistryType {
109+
LEGACY, SCALING;
110+
111+
public static FontRegistryType fromString(String s) {
112+
if (s == null) {
113+
return SCALING;
114+
}
115+
for (FontRegistryType type : values()) {
116+
if (type.name().equalsIgnoreCase(s)) {
117+
return type;
118+
}
119+
}
120+
return SCALING; // fallback to default if invalid
121+
}
122+
}
123+
124+
private static final String SWT_FONT_REGISTRY = "swt.fontRegistry";
125+
108126
private static SWTFontRegistry newFontRegistry(Device device) {
109-
if (device instanceof Display display && display.isRescalingAtRuntime()) {
110-
return new ScalingSWTFontRegistry(device);
127+
String registryProp = System.getProperty(SWT_FONT_REGISTRY);
128+
FontRegistryType fontRegistryValue = FontRegistryType.fromString(registryProp);
129+
if (fontRegistryValue == FontRegistryType.LEGACY && device instanceof Display display
130+
&& !display.isRescalingAtRuntime()) {
131+
return new LegacySWTFontRegistry(device);
111132
}
112-
return new DefaultSWTFontRegistry(device);
133+
return new ScalingSWTFontRegistry(device);
134+
113135
}
114136
}

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/internal/ScalingSWTFontRegistry.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ private Font getScaledFont(int zoom) {
4444

4545
private Font createAndCacheFont(int zoom) {
4646
Font newFont = createFont(zoom);
47-
customFontHandlesKeyMap.put(Font.win32_getHandle(newFont), this);
47+
FontData clonedFontData = new FontData(newFont.getFontData()[0].toString());
48+
fontsKeyMap.put(clonedFontData, this);
49+
fontHandlesKeyMap.put(Font.win32_getHandle(newFont), this);
4850
scaledFonts.put(zoom, newFont);
4951
return newFont;
5052
}
@@ -108,8 +110,8 @@ protected void dispose() {
108110
}
109111

110112
private ScaledFontContainer systemFontContainer;
111-
private Map<FontData, ScaledFontContainer> customFontsKeyMap = new HashMap<>();
112-
private Map<Long, ScaledFontContainer> customFontHandlesKeyMap = new HashMap<>();
113+
private Map<FontData, ScaledFontContainer> fontsKeyMap = new HashMap<>();
114+
private Map<Long, ScaledFontContainer> fontHandlesKeyMap = new HashMap<>();
113115
private Device device;
114116

115117
ScalingSWTFontRegistry(Device device) {
@@ -125,27 +127,27 @@ public Font getSystemFont(int zoom) {
125127
@Override
126128
public Font getFont(FontData fontData, int zoom) {
127129
ScaledFontContainer container;
128-
if (customFontsKeyMap.containsKey(fontData)) {
129-
container = customFontsKeyMap.get(fontData);
130+
if (fontsKeyMap.containsKey(fontData)) {
131+
container = fontsKeyMap.get(fontData);
130132
} else {
131133
FontData clonedFontData = new FontData(fontData.toString());
132134
container = new ScaledCustomFontContainer(clonedFontData);
133-
customFontsKeyMap.put(clonedFontData, container);
135+
fontsKeyMap.put(clonedFontData, container);
134136
}
135137
return container.getScaledFont(zoom);
136138
}
137139

138140
@Override
139141
public Font getFont(long fontHandle, int zoom) {
140-
if (customFontHandlesKeyMap.containsKey(fontHandle)) {
141-
return customFontHandlesKeyMap.get(fontHandle).getScaledFont(zoom);
142+
if (fontHandlesKeyMap.containsKey(fontHandle)) {
143+
return fontHandlesKeyMap.get(fontHandle).getScaledFont(zoom);
142144
}
143145
return Font.win32_new(device, fontHandle, zoom);
144146
}
145147

146148
@Override
147149
public void dispose() {
148-
customFontsKeyMap.values().forEach(ScaledFontContainer::dispose);
149-
customFontsKeyMap.clear();
150+
fontsKeyMap.values().forEach(ScaledFontContainer::dispose);
151+
fontsKeyMap.clear();
150152
}
151153
}

0 commit comments

Comments
 (0)