| 433 | } |
| 434 | |
| 435 | bool WinDbgMemoryPlugin::selectTarget(QWidget* parent, QString* target) |
| 436 | { |
| 437 | QDialog dlg(parent); |
| 438 | dlg.setWindowTitle("WinDbg Settings"); |
| 439 | dlg.resize(460, 260); |
| 440 | |
| 441 | QPalette dlgPal = qApp->palette(); |
| 442 | dlg.setPalette(dlgPal); |
| 443 | dlg.setAutoFillBackground(true); |
| 444 | |
| 445 | auto* layout = new QVBoxLayout(&dlg); |
| 446 | |
| 447 | layout->addWidget(new QLabel( |
| 448 | "Connect to a running WinDbg debug server.\n" |
| 449 | "In WinDbg, run: .server tcp:port=5055")); |
| 450 | |
| 451 | layout->addSpacing(8); |
| 452 | layout->addWidget(new QLabel("Connection string:")); |
| 453 | auto* connEdit = new QLineEdit; |
| 454 | connEdit->setPlaceholderText("tcp:Port=5055,Server=localhost"); |
| 455 | connEdit->setText("tcp:Port=5055,Server=localhost"); |
| 456 | layout->addWidget(connEdit); |
| 457 | |
| 458 | layout->addSpacing(4); |
| 459 | layout->addWidget(new QLabel("Run one of these in WinDbg first:")); |
| 460 | |
| 461 | auto addExample = [&](const QString& text) { |
| 462 | auto* row = new QHBoxLayout; |
| 463 | auto* label = new QLabel(text); |
| 464 | QPalette lp = dlgPal; |
| 465 | lp.setColor(QPalette::WindowText, dlgPal.color(QPalette::Disabled, QPalette::WindowText)); |
| 466 | label->setPalette(lp); |
| 467 | label->setTextInteractionFlags(Qt::TextSelectableByMouse); |
| 468 | row->addWidget(label, 1); |
| 469 | auto* copyBtn = new QPushButton("Copy"); |
| 470 | copyBtn->setFixedWidth(50); |
| 471 | copyBtn->setToolTip("Copy to clipboard"); |
| 472 | QObject::connect(copyBtn, &QPushButton::clicked, [text]() { |
| 473 | QGuiApplication::clipboard()->setText(text); |
| 474 | }); |
| 475 | row->addWidget(copyBtn); |
| 476 | layout->addLayout(row); |
| 477 | }; |
| 478 | |
| 479 | addExample(".server tcp:port=5055"); |
| 480 | addExample(".server npipe:pipe=reclass"); |
| 481 | layout->addStretch(); |
| 482 | |
| 483 | auto* btnLayout = new QHBoxLayout; |
| 484 | btnLayout->addStretch(); |
| 485 | auto* okBtn = new QPushButton("OK"); |
| 486 | auto* cancelBtn = new QPushButton("Cancel"); |
| 487 | btnLayout->addWidget(okBtn); |
| 488 | btnLayout->addWidget(cancelBtn); |
| 489 | layout->addLayout(btnLayout); |
| 490 | |
| 491 | QObject::connect(okBtn, &QPushButton::clicked, &dlg, &QDialog::accept); |
| 492 | QObject::connect(cancelBtn, &QPushButton::clicked, &dlg, &QDialog::reject); |