From 78fd7a8458b3c877cf67b99b2362f8b2ef02b010 Mon Sep 17 00:00:00 2001 From: Nicolas Ochsner Date: Tue, 14 Jun 2022 11:09:26 +0200 Subject: [PATCH 1/3] Enable resizing in session files. --- kitty/session.py | 20 ++++++++++++++++++-- kitty/tabs.py | 5 ++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/kitty/session.py b/kitty/session.py index 2a1dc776a..9afc31eff 100644 --- a/kitty/session.py +++ b/kitty/session.py @@ -3,7 +3,7 @@ import shlex import sys -from typing import TYPE_CHECKING, Generator, Iterator, List, Optional, Union +from typing import TYPE_CHECKING, Generator, Iterator, List, Optional, Union, NamedTuple from .cli_stub import CLIOptions from .constants import kitty_exe @@ -26,11 +26,16 @@ def get_os_window_sizing_data(opts: Options, session: Optional['Session'] = None return WindowSizeData(sizes, opts.remember_window_size, opts.single_window_margin_width, opts.window_margin_width, opts.window_padding_width) +class SessionResizeWindow(NamedTuple): + direction: str + steps: int + + class Tab: def __init__(self, opts: Options, name: str): from .launch import LaunchSpec - self.windows: List[Union[LaunchSpec, 'SpecialWindowInstance']] = [] + self.windows: List[Union[LaunchSpec, SessionResizeWindow, 'SpecialWindowInstance']] = [] self.name = name.strip() self.active_window_idx = 0 self.enabled_layouts = opts.enabled_layouts @@ -73,6 +78,15 @@ class Session: t.windows.append(spec) t.next_title = None + def resize_window(self, cmd: str) -> None: + args = cmd.split(" ") + steps = 1 + if len(args) > 1: + steps = int(args[1]) + t = self.tabs[-1] + t.windows.append(SessionResizeWindow(args[0], steps)) + + def add_special_window(self, sw: 'SpecialWindowInstance') -> None: self.tabs[-1].windows.append(sw) @@ -132,6 +146,8 @@ def parse_session(raw: str, opts: Options) -> Generator[Session, None, None]: ans.os_window_size = WindowSizes(WindowSize(*w), WindowSize(*h)) elif cmd == 'os_window_class': ans.os_window_class = rest + elif cmd == 'resize_window': + ans.resize_window(rest) else: raise ValueError(f'Unknown command in session file: {cmd}') yield finalize_session(ans) diff --git a/kitty/tabs.py b/kitty/tabs.py index 334eb490a..ab92b1ef0 100644 --- a/kitty/tabs.py +++ b/kitty/tabs.py @@ -27,6 +27,7 @@ from .fast_data_types import ( ) from .layout.base import Layout from .layout.interface import create_layout_object_for, evict_cached_layouts +from .session import SessionResizeWindow from .tab_bar import TabBar, TabBarData from .types import ac from .typing import EdgeLiteral, SessionTab, SessionType, TypedDict @@ -169,7 +170,9 @@ class Tab: # {{{ def startup(self, session_tab: 'SessionTab') -> None: for cmd in session_tab.windows: - if isinstance(cmd, SpecialWindowInstance): + if isinstance(cmd, SessionResizeWindow): + self.resize_window(*cmd) + elif isinstance(cmd, SpecialWindowInstance): self.new_special_window(cmd) else: from .launch import launch From 36719fb08638dcafc148693882e116a94da1aaa5 Mon Sep 17 00:00:00 2001 From: Nicolas Ochsner Date: Tue, 14 Jun 2022 11:23:35 +0200 Subject: [PATCH 2/3] Cleanup. --- kitty/session.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/kitty/session.py b/kitty/session.py index 9afc31eff..87a387822 100644 --- a/kitty/session.py +++ b/kitty/session.py @@ -78,15 +78,13 @@ class Session: t.windows.append(spec) t.next_title = None - def resize_window(self, cmd: str) -> None: - args = cmd.split(" ") + def resize_window(self, args: List[str]) -> None: steps = 1 if len(args) > 1: steps = int(args[1]) t = self.tabs[-1] t.windows.append(SessionResizeWindow(args[0], steps)) - def add_special_window(self, sw: 'SpecialWindowInstance') -> None: self.tabs[-1].windows.append(sw) @@ -147,7 +145,7 @@ def parse_session(raw: str, opts: Options) -> Generator[Session, None, None]: elif cmd == 'os_window_class': ans.os_window_class = rest elif cmd == 'resize_window': - ans.resize_window(rest) + ans.resize_window(rest.split()) else: raise ValueError(f'Unknown command in session file: {cmd}') yield finalize_session(ans) From 6bbe58f8764609501cd653680250b4c242f00d17 Mon Sep 17 00:00:00 2001 From: Nicolas Ochsner Date: Tue, 14 Jun 2022 12:28:41 +0200 Subject: [PATCH 3/3] Change to pass window specs. --- kitty/session.py | 17 +++++++++-------- kitty/tabs.py | 15 ++++++++------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/kitty/session.py b/kitty/session.py index 87a387822..28f557c08 100644 --- a/kitty/session.py +++ b/kitty/session.py @@ -3,7 +3,7 @@ import shlex import sys -from typing import TYPE_CHECKING, Generator, Iterator, List, Optional, Union, NamedTuple +from typing import TYPE_CHECKING, Generator, Iterator, List, Optional, Union, NamedTuple, Tuple from .cli_stub import CLIOptions from .constants import kitty_exe @@ -26,16 +26,17 @@ def get_os_window_sizing_data(opts: Options, session: Optional['Session'] = None return WindowSizeData(sizes, opts.remember_window_size, opts.single_window_margin_width, opts.window_margin_width, opts.window_padding_width) -class SessionResizeWindow(NamedTuple): - direction: str - steps: int +class WindowSpecs: + def __init__(self, launch_spec): + from .launch import LaunchSpec + self.launch_spec: Union[LaunchSpec, 'SpecialWindowInstance'] = launch_spec + self.resize_spec: Optional[Tuple[str,int]] = None class Tab: def __init__(self, opts: Options, name: str): - from .launch import LaunchSpec - self.windows: List[Union[LaunchSpec, SessionResizeWindow, 'SpecialWindowInstance']] = [] + self.windows: List[WindowSpecs] = [] self.name = name.strip() self.active_window_idx = 0 self.enabled_layouts = opts.enabled_layouts @@ -75,7 +76,7 @@ class Session: if t.next_title and not spec.opts.window_title: spec.opts.window_title = t.next_title spec.opts.cwd = spec.opts.cwd or t.cwd - t.windows.append(spec) + t.windows.append(WindowSpecs(spec)) t.next_title = None def resize_window(self, args: List[str]) -> None: @@ -83,7 +84,7 @@ class Session: if len(args) > 1: steps = int(args[1]) t = self.tabs[-1] - t.windows.append(SessionResizeWindow(args[0], steps)) + t.windows[-1].resize_spec = (args[0], steps) def add_special_window(self, sw: 'SpecialWindowInstance') -> None: self.tabs[-1].windows.append(sw) diff --git a/kitty/tabs.py b/kitty/tabs.py index ab92b1ef0..86cb0f0f7 100644 --- a/kitty/tabs.py +++ b/kitty/tabs.py @@ -27,7 +27,6 @@ from .fast_data_types import ( ) from .layout.base import Layout from .layout.interface import create_layout_object_for, evict_cached_layouts -from .session import SessionResizeWindow from .tab_bar import TabBar, TabBarData from .types import ac from .typing import EdgeLiteral, SessionTab, SessionType, TypedDict @@ -169,14 +168,16 @@ class Tab: # {{{ self.mark_tab_bar_dirty() def startup(self, session_tab: 'SessionTab') -> None: - for cmd in session_tab.windows: - if isinstance(cmd, SessionResizeWindow): - self.resize_window(*cmd) - elif isinstance(cmd, SpecialWindowInstance): - self.new_special_window(cmd) + for window in session_tab.windows: + spec = window.launch_spec + if isinstance(window.launch_spec, SpecialWindowInstance): + self.new_special_window(spec) else: from .launch import launch - launch(get_boss(), cmd.opts, cmd.args, target_tab=self, force_target_tab=True) + launch(get_boss(), spec.opts, spec.args, target_tab=self, force_target_tab=True) + if window.resize_spec is not None: + self.resize_window(*window.resize_spec) + self.windows.set_active_window_group_for(self.windows.all_windows[session_tab.active_window_idx]) def serialize_state(self) -> Dict[str, Any]: