0001
0002 #include <inttypes.h>
0003
0004 #include "gtk.h"
0005 #include "../progress.h"
0006
0007 static GtkWidget *dialog;
0008 static GtkWidget *progress;
0009
0010 static void gtk_ui_progress__update(struct ui_progress *p)
0011 {
0012 double fraction = p->total ? 1.0 * p->curr / p->total : 0.0;
0013 char buf[1024];
0014
0015 if (dialog == NULL) {
0016 GtkWidget *vbox = gtk_vbox_new(TRUE, 5);
0017 GtkWidget *label = gtk_label_new(p->title);
0018
0019 dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
0020 progress = gtk_progress_bar_new();
0021
0022 gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, FALSE, 3);
0023 gtk_box_pack_start(GTK_BOX(vbox), progress, TRUE, TRUE, 3);
0024
0025 gtk_container_add(GTK_CONTAINER(dialog), vbox);
0026
0027 gtk_window_set_title(GTK_WINDOW(dialog), "perf");
0028 gtk_window_resize(GTK_WINDOW(dialog), 300, 80);
0029 gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
0030
0031 gtk_widget_show_all(dialog);
0032 }
0033
0034 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress), fraction);
0035 snprintf(buf, sizeof(buf), "%"PRIu64" / %"PRIu64, p->curr, p->total);
0036 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress), buf);
0037
0038
0039 while (gtk_events_pending())
0040 gtk_main_iteration();
0041 }
0042
0043 static void gtk_ui_progress__finish(void)
0044 {
0045
0046 gtk_widget_destroy(dialog);
0047
0048 dialog = NULL;
0049 }
0050
0051 static struct ui_progress_ops gtk_ui_progress__ops = {
0052 .update = gtk_ui_progress__update,
0053 .finish = gtk_ui_progress__finish,
0054 };
0055
0056 void gtk_ui_progress__init(void)
0057 {
0058 ui_progress__ops = >k_ui_progress__ops;
0059 }