Fixed Bug 639253 - ibus_engine_delete_surrounding_text with offset.
This commit is contained in:
parent
1e452ff156
commit
f7291cc56a
@ -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 {
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user