PSALM - demo4.awk
Not logged in
#!/usr/bin/gawk -f
#
# Demonstration on how to create a GTK GUI using Psalm with GNU AWK 5.1.0 using TCP.
#
# Supposes the presence of 'socat' on the system. Requires Psalm 1.0.8 or higher.
#
# When using a remote system, socat must be started specifying the IP address of that system, eg:
#   socat EXEC:./psalm TCP-LISTEN:50000,bind=1.2.3.4 &
#
# The script on this system should then setup the appropriate socket:
#   psalm = "/inet/tcp/0/1.2.3.4/50000"
#
# When Psalm is running on a remote system then extra measures must be taken to accomplish a GUI.
# For non-GUI programs it should be fine though.
#
# Run this script as follows:
#   ./demo4.awk
#
# December 17, 2022 by Peter van Eerten.
#------------------------------------------------------------------------------------

function comm(string)
{
    print string |& psalm
    psalm |& getline
    return $0
}

BEGIN{
    system("socat EXEC:./psalm TCP-LISTEN:50000 &")

    # Setup TCP socket to server
    psalm = "/inet/tcp/0/localhost/50000"

    # 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_widget_set_size_request long int int")
    comm("DEF libgtk-3.so.0 void gtk_window_set_position long int")
    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_button_new_with_label char*")
    comm("DEF libgtk-3.so.0 long gtk_entry_new void")
    comm("DEF libgtk-3.so.0 char* gtk_entry_get_text long")
    comm("DEF libgtk-3.so.0 long gtk_label_new void")
    comm("DEF libgtk-3.so.0 void gtk_label_set_text long 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_widget_show_all int")
    comm("DEF libgobject-2.0.so.0 long g_signal_connect_data int char* address void* void* int")
    comm("DEF libgtk-3.so.0 void gtk_main_iteration void")

    # Design GUI
    comm("EXE gtk_init NULL NULL")
    win = comm("EXE gtk_window_new 0")
    comm("EXE gtk_window_set_title " win " \"This is a title\"")
    comm("EXE gtk_window_set_position " win " 1")
    table = comm("EXE gtk_table_new 30 30 1")
    comm("EXE gtk_container_add " win " " table)
    but1 = comm("EXE gtk_button_new_with_label Exit")
    comm("EXE gtk_table_attach_defaults " table " " but1 " 17 28 20 25")
    but2 = comm("EXE gtk_button_new_with_label \"Print text\"")
    comm("EXE gtk_table_attach_defaults " table " " but2 " 2 13 20 25")
    entry = comm("EXE gtk_entry_new")
    comm("EXE gtk_table_attach_defaults " table " " entry " 2 28 5 10")
    label = comm("EXE gtk_label_new")
    comm("EXE gtk_table_attach_defaults " table " " label " 2 28 12 17")
    comm("EXE gtk_label_set_text " label " \"<Text appears here>\"")
    comm("EXE gtk_widget_show_all " win)

    # Connect signals
    comm("EXE g_signal_connect_data " win " delete-event callback NULL NULL 0")
    comm("EXE g_signal_connect_data " but1 " clicked callback NULL NULL 0")
    comm("EXE g_signal_connect_data " but2 " clicked callback NULL NULL 0")

    # Mainloop
    do {
        comm("EXE gtk_main_iteration")
        cb = comm("CALLBACK 1")
        if (cb == but2)
        {
            txt = comm("EXE gtk_entry_get_text " entry)
            comm("EXE gtk_label_set_text " label " " txt)
            print "This is the contents: " txt
        }
    } while(cb != but1 && cb != win)

    comm("EXIT")
    close(psalm)
}

Return to PSALM