PSALM - demo3.m4
Not logged in
divert(-1)dnl
#------------------------------------------------------------------------------------
#
# Demonstration on how to create a GTK GUI using Psalm with M4 1.4.18.
#
# Supposes the presence of the GNU coreutils 'mkfifo'. Requires Psalm 1.0.8 or higher.
#
# Run as follows:
#   m4 ./demo3.m4
#
# December 3, 2022 by Peter van Eerten.
#------------------------------------------------------------------------------------

# Define the named pipes
define(`PIN', `/dev/shm/psalm.in')
define(`POUT', `/dev/shm/psalm.out')

# Create the named pipes for communication
syscmd(`mkfifo 'PIN` 'POUT)

# Start psalm, redirect input and output to named pipes
syscmd(`./psalm <'PIN` >'POUT` &')

# Communication function
define(`comm', `esyscmd(`echo `$@'>'PIN`;read answer<'POUT`;echo -n $answer')')

#-----------------------------------------------------------

# Send definitions first
comm("DEF libgtk-3.so void gtk_init int int")
comm("DEF libgtk-3.so long gtk_window_new int")
comm("DEF libgtk-3.so void gtk_window_set_title int char*")
comm("DEF libgtk-3.so long gtk_button_new_with_label char*")
comm("DEF libgtk-3.so long gtk_fixed_new void")
comm("DEF libgtk-3.so long gtk_fixed_put long long int int")
comm("DEF libgtk-3.so long gtk_calendar_new void")
comm("DEF libgtk-3.so void gtk_main_iteration void")
comm("DEF libgtk-3.so void gtk_widget_show_all int")
comm("DEF libgtk-3.so void gtk_widget_set_size_request long int int")
comm("DEF libgtk-3.so void gtk_container_add long long")
comm("DEF libgobject-2.0.so long g_signal_connect_data int char* address void* void* int")

# Design GUI
comm("EXE gtk_init 0 0")
define(window, comm("EXE gtk_window_new 0"))
comm("EXE gtk_window_set_title window \"Hello Calendar\"")
comm("EXE gtk_widget_set_size_request window 400 300")
define(fixed, comm("EXE gtk_fixed_new"))
comm("EXE gtk_container_add window fixed")
define(button, comm("EXE gtk_button_new_with_label \"Press Me\""))
comm("EXE gtk_widget_set_size_request button 100 30")
comm("EXE gtk_fixed_put fixed button 290 260")
define(calendar, comm("EXE gtk_calendar_new"))
comm("EXE gtk_widget_set_size_request calendar 200 200")
comm("EXE gtk_fixed_put fixed calendar 50 10")
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")

# Mainloop
define(update, `comm("EXE gtk_main_iteration")')
define(callback, `comm("CALLBACK 1")')
define(exit, `comm("EXIT")' `syscmd(`rm 'PIN` 'POUT)' `m4exit(0)')
define(action, `ifelse($1, window, `exit', $1, button, `exit')')
define(mainloop, `update' define(`event', `callback') `action(event)' `mainloop')

mainloop

Return to PSALM