10 #define MAX_COLUMNS 32
12 static void perf_gtk__signal(int sig
)
18 static void perf_gtk__resize_window(GtkWidget
*window
)
26 screen
= gtk_widget_get_screen(window
);
28 monitor
= gdk_screen_get_monitor_at_window(screen
, window
->window
);
30 gdk_screen_get_monitor_geometry(screen
, monitor
, &rect
);
32 width
= rect
.width
* 3 / 4;
33 height
= rect
.height
* 3 / 4;
35 gtk_window_resize(GTK_WINDOW(window
), width
, height
);
38 static void perf_gtk__show_hists(GtkWidget
*window
, struct hists
*hists
)
40 GType col_types
[MAX_COLUMNS
];
41 GtkCellRenderer
*renderer
;
42 struct sort_entry
*se
;
52 /* The percentage column */
53 col_types
[nr_cols
++] = G_TYPE_STRING
;
55 list_for_each_entry(se
, &hist_entry__sort_list
, list
) {
59 col_types
[nr_cols
++] = G_TYPE_STRING
;
62 store
= gtk_list_store_newv(nr_cols
, col_types
);
64 view
= gtk_tree_view_new();
66 renderer
= gtk_cell_renderer_text_new();
70 /* The percentage column */
71 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view
),
76 list_for_each_entry(se
, &hist_entry__sort_list
, list
) {
80 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view
),
86 gtk_tree_view_set_model(GTK_TREE_VIEW(view
), GTK_TREE_MODEL(store
));
88 g_object_unref(GTK_TREE_MODEL(store
));
90 total_period
= hists
->stats
.total_period
;
92 for (nd
= rb_first(&hists
->entries
); nd
; nd
= rb_next(nd
)) {
93 struct hist_entry
*h
= rb_entry(nd
, struct hist_entry
, rb_node
);
101 gtk_list_store_append(store
, &iter
);
105 percent
= (h
->period
* 100.0) / total_period
;
107 snprintf(s
, ARRAY_SIZE(s
), "%.2f", percent
);
109 gtk_list_store_set(store
, &iter
, col_idx
++, s
, -1);
111 list_for_each_entry(se
, &hist_entry__sort_list
, list
) {
115 se
->se_snprintf(h
, s
, ARRAY_SIZE(s
),
116 hists__col_len(hists
, se
->se_width_idx
));
118 gtk_list_store_set(store
, &iter
, col_idx
++, s
, -1);
122 gtk_container_add(GTK_CONTAINER(window
), view
);
125 int perf_evlist__gtk_browse_hists(struct perf_evlist
*evlist
,
126 const char *help __used
,
127 void (*timer
) (void *arg
)__used
,
128 void *arg __used
, int delay_secs __used
)
130 struct perf_evsel
*pos
;
134 signal(SIGSEGV
, perf_gtk__signal
);
135 signal(SIGFPE
, perf_gtk__signal
);
136 signal(SIGINT
, perf_gtk__signal
);
137 signal(SIGQUIT
, perf_gtk__signal
);
138 signal(SIGTERM
, perf_gtk__signal
);
140 window
= gtk_window_new(GTK_WINDOW_TOPLEVEL
);
142 gtk_window_set_title(GTK_WINDOW(window
), "perf report");
144 g_signal_connect(window
, "delete_event", gtk_main_quit
, NULL
);
146 notebook
= gtk_notebook_new();
148 list_for_each_entry(pos
, &evlist
->entries
, node
) {
149 struct hists
*hists
= &pos
->hists
;
150 const char *evname
= event_name(pos
);
151 GtkWidget
*scrolled_window
;
152 GtkWidget
*tab_label
;
154 scrolled_window
= gtk_scrolled_window_new(NULL
, NULL
);
156 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window
),
157 GTK_POLICY_AUTOMATIC
,
158 GTK_POLICY_AUTOMATIC
);
160 perf_gtk__show_hists(scrolled_window
, hists
);
162 tab_label
= gtk_label_new(evname
);
164 gtk_notebook_append_page(GTK_NOTEBOOK(notebook
), scrolled_window
, tab_label
);
167 gtk_container_add(GTK_CONTAINER(window
), notebook
);
169 gtk_widget_show_all(window
);
171 perf_gtk__resize_window(window
);
173 gtk_window_set_position(GTK_WINDOW(window
), GTK_WIN_POS_CENTER
);