macOS: Fix :opt:sync_to_monitor not working on Mojave.

This commit is contained in:
Kovid Goyal 2019-02-20 20:09:15 +05:30
parent 4629ef627f
commit abd4de7311
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
5 changed files with 40 additions and 16 deletions

View File

@ -64,6 +64,8 @@ To update |kitty|, :doc:`follow the instructions <binary>`.
- macOS: When closing a top-level window only switch focus to the previous kitty
window if it is on the same workspace (:iss:`1379`)
- macOS: Fix :opt:`sync_to_monitor` not working on Mojave.
0.13.3 [2019-01-19]
------------------------------

View File

@ -26,6 +26,7 @@ extern PyTypeObject Screen_Type;
// Apple does not implement MSG_NOSIGNAL
#define MSG_NOSIGNAL 0
#endif
#define USE_RENDER_FRAMES (global_state.has_render_frames && OPT(sync_to_monitor))
static void (*parse_func)(Screen*, PyObject*, double);
@ -638,7 +639,7 @@ render_os_window(OSWindow *os_window, double now, unsigned int active_window_id,
os_window->last_active_tab = os_window->active_tab; os_window->last_num_tabs = os_window->num_tabs; os_window->last_active_window_id = active_window_id;
os_window->focused_at_last_render = os_window->is_focused;
os_window->is_damaged = false;
if (global_state.is_wayland && OPT(sync_to_monitor)) wayland_request_frame_render(os_window);
if (USE_RENDER_FRAMES) request_frame_render(os_window);
#undef WD
#undef TD
}
@ -667,8 +668,8 @@ render(double now) {
update_os_window_title(w);
continue;
}
if (global_state.is_wayland && w->wayland_render_state != RENDER_FRAME_READY && OPT(sync_to_monitor)) {
if (w->wayland_render_state == RENDER_FRAME_NOT_REQUESTED) wayland_request_frame_render(w);
if (USE_RENDER_FRAMES && w->render_state != RENDER_FRAME_READY) {
if (w->render_state == RENDER_FRAME_NOT_REQUESTED) request_frame_render(w);
continue;
}
bool needs_render = w->is_damaged;

View File

@ -555,10 +555,11 @@ create_os_window(PyObject UNUSED *self, PyObject *args) {
w->fonts_data = fonts_data;
w->shown_once = true;
w->last_focused_counter = ++focus_counter;
glfwSwapInterval(OPT(sync_to_monitor) && !global_state.is_wayland ? 1 : 0);
#ifdef __APPLE__
if (OPT(macos_option_as_alt)) glfwSetCocoaTextInputFilter(glfw_window, filter_option);
glfwSetCocoaToggleFullscreenIntercept(glfw_window, intercept_cocoa_fullscreen);
#else
glfwSwapInterval(OPT(sync_to_monitor) && !global_state.is_wayland ? 1 : 0);
#endif
send_prerendered_sprites_for_window(w);
if (logo.pixels && logo.width && logo.height) glfwSetWindowIcon(glfw_window, 1, &logo);
@ -1037,25 +1038,40 @@ void
get_cocoa_key_equivalent(int key, int mods, unsigned short *cocoa_key, int *cocoa_mods) {
glfwGetCocoaKeyEquivalent(key, mods, cocoa_key, cocoa_mods);
}
#endif
void
wayland_frame_request_callback(id_type os_window_id) {
static void
cocoa_frame_request_callback(GLFWwindow *window) {
for (size_t i = 0; i < global_state.num_os_windows; i++) {
if (global_state.os_windows[i].id == os_window_id) {
global_state.os_windows[i].wayland_render_state = RENDER_FRAME_READY;
if (global_state.os_windows[i].handle == window) {
global_state.os_windows[i].render_state = RENDER_FRAME_READY;
break;
}
}
}
void
wayland_request_frame_render(OSWindow *w) {
glfwRequestWaylandFrameEvent(w->handle, w->id, wayland_frame_request_callback);
w->wayland_render_state = RENDER_FRAME_REQUESTED;
request_frame_render(OSWindow *w) {
glfwCocoaRequestRenderFrame(w->handle, cocoa_frame_request_callback);
w->render_state = RENDER_FRAME_REQUESTED;
}
#ifndef __APPLE__
#else
static void
wayland_frame_request_callback(id_type os_window_id) {
for (size_t i = 0; i < global_state.num_os_windows; i++) {
if (global_state.os_windows[i].id == os_window_id) {
global_state.os_windows[i].render_state = RENDER_FRAME_READY;
break;
}
}
}
void
request_frame_render(OSWindow *w) {
glfwRequestWaylandFrameEvent(w->handle, w->id, wayland_frame_request_callback);
w->render_state = RENDER_FRAME_REQUESTED;
}
void
dbus_notification_created_callback(unsigned long long notification_id, uint32_t new_notification_id, void* data UNUSED) {

View File

@ -351,6 +351,10 @@ PYWRAP1(set_options) {
int is_wayland = 0, debug_gl = 0, debug_font_fallback = 0;
PA("O|ppp", &opts, &is_wayland, &debug_gl, &debug_font_fallback);
global_state.is_wayland = is_wayland ? true : false;
#ifdef __APPLE__
global_state.has_render_frames = true;
#endif
if (global_state.is_wayland) global_state.has_render_frames = true;
global_state.debug_gl = debug_gl ? true : false;
global_state.debug_font_fallback = debug_font_fallback ? true : false;
#define GA(name) ret = PyObject_GetAttrString(opts, #name); if (ret == NULL) return NULL;

View File

@ -104,7 +104,7 @@ typedef struct {
bool is_set;
} OSWindowGeometry;
enum WAYLAND_RENDER_STATE { RENDER_FRAME_NOT_REQUESTED, RENDER_FRAME_REQUESTED, RENDER_FRAME_READY };
enum RENDER_STATE { RENDER_FRAME_NOT_REQUESTED, RENDER_FRAME_REQUESTED, RENDER_FRAME_READY };
typedef struct {
void *handle;
@ -134,7 +134,7 @@ typedef struct {
FONTS_DATA_HANDLE fonts_data;
id_type temp_font_group_id;
double pending_scroll_pixels;
enum WAYLAND_RENDER_STATE wayland_render_state;
enum RENDER_STATE render_state;
id_type last_focused_counter;
} OSWindow;
@ -149,6 +149,7 @@ typedef struct {
OSWindow *callback_os_window;
bool terminate;
bool is_wayland;
bool has_render_frames;
bool debug_gl, debug_font_fallback;
bool has_pending_resizes;
bool in_sequence_mode;
@ -219,4 +220,4 @@ void set_cocoa_pending_action_with_wd(CocoaPendingAction action, const char *wd)
bool application_quit_requested();
void request_application_quit();
#endif
void wayland_request_frame_render(OSWindow *w);
void request_frame_render(OSWindow *w);