Workaround for new windows not getting focus events on macOS
This commit is contained in:
parent
ba40bf5e6f
commit
058c1bec10
@ -532,7 +532,7 @@ update_window_title(Window *w, OSWindow *os_window) {
|
|||||||
Py_INCREF(os_window->window_title);
|
Py_INCREF(os_window->window_title);
|
||||||
set_os_window_title(os_window, PyUnicode_AsUTF8(w->title));
|
set_os_window_title(os_window, PyUnicode_AsUTF8(w->title));
|
||||||
#ifdef __APPLE__
|
#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
|
#endif
|
||||||
return true;
|
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;
|
} 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);
|
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) {
|
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) {
|
if (WD.screen->start_visual_bell_at != 0) {
|
||||||
double bell_left = global_state.opts.visual_bell_duration - (now - WD.screen->start_visual_bell_at);
|
double bell_left = global_state.opts.visual_bell_duration - (now - WD.screen->start_visual_bell_at);
|
||||||
|
|||||||
10
kitty/glfw.c
10
kitty/glfw.c
@ -145,10 +145,7 @@ static void
|
|||||||
window_focus_callback(GLFWwindow *w, int focused) {
|
window_focus_callback(GLFWwindow *w, int focused) {
|
||||||
if (!set_callback_window(w)) return;
|
if (!set_callback_window(w)) return;
|
||||||
global_state.callback_os_window->is_focused = focused ? true : false;
|
global_state.callback_os_window->is_focused = focused ? true : false;
|
||||||
if (focused) {
|
if (focused) show_mouse_cursor(w);
|
||||||
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;
|
|
||||||
double now = monotonic();
|
double now = monotonic();
|
||||||
global_state.callback_os_window->last_mouse_activity_at = now;
|
global_state.callback_os_window->last_mouse_activity_at = now;
|
||||||
global_state.callback_os_window->cursor_blink_zero_time = 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();
|
OSWindow *w = add_os_window();
|
||||||
w->handle = glfw_window;
|
w->handle = glfw_window;
|
||||||
update_os_window_references();
|
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);
|
if (logo.pixels && logo.width && logo.height) glfwSetWindowIcon(glfw_window, 1, &logo);
|
||||||
glfwSetCursor(glfw_window, standard_cursor);
|
glfwSetCursor(glfw_window, standard_cursor);
|
||||||
update_os_window_viewport(w, false);
|
update_os_window_viewport(w, false);
|
||||||
|
|||||||
@ -39,22 +39,22 @@ GlobalState global_state = {{0}};
|
|||||||
#define WITH_OS_WINDOW_REFS \
|
#define WITH_OS_WINDOW_REFS \
|
||||||
id_type cb_window_id = 0, focused_window_id = 0; \
|
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.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 \
|
#define END_WITH_OS_WINDOW_REFS \
|
||||||
if (cb_window_id || focused_window_id) { \
|
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++) { \
|
for (size_t wn = 0; wn < global_state.num_os_windows; wn++) { \
|
||||||
OSWindow *wp = global_state.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 == 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*
|
OSWindow*
|
||||||
current_os_window() {
|
current_os_window() {
|
||||||
if (global_state.callback_os_window) return global_state.callback_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;
|
return global_state.os_windows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -113,7 +113,7 @@ typedef struct {
|
|||||||
PyObject *boss;
|
PyObject *boss;
|
||||||
OSWindow *os_windows;
|
OSWindow *os_windows;
|
||||||
size_t num_os_windows, capacity;
|
size_t num_os_windows, capacity;
|
||||||
OSWindow *callback_os_window, *focused_os_window;
|
OSWindow *callback_os_window;
|
||||||
bool close_all_windows;
|
bool close_all_windows;
|
||||||
bool is_wayland;
|
bool is_wayland;
|
||||||
bool debug_gl;
|
bool debug_gl;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user