#!/bin/bash
# -*- Mode:Shell-script; Coding:us-ascii-unix; fill-column:158 -*-
################################################################################################################################################################
##
# @file      mjrclip.sh
# @author    Mitch Richling <https://www.mitchr.me>
# @brief     Copy data between STDIN, STDOUT, X clipboard, and screen buffer file.@EOL
# @keywords  x11 
# @std       bash
# @copyright 
#  @parblock
#  Copyright (c) 1997,2002,2014,2015, Mitchell Jay Richling <https://www.mitchr.me> All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
#
#  1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer.
#
#  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation
#     and/or other materials provided with the distribution.
#
#  3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without
#     specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
#  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
#  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
#  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#  @endparblock
################################################################################################################################################################

################################################################################################################################################################
# Help text
useInfo=''
useInfo="$useInfo Copy data between STDIN, STDOUT, X clipboard, and screen buffer file "$'\n'
useInfo="$useInfo                                                                      "$'\n'
useInfo="$useInfo Use: mjr-xclip.sh <COMMAND>                                          "$'\n'
useInfo="$useInfo   Commands:                                                          "$'\n'
useInfo="$useInfo         x2so : X clipboard --------> Standard Output                 "$'\n'
useInfo="$useInfo         si2x : Standard Input -----> X clipboard                     "$'\n'
useInfo="$useInfo         x2sb : X clipboard --------> Screen Buffer file              "$'\n'
useInfo="$useInfo         sb2x : Screen Buffer file -> X clipboard                     "$'\n'
useInfo="$useInfo        si2sb : Standard Input -----> Screen Buffer file              "$'\n'
useInfo="$useInfo        sb2so : Screen Buffer file -> Standard Output                 "$'\n'

################################################################################################################################################################
# Find xclip or xsel if we are going to need it
if [ "$1" = 'x2so' -o "$1" = 'si2x' -o "$1" = 'x2sb' -o "$1" = 'sb2x' ] ; then
  xclipPath=`which xclip`
  xselPath=`which xsel`
  if [ -x "$xclipPath" -o -x "$xselPath" ] ; then
    if [ -x "$xclipPath" ] ; then
      x2so="$xclipPath -o"
      si2x="$xclipPath"
    else
      x2so="$xselPath -o"
      si2x="$xselPath -i"
    fi
  else
    echo "ERROR: Could not find 'xclip' or 'xsel' binary!!"
  fi
fi

################################################################################################################################################################
# Find screen buffer file if we are going to need it
if [ "$1" = 'x2sb' -o "$1" = 'sb2x' -o "$1" = 'si2sb' -o "$1" = 'sb2so' ] ; then
  bufferfile=`eval echo $(grep '^bufferfile ' ~/.screenrc | cut -c12-)`
  if [ -e "$bufferfile" ] ; then
    if [ "$1" = "sb2x" -o "$1" = "sb2so" ] ; then
      if [ ! -r "$bufferfile" ] ; then
        echo "ERROR: Bufferfile ($bufferfile) was not readable!!"
      fi
    else
      if [ ! -w "$bufferfile" ] ; then
        echo "ERROR: Bufferfile ($bufferfile) was not writable!!"
      fi
    fi
  else
    echo "ERROR: Could not figure out screen buffer file!!"
    echo "ERROR: ~/.screenrc must contain a line like: bufferfile VALUE"
  fi
fi

################################################################################################################################################################
case "$1" in
  'sb2x'  ) cat "$bufferfile" | $si2x ;; # Screen buffer -> X clipboard
  'x2sb'  ) $x2so > "$bufferfile"     ;; # X clipboard   -> Screen buffer
  'x2so'  ) $x2so                     ;; # X clipboard   -> STDOUT
  'si2x'  ) $si2x                     ;; # STDIN         -> X clipboard
  'si2sb' ) cat <&0 > "$bufferfile"   ;; # STDIN         -> Screen buffer
  'sb2so' ) cat "$bufferfile"         ;; # Screen buffer -> STDOUT
  *       ) echo $"$useInfo"          ;; # Print help
esac