redoing terminal title code
authorChris Koeritz <fred@gruntose.com>
Sun, 22 Jan 2017 15:55:23 +0000 (10:55 -0500)
committerChris Koeritz <fred@gruntose.com>
Sun, 22 Jan 2017 15:55:23 +0000 (10:55 -0500)
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
scripts/core/functions.sh
scripts/core/launch_feisty_meow.sh
scripts/tty/label_terminal_with_infos.sh [deleted file]
scripts/tty/set_term_title.sh [deleted file]
scripts/tty/terminal_titler.sh [new file with mode: 0644]

index 7b84d6bea0b60cc2f971ee6120d0459d925b822c..3c77a5ac1ddaa26e6969b49ae62679daaed6e5a9 100644 (file)
@@ -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
 
index b99c1034904492bd36e71e36c15cb3b9a72d042c..1cdcac4175137ebdaed6fe0b234ad034a3d8ee72 100644 (file)
@@ -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.
index 9bbcec146ac265972b2ef78acd169b6d7512e29c..d7bbe30f761fdb33a3e4946c9fc7631cc64e919f 100644 (file)
@@ -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 (file)
index 291eafd..0000000
+++ /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 (file)
index 69c179a..0000000
+++ /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 (file)
index 0000000..3c01d61
--- /dev/null
@@ -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
+}
+
+