From 058c1bec101f6567272d8aafd0a036e487eabe0c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 20 Nov 2017 15:09:30 +0530 Subject: [PATCH] Workaround for new windows not getting focus events on macOS --- kitty/child-monitor.c | 4 ++-- kitty/glfw.c | 10 ++++++---- kitty/state.c | 8 ++++---- kitty/state.h | 2 +- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/kitty/child-monitor.c b/kitty/child-monitor.c index fbc1e07b5..1b0d9245d 100644 --- a/kitty/child-monitor.c +++ b/kitty/child-monitor.c @@ -532,7 +532,7 @@ update_window_title(Window *w, OSWindow *os_window) { Py_INCREF(os_window->window_title); set_os_window_title(os_window, PyUnicode_AsUTF8(w->title)); #ifdef __APPLE__ - if (os_window == global_state.focused_os_window) cocoa_update_title(w->title); + if (os_window->is_focused) cocoa_update_title(w->title); #endif return true; } @@ -576,7 +576,7 @@ render_os_window(OSWindow *os_window, double now, unsigned int *active_window_id } else WD.screen->cursor_render_info.is_visible = false; draw_cells(WD.vao_idx, WD.gvao_idx, WD.xstart, WD.ystart, WD.dx, WD.dy, WD.screen, os_window); if (is_active_window && WD.screen->cursor_render_info.is_visible && WD.screen->cursor_render_info.shape != CURSOR_BLOCK) { - draw_cursor(&WD.screen->cursor_render_info, os_window == global_state.focused_os_window); + draw_cursor(&WD.screen->cursor_render_info, os_window->is_focused); } if (WD.screen->start_visual_bell_at != 0) { double bell_left = global_state.opts.visual_bell_duration - (now - WD.screen->start_visual_bell_at); diff --git a/kitty/glfw.c b/kitty/glfw.c index 67c2b2305..d2e3bc9c8 100644 --- a/kitty/glfw.c +++ b/kitty/glfw.c @@ -145,10 +145,7 @@ static void window_focus_callback(GLFWwindow *w, int focused) { if (!set_callback_window(w)) return; global_state.callback_os_window->is_focused = focused ? true : false; - if (focused) { - global_state.focused_os_window = global_state.callback_os_window; - show_mouse_cursor(w); - } else if (global_state.focused_os_window == global_state.callback_os_window) global_state.focused_os_window = NULL; + if (focused) show_mouse_cursor(w); double now = monotonic(); global_state.callback_os_window->last_mouse_activity_at = now; global_state.callback_os_window->cursor_blink_zero_time = now; @@ -252,6 +249,11 @@ create_os_window(PyObject UNUSED *self, PyObject *args) { OSWindow *w = add_os_window(); w->handle = glfw_window; update_os_window_references(); + for (size_t i = 0; i < global_state.num_os_windows; i++) { + // On some platforms (macOS) newly created windows dont get the initial focus in event + OSWindow *q = global_state.os_windows + i; + q->is_focused = q == w ? true : false; + } if (logo.pixels && logo.width && logo.height) glfwSetWindowIcon(glfw_window, 1, &logo); glfwSetCursor(glfw_window, standard_cursor); update_os_window_viewport(w, false); diff --git a/kitty/state.c b/kitty/state.c index dec00a915..6655fab2f 100644 --- a/kitty/state.c +++ b/kitty/state.c @@ -39,22 +39,22 @@ GlobalState global_state = {{0}}; #define WITH_OS_WINDOW_REFS \ id_type cb_window_id = 0, focused_window_id = 0; \ if (global_state.callback_os_window) cb_window_id = global_state.callback_os_window->id; \ - if (global_state.focused_os_window) focused_window_id = global_state.focused_os_window->id; #define END_WITH_OS_WINDOW_REFS \ if (cb_window_id || focused_window_id) { \ - global_state.callback_os_window = NULL; global_state.focused_os_window = NULL; \ + global_state.callback_os_window = NULL; \ for (size_t wn = 0; wn < global_state.num_os_windows; wn++) { \ OSWindow *wp = global_state.os_windows + wn; \ if (wp->id == cb_window_id && cb_window_id) global_state.callback_os_window = wp; \ - if (wp->id == focused_window_id && focused_window_id) global_state.focused_os_window = wp; \ }} OSWindow* current_os_window() { if (global_state.callback_os_window) return global_state.callback_os_window; - if (global_state.focused_os_window) return global_state.focused_os_window; + for (size_t i = 0; i < global_state.num_os_windows; i++) { + if (global_state.os_windows[i].is_focused) return global_state.os_windows + i; + } return global_state.os_windows; } diff --git a/kitty/state.h b/kitty/state.h index 5f93683c4..85fbe0c25 100644 --- a/kitty/state.h +++ b/kitty/state.h @@ -113,7 +113,7 @@ typedef struct { PyObject *boss; OSWindow *os_windows; size_t num_os_windows, capacity; - OSWindow *callback_os_window, *focused_os_window; + OSWindow *callback_os_window; bool close_all_windows; bool is_wayland; bool debug_gl;