355149 - Workbench window rendering very slow when restored from minimized state if previously maximized
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java index f785acb..e94de35 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/win32/org/eclipse/swt/internal/win32/OS.java
@@ -2140,6 +2140,7 @@ public static final int WM_VSCROLL = 0x115; public static final int WM_WINDOWPOSCHANGED = 0x47; public static final int WM_WINDOWPOSCHANGING = 0x46; + public static final int WPF_RESTORETOMAXIMIZED = 0x0002; public static final int WS_BORDER = 0x800000; public static final int WS_CAPTION = 0xc00000; public static final int WS_CHILD = 0x40000000;
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Decorations.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Decorations.java old mode 100755 new mode 100644 index 6052f6b..ea39737 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Decorations.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/widgets/Decorations.java
@@ -107,6 +107,7 @@ boolean moved, resized, opened; int oldX = OS.CW_USEDEFAULT, oldY = OS.CW_USEDEFAULT; int oldWidth = OS.CW_USEDEFAULT, oldHeight = OS.CW_USEDEFAULT; + RECT maxRect = new RECT(); /** * Prevents uninitialized instances from being created outside the package. @@ -485,6 +486,11 @@ WINDOWPLACEMENT lpwndpl = new WINDOWPLACEMENT (); lpwndpl.length = WINDOWPLACEMENT.sizeof; OS.GetWindowPlacement (handle, lpwndpl); + if ((lpwndpl.flags & OS.WPF_RESTORETOMAXIMIZED) != 0) { + int width = maxRect.right - maxRect.left; + int height = maxRect.bottom - maxRect.top; + return new Rectangle (maxRect.left, maxRect.top, width, height); + } int width = lpwndpl.right - lpwndpl.left; int height = lpwndpl.bottom - lpwndpl.top; return new Rectangle (lpwndpl.left, lpwndpl.top, width, height); @@ -515,6 +521,9 @@ WINDOWPLACEMENT lpwndpl = new WINDOWPLACEMENT (); lpwndpl.length = WINDOWPLACEMENT.sizeof; OS.GetWindowPlacement (handle, lpwndpl); + if ((lpwndpl.flags & OS.WPF_RESTORETOMAXIMIZED) != 0) { + return new Rectangle (0, 0, oldWidth, oldHeight); + } int width = lpwndpl.right - lpwndpl.left; int height = lpwndpl.bottom - lpwndpl.top; /* @@ -630,6 +639,9 @@ WINDOWPLACEMENT lpwndpl = new WINDOWPLACEMENT (); lpwndpl.length = WINDOWPLACEMENT.sizeof; OS.GetWindowPlacement (handle, lpwndpl); + if ((lpwndpl.flags & OS.WPF_RESTORETOMAXIMIZED) != 0) { + return new Point (maxRect.left, maxRect.top); + } return new Point (lpwndpl.left, lpwndpl.top); } } @@ -705,6 +717,11 @@ WINDOWPLACEMENT lpwndpl = new WINDOWPLACEMENT (); lpwndpl.length = WINDOWPLACEMENT.sizeof; OS.GetWindowPlacement (handle, lpwndpl); + if ((lpwndpl.flags & OS.WPF_RESTORETOMAXIMIZED) != 0) { + int width = maxRect.right - maxRect.left; + int height = maxRect.bottom - maxRect.top; + return new Point (width, height); + } int width = lpwndpl.right - lpwndpl.left; int height = lpwndpl.bottom - lpwndpl.top; return new Point (width, height); @@ -1757,8 +1774,9 @@ if (resized) { int newWidth = 0, newHeight = 0; switch ((int)/*64*/wParam) { - case OS.SIZE_RESTORED: case OS.SIZE_MAXIMIZED: + OS.GetWindowRect (handle, maxRect); + case OS.SIZE_RESTORED: newWidth = OS.LOWORD (lParam); newHeight = OS.HIWORD (lParam); break;