#!/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