summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gtk2/ibusim.c4
-rw-r--r--gtk2/ibusimclient.c227
-rw-r--r--gtk2/ibusimclient.h17
-rw-r--r--gtk2/ibusmarshalers.list1
4 files changed, 94 insertions, 155 deletions
diff --git a/gtk2/ibusim.c b/gtk2/ibusim.c
index ec33a10..d0a5773 100644
--- a/gtk2/ibusim.c
+++ b/gtk2/ibusim.c
@@ -22,6 +22,7 @@
#include <string.h>
#include <stdio.h>
#include "ibusimclient.h"
+#include "ibusimcontext.h"
#define IBUS_LOCALDIR ""
@@ -58,8 +59,9 @@ GtkIMContext *
im_module_create (const gchar *context_id)
{
if (strcmp (context_id, "ibus") == 0) {
+ gchar *ic;
IBusIMContext *context;
- context = ibus_im_client_create_im_context (_client);
+ ic = ibus_im_client_create_im_context (_client);
return GTK_IM_CONTEXT(context);
}
return NULL;
diff --git a/gtk2/ibusimclient.c b/gtk2/ibusimclient.c
index 55e13ac..d2576d1 100644
--- a/gtk2/ibusimclient.c
+++ b/gtk2/ibusimclient.c
@@ -42,6 +42,7 @@
enum {
CONNECTED,
DISCONNECTED,
+ FORWARD_EVENT,
COMMIT_STRING,
UPDATE_PREEDIT,
SHOW_PREEDIT,
@@ -72,8 +73,6 @@ struct _IBusIMClientPrivate {
DBusConnection *ibus;
- GHashTable *ic_table;
- GList *contexts;
};
/* variables */
@@ -194,9 +193,6 @@ ibus_im_client_class_init (IBusIMClientClass *klass)
gobject_class->finalize = ibus_im_client_finalize;
- klass->connected = ibus_im_client_connected;
- klass->disconnected = ibus_im_client_disconnected;
-
client_signals[CONNECTED] =
g_signal_new (I_("connected"),
G_TYPE_FROM_CLASS (gobject_class),
@@ -215,6 +211,18 @@ ibus_im_client_class_init (IBusIMClientClass *klass)
ibus_marshal_VOID__VOID,
G_TYPE_NONE, 0);
+ client_signals[FORWARD_EVENT] =
+ g_signal_new (I_("forward-event"),
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (IBusIMClientClass, commit_string),
+ NULL, NULL,
+ ibus_marshal_VOID__STRING_POINTER,
+ G_TYPE_NONE, 2,
+ G_TYPE_STRING,
+ G_TYPE_POINTER);
+
+
client_signals[COMMIT_STRING] =
g_signal_new (I_("commit-string"),
G_TYPE_FROM_CLASS (gobject_class),
@@ -281,20 +289,6 @@ ibus_im_client_class_init (IBusIMClientClass *klass)
G_TYPE_NONE, 1,
G_TYPE_STRING);
-
-
-
-
-}
-
-void ibus_im_client_connected (IBusIMClient *client)
-{
- /* do nothing */
-}
-
-void ibus_im_client_disconnected (IBusIMClient *client)
-{
- /* do nothing */
}
/*
@@ -397,19 +391,6 @@ _ibus_im_client_ibus_open (IBusIMClient *client)
g_signal_emit (client, client_signals[CONNECTED], 0);
- GList *p;
- for (p = priv->contexts; p != NULL; p = g_list_next (p)) {
- IBusIMContext *context = IBUS_IM_CONTEXT (p->data);
- const gchar *ic = _ibus_im_client_create_input_context (client);
-
- if (ic == NULL) {
- _ibus_im_client_ibus_close (client);
- return;
- }
- g_hash_table_insert (priv->ic_table, g_strdup (ic), context);
- ibus_im_context_set_ic (context, ic);
- }
-
}
/*
@@ -420,14 +401,6 @@ _ibus_im_client_ibus_close (IBusIMClient *client)
{
IBusIMClientPrivate *priv = client->priv;
- GList *p;
- for (p = priv->contexts; p != NULL; p = g_list_next (p)) {
- IBusIMContext *ctx = IBUS_IM_CONTEXT (p->data);
- ibus_im_context_set_ic (ctx, NULL);
- }
-
- g_hash_table_remove_all (priv->ic_table);
-
if (priv->ibus) {
dbus_connection_close (priv->ibus);
dbus_connection_unref (priv->ibus);
@@ -439,21 +412,10 @@ _ibus_im_client_ibus_close (IBusIMClient *client)
/*
* create an im context
*/
-IBusIMContext *
+const char *
ibus_im_client_create_im_context (IBusIMClient *client)
{
- IBusIMContext *context;
- IBusIMClientPrivate *priv = client->priv;
-
- context = IBUS_IM_CONTEXT (ibus_im_context_new ());
- priv->contexts = g_list_append (priv->contexts, context);
-
- const gchar *ic = _ibus_im_client_create_input_context (client);
- ibus_im_context_set_ic (context, ic);
- if (ic) {
- g_hash_table_insert (priv->ic_table, (gpointer)g_strdup (ic), context);
- }
- return context;
+ return _ibus_im_client_create_input_context (client);
}
/*
@@ -532,9 +494,6 @@ ibus_im_client_init (IBusIMClient *obj)
priv = G_TYPE_INSTANCE_GET_PRIVATE (client, IBUS_TYPE_IM_CLIENT, IBusIMClientPrivate);
client->priv = priv;
- priv->ic_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
- priv->contexts = NULL;
-
watch_path = g_strdup_printf ("/tmp/ibus-%s", g_get_user_name ());
if (g_stat (watch_path, &stat_buf) != 0) {
@@ -659,7 +618,6 @@ static void
_ibus_signal_commit_string_handler (DBusConnection *connection, DBusMessage *message, IBusIMClient *client)
{
/* Handle CommitString signal */
- IBusIMClientPrivate *priv = client->priv;
DBusError error = {0};
gchar *ic = NULL;
gchar *string = NULL;
@@ -672,12 +630,7 @@ _ibus_signal_commit_string_handler (DBusConnection *connection, DBusMessage *mes
dbus_error_free (&error);
}
else {
- IBusIMContext *context = g_hash_table_lookup (priv->ic_table, (gpointer)ic);
- if (context == NULL) {
- g_debug ("Can not find context assocate with ic(%s)", ic);
- return;
- }
- ibus_im_context_commit_string (context, string);
+ g_signal_emit (client, client_signals[COMMIT_STRING], 0, ic, string);
}
}
@@ -685,7 +638,6 @@ static void
_ibus_signal_update_preedit_handler (DBusConnection *connection, DBusMessage *message, IBusIMClient *client)
{
/* Handle UpdatePreedit signal */
- IBusIMClientPrivate *priv = client->priv;
DBusMessageIter iter, sub_iter;
int type, sub_type;
@@ -805,12 +757,8 @@ _ibus_signal_update_preedit_handler (DBusConnection *connection, DBusMessage *me
dbus_message_iter_next (&iter);
{
- IBusIMContext *context = g_hash_table_lookup (priv->ic_table, (gpointer)ic);
- if (context == NULL) {
- g_debug ("Can not find context assocate with ic(%s)", ic);
- return;
- }
- ibus_im_context_update_preedit (context, string, attrs, cursor, visible);
+ g_signal_emit (client, client_signals[UPDATE_PREEDIT], 0,
+ ic, string, attrs, cursor, visible);
}
pango_attr_list_unref (attrs);
@@ -820,7 +768,6 @@ static void
_ibus_signal_show_preedit_handler (DBusConnection *connection, DBusMessage *message, IBusIMClient *client)
{
/* Handle CommitString signal */
- IBusIMClientPrivate *priv = client->priv;
DBusError error = {0};
gchar *ic = NULL;
@@ -831,12 +778,7 @@ _ibus_signal_show_preedit_handler (DBusConnection *connection, DBusMessage *mess
dbus_error_free (&error);
}
else {
- IBusIMContext *context = g_hash_table_lookup (priv->ic_table, (gpointer)ic);
- if (context == NULL) {
- g_debug ("Can not find context assocate with ic(%s)", ic);
- return;
- }
- ibus_im_context_show_preedit (context);
+ g_signal_emit (client, client_signals[SHOW_PREEDIT], 0, ic);
}
}
@@ -844,7 +786,6 @@ static void
_ibus_signal_hide_preedit_handler (DBusConnection *connection, DBusMessage *message, IBusIMClient *client)
{
/* Handle CommitString signal */
- IBusIMClientPrivate *priv = client->priv;
DBusError error = {0};
gchar *ic = NULL;
@@ -855,12 +796,7 @@ _ibus_signal_hide_preedit_handler (DBusConnection *connection, DBusMessage *mess
dbus_error_free (&error);
}
else {
- IBusIMContext *context = g_hash_table_lookup (priv->ic_table, (gpointer)ic);
- if (context == NULL) {
- g_debug ("Can not find context assocate with ic(%s)", ic);
- return;
- }
- ibus_im_context_hide_preedit (context);
+ g_signal_emit (client, client_signals[HIDE_PREEDIT], 0, ic);
}
}
@@ -868,8 +804,6 @@ _ibus_signal_hide_preedit_handler (DBusConnection *connection, DBusMessage *mess
static void
_ibus_signal_name_owner_changed_handler (DBusConnection *connection, DBusMessage *message, IBusIMClient *client)
{
- IBusIMClientPrivate *priv = client->priv;
-
gchar *name = NULL;
gchar *old_name = NULL;
gchar *new_name = NULL;
@@ -908,7 +842,6 @@ _ibus_signal_enabled_handler (DBusConnection *connection, DBusMessage *message,
{
DEBUG_FUNCTION_IN;
/* Handle CommitString signal */
- IBusIMClientPrivate *priv = client->priv;
DBusError error = {0};
gchar *ic = NULL;
@@ -919,12 +852,7 @@ _ibus_signal_enabled_handler (DBusConnection *connection, DBusMessage *message,
dbus_error_free (&error);
}
else {
- IBusIMContext *context = g_hash_table_lookup (priv->ic_table, (gpointer)ic);
- if (context == NULL) {
- g_debug ("Can not find context assocate with ic(%s)", ic);
- return;
- }
- ibus_im_context_enable (context);
+ g_signal_emit (client, client_signals[ENABLED], 0, ic);
}
}
@@ -934,7 +862,6 @@ _ibus_signal_disabled_handler (DBusConnection *connection, DBusMessage *message,
{
DEBUG_FUNCTION_IN;
/* Handle CommitString signal */
- IBusIMClientPrivate *priv = client->priv;
DBusError error = {0};
gchar *ic = NULL;
@@ -945,12 +872,7 @@ _ibus_signal_disabled_handler (DBusConnection *connection, DBusMessage *message,
dbus_error_free (&error);
}
else {
- IBusIMContext *context = g_hash_table_lookup (priv->ic_table, (gpointer)ic);
- if (context == NULL) {
- g_debug ("Can not find context assocate with ic(%s)", ic);
- return;
- }
- ibus_im_context_disable (context);
+ g_signal_emit (client, client_signals[DISABLED], 0, ic);
}
}
@@ -1194,13 +1116,38 @@ _ibus_call_with_reply (DBusConnection *connection, const gchar *method,
return retval;
}
+typedef struct {
+ IBusIMClient *client;
+ gchar *ic;
+ GdkEvent event;
+}KeyPressCallData;
+
+static KeyPressCallData *
+_key_press_call_data_new (IBusIMClient *client, const gchar *ic, GdkEvent *event)
+{
+ KeyPressCallData *p = g_new (KeyPressCallData, 1);
+ p->client = g_object_ref (client);
+ p->ic = g_strdup (ic);
+ p->event = *event;
+ return p;
+}
+
+static void
+_key_press_call_data_free (KeyPressCallData *p)
+{
+ if (p) {
+ g_object_unref (p->client);
+ g_free (p->ic);
+ }
+ g_free (p);
+}
static void
_ibus_filter_keypress_reply_cb (DBusPendingCall *pending, void *user_data)
{
DBusMessage *reply;
DBusError error = {0};
- GdkEvent *event = (GdkEvent *) user_data;
+ KeyPressCallData *call_data = (KeyPressCallData *) user_data;
gboolean retval;
@@ -1222,19 +1169,19 @@ _ibus_filter_keypress_reply_cb (DBusPendingCall *pending, void *user_data)
}
if (!retval) {
- event->any.send_event = TRUE;
- gdk_event_put (event);
+ g_signal_emit (call_data->client, client_signals[FORWARD_EVENT], 0,
+ call_data->ic, &(call_data->event));
}
}
gboolean
-ibus_im_client_filter_keypress (IBusIMClient *client, IBusIMContext *context, GdkEventKey *event)
+ibus_im_client_filter_keypress (IBusIMClient *client, const gchar *ic, GdkEventKey *event)
{
- IBusIMClientPrivate *priv = client->priv;
- gchar *ic = ibus_im_context_get_ic (context);
+ g_return_val_if_fail (IBUS_IS_IM_CLIENT(client), FALSE);
+ g_return_val_if_fail (ic != NULL, FALSE);
+ g_return_val_if_fail (event != NULL, FALSE);
- if (ic == NULL)
- return FALSE;
+ IBusIMClientPrivate *priv = client->priv;
guint state = event->state & GDK_MODIFIER_MASK;
gboolean is_press = event->type == GDK_KEY_PRESS;
@@ -1247,8 +1194,8 @@ ibus_im_client_filter_keypress (IBusIMClient *client, IBusIMContext *context, Gd
if (!_ibus_call_with_reply (priv->ibus,
"ProcessKeyEvent",
_ibus_filter_keypress_reply_cb,
- gdk_event_copy ((GdkEvent *)event),
- (DBusFreeFunction)gdk_event_free,
+ _key_press_call_data_new (client, ic, (GdkEvent *)event),
+ (DBusFreeFunction)_key_press_call_data_free,
DBUS_TYPE_STRING, &ic,
DBUS_TYPE_UINT32, &event->keyval,
DBUS_TYPE_BOOLEAN, &is_press,
@@ -1261,13 +1208,12 @@ ibus_im_client_filter_keypress (IBusIMClient *client, IBusIMContext *context, Gd
void
-ibus_im_client_focus_in (IBusIMClient *client, IBusIMContext *context)
+ibus_im_client_focus_in (IBusIMClient *client, const gchar *ic)
{
- IBusIMClientPrivate *priv = client->priv;
- gchar *ic = ibus_im_context_get_ic (context);
+ g_return_if_fail (IBUS_IS_IM_CLIENT(client));
+ g_return_if_fail (ic != NULL);
- if (ic == NULL)
- return;
+ IBusIMClientPrivate *priv = client->priv;
/* Call IBus FocusIn method */
_ibus_call_with_reply_and_block (priv->ibus,
@@ -1278,13 +1224,12 @@ ibus_im_client_focus_in (IBusIMClient *client, IBusIMContext *context)
}
void
-ibus_im_client_focus_out (IBusIMClient *client, IBusIMContext *context)
+ibus_im_client_focus_out (IBusIMClient *client, const gchar *ic)
{
- IBusIMClientPrivate *priv = client->priv;
- gchar *ic = ibus_im_context_get_ic (context);
+ g_return_if_fail (IBUS_IS_IM_CLIENT(client));
+ g_return_if_fail (ic != NULL);
- if (ic == NULL)
- return;
+ IBusIMClientPrivate *priv = client->priv;
/* Call IBus FocusOut method */
_ibus_call_with_reply_and_block (priv->ibus,
@@ -1296,13 +1241,12 @@ ibus_im_client_focus_out (IBusIMClient *client, IBusIMContext *context)
}
void
-ibus_im_client_reset (IBusIMClient *client, IBusIMContext *context)
+ibus_im_client_reset (IBusIMClient *client, const gchar *ic)
{
- IBusIMClientPrivate *priv = client->priv;
- gchar *ic = ibus_im_context_get_ic (context);
+ g_return_if_fail (IBUS_IS_IM_CLIENT(client));
+ g_return_if_fail (ic != NULL);
- if (ic == NULL)
- return;
+ IBusIMClientPrivate *priv = client->priv;
/* Call IBus Reset method */
_ibus_call_with_reply_and_block (priv->ibus,
@@ -1314,13 +1258,11 @@ ibus_im_client_reset (IBusIMClient *client, IBusIMContext *context)
}
void
-ibus_im_client_set_cursor_location (IBusIMClient *client, IBusIMContext *context, GdkRectangle *area)
+ibus_im_client_set_cursor_location (IBusIMClient *client, const gchar *ic, GdkRectangle *area)
{
- /* IBusIMClientPrivate *priv = client->priv; */
- gchar *ic = ibus_im_context_get_ic (context);
-
- if (ic == NULL)
- return;
+ g_return_if_fail (IBUS_IS_IM_CLIENT(client));
+ g_return_if_fail (ic != NULL);
+ g_return_if_fail (area != NULL);
_ibus_call_with_reply_and_block (client->priv->ibus,
"SetCursorLocation",
@@ -1334,13 +1276,10 @@ ibus_im_client_set_cursor_location (IBusIMClient *client, IBusIMContext *context
}
void
-ibus_im_client_set_use_preedit (IBusIMClient *client, IBusIMContext *context, gboolean use_preedit)
+ibus_im_client_set_use_preedit (IBusIMClient *client, const gchar *ic, gboolean use_preedit)
{
- /* IBusIMClientPrivate *priv = client->priv; */
- gchar *ic = ibus_im_context_get_ic (context);
-
- if (ic == NULL)
- return;
+ g_return_if_fail (IBUS_IS_IM_CLIENT(client));
+ g_return_if_fail (ic != NULL);
_ibus_call_with_reply_and_block (client->priv->ibus,
"SetCapabilities",
@@ -1351,20 +1290,18 @@ ibus_im_client_set_use_preedit (IBusIMClient *client, IBusIMContext *context, gb
}
void
-ibus_im_client_release_im_context (IBusIMClient *client, IBusIMContext *context)
+ibus_im_client_release_im_context (IBusIMClient *client, const gchar *ic)
{
+ g_return_if_fail (IBUS_IS_IM_CLIENT(client));
+ g_return_if_fail (ic != NULL);
+
IBusIMClientPrivate *priv = client->priv;
- gchar *ic = ibus_im_context_get_ic (context);
- priv->contexts = g_list_remove (priv->contexts, context);
- if (ic) {
- g_hash_table_remove (priv->ic_table, ic);
- _ibus_call_with_reply_and_block (priv->ibus, "ReleaseInputContext",
+
+ _ibus_call_with_reply_and_block (priv->ibus, "ReleaseInputContext",
DBUS_TYPE_STRING, &ic,
DBUS_TYPE_INVALID,
DBUS_TYPE_INVALID);
- }
-
}
void
diff --git a/gtk2/ibusimclient.h b/gtk2/ibusimclient.h
index db6c297..4e51fb8 100644
--- a/gtk2/ibusimclient.h
+++ b/gtk2/ibusimclient.h
@@ -21,7 +21,6 @@
#define __IBUS_IM_CLIENT_H_
#include <gtk/gtk.h>
-#include "ibusimcontext.h"
/*
* Type macros.
*/
@@ -94,27 +93,27 @@ extern IBusIMClient *_client;
GType ibus_im_client_get_type (void);
void ibus_im_client_register_type (GTypeModule *type_module);
IBusIMClient *ibus_im_client_new (void);
-IBusIMContext *ibus_im_client_create_im_context (IBusIMClient *client);
+const gchar *ibus_im_client_create_im_context (IBusIMClient *client);
void ibus_im_client_shutdown (void);
void ibus_im_client_focus_in (IBusIMClient *client,
- IBusIMContext *context);
+ const gchar *ic);
void ibus_im_client_focus_out (IBusIMClient *client,
- IBusIMContext *context);
+ const gchar *ic);
void ibus_im_client_reset (IBusIMClient *client,
- IBusIMContext *context);
+ const gchar *ic);
gboolean ibus_im_client_filter_keypress (IBusIMClient *client,
- IBusIMContext *context,
+ const gchar *ic,
GdkEventKey *key);
void ibus_im_client_set_cursor_location
(IBusIMClient *client,
- IBusIMContext *context,
+ const gchar *ic,
GdkRectangle *area);
void ibus_im_client_set_use_preedit (IBusIMClient *client,
- IBusIMContext *context,
+ const gchar *ic,
gboolean use_preedit);
gboolean ibus_im_client_is_enabled (IBusIMClient *client);
void ibus_im_client_release_im_context(IBusIMClient *client,
- IBusIMContext *context);
+ const gchar *ic);
void ibus_im_client_kill_daemon (IBusIMClient *client);
gboolean ibus_im_client_get_connected (IBusIMClient *client);
diff --git a/gtk2/ibusmarshalers.list b/gtk2/ibusmarshalers.list
index 0630c33..89c4f76 100644
--- a/gtk2/ibusmarshalers.list
+++ b/gtk2/ibusmarshalers.list
@@ -1,4 +1,5 @@
NONE:NONE
NONE:STRING
NONE:STRING,STRING
+NONE:STRING,POINTER
NONE:STRING,STRING,POINTER,INT,BOOL