#!/bin/bash
# $Id: screenie,v 1.4 2009/09/02 16:12:09 matyas Exp matyas $
# @(#) SCREENIE - SCREEN(1) session handler (wrapper)
#
# 1996/03/28 - written by Marc O. Gloor <mgloor@fhzh.ch>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA

#global settings
TMPF=$(mktemp /tmp/.screenie.XXXXXX)
SCREENRC=${SCREENRC:-${DOTDIR:-$HOME}/.screenrc}
ATTACHED_SCREENS="screen \-ls | awk '/Attached/ { print \$1}' | sort -g"
DETACHED_SCREENS="screen \-ls | awk '/Detached/ { print \$1}' | sort -g"
i=0
e=0

# starting jobs from commandline
fork_jobs() {
  # starting screen job
  env OUTER_TERM=$TERM screen -S $sname -dm $pjob
}

about_msg() {
  clear
  echo ""
  echo " SCREENIE - terminal screen-session handler" 
  echo " written by Marc O. Gloor <mgloor@fhzh.ch>" 
  echo " (local changes -matyas)"
  echo ""
}

add_job() {
    echo -n " session name: " && read sname
    echo -n " job: " && read pjob
    trsname=$(echo $sname | tr -c '[:alnum:]\n' '[_*]')
    scrcmd="env OUTER_TERM=$TERM screen -m -c $SCREENRC"
    (
        [[ $TERM == rxvt-unicode-256color ]] && export TERM=rxvt-unicode
        [[ -n $sname ]] && {
            scrcmd="$scrcmd -S $trsname"
            export SNAME=$sname
        }
        [[ -n $pjob ]] && scrcmd="$scrcmd -d $pjob"
        $scrcmd
    )
}

case "$1" in
  -v) echo \$Revision: 1.4 $ | tr -d "$" && exit 0 ;;  # don't touch rcs ID
  -j) sname=$(echo $2) ;
      sname=$(echo $sname | tr -c '[:alnum:]\n' '[_*]') ;
      pjob=$(echo $3) ;
      pjob=$(echo $pjob) ;
      fork_jobs ; exit 0 ;;
esac

#cleanup temp files
rm -f /tmp/.screenie* >/dev/null 2>&1   

ds=`eval $DETACHED_SCREENS`

if [ -z "$ds" ] ; then
    add_job
    echo ""
    exit
fi

while :; do
  about_msg
  
  echo "Attached: "
  eval $ATTACHED_SCREENS | (
      while read sessions; do
        #e=`expr \( $e + 1 \)` && echo -n " $e) "
        echo -n "    "
        echo $sessions 
      done
  )
  echo ""
  echo "Detached: "
  eval $DETACHED_SCREENS | (
      while read sessions; do
        e=`expr \( $e + 1 \)` && echo -n " $e) "
        echo $sessions 
      done
  )
  
  echo ""
  echo " a) add job"
  echo " q) quit"
  echo ""
  echo -n " select: "
  read ANSW
  
  case $ANSW in
    (A|a) 
      add_job ;;
    (0|Q|q) 
      echo ""; exit ;;
  esac  
  
  eval "$DETACHED_SCREENS" | (
  
  while read pat; do
      # display screen session menu no. (int)
      i=`expr \( $i + 1 \)` && echo -n " $i) " >/dev/null 2>&1 
      
      # set internal session 'no sessionid' var (string)
      sess_id=$(echo $pat|awk 'split($0, token, ".") {print token[1]}')
      k=$(echo -n  $i" "$sess_id)
    
      m=$(echo $k | awk '{print $1}')
      n=$(echo $k | awk '{print $2}')	
    
      case $ANSW in
        ($m) echo $n > $TMPF ; break;
      esac
      
    done
  )

  screen -r $(cat $TMPF 2>&1) >/dev/null 2>&1 
  rm -f $TMPF >/dev/null 2>&1
done

exit 0
#eof
