Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion terminatorlib/terminal_popup_menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

from .version import APP_NAME
from .translation import _
from .terminator import Terminator
from .terminator import LAST_SESSION_LAYOUT, Terminator
from .util import err, dbg, spawn_new_terminator
from .config import Config
from .prefseditor import PrefsEditor
Expand Down Expand Up @@ -337,6 +337,7 @@ def show(self, widget, event=None):
item.connect('activate', terminal.force_set_profile, profile)
submenu.append(item)

self.add_session_menu(menu, terminal)
self.add_layout_launcher(menu)

try:
Expand Down Expand Up @@ -420,6 +421,24 @@ def add_layout_launcher(self, menu):
item.set_submenu(submenu)
layouts = self.config.list_layouts()
for layout in layouts:
if layout == LAST_SESSION_LAYOUT:
continue
item = Gtk.MenuItem(layout)
item.connect('activate', lambda x: spawn_new_terminator(self.terminator.origcwd, ['-u', '-l', x.get_label()]))
submenu.append(item)

def add_session_menu(self, menu, terminal):
"""Add session save and restore actions to the menu."""
item = Gtk.MenuItem.new_with_mnemonic(_('_Session'))
menu.append(item)
submenu = Gtk.Menu()
item.set_submenu(submenu)

item = Gtk.MenuItem.new_with_mnemonic(_('_Save session'))
item.connect('activate', self.terminator.save_session_layout)
submenu.append(item)

item = Gtk.MenuItem.new_with_mnemonic(_('_Restore session'))
item.connect('activate', self.terminator.restore_session_layout,
terminal.get_toplevel())
submenu.append(item)
33 changes: 33 additions & 0 deletions terminatorlib/terminator.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
from .factory import Factory
from .translation import _

LAST_SESSION_LAYOUT = '__last_session__'

try:
from gi.repository import GdkX11
except ImportError:
Expand Down Expand Up @@ -117,6 +119,37 @@ def set_dbus_data(self, dbus_service):
self.dbus_name = dbus_service.bus_name.get_name()
self.dbus_path = dbus_service.bus_path

def save_session_layout(self, *args):
"""Persist the current layout, including each terminal cwd."""
if self.doing_layout:
return

layout = self.describe_layout(save_cwd=True)
if not layout:
return

if not self.config.replace_layout(LAST_SESSION_LAYOUT, layout):
self.config.add_layout(LAST_SESSION_LAYOUT, layout)
self.config.save()

def restore_session_layout(self, _widget=None, window=None):
"""Replace a window with the saved session layout."""
if LAST_SESSION_LAYOUT not in self.config.list_layouts():
err('no saved session layout found')
return

old_window = window if window in self.windows else None

try:
self.create_layout(LAST_SESSION_LAYOUT)
self.layout_done()
except (KeyError, ValueError) as ex:
err('session layout restore failed: %s' % ex)
return

if old_window:
old_window.destroy()

def get_windows(self):
"""Return a list of windows"""
return self.windows
Expand Down