macOS: Fix IME position incorrect after moving OS window
This commit is contained in:
parent
81babd29e7
commit
4ab5d97e9b
17
kitty/glfw.c
17
kitty/glfw.c
@ -169,6 +169,21 @@ blank_os_window(OSWindow *w) {
|
|||||||
blank_canvas(w->is_semi_transparent ? w->background_opacity : 1.0f, color);
|
blank_canvas(w->is_semi_transparent ? w->background_opacity : 1.0f, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
window_pos_callback(GLFWwindow* window, int x UNUSED, int y UNUSED) {
|
||||||
|
if (!set_callback_window(window)) return;
|
||||||
|
#ifdef __APPLE__
|
||||||
|
// Apple needs IME position to be accurate before the next key event
|
||||||
|
OSWindow *osw = global_state.callback_os_window;
|
||||||
|
if (osw->is_focused && is_window_ready_for_callbacks()) {
|
||||||
|
Tab *tab = osw->tabs + osw->active_tab;
|
||||||
|
Window *w = tab->windows + tab->active_window;
|
||||||
|
if (w->render_data.screen) update_ime_position(w, w->render_data.screen);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
global_state.callback_os_window = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
window_close_callback(GLFWwindow* window) {
|
window_close_callback(GLFWwindow* window) {
|
||||||
if (!set_callback_window(window)) return;
|
if (!set_callback_window(window)) return;
|
||||||
@ -815,7 +830,7 @@ create_os_window(PyObject UNUSED *self, PyObject *args, PyObject *kw) {
|
|||||||
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);
|
||||||
// missing pos callback
|
glfwSetWindowPosCallback(glfw_window, window_pos_callback);
|
||||||
// missing size callback
|
// missing size callback
|
||||||
glfwSetWindowCloseCallback(glfw_window, window_close_callback);
|
glfwSetWindowCloseCallback(glfw_window, window_close_callback);
|
||||||
glfwSetWindowRefreshCallback(glfw_window, refresh_callback);
|
glfwSetWindowRefreshCallback(glfw_window, refresh_callback);
|
||||||
|
|||||||
@ -79,7 +79,7 @@ active_window(void) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
update_ime_position(Window* w, Screen *screen) {
|
update_ime_position(Window* w, Screen *screen) {
|
||||||
unsigned int cell_width = global_state.callback_os_window->fonts_data->cell_width, cell_height = global_state.callback_os_window->fonts_data->cell_height;
|
unsigned int cell_width = global_state.callback_os_window->fonts_data->cell_width, cell_height = global_state.callback_os_window->fonts_data->cell_height;
|
||||||
unsigned int left = w->geometry.left, top = w->geometry.top;
|
unsigned int left = w->geometry.left, top = w->geometry.top;
|
||||||
|
|||||||
@ -322,3 +322,4 @@ void get_platform_dependent_config_values(void *glfw_window);
|
|||||||
bool draw_window_title(OSWindow *window, const char *text, color_type fg, color_type bg, uint8_t *output_buf, size_t width, size_t height);
|
bool draw_window_title(OSWindow *window, const char *text, color_type fg, color_type bg, uint8_t *output_buf, size_t width, size_t height);
|
||||||
uint8_t* draw_single_ascii_char(const char ch, size_t *result_width, size_t *result_height);
|
uint8_t* draw_single_ascii_char(const char ch, size_t *result_width, size_t *result_height);
|
||||||
bool is_os_window_fullscreen(OSWindow *);
|
bool is_os_window_fullscreen(OSWindow *);
|
||||||
|
void update_ime_position(Window* w, Screen *screen);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user