Fixed Bug 639253 - ibus_engine_delete_surrounding_text with offset.

This commit is contained in:
Takao Fujiwara 2010-11-22 12:45:59 +09:00
parent 1e452ff156
commit f7291cc56a
2 changed files with 124 additions and 47 deletions

View File

@ -1,6 +1,6 @@
From 2a368335194eccd22d605d93532ce6e914089599 Mon Sep 17 00:00:00 2001
From d396da77a9174df65f42e5ebe5bb723cf3fd47ef Mon Sep 17 00:00:00 2001
From: Daiki Ueno <ueno@unixuser.org>
Date: Thu, 4 Nov 2010 17:40:35 +0900
Date: Mon, 22 Nov 2010 11:49:47 +0900
Subject: [PATCH] Support surrounding-text retrieval.
This change adds a new API function ibus_engine_get_surrounding_text().
@ -22,22 +22,23 @@ Also,
- destroy
resets the current surrounding-text.
---
bus/engineproxy.c | 42 +++++++++++++++
bus/engineproxy.h | 4 ++
bus/inputcontext.c | 32 +++++++++++
client/gtk2/ibusimcontext.c | 80 ++++++++++++++++++++++++++---
bus/engineproxy.c | 43 +++++++++++++
bus/engineproxy.h | 4 +
bus/inputcontext.c | 32 +++++++++
client/gtk2/ibusimcontext.c | 93 ++++++++++++++++++++++++---
configure.ac | 15 +++++
ibus/engine.py | 6 ++
ibus/interface/iengine.py | 3 +
ibus/interface/iinputcontext.py | 3 +
src/ibusengine.c | 110 +++++++++++++++++++++++++++++++++++++++
src/ibusengine.h | 21 +++++++-
src/ibusinputcontext.c | 61 +++++++++++++++++++++
src/ibusinputcontext.h | 11 ++++
src/ibusengine.c | 134 +++++++++++++++++++++++++++++++++++++++
src/ibusengine.h | 21 ++++++-
src/ibusinputcontext.c | 61 ++++++++++++++++++
src/ibusinputcontext.h | 11 +++
src/ibusmarshalers.list | 1 +
12 files changed, 366 insertions(+), 8 deletions(-)
13 files changed, 415 insertions(+), 12 deletions(-)
diff --git a/bus/engineproxy.c b/bus/engineproxy.c
index f0ddd28..e04661a 100644
index eb9412c..2955f71 100644
--- a/bus/engineproxy.c
+++ b/bus/engineproxy.c
@@ -42,6 +42,10 @@ struct _BusEngineProxy {
@ -60,7 +61,7 @@ index f0ddd28..e04661a 100644
/* functions prototype */
static void bus_engine_proxy_real_destroy (IBusProxy *proxy);
@@ -287,11 +293,15 @@ bus_engine_proxy_class_init (BusEngineProxyClass *class)
@@ -287,11 +293,15 @@ bus_engine_proxy_class_init (BusEnginePr
1,
IBUS_TYPE_PROPERTY);
@ -76,7 +77,7 @@ index f0ddd28..e04661a 100644
}
static void
@@ -318,6 +328,11 @@ bus_engine_proxy_real_destroy (IBusProxy *proxy)
@@ -318,6 +328,11 @@ bus_engine_proxy_real_destroy (IBusProxy
engine->keymap = NULL;
}
@ -88,7 +89,7 @@ index f0ddd28..e04661a 100644
IBUS_PROXY_CLASS(bus_engine_proxy_parent_class)->destroy ((IBusProxy *)engine);
}
@@ -641,6 +656,33 @@ void bus_engine_proxy_property_hide (BusEngineProxy *engine,
@@ -641,6 +656,33 @@ void bus_engine_proxy_property_hide (Bus
NULL);
}
@ -123,10 +124,10 @@ index f0ddd28..e04661a 100644
void \
bus_engine_proxy_##name (BusEngineProxy *engine) \
diff --git a/bus/engineproxy.h b/bus/engineproxy.h
index 83c72da..da887eb 100644
index c11bf2a..38bc996 100644
--- a/bus/engineproxy.h
+++ b/bus/engineproxy.h
@@ -89,5 +89,9 @@ void bus_engine_proxy_property_show (BusEngineProxy *engi
@@ -92,5 +92,9 @@ void bus_engine_proxy_property_show (BusEngineProxy *engi
void bus_engine_proxy_property_hide (BusEngineProxy *engine,
const gchar *prop_name);
gboolean bus_engine_proxy_is_enabled (BusEngineProxy *engine);
@ -137,10 +138,10 @@ index 83c72da..da887eb 100644
G_END_DECLS
#endif
diff --git a/bus/inputcontext.c b/bus/inputcontext.c
index 56fc27f..09cc2ba 100644
index b006ed4..7e425c7 100644
--- a/bus/inputcontext.c
+++ b/bus/inputcontext.c
@@ -235,6 +235,11 @@ static const gchar introspection_xml[] =
@@ -241,6 +241,11 @@ static const gchar introspection_xml[] =
" <method name='GetEngine'>"
" <arg direction='out' type='v' name='desc' />"
" </method>"
@ -152,7 +153,7 @@ index 56fc27f..09cc2ba 100644
/* signals */
" <signal name='CommitText'>"
" <arg type='v' name='text' />"
@@ -906,6 +911,32 @@ _ic_get_engine (BusInputContext *context,
@@ -903,6 +908,32 @@ _ic_get_engine (BusInputContext *context,
}
static void
@ -185,7 +186,7 @@ index 56fc27f..09cc2ba 100644
bus_input_context_service_method_call (IBusService *service,
GDBusConnection *connection,
const gchar *sender,
@@ -944,6 +975,7 @@ bus_input_context_service_method_call (IBusService *service,
@@ -941,6 +972,7 @@ bus_input_context_service_method_call (IBusService *service,
{ "IsEnabled", _ic_is_enabled },
{ "SetEngine", _ic_set_engine },
{ "GetEngine", _ic_get_engine },
@ -194,10 +195,10 @@ index 56fc27f..09cc2ba 100644
gint i;
diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
index 6570473..ca8db35 100644
index 63d66c9..04ba818 100644
--- a/client/gtk2/ibusimcontext.c
+++ b/client/gtk2/ibusimcontext.c
@@ -113,6 +113,12 @@ static void ibus_im_context_set_cursor_location
@@ -113,6 +113,12 @@ static void ibus_im_context_set_curs
static void ibus_im_context_set_use_preedit
(GtkIMContext *context,
gboolean use_preedit);
@ -210,33 +211,39 @@ index 6570473..ca8db35 100644
/* static methods*/
static void _create_input_context (IBusIMContext *context);
@@ -131,15 +137,16 @@ static void _slave_preedit_start_cb (GtkIMContext *slave,
@@ -131,16 +137,16 @@ static void _slave_preedit_start_cb
IBusIMContext *context);
static void _slave_preedit_end_cb (GtkIMContext *slave,
IBusIMContext *context);
-static void _slave_retrieve_surrounding_cb
+static gboolean _slave_retrieve_surrounding_cb
(GtkIMContext *slave,
IBusIMContext *context);
- IBusIMContext *context);
-static void _slave_delete_surrounding_cb
+ IBusIMContext *context);
+static gboolean _slave_delete_surrounding_cb
(GtkIMContext *slave,
gint offset_from_cursor,
guint nchars,
IBusIMContext *context);
- gint offset_from_cursor,
- guint nchars,
- IBusIMContext *context);
+ gint offset_from_cursor,
+ guint nchars,
+ IBusIMContext *context);
static void _create_fake_input_context (void);
-
+static void _request_surrounding_text (IBusIMContext *context);
@@ -206,6 +213,16 @@ ibus_im_context_new (void)
static GType _ibus_type_im_context = 0;
@@ -206,6 +212,17 @@ ibus_im_context_new (void)
return IBUS_IM_CONTEXT (obj);
}
+static void
+_request_surrounding_text (IBusIMContext *context)
+{
+ if (context->enable) {
+ if (context->enable &&
+ (context->caps & IBUS_CAP_SURROUNDING_TEXT)) {
+ gboolean return_value;
+ g_signal_emit (context, _signal_retrieve_surrounding_id, 0,
+ &return_value);
@ -255,7 +262,7 @@ index 6570473..ca8db35 100644
switch (event->type) {
case GDK_KEY_RELEASE:
retval = ibus_input_context_process_key_event (ibuscontext,
@@ -291,6 +310,7 @@ ibus_im_context_class_init (IBusIMContextClass *class)
@@ -291,6 +310,7 @@ ibus_im_context_class_init (IBusIMCo
im_context_class->set_client_window = ibus_im_context_set_client_window;
im_context_class->set_cursor_location = ibus_im_context_set_cursor_location;
im_context_class->set_use_preedit = ibus_im_context_set_use_preedit;
@ -263,7 +270,19 @@ index 6570473..ca8db35 100644
gobject_class->finalize = ibus_im_context_finalize;
_signal_commit_id =
@@ -488,6 +508,8 @@ ibus_im_context_filter_keypress (GtkIMContext *context,
@@ -396,7 +416,11 @@ ibus_im_context_init (GObject *obj)
ibusimcontext->ibuscontext = NULL;
ibusimcontext->has_focus = FALSE;
+#ifdef ENABLE_SURROUNDING
ibusimcontext->caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS | IBUS_CAP_SURROUNDING_TEXT;
+#else
+ ibusimcontext->caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS;
+#endif
// Create slave im context
@@ -488,6 +512,8 @@ ibus_im_context_filter_keypress (GtkIMCo
if (ibusimcontext->client_window == NULL && event->window != NULL)
gtk_im_context_set_client_window ((GtkIMContext *)ibusimcontext, event->window);
@ -272,7 +291,7 @@ index 6570473..ca8db35 100644
switch (event->type) {
case GDK_KEY_RELEASE:
retval = ibus_input_context_process_key_event (ibusimcontext->ibuscontext,
@@ -552,6 +574,8 @@ ibus_im_context_focus_in (GtkIMContext *context)
@@ -552,6 +578,8 @@ ibus_im_context_focus_in (GtkIMContext *
g_object_weak_ref ((GObject *) context, _weak_notify_cb, NULL);
_focus_im_context = context;
}
@ -281,7 +300,7 @@ index 6570473..ca8db35 100644
}
static void
@@ -728,6 +752,39 @@ ibus_im_context_set_use_preedit (GtkIMContext *context, gboolean use_preedit)
@@ -723,6 +751,39 @@ ibus_im_context_set_use_preedit (GtkIMCo
}
static void
@ -321,7 +340,7 @@ index 6570473..ca8db35 100644
_bus_connected_cb (IBusBus *bus,
IBusIMContext *ibusimcontext)
{
@@ -746,6 +803,8 @@ _ibus_context_commit_text_cb (IBusInputContext *ibuscontext,
@@ -741,6 +802,8 @@ _ibus_context_commit_text_cb (IBusInputC
IDEBUG ("%s", __FUNCTION__);
g_signal_emit (ibusimcontext, _signal_commit_id, 0, text->text);
@ -330,7 +349,7 @@ index 6570473..ca8db35 100644
}
static gboolean
@@ -1018,6 +1077,8 @@ _ibus_context_show_preedit_text_cb (IBusInputContext *ibuscontext,
@@ -1013,6 +1076,8 @@ _ibus_context_show_preedit_text_cb (IBus
ibusimcontext->preedit_visible = TRUE;
g_signal_emit (ibusimcontext, _signal_preedit_start_id, 0);
g_signal_emit (ibusimcontext, _signal_preedit_changed_id, 0);
@ -339,7 +358,7 @@ index 6570473..ca8db35 100644
}
static void
@@ -1183,17 +1244,21 @@ _slave_preedit_end_cb (GtkIMContext *slave,
@@ -1178,17 +1243,21 @@ _slave_preedit_end_cb (GtkIMContext *sl
g_signal_emit (ibusimcontext, _signal_preedit_end_id, 0);
}
@ -365,7 +384,7 @@ index 6570473..ca8db35 100644
_slave_delete_surrounding_cb (GtkIMContext *slave,
gint offset_from_cursor,
guint nchars,
@@ -1202,9 +1267,10 @@ _slave_delete_surrounding_cb (GtkIMContext *slave,
@@ -1197,9 +1266,10 @@ _slave_delete_surrounding_cb (GtkIMConte
gboolean return_value;
if (ibusimcontext->enable && ibusimcontext->ibuscontext) {
@ -377,6 +396,37 @@ index 6570473..ca8db35 100644
}
#ifdef OS_CHROMEOS
diff --git a/configure.ac b/configure.ac
index ea0d32b..60776df 100644
--- a/configure.ac
+++ b/configure.ac
@@ -405,6 +405,19 @@ AC_ARG_WITH(no-snooper-apps,
AC_DEFINE_UNQUOTED(NO_SNOOPER_APPS, "$NO_SNOOPER_APPS",
[Does not enbale keyboard snooper in those applications])
+# option for enable surrounding-text
+AC_ARG_ENABLE(surrounding-text,
+ AS_HELP_STRING([--enable-surrounding-text],
+ [Enable surrounding-text support]),
+ [enable_surrounding_text=$enableval],
+ [enable_surrounding_text=no]
+)
+if test x"$enable_surrounding_text" = x"yes"; then
+ AC_DEFINE(ENABLE_SURROUNDING, TRUE, [Enable surrounding-text support])
+else
+ enable_surrounding_text="no (disabled, use --enable-surrounding-text to enable)"
+fi
+
# check iso-codes
PKG_CHECK_MODULES(ISOCODES, [
iso-codes
@@ -477,5 +490,6 @@ Build options:
Build document $enable_gtk_doc
Enable key snooper $enable_key_snooper
No snooper regexes "$NO_SNOOPER_APPS"
+ Enable surrounding-text $enable_surrounding_text
])
diff --git a/ibus/engine.py b/ibus/engine.py
index b1df2fe..ec42fa4 100644
--- a/ibus/engine.py
@ -430,7 +480,7 @@ index 89f6dbd..2db1c9b 100644
def FocusIn(self): pass
diff --git a/src/ibusengine.c b/src/ibusengine.c
index ae07393..87ea7c2 100644
index ae07393..777d404 100644
--- a/src/ibusengine.c
+++ b/src/ibusengine.c
@@ -45,6 +45,7 @@ enum {
@ -581,7 +631,7 @@ index ae07393..87ea7c2 100644
ibus_engine_emit_signal (IBusEngine *engine,
const gchar *signal_name,
GVariant *parameters)
@@ -1133,14 +1215,42 @@ void ibus_engine_delete_surrounding_text (IBusEngine *engine,
@@ -1133,14 +1215,66 @@ void ibus_engine_delete_surrounding_text (IBusEngine *engine,
gint offset_from_cursor,
guint nchars)
{
@ -591,11 +641,35 @@ index ae07393..87ea7c2 100644
+ priv = IBUS_ENGINE_GET_PRIVATE (engine);
+
+ /* Clear the current surrounding-text buffer. */
+ /* Update surrounding-text cache. This is necessary since some
+ engines call ibus_engine_get_surrounding_text() immediately
+ after ibus_engine_delete_surrounding_text(). */
+ if (priv->surrounding_text) {
+ IBusText *text;
+ glong cursor_pos, len;
+
+ cursor_pos = priv->surrounding_cursor_pos + offset_from_cursor;
+ len = ibus_text_get_length (priv->surrounding_text);
+ if (cursor_pos >= 0 && len - cursor_pos >= nchars) {
+ gunichar *ucs;
+
+ ucs = g_utf8_to_ucs4_fast (priv->surrounding_text->text,
+ -1,
+ NULL);
+ memmove (&ucs[cursor_pos],
+ &ucs[cursor_pos + nchars],
+ sizeof(gunichar) * (len - cursor_pos - nchars));
+ ucs[len - nchars] = 0;
+ text = ibus_text_new_from_ucs4 (ucs);
+ g_free (ucs);
+ priv->surrounding_cursor_pos = cursor_pos;
+ } else {
+ text = text_empty;
+ priv->surrounding_cursor_pos = 0;
+ }
+
+ g_object_unref (priv->surrounding_text);
+ priv->surrounding_text = g_object_ref_sink (text_empty);
+ priv->surrounding_cursor_pos = 0;
+ priv->surrounding_text = g_object_ref_sink (text);
+ }
+
ibus_engine_emit_signal (engine,
@ -667,7 +741,7 @@ index 46d0a04..a5f5aea 100644
* @engine: An IBusEngine.
* @returns: Name of IBusEngine.
diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c
index f2977fc..55de905 100644
index fc26a7c..4f08401 100644
--- a/src/ibusinputcontext.c
+++ b/src/ibusinputcontext.c
@@ -59,13 +59,20 @@ enum {

View File

@ -12,7 +12,7 @@
Name: ibus
Version: 1.3.99.20101028
Release: 5%{?dist}
Release: 6%{?dist}
Summary: Intelligent Input Bus for Linux OS
License: LGPLv2+
Group: System Environment/Libraries
@ -169,6 +169,7 @@ automake -a -c -f
--enable-xim \
--disable-gtk-doc \
--with-no-snooper-apps='gnome-do,Do.*,firefox.*,.*chrome.*,.*chromium.*' \
--enable-surrounding-text \
--enable-introspection
# make -C po update-gmo
@ -310,7 +311,7 @@ fi
%{_datadir}/gtk-doc/html/*
%changelog
* Thu Nov 18 2010 Takao Fujiwara <tfujiwar@redhat.com> - 1.3.99.20101028-5
* Mon Nov 22 2010 Takao Fujiwara <tfujiwar@redhat.com> - 1.3.99.20101028-6
- Added ibus-652157-x11-ppc64.patch
Fixed Bug 652157 - Window position of ibus-x11 in ppc64
- Added ibus-530711-preload-sys.patch
@ -322,6 +323,8 @@ fi
- Applied no-snooper for 'gnome-do,Do.*,firefox.*,.*chrome.*,.*chromium.*'
- Updated ibus-541492-xkb.patch
Fixed Bug 653806 - ibus-xkb SEGV
- Updated ibus-435880-surrounding-text.patch
Fixed Bug 639253 - ibus_engine_delete_surrounding_text with offset.
* Fri Oct 29 2010 Takao Fujiwara <tfujiwar@redhat.com> - 1.3.99.20101028-1
- Updated to 1.3.99.20101028