diff --git a/src/common/DisassemblyPreview.cpp b/src/common/DisassemblyPreview.cpp index cedabd359..454933f7c 100644 --- a/src/common/DisassemblyPreview.cpp +++ b/src/common/DisassemblyPreview.cpp @@ -49,10 +49,11 @@ bool DisassemblyPreview::showDisasPreviewAt(QWidget *parent, const QPoint &point QStringList disasmPreview = Core()->getDisassemblyPreview(offset, 10); if (!disasmPreview.isEmpty()) { const QFont &fnt = Config()->getFont(); - QString tooltip = QString { "
Disassembly Preview:
%3
" } - .arg(fnt.family()) + QString tooltip = QString("
Disassembly Preview:
" + "%3
") + .arg(fnt.family().toHtmlEscaped()) .arg(qMax(8, fnt.pointSize() - 1)) .arg(disasmPreview.join("
")); diff --git a/src/core/Cutter.cpp b/src/core/Cutter.cpp index 6aa2be543..1b000eb16 100644 --- a/src/core/Cutter.cpp +++ b/src/core/Cutter.cpp @@ -3169,7 +3169,7 @@ QList CutterCore::getRAsmPluginDescriptions() QList ret; CutterHtSP(rz_asm_get_plugins(core->rasm)) - .ForEach([&ret](const char *k, const RzAsmPlugin *ap) { + .ForEach([&ret, &core, this](const char *k, const RzAsmPlugin *ap) { RzAsmPluginDescription plugin; plugin.name = ap->name; @@ -3180,6 +3180,39 @@ QList CutterCore::getRAsmPluginDescriptions() plugin.description = ap->desc; plugin.license = ap->license; + // Bits + QStringList bitsList; + if (ap->bits == 27) { + bitsList << "27"; + } else if (ap->bits == 0) { + bitsList << "any"; + } else { + for (int bits = 4; bits <= 64; bits *= 2) { + if (ap->bits & bits) { + bitsList << QString::number(bits); + } + } + } + plugin.bits = bitsList.join(" "); + + // Capabilities + QString caps; + caps += ap->assemble ? "a" : "_"; + caps += ap->disassemble ? "d" : "_"; + + bool foundAnalysis = false; + auto analysisPlugin = + CutterHtSP(rz_analysis_get_plugins(core->analysis)) + .Find(ap->name, &foundAnalysis); + if (foundAnalysis && analysisPlugin) { + caps += "A"; + caps += analysisPlugin->esil ? "e" : "_"; + caps += analysisPlugin->il_config ? "I" : "_"; + } else { + caps += "__"; + } + plugin.capabilities = caps; + ret << plugin; return true; }); diff --git a/src/core/CutterDescriptions.h b/src/core/CutterDescriptions.h index 0c38b6209..ebc0ee0f7 100644 --- a/src/core/CutterDescriptions.h +++ b/src/core/CutterDescriptions.h @@ -207,6 +207,8 @@ struct RzAsmPluginDescription QString cpus; QString description; QString license; + QString capabilities; + QString bits; }; struct DisassemblyLine diff --git a/src/core/RizinCpp.h b/src/core/RizinCpp.h index 1afb776a3..33727eaf6 100644 --- a/src/core/RizinCpp.h +++ b/src/core/RizinCpp.h @@ -209,7 +209,11 @@ class CutterRzIter { \ ht_##xx##_foreach(ht, ForEachCb, &f); \ } \ - } + const V *Find(K k, bool *found = nullptr) \ + { \ + return reinterpret_cast(ht_##xx##_find(ht, k, found)); \ + } \ + }; CutterHtDef(sp, SP, const char *, void *); diff --git a/src/dialogs/RizinPluginsDialog.cpp b/src/dialogs/RizinPluginsDialog.cpp index 05bee44f8..704e91fe7 100644 --- a/src/dialogs/RizinPluginsDialog.cpp +++ b/src/dialogs/RizinPluginsDialog.cpp @@ -1,10 +1,15 @@ #include "RizinPluginsDialog.h" #include "ui_RizinPluginsDialog.h" +#include "Configuration.h" +#include "common/DisassemblyPreview.h" #include "core/Cutter.h" #include "common/Helpers.h" #include "plugins/PluginManager.h" +#include +#include + RizinPluginsDialog::RizinPluginsDialog(QWidget *parent) : QDialog(parent), ui(new Ui::RizinPluginsDialog) { @@ -47,14 +52,35 @@ RizinPluginsDialog::RizinPluginsDialog(QWidget *parent) item->setText(0, plugin.name); item->setText(1, plugin.architecture); item->setText(2, plugin.cpus); + if (!plugin.cpus.isEmpty()) { + QString cpus = plugin.cpus; + cpus.replace(",", ", "); + + const QFont &fnt = Config()->getFont(); + const QString tooltip = + QString("
%3
") + .arg(fnt.family().toHtmlEscaped()) + .arg(qMax(8, fnt.pointSize() - 1)) + .arg(cpus.toHtmlEscaped()); + + item->setToolTip(2, tooltip); + } item->setText(3, plugin.version); item->setText(4, plugin.description); item->setText(5, plugin.license); item->setText(6, plugin.author); + item->setText(7, plugin.capabilities); + item->setText(8, plugin.bits); ui->RzAsmTreeWidget->addTopLevelItem(item); } ui->RzAsmTreeWidget->sortByColumn(0, Qt::AscendingOrder); + ui->RzAsmTreeWidget->setStyleSheet(DisassemblyPreview::getToolTipStyleSheet()); qhelpers::adjustColumns(ui->RzAsmTreeWidget, 0); + + int cpuCol = 2; + if (ui->RzAsmTreeWidget->columnWidth(cpuCol) > 200) { + ui->RzAsmTreeWidget->setColumnWidth(cpuCol, 200); + } } RizinPluginsDialog::~RizinPluginsDialog() diff --git a/src/dialogs/RizinPluginsDialog.ui b/src/dialogs/RizinPluginsDialog.ui index 2599b5d57..4aa370d4a 100644 --- a/src/dialogs/RizinPluginsDialog.ui +++ b/src/dialogs/RizinPluginsDialog.ui @@ -189,6 +189,16 @@ Author + + + Capabilities + + + + + Bits + + diff --git a/src/widgets/FunctionsWidget.cpp b/src/widgets/FunctionsWidget.cpp index 61f1887ac..388e2bc9a 100644 --- a/src/widgets/FunctionsWidget.cpp +++ b/src/widgets/FunctionsWidget.cpp @@ -252,9 +252,9 @@ QVariant FunctionModel::data(const QModelIndex &index, int role) const return {}; QString toolTipContent = - QString("
") - .arg(fnt.family()) + .arg(fnt.family().toHtmlEscaped()) .arg(qMax(6, fnt.pointSize() - 1)); // slightly decrease font size, to // keep more text in the same box diff --git a/src/widgets/SearchWidget.cpp b/src/widgets/SearchWidget.cpp index 008447751..6f134bf32 100644 --- a/src/widgets/SearchWidget.cpp +++ b/src/widgets/SearchWidget.cpp @@ -152,9 +152,9 @@ QVariant SearchModel::data(const QModelIndex &index, int role) const QFontMetrics fm { fnt }; QString toolTipContent = - QString("
") - .arg(fnt.family()) + .arg(fnt.family().toHtmlEscaped()) .arg(qMax(6, fnt.pointSize() - 1)); // slightly decrease font size, to keep // more text in the same box