#------------------------------------------------ #!/usr/bin/env ksh # # Video Demo with GTK4 - requires Psalm 1.1 or higher # # Make sure your system has the 'libgtk-4-media-gstreamer' library available! # # April 2024 - PvE. #------------------------------------------------ # # Communication function; assignment function function com { print -p ${@} read -p answer } function def { com "$2"; eval $1='${answer}'; } # Start psalm ./psalm |& # 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_box_new int int" com "DEF libgtk-4.so.1 void gtk_box_append void* void*" 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_video_new" com "DEF libgtk-4.so.1 void* gtk_button_new_with_label char*" com "DEF libgtk-4.so.1 void* gtk_file_chooser_widget_new int" com "DEF libgtk-4.so.1 void gtk_widget_show void*" com "DEF libgtk-4.so.1 void gtk_widget_hide void*" com "DEF libgtk-4.so.1 void gtk_video_set_filename void* char*" com "DEF libgtk-4.so.1 void* gtk_video_get_media_stream void*" com "DEF libgtk-4.so.1 void gtk_media_stream_play void*" com "DEF libgtk-4.so.1 void* gtk_file_chooser_get_file void*" com "DEF libgio-2.0.so.0 char* g_file_get_path 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 Video Player\"" def BOX1 "gtk_box_new 1 5" com "g_object_set $WINDOW child $BOX1 NULL" def VIDEO "gtk_video_new" com "gtk_widget_set_size_request $VIDEO 600 400" com "gtk_widget_set_hexpand $VIDEO 1" com "gtk_widget_set_vexpand $VIDEO 1" com "gtk_box_append $BOX1 $VIDEO" def BUTTON "gtk_button_new_with_label \"Select video...\"" com "gtk_box_append $BOX1 $BUTTON" def FILE "gtk_window_new" com "gtk_window_set_title $FILE 'Open Video'" def BOX2 "gtk_box_new 1 5" com "g_object_set $FILE child $BOX2 NULL" def CHOOSER "gtk_file_chooser_widget_new 0" com "gtk_widget_set_vexpand $CHOOSER 1" com "gtk_widget_set_size_request $CHOOSER 500 500" com "gtk_box_append $BOX2 $CHOOSER" def OPEN "gtk_button_new_with_label \"Select video...\"" com "gtk_box_append $BOX2 $OPEN" com "gtk_widget_show $WINDOW" # Connect signals com "g_signal_connect_data $WINDOW close-request callback NULL NULL 0" com "g_signal_connect_data $BUTTON clicked callback NULL NULL 0" com "g_signal_connect_data $FILE close-request callback NULL NULL 0" com "g_signal_connect_data $OPEN clicked callback NULL NULL 0" # Mainloop while [[ $CB -ne $WINDOW ]] do com "g_main_context_iteration NULL 1" def CB "CALLBACK 1" case $CB in $BUTTON) com "gtk_widget_show $FILE";; $FILE) com "gtk_widget_hide $FILE";; $OPEN) com "gtk_widget_hide $FILE" def SELECT "gtk_file_chooser_get_file $CHOOSER" def NAME "g_file_get_path $SELECT" com "gtk_video_set_filename $VIDEO \"$NAME\"" def STREAM "gtk_video_get_media_stream $VIDEO" com "gtk_media_stream_play $STREAM";; esac done com "EXIT"
Return to PSALM