PSALM - demo2.ksh
Not logged in
#------------------------------------------------
#!/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