Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
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     /* we didn't call gtk_main yet, so do it manually */
0039     while (gtk_events_pending())
0040         gtk_main_iteration();
0041 }
0042 
0043 static void gtk_ui_progress__finish(void)
0044 {
0045     /* this will also destroy all of its children */
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 = &gtk_ui_progress__ops;
0059 }