зеркало из https://github.com/mozilla/pjs.git
Bug 539061 - 'OOPP: ASSERTION: Received "nonqueued" message 31, 10'. r=jimm.
This commit is contained in:
Родитель
ce8403acff
Коммит
1be3c6c424
|
@ -173,12 +173,15 @@ ProcessOrDeferMessage(HWND hwnd,
|
||||||
// their wParam or lParam arguments!
|
// their wParam or lParam arguments!
|
||||||
case WM_ACTIVATE:
|
case WM_ACTIVATE:
|
||||||
case WM_ACTIVATEAPP:
|
case WM_ACTIVATEAPP:
|
||||||
|
case WM_CANCELMODE:
|
||||||
case WM_CAPTURECHANGED:
|
case WM_CAPTURECHANGED:
|
||||||
case WM_CHILDACTIVATE:
|
case WM_CHILDACTIVATE:
|
||||||
case WM_DESTROY:
|
case WM_DESTROY:
|
||||||
|
case WM_ENABLE:
|
||||||
case WM_IME_NOTIFY:
|
case WM_IME_NOTIFY:
|
||||||
case WM_IME_SETCONTEXT:
|
case WM_IME_SETCONTEXT:
|
||||||
case WM_KILLFOCUS:
|
case WM_KILLFOCUS:
|
||||||
|
case WM_MOUSEWHEEL:
|
||||||
case WM_NCDESTROY:
|
case WM_NCDESTROY:
|
||||||
case WM_PARENTNOTIFY:
|
case WM_PARENTNOTIFY:
|
||||||
case WM_SETFOCUS:
|
case WM_SETFOCUS:
|
||||||
|
@ -188,6 +191,8 @@ ProcessOrDeferMessage(HWND hwnd,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case WM_DEVICECHANGE:
|
||||||
|
case WM_NCACTIVATE: // Intentional fall-through.
|
||||||
case WM_SETCURSOR: {
|
case WM_SETCURSOR: {
|
||||||
// Friggin unconventional return value...
|
// Friggin unconventional return value...
|
||||||
res = TRUE;
|
res = TRUE;
|
||||||
|
@ -195,12 +200,6 @@ ProcessOrDeferMessage(HWND hwnd,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case WM_NCACTIVATE: {
|
|
||||||
res = TRUE;
|
|
||||||
deferred = new DeferredNCActivateMessage(hwnd, uMsg, wParam, lParam);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case WM_MOUSEACTIVATE: {
|
case WM_MOUSEACTIVATE: {
|
||||||
res = MA_NOACTIVATE;
|
res = MA_NOACTIVATE;
|
||||||
deferred = new DeferredSendMessage(hwnd, uMsg, wParam, lParam);
|
deferred = new DeferredSendMessage(hwnd, uMsg, wParam, lParam);
|
||||||
|
@ -237,18 +236,15 @@ ProcessOrDeferMessage(HWND hwnd,
|
||||||
}
|
}
|
||||||
|
|
||||||
// These messages are faked via a call to SetWindowPos.
|
// These messages are faked via a call to SetWindowPos.
|
||||||
case WM_WINDOWPOSCHANGED: // Intentional fall-through.
|
case WM_WINDOWPOSCHANGED: {
|
||||||
case WM_WINDOWPOSCHANGING: {
|
deferred = new DeferredWindowPosMessage(hwnd, lParam);
|
||||||
UINT flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE |
|
|
||||||
SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_DEFERERASE;
|
|
||||||
deferred = new DeferredWindowPosMessage(hwnd, flags);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case WM_NCCALCSIZE: {
|
case WM_NCCALCSIZE: {
|
||||||
UINT flags = SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
|
UINT flags = SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE |
|
||||||
SWP_NOSIZE | SWP_NOOWNERZORDER | SWP_NOZORDER |
|
SWP_NOSIZE | SWP_NOOWNERZORDER | SWP_NOZORDER |
|
||||||
SWP_DEFERERASE | SWP_NOSENDCHANGING;
|
SWP_DEFERERASE | SWP_NOSENDCHANGING;
|
||||||
deferred = new DeferredWindowPosMessage(hwnd, flags);
|
deferred = new DeferredWindowPosMessage(hwnd, lParam, true, flags);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -257,8 +253,9 @@ ProcessOrDeferMessage(HWND hwnd,
|
||||||
case WM_GETMINMAXINFO:
|
case WM_GETMINMAXINFO:
|
||||||
case WM_GETTEXT:
|
case WM_GETTEXT:
|
||||||
case WM_NCHITTEST:
|
case WM_NCHITTEST:
|
||||||
case WM_SETICON: // Intentional fall-through.
|
case WM_SETICON:
|
||||||
case WM_SYNCPAINT: {
|
case WM_SYNCPAINT: // Intentional fall-through.
|
||||||
|
case WM_WINDOWPOSCHANGING: {
|
||||||
return DefWindowProc(hwnd, uMsg, wParam, lParam);
|
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
|
void
|
||||||
DeferredWindowPosMessage::Run()
|
DeferredWindowPosMessage::Run()
|
||||||
{
|
{
|
||||||
AssertWindowIsNotNeutered(hWnd);
|
AssertWindowIsNotNeutered(windowPos.hwnd);
|
||||||
if (!IsWindow(hWnd)) {
|
if (!IsWindow(windowPos.hwnd)) {
|
||||||
NS_ERROR("Invalid window!");
|
NS_ERROR("Invalid window!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!IsWindow(windowPos.hwndInsertAfter)) {
|
||||||
|
NS_WARNING("ZOrder change cannot be honored");
|
||||||
|
windowPos.hwndInsertAfter = 0;
|
||||||
|
windowPos.flags |= SWP_NOZORDER;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
BOOL ret =
|
BOOL ret =
|
||||||
#endif
|
#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!");
|
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:
|
public:
|
||||||
DeferredWindowPosMessage(HWND aHWnd,
|
DeferredWindowPosMessage(HWND aHWnd,
|
||||||
UINT aFlags)
|
LPARAM aLParam,
|
||||||
: hWnd(aHWnd),
|
bool aUseCustomFlags = false,
|
||||||
flags(aFlags)
|
UINT aFlags = 0);
|
||||||
{ }
|
|
||||||
|
|
||||||
virtual void Run();
|
virtual void Run();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
HWND hWnd;
|
WINDOWPOS windowPos;
|
||||||
UINT flags;
|
|
||||||
};
|
|
||||||
|
|
||||||
class DeferredNCActivateMessage : public DeferredSendMessage
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DeferredNCActivateMessage(HWND aHWnd,
|
|
||||||
UINT aMessage,
|
|
||||||
WPARAM aWParam,
|
|
||||||
LPARAM aLParam);
|
|
||||||
|
|
||||||
~DeferredNCActivateMessage();
|
|
||||||
|
|
||||||
private:
|
|
||||||
HRGN region;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace windows */
|
} /* namespace windows */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче