summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHuang Peng <shawn.p.huang@gmail.com>2009-03-04 18:16:05 +0800
committerHuang Peng <shawn.p.huang@gmail.com>2009-03-04 18:16:05 +0800
commit839bc5b981f72e391c1e33bda9a12d37d17a0d7f (patch)
tree9efa40989ada4745004aa8178cfa5b50898ce3bb
parentfa8b528ae670b04ec75f3c634dec032e7eee0cca (diff)
downloadibus-839bc5b981f72e391c1e33bda9a12d37d17a0d7f.tar.gz
ibus-839bc5b981f72e391c1e33bda9a12d37d17a0d7f.tar.xz
ibus-839bc5b981f72e391c1e33bda9a12d37d17a0d7f.zip
Store and restore properties for input context.
-rw-r--r--bus/inputcontext.c117
1 files changed, 91 insertions, 26 deletions
diff --git a/bus/inputcontext.c b/bus/inputcontext.c
index c2e799d..c53ca8d 100644
--- a/bus/inputcontext.c
+++ b/bus/inputcontext.c
@@ -92,6 +92,9 @@ struct _BusInputContextPrivate {
/* lookup table */
IBusLookupTable *lookup_table;
gboolean lookup_table_visible;
+
+ /* properties */
+ IBusPropList *props;
};
typedef struct _BusInputContextPrivate BusInputContextPrivate;
@@ -140,6 +143,12 @@ static void bus_input_context_show_lookup_table
(BusInputContext *context);
static void bus_input_context_hide_lookup_table
(BusInputContext *context);
+static void bus_input_context_register_properties
+ (BusInputContext *context,
+ IBusPropList *props);
+static void bus_input_context_update_property
+ (BusInputContext *context,
+ IBusProperty *prop);
static void _engine_destroy_cb (BusEngineProxy *factory,
BusInputContext *context);
@@ -147,6 +156,7 @@ static IBusServiceClass *parent_class = NULL;
static guint id = 0;
static IBusText *text_empty = NULL;
static IBusLookupTable *lookup_table_empty = NULL;
+static IBusPropList *props_empty = NULL;
GType
bus_input_context_get_type (void)
@@ -496,6 +506,7 @@ bus_input_context_class_init (BusInputContextClass *klass)
text_empty = ibus_text_new_from_string ("");
lookup_table_empty = ibus_lookup_table_new (9, 0, FALSE, FALSE);
+ props_empty = ibus_prop_list_new ();
}
static void
@@ -530,6 +541,8 @@ bus_input_context_init (BusInputContext *context)
priv->lookup_table = lookup_table_empty;
priv->lookup_table_visible = FALSE;
+ g_object_ref (props_empty);
+ priv->props = props_empty;
}
static void
@@ -562,6 +575,11 @@ bus_input_context_destroy (BusInputContext *context)
priv->lookup_table = NULL;
}
+ if (priv->props) {
+ g_object_unref (priv->props);
+ priv->props = NULL;
+ }
+
if (priv->connection) {
g_signal_handlers_disconnect_by_func (priv->connection,
(GCallback) _connection_destroy_cb,
@@ -1123,6 +1141,12 @@ bus_input_context_focus_in (BusInputContext *context)
if (priv->capabilities & IBUS_CAP_FOCUS) {
g_signal_emit (context, context_signals[FOCUS_IN], 0);
+ if ((priv->capabilities & IBUS_CAP_PROPERTY) == 0) {
+ g_signal_emit (context,
+ context_signals[REGISTER_PROPERTIES],
+ 0,
+ priv->props);
+ }
if (priv->preedit_visible && (priv->capabilities & IBUS_CAP_PREEDIT_TEXT) == 0) {
g_signal_emit (context,
context_signals[UPDATE_PREEDIT_TEXT],
@@ -1506,6 +1530,68 @@ bus_input_context_hide_lookup_table (BusInputContext *context)
}
static void
+bus_input_context_register_properties (BusInputContext *context,
+ IBusPropList *props)
+{
+ g_assert (BUS_IS_INPUT_CONTEXT (context));
+ g_assert (IBUS_IS_PROP_LIST (props));
+
+ BusInputContextPrivate *priv;
+ priv = BUS_INPUT_CONTEXT_GET_PRIVATE (context);
+
+ if (priv->props) {
+ g_object_unref (priv->props);
+ }
+
+ priv->props = (IBusPropList *) g_object_ref (props ? props : props_empty);
+
+ if (priv->capabilities & IBUS_CAP_PROPERTY) {
+ bus_input_context_send_signal (context,
+ "RegisterProperties",
+ IBUS_TYPE_PROP_LIST, &(priv->props),
+ G_TYPE_INVALID);
+ }
+ else {
+ g_signal_emit (context,
+ context_signals[REGISTER_PROPERTIES],
+ 0,
+ priv->props);
+ }
+
+}
+
+static void
+bus_input_context_update_property (BusInputContext *context,
+ IBusProperty *prop)
+{
+ g_assert (BUS_IS_INPUT_CONTEXT (context));
+ g_assert (IBUS_IS_PROPERTY (prop));
+
+ BusInputContextPrivate *priv;
+ priv = BUS_INPUT_CONTEXT_GET_PRIVATE (context);
+
+ if (priv->props == props_empty) {
+ return;
+ }
+
+ if (!ibus_prop_list_update_property (priv->props, prop)) {
+ return;
+ }
+
+ if (priv->capabilities & IBUS_CAP_PROPERTY) {
+ bus_input_context_send_signal (context,
+ "UpdateProperty",
+ IBUS_TYPE_PROPERTY, &prop,
+ G_TYPE_INVALID);
+ }
+ else {
+ g_signal_emit (context,
+ context_signals[UPDATE_PROPERTY],
+ 0,
+ prop);
+ }
+}
+static void
_engine_destroy_cb (BusEngineProxy *engine,
BusInputContext *context)
{
@@ -1624,11 +1710,11 @@ _engine_update_lookup_table_cb (BusEngineProxy *engine,
static void
_engine_register_properties_cb (BusEngineProxy *engine,
- IBusPropList *prop_list,
+ IBusPropList *props,
BusInputContext *context)
{
g_assert (BUS_IS_ENGINE_PROXY (engine));
- g_assert (IBUS_IS_PROP_LIST (prop_list));
+ g_assert (IBUS_IS_PROP_LIST (props));
g_assert (BUS_IS_INPUT_CONTEXT (context));
BusInputContextPrivate *priv;
@@ -1636,18 +1722,7 @@ _engine_register_properties_cb (BusEngineProxy *engine,
g_assert (priv->engine == engine);
- if (priv->capabilities & IBUS_CAP_PROPERTY) {
- bus_input_context_send_signal (context,
- "RegisterProperties",
- IBUS_TYPE_PROP_LIST, &prop_list,
- G_TYPE_INVALID);
- }
- else {
- g_signal_emit (context,
- context_signals[REGISTER_PROPERTIES],
- 0,
- prop_list);
- }
+ bus_input_context_register_properties (context, props);
}
static void
@@ -1664,18 +1739,7 @@ _engine_update_property_cb (BusEngineProxy *engine,
g_assert (priv->engine == engine);
- if (priv->capabilities & IBUS_CAP_PROPERTY) {
- bus_input_context_send_signal (context,
- "UpdateProperty",
- IBUS_TYPE_PROPERTY, &prop,
- G_TYPE_INVALID);
- }
- else {
- g_signal_emit (context,
- context_signals[UPDATE_PROPERTY],
- 0,
- prop);
- }
+ bus_input_context_update_property (context, prop);
}
#define DEFINE_FUNCTION(name) \
@@ -1827,6 +1891,7 @@ bus_input_context_unset_engine (BusInputContext *context)
BusInputContextPrivate *priv;
priv = BUS_INPUT_CONTEXT_GET_PRIVATE (context);
+ bus_input_context_register_properties (context, props_empty);
bus_input_context_update_preedit_text (context, text_empty, 0, FALSE);
bus_input_context_update_auxiliary_text (context, text_empty, FALSE);
bus_input_context_update_lookup_table (context, lookup_table_empty, FALSE);