1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
/* -*- 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();
WPARAM WParam() const { return mWParam; }
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,
Span<const 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__ */
|