From: Attila Fidan dev@print0.net
--- dlls/winewayland.drv/wayland_text_input.c | 52 +++++++++++++++++++++++ dlls/winewayland.drv/waylanddrv.h | 2 + 2 files changed, 54 insertions(+)
diff --git a/dlls/winewayland.drv/wayland_text_input.c b/dlls/winewayland.drv/wayland_text_input.c index 56c17cc3cc6..cc17b494e8b 100644 --- a/dlls/winewayland.drv/wayland_text_input.c +++ b/dlls/winewayland.drv/wayland_text_input.c @@ -24,11 +24,38 @@
#include "config.h"
+#include <assert.h> +#include <stdlib.h> + #include "waylanddrv.h" #include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(imm);
+static void post_ime_update(HWND hwnd, UINT cursor_pos, WCHAR *comp_str, WCHAR *result_str) +{ + NtUserMessageCall(hwnd, WINE_IME_POST_UPDATE, cursor_pos, (LPARAM)comp_str, result_str, + NtUserImeDriverCall, FALSE); +} + +static WCHAR *strdupUtoW(const char *str) +{ + WCHAR *ret = NULL; + size_t len; + DWORD reslen; + + if (!str) return ret; + len = strlen(str); + ret = malloc((len + 1) * sizeof(WCHAR)); + if (ret) + { + RtlUTF8ToUnicodeN(ret, len * sizeof(WCHAR), &reslen, str, len); + reslen /= sizeof(WCHAR); + ret[reslen] = 0; + } + return ret; +} + static void text_input_enter(void *data, struct zwp_text_input_v3 *zwp_text_input_v3, struct wl_surface *surface) { @@ -42,6 +69,7 @@ static void text_input_enter(void *data, struct zwp_text_input_v3 *zwp_text_inpu ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL); zwp_text_input_v3_set_cursor_rectangle(text_input->zwp_text_input_v3, 0, 0, 0, 0); zwp_text_input_v3_commit(text_input->zwp_text_input_v3); + text_input->wl_surface = surface; pthread_mutex_unlock(&text_input->mutex); }
@@ -54,6 +82,7 @@ static void text_input_leave(void *data, struct zwp_text_input_v3 *zwp_text_inpu pthread_mutex_lock(&text_input->mutex); zwp_text_input_v3_disable(text_input->zwp_text_input_v3); zwp_text_input_v3_commit(text_input->zwp_text_input_v3); + text_input->wl_surface = NULL; pthread_mutex_unlock(&text_input->mutex); }
@@ -65,6 +94,12 @@ static void text_input_preedit_string(void *data, struct zwp_text_input_v3 *zwp_ static void text_input_commit_string(void *data, struct zwp_text_input_v3 *zwp_text_input_v3, const char *text) { + struct wayland_text_input *text_input = data; + TRACE("data %p, text_input %p, text %s.\n", data, zwp_text_input_v3, debugstr_a(text)); + + pthread_mutex_lock(&text_input->mutex); + text_input->commit_string = strdup(text); + pthread_mutex_unlock(&text_input->mutex); }
static void text_input_delete_surrounding_text(void *data, @@ -75,6 +110,22 @@ static void text_input_delete_surrounding_text(void *data, static void text_input_done(void *data, struct zwp_text_input_v3 *zwp_text_input_v3, uint32_t serial) { + struct wayland_text_input *text_input = data; + WCHAR *wide_commit; + HWND hwnd; + TRACE("data %p, text_input %p, serial %u.\n", data, zwp_text_input_v3, serial); + + pthread_mutex_lock(&text_input->mutex); + assert(text_input->wl_surface); + hwnd = wl_surface_get_user_data(text_input->wl_surface); + + wide_commit = strdupUtoW(text_input->commit_string); + post_ime_update(hwnd, 0, NULL, wide_commit); + free(wide_commit); + + free(text_input->commit_string); + text_input->commit_string = NULL; + pthread_mutex_unlock(&text_input->mutex); }
static const struct zwp_text_input_v3_listener text_input_listener = @@ -105,5 +156,6 @@ void wayland_text_input_deinit(void) pthread_mutex_lock(&text_input->mutex); zwp_text_input_v3_destroy(text_input->zwp_text_input_v3); text_input->zwp_text_input_v3 = NULL; + text_input->wl_surface = NULL; pthread_mutex_unlock(&text_input->mutex); }; diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index c5dec335485..31ea950fa4d 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -115,6 +115,8 @@ struct wayland_pointer struct wayland_text_input { struct zwp_text_input_v3 *zwp_text_input_v3; + char *commit_string; + struct wl_surface *wl_surface; pthread_mutex_t mutex; };