diff options
author | toonn <toonn@toonn.io> | 2020-03-02 20:55:17 +0100 |
---|---|---|
committer | toonn <toonn@toonn.io> | 2020-03-02 21:28:23 +0100 |
commit | 1cdcce0a44d031be13009a70e25cc4cf75789eac (patch) | |
tree | fcc61d6b52086fa156268d07f3bcf22f51cd341f | |
parent | a478511e8fd215ad878627d2516cb9253a2ab12f (diff) | |
download | ranger-1cdcce0a44d031be13009a70e25cc4cf75789eac.tar.gz |
Change approach to multiplexer title renaming
There were a couple bugs causing ranger to miss opportunities to restore multiplexer window names in tmux. Fixes #1805
-rw-r--r-- | ranger/gui/ui.py | 99 |
1 files changed, 58 insertions, 41 deletions
diff --git a/ranger/gui/ui.py b/ranger/gui/ui.py index 5ffdf4a4..dc4379ac 100644 --- a/ranger/gui/ui.py +++ b/ranger/gui/ui.py @@ -9,6 +9,7 @@ import threading import curses from subprocess import CalledProcessError +from ranger.ext.get_executables import get_executables from ranger.ext.keybinding_parser import KeyBuffer, KeyMaps, ALT_KEY from ranger.ext.lazy_property import lazy_property from ranger.ext.signals import Signal @@ -49,6 +50,16 @@ def _setup_mouse(signal): curses.mousemask(0) +def _in_tmux(): + return ('TMUX' in os.environ + and 'tmux' in get_executables()) + + +def _in_screen(): + return ('screen' in os.environ['TERM'] + and 'screen' in get_executables()) + + class UI( # pylint: disable=too-many-instance-attributes,too-many-public-methods DisplayableContainer): ALLOWED_VIEWMODES = 'miller', 'multipane' @@ -73,8 +84,8 @@ class UI( # pylint: disable=too-many-instance-attributes,too-many-public-method self.multiplexer = None self._draw_title = None self._tmux_automatic_rename = None - self._tmux_title = None - self._screen_title = None + self._multiplexer_title = None + self._multiplexer_title = None self.browser = None if fm is not None: @@ -469,58 +480,64 @@ class UI( # pylint: disable=too-many-instance-attributes,too-many-public-method # Handles window renaming behaviour of the terminal multiplexers # GNU Screen and Tmux def handle_multiplexer(self): - if self.settings.update_tmux_title: - if 'TMUX' in os.environ: - # Stores the automatic-rename setting - # prints out a warning if the allow-rename in tmux is not set - tmux_allow_rename = check_output( - ['tmux', 'show-window-options', '-v', - 'allow-rename']).strip() - if tmux_allow_rename == 'off': - self.fm.notify('Warning: allow-rename not set in Tmux!', - bad=True) - elif self._tmux_title is None: - self._tmux_title = check_output( - ['tmux', 'display-message', '-p', '#W']).strip() - else: + if (self.settings.update_tmux_title and not self._multiplexer_title): + try: + if _in_tmux(): + # Stores the automatic-rename setting + # prints out a warning if allow-rename isn't set in tmux try: + tmux_allow_rename = check_output( + ['tmux', 'show-window-options', '-v', + 'allow-rename']).strip() + except CalledProcessError: + tmux_allow_rename = 'off' + if tmux_allow_rename == 'off': + self.fm.notify('Warning: allow-rename not set in Tmux!', + bad=True) + else: + self._multiplexer_title = check_output( + ['tmux', 'display-message', '-p', '#W']).strip() self._tmux_automatic_rename = check_output( ['tmux', 'show-window-options', '-v', 'automatic-rename']).strip() if self._tmux_automatic_rename == 'on': check_output(['tmux', 'set-window-option', 'automatic-rename', 'off']) - except CalledProcessError: - pass - elif 'screen' in os.environ['TERM'] and self._screen_title is None: - # Stores the screen window name before renaming it - # gives out a warning if $TERM is not "screen" - try: - self._screen_title = check_output( - ['screen', '-Q', 'title'], shell=True).strip() - except CalledProcessError: - self._screen_title = None + elif _in_screen(): + # Stores the screen window name before renaming it + # gives out a warning if $TERM is not "screen" + self._multiplexer_title = check_output( + ['screen', '-Q', 'title']).strip() + except CalledProcessError: + self.fm.notify("Couldn't access previous multiplexer window" + " name, won't be able to restore.", + bad=False) + if not self._multiplexer_title: + self._multiplexer_title = os.environ.get( + "SHELL", + "shell").split("/")[-1] sys.stdout.write("\033kranger\033\\") sys.stdout.flush() # Restore window name def restore_multiplexer_name(self): - try: - if 'TMUX' in os.environ: - if self._tmux_automatic_rename: - check_output(['tmux', 'set-window-option', - 'automatic-rename', - self._tmux_automatic_rename]) - else: - check_output(['tmux', 'set-window-option', '-u', - 'automatic-rename']) - if self._tmux_title: - check_output(['tmux', 'rename-window', self._tmux_title]) - elif 'screen' in os.environ['TERM'] and self._screen_title: - check_output(['screen', '-X', 'title', self._screen_title]) - except CalledProcessError: - self.fm.notify("Could not restore window-name!", bad=True) + if self._multiplexer_title: + try: + if _in_tmux(): + if self._tmux_automatic_rename: + check_output(['tmux', 'set-window-option', + 'automatic-rename', + self._tmux_automatic_rename]) + else: + check_output(['tmux', 'set-window-option', '-u', + 'automatic-rename']) + except CalledProcessError: + self.fm.notify("Could not restore multiplexer window name!", + bad=True) + + sys.stdout.write("\033k{}\033\\".format(self._multiplexer_title)) + sys.stdout.flush() def hint(self, text=None): self.status.hint = text |