#!/usr/bin/env slsh %------------------------------------------------------------------------------------ % % Demonstration on how to create a GTK GUI using Psalm with S-Lang Shell 2.3.2. % % Requires Psalm 1.0.8 or higher. % % Run as follows: % ./demo3.sl % % December 4, 2022 by Peter van Eerten. %------------------------------------------------------------------------------------ % Declare variables variable pin, pout, window, table, button, label, event; % Communication function define comm(string) { variable fp, answer; fp = fopen(pin, "a"); () = fputs(string + "\n", fp); () = fclose(fp); fp = fopen(pout, "r"); () = fgets(&answer, fp); () = fclose(fp); return strtrim(answer); } % Define the named pipes pin = "/dev/shm/psalm.in"; pout = "/dev/shm/psalm.out"; % Create the named pipes for communication () = mkfifo(pin, 0666); () = mkfifo(pout, 0666); % Start Psalm and redirect stdin/stout to pipes () = system ("./psalm <" + pin + " >" + pout + " &"); % Send definitions first () = comm("DEF libgtk-3.so.0 void gtk_init int int"); () = comm("DEF libgtk-3.so.0 long gtk_window_new int"); () = comm("DEF libgtk-3.so.0 void gtk_window_set_title int char*"); () = comm("DEF libgtk-3.so.0 void gtk_window_set_position long int"); () = comm("DEF libgtk-3.so.0 long gtk_button_new_with_label char*"); () = comm("DEF libgtk-3.so.0 long gtk_table_new int int int"); () = comm("DEF libgtk-3.so.0 void gtk_container_add long long"); () = comm("DEF libgtk-3.so.0 long gtk_label_new char*"); () = comm("DEF libgtk-3.so.0 void gtk_table_attach_defaults long long int int int int"); () = comm("DEF libgtk-3.so.0 void gtk_main_iteration void"); () = comm("DEF libgtk-3.so.0 void gtk_widget_show_all int"); () = comm("DEF libgtk-3.so.0 void gtk_widget_set_size_request long int int"); () = comm("DEF libgobject-2.0.so.0 long g_signal_connect_data int char* address void* void* int"); % Build GUI () = comm("EXE gtk_init NULL NULL"); window = comm("EXE gtk_window_new 0"); () = comm("EXE gtk_widget_set_size_request " + window + " 300 200"); () = comm("EXE gtk_window_set_title " + window + " \"S-Lang demo with GTK\""); () = comm("EXE gtk_window_set_position " + window + " 1"); table = comm("EXE gtk_table_new 20 20 1"); () = comm("EXE gtk_container_add " + window + " " + table); button = comm("EXE gtk_button_new_with_label \"Click to Quit\""); () = comm("EXE gtk_table_attach_defaults " + table + " " + button + " 12 19 12 19"); label = comm("EXE gtk_label_new \"S-Lang uses GTK with the help of Psalm!\""); () = comm("EXE gtk_table_attach_defaults " + table + " " + label + " 1 15 1 10"); () = comm("EXE gtk_widget_show_all " + window); % Connect signals () = comm("EXE g_signal_connect_data " + window + " delete-event callback NULL NULL 0"); () = comm("EXE g_signal_connect_data " + button + " clicked callback NULL NULL 0"); % Mainloop do { comm("EXE gtk_main_iteration"); event = comm("CALLBACK 1"); } while(event != button and event != window); % Exit Psalm and cleanup () = comm("EXIT"); () = remove(pin); () = remove(pout); % Exit shell exit(0);
Return to PSALM