PSALM - demo3.ksh
Not logged in
#------------------------------------------------
#!/usr/bin/env ksh
#
# GUI with GTK4 - requires Psalm 1.1 or higher
#
# Supposes the presence of the GNU coreutils 'mkfifo'.
#
# Run as follows:
#   ksh ./demo3.ksh
#
# April 2024 - PvE.
#------------------------------------------------
#
# Define the named pipes
IN=/dev/shm/psalm.in
OUT=/dev/shm/psalm.out

# Always delete old named pipes
rm -f ${IN} ${OUT}

# Create the named pipes for communication
mkfifo ${IN} ${OUT}

# Start psalm, redirect input and output to named pipes
./psalm <${IN} >${OUT} &

# Communication function
function com
{
    echo ${@} > ${IN}
    read answer < ${OUT}
}
function def { com "$2"; eval $1='${answer}'; }

# Send definitions first
com "DEF libgtk-4.so.1 void gtk_init"
com "DEF libgtk-4.so.1 void* gtk_window_new"
com "DEF libgtk-4.so.1 void gtk_window_set_title void* char*"
com "DEF libgtk-4.so.1 void* gtk_grid_new"
com "DEF libgtk-4.so.1 void gtk_grid_attach void* void* int int int int"
com "DEF libgtk-4.so.1 void* gtk_entry_new"
com "DEF libgtk-4.so.1 void* gtk_button_new_with_label char*"
com "DEF libgtk-4.so.1 void gtk_widget_set_size_request void* int int"
com "DEF libgtk-4.so.1 void gtk_widget_set_hexpand void* int"
com "DEF libgtk-4.so.1 void gtk_widget_set_vexpand void* int"
com "DEF libgtk-4.so.1 void gtk_widget_set_halign void* int"
com "DEF libgtk-4.so.1 void gtk_widget_set_valign void* int"
com "DEF libgtk-4.so.1 void* gtk_entry_get_buffer void*"
com "DEF libgtk-4.so.1 char* gtk_entry_buffer_get_text void*"
com "DEF libgtk-4.so.1 void gtk_entry_buffer_set_text void* char* int"
com "DEF libgtk-4.so.1 void gtk_widget_show void*"
com "DEF libglib-2.0.so.0 void g_main_context_iteration void* int"
com "DEF libgobject-2.0.so.0 void g_object_set void* char* void* void*"
com "DEF libgobject-2.0.so.0 long g_signal_connect_data int char* address void* void* int"

# Define GUI
com "gtk_init"
def WINDOW "gtk_window_new"
com "gtk_window_set_title $WINDOW \"GTK4 GUI\""
com "gtk_widget_set_size_request $WINDOW 250 100"
def GRID "gtk_grid_new"
com "g_object_set $WINDOW child $GRID NULL"
def ENTRY "gtk_entry_new"
com "gtk_widget_set_hexpand $ENTRY 1"
com "gtk_widget_set_valign $ENTRY 2"
com "gtk_grid_attach $GRID $ENTRY 0 0 2 1"
def SETBUTTON "gtk_button_new_with_label \"Set Text\""
com "gtk_widget_set_halign $SETBUTTON 1"
com "gtk_widget_set_valign $SETBUTTON 2"
com "gtk_widget_set_vexpand $SETBUTTON 1"
com "gtk_grid_attach $GRID $SETBUTTON 0 1 1 1"
def GETBUTTON "gtk_button_new_with_label \"Get Text\""
com "gtk_widget_set_halign $GETBUTTON 2"
com "gtk_widget_set_valign $GETBUTTON 2"
com "gtk_grid_attach $GRID $GETBUTTON 1 1 1 1"
com "gtk_widget_set_vexpand $GETBUTTON 1"
com "gtk_widget_show $WINDOW"

# Connect signals
com "g_signal_connect_data $WINDOW close-request callback NULL NULL 0"
com "g_signal_connect_data $SETBUTTON clicked callback NULL NULL 0"
com "g_signal_connect_data $GETBUTTON clicked callback NULL NULL 0"
com "g_signal_connect_data $ENTRY activate callback NULL NULL 0"

# Mainloop
while [[ $CB != $WINDOW ]]
do
    com "g_main_context_iteration NULL 1"
    def CB "CALLBACK 1"

    if [[ $CB = $ENTRY || $CB = $GETBUTTON ]]
    then
        def BUFFER "gtk_entry_get_buffer $ENTRY"
        def DATA "gtk_entry_buffer_get_text $BUFFER"
        print $DATA
    elif [[ $CB = $SETBUTTON ]]
    then
        def BUFFER "gtk_entry_get_buffer $ENTRY"
        com "gtk_entry_buffer_set_text $BUFFER \"This is a GTK4 demo\" -1"
    fi
done

com "EXIT"

# Cleanup
rm ${IN} ${OUT}

Return to PSALM