From 12de68abf329b64729f3f17f18e5091e3f774e61 Mon Sep 17 00:00:00 2001 From: Fernando Monteiro Date: Thu, 16 Sep 2021 22:05:56 +0100 Subject: [PATCH] wayland: Drop deprecated text input This has been replaced for text-input-v3. Part-of: --- src/meson.build | 3 - src/wayland/meta-wayland-seat.c | 12 - src/wayland/meta-wayland-seat.h | 2 - src/wayland/meta-wayland-text-input-legacy.c | 633 ------------------- src/wayland/meta-wayland-text-input-legacy.h | 43 -- src/wayland/meta-wayland-versions.h | 1 - src/wayland/meta-wayland.c | 1 - src/wayland/protocol/gtk-text-input.xml | 302 --------- 8 files changed, 997 deletions(-) delete mode 100644 src/wayland/meta-wayland-text-input-legacy.c delete mode 100644 src/wayland/meta-wayland-text-input-legacy.h delete mode 100644 src/wayland/protocol/gtk-text-input.xml diff --git a/src/meson.build b/src/meson.build index ba2ef5155..43b28dc09 100644 --- a/src/meson.build +++ b/src/meson.build @@ -628,8 +628,6 @@ if have_wayland 'wayland/meta-wayland-tablet-tool.h', 'wayland/meta-wayland-text-input.c', 'wayland/meta-wayland-text-input.h', - 'wayland/meta-wayland-text-input-legacy.c', - 'wayland/meta-wayland-text-input-legacy.h', 'wayland/meta-wayland-touch.c', 'wayland/meta-wayland-touch.h', 'wayland/meta-wayland-types.h', @@ -910,7 +908,6 @@ if have_wayland wayland_protocols = [ ['gtk-primary-selection', 'private', ], ['gtk-shell', 'private', ], - ['gtk-text-input', 'private', ], ['keyboard-shortcuts-inhibit', 'unstable', 'v1', ], ['linux-dmabuf', 'unstable', 'v1', ], ['pointer-constraints', 'unstable', 'v1', ], diff --git a/src/wayland/meta-wayland-seat.c b/src/wayland/meta-wayland-seat.c index 8f0f992f6..63c6b34ab 100644 --- a/src/wayland/meta-wayland-seat.c +++ b/src/wayland/meta-wayland-seat.c @@ -234,7 +234,6 @@ meta_wayland_seat_new (MetaWaylandCompositor *compositor, NULL); seat->text_input = meta_wayland_text_input_new (seat); - seat->gtk_text_input = meta_wayland_gtk_text_input_new (seat); meta_wayland_data_device_init (&seat->data_device); meta_wayland_data_device_primary_init (&seat->primary_data_device); @@ -277,7 +276,6 @@ meta_wayland_seat_free (MetaWaylandSeat *seat) meta_wayland_touch_disable (seat->touch); g_object_unref (seat->touch); - meta_wayland_gtk_text_input_destroy (seat->gtk_text_input); meta_wayland_text_input_destroy (seat->text_input); g_free (seat); @@ -388,8 +386,6 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat, event->type == CLUTTER_TOUCH_BEGIN) { meta_wayland_text_input_handle_event (seat->text_input, event); - meta_wayland_gtk_text_input_handle_event (seat->gtk_text_input, - event); } switch (event->type) @@ -410,10 +406,6 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat, if (meta_wayland_text_input_handle_event (seat->text_input, event)) return TRUE; - if (meta_wayland_gtk_text_input_handle_event (seat->gtk_text_input, - event)) - return TRUE; - if (meta_wayland_seat_has_keyboard (seat)) return meta_wayland_keyboard_handle_event (seat->keyboard, (const ClutterKeyEvent *) event); @@ -430,9 +422,6 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat, case CLUTTER_IM_PREEDIT: if (meta_wayland_text_input_handle_event (seat->text_input, event)) return TRUE; - if (meta_wayland_gtk_text_input_handle_event (seat->gtk_text_input, - event)) - return TRUE; break; default: @@ -461,7 +450,6 @@ meta_wayland_seat_set_input_focus (MetaWaylandSeat *seat, meta_wayland_tablet_seat_set_pad_focus (tablet_seat, surface); meta_wayland_text_input_set_focus (seat->text_input, surface); - meta_wayland_gtk_text_input_set_focus (seat->gtk_text_input, surface); } gboolean diff --git a/src/wayland/meta-wayland-seat.h b/src/wayland/meta-wayland-seat.h index ae4e1076b..7f8b087ec 100644 --- a/src/wayland/meta-wayland-seat.h +++ b/src/wayland/meta-wayland-seat.h @@ -33,7 +33,6 @@ #include "wayland/meta-wayland-pointer.h" #include "wayland/meta-wayland-tablet-tool.h" #include "wayland/meta-wayland-text-input.h" -#include "wayland/meta-wayland-text-input-legacy.h" #include "wayland/meta-wayland-touch.h" #include "wayland/meta-wayland-types.h" @@ -50,7 +49,6 @@ struct _MetaWaylandSeat MetaWaylandDataDevicePrimary primary_data_device; MetaWaylandDataDevicePrimaryLegacy primary_legacy_data_device; - MetaWaylandGtkTextInput *gtk_text_input; MetaWaylandTextInput *text_input; guint capabilities; diff --git a/src/wayland/meta-wayland-text-input-legacy.c b/src/wayland/meta-wayland-text-input-legacy.c deleted file mode 100644 index 442708e0f..000000000 --- a/src/wayland/meta-wayland-text-input-legacy.c +++ /dev/null @@ -1,633 +0,0 @@ -/* - * Copyright (C) 2017, 2018 Red Hat - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Author: Carlos Garnacho - */ - -#include "config.h" - -#include - -#include "wayland/meta-wayland-private.h" -#include "wayland/meta-wayland-seat.h" -#include "wayland/meta-wayland-text-input-legacy.h" -#include "wayland/meta-wayland-versions.h" - -#include "gtk-text-input-server-protocol.h" - -#define META_TYPE_WAYLAND_GTK_TEXT_INPUT_FOCUS (meta_wayland_gtk_text_input_focus_get_type ()) - -typedef enum -{ - META_WAYLAND_PENDING_STATE_NONE = 0, - META_WAYLAND_PENDING_STATE_INPUT_RECT = 1 << 0, - META_WAYLAND_PENDING_STATE_CONTENT_TYPE = 1 << 1, - META_WAYLAND_PENDING_STATE_SURROUNDING_TEXT = 1 << 2, -} MetaWaylandTextInputPendingState; - -typedef struct _MetaWaylandGtkTextInput MetaWaylandGtkTextInput; - -struct _MetaWaylandGtkTextInput -{ - MetaWaylandSeat *seat; - ClutterInputFocus *input_focus; - - struct wl_list resource_list; - struct wl_list focus_resource_list; - MetaWaylandSurface *surface; - struct wl_listener surface_listener; - uint32_t focus_serial; - - MetaWaylandTextInputPendingState pending_state; - - struct - { - char *text; - uint32_t cursor; - uint32_t anchor; - } surrounding; - - cairo_rectangle_int_t cursor_rect; - - uint32_t content_type_hint; - uint32_t content_type_purpose; -}; - -struct _MetaWaylandGtkTextInputFocus -{ - ClutterInputFocus parent_instance; - MetaWaylandGtkTextInput *text_input; -}; - -G_DECLARE_FINAL_TYPE (MetaWaylandGtkTextInputFocus, - meta_wayland_gtk_text_input_focus, - META, WAYLAND_GTK_TEXT_INPUT_FOCUS, ClutterInputFocus) -G_DEFINE_TYPE (MetaWaylandGtkTextInputFocus, meta_wayland_gtk_text_input_focus, - CLUTTER_TYPE_INPUT_FOCUS) - -static void -meta_wayland_text_input_focus_request_surrounding (ClutterInputFocus *focus) -{ - MetaWaylandGtkTextInput *text_input; - - text_input = META_WAYLAND_GTK_TEXT_INPUT_FOCUS (focus)->text_input; - clutter_input_focus_set_surrounding (focus, - text_input->surrounding.text, - text_input->surrounding.cursor, - text_input->surrounding.anchor); -} - -static void -meta_wayland_text_input_focus_delete_surrounding (ClutterInputFocus *focus, - int offset, - guint len) -{ - MetaWaylandGtkTextInput *text_input; - uint32_t before_length; - uint32_t after_length; - struct wl_resource *resource; - - text_input = META_WAYLAND_GTK_TEXT_INPUT_FOCUS (focus)->text_input; - before_length = ABS (MIN (offset, 0)); - after_length = MAX (0, offset + len); - g_warn_if_fail (ABS (offset) <= len); - - wl_resource_for_each (resource, &text_input->focus_resource_list) - { - gtk_text_input_send_delete_surrounding_text (resource, - before_length, - after_length); - } -} - -static void -meta_wayland_text_input_focus_commit_text (ClutterInputFocus *focus, - const gchar *text) -{ - MetaWaylandGtkTextInput *text_input; - struct wl_resource *resource; - - text_input = META_WAYLAND_GTK_TEXT_INPUT_FOCUS (focus)->text_input; - - wl_resource_for_each (resource, &text_input->focus_resource_list) - { - gtk_text_input_send_preedit_string (resource, NULL, 0); - gtk_text_input_send_commit_string (resource, text); - } -} - -static void -meta_wayland_text_input_focus_set_preedit_text (ClutterInputFocus *focus, - const gchar *text, - guint cursor) -{ - MetaWaylandGtkTextInput *text_input; - struct wl_resource *resource; - - text_input = META_WAYLAND_GTK_TEXT_INPUT_FOCUS (focus)->text_input; - - wl_resource_for_each (resource, &text_input->focus_resource_list) - { - gtk_text_input_send_preedit_string (resource, text, cursor); - } -} - -static void -meta_wayland_gtk_text_input_focus_class_init (MetaWaylandGtkTextInputFocusClass *klass) -{ - ClutterInputFocusClass *focus_class = CLUTTER_INPUT_FOCUS_CLASS (klass); - - focus_class->request_surrounding = meta_wayland_text_input_focus_request_surrounding; - focus_class->delete_surrounding = meta_wayland_text_input_focus_delete_surrounding; - focus_class->commit_text = meta_wayland_text_input_focus_commit_text; - focus_class->set_preedit_text = meta_wayland_text_input_focus_set_preedit_text; -} - -static void -meta_wayland_gtk_text_input_focus_init (MetaWaylandGtkTextInputFocus *focus) -{ -} - -static ClutterInputFocus * -meta_wayland_text_input_focus_new (MetaWaylandGtkTextInput *text_input) -{ - MetaWaylandGtkTextInputFocus *focus; - - focus = g_object_new (META_TYPE_WAYLAND_GTK_TEXT_INPUT_FOCUS, NULL); - focus->text_input = text_input; - - return CLUTTER_INPUT_FOCUS (focus); -} - -static void -text_input_handle_focus_surface_destroy (struct wl_listener *listener, - void *data) -{ - MetaWaylandGtkTextInput *text_input = wl_container_of (listener, text_input, - surface_listener); - - meta_wayland_gtk_text_input_set_focus (text_input, NULL); -} - -static void -move_resources (struct wl_list *destination, struct wl_list *source) -{ - wl_list_insert_list (destination, source); - wl_list_init (source); -} - -static void -move_resources_for_client (struct wl_list *destination, - struct wl_list *source, - struct wl_client *client) -{ - struct wl_resource *resource, *tmp; - wl_resource_for_each_safe (resource, tmp, source) - { - if (wl_resource_get_client (resource) == client) - { - wl_list_remove (wl_resource_get_link (resource)); - wl_list_insert (destination, wl_resource_get_link (resource)); - } - } -} - -void -meta_wayland_gtk_text_input_set_focus (MetaWaylandGtkTextInput *text_input, - MetaWaylandSurface *surface) -{ - if (text_input->surface == surface) - return; - - text_input->pending_state = META_WAYLAND_PENDING_STATE_NONE; - - if (text_input->surface) - { - if (!wl_list_empty (&text_input->focus_resource_list)) - { - ClutterInputFocus *focus = text_input->input_focus; - ClutterInputMethod *input_method; - struct wl_resource *resource; - uint32_t serial; - - if (clutter_input_focus_is_focused (focus)) - { - input_method = clutter_backend_get_input_method (clutter_get_default_backend ()); - clutter_input_method_focus_out (input_method); - } - - serial = wl_display_next_serial (text_input->seat->wl_display); - - wl_resource_for_each (resource, &text_input->focus_resource_list) - { - gtk_text_input_send_leave (resource, serial, - text_input->surface->resource); - } - - move_resources (&text_input->resource_list, - &text_input->focus_resource_list); - } - - wl_list_remove (&text_input->surface_listener.link); - text_input->surface = NULL; - } - - if (surface) - { - struct wl_resource *focus_surface_resource; - - text_input->surface = surface; - focus_surface_resource = text_input->surface->resource; - wl_resource_add_destroy_listener (focus_surface_resource, - &text_input->surface_listener); - - move_resources_for_client (&text_input->focus_resource_list, - &text_input->resource_list, - wl_resource_get_client (focus_surface_resource)); - - if (!wl_list_empty (&text_input->focus_resource_list)) - { - struct wl_resource *resource; - - text_input->focus_serial = - wl_display_next_serial (text_input->seat->wl_display); - - wl_resource_for_each (resource, &text_input->focus_resource_list) - { - gtk_text_input_send_enter (resource, text_input->focus_serial, - surface->resource); - } - } - } -} - -static void -unbind_resource (struct wl_resource *resource) -{ - wl_list_remove (wl_resource_get_link (resource)); -} - -static void -text_input_destroy (struct wl_client *client, - struct wl_resource *resource) -{ - wl_resource_destroy (resource); -} - -static void -text_input_enable (struct wl_client *client, - struct wl_resource *resource, - uint32_t serial, - uint32_t flags) -{ - MetaWaylandGtkTextInput *text_input = wl_resource_get_user_data (resource); - ClutterInputFocus *focus = text_input->input_focus; - ClutterInputMethod *input_method; - gboolean show_preedit; - - if (serial != text_input->focus_serial) - return; - - if (!clutter_input_focus_is_focused (focus)) - { - input_method = clutter_backend_get_input_method (clutter_get_default_backend ()); - if (input_method) - clutter_input_method_focus_in (input_method, focus); - else - return; - } - - show_preedit = (flags & GTK_TEXT_INPUT_ENABLE_FLAGS_CAN_SHOW_PREEDIT) != 0; - clutter_input_focus_set_can_show_preedit (focus, show_preedit); - - if (flags & GTK_TEXT_INPUT_ENABLE_FLAGS_TOGGLE_INPUT_PANEL) - clutter_input_focus_set_input_panel_state (focus, CLUTTER_INPUT_PANEL_STATE_TOGGLE); -} - -static void -text_input_disable (struct wl_client *client, - struct wl_resource *resource) -{ - MetaWaylandGtkTextInput *text_input = wl_resource_get_user_data (resource); - ClutterInputFocus *focus = text_input->input_focus; - ClutterInputMethod *input_method; - - if (!clutter_input_focus_is_focused (focus)) - return; - - clutter_input_focus_reset (text_input->input_focus); - text_input->pending_state = META_WAYLAND_PENDING_STATE_NONE; - - input_method = clutter_backend_get_input_method (clutter_get_default_backend ()); - clutter_input_method_focus_out (input_method); -} - -static void -text_input_set_surrounding_text (struct wl_client *client, - struct wl_resource *resource, - const char *text, - int32_t cursor, - int32_t anchor) -{ - MetaWaylandGtkTextInput *text_input = wl_resource_get_user_data (resource); - - g_free (text_input->surrounding.text); - text_input->surrounding.text = g_strdup (text); - text_input->surrounding.cursor = cursor; - text_input->surrounding.anchor = anchor; - text_input->pending_state |= META_WAYLAND_PENDING_STATE_SURROUNDING_TEXT; -} - -static ClutterInputContentHintFlags -translate_hints (uint32_t hints) -{ - ClutterInputContentHintFlags clutter_hints = 0; - - if (hints & GTK_TEXT_INPUT_CONTENT_HINT_COMPLETION) - clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_COMPLETION; - if (hints & GTK_TEXT_INPUT_CONTENT_HINT_SPELLCHECK) - clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_SPELLCHECK; - if (hints & GTK_TEXT_INPUT_CONTENT_HINT_AUTO_CAPITALIZATION) - clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_AUTO_CAPITALIZATION; - if (hints & GTK_TEXT_INPUT_CONTENT_HINT_LOWERCASE) - clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_LOWERCASE; - if (hints & GTK_TEXT_INPUT_CONTENT_HINT_UPPERCASE) - clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_UPPERCASE; - if (hints & GTK_TEXT_INPUT_CONTENT_HINT_TITLECASE) - clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_TITLECASE; - if (hints & GTK_TEXT_INPUT_CONTENT_HINT_HIDDEN_TEXT) - clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_HIDDEN_TEXT; - if (hints & GTK_TEXT_INPUT_CONTENT_HINT_SENSITIVE_DATA) - clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_SENSITIVE_DATA; - if (hints & GTK_TEXT_INPUT_CONTENT_HINT_LATIN) - clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_LATIN; - if (hints & GTK_TEXT_INPUT_CONTENT_HINT_MULTILINE) - clutter_hints |= CLUTTER_INPUT_CONTENT_HINT_MULTILINE; - - return clutter_hints; -} - -static ClutterInputContentPurpose -translate_purpose (uint32_t purpose) -{ - switch (purpose) - { - case GTK_TEXT_INPUT_CONTENT_PURPOSE_NORMAL: - return CLUTTER_INPUT_CONTENT_PURPOSE_NORMAL; - case GTK_TEXT_INPUT_CONTENT_PURPOSE_ALPHA: - return CLUTTER_INPUT_CONTENT_PURPOSE_ALPHA; - case GTK_TEXT_INPUT_CONTENT_PURPOSE_DIGITS: - return CLUTTER_INPUT_CONTENT_PURPOSE_DIGITS; - case GTK_TEXT_INPUT_CONTENT_PURPOSE_NUMBER: - return CLUTTER_INPUT_CONTENT_PURPOSE_NUMBER; - case GTK_TEXT_INPUT_CONTENT_PURPOSE_PHONE: - return CLUTTER_INPUT_CONTENT_PURPOSE_PHONE; - case GTK_TEXT_INPUT_CONTENT_PURPOSE_URL: - return CLUTTER_INPUT_CONTENT_PURPOSE_URL; - case GTK_TEXT_INPUT_CONTENT_PURPOSE_EMAIL: - return CLUTTER_INPUT_CONTENT_PURPOSE_EMAIL; - case GTK_TEXT_INPUT_CONTENT_PURPOSE_NAME: - return CLUTTER_INPUT_CONTENT_PURPOSE_NAME; - case GTK_TEXT_INPUT_CONTENT_PURPOSE_PASSWORD: - return CLUTTER_INPUT_CONTENT_PURPOSE_PASSWORD; - case GTK_TEXT_INPUT_CONTENT_PURPOSE_DATE: - return CLUTTER_INPUT_CONTENT_PURPOSE_DATE; - case GTK_TEXT_INPUT_CONTENT_PURPOSE_TIME: - return CLUTTER_INPUT_CONTENT_PURPOSE_TIME; - case GTK_TEXT_INPUT_CONTENT_PURPOSE_DATETIME: - return CLUTTER_INPUT_CONTENT_PURPOSE_DATETIME; - case GTK_TEXT_INPUT_CONTENT_PURPOSE_TERMINAL: - return CLUTTER_INPUT_CONTENT_PURPOSE_TERMINAL; - } - - g_warn_if_reached (); - return CLUTTER_INPUT_CONTENT_PURPOSE_NORMAL; -} - -static void -text_input_set_content_type (struct wl_client *client, - struct wl_resource *resource, - uint32_t hint, - uint32_t purpose) -{ - MetaWaylandGtkTextInput *text_input = wl_resource_get_user_data (resource); - - if (!text_input->surface) - return; - - text_input->content_type_hint = hint; - text_input->content_type_purpose = purpose; - text_input->pending_state |= META_WAYLAND_PENDING_STATE_CONTENT_TYPE; -} - -static void -text_input_set_cursor_rectangle (struct wl_client *client, - struct wl_resource *resource, - int32_t x, - int32_t y, - int32_t width, - int32_t height) -{ - MetaWaylandGtkTextInput *text_input = wl_resource_get_user_data (resource); - - if (!text_input->surface) - return; - - text_input->cursor_rect = (cairo_rectangle_int_t) { x, y, width, height }; - text_input->pending_state |= META_WAYLAND_PENDING_STATE_INPUT_RECT; -} - -static void -text_input_commit_state (struct wl_client *client, - struct wl_resource *resource) -{ - MetaWaylandGtkTextInput *text_input = wl_resource_get_user_data (resource); - ClutterInputFocus *focus = text_input->input_focus; - - if (!clutter_input_focus_is_focused (focus)) - return; - if (text_input->surface == NULL) - return; - - if (text_input->pending_state & META_WAYLAND_PENDING_STATE_CONTENT_TYPE) - { - clutter_input_focus_set_content_hints (text_input->input_focus, - translate_hints (text_input->content_type_hint)); - clutter_input_focus_set_content_purpose (text_input->input_focus, - translate_purpose (text_input->content_type_purpose)); - } - - if (text_input->pending_state & META_WAYLAND_PENDING_STATE_SURROUNDING_TEXT) - { - clutter_input_focus_set_surrounding (text_input->input_focus, - text_input->surrounding.text, - text_input->surrounding.cursor, - text_input->surrounding.anchor); - } - - if (text_input->pending_state & META_WAYLAND_PENDING_STATE_INPUT_RECT) - { - graphene_rect_t cursor_rect; - float x1, y1, x2, y2; - cairo_rectangle_int_t rect; - - rect = text_input->cursor_rect; - meta_wayland_surface_get_absolute_coordinates (text_input->surface, - rect.x, rect.y, &x1, &y1); - meta_wayland_surface_get_absolute_coordinates (text_input->surface, - rect.x + rect.width, - rect.y + rect.height, - &x2, &y2); - - graphene_rect_init (&cursor_rect, x1, y1, x2 - x1, y2 - y1); - clutter_input_focus_set_cursor_location (text_input->input_focus, - &cursor_rect); - } - - text_input->pending_state = META_WAYLAND_PENDING_STATE_NONE; -} - -static struct gtk_text_input_interface meta_text_input_interface = { - text_input_destroy, - text_input_enable, - text_input_disable, - text_input_set_surrounding_text, - text_input_set_content_type, - text_input_set_cursor_rectangle, - text_input_commit_state, -}; - -MetaWaylandGtkTextInput * -meta_wayland_gtk_text_input_new (MetaWaylandSeat *seat) -{ - MetaWaylandGtkTextInput *text_input; - - text_input = g_new0 (MetaWaylandGtkTextInput, 1); - text_input->input_focus = meta_wayland_text_input_focus_new (text_input); - text_input->seat = seat; - - wl_list_init (&text_input->resource_list); - wl_list_init (&text_input->focus_resource_list); - text_input->surface_listener.notify = text_input_handle_focus_surface_destroy; - - return text_input; -} - -void -meta_wayland_gtk_text_input_destroy (MetaWaylandGtkTextInput *text_input) -{ - meta_wayland_gtk_text_input_set_focus (text_input, NULL); - g_object_unref (text_input->input_focus); - g_free (text_input); -} - -static void -meta_wayland_text_input_create_new_resource (MetaWaylandGtkTextInput *text_input, - struct wl_client *client, - struct wl_resource *seat_resource, - uint32_t id) -{ - struct wl_resource *text_input_resource; - - text_input_resource = wl_resource_create (client, - >k_text_input_interface, - META_GTK_TEXT_INPUT_VERSION, - id); - - wl_resource_set_implementation (text_input_resource, - &meta_text_input_interface, - text_input, unbind_resource); - - if (text_input->surface && - wl_resource_get_client (text_input->surface->resource) == client) - { - wl_list_insert (&text_input->focus_resource_list, - wl_resource_get_link (text_input_resource)); - - gtk_text_input_send_enter (text_input_resource, - text_input->focus_serial, - text_input->surface->resource); - } - else - { - wl_list_insert (&text_input->resource_list, - wl_resource_get_link (text_input_resource)); - } -} - -static void -text_input_manager_destroy (struct wl_client *client, - struct wl_resource *resource) -{ - wl_resource_destroy (resource); -} - -static void -text_input_manager_get_text_input (struct wl_client *client, - struct wl_resource *resource, - uint32_t id, - struct wl_resource *seat_resource) -{ - MetaWaylandSeat *seat = wl_resource_get_user_data (seat_resource); - - meta_wayland_text_input_create_new_resource (seat->gtk_text_input, client, - seat_resource, id); -} - -static struct gtk_text_input_manager_interface meta_text_input_manager_interface = { - text_input_manager_destroy, - text_input_manager_get_text_input, -}; - -static void -bind_text_input (struct wl_client *client, - void *data, - uint32_t version, - uint32_t id) -{ - struct wl_resource *resource; - - resource = wl_resource_create (client, - >k_text_input_manager_interface, - META_GTK_TEXT_INPUT_VERSION, - id); - wl_resource_set_implementation (resource, - &meta_text_input_manager_interface, - NULL, NULL); -} - -gboolean -meta_wayland_gtk_text_input_init (MetaWaylandCompositor *compositor) -{ - return (wl_global_create (compositor->wayland_display, - >k_text_input_manager_interface, - META_GTK_TEXT_INPUT_VERSION, - compositor->seat->gtk_text_input, - bind_text_input) != NULL); -} - -gboolean -meta_wayland_gtk_text_input_handle_event (MetaWaylandGtkTextInput *text_input, - const ClutterEvent *event) -{ - if (!text_input->surface || - !clutter_input_focus_is_focused (text_input->input_focus)) - return FALSE; - - return clutter_input_focus_filter_event (text_input->input_focus, event); -} diff --git a/src/wayland/meta-wayland-text-input-legacy.h b/src/wayland/meta-wayland-text-input-legacy.h deleted file mode 100644 index 55bfed809..000000000 --- a/src/wayland/meta-wayland-text-input-legacy.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2017 Red Hat - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Author: Carlos Garnacho - */ - -#ifndef META_WAYLAND_GTK_TEXT_INPUT_H -#define META_WAYLAND_GTK_TEXT_INPUT_H - -#include - -#include "meta/window.h" -#include "wayland/meta-wayland-types.h" - -typedef struct _MetaWaylandGtkTextInput MetaWaylandGtkTextInput; - -MetaWaylandGtkTextInput * meta_wayland_gtk_text_input_new (MetaWaylandSeat *seat); -void meta_wayland_gtk_text_input_destroy (MetaWaylandGtkTextInput *text_input); - -gboolean meta_wayland_gtk_text_input_init (MetaWaylandCompositor *compositor); - -void meta_wayland_gtk_text_input_set_focus (MetaWaylandGtkTextInput *text_input, - MetaWaylandSurface *surface); - -gboolean meta_wayland_gtk_text_input_handle_event (MetaWaylandGtkTextInput *text_input, - const ClutterEvent *event); - -#endif /* META_WAYLAND_GTK_TEXT_INPUT_H */ diff --git a/src/wayland/meta-wayland-versions.h b/src/wayland/meta-wayland-versions.h index 807954303..598bdd2e5 100644 --- a/src/wayland/meta-wayland-versions.h +++ b/src/wayland/meta-wayland-versions.h @@ -50,7 +50,6 @@ #define META_ZWP_KEYBOARD_SHORTCUTS_INHIBIT_V1_VERSION 1 #define META_ZXDG_OUTPUT_V1_VERSION 3 #define META_ZWP_XWAYLAND_KEYBOARD_GRAB_V1_VERSION 1 -#define META_GTK_TEXT_INPUT_VERSION 1 #define META_ZWP_TEXT_INPUT_V3_VERSION 1 #define META_WP_VIEWPORTER_VERSION 1 #define META_GTK_PRIMARY_SELECTION_VERSION 1 diff --git a/src/wayland/meta-wayland.c b/src/wayland/meta-wayland.c index f8b3645f7..5adc5d988 100644 --- a/src/wayland/meta-wayland.c +++ b/src/wayland/meta-wayland.c @@ -606,7 +606,6 @@ meta_wayland_compositor_new (MetaContext *context) meta_wayland_keyboard_shortcuts_inhibit_init (compositor); meta_wayland_surface_inhibit_shortcuts_dialog_init (); meta_wayland_text_input_init (compositor); - meta_wayland_gtk_text_input_init (compositor); meta_wayland_init_presentation_time (compositor); meta_wayland_activation_init (compositor); diff --git a/src/wayland/protocol/gtk-text-input.xml b/src/wayland/protocol/gtk-text-input.xml deleted file mode 100644 index a134a19f6..000000000 --- a/src/wayland/protocol/gtk-text-input.xml +++ /dev/null @@ -1,302 +0,0 @@ - - - - - Copyright © 2012, 2013 Intel Corporation - Copyright © 2015, 2016 Jan Arne Petersen - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that copyright notice and this permission - notice appear in supporting documentation, and that the name of - the copyright holders not be used in advertising or publicity - pertaining to distribution of the software without specific, - written prior permission. The copyright holders make no - representations about the suitability of this software for any - purpose. It is provided "as is" without express or implied - warranty. - - THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY - SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, - ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF - THIS SOFTWARE. - - - - - The gtk_text_input interface represents text input and input methods - associated with a seat. It provides enter/leave events to follow the - text input focus for a seat. - - Requests are used to enable/disable the text-input object and set - state information like surrounding and selected text or the content type. - The information about the entered text is sent to the text-input object - via the pre-edit and commit_string events. Using this interface removes - the need for applications to directly process hardware key events and - compose text out of them. - - Text is valid UTF-8 encoded, indices and lengths are in bytes. Indices - have to always point to the first byte of an UTF-8 encoded code point. - Lengths are not allowed to contain just a part of an UTF-8 encoded code - point. - - Focus moving throughout surfaces will result in the emission of - gtk_text_input.enter and gtk_text_input.leave events. The focused - surface must perform gtk_text_input.enable and - gtk_text_input.disable requests as the keyboard focus moves across - editable and non-editable elements of the UI. Those two requests are not - expected to be paired with each other, the compositor must be able to - handle consecutive series of the same request. - - State is sent by the state requests (set_surrounding_text, - set_content_type and set_cursor_rectangle) and a commit request. - After an enter event or disable request all state information is - invalidated and needs to be resent by the client. - - This protocol defines requests and events necessary for regular clients - to communicate with an input method. The gtk_input_method protocol - defines the interfaces necessary to implement standalone input methods. - If a compositor implements both interfaces, it will be the arbiter of the - communication between both. - - 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. - - - - - Destroy the wp_text_input object. Also disables all surfaces enabled - through this wp_text_input object - - - - - - Content hint is a bitmask to allow to modify the behavior of the text - input. - - - - - - - - - Requests text input on a surface. The serial provided must be the one - received on gtk_text_input.enter. - - - - - - - - Explicitly disable text input in a surface (typically when there is no - focus on any text entry inside the surface). - - - - - - 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 is the same as - cursor. - - Make sure to always send some text before and after the cursor - except when the cursor is at the beginning or end of text. - - When there was a configure_surrounding_text event take the - before_cursor and after_cursor arguments into account for picking how - much surrounding text to send. - - There is a maximum length of wayland messages so text can not be - longer than 4000 bytes. - - - - - - - - - Content hint is a bitmask to allow to modify the behavior of the text - input. - - - - - - - - - - - - - - - - - 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. - - - - - - - - - - - - - - - - - - - - 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 - none hint should be assumed. - - - - - - - - Sets the cursor outline as a x, y, width, height rectangle in surface - local coordinates. - - Allows the compositor to put a window with word suggestions near the - cursor. - - - - - - - - - - Allows to atomically send state updates from client. The previous - set_surrounding_text, set_content_type and set_cursor_rectangle - become effective after this call. - - Serial should be set to the serial from the last wp_text_input.enter - event. - - To make sure to not receive outdated input method events after a - state update, wl_display_sync() should be called after making this - request. - - - - - - Notification that this seat's text-input focus is on a certain surface. - - When the seat has the keyboard capability the text-input focus follows - the keyboard focus. - - - - - - - - Notification that this seat's text-input focus is no longer on - a certain surface. The client should reset any preedit string previously - set. - - The leave notification is sent before the enter notification - for the new focus. - - When the seat has the keyboard capability the text-input focus follows - the keyboard focus. - - - - - - - - Notify when a new composing text (pre-edit) should be set around the - current cursor position. Any previously set composing text should - be removed. - - - - - - - - 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). - - The text argument could be also null if some text is removed (see - gtk_text_input.delete_surrounding_text). - - Any previously set composing text should be removed. - - - - - - - Notify when the text around the current cursor position should be - deleted. Before_length and after_length is the length (in bytes) of text - before and after the current cursor position (excluding the selection) - to delete. - - This event should be handled as part of a following commit_string or - preedit_string event. - - - - - - - - - A factory for text-input objects. This object is a global singleton. - - - - - Destroy the wp_text_input_manager object. - - - - - - Creates a new text-input object for a given seat. - - - - - -