From 910b0be5a51b8519f3e88234b773662227673238 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Mon, 6 Dec 2010 12:09:02 +0900 Subject: [PATCH] eekboard: listen xklavier status events. --- eek/eek-xkl-layout.c | 24 ------------------------ src/eekboard.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 24 deletions(-) diff --git a/eek/eek-xkl-layout.c b/eek/eek-xkl-layout.c index 8ccc310e..de6ad967 100644 --- a/eek/eek-xkl-layout.c +++ b/eek/eek-xkl-layout.c @@ -244,23 +244,6 @@ eek_xkl_layout_class_init (EekXklLayoutClass *klass) g_object_class_install_property (gobject_class, PROP_OPTIONS, pspec); } -/* Disabled since the current EekXklLayout implementation does not - change the server setting. */ -#if 0 -static void -on_state_changed (XklEngine *xklengine, - XklEngineStateChange type, - gint value, - gboolean restore, - gpointer user_data) -{ - EekLayout *layout = user_data; - - if (type == GROUP_CHANGED) - g_signal_emit_by_name (layout, "group_changed", value); -} -#endif - static void eek_xkl_layout_init (EekXklLayout *self) { @@ -274,13 +257,6 @@ eek_xkl_layout_init (EekXklLayout *self) g_return_if_fail (display); priv->engine = xkl_engine_get_instance (display); - /* Disabled since the current EekXklLayout implementation does not - change the server setting. */ -#if 0 - g_signal_connect (priv->engine, "X-state-changed", - G_CALLBACK(on_state_changed), self); - xkl_engine_start_listen (priv->engine, XKLL_TRACK_KEYBOARD_STATE); -#endif xkl_config_rec_get_from_server (priv->config, priv->engine); set_xkb_component_names (self, priv->config); } diff --git a/src/eekboard.c b/src/eekboard.c index 8f3c0085..d51bcc3a 100644 --- a/src/eekboard.c +++ b/src/eekboard.c @@ -1143,6 +1143,37 @@ parse_layouts (XklConfigRec *rec, const gchar *_layouts) rec->variants = variants; } +static GdkFilterReturn +filter_xkl_event (GdkXEvent * xev, + GdkEvent * event, + gpointer user_data) +{ + XEvent *xevent = (XEvent *) xev; + Eekboard *eekboard = user_data; + + xkl_engine_filter_events (eekboard->engine, xevent); + return GDK_FILTER_CONTINUE; +} + +static void +on_xkl_config_changed (XklEngine *xklengine, + gpointer user_data) +{ +} + +static void +on_xkl_state_changed (XklEngine *xklengine, + XklEngineStateChange type, + gint value, + gboolean restore, + gpointer user_data) +{ + Eekboard *eekboard = user_data; + + if (type == GROUP_CHANGED) + g_signal_emit_by_name (eekboard->layout, "group_changed", value); +} + Eekboard * eekboard_new (gboolean use_clutter, gboolean need_swap_event_workaround, @@ -1200,6 +1231,18 @@ eekboard_new (gboolean use_clutter, eekboard->engine = xkl_engine_get_instance (eekboard->display); eekboard->registry = xkl_config_registry_get_instance (eekboard->engine); xkl_config_registry_load (eekboard->registry, FALSE); + g_signal_connect (eekboard->engine, "X-config-changed", + G_CALLBACK(on_xkl_config_changed), eekboard); + g_signal_connect (eekboard->engine, "X-state-changed", + G_CALLBACK(on_xkl_state_changed), eekboard); + + gdk_window_add_filter (NULL, + (GdkFilterFunc)filter_xkl_event, + eekboard); + gdk_window_add_filter (gdk_get_default_root_window (), + (GdkFilterFunc) filter_xkl_event, + eekboard); + xkl_engine_start_listen (eekboard->engine, XKLL_TRACK_KEYBOARD_STATE); return eekboard; }