From: Attila Fidan dev@print0.net
--- dlls/winewayland.drv/wayland_text_input.c | 47 +++++++++++++++++++++++ dlls/winewayland.drv/waylanddrv.h | 1 + dlls/winewayland.drv/waylanddrv_main.c | 1 + 3 files changed, 49 insertions(+)
diff --git a/dlls/winewayland.drv/wayland_text_input.c b/dlls/winewayland.drv/wayland_text_input.c index 91355c23a9c..769862ecdea 100644 --- a/dlls/winewayland.drv/wayland_text_input.c +++ b/dlls/winewayland.drv/wayland_text_input.c @@ -157,3 +157,50 @@ void wayland_text_input_deinit(void) text_input->wl_surface = NULL; pthread_mutex_unlock(&text_input->mutex); }; + +/*********************************************************************** + * SetIMECompositionRect (WAYLANDDRV.@) + */ +BOOL WAYLAND_SetIMECompositionRect(HWND hwnd, RECT rect) +{ + struct wayland_text_input *text_input = &process_wayland.text_input; + struct wayland_win_data *data; + struct wayland_surface *surface; + int cursor_x, cursor_y, cursor_width, cursor_height; + TRACE("hwnd %p, rect %s.\n", hwnd, wine_dbgstr_rect(&rect)); + + pthread_mutex_lock(&text_input->mutex); + + if (!text_input->zwp_text_input_v3) + goto err; + + if (!(data = wayland_win_data_get(hwnd))) + goto err; + + if (!(surface = data->wayland_surface) || surface->wl_surface != text_input->wl_surface) + { + wayland_win_data_release(data); + goto err; + } + + wayland_surface_coords_from_window(surface, + rect.left - surface->window.rect.left, + rect.top - surface->window.rect.top, + &cursor_x, &cursor_y); + wayland_surface_coords_from_window(surface, + rect.right - rect.left, + rect.bottom - rect.top, + &cursor_width, &cursor_height); + wayland_win_data_release(data); + + zwp_text_input_v3_set_cursor_rectangle(text_input->zwp_text_input_v3, + cursor_x, cursor_y, cursor_width, cursor_height); + zwp_text_input_v3_commit(text_input->zwp_text_input_v3); + + pthread_mutex_unlock(&text_input->mutex); + return TRUE; + +err: + pthread_mutex_unlock(&text_input->mutex); + return FALSE; +} diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index 60c345e6601..afc480e6652 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -392,6 +392,7 @@ RGNDATA *get_region_data(HRGN region); BOOL WAYLAND_ClipCursor(const RECT *clip, BOOL reset); LRESULT WAYLAND_DesktopWindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp); void WAYLAND_DestroyWindow(HWND hwnd); +BOOL WAYLAND_SetIMECompositionRect(HWND hwnd, RECT rect); void WAYLAND_SetCursor(HWND hwnd, HCURSOR hcursor); void WAYLAND_SetWindowText(HWND hwnd, LPCWSTR text); LRESULT WAYLAND_SysCommand(HWND hwnd, WPARAM wparam, LPARAM lparam, const POINT *pos); diff --git a/dlls/winewayland.drv/waylanddrv_main.c b/dlls/winewayland.drv/waylanddrv_main.c index 47c1299dd01..633b2f4a043 100644 --- a/dlls/winewayland.drv/waylanddrv_main.c +++ b/dlls/winewayland.drv/waylanddrv_main.c @@ -38,6 +38,7 @@ static const struct user_driver_funcs waylanddrv_funcs = .pClipCursor = WAYLAND_ClipCursor, .pDesktopWindowProc = WAYLAND_DesktopWindowProc, .pDestroyWindow = WAYLAND_DestroyWindow, + .pSetIMECompositionRect = WAYLAND_SetIMECompositionRect, .pKbdLayerDescriptor = WAYLAND_KbdLayerDescriptor, .pReleaseKbdTables = WAYLAND_ReleaseKbdTables, .pSetCursor = WAYLAND_SetCursor,