#!/bin/bash # Program name PROGRAM_NAME="Frameless" PROGRAM_V="2.0" # Make sure the required packages are installed command -v mplayer >/dev/null 2>&1 || { echo >&2 "[error] We require mplayer for $PROGRAM_NAME v${PROGRAM_V} to work, but it's not installed. Aborting." exit 1 } command -v zenity >/dev/null 2>&1 || { echo >&2 "[error] We require zenity for $PROGRAM_NAME v${PROGRAM_V} to work, but it's not installed. Aborting." exit 1 } dpkg -l | grep v4l-utils >/dev/null 2>&1 || { echo >&2 "[error] We require v4l-utils for $PROGRAM_NAME v${PROGRAM_V} to work, but it's not installed. Aborting." exit 1 } # to install the needed packages :) # sudo apt-get install mplayer zenity v4l-utils # the device name DEVICE='' # the screen number SCREEN_NUMBER='' # main function function main() { # select the video to use selectVideoDevice # select the screen to use selectScreen # open the menu mainMenu exit 0; } # select the screen function selectScreen() { local screen_count local screen_index # get the screens local screens='' screens=$(getScreens) # check the number of screens screen_count=$(echo "$screens" | wc -l) if [ "$screen_count" -eq 1 ]; then # only one screen is available, so set the screen number to 0 SCREEN_NUMBER=0 else # get the selection local selected="" while [ -z "$selected" ]; do # Display the list of screens using Zenity selected=$(zenity --list --title "Select a Screen" --column "Index" --column "Screen Name" $screens) # Check the exit status of Zenity if [ $? -eq 1 ]; then # The user clicked the "Cancel" button, exit the loop exit 0 elif [ -z "$selected" ]; then # No screen was selected, display an error message zenity --error --text "No screen was selected. Please select a screen." fi done # Extract the screen index from the selection screen_index=$(echo "$selected" | awk '{print $1}') SCREEN_NUMBER="${screen_index}" fi } # function get screens function getScreens() { # Get a list of available screens and their index local screens screens=$(xrandr | grep " connected" | awk '{print NR-1 " " $1}') echo "$screens" } # select the video camera function selectVideoDevice() { # get the cameras local cameras='' cameras=$(getDevices) # stop all videos stopVideo # get the selection local selected="" while [ -z "$selected" ]; do # Display the list of cameras using Zenity # shellcheck disable=SC2086 selected=$(zenity --list --title "Select a Video Camera" --column "Camera" $cameras) # Check the exit status of Zenity if [ $? -eq 1 ]; then # The user clicked the "Cancel" button, exit the loop exit 0 elif [ -z "$selected" ]; then # No camera was selected, display an error message zenity --error --text "No camera was selected. Please select a camera." fi done # Camera was selected, display a preview previewDevice "${selected}" DEVICE="${selected}" zenity --question --text "Is this the camera you would like to use?" # Check the exit status of Zenity if [ $? -eq 1 ]; then selectVideoDevice fi # stop all videos stopVideo } # function get devices function getDevices() { # Our local values local devices='' local list='' # Get a list of video cameras # shellcheck disable=SC2010 devices=$(ls /dev | grep '^video') # Check which devices can be displayed by MPlayer for device in $devices; do # Use v4l2-ctl to check if the device supports previewing if v4l2-ctl --device="/dev/$device" --list-formats | grep -q "YUYV" ; then # The device supports previewing, add it to the list list="$list $device" fi done echo "$list" } # Function to display a preview of the given video device function previewDevice() { device=$1 mplayer tv:// -tv driver=v4l2:device="/dev/$device" -geometry "300x300" -quiet -nolirc -ontop -noborder -nosound -vo xv & disown } # MAIN MENU function mainMenu() { local CHOICE='' # select your position CHOICE=$(zenity --list \ --title="Tutorial Video Player" --radiolist --width=400 --height=300 \ --text "Select where you want the video to display on (screen-${SCREEN_NUMBER})" \ --radiolist --column "Select" --column "Value" --column="Position Options" \ TRUE large "Large Center" \ FASLE bottomleft "Left Corner" \ FASLE bottomright "Right Corner" \ FASLE topleft "Top Left Corner" \ FASLE topright "Top Right Corner" \ FASLE camera "Select Camera" \ --hide-column=2 --cancel-label "Close") # always first stop videos playing stopVideo # trigger the choose action case $CHOICE in "large") showLarge ;; "bottomleft") showVideo "bottomleft" ;; "bottomright") showVideo "bottomright" ;; "topleft") showVideo "topleft" ;; "topright") showVideo "topright" ;; "camera") selectVideoDevice ;; *) exit 0;; esac # menu loop mainMenu } # show large center video function showLarge() { mplayer -zoom -ontop -noborder -nosound -vo gl:nomanyfmts \ -vf mirror -xy 2 tv:// -tv driver=v4l2:device="/dev/${DEVICE}" -screen "${SCREEN_NUMBER}" & disown } # function to get screen dimensions function getScreenDimensions() { local screen_name local dimensions local adjusted_screen_number=$(( $1 + 1 )) screen_name=$(xrandr | grep " connected" | awk -v screen_number="$adjusted_screen_number" 'NR==screen_number {print $1}') dimensions=$(xrandr | grep "$screen_name" | grep -oP '\d+x\d+\+\d+\+\d+' | cut -d'+' -f1) echo "$dimensions" } # show video at a specified position function showVideo() { local position=$1 local dimensions local width local height local x local y dimensions=$(getScreenDimensions "${SCREEN_NUMBER}") width=$(echo "$dimensions" | cut -d'x' -f1) height=$(echo "$dimensions" | cut -d'x' -f2) case $position in "topleft") x=30 y=30 ;; "topright") x=$(expr $width - 320 - 30) y=30 ;; "bottomleft") x=30 y=$(expr $height - 240 - 30) ;; "bottomright") x=$(expr $width - 320 - 30) y=$(expr $height - 240 - 30) ;; *) echo "Invalid position specified" return 1 ;; esac mplayer -zoom -ontop -noborder -nosound -vo gl:nomanyfmts \ -geometry 320x240+"${x}"+"${y}" -vf mirror tv:// -tv driver=v4l2:device="/dev/${DEVICE}" -screen "${SCREEN_NUMBER}" & disown } # stop videos playing function stopVideo() { pkill mplayer sleep 1 } # start program main