kitty @ new-window: Add a new option --window-type

To create top-level OS windows. Fixes #770
This commit is contained in:
Kovid Goyal 2018-07-30 08:40:26 +05:30
parent b4269199b4
commit 78def6e6bf
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
6 changed files with 43 additions and 3 deletions

View File

@ -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]
------------------------------

View File

@ -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)

View File

@ -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))

View File

@ -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() {

View File

@ -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),

View File

@ -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();