xref: /OK3568_Linux_fs/kernel/tools/perf/ui/gtk/progress.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun #include <inttypes.h>
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #include "gtk.h"
5*4882a593Smuzhiyun #include "../progress.h"
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun static GtkWidget *dialog;
8*4882a593Smuzhiyun static GtkWidget *progress;
9*4882a593Smuzhiyun 
gtk_ui_progress__update(struct ui_progress * p)10*4882a593Smuzhiyun static void gtk_ui_progress__update(struct ui_progress *p)
11*4882a593Smuzhiyun {
12*4882a593Smuzhiyun 	double fraction = p->total ? 1.0 * p->curr / p->total : 0.0;
13*4882a593Smuzhiyun 	char buf[1024];
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun 	if (dialog == NULL) {
16*4882a593Smuzhiyun 		GtkWidget *vbox = gtk_vbox_new(TRUE, 5);
17*4882a593Smuzhiyun 		GtkWidget *label = gtk_label_new(p->title);
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun 		dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
20*4882a593Smuzhiyun 		progress = gtk_progress_bar_new();
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 		gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, FALSE, 3);
23*4882a593Smuzhiyun 		gtk_box_pack_start(GTK_BOX(vbox), progress, TRUE, TRUE, 3);
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun 		gtk_container_add(GTK_CONTAINER(dialog), vbox);
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 		gtk_window_set_title(GTK_WINDOW(dialog), "perf");
28*4882a593Smuzhiyun 		gtk_window_resize(GTK_WINDOW(dialog), 300, 80);
29*4882a593Smuzhiyun 		gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 		gtk_widget_show_all(dialog);
32*4882a593Smuzhiyun 	}
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress), fraction);
35*4882a593Smuzhiyun 	snprintf(buf, sizeof(buf), "%"PRIu64" / %"PRIu64, p->curr, p->total);
36*4882a593Smuzhiyun 	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress), buf);
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	/* we didn't call gtk_main yet, so do it manually */
39*4882a593Smuzhiyun 	while (gtk_events_pending())
40*4882a593Smuzhiyun 		gtk_main_iteration();
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun 
gtk_ui_progress__finish(void)43*4882a593Smuzhiyun static void gtk_ui_progress__finish(void)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun 	/* this will also destroy all of its children */
46*4882a593Smuzhiyun 	gtk_widget_destroy(dialog);
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	dialog = NULL;
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun static struct ui_progress_ops gtk_ui_progress__ops = {
52*4882a593Smuzhiyun 	.update		= gtk_ui_progress__update,
53*4882a593Smuzhiyun 	.finish		= gtk_ui_progress__finish,
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun 
gtk_ui_progress__init(void)56*4882a593Smuzhiyun void gtk_ui_progress__init(void)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun 	ui_progress__ops = &gtk_ui_progress__ops;
59*4882a593Smuzhiyun }
60