From 755a74cac483f72b30276ffbc3f4b414fdc2f9da Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 17 Feb 2020 10:43:29 +0100 Subject: [PATCH] clutter: Add IM events These will be used to make IM commands into something that is processed in a fixed order relative to key events. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1286 --- clutter/clutter/clutter-actor.c | 10 ++++++++++ clutter/clutter/clutter-enums.h | 3 +++ clutter/clutter/clutter-event.c | 25 +++++++++++++++++++++++++ clutter/clutter/clutter-event.h | 15 +++++++++++++++ clutter/clutter/clutter-main.c | 3 +++ 5 files changed, 56 insertions(+) diff --git a/clutter/clutter/clutter-actor.c b/clutter/clutter/clutter-actor.c index efcc004c4..83e4dacf1 100644 --- a/clutter/clutter/clutter-actor.c +++ b/clutter/clutter/clutter-actor.c @@ -1138,6 +1138,7 @@ static GQuark quark_touch = 0; static GQuark quark_touchpad = 0; static GQuark quark_proximity = 0; static GQuark quark_pad = 0; +static GQuark quark_im = 0; G_DEFINE_TYPE_WITH_CODE (ClutterActor, clutter_actor, @@ -6581,6 +6582,7 @@ clutter_actor_class_init (ClutterActorClass *klass) quark_touchpad = g_quark_from_static_string ("touchpad"); quark_proximity = g_quark_from_static_string ("proximity"); quark_pad = g_quark_from_static_string ("pad"); + quark_im = g_quark_from_static_string ("im"); object_class->constructor = clutter_actor_constructor; object_class->set_property = clutter_actor_set_property; @@ -13988,6 +13990,11 @@ clutter_actor_event (ClutterActor *actor, case CLUTTER_PAD_RING: detail = quark_pad; break; + case CLUTTER_IM_COMMIT: + case CLUTTER_IM_DELETE: + case CLUTTER_IM_PREEDIT: + detail = quark_im; + break; case CLUTTER_EVENT_LAST: /* Just keep compiler warnings quiet */ break; } @@ -14041,6 +14048,9 @@ clutter_actor_event (ClutterActor *actor, case CLUTTER_DELETE: case CLUTTER_DESTROY_NOTIFY: case CLUTTER_CLIENT_MESSAGE: + case CLUTTER_IM_COMMIT: + case CLUTTER_IM_DELETE: + case CLUTTER_IM_PREEDIT: default: signal_num = -1; break; diff --git a/clutter/clutter/clutter-enums.h b/clutter/clutter/clutter-enums.h index ed178762b..f83e3b24c 100644 --- a/clutter/clutter/clutter-enums.h +++ b/clutter/clutter/clutter-enums.h @@ -934,6 +934,9 @@ typedef enum /*< prefix=CLUTTER >*/ CLUTTER_PAD_BUTTON_RELEASE, CLUTTER_PAD_STRIP, CLUTTER_PAD_RING, + CLUTTER_IM_COMMIT, + CLUTTER_IM_DELETE, + CLUTTER_IM_PREEDIT, CLUTTER_EVENT_LAST /* helper */ } ClutterEventType; diff --git a/clutter/clutter/clutter-event.c b/clutter/clutter/clutter-event.c index 9ccc0da1c..db580d3f5 100644 --- a/clutter/clutter/clutter-event.c +++ b/clutter/clutter/clutter-event.c @@ -415,6 +415,9 @@ clutter_event_get_position (const ClutterEvent *event, case CLUTTER_PAD_BUTTON_RELEASE: case CLUTTER_PAD_STRIP: case CLUTTER_PAD_RING: + case CLUTTER_IM_COMMIT: + case CLUTTER_IM_DELETE: + case CLUTTER_IM_PREEDIT: graphene_point_init (position, 0.f, 0.f); break; @@ -489,6 +492,9 @@ clutter_event_set_coords (ClutterEvent *event, case CLUTTER_PAD_BUTTON_RELEASE: case CLUTTER_PAD_STRIP: case CLUTTER_PAD_RING: + case CLUTTER_IM_COMMIT: + case CLUTTER_IM_DELETE: + case CLUTTER_IM_PREEDIT: break; case CLUTTER_ENTER: @@ -1107,6 +1113,9 @@ clutter_event_set_device (ClutterEvent *event, case CLUTTER_CLIENT_MESSAGE: case CLUTTER_DELETE: case CLUTTER_EVENT_LAST: + case CLUTTER_IM_COMMIT: + case CLUTTER_IM_DELETE: + case CLUTTER_IM_PREEDIT: break; case CLUTTER_ENTER: @@ -1203,6 +1212,9 @@ clutter_event_get_device (const ClutterEvent *event) case CLUTTER_DESTROY_NOTIFY: case CLUTTER_CLIENT_MESSAGE: case CLUTTER_DELETE: + case CLUTTER_IM_COMMIT: + case CLUTTER_IM_DELETE: + case CLUTTER_IM_PREEDIT: case CLUTTER_EVENT_LAST: break; @@ -1411,6 +1423,11 @@ clutter_event_copy (const ClutterEvent *event) sizeof (gdouble) * n_axes); break; + case CLUTTER_IM_COMMIT: + case CLUTTER_IM_PREEDIT: + new_event->im.text = g_strdup (event->im.text); + break; + default: break; } @@ -1466,6 +1483,11 @@ clutter_event_free (ClutterEvent *event) g_free (event->touch.axes); break; + case CLUTTER_IM_COMMIT: + case CLUTTER_IM_PREEDIT: + g_free (event->im.text); + break; + default: break; } @@ -1761,6 +1783,9 @@ clutter_event_get_axes (const ClutterEvent *event, case CLUTTER_PAD_BUTTON_RELEASE: case CLUTTER_PAD_STRIP: case CLUTTER_PAD_RING: + case CLUTTER_IM_COMMIT: + case CLUTTER_IM_DELETE: + case CLUTTER_IM_PREEDIT: break; } diff --git a/clutter/clutter/clutter-event.h b/clutter/clutter/clutter-event.h index f090ca8e1..e65463c65 100644 --- a/clutter/clutter/clutter-event.h +++ b/clutter/clutter/clutter-event.h @@ -121,6 +121,7 @@ typedef struct _ClutterProximityEvent ClutterProximityEvent; typedef struct _ClutterPadButtonEvent ClutterPadButtonEvent; typedef struct _ClutterPadStripEvent ClutterPadStripEvent; typedef struct _ClutterPadRingEvent ClutterPadRingEvent; +typedef struct _ClutterIMEvent ClutterIMEvent; /** * ClutterAnyEvent: @@ -544,6 +545,19 @@ struct _ClutterPadRingEvent guint32 mode; }; +struct _ClutterIMEvent +{ + ClutterEventType type; + guint32 time; + ClutterEventFlags flags; + ClutterStage *stage; + ClutterActor *source; + + char *text; + int32_t offset; + uint32_t len; +}; + /** * ClutterEvent: * @@ -570,6 +584,7 @@ union _ClutterEvent ClutterPadButtonEvent pad_button; ClutterPadStripEvent pad_strip; ClutterPadRingEvent pad_ring; + ClutterIMEvent im; }; /** diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c index 0114244b8..090cd893b 100644 --- a/clutter/clutter/clutter-main.c +++ b/clutter/clutter/clutter-main.c @@ -1749,6 +1749,9 @@ _clutter_process_event_details (ClutterActor *stage, case CLUTTER_PAD_BUTTON_RELEASE: case CLUTTER_PAD_STRIP: case CLUTTER_PAD_RING: + case CLUTTER_IM_COMMIT: + case CLUTTER_IM_DELETE: + case CLUTTER_IM_PREEDIT: { ClutterActor *actor = NULL;