summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/platform/wayland/ime.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/platform/wayland/ime.c b/src/platform/wayland/ime.c
index 62e5936..4af55b3 100644
--- a/src/platform/wayland/ime.c
+++ b/src/platform/wayland/ime.c
@@ -1,4 +1,5 @@
#include "internal.h"
+#include "yasl/yasl.h"
#include <errno.h>
@@ -35,6 +36,18 @@ void ime_send_caret(struct wayland_surface *w)
wayland_surface_update_text_input(w);
}
+/* yasl's purposes are its own values. The protocol's values differ, so map
+ * each one. Unknown values fall back to normal text. */
+static uint32_t content_purpose(unsigned purpose)
+{
+ switch (purpose) {
+ case YASL_TEXT_PASSWORD: return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PASSWORD;
+ case YASL_TEXT_NUMBER: return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NUMBER;
+ case YASL_TEXT_TERMINAL: return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_TERMINAL;
+ default: return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL;
+ }
+}
+
bool wayland_surface_update_text_input(struct wayland_surface *w)
{
if (!w || !w->conn) {
@@ -61,11 +74,8 @@ bool wayland_surface_update_text_input(struct wayland_surface *w)
zwp_text_input_v3_enable(seat->text_input);
seat->ime_enabled = true;
}
- unsigned purpose = w->base.text_purpose;
- if (purpose > ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_TERMINAL)
- purpose = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL;
zwp_text_input_v3_set_content_type(seat->text_input,
- ZWP_TEXT_INPUT_V3_CONTENT_HINT_NONE, purpose);
+ ZWP_TEXT_INPUT_V3_CONTENT_HINT_NONE, content_purpose(w->base.text_purpose));
const char *surrounding = w->base.text_surrounding ? w->base.text_surrounding : "";
size_t length = w->base.text_surrounding ? w->base.text_length : 0;
size_t cursor = w->base.text_surrounding ? w->base.text_end : 0;