Compare commits
	
		
			1 Commits
		
	
	
		
			squeekboar
			...
			wip-input-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 7f540c0ad9 | 
@ -11,6 +11,7 @@ gen_scanner_client_code = generator(wl_scanner,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
wl_protos = [
 | 
					wl_protos = [
 | 
				
			||||||
  wl_protocol_dir + '/stable/xdg-shell/xdg-shell.xml',
 | 
					  wl_protocol_dir + '/stable/xdg-shell/xdg-shell.xml',
 | 
				
			||||||
 | 
					  wl_protocol_dir + '/unstable/text-input/text-input-unstable-v3.xml',
 | 
				
			||||||
  'wlr-layer-shell-unstable-v1.xml',
 | 
					  'wlr-layer-shell-unstable-v1.xml',
 | 
				
			||||||
  'virtual-keyboard-unstable-v1.xml',
 | 
					  'virtual-keyboard-unstable-v1.xml',
 | 
				
			||||||
  'input-method-unstable-v2.xml',
 | 
					  'input-method-unstable-v2.xml',
 | 
				
			||||||
 | 
				
			|||||||
@ -4,10 +4,17 @@ dbus_src = gnome.gdbus_codegen(
 | 
				
			|||||||
    join_paths(dbusdir, 'sm.puri.OSK0.xml')
 | 
					    join_paths(dbusdir, 'sm.puri.OSK0.xml')
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					squeek_enum_headers = [
 | 
				
			||||||
 | 
					  'squeek-input-method.h',
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					squeek_enums = gnome.mkenums_simple('squeek-enumtypes', sources: squeek_enum_headers)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sources = [
 | 
					sources = [
 | 
				
			||||||
  'imservice.c',
 | 
					  'imservice.c',
 | 
				
			||||||
  'server-context-service.c',
 | 
					  'server-context-service.c',
 | 
				
			||||||
  'server-main.c',
 | 
					  'server-main.c',
 | 
				
			||||||
 | 
					  'squeek-input-method.c',
 | 
				
			||||||
  'wayland.c',
 | 
					  'wayland.c',
 | 
				
			||||||
  '../eek/eek.c',
 | 
					  '../eek/eek.c',
 | 
				
			||||||
  '../eek/eek-container.c',
 | 
					  '../eek/eek-container.c',
 | 
				
			||||||
@ -33,6 +40,7 @@ sources = [
 | 
				
			|||||||
  '../eek/layersurface.c',
 | 
					  '../eek/layersurface.c',
 | 
				
			||||||
  dbus_src,
 | 
					  dbus_src,
 | 
				
			||||||
  enums,
 | 
					  enums,
 | 
				
			||||||
 | 
					  squeek_enums,
 | 
				
			||||||
  keysym_entries,
 | 
					  keysym_entries,
 | 
				
			||||||
  marshalers,
 | 
					  marshalers,
 | 
				
			||||||
  '../eekboard/keymap.c',
 | 
					  '../eekboard/keymap.c',
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										544
									
								
								src/squeek-input-method.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										544
									
								
								src/squeek-input-method.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,544 @@
 | 
				
			|||||||
 | 
					/* squeek-input-method.c */
 | 
				
			||||||
 | 
					#include "squeek-input-method.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _SqueekInputMethodPrivate {
 | 
				
			||||||
 | 
					    struct zwp_input_method_v2         *input_method;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gchar                              *surrounding_text;
 | 
				
			||||||
 | 
					    gchar                              *preedit_string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    guint                               serial;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    guint                               cursor;
 | 
				
			||||||
 | 
					    guint                               anchor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    guint                               hint;
 | 
				
			||||||
 | 
					    guint                               purpose;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gboolean                            active    : 1;
 | 
				
			||||||
 | 
					    gboolean                            available : 1;
 | 
				
			||||||
 | 
					} SqueekInputMethodPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_TYPE_WITH_PRIVATE(SqueekInputMethod, squeek_input_method, G_TYPE_OBJECT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * TODO:
 | 
				
			||||||
 | 
					 *   - implement signals for 'done' and ... (?)
 | 
				
			||||||
 | 
					 *   - take it for a spin
 | 
				
			||||||
 | 
					 *   - fix things
 | 
				
			||||||
 | 
					 *   - look at 'zwp_input_popup_surface_v2' and think about it for a while
 | 
				
			||||||
 | 
					 *     ....
 | 
				
			||||||
 | 
					 *   - add some gir documentation
 | 
				
			||||||
 | 
					 *   - double check: everyting
 | 
				
			||||||
 | 
					 *   
 | 
				
			||||||
 | 
					 *   - MOVE ON
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
					    PROP_0,
 | 
				
			||||||
 | 
					    PROP_AVAILABLE,
 | 
				
			||||||
 | 
					    PROP_ACTIVE,
 | 
				
			||||||
 | 
					    PROP_CURSOR_POSITION,
 | 
				
			||||||
 | 
					    PROP_ANCHOR_POSITION,
 | 
				
			||||||
 | 
					    PROP_CONTENT_HINT,
 | 
				
			||||||
 | 
					    PROP_CONTENT_PURPOSE,
 | 
				
			||||||
 | 
					    PROP_SURROUNDING_TEXT,
 | 
				
			||||||
 | 
					    PROP_PREEDIT_STRING,
 | 
				
			||||||
 | 
					    LAST_PROP
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static GParamSpec *properties[LAST_PROP];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* input-method signals */
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_activate(SqueekInputMethod *self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail(priv->available);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!priv->active) {
 | 
				
			||||||
 | 
					        priv->active = TRUE;
 | 
				
			||||||
 | 
					        g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_ACTIVE]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_deactivate(SqueekInputMethod *self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail(priv->available);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->active) {
 | 
				
			||||||
 | 
					        priv->active = FALSE;
 | 
				
			||||||
 | 
					        g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_ACTIVE]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_surrounding_text(SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                     const gchar       *text,
 | 
				
			||||||
 | 
					                                     guint              cursor,
 | 
				
			||||||
 | 
					                                     guint              anchor)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail(priv->available);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_clear_pointer(&priv->surrounding_text, g_free);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    priv->surrounding_text = g_strdup(text);
 | 
				
			||||||
 | 
					    priv->cursor           = cursor;
 | 
				
			||||||
 | 
					    priv->anchor           = anchor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_SURROUNDING_TEXT]);
 | 
				
			||||||
 | 
					    g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_CURSOR_POSITION]);
 | 
				
			||||||
 | 
					    g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_ANCHOR_POSITION]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_text_change_cause(SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                      guint              cause)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    fprintf(stderr, "%s: not implemented\n", __func__);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_content_type(SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                 guint              hint,
 | 
				
			||||||
 | 
					                                 guint              purpose)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail(priv->available);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    priv->hint    = hint;
 | 
				
			||||||
 | 
					    priv->purpose = purpose;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_CONTENT_HINT]);
 | 
				
			||||||
 | 
					    g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_CONTENT_PURPOSE]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_done(SqueekInputMethod *self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* 
 | 
				
			||||||
 | 
					        Atomically applies state changes recently sent to the client.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        The done event establishes and updates the state of the client, and
 | 
				
			||||||
 | 
					        must be issued after any changes to apply them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Text input state (content purpose, content hint, surrounding text, and
 | 
				
			||||||
 | 
					        change cause) is conceptually double-buffered within an input method
 | 
				
			||||||
 | 
					        context.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Events modify the pending state, as opposed to the current state in use
 | 
				
			||||||
 | 
					        by the input method. A done event atomically applies all pending state,
 | 
				
			||||||
 | 
					        replacing the current state. After done, the new pending state is as
 | 
				
			||||||
 | 
					        documented for each related request.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Events must be applied in the order of arrival.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Neither current nor pending state are modified unless noted otherwise.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fprintf(stderr, "%s: not implemented\n", __func__);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_unavailable(SqueekInputMethod *self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    priv->available = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_clear_pointer(&priv->input_method, zwp_input_method_v2_destroy); 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_AVAILABLE]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					imservice_handle_input_method_activate(void                       *data,
 | 
				
			||||||
 | 
					                                       struct zwp_input_method_v2 *input_method)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_return_if_fail(data && SQUEEK_IS_INPUT_METHOD(data));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_GET_CLASS(data)->activate(data);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					imservice_handle_input_method_deactivate(void                       *data,
 | 
				
			||||||
 | 
					                                         struct zwp_input_method_v2 *input_method)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_return_if_fail(data && SQUEEK_IS_INPUT_METHOD(data));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_GET_CLASS(data)->deactivate(data);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					imservice_handle_surrounding_text(void                       *data,
 | 
				
			||||||
 | 
					                                  struct zwp_input_method_v2 *input_method,
 | 
				
			||||||
 | 
					                                  const char                 *text,
 | 
				
			||||||
 | 
					                                  uint32_t                    cursor,
 | 
				
			||||||
 | 
					                                  uint32_t                    anchor)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_return_if_fail(data && SQUEEK_IS_INPUT_METHOD(data));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_GET_CLASS(data)->surrounding_text(data, text, cursor, anchor);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					imservice_handle_text_change_cause(void                       *data,
 | 
				
			||||||
 | 
					                                   struct zwp_input_method_v2 *input_method,
 | 
				
			||||||
 | 
					                                   uint32_t                    cause)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_return_if_fail(data && SQUEEK_IS_INPUT_METHOD(data));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_GET_CLASS(data)->text_change_cause(data, cause);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					imservice_handle_content_type(void                       *data,
 | 
				
			||||||
 | 
					                              struct zwp_input_method_v2 *input_method,
 | 
				
			||||||
 | 
					                              uint32_t                    hint,
 | 
				
			||||||
 | 
					                              uint32_t                    purpose)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_return_if_fail(data && SQUEEK_IS_INPUT_METHOD(data));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_GET_CLASS(data)->content_type(data, hint, purpose);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					imservice_handle_done(void                       *data,
 | 
				
			||||||
 | 
					                      struct zwp_input_method_v2 *input_method)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_return_if_fail(data && SQUEEK_IS_INPUT_METHOD(data));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_GET_CLASS(data)->done(data);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					imservice_handle_unavailable(void                       *data,
 | 
				
			||||||
 | 
					                             struct zwp_input_method_v2 *input_method)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_return_if_fail(data && SQUEEK_IS_INPUT_METHOD(data));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_GET_CLASS(data)->unavailable(data);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct zwp_input_method_v2_listener input_method_listener = {
 | 
				
			||||||
 | 
					    .activate          = imservice_handle_input_method_activate,
 | 
				
			||||||
 | 
					    .deactivate        = imservice_handle_input_method_deactivate,
 | 
				
			||||||
 | 
					    .surrounding_text  = imservice_handle_surrounding_text,
 | 
				
			||||||
 | 
					    .text_change_cause = imservice_handle_text_change_cause,
 | 
				
			||||||
 | 
					    .content_type      = imservice_handle_content_type,
 | 
				
			||||||
 | 
					    .done              = imservice_handle_done,
 | 
				
			||||||
 | 
					    .unavailable       = imservice_handle_unavailable,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* input-method requests */
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_real_commit_string(SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                       const gchar       *string)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail(priv->available);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    zwp_input_method_v2_commit_string(priv->input_method,
 | 
				
			||||||
 | 
					                                      string);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					squeek_input_method_commit_string(SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                  const gchar       *string)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_return_if_fail(self && SQUEEK_IS_INPUT_METHOD(self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_GET_CLASS(self)->commit_string(self,
 | 
				
			||||||
 | 
					                                                       string);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_real_preedit_string(SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                        const gchar       *text,
 | 
				
			||||||
 | 
					                                        gint               cursor_begin,
 | 
				
			||||||
 | 
					                                        gint               cursor_end)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail(priv->available);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_clear_pointer(&priv->preedit_string, g_free);
 | 
				
			||||||
 | 
					    priv->preedit_string = g_strdup(text);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* TODO: think about cursor_[begin|end] */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    zwp_input_method_v2_preedit_string(priv->input_method,
 | 
				
			||||||
 | 
					                                       priv->preedit_string,
 | 
				
			||||||
 | 
					                                       cursor_begin,
 | 
				
			||||||
 | 
					                                       cursor_end);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_object_notify_by_pspec(G_OBJECT(self), properties[PROP_PREEDIT_STRING]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					squeek_input_method_preedit_string(SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                   const gchar       *text,
 | 
				
			||||||
 | 
					                                   gint               cursor_begin,
 | 
				
			||||||
 | 
					                                   gint               cursor_end)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_return_if_fail(self && SQUEEK_IS_INPUT_METHOD(self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_GET_CLASS(self)->preedit_string(self,
 | 
				
			||||||
 | 
					                                                        text,
 | 
				
			||||||
 | 
					                                                        cursor_begin,
 | 
				
			||||||
 | 
					                                                        cursor_end);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_real_delete_surrounding_text(SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                                 guint              before_length,
 | 
				
			||||||
 | 
					                                                 guint              after_length)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail(priv->available);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    zwp_input_method_v2_delete_surrounding_text(priv->input_method,
 | 
				
			||||||
 | 
					                                                before_length,
 | 
				
			||||||
 | 
					                                                after_length);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					squeek_input_method_delete_surrounding_text(SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                            guint              before_length,
 | 
				
			||||||
 | 
					                                            guint              after_length)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_return_if_fail(self && SQUEEK_IS_INPUT_METHOD(self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_GET_CLASS(self)->delete_surrounding_text(self,
 | 
				
			||||||
 | 
					                                                                 before_length,
 | 
				
			||||||
 | 
					                                                                 after_length);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_real_commit(SqueekInputMethod *self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_return_if_fail(priv->available);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    zwp_input_method_v2_commit(priv->input_method,
 | 
				
			||||||
 | 
					                               priv->serial++);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					squeek_input_method_commit(SqueekInputMethod *self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    g_return_if_fail(self && SQUEEK_IS_INPUT_METHOD(self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_GET_CLASS(self)->commit(self);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_dispose(GObject *object)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethod        *self = SQUEEK_INPUT_METHOD(object);
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    priv->active    = FALSE;
 | 
				
			||||||
 | 
					    priv->available = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_clear_pointer(&priv->input_method, zwp_input_method_v2_destroy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    G_OBJECT_CLASS(squeek_input_method_parent_class)->dispose(object);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_init(SqueekInputMethod *self)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_get_property(GObject    *object,
 | 
				
			||||||
 | 
					                                 guint       prop_id,
 | 
				
			||||||
 | 
					                                 GValue     *value,
 | 
				
			||||||
 | 
					                                 GParamSpec *pspec)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethod        *self = SQUEEK_INPUT_METHOD(object);
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (prop_id) {
 | 
				
			||||||
 | 
					        case PROP_AVAILABLE:
 | 
				
			||||||
 | 
					            g_value_set_boolean(value, priv->available);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case PROP_ACTIVE:
 | 
				
			||||||
 | 
					            g_value_set_boolean(value, priv->active);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case PROP_CURSOR_POSITION:
 | 
				
			||||||
 | 
					            g_value_set_uint(value, priv->cursor);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case PROP_ANCHOR_POSITION:
 | 
				
			||||||
 | 
					            g_value_set_uint(value, priv->anchor);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case PROP_CONTENT_HINT:
 | 
				
			||||||
 | 
					            g_value_set_flags(value, priv->hint);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case PROP_CONTENT_PURPOSE:
 | 
				
			||||||
 | 
					            g_value_set_enum(value, priv->purpose);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case PROP_SURROUNDING_TEXT:
 | 
				
			||||||
 | 
					            g_value_set_string(value, priv->surrounding_text);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case PROP_PREEDIT_STRING:
 | 
				
			||||||
 | 
					            g_value_set_string(value, priv->preedit_string);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_set_property(GObject      *object,
 | 
				
			||||||
 | 
					                                 guint         prop_id,
 | 
				
			||||||
 | 
					                                 const GValue *value,
 | 
				
			||||||
 | 
					                                 GParamSpec   *pspec)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethod        *self = SQUEEK_INPUT_METHOD(object);
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (prop_id) {
 | 
				
			||||||
 | 
					        case PROP_ACTIVE:
 | 
				
			||||||
 | 
					            priv->active = g_value_get_boolean(value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* FIXME: should preedit string be writable without setting cursor? */
 | 
				
			||||||
 | 
					        case PROP_PREEDIT_STRING:
 | 
				
			||||||
 | 
					            g_clear_pointer(&priv->preedit_string, g_free);
 | 
				
			||||||
 | 
					            priv->preedit_string = g_strdup(g_value_get_string(value));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case PROP_AVAILABLE:
 | 
				
			||||||
 | 
					            /* fall-through: not writable */
 | 
				
			||||||
 | 
					        case PROP_CURSOR_POSITION:
 | 
				
			||||||
 | 
					            /* fall-through: not writable */
 | 
				
			||||||
 | 
					        case PROP_ANCHOR_POSITION:
 | 
				
			||||||
 | 
					            /* fall-through: not writable */
 | 
				
			||||||
 | 
					        case PROP_CONTENT_HINT:
 | 
				
			||||||
 | 
					            /* fall-through: not writable */
 | 
				
			||||||
 | 
					        case PROP_CONTENT_PURPOSE:
 | 
				
			||||||
 | 
					            /* fall-through: not writable */
 | 
				
			||||||
 | 
					        case PROP_SURROUNDING_TEXT:
 | 
				
			||||||
 | 
					            /* fall-through: not writable */
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					squeek_input_method_class_init(SqueekInputMethodClass *klass)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GObjectClass *object_class = G_OBJECT_CLASS(klass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    object_class->dispose          = squeek_input_method_dispose;
 | 
				
			||||||
 | 
					    object_class->get_property     = squeek_input_method_get_property;
 | 
				
			||||||
 | 
					    object_class->set_property     = squeek_input_method_set_property;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* events */
 | 
				
			||||||
 | 
					    klass->activate                = squeek_input_method_activate;
 | 
				
			||||||
 | 
					    klass->deactivate              = squeek_input_method_deactivate;
 | 
				
			||||||
 | 
					    klass->surrounding_text        = squeek_input_method_surrounding_text;
 | 
				
			||||||
 | 
					    klass->text_change_cause       = squeek_input_method_text_change_cause;
 | 
				
			||||||
 | 
					    klass->content_type            = squeek_input_method_content_type;
 | 
				
			||||||
 | 
					    klass->done                    = squeek_input_method_done;
 | 
				
			||||||
 | 
					    klass->unavailable             = squeek_input_method_unavailable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* requests */
 | 
				
			||||||
 | 
					    klass->commit_string           = squeek_input_method_real_commit_string;
 | 
				
			||||||
 | 
					    klass->preedit_string          = squeek_input_method_real_preedit_string;
 | 
				
			||||||
 | 
					    klass->delete_surrounding_text = squeek_input_method_real_delete_surrounding_text;
 | 
				
			||||||
 | 
					    klass->commit                  = squeek_input_method_real_commit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    properties[PROP_AVAILABLE] =
 | 
				
			||||||
 | 
					        g_param_spec_boolean("available",
 | 
				
			||||||
 | 
					                             "available",
 | 
				
			||||||
 | 
					                             "Availability of this input method (destroy if FALSE)",
 | 
				
			||||||
 | 
					                             FALSE,
 | 
				
			||||||
 | 
					                             G_PARAM_READABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    properties[PROP_ACTIVE] =
 | 
				
			||||||
 | 
					        g_param_spec_boolean("active",
 | 
				
			||||||
 | 
					                             "active",
 | 
				
			||||||
 | 
					                             "This input method is active",
 | 
				
			||||||
 | 
					                             FALSE,
 | 
				
			||||||
 | 
					                             G_PARAM_READWRITE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    properties[PROP_CURSOR_POSITION] =
 | 
				
			||||||
 | 
					        g_param_spec_uint("cursor-position",
 | 
				
			||||||
 | 
					                          "cursor-position",
 | 
				
			||||||
 | 
					                          "The position of the cursor in characters",
 | 
				
			||||||
 | 
					                          0, G_MAXUINT, 0,
 | 
				
			||||||
 | 
					                          G_PARAM_READABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    properties[PROP_ANCHOR_POSITION] =
 | 
				
			||||||
 | 
					        g_param_spec_uint("anchor-position",
 | 
				
			||||||
 | 
					                          "anchor-position",
 | 
				
			||||||
 | 
					                          "Offset where the current selection starts, or the same as cursor-position",
 | 
				
			||||||
 | 
					                          0, G_MAXUINT, 0,
 | 
				
			||||||
 | 
					                          G_PARAM_READABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    properties[PROP_CONTENT_HINT] =
 | 
				
			||||||
 | 
					        g_param_spec_flags("content-hint",
 | 
				
			||||||
 | 
					                           "content-hint",
 | 
				
			||||||
 | 
					                           "Hint to guide the behaviour of the input method",
 | 
				
			||||||
 | 
					                           SQUEEK_TYPE_INPUT_METHOD_HINT,
 | 
				
			||||||
 | 
					                           SQUEEK_INPUT_METHOD_HINT_NONE,
 | 
				
			||||||
 | 
					                           G_PARAM_READABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    properties[PROP_CONTENT_PURPOSE] =
 | 
				
			||||||
 | 
					        g_param_spec_enum("content-purpose",
 | 
				
			||||||
 | 
					                          "content-purpose",
 | 
				
			||||||
 | 
					                          "The purpose of a text input",
 | 
				
			||||||
 | 
					                          SQUEEK_TYPE_INPUT_METHOD_PURPOSE,
 | 
				
			||||||
 | 
					                          SQUEEK_INPUT_METHOD_PURPOSE_NORMAL,
 | 
				
			||||||
 | 
					                          G_PARAM_READABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    properties[PROP_SURROUNDING_TEXT] =
 | 
				
			||||||
 | 
					        g_param_spec_string("surrounding-text",
 | 
				
			||||||
 | 
					                            "surrounding-text",
 | 
				
			||||||
 | 
					                            "The text surrounding the cursor",
 | 
				
			||||||
 | 
					                            "",
 | 
				
			||||||
 | 
					                            G_PARAM_READABLE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    properties[PROP_PREEDIT_STRING] =
 | 
				
			||||||
 | 
					        g_param_spec_string("preedit-string",
 | 
				
			||||||
 | 
					                            "preedit-string",
 | 
				
			||||||
 | 
					                            "Pre-edit string",
 | 
				
			||||||
 | 
					                            "",
 | 
				
			||||||
 | 
					                            G_PARAM_READWRITE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_object_class_install_properties(object_class, LAST_PROP, properties);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SqueekInputMethod *
 | 
				
			||||||
 | 
					squeek_input_method_new(struct zwp_input_method_manager_v2 *manager,
 | 
				
			||||||
 | 
					                        struct wl_seat                     *seat)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    SqueekInputMethod *self = g_object_new(SQUEEK_TYPE_INPUT_METHOD, NULL);
 | 
				
			||||||
 | 
					    SqueekInputMethodPrivate *priv = squeek_input_method_get_instance_private(self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    priv->input_method = zwp_input_method_manager_v2_get_input_method(manager, seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    zwp_input_method_v2_add_listener(priv->input_method, &input_method_listener, self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return self;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										181
									
								
								src/squeek-input-method.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										181
									
								
								src/squeek-input-method.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,181 @@
 | 
				
			|||||||
 | 
					#pragma once 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <glib-object.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "input-method-unstable-v2-client-protocol.h"
 | 
				
			||||||
 | 
					#include "text-input-unstable-v3-client-protocol.h"
 | 
				
			||||||
 | 
					#include "squeek-enumtypes.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SQUEEK_TYPE_INPUT_METHOD (squeek_input_method_get_type())
 | 
				
			||||||
 | 
					G_DECLARE_DERIVABLE_TYPE(SqueekInputMethod, squeek_input_method, SQUEEK, INPUT_METHOD, GObject)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * no special behavior
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_HINT_NONE                = ZWP_TEXT_INPUT_V3_CONTENT_HINT_NONE,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * suggest word completions
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_HINT_COMPLETION          = ZWP_TEXT_INPUT_V3_CONTENT_HINT_COMPLETION,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * suggest word corrections
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_HINT_SPELLCHECK          = ZWP_TEXT_INPUT_V3_CONTENT_HINT_SPELLCHECK,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * switch to uppercase letters at the start of a sentence
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_HINT_AUTO_CAPITALIZATION = ZWP_TEXT_INPUT_V3_CONTENT_HINT_AUTO_CAPITALIZATION,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * prefer lowercase letters
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_HINT_LOWERCASE           = ZWP_TEXT_INPUT_V3_CONTENT_HINT_LOWERCASE,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * prefer uppercase letters
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_HINT_UPPERCASE           = ZWP_TEXT_INPUT_V3_CONTENT_HINT_UPPERCASE,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * prefer casing for titles and headings (can be language dependent)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_HINT_TITLECASE           = ZWP_TEXT_INPUT_V3_CONTENT_HINT_TITLECASE,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * characters should be hidden
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_HINT_HIDDEN_TEXT         = ZWP_TEXT_INPUT_V3_CONTENT_HINT_HIDDEN_TEXT,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * typed text should not be stored
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_HINT_SENSITIVE_DATA      = ZWP_TEXT_INPUT_V3_CONTENT_HINT_SENSITIVE_DATA,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * just Latin characters should be entered
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_HINT_LATIN               = ZWP_TEXT_INPUT_V3_CONTENT_HINT_LATIN,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * the text input is multiline
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_HINT_MULTILINE           = ZWP_TEXT_INPUT_V3_CONTENT_HINT_MULTILINE,
 | 
				
			||||||
 | 
					} SqueekInputMethodHint;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * default input, allowing all characters
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_NORMAL   = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NORMAL,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * allow only alphabetic characters
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_ALPHA    = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_ALPHA,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * allow only digits
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_DIGITS   = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DIGITS,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * input a number (including decimal separator and sign)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_NUMBER   = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NUMBER,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * input a phone number
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_PHONE    = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PHONE,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * input an URL
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_URL      = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_URL,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * input an email address
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_EMAIL    = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_EMAIL,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * input a name of a person
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_NAME     = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NAME,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * input a password (combine with sensitive_data hint)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_PASSWORD = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PASSWORD,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * input is a numeric password (combine with sensitive_data hint)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_PIN      = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PIN,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * input a date
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_DATE     = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DATE,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * input a time
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_TIME     = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_TIME,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * input a date and time
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_DATETIME = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_DATETIME,
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * input for a terminal
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    SQUEEK_INPUT_METHOD_PURPOSE_TERMINAL = ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_TERMINAL,
 | 
				
			||||||
 | 
					} SqueekInputMethodPurpose;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct _SqueekInputMethodClass {
 | 
				
			||||||
 | 
					    GObjectClass        parent_class;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* input-method signals */
 | 
				
			||||||
 | 
					    void        (*activate)                       (SqueekInputMethod *self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void        (*deactivate)                     (SqueekInputMethod *self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void        (*surrounding_text)               (SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                                   const gchar       *text,
 | 
				
			||||||
 | 
					                                                   guint              cursor,
 | 
				
			||||||
 | 
					                                                   guint              anchor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void        (*text_change_cause)              (SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                                   guint              cause);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void        (*content_type)                   (SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                                   guint              hint,
 | 
				
			||||||
 | 
					                                                   guint              purpose);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void        (*done)                           (SqueekInputMethod *self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void        (*unavailable)                    (SqueekInputMethod *self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* input-method requests */
 | 
				
			||||||
 | 
					    void        (*commit_string)                  (SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                                   const gchar       *string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void        (*preedit_string)                 (SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                                   const gchar       *text,
 | 
				
			||||||
 | 
					                                                   gint               cursor_begin,
 | 
				
			||||||
 | 
					                                                   gint               cursor_end);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void        (*delete_surrounding_text)        (SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                                   guint              before_length,
 | 
				
			||||||
 | 
					                                                   guint              after_length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void        (*commit)                         (SqueekInputMethod *self);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void                 squeek_input_method_commit_string          (SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                                                 const gchar       *string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void                 squeek_input_method_preedit_string         (SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                                                 const gchar       *text,
 | 
				
			||||||
 | 
					                                                                 gint               cursor_begin,
 | 
				
			||||||
 | 
					                                                                 gint               cursor_end);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void                 squeek_input_method_delete_surrounding_text(SqueekInputMethod *self,
 | 
				
			||||||
 | 
					                                                                 guint              before_length,
 | 
				
			||||||
 | 
					                                                                 guint              after_length);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void                 squeek_input_method_commit                 (SqueekInputMethod *self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SqueekInputMethod   *squeek_input_method_new                    (struct zwp_input_method_manager_v2 *manager,
 | 
				
			||||||
 | 
					                                                                 struct wl_seat                     *seat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_END_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Reference in New Issue
	
	Block a user