From f9a2a21830b0ea5f803c17cae56573a6b18e43db Mon Sep 17 00:00:00 2001 From: Chris Koeritz Date: Sun, 22 Jan 2017 10:55:23 -0500 Subject: [PATCH] redoing terminal title code really hated the ad hoc scheme for doing this before, so have moved everything into a terminal_titler file. also have implemented a stack of titles, since you never know how many things have gone on before you; just one title is not enough for a cascade of operations that could possibly set titles. --- customize/fred/scripts/ssh.sh | 41 ++------- scripts/core/functions.sh | 17 ++-- scripts/core/launch_feisty_meow.sh | 19 ++-- scripts/tty/label_terminal_with_infos.sh | 27 ------ scripts/tty/set_term_title.sh | 14 --- scripts/tty/terminal_titler.sh | 105 +++++++++++++++++++++++ 6 files changed, 127 insertions(+), 96 deletions(-) delete mode 100644 scripts/tty/label_terminal_with_infos.sh delete mode 100644 scripts/tty/set_term_title.sh create mode 100644 scripts/tty/terminal_titler.sh diff --git a/customize/fred/scripts/ssh.sh b/customize/fred/scripts/ssh.sh index 7b84d6be..3c77a5ac 100644 --- a/customize/fred/scripts/ssh.sh +++ b/customize/fred/scripts/ssh.sh @@ -1,22 +1,15 @@ #!/bin/bash -# wraps our calling the secure shell and lets us pick our credentials. +# wraps calling the secure shell to let us pick our appropriate credentials. -source "$FEISTY_MEOW_LOADING_DOCK/custom/scripts/pick_credentials.sh" - -if [ -z "$PRIOR_TERMINAL_TITLE" ]; then - # save the former terminal title if we're running in X with xterm. -# PRIOR_TERMINAL_TITLE= - which xprop &>/dev/null - if [ $? -eq 0 ]; then - if [[ "$TERM" =~ .*"xterm".* ]]; then - PRIOR_TERMINAL_TITLE="$(xprop -id $WINDOWID | perl -nle 'print $1 if /^WM_NAME.+= \"(.*)\"$/')" +source "$FEISTY_MEOW_SCRIPTS/tty/terminal_titler.sh" -echo "no prior title record existed, so saving prior title as '$PRIOR_TERMINAL_TITLE'" +#hmmm: is this still used??? +# it seems redundant with the ssh config file that says which creds to use. +source "$FEISTY_MEOW_LOADING_DOCK/custom/scripts/pick_credentials.sh" - fi - fi -fi +# remember the old title. +save_terminal_title # force the TERM variable to a more generic version for other side. # we don't want the remote side still thinking it's running xterm. @@ -30,27 +23,9 @@ export TERM=linux if [ ! -z "$keyfile" ]; then \ssh -i "$keyfile" -X -C $* -#-c blowfish-cbc else \ssh -X -C $* -#-c blowfish-cbc -fi - -if [ $? -eq 0 ]; then - # we don't want to emit anything extra if this is being driven by git. - if [ -z "$(echo $* | grep git)" ]; then - # re-run the terminal labeller after coming back from ssh. - # we check the exit value because we don't want to update this for a failed connection. - if [ -z "$PRIOR_TERMINAL_TITLE" ]; then -echo prior title nil new label - bash $FEISTY_MEOW_SCRIPTS/tty/label_terminal_with_infos.sh - else -echo "using prior title of '$PRIOR_TERMINAL_TITLE'" - bash $FEISTY_MEOW_SCRIPTS/tty/set_term_title.sh "$PRIOR_TERMINAL_TITLE" - # remove the value for this, since we did our job on it. - unset PRIOR_TERMINAL_TITLE - fi - fi fi +restore_terminal_title diff --git a/scripts/core/functions.sh b/scripts/core/functions.sh index b99c1034..1cdcac41 100644 --- a/scripts/core/functions.sh +++ b/scripts/core/functions.sh @@ -315,22 +315,19 @@ if [ -z "$skip_all" ]; then # or at least suse doesn't, which is the other one we've tested on. /bin/su -l $* fi - -#NO! # relabel the console after returning. -#NO! bash $FEISTY_MEOW_SCRIPTS/tty/label_terminal_with_infos.sh -# fix this to set the old title back in place! - } # sudo function wraps the normal sudo by ensuring we replace the terminal # label if they're doing an su with the sudo. function sudo() { - local first_command="$1" +# local first_command="$1" + save_terminal_title /usr/bin/sudo "$@" - if [ "$first_command" == "su" ]; then - # yep, they were doing an su, but they're back now. - bash $FEISTY_MEOW_SCRIPTS/tty/label_terminal_with_infos.sh - fi + restore_terminal_title +# if [ "$first_command" == "su" ]; then +# # yep, they were doing an su, but they're back now. +# label_terminal_with_info +# fi } # trashes the .#blah files that cvs and svn leave behind when finding conflicts. diff --git a/scripts/core/launch_feisty_meow.sh b/scripts/core/launch_feisty_meow.sh index 9bbcec14..d7bbe30f 100644 --- a/scripts/core/launch_feisty_meow.sh +++ b/scripts/core/launch_feisty_meow.sh @@ -65,6 +65,9 @@ source $FEISTY_MEOW_SCRIPTS/core/variables.sh # having migrated from korn shell...). source "$FEISTY_MEOW_SCRIPTS/core/functions.sh" +# load some helper methods for the terminal which we'll use below. +source "$FEISTY_MEOW_SCRIPTS/tty/terminal_titler.sh" + ############## # check hash table before searching path. @@ -103,18 +106,10 @@ if [ -z "$LIGHTWEIGHT_INIT" ]; then source "$FEISTY_MEOW_LOADING_DOCK/fmc_core_and_custom_aliases.sh" fi -## disabled since we don't think is needed any more, and it's just an -## attack surface if the other users on the host are not trusted. -# # allow connections to our x server from the local host. -# if [ ! -z "$DISPLAY" ]; then -# if [ ! -z "$(echo "$OS_TYPE" | grep -i darwin)" ]; then -# if [ ! -z "$SHELL_DEBUG" ]; then echo "Enabling localhost X connections..."; fi -# xhost + localhost >/dev/null 2>&1 -# fi -# fi - - # a minor tickle of the title of the terminal, in case there is one. - bash $FEISTY_MEOW_SCRIPTS/tty/label_terminal_with_infos.sh + # a minor tickle of the title of the terminal, unless we already have some history. + if ptt_stack_empty; then + label_terminal_with_info + fi if [ ! -z "$SHELL_DEBUG" ]; then echo "heavyweight init is done."; fi fi diff --git a/scripts/tty/label_terminal_with_infos.sh b/scripts/tty/label_terminal_with_infos.sh deleted file mode 100644 index 291eafd4..00000000 --- a/scripts/tty/label_terminal_with_infos.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# this script makes a new title for the terminal window that matches the -# hostname and some other details. - -source $FEISTY_MEOW_SCRIPTS/core/functions.sh - -# we only label the terminal anew if there's no saved title. - -#hmmm: how about putting that title back in place? -# we currently do this manually in places, like ssh, which is dumb. - - -if [ -z "$PRIOR_TERMINAL_TITLE" ]; then - pruned_host=$(echo $HOSTNAME | sed -e 's/^\([^\.]*\)\..*$/\1/') - date_string=$(date +"%Y %b %e @ %T") - - user=$USER - if [ -z "$user" ]; then - # try snagging the windoze name. - user=$USERNAME - fi - - new_title="-- $user@$pruned_host -- [$date_string]" - - bash "$FEISTY_MEOW_SCRIPTS/tty/set_term_title.sh" "$new_title" -fi diff --git a/scripts/tty/set_term_title.sh b/scripts/tty/set_term_title.sh deleted file mode 100644 index 69c179a0..00000000 --- a/scripts/tty/set_term_title.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -# terminal labeller: sets the current terminal's title to the arguments -# specified on the command line, or if those are blank, set the title to -# the hostname. - -title="$*" -if [ -z "${title}" ]; then - title="$(hostname)" -fi -#echo title will be $title - -echo -n -e "\033]0;${title}\007" - diff --git a/scripts/tty/terminal_titler.sh b/scripts/tty/terminal_titler.sh new file mode 100644 index 00000000..3c01d611 --- /dev/null +++ b/scripts/tty/terminal_titler.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +source $FEISTY_MEOW_SCRIPTS/core/functions.sh + +# just saying this is an array... +declare -a PRIOR_TERMINAL_TITLES +# set the stack position if not already set. +if [ -z "$PTT_STACK_INDEX" ]; then + # this variable records where we will push new items on the stack. + PTT_STACK_INDEX=0 +fi + +# adds an entry into the stack of terminal titles. +function push_ptt_stack() +{ + PRIOR_TERMINAL_TITLES[$PTT_STACK_INDEX]="$*" +echo now list has: +echo ${PRIOR_TERMINAL_TITLES[@]} + ((PTT_STACK_INDEX++)) +echo stack index incremented and now at $PTT_STACK_INDEX +} + +function pop_ptt_stack() +{ + if [ $PTT_STACK_INDEX -le 0 ]; then + echo nothing to pop from prior terminal titles stack. + else + ((PTT_STACK_INDEX--)) +echo stack index decremented and now at $PTT_STACK_INDEX + CURRENT_TERM_TITLE="${PRIOR_TERMINAL_TITLES[$PTT_STACK_INDEX]}" + fi +} + +# returns okay (0) if the stack is empty, or non-zero if not empty. +function ptt_stack_empty() +{ + test $PTT_STACK_INDEX -le 0 +} + +# puts a specific textual label on the terminal title bar. +# this doesn't consider any previous titles; it just labels the terminal. +# the title may not be visible in some window managers. +function set_terminal_title() +{ + title="$*" + # if we weren't given a title, then use just the hostname. this is the degraded functionality. + if [ -z "${title}" ]; then + title="$(hostname)" + fi + echo -n -e "\033]0;${title}\007" +} + +# reads the current terminal title, if possible, and saves it to our stack of titles. +function save_terminal_title() +{ + # save the former terminal title if we're running in X with xterm. + which xprop &>/dev/null + if [ $? -eq 0 ]; then + if [[ "$TERM" =~ .*"xterm".* ]]; then + local prior_title="$(xprop -id $WINDOWID | perl -nle 'print $1 if /^WM_NAME.+= \"(.*)\"$/')" +echo "saving prior terminal title as '$prior_title'" + push_ptt_stack "$prior_title" + fi + fi +} + +# using our stored terminal title, this replaces the title on the terminal. +function restore_terminal_title() +{ +# we don't want to emit anything extra if this is being driven by git. +#hmmm... this could be a problem? +# if [ -z "$(echo $* | grep git)" ]; then + + # run the terminal labeller to restore the prior title, if there was one. + if ptt_stack_empty; then +echo prior titles were empty, so doing nothing. + else + pop_ptt_stack +echo "restoring prior terminal title of '$CURRENT_TERM_TITLE'" + set_terminal_title "$CURRENT_TERM_TITLE" + fi +} + +# sets a title for the terminal with the hostname and other details. +function label_terminal_with_info() +{ + # we only label the terminal anew if there's no saved title. +# if [ -z "$PRIOR_TERMINAL_TITLE" ]; then + if ptt_stack_empty; then + pruned_host=$(echo $HOSTNAME | sed -e 's/^\([^\.]*\)\..*$/\1/') + date_string=$(date +"%Y %b %e @ %T") + user=$USER + if [ -z "$user" ]; then + # try snagging the windoze name. + user=$USERNAME + fi + new_title="-- $user@$pruned_host -- [$date_string]" + set_terminal_title "$new_title" + else + # restore the former title. + restore_terminal_title + fi +} + + -- 2.34.1