mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-27 06:43:32 +00:00
45c39709be
Differential Revision: https://phabricator.services.mozilla.com/D182818
154 lines
5.0 KiB
C++
154 lines
5.0 KiB
C++
/* -*- 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/. */
|
|
|
|
#ifndef WindowDbg_h__
|
|
#define WindowDbg_h__
|
|
|
|
/*
|
|
* nsWindowDbg - Debug related utilities for nsWindow.
|
|
*/
|
|
|
|
#include "nsWindowDefs.h"
|
|
#include "mozilla/BaseProfilerMarkersPrerequisites.h"
|
|
|
|
// Enables debug output for popup rollup hooks
|
|
// #define POPUP_ROLLUP_DEBUG_OUTPUT
|
|
|
|
// Enable window size and state debug output
|
|
// #define WINSTATE_DEBUG_OUTPUT
|
|
|
|
// nsIWidget defines a set of debug output statements
|
|
// that are called in various places within the code.
|
|
// #define WIDGET_DEBUG_OUTPUT
|
|
|
|
// Enable IS_VK_DOWN debug output
|
|
// #define DEBUG_VK
|
|
|
|
namespace mozilla::widget {
|
|
|
|
class MOZ_RAII AutoProfilerMessageMarker {
|
|
public:
|
|
explicit AutoProfilerMessageMarker(Span<const char> aMsgLoopName, HWND hWnd,
|
|
UINT msg, WPARAM wParam, LPARAM lParam);
|
|
|
|
~AutoProfilerMessageMarker();
|
|
|
|
protected:
|
|
Maybe<MarkerOptions> mOptions;
|
|
Span<const char> mMsgLoopName;
|
|
UINT mMsg;
|
|
WPARAM mWParam;
|
|
LPARAM mLParam;
|
|
};
|
|
|
|
// Windows message debugging data
|
|
struct EventMsgInfo {
|
|
const char* mStr;
|
|
UINT mId;
|
|
std::function<nsAutoCString(WPARAM, LPARAM, bool)> mParamInfoFn;
|
|
std::function<void(nsCString&, WPARAM, const char*, bool)> mWParamInfoFn;
|
|
const char* mWParamName;
|
|
std::function<void(nsCString&, LPARAM, const char*, bool)> mLParamInfoFn;
|
|
const char* mLParamName;
|
|
void LogParameters(nsCString& str, WPARAM wParam, LPARAM lParam,
|
|
bool isPreCall);
|
|
};
|
|
extern std::unordered_map<UINT, EventMsgInfo> gAllEvents;
|
|
|
|
// RAII-style class to log before and after an event is handled.
|
|
class NativeEventLogger final {
|
|
public:
|
|
template <size_t N>
|
|
NativeEventLogger(const char (&aMsgLoopName)[N], HWND hwnd, UINT msg,
|
|
WPARAM wParam, LPARAM lParam)
|
|
: NativeEventLogger(Span(aMsgLoopName), hwnd, msg, wParam, lParam) {}
|
|
|
|
void SetResult(LRESULT lresult, bool result) {
|
|
mRetValue = lresult;
|
|
mResult = mozilla::Some(result);
|
|
}
|
|
~NativeEventLogger();
|
|
|
|
private:
|
|
NativeEventLogger(Span<const char> aMsgLoopName, HWND hwnd, UINT msg,
|
|
WPARAM wParam, LPARAM lParam);
|
|
bool NativeEventLoggerInternal();
|
|
|
|
AutoProfilerMessageMarker mProfilerMarker;
|
|
const char* mMsgLoopName;
|
|
const HWND mHwnd;
|
|
const UINT mMsg;
|
|
const WPARAM mWParam;
|
|
const LPARAM mLParam;
|
|
mozilla::Maybe<long> mEventCounter;
|
|
// not const because these will be set after the event is handled
|
|
mozilla::Maybe<bool> mResult;
|
|
LRESULT mRetValue = 0;
|
|
|
|
bool mShouldLogPostCall;
|
|
};
|
|
|
|
struct EnumValueAndName {
|
|
uint64_t mFlag;
|
|
const char* mName;
|
|
};
|
|
|
|
// Appends to str a description of the flags passed in.
|
|
// flagsAndNames is a list of flag values with a string description
|
|
// for each one. These are processed in order, so if there are
|
|
// flag values that are combination of individual values (for example
|
|
// something like WS_OVERLAPPEDWINDOW) they need to come first
|
|
// in the flagsAndNames array.
|
|
// A 0 flag value will only be written if the flags input is exactly
|
|
// 0, and it must come last in the flagsAndNames array.
|
|
// Returns whether any info was appended to str.
|
|
bool AppendFlagsInfo(nsCString& str, uint64_t flags,
|
|
const nsTArray<EnumValueAndName>& flagsAndNames,
|
|
const char* name);
|
|
|
|
nsAutoCString WmSizeParamInfo(uint64_t wParam, uint64_t lParam, bool isPreCall);
|
|
void XLowWordYHighWordParamInfo(nsCString& str, uint64_t value,
|
|
const char* name, bool isPreCall);
|
|
void WindowPosParamInfo(nsCString& str, uint64_t value, const char* name,
|
|
bool isPreCall);
|
|
void WindowEdgeParamInfo(nsCString& str, uint64_t value, const char* name,
|
|
bool isPreCall);
|
|
void RectParamInfo(nsCString& str, uint64_t value, const char* name,
|
|
bool isPreCall);
|
|
void UiActionParamInfo(nsCString& str, uint64_t value, const char* name,
|
|
bool isPreCall);
|
|
void WideStringParamInfo(nsCString& result, uint64_t value, const char* name,
|
|
bool isPreCall);
|
|
void MinMaxInfoParamInfo(nsCString& result, uint64_t value, const char* name,
|
|
bool isPreCall);
|
|
nsAutoCString WmNcCalcSizeParamInfo(uint64_t wParam, uint64_t lParam,
|
|
bool isPreCall);
|
|
} // namespace mozilla::widget
|
|
|
|
#if defined(POPUP_ROLLUP_DEBUG_OUTPUT)
|
|
typedef struct {
|
|
char* mStr;
|
|
int mId;
|
|
} MSGFEventMsgInfo;
|
|
|
|
# define DISPLAY_NMM_PRT(_arg) \
|
|
MOZ_LOG(gWindowsLog, mozilla::LogLevel::Info, ((_arg)));
|
|
#else
|
|
# define DISPLAY_NMM_PRT(_arg)
|
|
#endif // defined(POPUP_ROLLUP_DEBUG_OUTPUT)
|
|
|
|
#if defined(DEBUG)
|
|
void DDError(const char* msg, HRESULT hr);
|
|
#endif // defined(DEBUG)
|
|
|
|
#if defined(DEBUG_VK)
|
|
bool is_vk_down(int vk);
|
|
# define IS_VK_DOWN is_vk_down
|
|
#else
|
|
# define IS_VK_DOWN(a) (GetKeyState(a) < 0)
|
|
#endif // defined(DEBUG_VK)
|
|
|
|
#endif /* WindowDbg_h__ */
|