#!/usr/bin/env fish # # Demonstration on how to create a GTK GUI using Psalm with FISH Shell. # # Supposes the presence of the GNU coreutils 'mkfifo'. Requires Psalm 1.0.8 or higher. # # Run as follows: # ./demo3.fish # # December 5, 2022 by Peter van Eerten. #------------------------------------------------------ # Define the named pipes set IN "/dev/shm/psalm.in" set OUT "/dev/shm/psalm.out" # Create the named pipes for communication mkfifo $IN $OUT # Start psalm in a separate shell in the background to avoid block fish -c "./psalm <$IN >$OUT" & # Communicate with Psalm function comm echo $argv > $IN read answer < $OUT end # Declare global variable to store results from Psalm set answer 0 # 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_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 libgtk-3.so.0 void gtk_container_add long long" comm "DEF libgobject-2.0.so.0 long g_signal_connect_data int char* address void* void* int" # Setup GUI comm "EXE gtk_init NULL NULL" comm "EXE gtk_window_new 0" set window $answer comm "EXE gtk_window_set_title" $window "\"FishSHELL and Psalm demo\"" comm "EXE gtk_widget_set_size_request" $window 400 200 comm "EXE gtk_window_set_position" $window 1 comm "EXE gtk_table_new" 10 10 1 set table $answer comm "EXE gtk_container_add" $window $table comm "EXE gtk_button_new_with_label \"Click to Quit\"" set button $answer comm "EXE gtk_table_attach_defaults" $table $button 5 9 5 9 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" # Initialize first set event 0 # Mainloop while test $event != $button -a $event != $window comm "EXE gtk_main_iteration" comm "CALLBACK 1"; set event $answer end # Exit Psalm comm "EXIT" # Cleanup rm $IN $OUT
Return to PSALM