Bug 539061 - 'OOPP: ASSERTION: Received "nonqueued" message 31, 10'. r=jimm.

This commit is contained in:
Ben Turner 2010-01-15 12:35:53 -08:00
Родитель ce8403acff
Коммит 1be3c6c424
2 изменённых файлов: 48 добавлений и 85 удалений

Просмотреть файл

@ -173,12 +173,15 @@ ProcessOrDeferMessage(HWND hwnd,
// their wParam or lParam arguments!
case WM_ACTIVATE:
case WM_ACTIVATEAPP:
case WM_CANCELMODE:
case WM_CAPTURECHANGED:
case WM_CHILDACTIVATE:
case WM_DESTROY:
case WM_ENABLE:
case WM_IME_NOTIFY:
case WM_IME_SETCONTEXT:
case WM_KILLFOCUS:
case WM_MOUSEWHEEL:
case WM_NCDESTROY:
case WM_PARENTNOTIFY:
case WM_SETFOCUS:
@ -188,6 +191,8 @@ ProcessOrDeferMessage(HWND hwnd,
break;
}
case WM_DEVICECHANGE:
case WM_NCACTIVATE: // Intentional fall-through.
case WM_SETCURSOR: {
// Friggin unconventional return value...
res = TRUE;
@ -195,12 +200,6 @@ ProcessOrDeferMessage(HWND hwnd,
break;
}
case WM_NCACTIVATE: {
res = TRUE;
deferred = new DeferredNCActivateMessage(hwnd, uMsg, wParam, lParam);
break;
}
case WM_MOUSEACTIVATE: {
res = MA_NOACTIVATE;
deferred = new DeferredSendMessage(hwnd, uMsg, wParam, lParam);
@ -237,18 +236,15 @@ ProcessOrDeferMessage(HWND hwnd,
}
// These messages are faked via a call to SetWindowPos.
case WM_WINDOWPOSCHANGED: // Intentional fall-through.
case WM_WINDOWPOSCHANGING: {
UINT flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE |
SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_DEFERERASE;
deferred = new DeferredWindowPosMessage(hwnd, flags);
case WM_WINDOWPOSCHANGED: {
deferred = new DeferredWindowPosMessage(hwnd, lParam);
break;
}
case WM_NCCALCSIZE: {
UINT flags = SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
SWP_NOSIZE | SWP_NOOWNERZORDER | SWP_NOZORDER |
SWP_DEFERERASE | SWP_NOSENDCHANGING;
deferred = new DeferredWindowPosMessage(hwnd, flags);
deferred = new DeferredWindowPosMessage(hwnd, lParam, true, flags);
break;
}
@ -257,8 +253,9 @@ ProcessOrDeferMessage(HWND hwnd,
case WM_GETMINMAXINFO:
case WM_GETTEXT:
case WM_NCHITTEST:
case WM_SETICON: // Intentional fall-through.
case WM_SYNCPAINT: {
case WM_SETICON:
case WM_SYNCPAINT: // Intentional fall-through.
case WM_WINDOWPOSCHANGING: {
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
@ -664,66 +661,48 @@ DeferredSettingChangeMessage::~DeferredSettingChangeMessage()
}
}
DeferredWindowPosMessage::DeferredWindowPosMessage(HWND aHWnd,
LPARAM aLParam,
bool aUseCustomFlags,
UINT aFlags)
{
WINDOWPOS* source = reinterpret_cast<WINDOWPOS*>(aLParam);
memcpy(&windowPos, source, sizeof(windowPos));
NS_ASSERTION(aHWnd == source->hwnd, "Mismatched hwnds!");
if (aUseCustomFlags) {
windowPos.flags = aFlags;
}
else {
// Windows sends in some private flags sometimes that we can't simply copy.
// Filter here.
UINT mask = SWP_ASYNCWINDOWPOS | SWP_DEFERERASE | SWP_DRAWFRAME |
SWP_FRAMECHANGED | SWP_HIDEWINDOW | SWP_NOACTIVATE |
SWP_NOCOPYBITS | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOREDRAW |
SWP_NOREPOSITION | SWP_NOSENDCHANGING | SWP_NOSIZE |
SWP_NOZORDER | SWP_SHOWWINDOW;
windowPos.flags &= mask;
}
}
void
DeferredWindowPosMessage::Run()
{
AssertWindowIsNotNeutered(hWnd);
if (!IsWindow(hWnd)) {
AssertWindowIsNotNeutered(windowPos.hwnd);
if (!IsWindow(windowPos.hwnd)) {
NS_ERROR("Invalid window!");
return;
}
if (!IsWindow(windowPos.hwndInsertAfter)) {
NS_WARNING("ZOrder change cannot be honored");
windowPos.hwndInsertAfter = 0;
windowPos.flags |= SWP_NOZORDER;
}
#ifdef DEBUG
BOOL ret =
#endif
SetWindowPos(hWnd, 0, 0, 0, 0, 0, flags);
SetWindowPos(windowPos.hwnd, windowPos.hwndInsertAfter, windowPos.x,
windowPos.y, windowPos.cx, windowPos.cy, windowPos.flags);
NS_ASSERTION(ret, "SetWindowPos failed!");
}
DeferredNCActivateMessage::DeferredNCActivateMessage(HWND aHWnd,
UINT aMessage,
WPARAM aWParam,
LPARAM aLParam)
: DeferredSendMessage(aHWnd, aMessage, aWParam, aLParam),
region(NULL)
{
NS_ASSERTION(aMessage == WM_NCACTIVATE, "Wrong message!");
if (aLParam) {
// This is a window that doesn't have a visual style and so lParam is a
// handle to an update region. We need to duplicate it.
HRGN source = reinterpret_cast<HRGN>(aLParam);
DWORD dataSize = GetRegionData(source, 0, NULL);
if (!dataSize) {
NS_ERROR("GetRegionData failed!");
return;
}
nsAutoArrayPtr<char> buffer = new char[dataSize];
NS_ASSERTION(buffer, "Out of memory!");
RGNDATA* data = reinterpret_cast<RGNDATA*>(buffer.get());
dataSize = GetRegionData(source, dataSize, data);
if (!dataSize) {
NS_ERROR("GetRegionData failed!");
return;
}
HRGN tempRegion = ExtCreateRegion(NULL, dataSize, data);
if (!tempRegion) {
NS_ERROR("ExtCreateRegion failed!");
return;
}
region = tempRegion;
lParam = reinterpret_cast<LPARAM>(region);
}
}
DeferredNCActivateMessage::~DeferredNCActivateMessage()
{
if (region) {
DeleteObject(region);
}
}

Просмотреть файл

@ -144,30 +144,14 @@ class DeferredWindowPosMessage : public DeferredMessage
{
public:
DeferredWindowPosMessage(HWND aHWnd,
UINT aFlags)
: hWnd(aHWnd),
flags(aFlags)
{ }
LPARAM aLParam,
bool aUseCustomFlags = false,
UINT aFlags = 0);
virtual void Run();
private:
HWND hWnd;
UINT flags;
};
class DeferredNCActivateMessage : public DeferredSendMessage
{
public:
DeferredNCActivateMessage(HWND aHWnd,
UINT aMessage,
WPARAM aWParam,
LPARAM aLParam);
~DeferredNCActivateMessage();
private:
HRGN region;
WINDOWPOS windowPos;
};
} /* namespace windows */