PSALM - demo3.make
Not logged in
#------------------------------------------------------
# Demonstration on how to create a GTK GUI using Psalm with GNU Make 4.3
#
# Supposes the presence of the GNU coreutils 'mkfifo'. Requires Psalm 1.0.8 or higher.
#
# Run as follows:
#   make -f demo3.make
#
# December 6, 2022 by Peter van Eerten.
#------------------------------------------------------

IN  = /dev/shm/psalm.in
OUT = /dev/shm/psalm.out

define comm
$(eval answer:=$(shell echo ${1} > $(IN) && read x < $(OUT) && echo $$x))
endef

all: fifo psalm definitions gui signals mainloop retrieve exit clean

exit:
    $(call comm,"EXIT")

retrieve:
    $(call comm,"EXE gtk_toggle_button_get_active $(check1)")
    @echo Option -O2 enabled: $(answer)
    $(call comm,"EXE gtk_toggle_button_get_active $(check2)")
    @echo Strip Binary: $(answer)
    $(call comm,"EXE gtk_toggle_button_get_active $(check3)")
    @echo Add Debugging Symbols: $(answer)
    $(call comm,"EXE gtk_entry_get_text $(entry1)")
    @echo Path To Datadir: $(answer)
    $(call comm,"EXE gtk_entry_get_text $(entry2)")
    @echo Path To Mandir: $(answer)

mainloop:
    @while test "$$event" != "$(window)" -a "$$event" != "$(button)"; do \
        echo "EXE gtk_main_iteration" > $(IN); \
        read answer < $(OUT); \
        echo "CALLBACK 1" > $(IN); \
        read event < $(OUT); \
    done;

signals:
    $(call comm,"EXE g_signal_connect_data $(window) delete-event callback NULL NULL 0")
    $(call comm,"EXE g_signal_connect_data $(button) clicked callback NULL NULL 0")

gui:
    $(call comm,"EXE gtk_init NULL NULL")
    $(call comm,"EXE gtk_window_new 0")
    $(eval window:=$(answer))
    $(call comm,"EXE gtk_window_set_title" $(window) "\"GNU Make and Psalm demo!\"")
    $(call comm,"EXE gtk_widget_set_size_request $(window) 400 300")
    $(call comm,"EXE gtk_window_set_position $(window) 1")
    $(call comm,"EXE gtk_fixed_new")
    $(eval fixed:=$(answer))
    $(call comm,"EXE gtk_container_add $(window) $(fixed)")
    $(call comm,"EXE gtk_check_button_new_with_label \"Use -O2\"")
    $(eval check1:=$(answer))
    $(call comm,"EXE gtk_fixed_put $(fixed) $(check1) 20 20")
    $(call comm,"EXE gtk_check_button_new_with_label \"Strip Binary\"")
    $(eval check2:=$(answer))
    $(call comm,"EXE gtk_fixed_put $(fixed) $(check2) 20 50")
    $(call comm,"EXE gtk_check_button_new_with_label \"Add Debugging Symbols\"")
    $(eval check3:=$(answer))
    $(call comm,"EXE gtk_fixed_put $(fixed) $(check3) 20 80")
    $(call comm,"EXE gtk_label_new \"Path To Datadir:\"")
    $(eval label1:=$(answer))
    $(call comm,"EXE gtk_fixed_put $(fixed) $(label1) 20 140")
    $(call comm,"EXE gtk_entry_new")
    $(eval entry1:=$(answer))
    $(call comm,"EXE gtk_entry_set_text $(entry1) \"/usr/local/share\"")
    $(call comm,"EXE gtk_fixed_put $(fixed) $(entry1) 130 130")
    $(call comm,"EXE gtk_label_new \"Path To Mandir:\"")
    $(eval label2:=$(answer))
    $(call comm,"EXE gtk_fixed_put $(fixed) $(label2) 20 180")
    $(call comm,"EXE gtk_entry_new")
    $(eval entry2:=$(answer))
    $(call comm,"EXE gtk_entry_set_text $(entry2) \"/usr/local/man\"")
    $(call comm,"EXE gtk_fixed_put $(fixed) $(entry2) 130 170")
    $(call comm,"EXE gtk_button_new_with_label \"Compile Now\"")
    $(eval button:=$(answer))
    $(call comm,"EXE gtk_fixed_put $(fixed) $(button) 290 260")
    $(call comm,"EXE gtk_widget_show_all $(window)")

definitions:
    $(call comm,"DEF libgtk-3.so.0 void gtk_init int int")
    $(call comm,"DEF libgtk-3.so.0 long gtk_window_new int")
    $(call comm,"DEF libgtk-3.so.0 void gtk_window_set_title int char*")
    $(call comm,"DEF libgtk-3.so.0 void gtk_window_set_position long int")
    $(call comm,"DEF libgtk-3.so.0 long gtk_button_new_with_label char*")
    $(call comm,"DEF libgtk-3.so.0 long gtk_check_button_new_with_label char*")
    $(call comm,"DEF libgtk-3.so.0 int gtk_toggle_button_get_active long")
    $(call comm,"DEF libgtk-3.so.0 long gtk_label_new char*")
    $(call comm,"DEF libgtk-3.so.0 long gtk_entry_new void")
    $(call comm,"DEF libgtk-3.so.0 void gtk_entry_set_text long char*")
    $(call comm,"DEF libgtk-3.so.0 char* gtk_entry_get_text long")
    $(call comm,"DEF libgtk-3.so.0 long gtk_fixed_new void")
    $(call comm,"DEF libgtk-3.so.0 long gtk_fixed_put long long int int")
    $(call comm,"DEF libgtk-3.so.0 void gtk_main_iteration void")
    $(call comm,"DEF libgtk-3.so.0 void gtk_widget_show_all int")
    $(call comm,"DEF libgtk-3.so.0 void gtk_widget_set_size_request long int int")
    $(call comm,"DEF libgtk-3.so.0 void gtk_container_add long long")
    $(call comm,"DEF libgobject-2.0.so.0 long g_signal_connect_data int char* address void* void* int")

.PHONY: psalm
psalm :
    @./psalm <$(IN) >$(OUT) &

fifo :
    @mkfifo $(IN) $(OUT)

clean :
    @rm -f $(IN) $(OUT)

Return to PSALM