|
Packit |
3ff832 |
/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
#include <string.h>
|
|
Packit |
3ff832 |
#include "ibus.h"
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
static IBusBus *bus;
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
#define BEFORE_ENGINE "xkb:us::eng"
|
|
Packit |
3ff832 |
#define AFTER_ENGINE "xkb:jp::jpn"
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
static const gchar *engine_names[] = {
|
|
Packit |
3ff832 |
BEFORE_ENGINE,
|
|
Packit |
3ff832 |
AFTER_ENGINE
|
|
Packit |
3ff832 |
};
|
|
Packit |
3ff832 |
|
|
rpm-build |
d915bf |
static const gchar *engine_names2[] = {
|
|
rpm-build |
d915bf |
AFTER_ENGINE,
|
|
rpm-build |
d915bf |
BEFORE_ENGINE
|
|
rpm-build |
d915bf |
};
|
|
rpm-build |
d915bf |
|
|
Packit |
3ff832 |
static void
|
|
rpm-build |
d915bf |
change_global_engine (gboolean reverse)
|
|
Packit |
3ff832 |
{
|
|
Packit |
3ff832 |
gint i;
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
for (i = 0; i < G_N_ELEMENTS (engine_names); i++) {
|
|
rpm-build |
d915bf |
const gchar *engine_name = engine_names[i];
|
|
rpm-build |
d915bf |
if (reverse)
|
|
rpm-build |
d915bf |
engine_name = engine_names2[i];
|
|
rpm-build |
d915bf |
ibus_bus_set_global_engine (bus, engine_name);
|
|
Packit |
3ff832 |
IBusEngineDesc *engine_desc = ibus_bus_get_global_engine (bus);
|
|
Packit |
3ff832 |
g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc),
|
|
Packit |
3ff832 |
==,
|
|
rpm-build |
d915bf |
engine_name);
|
|
Packit |
3ff832 |
g_object_unref (G_OBJECT (engine_desc));
|
|
Packit |
3ff832 |
}
|
|
Packit |
3ff832 |
}
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
static void
|
|
Packit |
3ff832 |
change_context_engine (IBusInputContext *context)
|
|
Packit |
3ff832 |
{
|
|
Packit |
3ff832 |
gint i;
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
for (i = 0; i < G_N_ELEMENTS (engine_names); i++) {
|
|
Packit |
3ff832 |
ibus_input_context_set_engine (context, engine_names[i]);
|
|
Packit |
3ff832 |
IBusEngineDesc *engine_desc = ibus_input_context_get_engine (context);
|
|
Packit |
3ff832 |
g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc),
|
|
Packit |
3ff832 |
==,
|
|
Packit |
3ff832 |
engine_names[i]);
|
|
Packit |
3ff832 |
}
|
|
Packit |
3ff832 |
}
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
typedef struct {
|
|
Packit |
3ff832 |
gint count;
|
|
Packit |
3ff832 |
guint timeout_id;
|
|
Packit |
3ff832 |
guint idle_id;
|
|
rpm-build |
d915bf |
gboolean reverse;
|
|
Packit |
3ff832 |
} GlobalEngineChangedData;
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
static void
|
|
Packit |
3ff832 |
global_engine_changed_cb (IBusBus *bus, gchar *name, gpointer user_data)
|
|
Packit |
3ff832 |
{
|
|
Packit |
3ff832 |
GlobalEngineChangedData *data = (GlobalEngineChangedData *) user_data;
|
|
Packit |
3ff832 |
if (data->count++ == 0)
|
|
Packit |
3ff832 |
ibus_quit ();
|
|
Packit |
3ff832 |
}
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
static gboolean
|
|
Packit |
3ff832 |
timeout_cb (gpointer user_data)
|
|
Packit |
3ff832 |
{
|
|
Packit |
3ff832 |
GlobalEngineChangedData *data = (GlobalEngineChangedData *) user_data;
|
|
Packit |
3ff832 |
if (data->count == 0)
|
|
Packit |
3ff832 |
ibus_quit ();
|
|
Packit |
3ff832 |
data->timeout_id = 0;
|
|
Packit |
3ff832 |
return FALSE;
|
|
Packit |
3ff832 |
}
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
static gboolean
|
|
Packit |
3ff832 |
change_global_engine_cb (gpointer user_data)
|
|
Packit |
3ff832 |
{
|
|
Packit |
3ff832 |
GlobalEngineChangedData *data = (GlobalEngineChangedData *) user_data;
|
|
rpm-build |
d915bf |
change_global_engine (data->reverse);
|
|
Packit |
3ff832 |
data->idle_id = 0;
|
|
Packit |
3ff832 |
return FALSE;
|
|
Packit |
3ff832 |
}
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
static void
|
|
Packit |
3ff832 |
test_global_engine (void)
|
|
Packit |
3ff832 |
{
|
|
rpm-build |
d915bf |
GLogLevelFlags flags;
|
|
rpm-build |
d915bf |
IBusEngineDesc *desc;
|
|
Packit |
3ff832 |
GlobalEngineChangedData data;
|
|
Packit |
3ff832 |
guint handler_id;
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
if (!ibus_bus_get_use_global_engine (bus))
|
|
Packit |
3ff832 |
return;
|
|
Packit |
3ff832 |
|
|
rpm-build |
d915bf |
/* "No global engine." warning is not critical message. */
|
|
rpm-build |
d915bf |
flags = g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
|
|
rpm-build |
d915bf |
desc = ibus_bus_get_global_engine (bus);
|
|
rpm-build |
d915bf |
g_log_set_always_fatal (flags);
|
|
rpm-build |
d915bf |
if (desc &&
|
|
rpm-build |
d915bf |
!g_strcmp0 (BEFORE_ENGINE, ibus_engine_desc_get_name (desc))) {
|
|
rpm-build |
d915bf |
data.reverse = TRUE;
|
|
rpm-build |
d915bf |
} else {
|
|
rpm-build |
d915bf |
data.reverse = FALSE;
|
|
rpm-build |
d915bf |
}
|
|
rpm-build |
d915bf |
|
|
Packit |
3ff832 |
data.count = 0;
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
handler_id = g_signal_connect (bus,
|
|
Packit |
3ff832 |
"global-engine-changed",
|
|
Packit |
3ff832 |
G_CALLBACK (global_engine_changed_cb),
|
|
Packit |
3ff832 |
&data);
|
|
Packit |
3ff832 |
data.timeout_id = g_timeout_add_seconds (1, timeout_cb, &data);
|
|
Packit |
3ff832 |
data.idle_id = g_idle_add ((GSourceFunc) change_global_engine_cb, &data);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
ibus_main ();
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
g_assert_cmpint (data.count, ==, G_N_ELEMENTS (engine_names));
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
if (data.idle_id > 0)
|
|
Packit |
3ff832 |
g_source_remove (data.idle_id);
|
|
Packit |
3ff832 |
if (data.timeout_id > 0)
|
|
Packit |
3ff832 |
g_source_remove (data.timeout_id);
|
|
Packit |
3ff832 |
g_signal_handler_disconnect (bus, handler_id);
|
|
Packit |
3ff832 |
}
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
static void
|
|
Packit |
3ff832 |
test_context_engine (void)
|
|
Packit |
3ff832 |
{
|
|
Packit |
3ff832 |
IBusEngineDesc *engine_desc;
|
|
Packit |
3ff832 |
IBusInputContext *context;
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
if (ibus_bus_get_use_global_engine (bus))
|
|
Packit |
3ff832 |
return;
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
context = ibus_bus_create_input_context (bus, "test");
|
|
Packit |
3ff832 |
ibus_input_context_set_capabilities (context, IBUS_CAP_FOCUS);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
/* ibus_bus_set_global_engine() changes focused context engine. */
|
|
Packit |
3ff832 |
ibus_input_context_focus_in (context);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
change_context_engine (context);
|
|
Packit |
3ff832 |
engine_desc = ibus_input_context_get_engine (context);
|
|
Packit |
3ff832 |
g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc), ==, AFTER_ENGINE);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
g_object_unref (context);
|
|
Packit |
3ff832 |
}
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
static void
|
|
Packit |
3ff832 |
test_context_engine_set_by_global (void)
|
|
Packit |
3ff832 |
{
|
|
Packit |
3ff832 |
IBusEngineDesc *engine_desc;
|
|
Packit |
3ff832 |
IBusInputContext *context;
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
if (!ibus_bus_get_use_global_engine (bus))
|
|
Packit |
3ff832 |
return;
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
context = ibus_bus_create_input_context (bus, "test");
|
|
Packit |
3ff832 |
ibus_input_context_set_capabilities (context, IBUS_CAP_FOCUS);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
/* ibus_bus_set_global_engine() changes focused context engine. */
|
|
Packit |
3ff832 |
ibus_input_context_focus_in (context);
|
|
Packit |
3ff832 |
|
|
rpm-build |
d915bf |
change_global_engine (FALSE);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
/* ibus_input_context_set_engine() does not take effect when
|
|
Packit |
3ff832 |
global engine is used. */
|
|
Packit |
3ff832 |
ibus_input_context_set_engine (context, BEFORE_ENGINE);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
engine_desc = ibus_input_context_get_engine (context);
|
|
Packit |
3ff832 |
g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc), ==, AFTER_ENGINE);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
g_object_unref (context);
|
|
Packit |
3ff832 |
}
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
static void
|
|
Packit |
3ff832 |
test_context_engine_set_by_focus (void)
|
|
Packit |
3ff832 |
{
|
|
Packit |
3ff832 |
IBusEngineDesc *engine_desc;
|
|
Packit |
3ff832 |
IBusInputContext *context, *another_context;
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
if (!ibus_bus_get_use_global_engine (bus))
|
|
Packit |
3ff832 |
return;
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
context = ibus_bus_create_input_context (bus, "test");
|
|
Packit |
3ff832 |
ibus_input_context_set_capabilities (context, IBUS_CAP_FOCUS);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
another_context = ibus_bus_create_input_context (bus, "another");
|
|
Packit |
3ff832 |
ibus_input_context_set_capabilities (another_context, IBUS_CAP_FOCUS);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
ibus_input_context_focus_in (context);
|
|
Packit |
3ff832 |
|
|
rpm-build |
d915bf |
change_global_engine (FALSE);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
/* When focus is lost, context engine is set to "dummy". */
|
|
Packit |
3ff832 |
ibus_input_context_focus_in (another_context);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
engine_desc = ibus_input_context_get_engine (context);
|
|
Packit |
3ff832 |
g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc), ==, "dummy");
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
engine_desc = ibus_input_context_get_engine (another_context);
|
|
Packit |
3ff832 |
g_assert_cmpstr (ibus_engine_desc_get_name (engine_desc), ==, AFTER_ENGINE);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
g_object_unref (context);
|
|
Packit |
3ff832 |
g_object_unref (another_context);
|
|
Packit |
3ff832 |
}
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
gint
|
|
Packit |
3ff832 |
main (gint argc,
|
|
Packit |
3ff832 |
gchar **argv)
|
|
Packit |
3ff832 |
{
|
|
Packit |
3ff832 |
gint result;
|
|
Packit |
3ff832 |
ibus_init ();
|
|
Packit |
3ff832 |
g_test_init (&argc, &argv, NULL);
|
|
Packit |
3ff832 |
bus = ibus_bus_new ();
|
|
Packit |
3ff832 |
g_object_unref (bus);
|
|
Packit |
3ff832 |
bus = ibus_bus_new (); // crosbug.com/17293
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
ibus_bus_set_watch_ibus_signal (bus, TRUE);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
g_test_add_func ("/ibus/engine-switch/global-engine",
|
|
Packit |
3ff832 |
test_global_engine);
|
|
Packit |
3ff832 |
g_test_add_func ("/ibus/engine-switch/context-engine",
|
|
Packit |
3ff832 |
test_context_engine);
|
|
Packit |
3ff832 |
g_test_add_func ("/ibus/engine-switch/context-engine-set-by-global",
|
|
Packit |
3ff832 |
test_context_engine_set_by_global);
|
|
Packit |
3ff832 |
g_test_add_func ("/ibus/engine-switch/context-engine-set-by-focus",
|
|
Packit |
3ff832 |
test_context_engine_set_by_focus);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
result = g_test_run ();
|
|
Packit |
3ff832 |
g_object_unref (bus);
|
|
Packit |
3ff832 |
|
|
Packit |
3ff832 |
return result;
|
|
Packit |
3ff832 |
}
|