PSALM - demo.sl
Not logged in
#!/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