macOS: Fix :opt:sync_to_monitor not working on Mojave.
This commit is contained in:
parent
4629ef627f
commit
abd4de7311
@ -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]
|
||||
------------------------------
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
36
kitty/glfw.c
36
kitty/glfw.c
@ -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) {
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user