diff --git a/Windows/Debugger/Debugger_Disasm.cpp b/Windows/Debugger/Debugger_Disasm.cpp index 7bb5ad0239..d6d1701201 100644 --- a/Windows/Debugger/Debugger_Disasm.cpp +++ b/Windows/Debugger/Debugger_Disasm.cpp @@ -139,10 +139,9 @@ CDisasm::CDisasm(HINSTANCE _hInstance, HWND _hParent, DebugInterface *_cpu) : Di threadList = new CtrlThreadList(GetDlgItem(m_hDlg,IDC_THREADLIST)); threadList->reloadThreads(); - stackTraceView = new CtrlStackTraceView(); + stackTraceView = new CtrlStackTraceView(GetDlgItem(m_hDlg,IDC_STACKFRAMES)); stackTraceView->setCpu(cpu); stackTraceView->setDisasm(ptr); - stackTraceView->setDialogItem(GetDlgItem(m_hDlg,IDC_STACKFRAMES)); stackTraceView->loadStackTrace(); // init bottom "tab" @@ -382,7 +381,7 @@ BOOL CDisasm::DlgProc(UINT message, WPARAM wParam, LPARAM lParam) threadList->HandleNotify(lParam); break; case IDC_STACKFRAMES: - stackTraceView->handleNotify(lParam); + stackTraceView->HandleNotify(lParam); break; } break; diff --git a/Windows/Debugger/Debugger_Lists.cpp b/Windows/Debugger/Debugger_Lists.cpp index 42fcd56455..feb9ada055 100644 --- a/Windows/Debugger/Debugger_Lists.cpp +++ b/Windows/Debugger/Debugger_Lists.cpp @@ -582,123 +582,79 @@ void CtrlBreakpointList::showBreakpointMenu(int itemIndex, const POINT &pt) // CtrlStackTraceView // -void CtrlStackTraceView::setDialogItem(HWND hwnd) +CtrlStackTraceView::CtrlStackTraceView(HWND hwnd): GenericListControl(hwnd,stackTraceColumns,SF_COLUMNCOUNT) { - wnd = hwnd; - - SetWindowLongPtr(wnd,GWLP_USERDATA,(LONG_PTR)this); - oldProc = (WNDPROC) SetWindowLongPtr(wnd,GWLP_WNDPROC,(LONG_PTR)wndProc); - - SendMessage(wnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); - - LVCOLUMN lvc; - lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; - lvc.iSubItem = 0; - lvc.fmt = LVCFMT_LEFT; - - RECT rect; - GetWindowRect(wnd,&rect); - - int totalListSize = (rect.right-rect.left-20); - for (int i = 0; i < SF_COLUMNCOUNT; i++) - { - lvc.cx = stackTraceColumns[i].size * totalListSize; - lvc.pszText = stackTraceColumns[i].name; - ListView_InsertColumn(wnd, i, &lvc); - } + Update(); } -LRESULT CALLBACK CtrlStackTraceView::wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +bool CtrlStackTraceView::WindowMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT& returnValue) { - CtrlStackTraceView* sv = (CtrlStackTraceView*) GetWindowLongPtr(hwnd,GWLP_USERDATA); - - switch (msg) + switch(msg) { - case WM_SIZE: - { - int width = LOWORD(lParam); - RECT rect; - GetWindowRect(hwnd,&rect); - - int totalListSize = (rect.right-rect.left-20); - for (int i = 0; i < SF_COLUMNCOUNT; i++) - { - ListView_SetColumnWidth(hwnd,i,stackTraceColumns[i].size * totalListSize); - } - } - break; case WM_KEYDOWN: if (wParam == VK_TAB) { - SendMessage(GetParent(hwnd),WM_DEB_TABPRESSED,0,0); - return 0; + returnValue = 0; + SendMessage(GetParent(GetHandle()),WM_DEB_TABPRESSED,0,0); + return true; } break; case WM_GETDLGCODE: if (lParam && ((MSG*)lParam)->message == WM_KEYDOWN) { - if (wParam == VK_TAB) return DLGC_WANTMESSAGE; + if (wParam == VK_TAB || wParam == VK_RETURN) + { + returnValue = DLGC_WANTMESSAGE; + return true; + } } break; } - return (LRESULT)CallWindowProc((WNDPROC)sv->oldProc,hwnd,msg,wParam,lParam); + + return false; } -void CtrlStackTraceView::handleNotify(LPARAM lParam) +void CtrlStackTraceView::GetColumnText(wchar_t* dest, int row, int col) { - LPNMHDR mhdr = (LPNMHDR) lParam; - - if (mhdr->code == NM_DBLCLK) + switch (col) { - LPNMITEMACTIVATE item = (LPNMITEMACTIVATE) lParam; - SendMessage(GetParent(wnd),WM_DEB_GOTOWPARAM,frames[item->iItem].pc,0); - return; - } - - if (mhdr->code == LVN_GETDISPINFO) - { - NMLVDISPINFO* dispInfo = (NMLVDISPINFO*)lParam; - int index = dispInfo->item.iItem; - - stringBuffer[0] = 0; - switch (dispInfo->item.iSubItem) + case SF_ENTRY: + wsprintf(dest,L"%08X",frames[row].entry); + break; + case SF_ENTRYNAME: { - case SF_ENTRY: - wsprintf(stringBuffer,L"%08X",frames[index].entry); - break; - case SF_ENTRYNAME: - { - const char* sym = cpu->findSymbolForAddress(frames[index].entry); - if (sym != NULL) { - wcscpy(stringBuffer, ConvertUTF8ToWString(sym).c_str()); - } else { - wcscpy(stringBuffer,L"-"); - } + const char* sym = cpu->findSymbolForAddress(frames[row].entry); + if (sym != NULL) { + wcscpy(dest, ConvertUTF8ToWString(sym).c_str()); + } else { + wcscpy(dest,L"-"); } - break; - case SF_CURPC: - wsprintf(stringBuffer,L"%08X",frames[index].pc); - break; - case SF_CUROPCODE: - { - char temp[512]; - disasm->getOpcodeText(frames[index].pc,temp); - wcscpy(stringBuffer, ConvertUTF8ToWString(temp).c_str()); - } - break; - case SF_CURSP: - wsprintf(stringBuffer,L"%08X",frames[index].sp); - break; - case SF_FRAMESIZE: - wsprintf(stringBuffer,L"%08X",frames[index].stackSize); - break; } - - if (stringBuffer[0] == 0) wcscat(stringBuffer, L"Invalid"); - dispInfo->item.pszText = stringBuffer; + break; + case SF_CURPC: + wsprintf(dest,L"%08X",frames[row].pc); + break; + case SF_CUROPCODE: + { + char temp[512]; + disasm->getOpcodeText(frames[row].pc,temp); + wcscpy(dest, ConvertUTF8ToWString(temp).c_str()); + } + break; + case SF_CURSP: + wsprintf(dest,L"%08X",frames[row].sp); + break; + case SF_FRAMESIZE: + wsprintf(dest,L"%08X",frames[row].stackSize); + break; } } +void CtrlStackTraceView::OnDoubleClick(int itemIndex, int column) +{ + SendMessage(GetParent(GetHandle()),WM_DEB_GOTOWPARAM,frames[itemIndex].pc,0); +} + void CtrlStackTraceView::loadStackTrace() { auto threads = GetThreadsInfo(); @@ -715,28 +671,5 @@ void CtrlStackTraceView::loadStackTrace() } frames = MIPSStackWalk::Walk(cpu->GetPC(),cpu->GetRegValue(0,31),cpu->GetRegValue(0,29),entry,stackTop); - - int items = ListView_GetItemCount(wnd); - while (items < (int)frames.size()) - { - LVITEM lvI; - lvI.pszText = LPSTR_TEXTCALLBACK; // Sends an LVN_GETDISPINFO message. - lvI.mask = LVIF_TEXT | LVIF_IMAGE |LVIF_STATE; - lvI.stateMask = 0; - lvI.iSubItem = 0; - lvI.state = 0; - lvI.iItem = items; - lvI.iImage = items; - - ListView_InsertItem(wnd, &lvI); - items++; - } - - while (items > (int)frames.size()) - { - ListView_DeleteItem(wnd,--items); - } - - InvalidateRect(wnd,NULL,true); - UpdateWindow(wnd); + Update(); } diff --git a/Windows/Debugger/Debugger_Lists.h b/Windows/Debugger/Debugger_Lists.h index feeb587c32..1054818e7a 100644 --- a/Windows/Debugger/Debugger_Lists.h +++ b/Windows/Debugger/Debugger_Lists.h @@ -61,16 +61,10 @@ private: void toggleEnabled(int itemIndex); }; -class CtrlStackTraceView +class CtrlStackTraceView: public GenericListControl { - HWND wnd; - WNDPROC oldProc; - std::vector frames; - DebugInterface* cpu; - CtrlDisAsmView* disasm; - wchar_t stringBuffer[256]; - public: + CtrlStackTraceView(HWND hwnd); void setCpu(DebugInterface* cpu) { this->cpu = cpu; @@ -79,8 +73,14 @@ public: { this->disasm = disasm; }; - void setDialogItem(HWND hwnd); void loadStackTrace(); - void handleNotify(LPARAM lParam); - static LRESULT CALLBACK wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); +protected: + virtual bool WindowMessage(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT& returnValue); + virtual void GetColumnText(wchar_t* dest, int row, int col); + virtual int GetRowCount() { return (int)frames.size(); }; + virtual void OnDoubleClick(int itemIndex, int column); +private: + std::vector frames; + DebugInterface* cpu; + CtrlDisAsmView* disasm; }; \ No newline at end of file