Skip to content

Commit 3063414

Browse files
amartya4256akoch-yatta
authored andcommitted
Make DPI_CHANGED event handling async
With this commit, all the widgets scale themselves asynchronously independent of the order saving the wait time over their children to scale.
1 parent 00106b4 commit 3063414

File tree

13 files changed

+60
-15
lines changed

13 files changed

+60
-15
lines changed

bundles/org.eclipse.swt/Eclipse SWT Tests/win32/org/eclipse/swt/internal/DPITestUtil.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
*******************************************************************************/
1414
package org.eclipse.swt.internal;
1515

16+
import java.time.*;
17+
import java.util.concurrent.atomic.*;
18+
1619
import org.eclipse.swt.*;
1720
import org.eclipse.swt.widgets.*;
1821

@@ -21,14 +24,34 @@ public final class DPITestUtil {
2124
private DPITestUtil() {
2225
}
2326

27+
private static final int TIMEOUT_MILLIS = 10000;
28+
2429
public static void changeDPIZoom (Shell shell, int nativeZoom) {
2530
DPIUtil.setDeviceZoom(nativeZoom);
2631
Event event = new Event();
2732
event.type = SWT.ZoomChanged;
2833
event.widget = shell;
2934
event.detail = nativeZoom;
3035
event.doit = true;
36+
AtomicInteger scalingCounter = new AtomicInteger(0);
37+
event.data = scalingCounter;
3138
shell.notifyListeners(SWT.ZoomChanged, event);
39+
waitForDPIChange(shell, TIMEOUT_MILLIS, scalingCounter);
40+
}
41+
42+
public static void waitForPassCondition(Shell shell, int timeout, AtomicInteger scalingCounter) {
43+
final Instant timeOut = Instant.now().plusMillis(timeout);
44+
final Display display = shell == null ? Display.getDefault() : shell.getDisplay();
45+
46+
while (Instant.now().isBefore(timeOut) && scalingCounter.get() != 0) {
47+
if (!display.isDisposed()) {
48+
display.readAndDispatch();
49+
}
50+
}
51+
}
52+
53+
public static void waitForDPIChange(Shell shell, int timeout, AtomicInteger scalingCounter) {
54+
waitForPassCondition(shell, timeout, scalingCounter);
3255
}
3356

3457
}

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Composite.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1977,7 +1977,7 @@ public String toString() {
19771977
void handleDPIChange(Event event, float scalingFactor) {
19781978
super.handleDPIChange(event, scalingFactor);
19791979
for (Control child : getChildren()) {
1980-
child.notifyListeners(SWT.ZoomChanged, event);
1980+
child.sendZoomChangedEvent(event, getShell());
19811981
}
19821982
}
19831983
}

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Control.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717

1818
import java.util.*;
19+
import java.util.concurrent.atomic.*;
1920
import java.util.stream.*;
2021

2122
import org.eclipse.swt.*;
@@ -4757,7 +4758,7 @@ public boolean setParent (Composite parent) {
47574758
if (parent.nativeZoom != nativeZoom) {
47584759
int newZoom = parent.nativeZoom;
47594760
Event zoomChangedEvent = createZoomChangedEvent(newZoom);
4760-
notifyListeners(SWT.ZoomChanged, zoomChangedEvent);
4761+
sendZoomChangedEvent(zoomChangedEvent, getShell());
47614762
}
47624763
int flags = OS.SWP_NOSIZE | OS.SWP_NOMOVE | OS.SWP_NOACTIVATE;
47634764
OS.SetWindowPos (topHandle, OS.HWND_BOTTOM, 0, 0, 0, 0, flags);
@@ -4953,7 +4954,7 @@ LRESULT WM_DESTROY (long wParam, long lParam) {
49534954
void handleMonitorSpecificDpiChange(int newNativeZoom, Rectangle newBoundsInPixels) {
49544955
DPIUtil.setDeviceZoom (newNativeZoom);
49554956
Event zoomChangedEvent = createZoomChangedEvent(newNativeZoom);
4956-
notifyListeners(SWT.ZoomChanged, zoomChangedEvent);
4957+
sendZoomChangedEvent(zoomChangedEvent, getShell());
49574958
this.setBoundsInPixels(newBoundsInPixels.x, newBoundsInPixels.y, newBoundsInPixels.width, newBoundsInPixels.height);
49584959
}
49594960

@@ -4963,6 +4964,7 @@ private Event createZoomChangedEvent(int zoom) {
49634964
event.widget = this;
49644965
event.detail = zoom;
49654966
event.doit = true;
4967+
event.data = new AtomicInteger(0);
49664968
return event;
49674969
}
49684970

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Decorations.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1720,13 +1720,13 @@ void handleDPIChange(Event event, float scalingFactor) {
17201720

17211721
Menu menuBar = getMenuBar();
17221722
if (menuBar != null) {
1723-
menuBar.notifyListeners(SWT.ZoomChanged, event);
1723+
menuBar.sendZoomChangedEvent(event, getShell());
17241724
}
17251725

17261726
if (menus != null) {
17271727
for (Menu menu : menus) {
17281728
if (menu != null) {
1729-
menu.notifyListeners(SWT.ZoomChanged, event);
1729+
menu.sendZoomChangedEvent(event, getShell());
17301730
}
17311731
}
17321732
}

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ExpandBar.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -871,7 +871,7 @@ LRESULT wmScroll (ScrollBar bar, boolean update, long hwnd, int msg, long wParam
871871
void handleDPIChange(Event event, float scalingFactor) {
872872
super.handleDPIChange(event, scalingFactor);
873873
for (ExpandItem item : getItems()) {
874-
item.notifyListeners(SWT.ZoomChanged, event);
874+
item.sendZoomChangedEvent(event, getShell());
875875
}
876876
layoutItems(0, true);
877877
redraw();

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Menu.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1366,7 +1366,7 @@ LRESULT wmTimer (long wParam, long lParam) {
13661366
void handleDPIChange(Event event, float scalingFactor) {
13671367
super.handleDPIChange(event, scalingFactor);
13681368
for (MenuItem item : getItems()) {
1369-
item.notifyListeners(SWT.ZoomChanged, event);
1369+
item.sendZoomChangedEvent(event, getShell());
13701370
}
13711371
}
13721372
}

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/MenuItem.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1463,7 +1463,7 @@ void handleDPIChange(Event event, float scalingFactor) {
14631463
// Refresh the sub menu
14641464
Menu subMenu = getMenu();
14651465
if (subMenu != null) {
1466-
subMenu.notifyListeners(SWT.ZoomChanged, event);
1466+
subMenu.sendZoomChangedEvent(event, subMenu.getShell());
14671467
}
14681468
}
14691469
}

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/TabFolder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1136,7 +1136,7 @@ void handleDPIChange(Event event, float scalingFactor) {
11361136
imageList = null;
11371137
}
11381138
for (int i = 0; i < getItemCount(); i++) {
1139-
items[i].notifyListeners(SWT.ZoomChanged, event);
1139+
items[i].sendZoomChangedEvent(event, getShell());
11401140
}
11411141
layout(true, true);
11421142
}

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Table.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7363,10 +7363,10 @@ void handleDPIChange(Event event, float scalingFactor) {
73637363
setItemHeight(-1);
73647364

73657365
for (TableItem item : getItems()) {
7366-
item.notifyListeners(SWT.ZoomChanged, event);
7366+
item.sendZoomChangedEvent(event, getShell());
73677367
}
73687368
for (TableColumn tableColumn : getColumns()) {
7369-
tableColumn.notifyListeners(SWT.ZoomChanged, event);
7369+
tableColumn.sendZoomChangedEvent(event, getShell());
73707370
}
73717371

73727372
if (getColumns().length == 0 && scrollWidth != 0) {

bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/ToolBar.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1770,7 +1770,7 @@ record ToolItemData(ToolItem toolItem, TBBUTTON button) {
17701770
// at the end
17711771
seperatorWidth[i] = item.getWidth();
17721772
}
1773-
item.notifyListeners(SWT.ZoomChanged, event);
1773+
item.sendZoomChangedEvent(event, getShell());
17741774
buttondata.push(new ToolItemData(item, lpButton));
17751775
OS.SendMessage(handle, OS.TB_DELETEBUTTON, i, 0);
17761776
}

0 commit comments

Comments
 (0)