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