MODULE test_inputs2 ; (* m2-GTK4 test - second batch of input widgets: GtkSpinButton, GtkSearchEntry, GtkDropDown (+ GtkStringList/GListModel) and GtkTextView + GtkTextBuffer, including the opaque GtkTextIter that is marshalled by address. 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, GtkWrapWordChar; FROM GtkSpinButton IMPORT gtk_spin_button_new_with_range, gtk_spin_button_set_value, gtk_spin_button_get_value, gtk_spin_button_get_value_as_int, gtk_spin_button_set_wrap, gtk_spin_button_get_wrap, gtk_spin_button_set_numeric, gtk_spin_button_get_numeric, gtk_spin_button_spin, GtkSpinUserDefined; FROM GtkSearchEntry IMPORT gtk_search_entry_new, gtk_search_entry_set_placeholder_text, gtk_search_entry_get_placeholder_text; FROM GtkStringList IMPORT gtk_string_list_new, gtk_string_list_append, gtk_string_list_get_string; FROM GtkDropDown IMPORT gtk_drop_down_new, gtk_drop_down_set_selected, gtk_drop_down_get_selected, gtk_drop_down_get_model, gtk_drop_down_set_enable_search, gtk_drop_down_get_enable_search; FROM GListModel IMPORT g_list_model_get_n_items; FROM GtkTextBuffer IMPORT gtk_text_buffer_new, gtk_text_buffer_set_text, gtk_text_buffer_get_text, gtk_text_buffer_get_bounds, gtk_text_buffer_get_char_count, gtk_text_buffer_get_line_count, gtk_text_buffer_get_modified, gtk_text_buffer_set_modified; FROM GtkTextIter IMPORT GtkTextIter; FROM GtkTextView IMPORT gtk_text_view_new_with_buffer, gtk_text_view_get_buffer, gtk_text_view_set_wrap_mode, gtk_text_view_get_wrap_mode, gtk_text_view_set_monospace, gtk_text_view_get_monospace, gtk_text_view_set_editable, gtk_text_view_get_editable; FROM GLib IMPORT g_free; FROM GtkUtils IMPORT Connect, CStrToM2; FROM SYSTEM IMPORT ADDRESS, ADR; FROM libc IMPORT printf; CONST AppId = "org.example.m2gtk4.TestInputs2"; VAR app: ADDRESS; passed: BOOLEAN; temp: ADDRESS; PROCEDURE OnActivate (application: ADDRESS; data: ADDRESS); VAR window, box, spin, search, dd, list, view, buffer: ADDRESS; start, stop: GtkTextIter; buf: ARRAY [0..63] OF CHAR; ok: BOOLEAN; BEGIN ok := TRUE; (* --- GtkSpinButton --- *) spin := gtk_spin_button_new_with_range(0.0, 100.0, 1.0); gtk_spin_button_set_value(spin, 42.0); IF ABS(gtk_spin_button_get_value(spin) - 42.0) > 0.001 THEN printf("spin value wrong\n"); ok := FALSE END; IF gtk_spin_button_get_value_as_int(spin) # 42 THEN printf("spin int wrong\n"); ok := FALSE END; gtk_spin_button_set_wrap(spin, 1); IF gtk_spin_button_get_wrap(spin) # 1 THEN ok := FALSE END; gtk_spin_button_set_numeric(spin, 1); IF gtk_spin_button_get_numeric(spin) # 1 THEN ok := FALSE END; gtk_spin_button_spin(spin, GtkSpinUserDefined, 5.0); IF ABS(gtk_spin_button_get_value(spin) - 47.0) > 0.001 THEN printf("spin step wrong\n"); ok := FALSE END; (* --- GtkSearchEntry --- *) search := gtk_search_entry_new(); gtk_search_entry_set_placeholder_text(search, "look for it"); CStrToM2(gtk_search_entry_get_placeholder_text(search), buf); IF (buf[0] # 'l') OR (buf[11] # 0C) THEN printf("search placeholder wrong: [%s]\n", buf); ok := FALSE END; (* --- GtkDropDown + GtkStringList + GListModel --- *) list := gtk_string_list_new(NIL); gtk_string_list_append(list, "alpha"); gtk_string_list_append(list, "beta"); gtk_string_list_append(list, "gamma"); IF g_list_model_get_n_items(list) # 3 THEN printf("string list size wrong\n"); ok := FALSE END; CStrToM2(gtk_string_list_get_string(list, 1), buf); IF (buf[0] # 'b') OR (buf[4] # 0C) THEN printf("string list item wrong: [%s]\n", buf); ok := FALSE END; dd := gtk_drop_down_new(list, NIL); IF gtk_drop_down_get_model(dd) # list THEN ok := FALSE END; IF gtk_drop_down_get_selected(dd) # 0 THEN ok := FALSE END; gtk_drop_down_set_selected(dd, 2); IF gtk_drop_down_get_selected(dd) # 2 THEN printf("dropdown selection wrong\n"); ok := FALSE END; gtk_drop_down_set_enable_search(dd, 1); IF gtk_drop_down_get_enable_search(dd) # 1 THEN ok := FALSE END; (* --- GtkTextBuffer + GtkTextView + GtkTextIter --- *) buffer := gtk_text_buffer_new(NIL); gtk_text_buffer_set_text(buffer, "hello", -1); IF gtk_text_buffer_get_char_count(buffer) # 5 THEN printf("buffer char count wrong\n"); ok := FALSE END; IF gtk_text_buffer_get_line_count(buffer) # 1 THEN ok := FALSE END; gtk_text_buffer_get_bounds(buffer, start, stop); temp := gtk_text_buffer_get_text(buffer, start, stop, 0); CStrToM2(temp, buf); g_free(temp); IF (buf[0] # 'h') OR (buf[4] # 'o') OR (buf[5] # 0C) THEN printf("buffer text wrong: [%s]\n", buf); ok := FALSE END; gtk_text_buffer_set_modified(buffer, 0); IF gtk_text_buffer_get_modified(buffer) # 0 THEN ok := FALSE END; view := gtk_text_view_new_with_buffer(buffer); IF gtk_text_view_get_buffer(view) # buffer THEN printf("view buffer wrong\n"); ok := FALSE END; gtk_text_view_set_wrap_mode(view, GtkWrapWordChar); IF gtk_text_view_get_wrap_mode(view) # GtkWrapWordChar THEN printf("wrap mode wrong\n"); ok := FALSE END; gtk_text_view_set_monospace(view, 1); IF gtk_text_view_get_monospace(view) # 1 THEN ok := FALSE END; gtk_text_view_set_editable(view, 0); IF gtk_text_view_get_editable(view) # 0 THEN ok := FALSE END; box := gtk_box_new(GtkVertical, 4); gtk_box_append(box, spin); gtk_box_append(box, search); gtk_box_append(box, dd); gtk_box_append(box, view); 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_inputs2: 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_inputs2: PASS\n"); HALT(0) ELSE printf("test_inputs2: FAIL\n"); HALT(1) END END test_inputs2.