MODULE test_utility ; (* m2-GTK4 test - small utility/feedback widgets: GtkAdjustment, GtkProgressBar, GtkSpinner, GtkSeparator and GtkImage. Requires a display. *) FROM Gio IMPORT g_application_run, g_application_quit; FROM GtkApplication IMPORT gtk_application_new; FROM GtkWindow IMPORT gtk_application_window_new, gtk_window_set_child; FROM GtkBox IMPORT gtk_box_new, gtk_box_append; FROM GtkEnums IMPORT GtkVertical, GtkHorizontal; FROM GtkAdjustment IMPORT gtk_adjustment_new, gtk_adjustment_get_value, gtk_adjustment_set_value, gtk_adjustment_get_lower, gtk_adjustment_get_upper, gtk_adjustment_set_upper, gtk_adjustment_get_step_increment, gtk_adjustment_get_page_increment, gtk_adjustment_get_page_size, gtk_adjustment_clamp_page; FROM GtkProgressBar IMPORT gtk_progress_bar_new, gtk_progress_bar_set_fraction, gtk_progress_bar_get_fraction, gtk_progress_bar_set_show_text, gtk_progress_bar_get_show_text, gtk_progress_bar_set_text, gtk_progress_bar_get_text, gtk_progress_bar_pulse; FROM GtkSpinner IMPORT gtk_spinner_new, gtk_spinner_start, gtk_spinner_stop, gtk_spinner_set_spinning, gtk_spinner_get_spinning; FROM GtkSeparator IMPORT gtk_separator_new; FROM GtkImage IMPORT gtk_image_new_from_icon_name, gtk_image_get_icon_name; FROM GtkUtils IMPORT Connect, CStrToM2; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.TestUtility"; VAR app: ADDRESS; passed: BOOLEAN; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, adj, pbar, spinner, sep, image: ADDRESS; buf: ARRAY [0..63] OF CHAR; ok: BOOLEAN; BEGIN ok := TRUE; (* --- GtkAdjustment --- *) adj := gtk_adjustment_new(5.0, 0.0, 100.0, 1.0, 10.0, 20.0); IF ABS(gtk_adjustment_get_value(adj) - 5.0) > 0.001 THEN ok := FALSE END; IF ABS(gtk_adjustment_get_lower(adj) - 0.0) > 0.001 THEN ok := FALSE END; IF ABS(gtk_adjustment_get_upper(adj) - 100.0) > 0.001 THEN ok := FALSE END; IF ABS(gtk_adjustment_get_step_increment(adj) - 1.0) > 0.001 THEN ok := FALSE END; IF ABS(gtk_adjustment_get_page_increment(adj) - 10.0) > 0.001 THEN ok := FALSE END; IF ABS(gtk_adjustment_get_page_size(adj) - 20.0) > 0.001 THEN ok := FALSE END; gtk_adjustment_set_value(adj, 50.0); IF ABS(gtk_adjustment_get_value(adj) - 50.0) > 0.001 THEN printf("adjustment value wrong\n"); ok := FALSE END; gtk_adjustment_set_upper(adj, 200.0); IF ABS(gtk_adjustment_get_upper(adj) - 200.0) > 0.001 THEN ok := FALSE END; gtk_adjustment_clamp_page(adj, 0.0, 30.0); (* --- GtkProgressBar --- *) pbar := gtk_progress_bar_new(); gtk_progress_bar_set_fraction(pbar, 0.25); IF ABS(gtk_progress_bar_get_fraction(pbar) - 0.25) > 0.001 THEN printf("progress fraction wrong\n"); ok := FALSE END; gtk_progress_bar_set_show_text(pbar, 1); IF gtk_progress_bar_get_show_text(pbar) # 1 THEN ok := FALSE END; gtk_progress_bar_set_text(pbar, "25 percent"); CStrToM2(gtk_progress_bar_get_text(pbar), buf); IF (buf[0] # '2') OR (buf[10] # 0C) THEN printf("progress text wrong: [%s]\n", buf); ok := FALSE END; gtk_progress_bar_pulse(pbar); (* --- GtkSpinner --- *) spinner := gtk_spinner_new(); gtk_spinner_start(spinner); IF gtk_spinner_get_spinning(spinner) # 1 THEN ok := FALSE END; gtk_spinner_stop(spinner); IF gtk_spinner_get_spinning(spinner) # 0 THEN ok := FALSE END; gtk_spinner_set_spinning(spinner, 1); IF gtk_spinner_get_spinning(spinner) # 1 THEN ok := FALSE END; (* --- GtkSeparator / GtkImage --- *) sep := gtk_separator_new(GtkHorizontal); IF sep = NIL THEN printf("separator NIL\n"); ok := FALSE END; image := gtk_image_new_from_icon_name("open-menu-symbolic"); CStrToM2(gtk_image_get_icon_name(image), buf); IF (buf[0] # 'o') OR (buf[18] # 0C) THEN printf("image icon name wrong: [%s]\n", buf); ok := FALSE END; box := gtk_box_new(GtkVertical, 6); gtk_box_append(box, pbar); gtk_box_append(box, spinner); gtk_box_append(box, sep); gtk_box_append(box, image); window := gtk_application_window_new(application); gtk_window_set_child(window, box); passed := ok; g_application_quit(application) END OnActivate; VAR rc: INTEGER; BEGIN passed := FALSE; app := gtk_application_new(AppId, 0); IF app = NIL THEN printf("test_utility: FAIL (no app)\n"); HALT(1) END; Connect(app, "activate", ADR(OnActivate), NIL); rc := g_application_run(app, 0, NIL); IF passed THEN printf("test_utility: PASS\n"); HALT(0) ELSE printf("test_utility: FAIL\n"); HALT(1) END END test_utility.