From 1fd338cc6cbf4d8d302cab7ac634897603e66d21 Mon Sep 17 00:00:00 2001 From: Jason Felice Date: Thu, 23 Jul 2020 16:43:31 -0400 Subject: [PATCH 1/5] Set Cocoa window number --- kitty/cocoa_window.m | 6 ++++++ kitty/glfw.c | 22 ++++++++++++++++++++++ kitty/tabs.py | 10 ++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/kitty/cocoa_window.m b/kitty/cocoa_window.m index fe7e9640f..fa404b87a 100644 --- a/kitty/cocoa_window.m +++ b/kitty/cocoa_window.m @@ -390,6 +390,12 @@ cocoa_focus_window(void *w) { [window makeKeyWindow]; } +long +cocoa_window_number(void *w) { + NSWindow *window = (NSWindow*)w; + return [window windowNumber]; +} + size_t cocoa_get_workspace_ids(void *w, size_t *workspace_ids, size_t array_sz) { NSWindow *window = (NSWindow*)w; diff --git a/kitty/glfw.c b/kitty/glfw.c index 72208ae71..3f545138f 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -11,6 +11,7 @@ #include "glfw-wrapper.h" extern bool cocoa_make_window_resizable(void *w, bool); extern void cocoa_focus_window(void *w); +extern long cocoa_window_number(void *w); extern void cocoa_create_global_menu(void); extern void cocoa_hide_window_title(void *w); extern void cocoa_hide_titlebar(void *w); @@ -1040,6 +1041,24 @@ x11_window_id(PyObject UNUSED *self, PyObject *os_wid) { return NULL; } +#ifdef __APPLE__ +static PyObject* +cocoa_window_id(PyObject UNUSED *self, PyObject *os_wid) { + if (glfwGetCocoaWindow) { + id_type os_window_id = PyLong_AsUnsignedLongLong(os_wid); + for (size_t i = 0; i < global_state.num_os_windows; i++) { + OSWindow *w = global_state.os_windows + i; + if (w->id == os_window_id) { + return Py_BuildValue("l", (long)cocoa_window_number(glfwGetCocoaWindow(w->handle))); + } + } + } + else { PyErr_SetString(PyExc_RuntimeError, "Failed to load glfwGetCocoaWindow"); return NULL; } + PyErr_SetString(PyExc_ValueError, "No OSWindow with the specified id found"); + return NULL; +} +#endif + static PyObject* get_primary_selection(PYNOARG) { if (glfwGetPrimarySelectionString) { @@ -1220,6 +1239,9 @@ static PyMethodDef module_methods[] = { METHODB(set_primary_selection, METH_VARARGS), #ifndef __APPLE__ METHODB(dbus_send_notification, METH_VARARGS), +#endif +#ifdef __APPLE__ + METHODB(cocoa_window_id, METH_O), #endif {"glfw_init", (PyCFunction)glfw_init, METH_VARARGS, ""}, {"glfw_terminate", (PyCFunction)glfw_terminate, METH_NOARGS, ""}, diff --git a/kitty/tabs.py b/kitty/tabs.py index 452adfbab..adb1b5b96 100644 --- a/kitty/tabs.py +++ b/kitty/tabs.py @@ -17,7 +17,7 @@ from .child import Child from .cli_stub import CLIOptions from .constants import appname, is_macos, is_wayland from .fast_data_types import ( - add_tab, attach_window, detach_window, get_boss, mark_tab_bar_dirty, + add_tab, attach_window, cocoa_window_id, detach_window, get_boss, mark_tab_bar_dirty, next_window_id, remove_tab, remove_window, ring_bell, set_active_tab, set_active_window, swap_tabs, sync_os_window_title, x11_window_id ) @@ -283,7 +283,13 @@ class Tab: # {{{ if env: fenv.update(env) fenv['KITTY_WINDOW_ID'] = str(next_window_id()) - if not is_macos and not is_wayland(): + if is_macos: + try: + fenv['WINDOWID'] = str(cocoa_window_id(self.os_window_id)) + except Exception: + import traceback + traceback.print_exc() + elif not is_wayland(): try: fenv['WINDOWID'] = str(x11_window_id(self.os_window_id)) except Exception: From 974e6140b3382fb78b0178240eef54aba4c71b94 Mon Sep 17 00:00:00 2001 From: Jason Felice Date: Thu, 23 Jul 2020 17:25:25 -0400 Subject: [PATCH 2/5] Extract find_os_window() --- kitty/glfw.c | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/kitty/glfw.c b/kitty/glfw.c index 3f545138f..67b85ded1 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -1027,35 +1027,31 @@ x11_display(PYNOARG) { Py_RETURN_NONE; } +static OSWindow* +find_os_window(PyObject *os_wid) { + id_type os_window_id = PyLong_AsUnsignedLongLong(os_wid); + for (size_t i = 0; i < global_state.num_os_windows; i++) { + OSWindow *w = global_state.os_windows + i; + if (w->id == os_window_id) return w; + } + return NULL; +} + static PyObject* x11_window_id(PyObject UNUSED *self, PyObject *os_wid) { - if (glfwGetX11Window) { - id_type os_window_id = PyLong_AsUnsignedLongLong(os_wid); - for (size_t i = 0; i < global_state.num_os_windows; i++) { - OSWindow *w = global_state.os_windows + i; - if (w->id == os_window_id) return Py_BuildValue("l", (long)glfwGetX11Window(w->handle)); - } - } - else { PyErr_SetString(PyExc_RuntimeError, "Failed to load glfwGetX11Window"); return NULL; } - PyErr_SetString(PyExc_ValueError, "No OSWindow with the specified id found"); - return NULL; + if (!glfwGetX11Window) { PyErr_SetString(PyExc_RuntimeError, "Failed to load glfwGetX11Window"); return NULL; } + OSWindow *w = find_os_window(os_wid); + if (!w) { PyErr_SetString(PyExc_ValueError, "No OSWindow with the specified id found"); return NULL; } + return Py_BuildValue("l", (long)glfwGetX11Window(w->handle)); } #ifdef __APPLE__ static PyObject* cocoa_window_id(PyObject UNUSED *self, PyObject *os_wid) { - if (glfwGetCocoaWindow) { - id_type os_window_id = PyLong_AsUnsignedLongLong(os_wid); - for (size_t i = 0; i < global_state.num_os_windows; i++) { - OSWindow *w = global_state.os_windows + i; - if (w->id == os_window_id) { - return Py_BuildValue("l", (long)cocoa_window_number(glfwGetCocoaWindow(w->handle))); - } - } - } - else { PyErr_SetString(PyExc_RuntimeError, "Failed to load glfwGetCocoaWindow"); return NULL; } - PyErr_SetString(PyExc_ValueError, "No OSWindow with the specified id found"); - return NULL; + if (!glfwGetCocoaWindow) { PyErr_SetString(PyExc_RuntimeError, "Failed to load glfwGetCocoaWindow"); return NULL; } + OSWindow *w = find_os_window(os_wid); + if (!w) { PyErr_SetString(PyExc_ValueError, "No OSWindow with the specified id found"); return NULL; } + return Py_BuildValue("l", (long)cocoa_window_number(glfwGetCocoaWindow(w->handle))); } #endif From 9120e3b7909d5f1f072af04b0d36e85e580ea9a6 Mon Sep 17 00:00:00 2001 From: Jason Felice Date: Thu, 23 Jul 2020 17:26:59 -0400 Subject: [PATCH 3/5] Reorganize window id functions slightly --- kitty/glfw.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kitty/glfw.c b/kitty/glfw.c index 67b85ded1..0891a9894 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -1039,18 +1039,18 @@ find_os_window(PyObject *os_wid) { static PyObject* x11_window_id(PyObject UNUSED *self, PyObject *os_wid) { - if (!glfwGetX11Window) { PyErr_SetString(PyExc_RuntimeError, "Failed to load glfwGetX11Window"); return NULL; } OSWindow *w = find_os_window(os_wid); if (!w) { PyErr_SetString(PyExc_ValueError, "No OSWindow with the specified id found"); return NULL; } + if (!glfwGetX11Window) { PyErr_SetString(PyExc_RuntimeError, "Failed to load glfwGetX11Window"); return NULL; } return Py_BuildValue("l", (long)glfwGetX11Window(w->handle)); } #ifdef __APPLE__ static PyObject* cocoa_window_id(PyObject UNUSED *self, PyObject *os_wid) { - if (!glfwGetCocoaWindow) { PyErr_SetString(PyExc_RuntimeError, "Failed to load glfwGetCocoaWindow"); return NULL; } OSWindow *w = find_os_window(os_wid); if (!w) { PyErr_SetString(PyExc_ValueError, "No OSWindow with the specified id found"); return NULL; } + if (!glfwGetCocoaWindow) { PyErr_SetString(PyExc_RuntimeError, "Failed to load glfwGetCocoaWindow"); return NULL; } return Py_BuildValue("l", (long)cocoa_window_number(glfwGetCocoaWindow(w->handle))); } #endif From 79d5049273ce4d485d3dd2ff73dcdab5b7c06a8a Mon Sep 17 00:00:00 2001 From: Jason Felice Date: Thu, 23 Jul 2020 18:55:00 -0400 Subject: [PATCH 4/5] Provide cocoa_window_id() on non-Mac, also So that its import in tabs.py doesn't have to be conditional. --- kitty/glfw.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/kitty/glfw.c b/kitty/glfw.c index 0891a9894..8ae889f03 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -1045,15 +1045,18 @@ x11_window_id(PyObject UNUSED *self, PyObject *os_wid) { return Py_BuildValue("l", (long)glfwGetX11Window(w->handle)); } -#ifdef __APPLE__ static PyObject* cocoa_window_id(PyObject UNUSED *self, PyObject *os_wid) { OSWindow *w = find_os_window(os_wid); if (!w) { PyErr_SetString(PyExc_ValueError, "No OSWindow with the specified id found"); return NULL; } if (!glfwGetCocoaWindow) { PyErr_SetString(PyExc_RuntimeError, "Failed to load glfwGetCocoaWindow"); return NULL; } +#ifdef __APPLE__ return Py_BuildValue("l", (long)cocoa_window_number(glfwGetCocoaWindow(w->handle))); -} +#else + PyErr_SetString(PyExc_RuntimeError, "cocoa_window_id() is only supported on Mac"); + return NULL; #endif +} static PyObject* get_primary_selection(PYNOARG) { @@ -1236,9 +1239,7 @@ static PyMethodDef module_methods[] = { #ifndef __APPLE__ METHODB(dbus_send_notification, METH_VARARGS), #endif -#ifdef __APPLE__ METHODB(cocoa_window_id, METH_O), -#endif {"glfw_init", (PyCFunction)glfw_init, METH_VARARGS, ""}, {"glfw_terminate", (PyCFunction)glfw_terminate, METH_NOARGS, ""}, {"glfw_get_physical_dpi", (PyCFunction)glfw_get_physical_dpi, METH_NOARGS, ""}, From e4202228eb2ee34b1a464dfb48b508ee53009da3 Mon Sep 17 00:00:00 2001 From: Jason Felice Date: Thu, 23 Jul 2020 19:09:16 -0400 Subject: [PATCH 5/5] Update fast_data_types.pyi --- kitty/fast_data_types.pyi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kitty/fast_data_types.pyi b/kitty/fast_data_types.pyi index f34310379..e69d7fa8a 100644 --- a/kitty/fast_data_types.pyi +++ b/kitty/fast_data_types.pyi @@ -781,6 +781,10 @@ def x11_window_id(os_window_id: int) -> int: pass +def cocoa_window_id(os_window_id: int) -> int: + pass + + def swap_tabs(os_window_id: int, a: int, b: int) -> None: pass