From 4baf7b5bba2d3888a8ce77e24c385a6e2b67c880 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 2 Apr 2019 19:57:09 +0530 Subject: [PATCH] Allow creating new OS windows in session files Fixes #1514 --- docs/changelog.rst | 2 ++ docs/index.rst | 4 ++++ kitty/boss.py | 28 +++++++++++++++------------- kitty/session.py | 26 ++++++++++++++++++-------- 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 2f208ee08..da1b52d5a 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -24,6 +24,8 @@ To update |kitty|, :doc:`follow the instructions `. multi-character ligatures under the cursor to make editing easier (:iss:`461`) +- Allow creating new OS windows in session files (:iss:`1514`) + - Allow specifying a value of ``none`` for the :opt:`selection_foreground` which will cause kitty to not change text color in selections (:iss:`1358`) diff --git a/docs/index.rst b/docs/index.rst index 09a2c7fd3..6d5a8234d 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -342,6 +342,10 @@ For example: # Set the current layout layout stack launch zsh + + # Create a new OS window + new_os_window + launch sh # Make the current window the active (focused) window focus launch emacs diff --git a/kitty/boss.py b/kitty/boss.py index b8a563f15..8b92054d9 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -30,7 +30,7 @@ from .keys import get_shortcut, shortcut_matches from .layout import set_draw_borders_options from .remote_control import handle_cmd from .rgb import Color, color_from_int -from .session import create_session +from .session import create_sessions from .tabs import SpecialWindow, SpecialWindowInstance, TabManager from .utils import ( func_name, get_editor, get_primary_selection, is_path_in_temp_dir, @@ -128,16 +128,18 @@ class Boss: ) set_boss(self) self.opts, self.args = opts, args - startup_session = create_session(opts, args, default_session=opts.startup_session) + startup_sessions = create_sessions(opts, args, default_session=opts.startup_session) self.keymap = self.opts.keymap.copy() if new_os_window_trigger is not None: self.keymap.pop(new_os_window_trigger, None) - self.add_os_window(startup_session, os_window_id=os_window_id) - if args.start_as != 'normal': - if args.start_as == 'fullscreen': - self.toggle_fullscreen() - else: - change_os_window_state(args.start_as) + for startup_session in startup_sessions: + os_window_id = self.add_os_window(startup_session, os_window_id=os_window_id) + if args.start_as != 'normal': + if args.start_as == 'fullscreen': + self.toggle_fullscreen() + else: + change_os_window_state(args.start_as) + os_window_id = None if is_macos: from .fast_data_types import cocoa_set_notification_activated_callback cocoa_set_notification_activated_callback(self.notification_activated) @@ -246,7 +248,7 @@ class Boss: sw = args else: sw = self.args_to_special_window(args, cwd_from) if args else None - startup_session = create_session(self.opts, special_window=sw, cwd_from=cwd_from) + startup_session = next(create_sessions(self.opts, special_window=sw, cwd_from=cwd_from)) return self.add_os_window(startup_session) def new_os_window(self, *args): @@ -304,10 +306,10 @@ class Boss: opts = create_opts(args) if not os.path.isabs(args.directory): args.directory = os.path.join(msg['cwd'], args.directory) - session = create_session(opts, args, respect_cwd=True) - os_window_id = self.add_os_window(session, wclass=args.cls, wname=args.name, opts_for_size=opts, startup_id=startup_id) - if msg.get('notify_on_os_window_death'): - self.os_window_death_actions[os_window_id] = partial(self.notify_on_os_window_death, msg['notify_on_os_window_death']) + for session in create_sessions(opts, args, respect_cwd=True): + os_window_id = self.add_os_window(session, wclass=args.cls, wname=args.name, opts_for_size=opts, startup_id=startup_id) + if msg.get('notify_on_os_window_death'): + self.os_window_death_actions[os_window_id] = partial(self.notify_on_os_window_death, msg['notify_on_os_window_death']) else: log_error('Unknown message received from peer, ignoring') diff --git a/kitty/session.py b/kitty/session.py index 03e62e5d8..0884b540e 100644 --- a/kitty/session.py +++ b/kitty/session.py @@ -78,6 +78,13 @@ def resolved_shell(opts): def parse_session(raw, opts, default_title=None): + + def finalize_session(ans): + for t in ans.tabs: + if not t.windows: + t.windows.append(resolved_shell(opts)) + return ans + ans = Session(default_title) ans.add_tab(opts) for line in raw.splitlines(): @@ -87,6 +94,10 @@ def parse_session(raw, opts, default_title=None): cmd, rest = cmd.strip(), rest.strip() if cmd == 'new_tab': ans.add_tab(opts, rest) + elif cmd == 'new_os_window': + yield finalize_session(ans) + ans = Session(default_title) + ans.add_tab(opts, rest) elif cmd == 'layout': ans.set_layout(rest) elif cmd == 'launch': @@ -101,16 +112,14 @@ def parse_session(raw, opts, default_title=None): ans.set_next_title(rest) else: raise ValueError('Unknown command in session file: {}'.format(cmd)) - for t in ans.tabs: - if not t.windows: - t.windows.append(resolved_shell(opts)) - return ans + yield finalize_session(ans) -def create_session(opts, args=None, special_window=None, cwd_from=None, respect_cwd=False, default_session=None): +def create_sessions(opts, args=None, special_window=None, cwd_from=None, respect_cwd=False, default_session=None): if args and args.session: with open(args.session) as f: - return parse_session(f.read(), opts, getattr(args, 'title', None)) + yield from parse_session(f.read(), opts, getattr(args, 'title', None)) + return if default_session and default_session != 'none': try: with open(default_session) as f: @@ -118,7 +127,8 @@ def create_session(opts, args=None, special_window=None, cwd_from=None, respect_ except EnvironmentError: log_error('Failed to read from session file, ignoring: {}'.format(default_session)) else: - return parse_session(session_data, opts, getattr(args, 'title', None)) + yield from parse_session(session_data, opts, getattr(args, 'title', None)) + return ans = Session() current_layout = opts.enabled_layouts[0] if opts.enabled_layouts else 'tall' ans.add_tab(opts) @@ -135,4 +145,4 @@ def create_session(opts, args=None, special_window=None, cwd_from=None, respect_ k['override_title'] = args.title special_window = SpecialWindow(cmd, **k) ans.add_special_window(special_window) - return ans + yield ans