# HG changeset patch # User Frank Benoit # Date 1225745920 -3600 # Node ID da968414c383e45bdd1ea30da85d55219bb8d6ea # Parent 71b78d56f01f5ea30e64e879a9ada10ab970d2ac Merge changes SWT 3.4.1 diff -r 71b78d56f01f -r da968414c383 dwt/custom/CCombo.d --- a/dwt/custom/CCombo.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/custom/CCombo.d Mon Nov 03 21:58:40 2008 +0100 @@ -532,7 +532,7 @@ list.deselectAll (); } void dropDown (bool drop) { - if (drop is isDropped () || !isVisible()) return; + if (drop is isDropped ()) return; if (!drop) { popup.setVisible (false); if (!isDisposed () && isFocusControl()) { @@ -540,7 +540,7 @@ } return; } - + if (!isVisible()) return; if (getShell() !is popup.getParent ()) { String[] items = list.getItems (); int selectionIndex = list.getSelectionIndex (); diff -r 71b78d56f01f -r da968414c383 dwt/dnd/ByteArrayTransfer.d --- a/dwt/dnd/ByteArrayTransfer.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/dnd/ByteArrayTransfer.d Mon Nov 03 21:58:40 2008 +0100 @@ -202,7 +202,7 @@ FORMATETC* formatetc = transferData.formatetc; STGMEDIUM* stgmedium = new STGMEDIUM(); stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = data.GetData(formatetc, stgmedium); + transferData.result = getData(data, formatetc, stgmedium); data.Release(); if (transferData.result !is COM.S_OK) return null; auto hMem = stgmedium.unionField; diff -r 71b78d56f01f -r da968414c383 dwt/dnd/FileTransfer.d --- a/dwt/dnd/FileTransfer.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/dnd/FileTransfer.d Mon Nov 03 21:58:40 2008 +0100 @@ -138,7 +138,7 @@ formatetc.tymed = COM.TYMED_HGLOBAL; STGMEDIUM* stgmedium = new STGMEDIUM(); stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = dataObject.GetData(formatetc, stgmedium); + transferData.result = getData(dataObject, formatetc, stgmedium); dataObject.Release(); if (transferData.result !is COM.S_OK) return null; // How many files are there? diff -r 71b78d56f01f -r da968414c383 dwt/dnd/HTMLTransfer.d --- a/dwt/dnd/HTMLTransfer.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/dnd/HTMLTransfer.d Mon Nov 03 21:58:40 2008 +0100 @@ -161,7 +161,7 @@ STGMEDIUM* stgmedium = new STGMEDIUM(); FORMATETC* formatetc = transferData.formatetc; stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = data.GetData(formatetc, stgmedium); + transferData.result = getData(data, formatetc, stgmedium); data.Release(); if (transferData.result !is COM.S_OK) return null; auto hMem = stgmedium.unionField; diff -r 71b78d56f01f -r da968414c383 dwt/dnd/ImageTransfer.d --- a/dwt/dnd/ImageTransfer.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/dnd/ImageTransfer.d Mon Nov 03 21:58:40 2008 +0100 @@ -157,7 +157,7 @@ formatetc.tymed = COM.TYMED_HGLOBAL; STGMEDIUM* stgmedium = new STGMEDIUM(); stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = dataObject.GetData(formatetc, stgmedium); + transferData.result = getData(dataObject, formatetc, stgmedium); if (transferData.result !is COM.S_OK) return null; HANDLE hMem = stgmedium.unionField; diff -r 71b78d56f01f -r da968414c383 dwt/dnd/RTFTransfer.d --- a/dwt/dnd/RTFTransfer.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/dnd/RTFTransfer.d Mon Nov 03 21:58:40 2008 +0100 @@ -118,7 +118,7 @@ STGMEDIUM* stgmedium = new STGMEDIUM(); FORMATETC* formatetc = transferData.formatetc; stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = data.GetData(formatetc, stgmedium); + transferData.result = getData(data, formatetc, stgmedium); data.Release(); if (transferData.result !is COM.S_OK) return null; auto hMem = stgmedium.unionField; diff -r 71b78d56f01f -r da968414c383 dwt/dnd/TextTransfer.d --- a/dwt/dnd/TextTransfer.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/dnd/TextTransfer.d Mon Nov 03 21:58:40 2008 +0100 @@ -135,7 +135,7 @@ FORMATETC* formatetc = transferData.formatetc; STGMEDIUM* stgmedium = new STGMEDIUM(); stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = data.GetData(formatetc, stgmedium); + transferData.result = getData(data, formatetc, stgmedium); data.Release(); if (transferData.result !is COM.S_OK) return null; auto hMem = stgmedium.unionField; diff -r 71b78d56f01f -r da968414c383 dwt/dnd/Transfer.d --- a/dwt/dnd/Transfer.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/dnd/Transfer.d Mon Nov 03 21:58:40 2008 +0100 @@ -35,6 +35,29 @@ */ public abstract class Transfer { +private static final int RETRY_LIMIT = 10; +/* + * Feature in Windows. When another application has control + * of the clipboard, the clipboard is locked and it's not + * possible to retrieve data until the other application is + * finished. To allow other applications to get the + * data, use PeekMessage() to enable cross thread + * message sends. + */ +int getData(IDataObject dataObject, FORMATETC pFormatetc, STGMEDIUM pmedium) { + if (dataObject.GetData(pFormatetc, pmedium) is COM.S_OK) return COM.S_OK; + try {Thread.sleep(0.050);} catch (Exception t) {} + int result = dataObject.GetData(pFormatetc, pmedium); + int retryCount = 0; + while (result !is COM.S_OK && retryCount++ < RETRY_LIMIT) { + MSG msg = new MSG(); + OS.PeekMessage(msg, 0, 0, 0, OS.PM_NOREMOVE | OS.PM_NOYIELD); + try {Thread.sleep(0.050);} catch (Exception t) {} + result = dataObject.GetData(pFormatetc, pmedium); + } + return result; +} + /** * Returns a list of the platform specific data types that can be converted using * this transfer agent. diff -r 71b78d56f01f -r da968414c383 dwt/dnd/URLTransfer.d --- a/dwt/dnd/URLTransfer.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/dnd/URLTransfer.d Mon Nov 03 21:58:40 2008 +0100 @@ -118,7 +118,7 @@ STGMEDIUM* stgmedium = new STGMEDIUM(); FORMATETC* formatetc = transferData.formatetc; stgmedium.tymed = COM.TYMED_HGLOBAL; - transferData.result = data.GetData(formatetc, stgmedium); + transferData.result = getData(data, formatetc, stgmedium); data.Release(); if (transferData.result !is COM.S_OK) return null; auto hMem = stgmedium.unionField; diff -r 71b78d56f01f -r da968414c383 dwt/internal/Library.d --- a/dwt/internal/Library.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/internal/Library.d Mon Nov 03 21:58:40 2008 +0100 @@ -34,7 +34,7 @@ /** * DWT Minor version number (must be in the range 0..999) */ - static const int MINOR_VERSION = 448; + static const int MINOR_VERSION = 449; /** * DWT revision number (must be >= 0) diff -r 71b78d56f01f -r da968414c383 dwt/internal/win32/OS.d --- a/dwt/internal/win32/OS.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/internal/win32/OS.d Mon Nov 03 21:58:40 2008 +0100 @@ -1346,6 +1346,7 @@ public static const int MB_OKCANCEL = 0x1; public static const int MB_PRECOMPOSED = 0x1; public static const int MB_RETRYCANCEL = 0x5; + public static const int MB_RIGHT = 0x00080000; public static const int MB_RTLREADING = 0x100000; public static const int MB_SYSTEMMODAL = 0x1000; public static const int MB_TASKMODAL = 0x2000; diff -r 71b78d56f01f -r da968414c383 dwt/widgets/Composite.d --- a/dwt/widgets/Composite.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/widgets/Composite.d Mon Nov 03 21:58:40 2008 +0100 @@ -910,7 +910,7 @@ defer = false; } if (!defer && (state & CANVAS) !is 0) { - state &= ~RESIZE_OCCURRED | MOVE_OCCURRED; + state &= ~(RESIZE_OCCURRED | MOVE_OCCURRED); state |= RESIZE_DEFERRED | MOVE_DEFERRED; } super.setBounds (x, y, width, height, flags, defer); diff -r 71b78d56f01f -r da968414c383 dwt/widgets/Decorations.d --- a/dwt/widgets/Decorations.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/widgets/Decorations.d Mon Nov 03 21:58:40 2008 +0100 @@ -1405,7 +1405,18 @@ oldWidth = rect.width; oldHeight = rect.height; } - OS.UpdateWindow (handle); + /* + * Bug in Windows. On Vista using the Classic theme, + * when the window is hung and UpdateWindow() is called, + * nothing is drawn, and outstanding WM_PAINTs are cleared. + * This causes pixel corruption. The fix is to avoid calling + * update on hung windows. + */ + bool update = true; + if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0) && !OS.IsAppThemed ()) { + update = !OS.IsHungAppWindow (handle); + } + if (update) OS.UpdateWindow (handle); } } else { static if (!OS.IsWinCE) { diff -r 71b78d56f01f -r da968414c383 dwt/widgets/MessageBox.d --- a/dwt/widgets/MessageBox.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/widgets/MessageBox.d Mon Nov 03 21:58:40 2008 +0100 @@ -176,10 +176,10 @@ } int bits = buttonBits | iconBits | modalBits; - if ((style & DWT.RIGHT_TO_LEFT) !is 0) bits |= OS.MB_RTLREADING; + if ((style & DWT.RIGHT_TO_LEFT) !is 0) bits |= OS.MB_RTLREADING | OS.MB_RIGHT; if ((style & (DWT.LEFT_TO_RIGHT | DWT.RIGHT_TO_LEFT)) is 0) { if (parent !is null && (parent.style & DWT.MIRRORED) !is 0) { - bits |= OS.MB_RTLREADING; + bits |= OS.MB_RTLREADING | OS.MB_RIGHT; } } diff -r 71b78d56f01f -r da968414c383 dwt/widgets/ProgressBar.d --- a/dwt/widgets/ProgressBar.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/widgets/ProgressBar.d Mon Nov 03 21:58:40 2008 +0100 @@ -340,19 +340,26 @@ checkWidget (); /* * Feature in Vista. When the progress bar is not in - * a normal state, PBM_SETPOS does not set the position. + * a normal state, PBM_SETPOS does not set the position + * of the bar when the selection is equal to the minimum. * This is undocumented. The fix is to temporarily * set the state to PBST_NORMAL, set the position, then * reset the state. */ int /*long*/ state = 0; + bool fixSelection = false; if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) { - state = OS.SendMessage (handle, OS.PBM_GETSTATE, 0, 0); - OS.SendMessage (handle, OS.PBM_SETSTATE, OS.PBST_NORMAL, 0); + int /*long*/ minumum = OS.SendMessage (handle, OS.PBM_GETRANGE, 1, 0); + int /*long*/ selection = OS.SendMessage (handle, OS.PBM_GETPOS, 0, 0); + if (selection is minumum) { + fixSelection = true; + state = OS.SendMessage (handle, OS.PBM_GETSTATE, 0, 0); + OS.SendMessage (handle, OS.PBM_SETSTATE, OS.PBST_NORMAL, 0); + } } OS.SendMessage (handle, OS.PBM_SETPOS, value, 0); if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) { - OS.SendMessage (handle, OS.PBM_SETSTATE, state, 0); + if (fixSelection) OS.SendMessage (handle, OS.PBM_SETSTATE, state, 0); } } diff -r 71b78d56f01f -r da968414c383 dwt/widgets/Table.d --- a/dwt/widgets/Table.d Thu Oct 23 23:41:09 2008 +0200 +++ b/dwt/widgets/Table.d Mon Nov 03 21:58:40 2008 +0100 @@ -5440,7 +5440,7 @@ * * The fix for both cases is to create the image using PrintWindow(). */ - if ((!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) || hooks (DWT.EraseItem) || hooks (DWT.PaintItem)) { + if ((!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) || (style & DWT.VIRTUAL) !is 0 || hooks (DWT.EraseItem) || hooks (DWT.PaintItem)) { int topIndex = OS.SendMessage (handle, OS.LVM_GETTOPINDEX, 0, 0); int selection = OS.SendMessage (handle, OS.LVM_GETNEXTITEM, topIndex - 1, OS.LVNI_SELECTED); if (selection is -1) return 0;