MODULE feedback ; (* m2-GTK4 example - progress, spinner, separator and image. A progress bar fills from 0 to 1 on a timer while a spinner runs; when it completes the spinner stops and the bar reads "Done". Build: make examples Run: ./build/examples/feedback *) FROM Gio IMPORT g_application_run; FROM GtkApplication IMPORT gtk_application_new; FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_title, gtk_window_set_default_size, gtk_window_set_child, gtk_window_present; FROM GtkBox IMPORT gtk_box_new, gtk_box_append, gtk_box_set_spacing; FROM GtkEnums IMPORT GtkVertical, GtkHorizontal; FROM GtkWidget IMPORT gtk_widget_set_margin_top, gtk_widget_set_margin_bottom, gtk_widget_set_margin_start, gtk_widget_set_margin_end; FROM GtkProgressBar IMPORT gtk_progress_bar_new, gtk_progress_bar_set_fraction, gtk_progress_bar_set_show_text, gtk_progress_bar_set_text; FROM GtkSpinner IMPORT gtk_spinner_new, gtk_spinner_start, gtk_spinner_stop; FROM GtkSeparator IMPORT gtk_separator_new; FROM GtkImage IMPORT gtk_image_new_from_icon_name; FROM GLib IMPORT g_timeout_add, GSourceRemove, GSourceContinue; FROM GtkClosures IMPORT Connect2; FROM SYSTEM IMPORT ADDRESS; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.Feedback"; VAR progress, spinner: ADDRESS; fraction: REAL; PROCEDURE OnTick (data: ADDRESS) : INTEGER; BEGIN fraction := fraction + 0.05; IF fraction >= 1.0 THEN gtk_progress_bar_set_fraction(progress, 1.0); gtk_progress_bar_set_text(progress, "Done"); gtk_spinner_stop(spinner); RETURN GSourceRemove ELSE gtk_progress_bar_set_fraction(progress, fraction); RETURN GSourceContinue END END OnTick; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box: ADDRESS; BEGIN fraction := 0.0; progress := gtk_progress_bar_new(); gtk_progress_bar_set_show_text(progress, 1); gtk_progress_bar_set_fraction(progress, 0.0); spinner := gtk_spinner_new(); gtk_spinner_start(spinner); box := gtk_box_new(GtkVertical, 12); gtk_box_set_spacing(box, 12); gtk_widget_set_margin_top(box, 14); gtk_widget_set_margin_bottom(box, 14); gtk_widget_set_margin_start(box, 14); gtk_widget_set_margin_end(box, 14); gtk_box_append(box, gtk_image_new_from_icon_name("application-x-executable")); gtk_box_append(box, progress); gtk_box_append(box, gtk_separator_new(GtkHorizontal)); gtk_box_append(box, spinner); window := gtk_application_window_new(application); gtk_window_set_title(window, "m2-GTK4 Feedback"); gtk_window_set_default_size(window, 360, 200); gtk_window_set_child(window, box); gtk_window_present(window); g_timeout_add(100, OnTick, NIL) END OnActivate; VAR app: ADDRESS; BEGIN app := gtk_application_new(AppId, 0); IF app = NIL THEN printf("gtk_application_new failed\n"); HALT(1) END; Connect2(app, "activate", OnActivate, NIL); g_application_run(app, 0, NIL) END feedback.