diff --git a/ibus-435880-surrounding-text.patch b/ibus-435880-surrounding-text.patch index 1a343c4..e88c2d1 100644 --- a/ibus-435880-surrounding-text.patch +++ b/ibus-435880-surrounding-text.patch @@ -34,8 +34,10 @@ resets the current surrounding-text. src/ibusengine.h | 21 ++++++- src/ibusinputcontext.c | 61 ++++++++++++++++++ src/ibusinputcontext.h | 11 +++ + src/ibusenginedesc.c | 91 +++++++++++++++++++++++++ + src/ibusenginedesc.h | 11 +++ src/ibusmarshalers.list | 1 + - 13 files changed, 421 insertions(+), 12 deletions(-) + 15 files changed, 421 insertions(+), 12 deletions(-) diff --git a/bus/engineproxy.c b/bus/engineproxy.c index 59d495d..01116c2 100644 @@ -161,7 +163,7 @@ index 7e522f3..de9f31f 100644 /* signals */ " " " " -@@ -961,6 +966,32 @@ _ic_get_engine (BusInputContext *context, +@@ -961,6 +966,32 @@ _ic_get_engine (BusInputContext *c * Handle a D-Bus method call whose destination and interface name are both "org.freedesktop.IBus.InputContext" */ static void @@ -194,7 +196,7 @@ index 7e522f3..de9f31f 100644 bus_input_context_service_method_call (IBusService *service, GDBusConnection *connection, const gchar *sender, -@@ -999,6 +1030,7 @@ bus_input_context_service_method_call (IBusService *service, +@@ -999,6 +1030,7 @@ bus_input_context_service_method_call (I { "IsEnabled", _ic_is_enabled }, { "SetEngine", _ic_set_engine }, { "GetEngine", _ic_get_engine }, @@ -202,11 +204,33 @@ index 7e522f3..de9f31f 100644 }; gint i; +@@ -2059,6 +2091,10 @@ bus_input_context_set_engine (BusInputCo + bus_engine_proxy_set_cursor_location (context->engine, context->x, context->y, context->w, context->h); + } + } ++ bus_input_context_emit_signal (context, ++ "EngineChanged", ++ NULL, ++ NULL); + g_signal_emit (context, + context_signals[ENGINE_CHANGED], + 0); diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c index a6a11b4..0c15df9 100644 --- a/client/gtk2/ibusimcontext.c +++ b/client/gtk2/ibusimcontext.c -@@ -106,6 +106,12 @@ static void ibus_im_context_set_cursor_location +@@ -59,8 +59,8 @@ struct _IBusIMContext { + GdkRectangle cursor_area; + gboolean has_focus; + +- gint caps; +- ++ guint supported_caps; ++ guint caps; + }; + + struct _IBusIMContextClass { +@@ -106,11 +106,18 @@ static void ibus_im_context_set_curs static void ibus_im_context_set_use_preedit (GtkIMContext *context, gboolean use_preedit); @@ -219,7 +243,13 @@ index a6a11b4..0c15df9 100644 /* static methods*/ static void _create_input_context (IBusIMContext *context); -@@ -124,14 +130,15 @@ static void _slave_preedit_start_cb (GtkIMContext *slave, + static void _set_cursor_location_internal + (GtkIMContext *context); ++static void _negotiate_capabilities (IBusIMContext *context); + + static void _bus_connected_cb (IBusBus *bus, + IBusIMContext *context); +@@ -124,14 +131,15 @@ static void _slave_preedit_start_cb IBusIMContext *context); static void _slave_preedit_end_cb (GtkIMContext *slave, IBusIMContext *context); @@ -241,7 +271,7 @@ index a6a11b4..0c15df9 100644 static GType _ibus_type_im_context = 0; static GtkIMContextClass *parent_class = NULL; -@@ -196,6 +203,17 @@ ibus_im_context_new (void) +@@ -196,6 +204,17 @@ ibus_im_context_new (void) return IBUS_IM_CONTEXT (obj); } @@ -259,7 +289,7 @@ index a6a11b4..0c15df9 100644 static gint _key_snooper_cb (GtkWidget *widget, GdkEventKey *event, -@@ -223,6 +241,8 @@ _key_snooper_cb (GtkWidget *widget, +@@ -223,6 +242,8 @@ _key_snooper_cb (GtkWidget *widget, if (G_UNLIKELY (event->state & IBUS_IGNORED_MASK)) return FALSE; @@ -268,7 +298,7 @@ index a6a11b4..0c15df9 100644 switch (event->type) { case GDK_KEY_RELEASE: retval = ibus_input_context_process_key_event (ibuscontext, -@@ -269,6 +289,7 @@ ibus_im_context_class_init (IBusIMContextClass *class) +@@ -269,6 +290,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; @@ -276,19 +306,21 @@ index a6a11b4..0c15df9 100644 gobject_class->finalize = ibus_im_context_finalize; _signal_commit_id = -@@ -367,7 +388,11 @@ ibus_im_context_init (GObject *obj) +@@ -367,7 +389,12 @@ ibus_im_context_init (GObject *obj) ibusimcontext->ibuscontext = NULL; ibusimcontext->has_focus = FALSE; +- ibusimcontext->caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS | IBUS_CAP_SURROUNDING_TEXT; +#ifdef ENABLE_SURROUNDING - ibusimcontext->caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS | IBUS_CAP_SURROUNDING_TEXT; ++ ibusimcontext->supported_caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS | IBUS_CAP_SURROUNDING_TEXT; +#else -+ ibusimcontext->caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS; ++ ibusimcontext->supported_caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS; +#endif ++ ibusimcontext->caps = ibusimcontext->supported_caps; // Create slave im context -@@ -459,6 +484,8 @@ ibus_im_context_filter_keypress (GtkIMContext *context, +@@ -459,6 +486,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); @@ -297,7 +329,7 @@ index a6a11b4..0c15df9 100644 switch (event->type) { case GDK_KEY_RELEASE: retval = ibus_input_context_process_key_event (ibusimcontext->ibuscontext, -@@ -516,6 +543,8 @@ ibus_im_context_focus_in (GtkIMContext *context) +@@ -516,6 +545,8 @@ ibus_im_context_focus_in (GtkIMContext * (gpointer *) &_focus_im_context); _focus_im_context = context; } @@ -306,7 +338,47 @@ index a6a11b4..0c15df9 100644 } static void -@@ -689,6 +718,39 @@ ibus_im_context_set_use_preedit (GtkIMContext *context, gboolean use_preedit) +@@ -670,6 +701,25 @@ ibus_im_context_set_cursor_location (Gtk + } + + static void ++_negotiate_capabilities (IBusIMContext *context) ++{ ++ IBusEngineDesc *engine; ++ ++ engine = ibus_input_context_get_engine (context->ibuscontext); ++ if (engine) { ++ context->caps = context->supported_caps & ++ ibus_engine_desc_get_requires (engine); ++ ibus_input_context_set_capabilities (context->ibuscontext, ++ context->caps); ++ IDEBUG ("engine %s: supported caps = %u, engine wants = %u, caps = %u", ++ ibus_engine_desc_get_name (engine) ++ context->supported_caps, ++ ibus_engine_desc_get_requires (engine), ++ context->caps); ++ } ++} ++ ++static void + ibus_im_context_set_use_preedit (GtkIMContext *context, gboolean use_preedit) + { + IDEBUG ("%s", __FUNCTION__); +@@ -678,17 +728,50 @@ ibus_im_context_set_use_preedit (GtkIMCo + + if(ibusimcontext->ibuscontext) { + if (use_preedit) { +- ibusimcontext->caps |= IBUS_CAP_PREEDIT_TEXT; ++ ibusimcontext->supported_caps |= IBUS_CAP_PREEDIT_TEXT; + } + else { +- ibusimcontext->caps &= ~IBUS_CAP_PREEDIT_TEXT; ++ ibusimcontext->supported_caps &= ~IBUS_CAP_PREEDIT_TEXT; + } +- ibus_input_context_set_capabilities (ibusimcontext->ibuscontext, ibusimcontext->caps); ++ _negotiate_capabilities (ibusimcontext); + } + gtk_im_context_set_use_preedit (ibusimcontext->slave, use_preedit); } static void @@ -346,7 +418,7 @@ index a6a11b4..0c15df9 100644 _bus_connected_cb (IBusBus *bus, IBusIMContext *ibusimcontext) { -@@ -704,6 +766,8 @@ _ibus_context_commit_text_cb (IBusInputContext *ibuscontext, +@@ -704,6 +787,8 @@ _ibus_context_commit_text_cb (IBusInputC IDEBUG ("%s", __FUNCTION__); g_signal_emit (ibusimcontext, _signal_commit_id, 0, text->text); @@ -355,7 +427,7 @@ index a6a11b4..0c15df9 100644 } static gboolean -@@ -976,6 +1040,8 @@ _ibus_context_show_preedit_text_cb (IBusInputContext *ibuscontext, +@@ -976,6 +1061,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); @@ -364,7 +436,33 @@ index a6a11b4..0c15df9 100644 } static void -@@ -1139,17 +1205,21 @@ _slave_preedit_end_cb (GtkIMContext *slave, +@@ -1041,6 +1128,14 @@ _ibus_context_destroy_cb (IBusInputConte + } + + static void ++_ibus_context_engine_changed_cb (IBusInputContext *ibuscontext, ++ IBusIMContext *ibusimcontext) ++{ ++ IDEBUG ("%s", __FUNCTION__); ++ _negotiate_capabilities (ibusimcontext); ++} ++ ++static void + _create_input_context (IBusIMContext *ibusimcontext) + { + IDEBUG ("%s", __FUNCTION__); +@@ -1083,6 +1178,10 @@ _create_input_context (IBusIMContext *ib + "disabled", + G_CALLBACK (_ibus_context_disabled_cb), + ibusimcontext); ++ g_signal_connect (ibusimcontext->ibuscontext, ++ "engine-changed", ++ G_CALLBACK (_ibus_context_engine_changed_cb), ++ ibusimcontext); + g_signal_connect (ibusimcontext->ibuscontext, "destroy", + G_CALLBACK (_ibus_context_destroy_cb), + ibusimcontext); +@@ -1139,17 +1238,21 @@ _slave_preedit_end_cb (GtkIMContext *sl g_signal_emit (ibusimcontext, _signal_preedit_end_id, 0); } @@ -390,7 +488,7 @@ index a6a11b4..0c15df9 100644 _slave_delete_surrounding_cb (GtkIMContext *slave, gint offset_from_cursor, guint nchars, -@@ -1158,8 +1228,9 @@ _slave_delete_surrounding_cb (GtkIMContext *slave, +@@ -1158,8 +1261,9 @@ _slave_delete_surrounding_cb (GtkIMConte gboolean return_value; if (ibusimcontext->enable && ibusimcontext->ibuscontext) { @@ -474,7 +572,7 @@ diff --git a/ibus/interface/iinputcontext.py b/ibus/interface/iinputcontext.py index 89f6dbd..2db1c9b 100644 --- a/ibus/interface/iinputcontext.py +++ b/ibus/interface/iinputcontext.py -@@ -49,6 +49,9 @@ class IInputContext(dbus.service.Object): +@@ -49,6 +49,9 @@ class IInputContext(dbus.service.Object) @method(in_signature="iiii") def SetCursorLocation(self, x, y, w, h): pass @@ -484,6 +582,13 @@ index 89f6dbd..2db1c9b 100644 @method() def FocusIn(self): pass +@@ -137,4 +140,6 @@ class IInputContext(dbus.service.Object) + @signal(signature="v") + def UpdateProperty(self, prop): pass + ++ @signal() ++ def EngineChanged(self): pass + diff --git a/src/ibusengine.c b/src/ibusengine.c index ae07393..777d404 100644 --- a/src/ibusengine.c @@ -749,7 +854,15 @@ diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c index fc26a7c..4f08401 100644 --- a/src/ibusinputcontext.c +++ b/src/ibusinputcontext.c -@@ -59,13 +59,20 @@ enum { +@@ -52,6 +52,7 @@ enum { + CURSOR_DOWN_LOOKUP_TABLE, + REGISTER_PROPERTIES, + UPDATE_PROPERTY, ++ ENGINE_CHANGED, + LAST_SIGNAL, + }; + +@@ -59,13 +60,20 @@ enum { /* BusInputContextPriv */ struct _IBusInputContextPrivate { gboolean own; @@ -770,7 +883,7 @@ index fc26a7c..4f08401 100644 static void ibus_input_context_g_signal (GDBusProxy *proxy, const gchar *sender_name, const gchar *signal_name, -@@ -76,10 +83,13 @@ G_DEFINE_TYPE (IBusInputContext, ibus_input_context, IBUS_TYPE_PROXY) +@@ -76,10 +84,13 @@ G_DEFINE_TYPE (IBusInputContext, ibus_in static void ibus_input_context_class_init (IBusInputContextClass *class) { @@ -784,7 +897,29 @@ index fc26a7c..4f08401 100644 g_dbus_proxy_class->g_signal = ibus_input_context_g_signal; /* install signals */ -@@ -442,6 +452,9 @@ ibus_input_context_class_init (IBusInputContextClass *class) +@@ -114,6 +125,21 @@ ibus_input_context_class_init (IBusInput + G_TYPE_NONE, 0); + + /** ++ * IBusInputContext::engine-changed: ++ * @context: An IBusInputContext. ++ * ++ * Emitted when an IME is changed. ++ */ ++ context_signals[ENGINE_CHANGED] = ++ g_signal_new (I_("engine-changed"), ++ G_TYPE_FROM_CLASS (class), ++ G_SIGNAL_RUN_LAST, ++ 0, ++ NULL, NULL, ++ _ibus_marshal_VOID__VOID, ++ G_TYPE_NONE, 0); ++ ++ /** + * IBusInputContext::commit-text: + * @context: An IBusInputContext. + * @text: Text to be committed. +@@ -442,6 +468,9 @@ ibus_input_context_class_init (IBusInput G_TYPE_NONE, 1, IBUS_TYPE_PROPERTY); @@ -794,7 +929,7 @@ index fc26a7c..4f08401 100644 } static void -@@ -450,6 +463,22 @@ ibus_input_context_init (IBusInputContext *context) +@@ -450,6 +479,22 @@ ibus_input_context_init (IBusInputContex IBusInputContextPrivate *priv; priv = IBUS_INPUT_CONTEXT_GET_PRIVATE (context); priv->own = TRUE; @@ -817,7 +952,15 @@ index fc26a7c..4f08401 100644 } static void -@@ -821,6 +850,38 @@ ibus_input_context_property_hide (IBusInputContext *context, +@@ -479,6 +524,7 @@ ibus_input_context_g_signal (GDBusProxy + { "PageDownLookupTable", PAGE_DOWN_LOOKUP_TABLE }, + { "CursorUpLookupTable", CURSOR_UP_LOOKUP_TABLE }, + { "CursorDownLookupTable", CURSOR_DOWN_LOOKUP_TABLE }, ++ { "EngineChanged", ENGINE_CHANGED }, + }; + + if (g_strcmp0 (signal_name, "CommitText") == 0) { +@@ -821,6 +867,38 @@ ibus_input_context_property_hide (IBusIn ); } @@ -897,6 +1040,282 @@ index 5184278..5dc7fc2 100644 VOID:OBJECT,UINT,BOOL VOID:OBJECT,UINT,BOOL,UINT VOID:OBJECT,BOOL +diff --git a/src/ibusenginedesc.c b/src/ibusenginedesc.c +index 5184278..5dc7fc2 100644 +--- a/src/ibusenginedesc.c ++++ b/src/ibusenginedesc.c +@@ -22,6 +22,7 @@ + #include + #include "ibusenginedesc.h" + #include "ibusxml.h" ++#include "ibusenumtypes.h" + + enum { + LAST_SIGNAL, +@@ -39,6 +40,7 @@ enum { + PROP_LAYOUT, + PROP_RANK, + PROP_HOTKEYS, ++ PROP_REQUIRES, + }; + + +@@ -54,6 +56,7 @@ struct _IBusEngineDescPrivate { + gchar *layout; + guint rank; + gchar *hotkeys; ++ guint requires; + }; + + #define IBUS_ENGINE_DESC_GET_PRIVATE(o) \ +@@ -79,9 +82,20 @@ static gboolean ibus_engine_desc_cop + const IBusEngineDesc *src); + static gboolean ibus_engine_desc_parse_xml_node (IBusEngineDesc *desc, + XMLNode *node); ++static void ibus_engine_desc_output_capabilities ++ (guint caps, ++ GString *output, ++ gint indent); ++static guint ibus_engine_desc_parse_capabilities ++ (XMLNode *node); + + G_DEFINE_TYPE (IBusEngineDesc, ibus_engine_desc, IBUS_TYPE_SERIALIZABLE) + ++#define DEFAULT_REQUIRES (IBUS_CAP_PREEDIT_TEXT | \ ++ IBUS_CAP_AUXILIARY_TEXT | \ ++ IBUS_CAP_LOOKUP_TABLE | \ ++ IBUS_CAP_FOCUS | \ ++ IBUS_CAP_PROPERTY) + + static void + ibus_engine_desc_class_init (IBusEngineDescClass *class) +@@ -232,6 +246,21 @@ ibus_engine_desc_class_init (IBusEngineD + "The hotkeys of engine description", + "", + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); ++ ++ /** ++ * IBusEngineDesc:requires: ++ * ++ * The required capabilities of engine description ++ */ ++ g_object_class_install_property (gobject_class, ++ PROP_REQUIRES, ++ g_param_spec_uint ("requires", ++ "description requires", ++ "The required capabilities of engine description", ++ 0, ++ G_MAXUINT, ++ DEFAULT_REQUIRES, ++ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + } + + static void +@@ -249,6 +278,7 @@ ibus_engine_desc_init (IBusEngineDesc *d + desc->priv->layout = NULL; + desc->priv->rank = 0; + desc->priv->hotkeys = NULL; ++ desc->priv->requires = DEFAULT_REQUIRES; + } + + static void +@@ -313,6 +343,9 @@ ibus_engine_desc_set_property (IBusEngin + g_assert (desc->priv->hotkeys == NULL); + desc->priv->hotkeys = g_value_dup_string (value); + break; ++ case PROP_REQUIRES: ++ desc->priv->requires = g_value_get_uint (value); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (desc, prop_id, pspec); + } +@@ -355,6 +388,9 @@ ibus_engine_desc_get_property (IBusEngin + case PROP_HOTKEYS: + g_value_set_string (value, ibus_engine_desc_get_hotkeys (desc)); + break; ++ case PROP_REQUIRES: ++ g_value_set_uint (value, ibus_engine_desc_get_requires (desc)); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (desc, prop_id, pspec); + } +@@ -382,9 +418,28 @@ ibus_engine_desc_serialize (IBusEngineDe + g_variant_builder_add (builder, "u", desc->priv->rank); + g_variant_builder_add (builder, "s", NOTNULL (desc->priv->hotkeys)); + #undef NOTNULL ++ ++ /* append extra properties */ ++ GVariantBuilder array; ++ g_variant_builder_init (&array, G_VARIANT_TYPE ("a{sv}")); ++ g_variant_builder_add (&array, "{sv}", "requires", g_variant_new_uint32 (desc->priv->requires)); ++ g_variant_builder_add (builder, "v", g_variant_builder_end (&array)); ++ + return TRUE; + } + ++static gboolean ++ibus_engine_desc_deserialize_property (IBusEngineDesc *desc, ++ const gchar *name, ++ GVariant *variant) ++{ ++ if (g_strcmp0 (name, "requires") == 0) { ++ g_variant_get (variant, "u", &desc->priv->requires); ++ return TRUE; ++ } ++ return FALSE; ++} ++ + static gint + ibus_engine_desc_deserialize (IBusEngineDesc *desc, + GVariant *variant) +@@ -405,6 +460,23 @@ ibus_engine_desc_deserialize (IBusEngine + g_variant_get_child (variant, retval++, "u", &desc->priv->rank); + g_variant_get_child (variant, retval++, "s", &desc->priv->hotkeys); + ++ /* extract extra properties */ ++ GVariantIter iter; ++ GVariant *child, *array; ++ ++ g_variant_get_child (variant, retval++, "v", &array); ++ g_variant_iter_init (&iter, array); ++ while ((child = g_variant_iter_next_value (&iter))) { ++ gchar *name; ++ GVariant *value; ++ g_variant_get (child, "{sv}", &name, &value); ++ if (ibus_engine_desc_deserialize_property (desc, name, value)) ++ retval++; ++ g_free (name); ++ g_variant_unref (value); ++ g_variant_unref (child); ++ } ++ + return retval; + } + +@@ -428,6 +500,7 @@ ibus_engine_desc_copy (IBusEngineDesc + dest->priv->layout = g_strdup (src->priv->layout); + dest->priv->rank = src->priv->rank; + dest->priv->hotkeys = g_strdup (src->priv->hotkeys); ++ dest->priv->requires = src->priv->requires; + return TRUE; + } + +@@ -439,6 +512,52 @@ ibus_engine_desc_copy (IBusEngineDesc + } \ + } + ++static void ++ibus_engine_desc_output_capabilities (guint caps, ++ GString *output, ++ gint indent) ++{ ++ GFlagsClass *flags_class; ++ gint i; ++ ++ flags_class = g_type_class_ref (IBUS_TYPE_CAPABILITE); ++ g_return_if_fail (G_TYPE_IS_FLAGS (IBUS_TYPE_CAPABILITE)); ++ for (i = 0; i < flags_class->n_values; i++) { ++ GFlagsValue *flags_value = &flags_class->values[i]; ++ if (caps & flags_value->value) { ++ g_string_append_indent (output, indent + 1); ++ g_string_append_printf (output, "%s\n", ++ flags_value->value_nick); ++ } ++ } ++ g_type_class_unref (flags_class); ++} ++ ++static guint ++ibus_engine_desc_parse_capabilities (XMLNode *node) ++{ ++ GFlagsClass *flags_class; ++ guint caps = 0; ++ GList *p; ++ ++ flags_class = g_type_class_ref (IBUS_TYPE_CAPABILITE); ++ for (p = node->sub_nodes; p != NULL; p = p->next) { ++ XMLNode *sub_node = (XMLNode *) p->data; ++ ++ if (g_strcmp0 (sub_node->name, "capability") == 0) { ++ gint i; ++ for (i = 0; i < flags_class->n_values; i++) { ++ GFlagsValue *flags_value = &flags_class->values[i]; ++ if (g_strcmp0 (flags_value->value_nick, sub_node->text) == 0) ++ caps |= flags_value->value; ++ } ++ } ++ } ++ g_type_class_unref (flags_class); ++ ++ return caps; ++} ++ + void + ibus_engine_desc_output (IBusEngineDesc *desc, + GString *output, +@@ -467,6 +586,13 @@ ibus_engine_desc_output (IBusEngineDesc + OUTPUT_ENTRY_1(hotkeys); + g_string_append_indent (output, indent + 1); + g_string_append_printf (output, "%u\n", desc->priv->rank); ++ ++ g_string_append_indent (output, indent + 1); ++ g_string_append (output, "\n"); ++ ibus_engine_desc_output_capabilities (desc->priv->requires, output, ++ indent + 2); ++ g_string_append_indent (output, indent + 1); ++ g_string_append (output, "\n"); + #undef OUTPUT_ENTRY + #undef OUTPUT_ENTRY_1 + g_string_append_indent (output, indent); +@@ -504,6 +630,11 @@ ibus_engine_desc_parse_xml_node (IBusEng + desc->priv->rank = atoi (sub_node->text); + continue; + } ++ if (g_strcmp0 (sub_node->name , "requires") == 0) { ++ desc->priv->requires = ++ ibus_engine_desc_parse_capabilities (sub_node); ++ continue; ++ } + g_warning (" element contains invalidate element <%s>", sub_node->name); + } + return TRUE; +@@ -526,6 +657,7 @@ IBUS_ENGINE_DESC_GET_PROPERTY (icon, con + IBUS_ENGINE_DESC_GET_PROPERTY (layout, const gchar *) + IBUS_ENGINE_DESC_GET_PROPERTY (rank, guint) + IBUS_ENGINE_DESC_GET_PROPERTY (hotkeys, const gchar *) ++IBUS_ENGINE_DESC_GET_PROPERTY (requires, guint) + #undef IBUS_ENGINE_DESC_GET_PROPERTY + + IBusEngineDesc * +diff --git a/src/ibusenginedesc.h b/src/ibusenginedesc.h +index 5184278..5dc7fc2 100644 +--- a/src/ibusenginedesc.h ++++ b/src/ibusenginedesc.h +@@ -90,6 +90,8 @@ typedef struct _IBusEngineDescClass IBus + * the front. + * hotkeys: One or more hotkeys for switching to this engine, separated by + * semi-colon. ++ * requires: Capabilities this engine will utilize. The value is the ++ * union of the IBusCapability flags. + */ + struct _IBusEngineDesc { + IBusSerializable parent; +@@ -249,6 +251,15 @@ guint ibus_engine_desc_get_ra + const gchar *ibus_engine_desc_get_hotkeys (IBusEngineDesc *info); + + /** ++ * ibus_engine_desc_get_requires: ++ * @info: An IBusEngineDesc ++ * @returns: request capabilites property in IBusEngineDesc ++ * ++ * Return the capabilites property in IBusEngineDesc. ++ */ ++guint ibus_engine_desc_get_requires (IBusEngineDesc *info); ++ ++/** + * ibus_engine_desc_output: + * @info: An IBusEngineDesc + * @output: XML-formatted Input method engine description. -- 1.7.3.2 diff --git a/ibus-530711-preload-sys.patch b/ibus-530711-preload-sys.patch index 06a223d..20b4b6e 100644 --- a/ibus-530711-preload-sys.patch +++ b/ibus-530711-preload-sys.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Reload preload engines until users customize the list. The idea is, if users don't customize the preload_engines with ibus-setup, users would prefer to load the system default engines again by login. The gconf value 'preload_engine_mode' is -IBUS_PRELOAD_ENGINE_MODE_USER by default. +IBUS_PRELOAD_ENGINE_MODE_LANG_RELATIVE by default. If preload_engine_mode is IBUS_PRELOAD_ENGINE_MODE_LANG_RELATIVE, ibus-daemon loads the system preload engines by langs. If preload_engine_mode is IBUS_PRELOAD_ENGINE_MODE_USER, @@ -56,7 +56,7 @@ index d7e496d..6f39fac 100644 +_get_config_preload_engine_mode (BusIBusImpl *ibus) +{ + GVariant *variant = NULL; -+ gint preload_engine_mode = IBUS_PRELOAD_ENGINE_MODE_USER; ++ gint preload_engine_mode = IBUS_PRELOAD_ENGINE_MODE_LANG_RELATIVE; + + g_assert (BUS_IS_IBUS_IMPL (ibus)); + @@ -198,7 +198,7 @@ index d7e496d..6f39fac 100644 +bus_ibus_impl_set_preload_engine_mode (BusIBusImpl *ibus, + GVariant *value) +{ -+ gint preload_engine_mode = IBUS_PRELOAD_ENGINE_MODE_USER; ++ gint preload_engine_mode = IBUS_PRELOAD_ENGINE_MODE_LANG_RELATIVE; - if (ibus->engine_list) { - BusComponent *component = bus_component_from_engine_desc ((IBusEngineDesc *) ibus->engine_list->data); @@ -257,7 +257,7 @@ index d7e496d..6f39fac 100644 - g_assert (BUS_IS_IBUS_IMPL (ibus)); - static gboolean done = FALSE; -+ gint preload_engine_mode = IBUS_PRELOAD_ENGINE_MODE_USER; ++ gint preload_engine_mode = IBUS_PRELOAD_ENGINE_MODE_LANG_RELATIVE; + + g_assert (BUS_IS_IBUS_IMPL (ibus)); @@ -331,7 +331,7 @@ index aa66aa5..9b82857 100644 + /desktop/ibus/general/preload_engine_mode + ibus + int -+ 0 ++ 1 + + Preload engine mode + Preload engines are loaded with this mode. diff --git a/ibus.spec b/ibus.spec index b750c92..16af68f 100644 --- a/ibus.spec +++ b/ibus.spec @@ -12,7 +12,7 @@ Name: ibus Version: 1.3.99.20101202 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Intelligent Input Bus for Linux OS License: LGPLv2+ Group: System Environment/Libraries @@ -20,9 +20,9 @@ URL: http://code.google.com/p/ibus/ Source0: http://ibus.googlecode.com/files/%{name}-%{version}.tar.gz Source1: xinput-ibus Patch0: ibus-HEAD.patch -Patch1: ibus-530711-preload-sys.patch +Patch1: ibus-435880-surrounding-text.patch Patch2: ibus-541492-xkb.patch -Patch3: ibus-435880-surrounding-text.patch +Patch3: ibus-530711-preload-sys.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -132,11 +132,11 @@ The ibus-devel-docs package contains developer documentation for ibus %prep %setup -q %patch0 -p1 -%patch1 -p1 -b .preload-sys +%patch1 -p1 -b .surrounding %if %have_libxkbfile %patch2 -p1 -b .xkb %endif -%patch3 -p1 -b .surrounding +%patch3 -p1 -b .preload-sys %build %if %have_libxkbfile @@ -294,6 +294,10 @@ fi %{_datadir}/gtk-doc/html/* %changelog +* Wed Dec 22 2010 Takao Fujiwara - 1.3.99.20101202-2 +- Updated ibus-435880-surrounding-text.patch to support the xml setting. +- Updated ibus-530711-preload-sys.patch to set the default lang base. + * Thu Dec 09 2010 Takao Fujiwara - 1.3.99.20101202-1 - Updated to 1.3.99.20101202 - Added ibus-530711-preload-sys.patch