From 63307cb1d860e37e76c13930100cd2651749d3aa Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 17 Apr 2020 08:42:45 +0530 Subject: [PATCH] Code to serialize state --- kitty/tabs.py | 28 ++++++++++++++++++++++++---- kitty/window.py | 16 ++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/kitty/tabs.py b/kitty/tabs.py index 29da0fde4..0406cc3f7 100644 --- a/kitty/tabs.py +++ b/kitty/tabs.py @@ -7,8 +7,8 @@ from collections import deque from contextlib import suppress from functools import partial from typing import ( - Deque, Dict, Generator, Iterator, List, NamedTuple, - Optional, Pattern, Sequence, Tuple, cast + Any, Deque, Dict, Generator, Iterator, List, NamedTuple, Optional, Pattern, + Sequence, Tuple, cast ) from .borders import Borders @@ -25,9 +25,9 @@ from .layout import ( ) from .options_stub import Options from .tab_bar import TabBar, TabBarData +from .typing import SessionTab, SessionType, TypedDict from .utils import log_error, resolved_shell -from .window import Window, WindowDict, Watchers -from .typing import TypedDict, SessionTab, SessionType +from .window import Watchers, Window, WindowDict class TabDict(TypedDict): @@ -157,6 +157,18 @@ class Tab: # {{{ self.new_window(cmd=cmd) self.set_active_window_idx(session_tab.active_window_idx) + def serialize_state(self) -> Dict[str, Any]: + return { + 'version': 1, + 'id': self.id, + 'active_window_idx': self.active_window_idx, + 'windows': [w.serialize_state() for w in self], + 'current_layout': self._current_layout_name, + 'last_used_layout': self._last_used_layout, + 'active_window_history': list(self.active_window_history), + 'name': self.name, + } + @property def active_window_idx(self) -> int: return self._active_window_idx @@ -704,6 +716,14 @@ class TabManager: # {{{ 'active_window_history': list(tab.active_window_history), } + def serialize_state(self) -> Dict[str, Any]: + return { + 'version': 1, + 'id': self.os_window_id, + 'tabs': [tab.serialize_state() for tab in self], + 'active_tab_idx': self.active_tab_idx, + } + @property def active_tab(self) -> Optional[Tab]: return self.tabs[self.active_tab_idx] if self.tabs else None diff --git a/kitty/window.py b/kitty/window.py index 44c2dc7c8..3b4766d26 100644 --- a/kitty/window.py +++ b/kitty/window.py @@ -254,6 +254,22 @@ class Window: foreground_processes=self.child.foreground_processes ) + def serialize_state(self) -> Dict[str, Any]: + return { + 'version': 1, + 'id': self.id, + 'child_title': self.child_title, + 'override_title': self.override_title, + 'default_title': self.default_title, + 'title_stack': list(self.title_stack), + 'allow_remote_control': self.allow_remote_control, + 'overlay_window_id': self.overlay_window_id, + 'overlay_for': self.overlay_for, + 'cwd': self.child.current_cwd or self.child.cwd, + 'env': self.child.environ, + 'cmdline': self.child.cmdline, + } + @property def current_colors(self) -> Dict: return self.screen.color_profile.as_dict()