//-------------------------------------------------------------------------- static void jump_to_node(graph_info_t *gi, const int nid) { viewer_center_on(gi->gv, nid); int x, y; // will return a place only when a node was previously selected place_t *old_pl = get_custom_viewer_place(gi->gv, false, &x, &y); if ( old_pl != NULL ) { user_graph_place_t *new_pl = (user_graph_place_t *) old_pl->clone(); new_pl->node = nid; jumpto(gi->gv, new_pl, x, y); delete new_pl; } }
static int idaapi graph_callback(void * ud, int code, va_list va) { int result = 0; switch ( code ) { case grcode_layout_calculated: { mutable_graph_t *g = va_arg(va, mutable_graph_t *); slist_t * sl = (slist_t *)ud; if (sl->num != g->size()) { warning("Graph layout is too complex to be displayed.\n"); g->reset(); } } break; case grcode_changed_current: { graph_viewer_t *v = va_arg (va, graph_viewer_t *); int node = va_argi(va, int); if (node != -1) { slist_t * sl = (slist_t *)ud; sl->dclk = true; } } break; case grcode_clicked: { slist_t * sl = (slist_t *)ud; sl->dclk = false; } break; case grcode_dblclicked: { graph_viewer_t *v = va_arg(va, graph_viewer_t *); selection_item_t *s = va_arg(va, selection_item_t *); slist_t * sl = (slist_t *)ud; if ( s && s->is_node) { viewer_center_on(v, s->node); if (sl->sigs[s->node]->msig != NULL && sl->msl->gv != NULL) viewer_center_on(sl->msl->gv, find_node(sl->msl, sl->sigs[s->node]->matchedEA)); sl->dclk = false; } else if ( sl->dclk || s ) { int node; node = viewer_get_curnode(v); if (sl->sigs[node]->msig != NULL && sl->msl->gv != NULL) viewer_center_on(sl->msl->gv, find_node(sl->msl, sl->sigs[node]->matchedEA)); sl->dclk = false; } } break; case grcode_user_refresh: { mutable_graph_t *g = va_arg(va, mutable_graph_t *); slist_t * sl = (slist_t *)ud; if ( g->empty() ) g->resize(sl->num); for(size_t i = 0; i< sl->num; i++) { fref_t * fref; if (sl->sigs[i]->srefs) { fref = sl->sigs[i]->srefs->list; while(fref) { int pos = find_node(sl, fref->ea); if (pos != -1) { edge_info_t ed; if (fref->type == 3) ed.color = 0xff0000; else if (fref->type == 2) ed.color = 0x0000ff; else ed.color = 0x006400; g->add_edge(i, pos, &ed); } fref = fref->next; } } } result = 1; } break; case grcode_user_text: { mutable_graph_t *g = va_arg(va, mutable_graph_t *); int node = va_arg(va, int); const char **text = va_arg(va, const char **); bgcolor_t *bgcolor = va_arg(va, bgcolor_t *); slist_t * sl = (slist_t *)ud; *text = sl->sigs[node]->dl.lines; if ( bgcolor != NULL ) { *bgcolor = 0xFFFFFFFF; if (!sl->unique) { if (sl->sigs[node]->mtype == DIFF_UNMATCHED) *bgcolor = 0xcccccc; else if (sl->sigs[node]->sig != sl->sigs[node]->msig->sig) *bgcolor = 0x33cc; else if (sl->sigs[node]->id_crc) *bgcolor = 0x8cb4d2; } } result = 1; qnotused(g); } break; case grcode_destroyed: { slist_t * sl = (slist_t *)ud; sl->gv = NULL; } break; } return result; }