dropped terminal title oracle; things are good now
authorChris Koeritz <fred@gruntose.com>
Tue, 30 Oct 2018 15:47:49 +0000 (11:47 -0400)
committerChris Koeritz <fred@gruntose.com>
Tue, 30 Oct 2018 15:47:49 +0000 (11:47 -0400)
we stopped trying to scrape the current terminal title using various types of window magic.  the change from unity and having a WINDOWID defined really screwed us in that; we used to be able to get the exact right title based on our WINDOWID, but once that's missing, there's no reliable way to get the terminal title unless the terminal is in the foreground and focused.  heck with that.
so we're back to our approach of stacking up terminal titles.  this works now, since we have a better approach.  only a simple variable is used, not an array, so we can pass this to subshells reliably.  and the save / restore feature has been kept intact, even though save expects a parameter as the title now.  it just uses the existing item on the top of the stack if no new title is saved, thus preserving the semantics of saving the title.
so far things are looking nice.  it will be nice to decouple this feature of feisty meow from OS changes and screwiness.

scripts/core/functions.sh
scripts/tty/terminal_titler.sh

index a58e818fd5000bee4172a7fcf0f955e8d76d0656..14aa99da59b40fa1dad2387493d3eb4325b98deb 100644 (file)
@@ -187,20 +187,18 @@ if [ -z "$skip_all" ]; then
     # version for the other side (just 'linux'); we don't want the remote side still
     # thinking it's running xterm.
     save_terminal_title
-    if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then
-      echo TERM saved is: $PRIOR_TERMINAL_TITLE
-    fi
+
 #hmmm: why were we doing this?  it scorches the user's logged in session, leaving it without proper terminal handling.
 #    # we save the value of TERM; we don't want to leave the user's terminal
 #    # brain dead once we come back from this function.
 #    local oldterm="$TERM"
 #    export TERM=linux
+
     /usr/bin/ssh -X -C "${args[@]}"
+
 #    # restore the terminal variable also.
 #    TERM="$oldterm"
-    if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then
-      echo TERM before restore, will use prior title of: $PRIOR_TERMINAL_TITLE
-    fi
+
     restore_terminal_title
     if [ ! -z "$DEBUG_FEISTY_MEOW" ]; then
       echo TERM title restored to prior value
index 939c1cce14a7b0f3e1078c59cdbbd2fddc82a7f0..a8c0495b4ca48d7127f8db14756059c5e9be3969 100644 (file)
@@ -4,7 +4,9 @@ source "$FEISTY_MEOW_SCRIPTS/core/functions.sh"
 source "$FEISTY_MEOW_SCRIPTS/core/common.alias"
 
 # uncomment this to get extra noisy debugging.
-#export DEBUG_TERM_TITLE=true
+export DEBUG_TERM_TITLE=true
+
+##############
 
 # puts a specific textual label on the terminal title bar.
 # this doesn't consider any previous titles; it just labels the terminal.
@@ -28,72 +30,61 @@ function apply_title_to_terminal()
   fi
 }
 
-# user friendly version that saves the title being added.
-function set_terminal_title()
+##############
+
+# records the current terminal title, pushing it down on the stack of titles,
+# possibly prior to a new one being used.
+function save_terminal_title()
 {
-  apply_title_to_terminal $*
+  local title="$*"
+
+  if [ -z "$title" ]; then
+echo "empty title: pushing current title again"
+    peek_title_stack
+    title="$LAST_TITLE"
+    if [ -z "$title" ]; then
+      echo "there was no saved title, so we're ignoring the save attempt."
+      return 1
+    fi
+  fi
 
-#tricky attempts to get it to be available when we ask for it in get_terminal_title
-  sync
-#  echo -n
+#hmmm: need a validation step here to remove bad chars that conflict with our title compression scheme.
 
-#  # we're enforcing a new title from here on.
-#  unset PRIOR_TERMINAL_TITLE
-  save_terminal_title
+  # only slap a comma after the existing value if it wasn't empty.
+  if [ -z "$TERMINAL_TITLE_STACK" ]; then
+    export TERMINAL_TITLE_STACK="\"$title\""
+  else
+    export TERMINAL_TITLE_STACK="$TERMINAL_TITLE_STACK,\"$title\""
+  fi
+
+echo new terminal title stack is:
+echo $TERMINAL_TITLE_STACK
 }
 
-# echoes back the current title on the terminal window, if we can acquire it.
-function get_terminal_title()
+# takes a terminal title off the stack and sets the LAST_TITLE variable.
+function pop_title_stack()
 {
-#hmmm: totally failing since gnome doesn't provide the info we need like it should; WINDOWID is empty.
-#hmmm: need to revise this somehow to work around that, but nothing is quite right so far.
-#hmmm: had to disable the xwininfo approach because it's super messy (console noise) and still isn't right (just like xdotool approach wasn't right).
-
-  # this is an important value now; it is checked for in save_terminal_title.
-  local term_title_found="unknown"
-  # save the former terminal title if we're running in X with xterm.
-
-  # are we even running a terminal?
-#hmmm: abstract out that condition below to check against a list of names.
-  if [[ "$TERM" =~ .*"xterm".* ]]; then
-    # check that we have a window ID.
-    if [[ ! -z "$WINDOWID" ]]; then
-      # the window id exists in the variable; can we get its info?
-      if [[ ! -z "$(which xprop)" ]]; then
-        # sweet, we have all the info we need to get this done.
-        term_title_found="$(xprop -id $WINDOWID | perl -nle 'print $1 if /^WM_NAME.+= \"(.*)\"$/')"
-      fi
-    else
-      # gnome-terminal doesn't set WINDOWID currently; we can try to work around this.
-      false
-#hmmm: so far, none of these approaches are any good.
-#      # not good solution; gets wrong titles.  plus uses xdotool which is not installed by default in ubuntu.
-#      if [[ ! -z "$(which xdotool)" ]]; then
-#        term_title_found="$(xprop -id $(xdotool getactivewindow) | perl -nle 'print $1 if /^WM_NAME.+= \"(.*)\"$/')"
-#      fi
-#      # this solution also fails by getting the wrong window title if this one isn't focussed.
-#      if [[ ! -z "$(which xwininfo)" ]]; then
-#        term_title_found=$(xwininfo -id $(xprop -root | awk '/NET_ACTIVE_WINDOW/ { print $5; exit }') | awk -F\" '/xwininfo:/ { print $2; exit }')
-#      fi
-    fi
+  # whack our output variable, just in case.
+  unset LAST_TITLE
+  # get our stack top.
+  peek_title_stack
+  # trim the popped item out of the stack.
+  if [ ! -z "$TERMINAL_TITLE_STACK" ]; then
+    TERMINAL_TITLE_STACK="$(echo $TERMINAL_TITLE_STACK | sed -n -e 's/\(.*\),[^,]*$/\1/p')"
   fi
-  echo -n "$term_title_found"
 }
 
-# reads the current terminal title, if possible, and saves it to our record.
-function save_terminal_title()
+# like pop, but does not change the stack, effectively handing you the most
+# recently set title.
+function peek_title_stack()
 {
-  local title="$(get_terminal_title)"
-  if [ "$title" != "unknown" ]; then
-    # there was a title, so save it.
-    if [ ! -z "$DEBUG_TERM_TITLE" ]; then
-      echo "saving prior terminal title as '$title'"
-    fi
-    export PRIOR_TERMINAL_TITLE="$title"
-  else
-    # the terminal had no title, or we couldn't access it, or there's no terminal.
-    if [ ! -z "$DEBUG_TERM_TITLE" ]; then
-      echo "not saving prior terminal title which was empty"
+  # whack our output variable, just in case.
+  unset LAST_TITLE
+
+  if [ ! -z "$TERMINAL_TITLE_STACK" ]; then
+    LAST_TITLE="$(echo $TERMINAL_TITLE_STACK | sed -n -e 's/.*","\([^,]*\)"$/\1/p')"
+    if [ -z "$LAST_TITLE" ]; then
+      LAST_TITLE="$(echo $TERMINAL_TITLE_STACK | sed -n -e 's/"//gp')"
     fi
   fi
 }
@@ -101,16 +92,15 @@ function save_terminal_title()
 # 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 [ ! -z "$PRIOR_TERMINAL_TITLE" ]; then
+  pop_title_stack
+
+  if [ ! -z "$LAST_TITLE" ]; then
     if [ ! -z "$DEBUG_TERM_TITLE" ]; then
-      echo "restoring prior terminal title of '$PRIOR_TERMINAL_TITLE'"
+      echo "restoring prior terminal title of '$LAST_TITLE'"
+      echo "while new title stack is: $TERMINAL_TITLE_STACK"
     fi
-    apply_title_to_terminal "$PRIOR_TERMINAL_TITLE"
+    apply_title_to_terminal "$LAST_TITLE"
   fi
 }
 
@@ -118,7 +108,7 @@ function restore_terminal_title()
 function label_terminal_with_info()
 {
   # we only label the terminal anew if there's no saved title.
-  if [ -z "$PRIOR_TERMINAL_TITLE" ]; then
+  if [ -z "$TERMINAL_TITLE_STACK" ]; then
     if [ ! -z "$DEBUG_TERM_TITLE" ]; then
       echo "showing new generated title since prior title was empty"
     fi
@@ -131,15 +121,23 @@ function label_terminal_with_info()
     fi
     new_title="-- $user@$pruned_host -- [$date_string]"
     apply_title_to_terminal "$new_title"
-    save_terminal_title
+    save_terminal_title "$new_title"
   else
     # use the former title; paste it back up there just in case.
-    if [ ! -z "$DEBUG_TERM_TITLE" ]; then
-      echo "showing prior terminal title since there was a prior title!"
-      echo "using prior terminal title of '$PRIOR_TERMINAL_TITLE'"
-    fi
-    apply_title_to_terminal "$PRIOR_TERMINAL_TITLE"
+    peek_title_stack
+    apply_title_to_terminal "$LAST_TITLE"
   fi
 }
 
+##############
+
+# user friendly version sets the terminal title and saves the title being added.
+function set_terminal_title()
+{
+  apply_title_to_terminal $*
+  save_terminal_title $*
+}
+
+##############
+