CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: hrydgard/ppsspp
Path: blob/master/Windows/Debugger/Debugger_MemoryDlg.cpp
Views: 1401
1
#include "Windows/stdafx.h"
2
#include <windowsx.h>
3
#include <commctrl.h>
4
#include "..\resource.h"
5
6
#include "Common/Data/Encoding/Utf8.h"
7
#include "Common/System/Display.h"
8
9
#include "Core/Debugger/MemBlockInfo.h"
10
#include "Core/Debugger/SymbolMap.h"
11
#include "Core/MIPS/MIPSDebugInterface.h"
12
13
#include "Debugger_MemoryDlg.h"
14
#include "CtrlMemView.h"
15
#include "DebuggerShared.h"
16
#include "Common/Log.h"
17
#include "winnt.h"
18
#include <WindowsX.h>
19
#include <algorithm>
20
21
22
RECT CMemoryDlg::slRect; //sym list rect
23
24
FAR WNDPROC DefAddressEditProc;
25
HWND AddressEditParentHwnd = 0;
26
27
LRESULT CALLBACK AddressEditProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
28
{
29
switch(message)
30
{
31
case WM_KEYDOWN:
32
if( wParam == VK_RETURN )
33
{
34
if (AddressEditParentHwnd != 0)
35
SendMessage(AddressEditParentHwnd,WM_DEB_GOTOADDRESSEDIT,0,0);
36
return 0;
37
}
38
break;
39
case WM_KEYUP:
40
if( wParam == VK_RETURN ) return 0;
41
break;
42
case WM_CHAR:
43
if( wParam == VK_RETURN ) return 0;
44
break;
45
case WM_GETDLGCODE:
46
if (lParam && ((MSG*)lParam)->message == WM_KEYDOWN)
47
{
48
if (wParam == VK_RETURN) return DLGC_WANTMESSAGE;
49
}
50
break;
51
};
52
53
return (LRESULT)CallWindowProc((WNDPROC)DefAddressEditProc,hDlg,message,wParam,lParam);
54
}
55
56
57
CMemoryDlg::CMemoryDlg(HINSTANCE _hInstance, HWND _hParent, DebugInterface *_cpu) : Dialog((LPCSTR)IDD_MEMORY, _hInstance,_hParent)
58
{
59
cpu = _cpu;
60
wchar_t temp[256];
61
wsprintf(temp,L"Memory Viewer - %S",cpu->GetName());
62
SetWindowText(m_hDlg,temp);
63
64
ShowWindow(m_hDlg,SW_HIDE);
65
66
memViewHdl = GetDlgItem(m_hDlg, IDC_MEMVIEW);
67
symListHdl = GetDlgItem(m_hDlg, IDC_SYMBOLS);
68
searchBoxHdl = GetDlgItem(m_hDlg, IDC_SEARCH_BOX);
69
srcListHdl = GetDlgItem(m_hDlg, IDC_SEARCH_RESULTS);
70
71
layerDropdown_ = GetDlgItem(m_hDlg, IDC_REGIONS);
72
ComboBox_ResetContent(layerDropdown_);
73
ComboBox_AddString(layerDropdown_, L"Show allocations");
74
ComboBox_SetItemData(layerDropdown_, 0, MemBlockFlags::ALLOC);
75
ComboBox_AddString(layerDropdown_, L"Show sub allocations");
76
ComboBox_SetItemData(layerDropdown_, 1, MemBlockFlags::SUB_ALLOC);
77
ComboBox_AddString(layerDropdown_, L"Show writes");
78
ComboBox_SetItemData(layerDropdown_, 2, MemBlockFlags::WRITE);
79
ComboBox_AddString(layerDropdown_, L"Show textures");
80
ComboBox_SetItemData(layerDropdown_, 3, MemBlockFlags::TEXTURE);
81
ComboBox_SetCurSel(layerDropdown_, 0);
82
83
status_ = GetDlgItem(m_hDlg, IDC_MEMVIEW_STATUS);
84
85
memView = CtrlMemView::getFrom(memViewHdl);
86
memView->setDebugger(_cpu);
87
88
Button_SetCheck(GetDlgItem(m_hDlg,IDC_RAM), TRUE);
89
Button_SetCheck(GetDlgItem(m_hDlg,IDC_MODESYMBOLS), TRUE);
90
91
GetWindowRect(symListHdl, &slRect);
92
GetWindowRect(srcListHdl, &srRect);
93
94
95
// subclass the edit box
96
editWnd = GetDlgItem(m_hDlg,IDC_ADDRESS);
97
DefAddressEditProc = (WNDPROC)GetWindowLongPtr(editWnd,GWLP_WNDPROC);
98
SetWindowLongPtr(editWnd,GWLP_WNDPROC,(LONG_PTR)AddressEditProc);
99
AddressEditParentHwnd = m_hDlg;
100
101
Size();
102
}
103
104
105
CMemoryDlg::~CMemoryDlg(void)
106
{
107
}
108
109
void CMemoryDlg::Update(void)
110
{
111
if (m_hDlg != NULL)
112
{
113
if (memView != NULL)
114
memView->redraw();
115
}
116
}
117
118
void CMemoryDlg::searchBoxRedraw(const std::vector<u32> &results) {
119
wchar_t temp[256]{};
120
SendMessage(srcListHdl, WM_SETREDRAW, FALSE, 0);
121
ListBox_ResetContent(srcListHdl);
122
SendMessage(srcListHdl, LB_INITSTORAGE, (WPARAM)results.size(), (LPARAM)results.size() * 22);
123
for (size_t i = 0; i < results.size(); i++) {
124
wsprintf(temp, L"0x%08X", results[i]);
125
int index = (int)ListBox_AddString(srcListHdl, temp);
126
ListBox_SetItemData(srcListHdl, index, results[i]);
127
}
128
SendMessage(srcListHdl, WM_SETREDRAW, TRUE, 0);
129
RedrawWindow(srcListHdl, NULL, NULL, RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
130
}
131
132
133
void CMemoryDlg::NotifyMapLoaded() {
134
if (m_hDlg && g_symbolMap)
135
g_symbolMap->FillSymbolListBox(symListHdl, ST_DATA);
136
else
137
mapLoadPending_ = true;
138
Update();
139
}
140
141
BOOL CMemoryDlg::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) {
142
wchar_t temp[256]{};
143
int n;
144
145
switch (message) {
146
case WM_COMMAND: {
147
HWND lb = GetDlgItem(m_hDlg, LOWORD(wParam));
148
switch (LOWORD(wParam)) {
149
case IDC_REGIONS:
150
switch (HIWORD(wParam)) {
151
case CBN_SELENDOK:
152
n = ComboBox_GetCurSel(lb);
153
if (n != CB_ERR) {
154
MemBlockFlags flags = (MemBlockFlags)ComboBox_GetItemData(lb, n);
155
memView->setHighlightType(MemBlockFlags(flags));
156
}
157
break;
158
}
159
break;
160
case IDC_SYMBOLS:
161
switch (HIWORD(wParam)) {
162
case LBN_DBLCLK:
163
n = ListBox_GetCurSel(lb);
164
if (n != -1) {
165
unsigned int addr = (unsigned int)ListBox_GetItemData(lb,n);
166
memView->gotoAddr(addr);
167
}
168
break;
169
}
170
break;
171
case IDC_SEARCH_RESULTS:
172
switch (HIWORD(wParam)) {
173
case LBN_DBLCLK:
174
n = ListBox_GetCurSel(lb);
175
if (n != -1) {
176
unsigned int addr = (unsigned int)ListBox_GetItemData(lb, n);
177
memView->gotoAddr(addr);
178
}
179
break;
180
}
181
break;
182
case IDC_SHOWOFFSETS:
183
switch (HIWORD(wParam)) {
184
case BN_CLICKED:
185
if (SendDlgItemMessage(m_hDlg, IDC_SHOWOFFSETS, BM_GETCHECK, 0, 0))
186
memView->toggleOffsetScale(On);
187
else
188
memView->toggleOffsetScale(Off);
189
break;
190
}
191
break;
192
case IDC_BUTTON_SEARCH:
193
switch (HIWORD(wParam)) {
194
case BN_CLICKED:
195
GetWindowText(searchBoxHdl, temp, 255);
196
std::vector<u32> results = memView->searchString(ConvertWStringToUTF8(temp));
197
if (results.size() > 0){
198
searchBoxRedraw(results);
199
}
200
break;
201
}
202
break;
203
}
204
}
205
break;
206
case WM_DEB_MAPLOADED:
207
NotifyMapLoaded();
208
break;
209
case WM_DEB_GOTOADDRESSEDIT: {
210
u32 addr;
211
GetWindowText(editWnd,temp,255);
212
213
if (parseExpression(ConvertWStringToUTF8(temp).c_str(),cpu,addr) == false) {
214
displayExpressionError(m_hDlg);
215
} else {
216
memView->gotoAddr(addr);
217
SetFocus(memViewHdl);
218
}
219
break;
220
}
221
222
case WM_DEB_UPDATE:
223
if (mapLoadPending_ && m_hDlg && g_symbolMap) {
224
g_symbolMap->FillSymbolListBox(symListHdl, ST_DATA);
225
mapLoadPending_ = false;
226
}
227
Update();
228
return TRUE;
229
230
case WM_DEB_SETSTATUSBARTEXT:
231
SendMessage(status_, SB_SETTEXT, 0, (LPARAM)ConvertUTF8ToWString((const char *)lParam).c_str());
232
break;
233
234
case WM_INITDIALOG:
235
return TRUE;
236
237
case WM_SIZE:
238
Size();
239
break;
240
case WM_CLOSE:
241
Show(false);
242
break;
243
}
244
245
return FALSE;
246
}
247
248
void CMemoryDlg::Goto(u32 addr)
249
{
250
Show(true);
251
memView->gotoAddr(addr);
252
SetFocus(memViewHdl);
253
}
254
255
256
void CMemoryDlg::Size()
257
{
258
const float fontScale = 1.0f / g_display.dpi_scale_real_y;
259
260
GetClientRect(m_hDlg,&winRect);
261
int dlg_w = winRect.right - winRect.left;
262
int dlg_h = winRect.bottom - winRect.top;
263
264
int wf = slRect.right-slRect.left;
265
int w = dlg_w - 3 * fontScale - wf*2;
266
int top = 40 * fontScale;
267
int bottom = 24 * fontScale;
268
int height = dlg_h - top - bottom;
269
//HWND, X, Y, width, height, repaint
270
MoveWindow(symListHdl, 0 ,top, wf, height, TRUE);
271
MoveWindow(memViewHdl, wf+4 ,top, w, height, TRUE);
272
MoveWindow(srcListHdl, wf + 4 + w+ 4, top, wf-4, height, TRUE);
273
}
274
275