123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521 |
- From dba362808a97ced4f43635cbd73de6b06d156527 Mon Sep 17 00:00:00 2001
- From: Moon Sungjoon <sumoon@seoulsaram.org>
- Date: Wed, 26 Apr 2023 03:25:44 +0900
- Subject: [PATCH] ui/ozone/platform/wayland: Implement text_input_manager_v3
- Based on the original work of Lukas Lihotzki <lukas@lihotzki.de> in https://crrev.com/c/3015331
- Bug: 1227719
- Change-Id: Ib883c9087377c9f1a0dfacc45a27e3e67ccf042e
- ---
- diff --git a/AUTHORS b/AUTHORS
- index f275151..a43a528 100644
- --- a/AUTHORS
- +++ b/AUTHORS
- @@ -942,6 +942,7 @@ Mohit Bhalla <bhallam@amazon.com>
- Moiseanu Rares-Marian <moiseanurares@gmail.com>
- Momoka Yamamoto <momoka.my6@gmail.com>
- Momoko Hattori <momohatt10@gmail.com>
- +Moon Sungjoon <sumoon@seoulsaram.org>
- Mostafa Sedaghat joo <mostafa.sedaghat@gmail.com>
- Mrunal Kapade <mrunal.kapade@intel.com>
- Munira Tursunova <moonira@google.com>
- diff --git a/third_party/wayland-protocols/BUILD.gn b/third_party/wayland-protocols/BUILD.gn
- index c84ec11..dffa0aa 100644
- --- a/third_party/wayland-protocols/BUILD.gn
- +++ b/third_party/wayland-protocols/BUILD.gn
- @@ -141,7 +141,10 @@ wayland_protocol("text_input_extension_protocol") {
- }
-
- wayland_protocol("text_input_protocol") {
- - sources = [ "src/unstable/text-input/text-input-unstable-v1.xml" ]
- + sources = [
- + "src/unstable/text-input/text-input-unstable-v1.xml",
- + "src/unstable/text-input/text-input-unstable-v3.xml",
- + ]
- }
-
- wayland_protocol("touchpad_haptics_protocol") {
- diff --git a/ui/ozone/platform/wayland/BUILD.gn b/ui/ozone/platform/wayland/BUILD.gn
- index 31314f3..c22888c 100644
- --- a/ui/ozone/platform/wayland/BUILD.gn
- +++ b/ui/ozone/platform/wayland/BUILD.gn
- @@ -221,6 +221,8 @@ source_set("wayland") {
- "host/zwp_text_input_wrapper.h",
- "host/zwp_text_input_wrapper_v1.cc",
- "host/zwp_text_input_wrapper_v1.h",
- + "host/zwp_text_input_wrapper_v3.cc",
- + "host/zwp_text_input_wrapper_v3.h",
- "ozone_platform_wayland.cc",
- "ozone_platform_wayland.h",
- "wayland_utils.cc",
- diff --git a/ui/ozone/platform/wayland/common/wayland_object.cc b/ui/ozone/platform/wayland/common/wayland_object.cc
- index bcc48aa..009667b 100644
- --- a/ui/ozone/platform/wayland/common/wayland_object.cc
- +++ b/ui/ozone/platform/wayland/common/wayland_object.cc
- @@ -30,6 +30,7 @@
- #include <surface-augmenter-client-protocol.h>
- #include <text-input-extension-unstable-v1-client-protocol.h>
- #include <text-input-unstable-v1-client-protocol.h>
- +#include <text-input-unstable-v3-client-protocol.h>
- #include <touchpad-haptics-unstable-v1-client-protocol.h>
- #include <viewporter-client-protocol.h>
- #include <wayland-client-core.h>
- @@ -287,6 +288,8 @@ IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_relative_pointer_manager_v1)
- IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_relative_pointer_v1)
- IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_text_input_manager_v1)
- IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_text_input_v1)
- +IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_text_input_manager_v3)
- +IMPLEMENT_WAYLAND_OBJECT_TRAITS(zwp_text_input_v3)
- IMPLEMENT_WAYLAND_OBJECT_TRAITS(zxdg_decoration_manager_v1)
- IMPLEMENT_WAYLAND_OBJECT_TRAITS(zxdg_exporter_v1)
- IMPLEMENT_WAYLAND_OBJECT_TRAITS(zxdg_exported_v1)
- diff --git a/ui/ozone/platform/wayland/common/wayland_object.h b/ui/ozone/platform/wayland/common/wayland_object.h
- index c84c084..0817e78 100644
- --- a/ui/ozone/platform/wayland/common/wayland_object.h
- +++ b/ui/ozone/platform/wayland/common/wayland_object.h
- @@ -202,6 +202,8 @@ DECLARE_WAYLAND_OBJECT_TRAITS(zwp_relative_pointer_manager_v1)
- DECLARE_WAYLAND_OBJECT_TRAITS(zwp_relative_pointer_v1)
- DECLARE_WAYLAND_OBJECT_TRAITS(zwp_text_input_manager_v1)
- DECLARE_WAYLAND_OBJECT_TRAITS(zwp_text_input_v1)
- +DECLARE_WAYLAND_OBJECT_TRAITS(zwp_text_input_manager_v3)
- +DECLARE_WAYLAND_OBJECT_TRAITS(zwp_text_input_v3)
- DECLARE_WAYLAND_OBJECT_TRAITS(zxdg_decoration_manager_v1)
- DECLARE_WAYLAND_OBJECT_TRAITS(zxdg_exporter_v1)
- DECLARE_WAYLAND_OBJECT_TRAITS(zxdg_exported_v1)
- diff --git a/ui/ozone/platform/wayland/host/wayland_connection.cc b/ui/ozone/platform/wayland/host/wayland_connection.cc
- index ad3bbd6..995b1e2 100644
- --- a/ui/ozone/platform/wayland/host/wayland_connection.cc
- +++ b/ui/ozone/platform/wayland/host/wayland_connection.cc
- @@ -647,6 +647,14 @@ void WaylandConnection::HandleGlobal(wl_registry* registry,
- strcmp(interface, "zcr_text_input_extension_v1") == 0) {
- text_input_extension_v1_ = wl::Bind<zcr_text_input_extension_v1>(
- registry, name, std::min(version, kMaxTextInputExtensionVersion));
- + } else if (!text_input_manager_v3_ &&
- + strcmp(interface, "zwp_text_input_manager_v3") == 0) {
- + text_input_manager_v3_ = wl::Bind<zwp_text_input_manager_v3>(
- + registry, name, std::min(version, kMaxTextInputManagerVersion));
- + if (!text_input_manager_v3_) {
- + LOG(ERROR) << "Failed to bind to zwp_text_input_manager_v3 global";
- + return;
- + }
- } else if (!xdg_decoration_manager_ &&
- strcmp(interface, "zxdg_decoration_manager_v1") == 0) {
- xdg_decoration_manager_ = wl::Bind<zxdg_decoration_manager_v1>(
- diff --git a/ui/ozone/platform/wayland/host/wayland_connection.h b/ui/ozone/platform/wayland/host/wayland_connection.h
- index 6659bc5..f9739ea 100644
- --- a/ui/ozone/platform/wayland/host/wayland_connection.h
- +++ b/ui/ozone/platform/wayland/host/wayland_connection.h
- @@ -149,6 +149,9 @@ class WaylandConnection {
- zcr_text_input_extension_v1* text_input_extension_v1() const {
- return text_input_extension_v1_.get();
- }
- + zwp_text_input_manager_v3* text_input_manager_v3() const {
- + return text_input_manager_v3_.get();
- + }
- zwp_linux_explicit_synchronization_v1* linux_explicit_synchronization_v1()
- const {
- return linux_explicit_synchronization_.get();
- @@ -447,6 +450,7 @@ class WaylandConnection {
- wl::Object<zcr_stylus_v2> zcr_stylus_v2_;
- wl::Object<zwp_text_input_manager_v1> text_input_manager_v1_;
- wl::Object<zcr_text_input_extension_v1> text_input_extension_v1_;
- + wl::Object<zwp_text_input_manager_v3> text_input_manager_v3_;
- wl::Object<zwp_linux_explicit_synchronization_v1>
- linux_explicit_synchronization_;
- wl::Object<zxdg_decoration_manager_v1> xdg_decoration_manager_;
- diff --git a/ui/ozone/platform/wayland/host/wayland_input_method_context.cc b/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
- index caa5074..c2e1798 100644
- --- a/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
- +++ b/ui/ozone/platform/wayland/host/wayland_input_method_context.cc
- @@ -35,6 +35,7 @@
- #include "ui/ozone/platform/wayland/host/wayland_seat.h"
- #include "ui/ozone/platform/wayland/host/wayland_window.h"
- #include "ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v1.h"
- +#include "ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v3.h"
- #include "ui/ozone/public/ozone_switches.h"
-
- #if BUILDFLAG(USE_XKBCOMMON)
- @@ -285,11 +286,18 @@ void WaylandInputMethodContext::Init(bool initialize_for_testing) {
- // If text input instance is not created then all ime context operations
- // are noop. This option is because in some environments someone might not
- // want to enable ime/virtual keyboard even if it's available.
- - if (use_ozone_wayland_vkb && !text_input_ &&
- - connection_->text_input_manager_v1()) {
- + if (!use_ozone_wayland_vkb || text_input_)
- + return;
- +
- + // Prefer text_input_manager_v1 because it is more powerful.
- + // It supports preedit styling for example.
- + if (connection_->text_input_manager_v1()) {
- text_input_ = std::make_unique<ZWPTextInputWrapperV1>(
- connection_, this, connection_->text_input_manager_v1(),
- connection_->text_input_extension_v1());
- + } else if (connection_->text_input_manager_v3()) {
- + text_input_ = std::make_unique<ZWPTextInputWrapperV3>(
- + connection_, this, connection_->text_input_manager_v3());
- }
- }
-
- @@ -657,6 +665,11 @@ void WaylandInputMethodContext::OnCursorPosition(int32_t index,
-
- void WaylandInputMethodContext::OnDeleteSurroundingText(int32_t index,
- uint32_t length) {
- + // Never fail if length is 0.
- + if (length == 0) {
- + return;
- + }
- +
- const auto& [surrounding_text, utf16_offset, selection, unsused_composition] =
- surrounding_text_tracker_.predicted_state();
- DCHECK(selection.IsValid());
- diff --git a/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v3.cc b/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v3.cc
- new file mode 100644
- index 0000000..a3ce6e4
- --- /dev/null
- +++ b/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v3.cc
- @@ -0,0 +1,239 @@
- +// Copyright 2023 The Chromium Authors
- +// Use of this source code is governed by a BSD-style license that can be
- +// found in the LICENSE file.
- +
- +#include "ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v3.h"
- +
- +#include <string>
- +#include <utility>
- +
- +#include "base/logging.h"
- +#include "base/memory/ptr_util.h"
- +#include "ui/base/wayland/wayland_client_input_types.h"
- +#include "ui/gfx/range/range.h"
- +#include "ui/ozone/platform/wayland/host/wayland_connection.h"
- +#include "ui/ozone/platform/wayland/host/wayland_seat.h"
- +#include "ui/ozone/platform/wayland/host/wayland_window.h"
- +
- +namespace ui {
- +
- +// Converts Chrome's TextInputType into wayland's content_purpose.
- +// Some of TextInputType values do not have clearly corresponding wayland value,
- +// and they fallback to closer type.
- +uint32_t InputTypeToContentPurpose(TextInputType input_type) {
- + switch (input_type) {
- + case TEXT_INPUT_TYPE_NONE:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL;
- + case TEXT_INPUT_TYPE_TEXT:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL;
- + case TEXT_INPUT_TYPE_PASSWORD:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PASSWORD;
- + case TEXT_INPUT_TYPE_SEARCH:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL;
- + case TEXT_INPUT_TYPE_EMAIL:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_EMAIL;
- + case TEXT_INPUT_TYPE_NUMBER:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NUMBER;
- + case TEXT_INPUT_TYPE_TELEPHONE:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PHONE;
- + case TEXT_INPUT_TYPE_URL:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_URL;
- + case TEXT_INPUT_TYPE_DATE:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DATE;
- + case TEXT_INPUT_TYPE_DATE_TIME:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DATETIME;
- + case TEXT_INPUT_TYPE_DATE_TIME_LOCAL:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DATETIME;
- + case TEXT_INPUT_TYPE_MONTH:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DATE;
- + case TEXT_INPUT_TYPE_TIME:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_TIME;
- + case TEXT_INPUT_TYPE_WEEK:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DATE;
- + case TEXT_INPUT_TYPE_TEXT_AREA:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL;
- + case TEXT_INPUT_TYPE_CONTENT_EDITABLE:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL;
- + case TEXT_INPUT_TYPE_DATE_TIME_FIELD:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DATETIME;
- + case TEXT_INPUT_TYPE_NULL:
- + return ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL;
- + }
- +}
- +
- +// Converts Chrome's TextInputType into wayland's content_hint.
- +uint32_t InputFlagsToContentHint(int input_flags) {
- + uint32_t hint = 0;
- + if (input_flags & TEXT_INPUT_FLAG_AUTOCOMPLETE_ON)
- + hint |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_COMPLETION;
- + if (input_flags & TEXT_INPUT_FLAG_SPELLCHECK_ON)
- + hint |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_SPELLCHECK;
- + // No good match. Fallback to AUTO_CORRECTION.
- + if (input_flags & TEXT_INPUT_FLAG_AUTOCORRECT_ON)
- + hint |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_SPELLCHECK;
- + if (input_flags & TEXT_INPUT_FLAG_AUTOCAPITALIZE_CHARACTERS)
- + hint |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_AUTO_CAPITALIZATION;
- + if (input_flags & TEXT_INPUT_FLAG_AUTOCAPITALIZE_WORDS)
- + hint |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_AUTO_CAPITALIZATION;
- + if (input_flags & TEXT_INPUT_FLAG_AUTOCAPITALIZE_SENTENCES)
- + hint |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_AUTO_CAPITALIZATION;
- + if (input_flags & TEXT_INPUT_FLAG_HAS_BEEN_PASSWORD)
- + hint |= ZWP_TEXT_INPUT_V3_CONTENT_HINT_SENSITIVE_DATA;
- + return hint;
- +}
- +
- +ZWPTextInputWrapperV3::ZWPTextInputWrapperV3(
- + WaylandConnection* connection,
- + ZWPTextInputWrapperClient* client,
- + zwp_text_input_manager_v3* text_input_manager)
- + : connection_(connection), client_(client) {
- + static const zwp_text_input_v3_listener text_input_listener = {
- + &OnEnter, // text_input_enter,
- + &OnLeave, // text_input_leave,
- + &OnPreeditString, // text_input_preedit_string,
- + &OnCommitString, // text_input_commit_string,
- + &OnDeleteSurroundingText, // text_input_delete_surrounding_text,
- + &OnDone, // text_input_done,
- + };
- +
- + DCHECK(text_input_manager);
- + auto* text_input = zwp_text_input_manager_v3_get_text_input(
- + text_input_manager, connection_->seat()->wl_object());
- + obj_ = wl::Object<zwp_text_input_v3>(text_input);
- +
- + zwp_text_input_v3_add_listener(text_input, &text_input_listener, this);
- +}
- +
- +ZWPTextInputWrapperV3::~ZWPTextInputWrapperV3() = default;
- +
- +void ZWPTextInputWrapperV3::Reset() {
- + NOTIMPLEMENTED_LOG_ONCE();
- +}
- +
- +void ZWPTextInputWrapperV3::Activate(WaylandWindow* window,
- + TextInputClient::FocusReason reason) {
- + zwp_text_input_v3_enable(obj_.get());
- + zwp_text_input_v3_commit(obj_.get());
- +}
- +
- +void ZWPTextInputWrapperV3::Deactivate() {
- + zwp_text_input_v3_disable(obj_.get());
- + zwp_text_input_v3_commit(obj_.get());
- +}
- +
- +void ZWPTextInputWrapperV3::ShowInputPanel() {
- + // Not directly supported in zwp_text_input_v3
- + // Enable again to show the screen keyboard in GNOME:
- + // https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1543#note_1051704
- + zwp_text_input_v3_enable(obj_.get());
- + zwp_text_input_v3_commit(obj_.get());
- +}
- +
- +void ZWPTextInputWrapperV3::HideInputPanel() {
- + // unsupported in zwp_text_input_v3
- +}
- +
- +void ZWPTextInputWrapperV3::SetCursorRect(const gfx::Rect& rect) {
- + zwp_text_input_v3_set_cursor_rectangle(obj_.get(), rect.x(), rect.y(),
- + rect.width(), rect.height());
- + zwp_text_input_v3_commit(obj_.get());
- +}
- +
- +void ZWPTextInputWrapperV3::SetSurroundingText(
- + const std::string& text,
- + const gfx::Range& selection_range) {
- + zwp_text_input_v3_set_surrounding_text(
- + obj_.get(), text.c_str(), selection_range.start(), selection_range.end());
- + zwp_text_input_v3_commit(obj_.get());
- +}
- +
- +void ZWPTextInputWrapperV3::ResetPendingState() {
- + commit_string_.clear();
- + delete_surrounding_text_before_length_ = 0;
- + delete_surrounding_text_after_length_ = 0;
- + preedit_string_.clear();
- + preedit_string_cursor_begin_ = 0;
- + preedit_string_cursor_end_ = 0;
- +}
- +
- +void ZWPTextInputWrapperV3::SetContentType(ui::TextInputType type,
- + ui::TextInputMode mode,
- + uint32_t flags,
- + bool should_do_learning,
- + bool can_compose_inline) {
- + // V3 doesn't have extension
- + uint32_t content_purpose = InputTypeToContentPurpose(type);
- + uint32_t content_hint = InputFlagsToContentHint(flags);
- + static_cast<void>(flags);
- + static_cast<void>(should_do_learning);
- + zwp_text_input_v3_set_content_type(obj_.get(), content_hint, content_purpose);
- +}
- +
- +void ZWPTextInputWrapperV3::OnEnter(void* data,
- + struct zwp_text_input_v3* text_input,
- + struct wl_surface* surface) {
- + NOTIMPLEMENTED_LOG_ONCE();
- +}
- +
- +void ZWPTextInputWrapperV3::OnLeave(void* data,
- + struct zwp_text_input_v3* text_input,
- + struct wl_surface* surface) {
- + NOTIMPLEMENTED_LOG_ONCE();
- +}
- +
- +void ZWPTextInputWrapperV3::OnPreeditString(
- + void* data,
- + struct zwp_text_input_v3* text_input,
- + const char* text,
- + int32_t cursor_begin,
- + int32_t cursor_end) {
- + auto* wti = static_cast<ZWPTextInputWrapperV3*>(data);
- + wti->preedit_string_ = text ? text : "";
- + wti->preedit_string_cursor_begin_ = cursor_begin;
- + wti->preedit_string_cursor_end_ = cursor_end;
- +}
- +
- +void ZWPTextInputWrapperV3::OnCommitString(void* data,
- + struct zwp_text_input_v3* text_input,
- + const char* text) {
- + auto* wti = static_cast<ZWPTextInputWrapperV3*>(data);
- + wti->commit_string_ = text ? text : "";
- +}
- +
- +void ZWPTextInputWrapperV3::OnDeleteSurroundingText(
- + void* data,
- + struct zwp_text_input_v3* text_input,
- + uint32_t before_length,
- + uint32_t after_length) {
- + auto* wti = static_cast<ZWPTextInputWrapperV3*>(data);
- + wti->delete_surrounding_text_before_length_ = before_length;
- + wti->delete_surrounding_text_after_length_ = after_length;
- +}
- +
- +void ZWPTextInputWrapperV3::OnDone(void* data,
- + struct zwp_text_input_v3* text_input,
- + uint32_t serial) {
- + auto* wti = static_cast<ZWPTextInputWrapperV3*>(data);
- + wti->client_->OnPreeditString("", {}, 0);
- + wti->client_->OnDeleteSurroundingText(
- + -int32_t(wti->delete_surrounding_text_before_length_),
- + int32_t(wti->delete_surrounding_text_before_length_) +
- + int32_t(wti->delete_surrounding_text_after_length_));
- + wti->client_->OnCommitString(wti->commit_string_.c_str());
- + wti->client_->OnPreeditString(wti->preedit_string_.c_str(), {},
- + wti->preedit_string_cursor_begin_);
- + wti->ResetPendingState();
- +}
- +
- +void ZWPTextInputWrapperV3::SetGrammarFragmentAtCursor(
- + const ui::GrammarFragment& fragment) {
- + NOTIMPLEMENTED_LOG_ONCE();
- +}
- +
- +void ZWPTextInputWrapperV3::SetAutocorrectInfo(
- + const gfx::Range& autocorrect_range,
- + const gfx::Rect& autocorrect_bounds) {
- + NOTIMPLEMENTED_LOG_ONCE();
- +}
- +
- +} // namespace ui
- diff --git a/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v3.h b/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v3.h
- new file mode 100644
- index 0000000..204d7e3
- --- /dev/null
- +++ b/ui/ozone/platform/wayland/host/zwp_text_input_wrapper_v3.h
- @@ -0,0 +1,98 @@
- +// Copyright 2023 The Chromium Authors
- +// Use of this source code is governed by a BSD-style license that can be
- +// found in the LICENSE file.
- +
- +#ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_ZWP_TEXT_INPUT_WRAPPER_V3_H_
- +#define UI_OZONE_PLATFORM_WAYLAND_HOST_ZWP_TEXT_INPUT_WRAPPER_V3_H_
- +
- +#include <cstdint>
- +#include <string>
- +
- +#include <text-input-unstable-v3-client-protocol.h>
- +
- +#include "base/memory/raw_ptr.h"
- +#include "ui/ozone/platform/wayland/common/wayland_object.h"
- +#include "ui/ozone/platform/wayland/host/zwp_text_input_wrapper.h"
- +
- +namespace gfx {
- +class Rect;
- +}
- +
- +namespace ui {
- +
- +class WaylandConnection;
- +class WaylandWindow;
- +
- +// Text input wrapper for text-input-unstable-v3
- +class ZWPTextInputWrapperV3 : public ZWPTextInputWrapper {
- + public:
- + ZWPTextInputWrapperV3(WaylandConnection* connection,
- + ZWPTextInputWrapperClient* client,
- + zwp_text_input_manager_v3* text_input_manager);
- + ZWPTextInputWrapperV3(const ZWPTextInputWrapperV3&) = delete;
- + ZWPTextInputWrapperV3& operator=(const ZWPTextInputWrapperV3&) = delete;
- + ~ZWPTextInputWrapperV3() override;
- +
- + void Reset() override;
- +
- + void Activate(WaylandWindow* window,
- + ui::TextInputClient::FocusReason reason) override;
- + void Deactivate() override;
- +
- + void ShowInputPanel() override;
- + void HideInputPanel() override;
- +
- + void SetCursorRect(const gfx::Rect& rect) override;
- + void SetSurroundingText(const std::string& text,
- + const gfx::Range& selection_range) override;
- + void SetContentType(TextInputType type,
- + TextInputMode mode,
- + uint32_t flags,
- + bool should_do_learning,
- + bool can_compose_inline) override;
- + void SetGrammarFragmentAtCursor(const ui::GrammarFragment& fragment) override;
- + void SetAutocorrectInfo(const gfx::Range& autocorrect_range,
- + const gfx::Rect& autocorrect_bounds) override;
- +
- + private:
- + void ResetPendingState();
- +
- + // zwp_text_input_v3_listener
- + static void OnEnter(void* data,
- + struct zwp_text_input_v3* text_input,
- + struct wl_surface* surface);
- + static void OnLeave(void* data,
- + struct zwp_text_input_v3* text_input,
- + struct wl_surface* surface);
- + static void OnPreeditString(void* data,
- + struct zwp_text_input_v3* text_input,
- + const char* text,
- + int32_t cursor_begin,
- + int32_t cursor_end);
- + static void OnCommitString(void* data,
- + struct zwp_text_input_v3* text_input,
- + const char* text);
- + static void OnDeleteSurroundingText(void* data,
- + struct zwp_text_input_v3* text_input,
- + uint32_t before_length,
- + uint32_t after_length);
- + static void OnDone(void* data,
- + struct zwp_text_input_v3* text_input,
- + uint32_t serial);
- +
- + const raw_ptr<WaylandConnection> connection_;
- + wl::Object<zwp_text_input_v3> obj_;
- + const raw_ptr<ZWPTextInputWrapperClient> client_;
- +
- + // pending state until OnDone
- + std::string commit_string_;
- + uint32_t delete_surrounding_text_before_length_ = 0;
- + uint32_t delete_surrounding_text_after_length_ = 0;
- + std::string preedit_string_; // preedit string of pending state
- + int32_t preedit_string_cursor_begin_ = 0;
- + int32_t preedit_string_cursor_end_ = 0;
- +};
- +
- +} // namespace ui
- +
- +#endif // UI_OZONE_PLATFORM_WAYLAND_HOST_ZWP_TEXT_INPUT_WRAPPER_V3_H_
|