eekboard: listen xklavier status events.

This commit is contained in:
Daiki Ueno
2010-12-06 12:09:02 +09:00
parent 706fa6310b
commit 910b0be5a5
2 changed files with 43 additions and 24 deletions

View File

@ -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);
}

View File

@ -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;
}