/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// NCCALCSIZE_PARAMS and WINDOWPOS are relatively large structures, so store // them as a pointer to save memory using NcCalcSizeVariantData =
Variant<UniquePtr<std::pair<NCCALCSIZE_PARAMS, WINDOWPOS>>, RECT>; // to save memory, hold the raw data and only convert to string // when requested using MessageSpecificData =
Variant<std::pair<WPARAM, LPARAM>, // WM_SIZE, WM_MOVE
WINDOWPOS, // WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED
std::pair<WPARAM, RECT>, // WM_SIZING, WM_DPICHANGED, WM_MOVING
std::pair<WPARAM, nsString>, // WM_SETTINGCHANGE
std::pair<bool, NcCalcSizeVariantData>, // WM_NCCALCSIZE
MINMAXINFO // WM_GETMINMAXINFO
>;
struct CircularMessageBuffer { // Only used when the vector is at its maximum size
size_t mNextFreeIndex = 0;
std::vector<WindowMessageData> mMessages;
}; using WindowMessageMap = std::map<HWND, std::map<UINT, CircularMessageBuffer>>;
MessageSpecificData MakeMessageSpecificData(UINT event, WPARAM wParam,
LPARAM lParam) { // Since we store this data for every message we log, make sure it's of a // reasonable size. Keep in mind we're storing up to 10 (number of message // types) // * 6 (default number of messages per type to keep) of these messages per // window.
static_assert(sizeof(MessageSpecificData) <= 48); switch (event) { case WM_SIZE: case WM_MOVE: return MessageSpecificData(std::make_pair(wParam, lParam)); case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: {
LPWINDOWPOS windowPosPtr = reinterpret_cast<LPWINDOWPOS>(lParam);
WINDOWPOS windowPos = *windowPosPtr; return MessageSpecificData(std::move(windowPos));
} case WM_SIZING: case WM_DPICHANGED: case WM_MOVING: {
LPRECT rectPtr = reinterpret_cast<LPRECT>(lParam);
RECT rect = *rectPtr; return MessageSpecificData(std::make_pair(wParam, std::move(rect)));
} case WM_SETTINGCHANGE: {
LPCWSTR wideStrPtr = reinterpret_cast<LPCWSTR>(lParam);
nsString str(wideStrPtr); return MessageSpecificData(std::make_pair(wParam, std::move(str)));
} case WM_NCCALCSIZE: { bool shouldIndicateValidArea = wParam == TRUE; if (shouldIndicateValidArea) {
LPNCCALCSIZE_PARAMS ncCalcSizeParamsPtr = reinterpret_cast<LPNCCALCSIZE_PARAMS>(lParam);
NCCALCSIZE_PARAMS ncCalcSizeParams = *ncCalcSizeParamsPtr;
WINDOWPOS windowPos = *ncCalcSizeParams.lppos;
UniquePtr<std::pair<NCCALCSIZE_PARAMS, WINDOWPOS>> ncCalcSizeData =
MakeUnique<std::pair<NCCALCSIZE_PARAMS, WINDOWPOS>>(
std::pair(std::move(ncCalcSizeParams), std::move(windowPos))); return MessageSpecificData(
std::make_pair(shouldIndicateValidArea,
NcCalcSizeVariantData(std::move(ncCalcSizeData))));
} else {
LPRECT rectPtr = reinterpret_cast<LPRECT>(lParam);
RECT rect = *rectPtr; return MessageSpecificData(std::make_pair(
shouldIndicateValidArea, NcCalcSizeVariantData(std::move(rect))));
}
} case WM_GETMINMAXINFO: {
PMINMAXINFO minMaxInfoPtr = reinterpret_cast<PMINMAXINFO>(lParam);
MINMAXINFO minMaxInfo = *minMaxInfoPtr; return MessageSpecificData(std::move(minMaxInfo));
} default:
MOZ_ASSERT_UNREACHABLE( "Unhandled message type in MakeMessageSpecificData"); return MessageSpecificData(std::make_pair(wParam, lParam));
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.