public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/ibus] autotool: Resolves #2237486 Implement preedit color in Plasma Wayland
@ 2026-05-31  2:08 Takao Fujiwara
  0 siblings, 0 replies; only message in thread
From: Takao Fujiwara @ 2026-05-31  2:08 UTC (permalink / raw)
  To: git-commits

A new commit has been pushed.

Repo   : rpms/ibus
Branch : autotool
Commit : 52531c070db5da1bee1ab0e6645102df8c6aa1f8
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date   : 2023-09-07T14:41:32+09:00
Stats  : +1216/-1 in 3 file(s)
URL    : https://src.fedoraproject.org/rpms/ibus/c/52531c070db5da1bee1ab0e6645102df8c6aa1f8?branch=autotool

Log:
Resolves #2237486 Implement preedit color in Plasma Wayland

---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
index e69de29..d986cb4 100644
--- a/ibus-HEAD.patch
+++ b/ibus-HEAD.patch
@@ -0,0 +1,1208 @@
+From af5471beb784dda626eb272f852f279f1a61ebb9 Mon Sep 17 00:00:00 2001
+From: fujiwarat <takao.fujiwara1@gmail.com>
+Date: Thu, 7 Sep 2023 13:46:29 +0900
+Subject: [PATCH] client/wayland: Implement preedit color in Plasma Wayland
+
+Wayland input-method protocol version 1 supports the preedit style
+with text-input protocol version 1 in Plasma Wayland.
+GNOME Wayland uses text-input version 3 which deletes the preedit style.
+
+Now IBus supports the preedit color for anthy, hangul, table,
+typing-booster.
+
+This change now also supports
+ibus_engine_update_preedit_text_with_mode()
+
+Rf. https://github.com/ibus/ibus/wiki/Wayland-Colors
+
+BUG=rhbz#2237486
+---
+ client/wayland/Makefile.am                    |   1 +
+ client/wayland/ibuswaylandim.c                | 175 +++-
+ .../text-input-unstable-v1-client-protocol.h  | 847 ++++++++++++++++++
+ src/ibusattribute.h                           |  52 +-
+ 4 files changed, 1072 insertions(+), 3 deletions(-)
+ create mode 100644 client/wayland/text-input-unstable-v1-client-protocol.h
+
+diff --git a/client/wayland/Makefile.am b/client/wayland/Makefile.am
+index 7e8d18af..94e357b4 100644
+--- a/client/wayland/Makefile.am
++++ b/client/wayland/Makefile.am
+@@ -31,6 +31,7 @@ DISTCLEANFILES =
+ protocol_sources = \
+     input-method-unstable-v1-client-protocol.h \
+     input-method-unstable-v1-protocol.c \
++    text-input-unstable-v1-client-protocol.h \
+     $(NULL)
+ 
+ ibus_wayland_SOURCES = \
+diff --git a/client/wayland/ibuswaylandim.c b/client/wayland/ibuswaylandim.c
+index ffc20de1..bf321a71 100644
+--- a/client/wayland/ibuswaylandim.c
++++ b/client/wayland/ibuswaylandim.c
+@@ -32,6 +32,7 @@
+ #include <xkbcommon/xkbcommon.h>
+ 
+ #include "input-method-unstable-v1-client-protocol.h"
++#include "text-input-unstable-v1-client-protocol.h"
+ #include "ibuswaylandim.h"
+ 
+ enum {
+@@ -58,6 +59,7 @@ struct _IBusWaylandIMPrivate
+     IBusInputContext *ibuscontext;
+     IBusText *preedit_text;
+     guint preedit_cursor_pos;
++    guint preedit_mode;
+     IBusModifierType modifiers;
+ 
+     struct xkb_context *xkb_context;
+@@ -266,12 +268,175 @@ _context_forward_key_event_cb (IBusInputContext *context,
+ }
+ 
+ 
++/**
++ * ibus_wayland_im_update_preedit_style:
++ * @wlim: An #IBusWaylandIM
++ *
++ * Convert RGB values to IBusAttrPreedit at first.
++ * Convert IBusAttrPreedit to zwp_text_input_v1_preedit_style at second.
++ *
++ * RF. https://github.com/ibus/ibus/wiki/Wayland-Colors
++ */
++static void
++ibus_wayland_im_update_preedit_style (IBusWaylandIM *wlim)
++{
++    IBusWaylandIMPrivate *priv;
++    IBusAttrList *attrs;
++    guint i;
++    const char *str;
++    uint32_t whole_wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_DEFAULT;
++
++    g_return_if_fail (IBUS_IS_WAYLAND_IM (wlim));
++    priv = ibus_wayland_im_get_instance_private (wlim);
++    if (!priv->preedit_text)
++        return;
++    attrs = priv->preedit_text->attrs;
++    if (!attrs)
++        return;
++    for (i = 0; ; i++) {
++        IBusAttribute *attr = ibus_attr_list_get (attrs, i);
++        IBusAttrPreedit istyle = IBUS_ATTR_PREEDIT_DEFAULT;
++        uint32_t wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_DEFAULT;
++        uint32_t start, end;
++        if (attr == NULL)
++                break;
++        switch (attr->type) {
++        case IBUS_ATTR_TYPE_UNDERLINE:
++            istyle = IBUS_ATTR_PREEDIT_WHOLE;
++            break;
++        case IBUS_ATTR_TYPE_FOREGROUND:
++            switch (attr->value) {
++            case 0x7F7F7F: /* typing-booster */
++                istyle = IBUS_ATTR_PREEDIT_PREDICTION;
++                break;
++            case 0xF90F0F: /* table */
++                istyle = IBUS_ATTR_PREEDIT_PREFIX;
++                break;
++            case 0x1EDC1A: /* table */
++                istyle = IBUS_ATTR_PREEDIT_SUFFIX;
++                break;
++            case 0xA40000: /* typing-booster, table */
++                istyle = IBUS_ATTR_PREEDIT_ERROR_SPELLING;
++                break;
++            case 0xFF00FF: /* typing-booster */
++                istyle = IBUS_ATTR_PREEDIT_ERROR_COMPOSE;
++                break;
++            case 0x0: /* Japanese */
++            case 0xFF000000:
++                break;
++            case 0xFFFFFF: /* hangul */
++            case 0xFFFFFFFF:
++                istyle = IBUS_ATTR_PREEDIT_SELECTION;
++                break;
++            default: /* Custom */
++                istyle = IBUS_ATTR_PREEDIT_NONE;
++            }
++            break;
++        case IBUS_ATTR_TYPE_BACKGROUND:
++            switch (attr->value) {
++            case 0xC8C8F0: /* Japanese */
++            case 0xFFC8C8F0:
++                istyle = IBUS_ATTR_PREEDIT_SELECTION;
++                break;
++            default:; /* Custom */
++            }
++            break;
++        default:
++            istyle = IBUS_ATTR_PREEDIT_NONE;
++        }
++        switch (istyle) {
++        case IBUS_ATTR_PREEDIT_NONE:
++            wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_NONE;
++            break;
++        case IBUS_ATTR_PREEDIT_WHOLE:
++            wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_UNDERLINE;
++            break;
++        case IBUS_ATTR_PREEDIT_SELECTION:
++            wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_SELECTION;
++            break;
++        case IBUS_ATTR_PREEDIT_PREDICTION:
++            wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INACTIVE;
++            break;
++        case IBUS_ATTR_PREEDIT_PREFIX:
++            wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_HIGHLIGHT;
++            break;
++        case IBUS_ATTR_PREEDIT_SUFFIX:
++            wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INACTIVE;
++            break;
++        case IBUS_ATTR_PREEDIT_ERROR_SPELLING:
++            wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INCORRECT;
++            break;
++        case IBUS_ATTR_PREEDIT_ERROR_COMPOSE:
++            wstyle = ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INCORRECT;
++            break;
++        default:;
++        }
++        if (wstyle == ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_DEFAULT)
++            continue;
++        str = priv->preedit_text->text;
++        start = g_utf8_offset_to_pointer (str, attr->start_index) - str;
++        end = g_utf8_offset_to_pointer (str, attr->end_index) - str;
++        /* Double styles cannot be applied likes the underline and
++         * preedit color. */
++        if (start == 0 && strlen (str) == end &&
++            (i > 0 || ibus_attr_list_get (attrs, i + 1))) {
++            whole_wstyle = wstyle;
++            continue;
++        }
++        if (start > end) {
++            g_warning ("Wrong start %d and end %d for %s", start, end, str);
++            return;
++        }
++        zwp_input_method_context_v1_preedit_styling (priv->context,
++                                                     start,
++                                                     end - start,
++                                                     wstyle);
++    }
++    if (whole_wstyle != ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_DEFAULT) {
++        uint32_t whole_start = 0;
++        uint32_t whole_end = strlen (str);
++        uint32_t start, end;
++        gboolean drawn = FALSE;
++        for (i = 0; ; i++) {
++            IBusAttribute *attr = ibus_attr_list_get (attrs, i);
++            if (!attr)
++                break;
++            start = g_utf8_offset_to_pointer (str, attr->start_index) - str;
++            end = g_utf8_offset_to_pointer (str, attr->end_index) - str;
++            if (start == 0 && strlen (str) == end)
++                continue;
++            if (start == 0) {
++                whole_start = end;
++            } else if (strlen (str) == end) {
++                whole_end = start;
++            } else {
++                whole_start = start;
++                whole_end = end;
++                zwp_input_method_context_v1_preedit_styling (
++                        priv->context,
++                        whole_start,
++                        whole_end - whole_start,
++                        whole_wstyle);
++                drawn = TRUE;
++            }
++        }
++        if (!drawn) {
++            zwp_input_method_context_v1_preedit_styling (
++                priv->context,
++                whole_start,
++                whole_end - whole_start,
++                whole_wstyle);
++        }
++    }
++}
++
+ static void
+ _context_show_preedit_text_cb (IBusInputContext *context,
+                                IBusWaylandIM    *wlim)
+ {
+     IBusWaylandIMPrivate *priv;
+     uint32_t cursor;
++    const char *commit = "";
+     g_return_if_fail (IBUS_IS_WAYLAND_IM (wlim));
+     priv = ibus_wayland_im_get_instance_private (wlim);
+     /* CURSOR is byte offset.  */
+@@ -282,10 +447,13 @@ _context_show_preedit_text_cb (IBusInputContext *context,
+ 
+     zwp_input_method_context_v1_preedit_cursor (priv->context,
+                                                 cursor);
++    ibus_wayland_im_update_preedit_style (wlim);
++    if (priv->preedit_mode == IBUS_ENGINE_PREEDIT_COMMIT)
++        commit = priv->preedit_text->text;
+     zwp_input_method_context_v1_preedit_string (priv->context,
+                                                 priv->serial,
+                                                 priv->preedit_text->text,
+-                                                priv->preedit_text->text);
++                                                commit);
+ }
+ 
+ 
+@@ -308,6 +476,7 @@ _context_update_preedit_text_cb (IBusInputContext *context,
+                                  IBusText         *text,
+                                  gint              cursor_pos,
+                                  gboolean          visible,
++                                 guint             mode,
+                                  IBusWaylandIM    *wlim)
+ {
+     IBusWaylandIMPrivate *priv;
+@@ -317,6 +486,7 @@ _context_update_preedit_text_cb (IBusInputContext *context,
+         g_object_unref (priv->preedit_text);
+     priv->preedit_text = g_object_ref_sink (text);
+     priv->preedit_cursor_pos = cursor_pos;
++    priv->preedit_mode = mode;
+ 
+     if (visible)
+         _context_show_preedit_text_cb (context, wlim);
+@@ -977,7 +1147,7 @@ _create_input_context_done (GObject      *object,
+                           G_CALLBACK (_context_forward_key_event_cb),
+                           wlim);
+ 
+-        g_signal_connect (priv->ibuscontext, "update-preedit-text",
++        g_signal_connect (priv->ibuscontext, "update-preedit-text-with-mode",
+                           G_CALLBACK (_context_update_preedit_text_cb),
+                           wlim);
+         g_signal_connect (priv->ibuscontext, "show-preedit-text",
+@@ -994,6 +1164,7 @@ _create_input_context_done (GObject      *object,
+             capabilities |= IBUS_CAP_SYNC_PROCESS_KEY_V2;
+         ibus_input_context_set_capabilities (priv->ibuscontext,
+                                              capabilities);
++        ibus_input_context_set_client_commit_preedit (priv->ibuscontext, TRUE);
+         if (_use_sync_mode == 1) {
+             ibus_input_context_set_post_process_key_event (priv->ibuscontext,
+                                                            TRUE);
+diff --git a/client/wayland/text-input-unstable-v1-client-protocol.h b/client/wayland/text-input-unstable-v1-client-protocol.h
+new file mode 100644
+index 00000000..71069ec7
+--- /dev/null
++++ b/client/wayland/text-input-unstable-v1-client-protocol.h
+@@ -0,0 +1,847 @@
++/* Generated by wayland-scanner 1.22.0 */
++
++#ifndef TEXT_INPUT_UNSTABLE_V1_CLIENT_PROTOCOL_H
++#define TEXT_INPUT_UNSTABLE_V1_CLIENT_PROTOCOL_H
++
++#include <stdint.h>
++#include <stddef.h>
++#include "wayland-client.h"
++
++#ifdef  __cplusplus
++extern "C" {
++#endif
++
++/**
++ * @page page_text_input_unstable_v1 The text_input_unstable_v1 protocol
++ * @section page_ifaces_text_input_unstable_v1 Interfaces
++ * - @subpage page_iface_zwp_text_input_v1 - text input
++ * - @subpage page_iface_zwp_text_input_manager_v1 - text input manager
++ * @section page_copyright_text_input_unstable_v1 Copyright
++ * <pre>
++ *
++ * Copyright © 2012, 2013 Intel Corporation
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice (including the next
++ * paragraph) shall be included in all copies or substantial portions of the
++ * Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
++ * DEALINGS IN THE SOFTWARE.
++ * </pre>
++ */
++struct wl_seat;
++struct wl_surface;
++struct zwp_text_input_manager_v1;
++struct zwp_text_input_v1;
++
++#ifndef ZWP_TEXT_INPUT_V1_INTERFACE
++#define ZWP_TEXT_INPUT_V1_INTERFACE
++/**
++ * @page page_iface_zwp_text_input_v1 zwp_text_input_v1
++ * @section page_iface_zwp_text_input_v1_desc Description
++ *
++ * An object used for text input. Adds support for text input and input
++ * methods to applications. A text_input object is created from a
++ * wl_text_input_manager and corresponds typically to a text entry in an
++ * application.
++ *
++ * Requests are used to activate/deactivate the text_input object and set
++ * state information like surrounding and selected text or the content type.
++ * The information about entered text is sent to the text_input object via
++ * the pre-edit and commit events. Using this interface removes the need
++ * for applications to directly process hardware key events and compose text
++ * out of them.
++ *
++ * Text is generally UTF-8 encoded, indices and lengths are in bytes.
++ *
++ * Serials are used to synchronize the state between the text input and
++ * an input method. New serials are sent by the text input in the
++ * commit_state request and are used by the input method to indicate
++ * the known text input state in events like preedit_string, commit_string,
++ * and keysym. The text input can then ignore events from the input method
++ * which are based on an outdated state (for example after a reset).
++ *
++ * Warning! The protocol described in this file is experimental and
++ * backward incompatible changes may be made. Backward compatible changes
++ * may be added together with the corresponding interface version bump.
++ * Backward incompatible changes are done by bumping the version number in
++ * the protocol and interface names and resetting the interface version.
++ * Once the protocol is to be declared stable, the 'z' prefix and the
++ * version number in the protocol and interface names are removed and the
++ * interface version number is reset.
++ * @section page_iface_zwp_text_input_v1_api API
++ * See @ref iface_zwp_text_input_v1.
++ */
++/**
++ * @defgroup iface_zwp_text_input_v1 The zwp_text_input_v1 interface
++ *
++ * An object used for text input. Adds support for text input and input
++ * methods to applications. A text_input object is created from a
++ * wl_text_input_manager and corresponds typically to a text entry in an
++ * application.
++ *
++ * Requests are used to activate/deactivate the text_input object and set
++ * state information like surrounding and selected text or the content type.
++ * The information about entered text is sent to the text_input object via
++ * the pre-edit and commit events. Using this interface removes the need
++ * for applications to directly process hardware key events and compose text
++ * out of them.
++ *
++ * Text is generally UTF-8 encoded, indices and lengths are in bytes.
++ *
++ * Serials are used to synchronize the state between the text input and
++ * an input method. New serials are sent by the text input in the
++ * commit_state request and are used by the input method to indicate
++ * the known text input state in events like preedit_string, commit_string,
++ * and keysym. The text input can then ignore events from the input method
++ * which are based on an outdated state (for example after a reset).
++ *
++ * Warning! The protocol described in this file is experimental and
++ * backward incompatible changes may be made. Backward compatible changes
++ * may be added together with the corresponding interface version bump.
++ * Backward incompatible changes are done by bumping the version number in
++ * the protocol and interface names and resetting the interface version.
++ * Once the protocol is to be declared stable, the 'z' prefix and the
++ * version number in the protocol and interface names are removed and the
++ * interface version number is reset.
++ */
++extern const struct wl_interface zwp_text_input_v1_interface;
++#endif
++#ifndef ZWP_TEXT_INPUT_MANAGER_V1_INTERFACE
++#define ZWP_TEXT_INPUT_MANAGER_V1_INTERFACE
++/**
++ * @page page_iface_zwp_text_input_manager_v1 zwp_text_input_manager_v1
++ * @section page_iface_zwp_text_input_manager_v1_desc Description
++ *
++ * A factory for text_input objects. This object is a global singleton.
++ * @section page_iface_zwp_text_input_manager_v1_api API
++ * See @ref iface_zwp_text_input_manager_v1.
++ */
++/**
++ * @defgroup iface_zwp_text_input_manager_v1 The zwp_text_input_manager_v1 interface
++ *
++ * A factory for text_input objects. This object is a global singleton.
++ */
++extern const struct wl_interface zwp_text_input_manager_v1_interface;
++#endif
++
++#ifndef ZWP_TEXT_INPUT_V1_CONTENT_HINT_ENUM
++#define ZWP_TEXT_INPUT_V1_CONTENT_HINT_ENUM
++/**
++ * @ingroup iface_zwp_text_input_v1
++ * content hint
++ *
++ * Content hint is a bitmask to allow to modify the behavior of the text
++ * input.
++ */
++enum zwp_text_input_v1_content_hint {
++	/**
++	 * no special behaviour
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_NONE = 0x0,
++	/**
++	 * auto completion, correction and capitalization
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_DEFAULT = 0x7,
++	/**
++	 * hidden and sensitive text
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_PASSWORD = 0xc0,
++	/**
++	 * suggest word completions
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_AUTO_COMPLETION = 0x1,
++	/**
++	 * suggest word corrections
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_AUTO_CORRECTION = 0x2,
++	/**
++	 * switch to uppercase letters at the start of a sentence
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_AUTO_CAPITALIZATION = 0x4,
++	/**
++	 * prefer lowercase letters
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_LOWERCASE = 0x8,
++	/**
++	 * prefer uppercase letters
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_UPPERCASE = 0x10,
++	/**
++	 * prefer casing for titles and headings (can be language dependent)
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_TITLECASE = 0x20,
++	/**
++	 * characters should be hidden
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_HIDDEN_TEXT = 0x40,
++	/**
++	 * typed text should not be stored
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_SENSITIVE_DATA = 0x80,
++	/**
++	 * just latin characters should be entered
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_LATIN = 0x100,
++	/**
++	 * the text input is multiline
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_HINT_MULTILINE = 0x200,
++};
++#endif /* ZWP_TEXT_INPUT_V1_CONTENT_HINT_ENUM */
++
++#ifndef ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_ENUM
++#define ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_ENUM
++/**
++ * @ingroup iface_zwp_text_input_v1
++ * content purpose
++ *
++ * The content purpose allows to specify the primary purpose of a text
++ * input.
++ *
++ * This allows an input method to show special purpose input panels with
++ * extra characters or to disallow some characters.
++ */
++enum zwp_text_input_v1_content_purpose {
++	/**
++	 * default input, allowing all characters
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_NORMAL = 0,
++	/**
++	 * allow only alphabetic characters
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_ALPHA = 1,
++	/**
++	 * allow only digits
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_DIGITS = 2,
++	/**
++	 * input a number (including decimal separator and sign)
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_NUMBER = 3,
++	/**
++	 * input a phone number
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_PHONE = 4,
++	/**
++	 * input an URL
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_URL = 5,
++	/**
++	 * input an email address
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_EMAIL = 6,
++	/**
++	 * input a name of a person
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_NAME = 7,
++	/**
++	 * input a password (combine with password or sensitive_data hint)
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_PASSWORD = 8,
++	/**
++	 * input a date
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_DATE = 9,
++	/**
++	 * input a time
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_TIME = 10,
++	/**
++	 * input a date and time
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_DATETIME = 11,
++	/**
++	 * input for a terminal
++	 */
++	ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_TERMINAL = 12,
++};
++#endif /* ZWP_TEXT_INPUT_V1_CONTENT_PURPOSE_ENUM */
++
++#ifndef ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_ENUM
++#define ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_ENUM
++enum zwp_text_input_v1_preedit_style {
++	/**
++	 * default style for composing text
++	 */
++	ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_DEFAULT = 0,
++	/**
++	 * style should be the same as in non-composing text
++	 */
++	ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_NONE = 1,
++	ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_ACTIVE = 2,
++	ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INACTIVE = 3,
++	ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_HIGHLIGHT = 4,
++	ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_UNDERLINE = 5,
++	ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_SELECTION = 6,
++	ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_INCORRECT = 7,
++};
++#endif /* ZWP_TEXT_INPUT_V1_PREEDIT_STYLE_ENUM */
++
++#ifndef ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_ENUM
++#define ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_ENUM
++enum zwp_text_input_v1_text_direction {
++	/**
++	 * automatic text direction based on text and language
++	 */
++	ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_AUTO = 0,
++	/**
++	 * left-to-right
++	 */
++	ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_LTR = 1,
++	/**
++	 * right-to-left
++	 */
++	ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_RTL = 2,
++};
++#endif /* ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_ENUM */
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ * @struct zwp_text_input_v1_listener
++ */
++struct zwp_text_input_v1_listener {
++	/**
++	 * enter event
++	 *
++	 * Notify the text_input object when it received focus. Typically
++	 * in response to an activate request.
++	 */
++	void (*enter)(void *data,
++		      struct zwp_text_input_v1 *zwp_text_input_v1,
++		      struct wl_surface *surface);
++	/**
++	 * leave event
++	 *
++	 * Notify the text_input object when it lost focus. Either in
++	 * response to a deactivate request or when the assigned surface
++	 * lost focus or was destroyed.
++	 */
++	void (*leave)(void *data,
++		      struct zwp_text_input_v1 *zwp_text_input_v1);
++	/**
++	 * modifiers map
++	 *
++	 * Transfer an array of 0-terminated modifier names. The position
++	 * in the array is the index of the modifier as used in the
++	 * modifiers bitmask in the keysym event.
++	 */
++	void (*modifiers_map)(void *data,
++			      struct zwp_text_input_v1 *zwp_text_input_v1,
++			      struct wl_array *map);
++	/**
++	 * state of the input panel
++	 *
++	 * Notify when the visibility state of the input panel changed.
++	 */
++	void (*input_panel_state)(void *data,
++				  struct zwp_text_input_v1 *zwp_text_input_v1,
++				  uint32_t state);
++	/**
++	 * pre-edit
++	 *
++	 * Notify when a new composing text (pre-edit) should be set
++	 * around the current cursor position. Any previously set composing
++	 * text should be removed.
++	 *
++	 * The commit text can be used to replace the preedit text on reset
++	 * (for example on unfocus).
++	 *
++	 * The text input should also handle all preedit_style and
++	 * preedit_cursor events occurring directly before preedit_string.
++	 * @param serial serial of the latest known text input state
++	 */
++	void (*preedit_string)(void *data,
++			       struct zwp_text_input_v1 *zwp_text_input_v1,
++			       uint32_t serial,
++			       const char *text,
++			       const char *commit);
++	/**
++	 * pre-edit styling
++	 *
++	 * Sets styling information on composing text. The style is
++	 * applied for length bytes from index relative to the beginning of
++	 * the composing text (as byte offset). Multiple styles can be
++	 * applied to a composing text by sending multiple preedit_styling
++	 * events.
++	 *
++	 * This event is handled as part of a following preedit_string
++	 * event.
++	 */
++	void (*preedit_styling)(void *data,
++				struct zwp_text_input_v1 *zwp_text_input_v1,
++				uint32_t index,
++				uint32_t length,
++				uint32_t style);
++	/**
++	 * pre-edit cursor
++	 *
++	 * Sets the cursor position inside the composing text (as byte
++	 * offset) relative to the start of the composing text. When index
++	 * is a negative number no cursor is shown.
++	 *
++	 * This event is handled as part of a following preedit_string
++	 * event.
++	 */
++	void (*preedit_cursor)(void *data,
++			       struct zwp_text_input_v1 *zwp_text_input_v1,
++			       int32_t index);
++	/**
++	 * commit
++	 *
++	 * Notify when text should be inserted into the editor widget.
++	 * The text to commit could be either just a single character after
++	 * a key press or the result of some composing (pre-edit). It could
++	 * also be an empty text when some text should be removed (see
++	 * delete_surrounding_text) or when the input cursor should be
++	 * moved (see cursor_position).
++	 *
++	 * Any previously set composing text should be removed.
++	 * @param serial serial of the latest known text input state
++	 */
++	void (*commit_string)(void *data,
++			      struct zwp_text_input_v1 *zwp_text_input_v1,
++			      uint32_t serial,
++			      const char *text);
++	/**
++	 * set cursor to new position
++	 *
++	 * Notify when the cursor or anchor position should be modified.
++	 *
++	 * This event should be handled as part of a following
++	 * commit_string event.
++	 */
++	void (*cursor_position)(void *data,
++				struct zwp_text_input_v1 *zwp_text_input_v1,
++				int32_t index,
++				int32_t anchor);
++	/**
++	 * delete surrounding text
++	 *
++	 * Notify when the text around the current cursor position should
++	 * be deleted.
++	 *
++	 * Index is relative to the current cursor (in bytes). Length is
++	 * the length of deleted text (in bytes).
++	 *
++	 * This event should be handled as part of a following
++	 * commit_string event.
++	 */
++	void (*delete_surrounding_text)(void *data,
++					struct zwp_text_input_v1 *zwp_text_input_v1,
++					int32_t index,
++					uint32_t length);
++	/**
++	 * keysym
++	 *
++	 * Notify when a key event was sent. Key events should not be
++	 * used for normal text input operations, which should be done with
++	 * commit_string, delete_surrounding_text, etc. The key event
++	 * follows the wl_keyboard key event convention. Sym is an XKB
++	 * keysym, state a wl_keyboard key_state. Modifiers are a mask for
++	 * effective modifiers (where the modifier indices are set by the
++	 * modifiers_map event)
++	 * @param serial serial of the latest known text input state
++	 */
++	void (*keysym)(void *data,
++		       struct zwp_text_input_v1 *zwp_text_input_v1,
++		       uint32_t serial,
++		       uint32_t time,
++		       uint32_t sym,
++		       uint32_t state,
++		       uint32_t modifiers);
++	/**
++	 * language
++	 *
++	 * Sets the language of the input text. The "language" argument
++	 * is an RFC-3066 format language tag.
++	 * @param serial serial of the latest known text input state
++	 */
++	void (*language)(void *data,
++			 struct zwp_text_input_v1 *zwp_text_input_v1,
++			 uint32_t serial,
++			 const char *language);
++	/**
++	 * text direction
++	 *
++	 * Sets the text direction of input text.
++	 *
++	 * It is mainly needed for showing an input cursor on the correct
++	 * side of the editor when there is no input done yet and making
++	 * sure neutral direction text is laid out properly.
++	 * @param serial serial of the latest known text input state
++	 */
++	void (*text_direction)(void *data,
++			       struct zwp_text_input_v1 *zwp_text_input_v1,
++			       uint32_t serial,
++			       uint32_t direction);
++};
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++static inline int
++zwp_text_input_v1_add_listener(struct zwp_text_input_v1 *zwp_text_input_v1,
++			       const struct zwp_text_input_v1_listener *listener, void *data)
++{
++	return wl_proxy_add_listener((struct wl_proxy *) zwp_text_input_v1,
++				     (void (**)(void)) listener, data);
++}
++
++#define ZWP_TEXT_INPUT_V1_ACTIVATE 0
++#define ZWP_TEXT_INPUT_V1_DEACTIVATE 1
++#define ZWP_TEXT_INPUT_V1_SHOW_INPUT_PANEL 2
++#define ZWP_TEXT_INPUT_V1_HIDE_INPUT_PANEL 3
++#define ZWP_TEXT_INPUT_V1_RESET 4
++#define ZWP_TEXT_INPUT_V1_SET_SURROUNDING_TEXT 5
++#define ZWP_TEXT_INPUT_V1_SET_CONTENT_TYPE 6
++#define ZWP_TEXT_INPUT_V1_SET_CURSOR_RECTANGLE 7
++#define ZWP_TEXT_INPUT_V1_SET_PREFERRED_LANGUAGE 8
++#define ZWP_TEXT_INPUT_V1_COMMIT_STATE 9
++#define ZWP_TEXT_INPUT_V1_INVOKE_ACTION 10
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_ENTER_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_LEAVE_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_MODIFIERS_MAP_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_INPUT_PANEL_STATE_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_PREEDIT_STRING_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_PREEDIT_STYLING_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_PREEDIT_CURSOR_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_COMMIT_STRING_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_CURSOR_POSITION_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_DELETE_SURROUNDING_TEXT_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_KEYSYM_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_LANGUAGE_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_TEXT_DIRECTION_SINCE_VERSION 1
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_ACTIVATE_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_DEACTIVATE_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_SHOW_INPUT_PANEL_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_HIDE_INPUT_PANEL_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_RESET_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_SET_SURROUNDING_TEXT_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_SET_CONTENT_TYPE_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_SET_CURSOR_RECTANGLE_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_SET_PREFERRED_LANGUAGE_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_COMMIT_STATE_SINCE_VERSION 1
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++#define ZWP_TEXT_INPUT_V1_INVOKE_ACTION_SINCE_VERSION 1
++
++/** @ingroup iface_zwp_text_input_v1 */
++static inline void
++zwp_text_input_v1_set_user_data(struct zwp_text_input_v1 *zwp_text_input_v1, void *user_data)
++{
++	wl_proxy_set_user_data((struct wl_proxy *) zwp_text_input_v1, user_data);
++}
++
++/** @ingroup iface_zwp_text_input_v1 */
++static inline void *
++zwp_text_input_v1_get_user_data(struct zwp_text_input_v1 *zwp_text_input_v1)
++{
++	return wl_proxy_get_user_data((struct wl_proxy *) zwp_text_input_v1);
++}
++
++static inline uint32_t
++zwp_text_input_v1_get_version(struct zwp_text_input_v1 *zwp_text_input_v1)
++{
++	return wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1);
++}
++
++/** @ingroup iface_zwp_text_input_v1 */
++static inline void
++zwp_text_input_v1_destroy(struct zwp_text_input_v1 *zwp_text_input_v1)
++{
++	wl_proxy_destroy((struct wl_proxy *) zwp_text_input_v1);
++}
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ *
++ * Requests the text_input object to be activated (typically when the
++ * text entry gets focus).
++ *
++ * The seat argument is a wl_seat which maintains the focus for this
++ * activation. The surface argument is a wl_surface assigned to the
++ * text_input object and tracked for focus lost. The enter event
++ * is emitted on successful activation.
++ */
++static inline void
++zwp_text_input_v1_activate(struct zwp_text_input_v1 *zwp_text_input_v1, struct wl_seat *seat, struct wl_surface *surface)
++{
++	wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1,
++			 ZWP_TEXT_INPUT_V1_ACTIVATE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, seat, surface);
++}
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ *
++ * Requests the text_input object to be deactivated (typically when the
++ * text entry lost focus). The seat argument is a wl_seat which was used
++ * for activation.
++ */
++static inline void
++zwp_text_input_v1_deactivate(struct zwp_text_input_v1 *zwp_text_input_v1, struct wl_seat *seat)
++{
++	wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1,
++			 ZWP_TEXT_INPUT_V1_DEACTIVATE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, seat);
++}
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ *
++ * Requests input panels (virtual keyboard) to show.
++ */
++static inline void
++zwp_text_input_v1_show_input_panel(struct zwp_text_input_v1 *zwp_text_input_v1)
++{
++	wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1,
++			 ZWP_TEXT_INPUT_V1_SHOW_INPUT_PANEL, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0);
++}
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ *
++ * Requests input panels (virtual keyboard) to hide.
++ */
++static inline void
++zwp_text_input_v1_hide_input_panel(struct zwp_text_input_v1 *zwp_text_input_v1)
++{
++	wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1,
++			 ZWP_TEXT_INPUT_V1_HIDE_INPUT_PANEL, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0);
++}
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ *
++ * Should be called by an editor widget when the input state should be
++ * reset, for example after the text was changed outside of the normal
++ * input method flow.
++ */
++static inline void
++zwp_text_input_v1_reset(struct zwp_text_input_v1 *zwp_text_input_v1)
++{
++	wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1,
++			 ZWP_TEXT_INPUT_V1_RESET, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0);
++}
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ *
++ * Sets the plain surrounding text around the input position. Text is
++ * UTF-8 encoded. Cursor is the byte offset within the
++ * surrounding text. Anchor is the byte offset of the
++ * selection anchor within the surrounding text. If there is no selected
++ * text anchor, then it is the same as cursor.
++ */
++static inline void
++zwp_text_input_v1_set_surrounding_text(struct zwp_text_input_v1 *zwp_text_input_v1, const char *text, uint32_t cursor, uint32_t anchor)
++{
++	wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1,
++			 ZWP_TEXT_INPUT_V1_SET_SURROUNDING_TEXT, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, text, cursor, anchor);
++}
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ *
++ * Sets the content purpose and content hint. While the purpose is the
++ * basic purpose of an input field, the hint flags allow to modify some
++ * of the behavior.
++ *
++ * When no content type is explicitly set, a normal content purpose with
++ * default hints (auto completion, auto correction, auto capitalization)
++ * should be assumed.
++ */
++static inline void
++zwp_text_input_v1_set_content_type(struct zwp_text_input_v1 *zwp_text_input_v1, uint32_t hint, uint32_t purpose)
++{
++	wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1,
++			 ZWP_TEXT_INPUT_V1_SET_CONTENT_TYPE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, hint, purpose);
++}
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++static inline void
++zwp_text_input_v1_set_cursor_rectangle(struct zwp_text_input_v1 *zwp_text_input_v1, int32_t x, int32_t y, int32_t width, int32_t height)
++{
++	wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1,
++			 ZWP_TEXT_INPUT_V1_SET_CURSOR_RECTANGLE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, x, y, width, height);
++}
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ *
++ * Sets a specific language. This allows for example a virtual keyboard to
++ * show a language specific layout. The "language" argument is an RFC-3066
++ * format language tag.
++ *
++ * It could be used for example in a word processor to indicate the
++ * language of the currently edited document or in an instant message
++ * application which tracks languages of contacts.
++ */
++static inline void
++zwp_text_input_v1_set_preferred_language(struct zwp_text_input_v1 *zwp_text_input_v1, const char *language)
++{
++	wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1,
++			 ZWP_TEXT_INPUT_V1_SET_PREFERRED_LANGUAGE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, language);
++}
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++static inline void
++zwp_text_input_v1_commit_state(struct zwp_text_input_v1 *zwp_text_input_v1, uint32_t serial)
++{
++	wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1,
++			 ZWP_TEXT_INPUT_V1_COMMIT_STATE, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, serial);
++}
++
++/**
++ * @ingroup iface_zwp_text_input_v1
++ */
++static inline void
++zwp_text_input_v1_invoke_action(struct zwp_text_input_v1 *zwp_text_input_v1, uint32_t button, uint32_t index)
++{
++	wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_v1,
++			 ZWP_TEXT_INPUT_V1_INVOKE_ACTION, NULL, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_v1), 0, button, index);
++}
++
++#define ZWP_TEXT_INPUT_MANAGER_V1_CREATE_TEXT_INPUT 0
++
++
++/**
++ * @ingroup iface_zwp_text_input_manager_v1
++ */
++#define ZWP_TEXT_INPUT_MANAGER_V1_CREATE_TEXT_INPUT_SINCE_VERSION 1
++
++/** @ingroup iface_zwp_text_input_manager_v1 */
++static inline void
++zwp_text_input_manager_v1_set_user_data(struct zwp_text_input_manager_v1 *zwp_text_input_manager_v1, void *user_data)
++{
++	wl_proxy_set_user_data((struct wl_proxy *) zwp_text_input_manager_v1, user_data);
++}
++
++/** @ingroup iface_zwp_text_input_manager_v1 */
++static inline void *
++zwp_text_input_manager_v1_get_user_data(struct zwp_text_input_manager_v1 *zwp_text_input_manager_v1)
++{
++	return wl_proxy_get_user_data((struct wl_proxy *) zwp_text_input_manager_v1);
++}
++
++static inline uint32_t
++zwp_text_input_manager_v1_get_version(struct zwp_text_input_manager_v1 *zwp_text_input_manager_v1)
++{
++	return wl_proxy_get_version((struct wl_proxy *) zwp_text_input_manager_v1);
++}
++
++/** @ingroup iface_zwp_text_input_manager_v1 */
++static inline void
++zwp_text_input_manager_v1_destroy(struct zwp_text_input_manager_v1 *zwp_text_input_manager_v1)
++{
++	wl_proxy_destroy((struct wl_proxy *) zwp_text_input_manager_v1);
++}
++
++/**
++ * @ingroup iface_zwp_text_input_manager_v1
++ *
++ * Creates a new text_input object.
++ */
++static inline struct zwp_text_input_v1 *
++zwp_text_input_manager_v1_create_text_input(struct zwp_text_input_manager_v1 *zwp_text_input_manager_v1)
++{
++	struct wl_proxy *id;
++
++	id = wl_proxy_marshal_flags((struct wl_proxy *) zwp_text_input_manager_v1,
++			 ZWP_TEXT_INPUT_MANAGER_V1_CREATE_TEXT_INPUT, &zwp_text_input_v1_interface, wl_proxy_get_version((struct wl_proxy *) zwp_text_input_manager_v1), 0, NULL);
++
++	return (struct zwp_text_input_v1 *) id;
++}
++
++#ifdef  __cplusplus
++}
++#endif
++
++#endif
+diff --git a/src/ibusattribute.h b/src/ibusattribute.h
+index fe4cab45..5cfc36f7 100644
+--- a/src/ibusattribute.h
++++ b/src/ibusattribute.h
+@@ -2,7 +2,8 @@
+ /* vim:set et sts=4: */
+ /* IBus - The Input Bus
+  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
+- * Copyright (C) 2008-2013 Red Hat, Inc.
++ * Copyright (C) 2011-2023 Takao Fujiwara <takao.fujiwara1@gmail.com>
++ * Copyright (C) 2008-2023 Red Hat, Inc.
+  *
+  * This library is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+@@ -91,6 +92,55 @@ typedef enum {
+     IBUS_ATTR_UNDERLINE_ERROR   = 4,
+ } IBusAttrUnderline;
+ 
++
++/**
++ * IBusAttrPreedit:
++ * @IBUS_ATTR_PREEDIT_DEFAULT: Default style for composing text.
++ * @IBUS_ATTR_PREEDIT_NONE: Style should be the same as in non-composing text.
++ * @IBUS_ATTR_PREEDIT_WHOLE: Most language engines wish to draw underline in
++ *                           the typed whole preedit string except for the
++ *                           prediction string. (Chinese, Japanese,
++ *                           Typing-booster)
++ * @IBUS_ATTR_PREEDIT_SELECTION: Modifying an active segment is distinguished
++ *                               against whole the preedit text. (Hangul,
++ *                               Japanese)
++ * @IBUS_ATTR_PREEDIT_PREDICTION: A prediction string can be appended after the
++ *                                typed string. (Typing-booster)
++ * @IBUS_ATTR_PREEDIT_PREFIX: A prefix string can be an informative color.
++ *                            (Table)
++ * @IBUS_ATTR_PREEDIT_SUFFIX: A suffix string can be an informative color.
++ *                            (Table)
++ * @IBUS_ATTR_PREEDIT_ERROR_SPELLING: An detected typo could be an error color
++ *                                    with a spelling check or the word could
++ *                                    not be found in a dictionary. The
++ *                                    underline color also might be more
++ *                                    visible. (Typing-booster, Table)
++ * @IBUS_ATTR_PREEDIT_ERROR_COMPOSE: A wrong compose key could be an error
++ *                                   color. (Typing-booster)
++ *
++ * Type of Pre-edit style as the sematic name.
++ * The Wayland specs prefers to express the semantic values rather than RGB
++ * values and text-input protocol version 1 defines some values:
++ * https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/main/unstable/text-input/text-input-unstable-v1.xml?ref_type=heads#L251
++ *
++ * IBus compiled the values for major input method engines:
++ * https://github.com/ibus/ibus/wiki/Wayland-Colors
++ *
++ * Since: 1.5.29
++ * Stability: Unstable
++ */
++typedef enum {
++    IBUS_ATTR_PREEDIT_DEFAULT = 0,
++    IBUS_ATTR_PREEDIT_NONE,
++    IBUS_ATTR_PREEDIT_WHOLE,
++    IBUS_ATTR_PREEDIT_SELECTION,
++    IBUS_ATTR_PREEDIT_PREDICTION,
++    IBUS_ATTR_PREEDIT_PREFIX,
++    IBUS_ATTR_PREEDIT_SUFFIX,
++    IBUS_ATTR_PREEDIT_ERROR_SPELLING,
++    IBUS_ATTR_PREEDIT_ERROR_COMPOSE,
++} IBusAttrPreedit;
++
+ typedef struct _IBusAttribute IBusAttribute;
+ typedef struct _IBusAttributeClass IBusAttributeClass;
+ 
+-- 
+2.41.0
+

diff --git a/ibus-xinput b/ibus-xinput
index 25bb4ab..3bf9974 100644
--- a/ibus-xinput
+++ b/ibus-xinput
@@ -6,6 +6,9 @@ PREFERENCE_PROGRAM=/usr/bin/ibus-setup
 SHORT_DESC="IBus"
 GTK_IM_MODULE=ibus
 NOT_RUN=gnome3
+# IMSETTINGS_IGNORE_SESSION concatenate the current session name and type x11 or
+# wayland. The current session name is calculated by get_destop()
+# in /usr/libexec/imsettings-functions and the value is case-sensitive.
 IMSETTINGS_IGNORE_SESSION=KDE-wayland
 
 if test -f /usr/lib64/qt5/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so || \

diff --git a/ibus.spec b/ibus.spec
index 1b045fd..6de8d84 100644
--- a/ibus.spec
+++ b/ibus.spec
@@ -58,7 +58,7 @@
 
 Name:           ibus
 Version:        1.5.29~rc1
-Release:        2%{?dist}
+Release:        3%{?dist}
 Summary:        Intelligent Input Bus for Linux OS
 License:        LGPL-2.1-or-later
 URL:            https://github.com/ibus/%name/wiki
@@ -66,6 +66,7 @@ Source0:        https://github.com/ibus/%name/releases/download/%{source_version
 Source1:        %{name}-xinput
 Source2:        %{name}.conf.5
 # Patch0:         %%{name}-HEAD.patch
+Patch0:         %{name}-HEAD.patch
 # Under testing #1349148 #1385349 #1350291 #1406699 #1432252 #1601577
 Patch1:         %{name}-1385349-segv-bus-proxy.patch
 %if 0%{?fedora:0}%{?rhel:1}
@@ -578,6 +579,9 @@ dconf update || :
 %{_datadir}/installed-tests/ibus
 
 %changelog
+* Thu Sep 07 2023 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.29~rc1-3
+- Resolves #2237486 Implement preedit color in Plasma Wayland
+
 * Tue Aug 22 2023 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.29~rc1-2
 - Resolves #2233527 Add IMSETTINGS_IGNORE_SESSION=KDE-wayland in ibus.conf
 

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2026-05-31  2:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-05-31  2:08 [rpms/ibus] autotool: Resolves #2237486 Implement preedit color in Plasma Wayland Takao Fujiwara

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox