static gboolean x11_fd_dispatch(GSource* source, GSourceFunc callback, gpointer user_data) { Display *dpy = ((x11_source_t*)source)->dpy; XEvent e; while (XPending(dpy)) { XNextEvent(dpy, &e); if (e.type == KeyPress) { // g_print("KeyPress!!!\n"); static const gchar *names[64] = {0}; names[0] = "xkb:us::eng"; static int inited = 0; if (!inited) { IBusConfig *config = ibus_bus_get_config (bus); GVariant *engines = ibus_config_get_value (config, "general", "preload-engines"); if (!engines) continue; int i = 1; GVariantIter iter; GVariant *child; g_variant_iter_init (&iter, engines); while ((child = g_variant_iter_next_value (&iter)) != NULL) { const gchar *engine_name = g_variant_get_string (child, NULL); // g_print("engine_name %s\n", engine_name); names[i] = engine_name; i++; g_variant_unref (child); } inited = 1; } static int n = 0; n = n==0? 1 : 0; ibus_bus_set_global_engine(bus, names[n]); } } return TRUE; }
gboolean change_global_engine_cb (IBusBus *bus) { if (!current_engine) current_engine = engines; else current_engine = g_list_next (current_engine); if (!current_engine) { ibus_quit(); return FALSE; } IBusEngineDesc *engine_desc = IBUS_ENGINE_DESC (current_engine->data); ibus_bus_set_global_engine (bus, ibus_engine_desc_get_name (engine_desc)); return TRUE; }