diff --git a/docs/changelog.rst b/docs/changelog.rst index 021ef1934..5eb2c7ec7 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -35,6 +35,9 @@ Changelog - diff kitten: Fix error when right hand side file is binary and left hand side file is text (:pull:`752`) +- kitty @ new-window: Add a new option :option:`kitty @ new-window --window-type` + to create top-level OS windows. (:iss:`770`) + 0.11.3 [2018-07-10] ------------------------------ diff --git a/kitty/boss.py b/kitty/boss.py index 4c2c98711..6060369d6 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -190,17 +190,20 @@ class Boss: yield tab def set_active_window(self, window): - for tm in self.os_window_map.values(): + for os_window_id, tm in self.os_window_map.items(): for tab in tm: for w in tab: if w.id == window.id: if tab is not self.active_tab: tm.set_active_tab(tab) tab.set_active_window(w) - return + return os_window_id def _new_os_window(self, args, cwd_from=None): - sw = self.args_to_special_window(args, cwd_from) if args else None + if isinstance(args, SpecialWindowInstance): + 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) return self.add_os_window(startup_session) diff --git a/kitty/cmds.py b/kitty/cmds.py index 52ca9de1e..6e5a6eec7 100644 --- a/kitty/cmds.py +++ b/kitty/cmds.py @@ -9,6 +9,7 @@ import sys from .cli import parse_args from .config import parse_config, parse_send_text_bytes from .constants import appname +from .fast_data_types import focus_os_window from .tabs import SpecialWindow from .utils import natsort_ints @@ -402,6 +403,12 @@ type=bool-set Keep the current window focused instead of switching to the newly opened window +--window-type +default=kitty +choices=kitty,os +What kind of window to open. A kitty window or a top-level OS window. + + --new-tab type=bool-set Open a new tab @@ -415,6 +422,7 @@ When using --new-tab set the title of the tab. def cmd_new_window(global_opts, opts, args): return {'match': opts.match, 'title': opts.title, 'cwd': opts.cwd, 'new_tab': opts.new_tab, 'tab_title': opts.tab_title, + 'window_type': opts.window_type, 'keep_focus': opts.keep_focus, 'args': args or []} @@ -431,6 +439,15 @@ def new_window(boss, window, payload): boss.set_active_window(old_window) return str(wid) + if payload['window_type'] == 'os': + boss._new_os_window(w) + wid = boss.active_window.id + if payload['keep_focus'] and old_window: + os_window_id = boss.set_active_window(old_window) + if os_window_id: + focus_os_window(os_window_id) + return str(wid) + match = payload['match'] if match: tabs = tuple(boss.match_tabs(match)) diff --git a/kitty/glfw.c b/kitty/glfw.c index 06b788dc7..da31ac4d8 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -543,6 +543,11 @@ destroy_os_window(OSWindow *w) { #endif } +void +focus_os_window(OSWindow *w) { + if (w->handle) glfwFocusWindow(w->handle); +} + #ifdef __APPLE__ bool application_quit_requested() { diff --git a/kitty/state.c b/kitty/state.c index aaf6ea305..7afdc454f 100644 --- a/kitty/state.c +++ b/kitty/state.c @@ -497,6 +497,16 @@ PYWRAP1(mark_os_window_for_close) { Py_RETURN_FALSE; } +PYWRAP1(focus_os_window) { + id_type os_window_id; + PA("K", &os_window_id); + WITH_OS_WINDOW(os_window_id) + if (!os_window->is_focused) focus_os_window(os_window); + Py_RETURN_TRUE; + END_WITH_OS_WINDOW + Py_RETURN_FALSE; +} + PYWRAP1(set_titlebar_color) { id_type os_window_id; unsigned int color; @@ -718,6 +728,7 @@ static PyMethodDef module_methods[] = { MW(cell_size_for_window, METH_VARARGS), MW(mark_os_window_for_close, METH_VARARGS), MW(set_titlebar_color, METH_VARARGS), + MW(focus_os_window, METH_VARARGS), MW(mark_tab_bar_dirty, METH_O), MW(change_background_opacity, METH_VARARGS), MW(background_opacity_of, METH_O), diff --git a/kitty/state.h b/kitty/state.h index c1d74b38f..2e4a33cc3 100644 --- a/kitty/state.h +++ b/kitty/state.h @@ -170,6 +170,7 @@ void swap_window_buffers(OSWindow *w); void make_window_context_current(OSWindow *w); void hide_mouse(OSWindow *w); void destroy_os_window(OSWindow *w); +void focus_os_window(OSWindow *w); void set_os_window_title(OSWindow *w, const char *title); OSWindow* os_window_for_kitty_window(id_type); OSWindow* add_os_window();