PSALM - demo3.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.
%
% 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