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