1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../evlist.h" 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../cache.h" 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../evsel.h" 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../sort.h" 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../hist.h" 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "../helpline.h" 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "gtk.h" 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define MAX_COLUMNS 32 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int __percent_color_snprintf(char *buf, size_t size, double percent) 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int ret = 0; 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *markup; 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng markup = perf_gtk__get_percent_color(percent); 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (markup) 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret += scnprintf(buf, size, markup); 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret += scnprintf(buf + ret, size - ret, " %6.2f%%", percent); 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (markup) 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret += scnprintf(buf + ret, size - ret, "</span>"); 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return ret; 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int __hpp__color_fmt(struct perf_hpp *hpp, struct hist_entry *he, 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 (*get_field)(struct hist_entry *)) 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int ret; 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double percent = 0.0; 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct hists *hists = he->hists; 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_evsel *evsel = hists_to_evsel(hists); 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (hists->stats.total_period) 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng percent = 100.0 * get_field(he) / hists->stats.total_period; 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret = __percent_color_snprintf(hpp->buf, hpp->size, percent); 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (perf_evsel__is_group_event(evsel)) { 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int prev_idx, idx_delta; 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct hist_entry *pair; 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int nr_members = evsel->nr_members; 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng prev_idx = perf_evsel__group_idx(evsel); 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng list_for_each_entry(pair, &he->pairs.head, pairs.node) { 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 period = get_field(pair); 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 total = pair->hists->stats.total_period; 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng evsel = hists_to_evsel(pair->hists); 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng idx_delta = perf_evsel__group_idx(evsel) - prev_idx - 1; 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while (idx_delta--) { 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * zero-fill group members in the middle which 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * have no sample 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret += __percent_color_snprintf(hpp->buf + ret, 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng hpp->size - ret, 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 0.0); 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng percent = 100.0 * period / total; 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret += __percent_color_snprintf(hpp->buf + ret, 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng hpp->size - ret, 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng percent); 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng prev_idx = perf_evsel__group_idx(evsel); 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng idx_delta = nr_members - prev_idx - 1; 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while (idx_delta--) { 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * zero-fill group members at last which have no sample 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret += __percent_color_snprintf(hpp->buf + ret, 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng hpp->size - ret, 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 0.0); 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return ret; 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __HPP_COLOR_PERCENT_FN(_type, _field) \ 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic u64 he_get_##_field(struct hist_entry *he) \ 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ \ 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return he->stat._field; \ 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} \ 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng \ 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int perf_gtk__hpp_color_##_type(struct perf_hpp_fmt *fmt __maybe_unused, \ 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_hpp *hpp, \ 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct hist_entry *he) \ 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ \ 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return __hpp__color_fmt(hpp, he, he_get_##_field); \ 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__HPP_COLOR_PERCENT_FN(overhead, period) 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__HPP_COLOR_PERCENT_FN(overhead_sys, period_sys) 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__HPP_COLOR_PERCENT_FN(overhead_us, period_us) 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__HPP_COLOR_PERCENT_FN(overhead_guest_sys, period_guest_sys) 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng__HPP_COLOR_PERCENT_FN(overhead_guest_us, period_guest_us) 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#undef __HPP_COLOR_PERCENT_FN 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid perf_gtk__init_hpp(void) 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_hpp__init(); 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_hpp__format[PERF_HPP__OVERHEAD].color = 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_gtk__hpp_color_overhead; 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_hpp__format[PERF_HPP__OVERHEAD_SYS].color = 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_gtk__hpp_color_overhead_sys; 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_hpp__format[PERF_HPP__OVERHEAD_US].color = 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_gtk__hpp_color_overhead_us; 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_hpp__format[PERF_HPP__OVERHEAD_GUEST_SYS].color = 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_gtk__hpp_color_overhead_guest_sys; 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_hpp__format[PERF_HPP__OVERHEAD_GUEST_US].color = 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_gtk__hpp_color_overhead_guest_us; 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void callchain_list__sym_name(struct callchain_list *cl, 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *bf, size_t bfsize) 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (cl->ms.sym) 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng scnprintf(bf, bfsize, "%s", cl->ms.sym->name); 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng else 132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng scnprintf(bf, bfsize, "%#" PRIx64, cl->ip); 133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void perf_gtk__add_callchain(struct rb_root *root, GtkTreeStore *store, 136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkTreeIter *parent, int col, u64 total) 137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct rb_node *nd; 139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool has_single_node = (rb_first(root) == rb_last(root)); 140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (nd = rb_first(root); nd; nd = rb_next(nd)) { 142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct callchain_node *node; 143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct callchain_list *chain; 144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkTreeIter iter, new_parent; 145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool need_new_parent; 146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng double percent; 147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 hits, child_total; 148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng node = rb_entry(nd, struct callchain_node, rb_node); 150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng hits = callchain_cumul_hits(node); 152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng percent = 100.0 * hits / total; 153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng new_parent = *parent; 155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng need_new_parent = !has_single_node && (node->val_nr > 1); 156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng list_for_each_entry(chain, &node->val, list) { 158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char buf[128]; 159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_store_append(store, &iter, &new_parent); 161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng scnprintf(buf, sizeof(buf), "%5.2f%%", percent); 163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_store_set(store, &iter, 0, buf, -1); 164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng callchain_list__sym_name(chain, buf, sizeof(buf)); 166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_store_set(store, &iter, col, buf, -1); 167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (need_new_parent) { 169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* 170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Only show the top-most symbol in a callchain 171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * if it's not the only callchain. 172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng new_parent = iter; 174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng need_new_parent = false; 175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (callchain_param.mode == CHAIN_GRAPH_REL) 179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng child_total = node->children_hit; 180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng else 181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng child_total = total; 182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* Now 'iter' contains info of the last callchain_list */ 184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_gtk__add_callchain(&node->rb_root, store, &iter, col, 185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng child_total); 186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void on_row_activated(GtkTreeView *view, GtkTreePath *path, 190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkTreeViewColumn *col __maybe_unused, 191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gpointer user_data __maybe_unused) 192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng bool expanded = gtk_tree_view_row_expanded(view, path); 194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (expanded) 196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_view_collapse_row(view, path); 197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng else 198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_view_expand_row(view, path, FALSE); 199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic void perf_gtk__show_hists(GtkWidget *window, struct hists *hists, 202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng float min_pcnt) 203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_hpp_fmt *fmt; 205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GType col_types[MAX_COLUMNS]; 206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkCellRenderer *renderer; 207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct sort_entry *se; 208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkTreeStore *store; 209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct rb_node *nd; 210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkWidget *view; 211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int col_idx; 212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int sym_col = -1; 213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int nr_cols; 214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char s[512]; 215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_hpp hpp = { 217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .buf = s, 218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .size = sizeof(s), 219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .ptr = hists_to_evsel(hists), 220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }; 221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng nr_cols = 0; 223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_hpp__for_each_format(fmt) 225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng col_types[nr_cols++] = G_TYPE_STRING; 226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng list_for_each_entry(se, &hist_entry__sort_list, list) { 228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (se->elide) 229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (se == &sort_sym) 232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sym_col = nr_cols; 233e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 234e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng col_types[nr_cols++] = G_TYPE_STRING; 235e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 236e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 237e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng store = gtk_tree_store_newv(nr_cols, col_types); 238e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 239e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng view = gtk_tree_view_new(); 240e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 241e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng renderer = gtk_cell_renderer_text_new(); 242e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 243e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng col_idx = 0; 244e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 245e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_hpp__for_each_format(fmt) { 246e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fmt->header(fmt, &hpp); 247e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 248e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), 249e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng -1, ltrim(s), 250e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng renderer, "markup", 251e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng col_idx++, NULL); 252e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 253e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 254e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng list_for_each_entry(se, &hist_entry__sort_list, list) { 255e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (se->elide) 256e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 257e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 258e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), 259e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng -1, se->se_header, 260e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng renderer, "text", 261e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng col_idx++, NULL); 262e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 263e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 264e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (col_idx = 0; col_idx < nr_cols; col_idx++) { 265e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkTreeViewColumn *column; 266e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 267e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng column = gtk_tree_view_get_column(GTK_TREE_VIEW(view), col_idx); 268e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_view_column_set_resizable(column, TRUE); 269e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 270e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (col_idx == sym_col) { 271e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_view_set_expander_column(GTK_TREE_VIEW(view), 272e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng column); 273e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 274e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 275e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 276e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); 277e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 278e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng g_object_unref(GTK_TREE_MODEL(store)); 279e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 280e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) { 281e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node); 282e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkTreeIter iter; 283e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng float percent = h->stat.period * 100.0 / 284e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng hists->stats.total_period; 285e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 286e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (h->filtered) 287e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 288e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 289e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (percent < min_pcnt) 290e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 291e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 292e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_store_append(store, &iter, NULL); 293e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 294e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng col_idx = 0; 295e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 296e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_hpp__for_each_format(fmt) { 297e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (fmt->color) 298e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fmt->color(fmt, &hpp, h); 299e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng else 300e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng fmt->entry(fmt, &hpp, h); 301e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 302e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_store_set(store, &iter, col_idx++, s, -1); 303e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 304e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 305e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng list_for_each_entry(se, &hist_entry__sort_list, list) { 306e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (se->elide) 307e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 308e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 309e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng se->se_snprintf(h, s, ARRAY_SIZE(s), 310e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng hists__col_len(hists, se->se_width_idx)); 311e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 312e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_store_set(store, &iter, col_idx++, s, -1); 313e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 314e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 315e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (symbol_conf.use_callchain && sort__has_sym) { 316e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 total; 317e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 318e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (callchain_param.mode == CHAIN_GRAPH_REL) 319e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng total = h->stat.period; 320e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng else 321e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng total = hists->stats.total_period; 322e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 323e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_gtk__add_callchain(&h->sorted_chain, store, &iter, 324e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng sym_col, total); 325e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 326e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 327e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 328e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(view), TRUE); 329e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 330e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng g_signal_connect(view, "row-activated", 331e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng G_CALLBACK(on_row_activated), NULL); 332e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_container_add(GTK_CONTAINER(window), view); 333e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 334e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 335e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint perf_evlist__gtk_browse_hists(struct perf_evlist *evlist, 336e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *help, 337e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct hist_browser_timer *hbt __maybe_unused, 338e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng float min_pcnt) 339e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 340e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_evsel *pos; 341e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkWidget *vbox; 342e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkWidget *notebook; 343e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkWidget *info_bar; 344e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkWidget *statbar; 345e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkWidget *window; 346e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 347e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng signal(SIGSEGV, perf_gtk__signal); 348e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng signal(SIGFPE, perf_gtk__signal); 349e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng signal(SIGINT, perf_gtk__signal); 350e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng signal(SIGQUIT, perf_gtk__signal); 351e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng signal(SIGTERM, perf_gtk__signal); 352e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 353e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 354e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 355e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_window_set_title(GTK_WINDOW(window), "perf report"); 356e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 357e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng g_signal_connect(window, "delete_event", gtk_main_quit, NULL); 358e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 359e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pgctx = perf_gtk__activate_context(window); 360e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!pgctx) 361e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 362e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 363e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng vbox = gtk_vbox_new(FALSE, 0); 364e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 365e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng notebook = gtk_notebook_new(); 366e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 367e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); 368e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 369e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng info_bar = perf_gtk__setup_info_bar(); 370e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (info_bar) 371e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_box_pack_start(GTK_BOX(vbox), info_bar, FALSE, FALSE, 0); 372e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 373e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng statbar = perf_gtk__setup_statusbar(); 374e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_box_pack_start(GTK_BOX(vbox), statbar, FALSE, FALSE, 0); 375e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 376e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_container_add(GTK_CONTAINER(window), vbox); 377e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 378e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng list_for_each_entry(pos, &evlist->entries, node) { 379e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct hists *hists = &pos->hists; 380e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *evname = perf_evsel__name(pos); 381e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkWidget *scrolled_window; 382e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GtkWidget *tab_label; 383e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char buf[512]; 384e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng size_t size = sizeof(buf); 385e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 386e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (symbol_conf.event_group) { 387e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!perf_evsel__is_group_leader(pos)) 388e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 389e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 390e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (pos->nr_members > 1) { 391e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evsel__group_desc(pos, buf, size); 392e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng evname = buf; 393e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 394e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 395e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 396e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng scrolled_window = gtk_scrolled_window_new(NULL, NULL); 397e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 398e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), 399e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GTK_POLICY_AUTOMATIC, 400e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng GTK_POLICY_AUTOMATIC); 401e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 402e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_gtk__show_hists(scrolled_window, hists, min_pcnt); 403e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 404e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng tab_label = gtk_label_new(evname); 405e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 406e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled_window, tab_label); 407e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 408e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 409e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_widget_show_all(window); 410e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 411e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_gtk__resize_window(window); 412e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 413e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 414e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 415e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ui_helpline__push(help); 416e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 417e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng gtk_main(); 418e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 419e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_gtk__deactivate_context(&pgctx); 420e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 421e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 422e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 423