termclock revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek#!/bin/ksh93
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek#
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# CDDL HEADER START
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek#
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# The contents of this file are subject to the terms of the
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# Common Development and Distribution License (the "License").
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# You may not use this file except in compliance with the License.
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek#
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# or http://www.opensolaris.org/os/licensing.
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# See the License for the specific language governing permissions
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# and limitations under the License.
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek#
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# When distributing Covered Code, include this CDDL HEADER in each
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# If applicable, add the following below this CDDL HEADER, with the
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# fields enclosed by brackets "[]" replaced with your own identifying
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# information: Portions Copyright [yyyy] [name of copyright owner]
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek#
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# CDDL HEADER END
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek#
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek#
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# Use is subject to license terms.
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek#
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# ident "%Z%%M% %I% %E% SMI"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek#
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek#
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# termclock - a simple analog clock for terminals
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek#
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# Solaris needs /usr/xpg4/bin/ because the tools in /usr/bin are not POSIX-conformant
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekexport PATH=/usr/xpg4/bin:/bin:/usr/bin
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekfunction fatal_error
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek{
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek print -u 2 "${progname}: $@"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek exit 1
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek}
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# cache tput values (to avoid |fork()|'ing a "tput" child every second)
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekfunction tput_cup
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek{
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek integer y="$1" x="$2"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek nameref c=tput_cup_cache["${y}_${x}"]
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek if [ "$c" == "" ] ; then
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek # fast path for known terminal types
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek if [[ ${TERM} = ~(Elr)(vt100|vt220|xterm|xterm-color|dtterm) ]] ; then
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek c="$(printf "\E[%d;%dH" $((y+1)) $((x+1)))"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek else
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek c="$(tput cup $y $x)"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek fi
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek fi
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek print -n "$c"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek}
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekfunction draw_clock
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek{
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek float angle a
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek float x y
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek for(( angle=0.0 ; angle < 360. ; angle+=6 )) ; do
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek (( a=angle/360.*(2*M_PI) ))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek (( x=clock.len_x*cos(a) ))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek (( y=clock.len_y*sin(a) ))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek tput_cup $(( y+clock.middle_y )) $(( x+clock.middle_x ))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek # add "mark" every 30 degrees
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek if (( int(angle)%30 == 0 )) ; then
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek print -n "0"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek else
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek print -n "x"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek fi
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek done
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek}
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekfunction draw_hand
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek{
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek float angle="$1" a
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek typeset ch="$2"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek float length="$3"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek float x y
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek (( a=angle/360.*(2*M_PI) ))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek for(( s=0.0 ; s < 10. ; s+=0.5 )) ; do
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek (( x=(clock.len_x*(s/10.)*(length/100.))*cos(a) ))
0fbce082b59df2738e0c893f5251cb0116e1835bBill Cole (( y=(clock.len_y*(s/10.)*(length/100.))*sin(a) ))
0fbce082b59df2738e0c893f5251cb0116e1835bBill Cole
0fbce082b59df2738e0c893f5251cb0116e1835bBill Cole tput_cup $(( y+clock.middle_y )) $(( x+clock.middle_x ))
0fbce082b59df2738e0c893f5251cb0116e1835bBill Cole print -n "${ch}"
0fbce082b59df2738e0c893f5251cb0116e1835bBill Cole done
0fbce082b59df2738e0c893f5251cb0116e1835bBill Cole}
0fbce082b59df2738e0c893f5251cb0116e1835bBill Cole
0fbce082b59df2738e0c893f5251cb0116e1835bBill Colefunction draw_clock_hand
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek{
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek nameref hand=$1
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek draw_hand $(( 360.*(hand.val/hand.scale)-90. )) "${hand.ch}" ${hand.length}
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek}
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekfunction clear_clock_hand
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek{
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek nameref hand=$1
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek draw_hand $(( 360.*(hand.val/hand.scale)-90. )) " " ${hand.length}
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek}
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekfunction main_loop
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek{
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek typeset c
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek # note: we can't use subshells when writing to the double-buffer file because this
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek # will render the tput value cache useless
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek while true ; do
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek if ${init_screen} ; then
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek init_screen="false"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek # "resize" is needed because older versions of ksh93 may have
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek # trouble with getting the right terminal size at startup
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek [ -x "/usr/X11/bin/resize" ] && eval "$(/usr/X11/bin/resize -u)" ||
401f3220d46a92cb6003eb2149a978ed239dee5fJosef 'Jeff' Sipek [ -x "/usr/X11R6/bin/resize" ] && eval "$(/usr/X11R6/bin/resize -u)" ||
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek [ -x "/usr/openwin/bin/resize" ] && eval "$(/usr/openwin/bin/resize -u)" ||
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek fatal_error "resize not found."
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek (( clock.middle_x=COLUMNS/2.-.5 ))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek (( clock.middle_y=LINES/2.-.5 ))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek (( clock.len_x=COLUMNS/2-2 ))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek (( clock.len_y=LINES/2-2 ))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek {
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek clear
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek draw_clock
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek } >&6
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek fi
401f3220d46a92cb6003eb2149a978ed239dee5fJosef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek {
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek (( $(date +"hours.val=%H , minutes.val=%M , seconds.val=%S") ))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek # small trick to get a smooth "analog" flair
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek (( hours.val+=minutes.val/60. ))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek (( minutes.val+=seconds.val/60. ))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek draw_clock_hand seconds
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek draw_clock_hand minutes
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek draw_clock_hand hours
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek # move cursor to home position
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek tput_cup 0 0
401f3220d46a92cb6003eb2149a978ed239dee5fJosef 'Jeff' Sipek } >&6
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek 6<#((0))
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek cat <&6
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek 6<&- ; rm -f "${scratchfile}" ; exec 6<>"${scratchfile}"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek c="" ; read -t ${update_interval} -n 1 c
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek if [ "$c" != "" ] ; then
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek case "$c" in
401f3220d46a92cb6003eb2149a978ed239dee5fJosef 'Jeff' Sipek ~(Ei)q | $'\E') return 0 ;;
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek esac
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek fi
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek {
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek clear_clock_hand hours
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek clear_clock_hand minutes
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek clear_clock_hand seconds
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek } >&6
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek done
401f3220d46a92cb6003eb2149a978ed239dee5fJosef 'Jeff' Sipek}
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekfunction usage
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek{
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek OPTIND=0
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek getopts -a "${progname}" "${USAGE}" OPT '-?'
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek exit 2
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek}
401f3220d46a92cb6003eb2149a978ed239dee5fJosef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# program start
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekprogname="${0}"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekbuiltin date
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekbuiltin rm
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekbuiltin printf
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipektypeset -A tput_cup_cache
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekfloat -r M_PI=3.14159265358979323846
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekclock=(
401f3220d46a92cb6003eb2149a978ed239dee5fJosef 'Jeff' Sipek float middle_x
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek float middle_y
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek integer len_x
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek integer len_y
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek)
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipektypeset init_screen="true"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# set clock properties
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekseconds=( float val
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek typeset ch
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek float scale
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek integer length )
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekminutes=( float val
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek typeset ch
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek float scale
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek integer length )
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekhours=( float val
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek typeset ch
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek float scale
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek integer length )
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekseconds.length=90 seconds.scale=60 seconds.ch="s"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekminutes.length=75 minutes.scale=60 minutes.ch="m"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekhours.length=50 hours.scale=12 hours.ch="h"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekfloat update_interval=0.9
d61f31663f3debf9e49d1e0d8ef3c9fb13aad6c4Martti Rannanjärvi
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' SipekUSAGE=$'
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek[-?
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek@(#)\$Id: termclock (Roland Mainz) 2007-06-05 \$
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek]
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek[+NAME?termclock - analog clock for terminals]
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek[+DESCRIPTION?\btermclock\b is an analog clock for terminals.
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek The termclock program displays the time in analog or digital
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek form. The time is continuously updated at a frequency which
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek may be specified by the user.]
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek[u:update?Update interval (defaults to 0.9 seconds).]:[interval]
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek[+SEE ALSO?\bksh93\b(1), \bxclock\b(1)]
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek'
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekwhile getopts -a "${progname}" "${USAGE}" OPT ; do
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek case ${OPT} in
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek u) update_interval=${OPTARG} ;;
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek *) usage ;;
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek esac
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekdone
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekshift ${OPTIND}-1
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
debc93e622751c6c09e8105e504c5833f1ca0d6dMartti Rannanjärvi# prechecks
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekwhich tput >/dev/null || fatal_error "tput not found."
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekwhich mktemp >/dev/null || fatal_error "mktemp not found."
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek(( update_interval < 0. || update_interval > 7200. )) && fatal_error "invalid update_interval value."
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# create temporary file for double-buffering and register an EXIT trap
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# to remove this file when the shell interpreter exits
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekscratchfile="$(mktemp /tmp/termclock.pid$$.XXXXXX)"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekif [ -z "${scratchfile}" ]; then exit 1; fi
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipektrap 'rm -f "${scratchfile}"' EXIT
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekrm -f "${scratchfile}" ; exec 6<>"${scratchfile}"
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# regiter trap to handle window size changes
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipektrap 'init_screen="true"' WINCH
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipekmain_loop
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# exiting - put cursor below clock
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipektput_cup $((LINES-2)) 0
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek# EOF.
c9d76e2baf653fa5504d6849e5c1aae32eff3c53Josef 'Jeff' Sipek