From: Christoph Egger Date: Mon, 25 May 2015 11:37:26 +0000 (+0200) Subject: Lazy layout CFGs X-Git-Tag: v0.2~9 X-Git-Url: https://git.siccegge.de//index.cgi?p=frida%2Ffrida.git;a=commitdiff_plain;h=c1d5c719f82283739029be03d20bbf04406ff4d6 Lazy layout CFGs Wait for the Widget to actually be shown before starting to layout. Good candidate for a background-worker-thread later! --- diff --git a/src/gui/widgets/FunctionWidget.cxx b/src/gui/widgets/FunctionWidget.cxx index 17b539f..c9c28d1 100644 --- a/src/gui/widgets/FunctionWidget.cxx +++ b/src/gui/widgets/FunctionWidget.cxx @@ -18,42 +18,45 @@ namespace { FunctionWidget::FunctionWidget(Function* function, Mainwindow* mainwindow) : function(function) , mainwindow(mainwindow) + , layouted(false) , logger(log4cxx::Logger::getLogger("gui.Mainwindow")) { - // CFG - CFGScene * scene = new CFGScene; - InformationManager* manager = function->getManager(); - - BasicBlock * block = manager->getBasicBlock(function->getStartAddress()); - LOG4CXX_DEBUG(logger, "Building widget for functionction " << function->getName()); - for (auto i : function->blocks()) { - LOG4CXX_DEBUG(logger, "Functionction contains Block " << i.second->getName()); - } - - uint64_t start_address(std::numeric_limits::max()); - for (auto b : function->blocks()) { - if (b.first < start_address) - start_address = b.first; - } +} - std::map _blocks; - local__add_basic_block(block, mainwindow, - manager, _blocks, scene, 3*start_address, 100); +void FunctionWidget::showEvent(QShowEvent* event) { + if (!layouted) { + CFGScene * scene = new CFGScene; + InformationManager* manager = function->getManager(); - QGraphicsView * view = new QGraphicsView(scene); - view->setDragMode(QGraphicsView::ScrollHandDrag); - addTab(view, "CFG"); + BasicBlock * block = manager->getBasicBlock(function->getStartAddress()); + LOG4CXX_DEBUG(logger, "Building widget for functionction " << function->getName()); + for (auto i : function->blocks()) { + LOG4CXX_DEBUG(logger, "Functionction contains Block " << i.second->getName()); + } - // Listing - QTableWidget * t = new QTableWidget(); - t->setColumnCount(3); - t->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + uint64_t start_address(std::numeric_limits::max()); + for (auto b : function->blocks()) { + if (b.first < start_address) + start_address = b.first; + } - addTab(t, "Listing"); -} + std::map _blocks; + local__add_basic_block(block, mainwindow, + manager, _blocks, scene, 3*start_address, 100); + QGraphicsView * view = new QGraphicsView(scene); + view->setDragMode(QGraphicsView::ScrollHandDrag); + addTab(view, "CFG"); + // Listing + QTableWidget * t = new QTableWidget(); + t->setColumnCount(3); + t->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + addTab(t, "Listing"); + layouted = true; + } +} namespace { BasicBlockWidget * diff --git a/src/gui/widgets/FunctionWidget.hxx b/src/gui/widgets/FunctionWidget.hxx index 8400df8..6976d73 100644 --- a/src/gui/widgets/FunctionWidget.hxx +++ b/src/gui/widgets/FunctionWidget.hxx @@ -16,10 +16,12 @@ public: Function* getFunction() const { return function; } - +protected: + void showEvent(QShowEvent * event); private: Function * function; Mainwindow* mainwindow; + bool layouted; log4cxx::LoggerPtr logger; };