#!/usr/bin/env slsh %------------------------------------------------------------------------------------ % % Demonstration on how to create a GTK GUI using Psalm with S-Lang Shell 2.3.2. % % Run as follows (sockets): % socat EXEC:./psalm EXEC:./demo.sl % % Or using socat with pipes: % socat EXEC:./psalm,pipes EXEC:./demo.sl,pipes % % Or using dpipe from VDE2: % dpipe ./psalm = ./demo.sl % % Or using pipexec: % pipexec [ A ./psalm ] [ B ./demo.sl ] "{A:1>B:0}" "{B:1>A:0}" % % Or native Linux: % : | { ./psalm | ./demo.sl; } > /dev/fd/0 % % December 1, 2022 by Peter van Eerten. %------------------------------------------------------------------------------------ define comm(string) { variable answer; () = fputs(string + "\n", stdout); () = fflush(stdout); () = fgets(&answer, stdin); return strtrim(answer); } % 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"); % Declare variables variable window, table, button, label, event; % 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 () = comm("EXIT"); % Exit shell exit(0);
Return to PSALM