gchar * ibus_bus_current_input_context(IBusBus *bus) { g_assert (IBUS_IS_BUS (bus)); g_return_val_if_fail (ibus_bus_is_connected (bus), NULL); gchar *path = NULL; IBusMessage *reply = NULL; IBusError *error = NULL; reply = ibus_bus_call_with_reply (bus, IBUS_SERVICE_IBUS, IBUS_PATH_IBUS, IBUS_INTERFACE_IBUS, "CurrentInputContext", G_TYPE_INVALID); if (reply) { if (ibus_message_get_args (reply, &error, IBUS_TYPE_OBJECT_PATH, &path, G_TYPE_INVALID)) { path = g_strdup (path); } else { g_warning ("%s: %s", error->name, error->message); ibus_error_free (error); } ibus_message_unref (reply); } return path; }
IBusInputContext * ibus_bus_create_input_context (IBusBus *bus, const gchar *client_name) { g_assert (IBUS_IS_BUS (bus)); g_assert (client_name != NULL); g_return_val_if_fail (ibus_bus_is_connected (bus), NULL); gchar *path; DBusMessage *call = NULL; DBusMessage *reply = NULL; IBusError *error; IBusInputContext *context = NULL; IBusBusPrivate *priv; priv = IBUS_BUS_GET_PRIVATE (bus); call = ibus_message_new_method_call (IBUS_SERVICE_IBUS, IBUS_PATH_IBUS, IBUS_INTERFACE_IBUS, "CreateInputContext"); ibus_message_append_args (call, G_TYPE_STRING, &client_name, G_TYPE_INVALID); reply = ibus_connection_send_with_reply_and_block (priv->connection, call, -1, &error); ibus_message_unref (call); if (reply == NULL) { g_warning ("%s: %s", error->name, error->message); ibus_error_free (error); return NULL; } if ((error = ibus_error_new_from_message (reply)) != NULL) { g_warning ("%s: %s", error->name, error->message); ibus_message_unref (reply); ibus_error_free (error); return NULL; } if (!ibus_message_get_args (reply, &error, IBUS_TYPE_OBJECT_PATH, &path, G_TYPE_INVALID)) { g_warning ("%s: %s", error->name, error->message); ibus_message_unref (reply); ibus_error_free (error); return NULL; } context = ibus_input_context_new (path, priv->connection); ibus_message_unref (reply); return context; }
static void rime_with_ibus() { ibus_init(); IBusBus *bus = ibus_bus_new(); g_object_ref_sink(bus); if (!ibus_bus_is_connected(bus)) { g_warning("not connected to ibus"); exit(0); } g_signal_connect(bus, "disconnected", G_CALLBACK(ibus_disconnect_cb), NULL); IBusConfig *config = ibus_bus_get_config(bus); if (!config) { g_warning("ibus config not accessible"); } else { g_object_ref_sink(config); ibus_rime_load_settings(config); g_signal_connect(config, "value-changed", G_CALLBACK(ibus_rime_config_value_changed_cb), NULL); } IBusFactory *factory = ibus_factory_new(ibus_bus_get_connection(bus)); g_object_ref_sink(factory); ibus_factory_add_engine(factory, "rime", IBUS_TYPE_RIME_ENGINE); if (!ibus_bus_request_name(bus, "com.googlecode.rimeime.Rime", 0)) { g_error("error requesting bus name"); exit(1); } if (!notify_init("ibus-rime")) { g_error("notify_init failed"); exit(1); } RimeSetupLogging("rime.ibus"); gboolean full_check = FALSE; ibus_rime_start(full_check); ibus_main(); RimeFinalize(); notify_uninit(); if (config) { g_object_unref(config); } g_object_unref(factory); g_object_unref(bus); }
static void ibus_memconf_start (void) { ibus_init (); bus = ibus_bus_new (); if (!ibus_bus_is_connected (bus)) { exit (-1); } g_signal_connect (bus, "disconnected", G_CALLBACK (ibus_disconnected_cb), NULL); config = ibus_config_memconf_new (ibus_bus_get_connection (bus)); ibus_bus_request_name (bus, IBUS_SERVICE_CONFIG, 0); ibus_main (); }
static void ibus_bus_unwatch_dbus_signal (IBusBus *bus) { g_assert (IBUS_IS_BUS (bus)); g_assert (ibus_bus_is_connected (bus)); const gchar *rule; rule = "type='signal'," \ "path='" DBUS_PATH_DBUS "'," \ "interface='" DBUS_INTERFACE_DBUS "'"; ibus_bus_remove_match (bus, rule); }
static void _changed_cb (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event_type, IBusBus *bus) { // g_debug ("changed %x", event_type); if (ibus_bus_is_connected (bus)) return; if (event_type == G_FILE_MONITOR_EVENT_CHANGED) { ibus_bus_connect (bus); } }
IBusMessage * ibus_bus_call_with_reply_valist (IBusBus *bus, const gchar *name, const gchar *path, const gchar *interface, const gchar *member, GType first_arg_type, va_list va_args) { g_assert (IBUS_IS_BUS (bus)); g_assert (name != NULL); g_assert (path != NULL); g_assert (interface != NULL); g_assert (member); IBusMessage *message, *reply; IBusError *error; IBusBusPrivate *priv; g_return_val_if_fail (ibus_bus_is_connected (bus), FALSE); priv = IBUS_BUS_GET_PRIVATE (bus); message = ibus_message_new_method_call (name, path, interface, member); ibus_message_append_args_valist (message, first_arg_type, va_args); reply = ibus_connection_send_with_reply_and_block ( priv->connection, message, -1, &error); ibus_message_unref (message); if (reply == NULL) { g_warning ("%s : %s", error->name, error->message); ibus_error_free (error); return NULL; } if ((error = ibus_error_new_from_message (reply)) != NULL) { g_warning ("%s : %s", error->name, error->message); ibus_error_free (error); ibus_message_unref (reply); return NULL; } return reply; }
static void init () { ibus_init (); bus = ibus_bus_new (); g_object_ref_sink(bus); if (!ibus_bus_is_connected (bus)) { g_warning("Can not connect to ibus"); exit (0); } g_signal_connect (bus, "disconnected", G_CALLBACK (ibus_disconnected_cb), NULL); IBusConfig* config = ibus_bus_get_config(bus); g_object_ref_sink(config); SunPinyinConfig::set_config(config); component = ibus_component_new ("org.freedesktop.IBus.SunPinyin", "SunPinyin2", "0.1.0", "LGPL/CDDL", "Kov Chai <*****@*****.**>", "http://code.google.com/p/sunpinyin/", "", "ibus-sunpinyin"); ibus_component_add_engine (component, ibus_engine_desc_new ("sunpinyin", "SunPinyin", _("Simplified Chinese Input Method developed by SUN"), "zh_CN", "LGPL/CDDL", "Kov Chai <*****@*****.**>", IBUS_SUNPINYIN_ICON_DIR"/sunpinyin-logo.png", "en")); factory = ibus_factory_new (ibus_bus_get_connection (bus)); ibus_factory_add_engine (factory, "sunpinyin", IBUS_TYPE_SUNPINYIN_ENGINE); if (by_ibus) { ibus_bus_request_name (bus, "org.freedesktop.IBus.SunPinyin", 0); } else { ibus_bus_register_component (bus, component); } ibus_main (); }
static void _init_ibus (void) { if (_bus != NULL) return; ibus_init (); _bus = ibus_bus_new (); if (!ibus_bus_is_connected (_bus)) { g_error ("Can not connect to ibus-daemon!"); } g_signal_connect (_bus, "disconnected", G_CALLBACK (_bus_disconnected_cb), NULL); }
static void _changed_cb (GFileMonitor *monitor, GFile *file, GFile *other_file, GFileMonitorEvent event_type, IBusBus *bus) { if (event_type != G_FILE_MONITOR_EVENT_CHANGED && event_type != G_FILE_MONITOR_EVENT_CREATED && event_type != G_FILE_MONITOR_EVENT_DELETED) return; if (ibus_bus_is_connected (bus)) return; ibus_bus_connect (bus); }
IBusConfig * ibus_bus_get_config (IBusBus *bus) { g_assert (IBUS_IS_BUS (bus)); g_return_val_if_fail (ibus_bus_is_connected (bus), NULL); IBusBusPrivate *priv; priv = IBUS_BUS_GET_PRIVATE (bus); if (priv->config == NULL && priv->connection) { priv->config = ibus_config_new (priv->connection); if (priv->config) { g_signal_connect (priv->config, "destroy", G_CALLBACK (_config_destroy_cb), bus); } } return priv->config; }
App::App(int argc, char** argv): QGuiApplication(argc, argv) ,m_eventFilter(new XcbEventFilter) ,m_init(false) ,m_bus(0) ,m_impanel(0) ,m_keyboardGrabbed(false) ,m_doGrab(false) ,m_syms(0) { m_syms = xcb_key_symbols_alloc(QX11Info::connection()); installNativeEventFilter(m_eventFilter.data()); ibus_init (); m_bus = ibus_bus_new (); g_signal_connect (m_bus, "connected", G_CALLBACK (ibus_connected_cb), this); g_signal_connect (m_bus, "disconnected", G_CALLBACK (ibus_disconnected_cb), this); if (ibus_bus_is_connected (m_bus)) { init(); } initIconMap(m_iconMap); }
void ibus_bus_set_watch_dbus_signal (IBusBus *bus, gboolean watch) { g_assert (IBUS_IS_BUS (bus)); IBusBusPrivate *priv; priv = IBUS_BUS_GET_PRIVATE (bus); if (priv->watch_dbus_signal == watch) return; priv->watch_dbus_signal = watch; if (ibus_bus_is_connected (bus)) { if (watch) { ibus_bus_watch_dbus_signal (bus); } else { ibus_bus_unwatch_dbus_signal (bus); } } }
static void bus_test_client_init (BusTestClient *client) { IDEBUG ("%s", __FUNCTION__); gchar *active_engine_name; client->connected = FALSE; client->enabled = FALSE; g_return_if_fail (ibus_bus_is_connected (_bus)); client->connected = TRUE; client->ibuscontext = ibus_bus_create_input_context (_bus, "test-client"); g_return_if_fail (client->ibuscontext != NULL); g_object_ref_sink (client->ibuscontext); g_signal_connect (client->ibuscontext, "disabled", G_CALLBACK (_bus_disabled_cb), client); bus_test_client_clear_modifier (client); client->caps = IBUS_CAP_FOCUS; ibus_input_context_set_capabilities (client->ibuscontext, client->caps); active_engine_name = _get_active_engine_name (); g_return_if_fail (active_engine_name != NULL); IDEBUG ("engine:%s", active_engine_name); ibus_input_context_focus_in (client->ibuscontext); ibus_input_context_set_engine (client->ibuscontext, active_engine_name); g_free (active_engine_name); ibus_input_context_enable (client->ibuscontext); client->enabled = TRUE; }
void setup_input_tabs (GtkBuilder *builder, GisKeyboardPage *page) { GtkWidget *treeview; GtkTreeViewColumn *column; GtkCellRenderer *cell; GtkListStore *store; GtkTreeSelection *selection; /* set up the list of active inputs */ treeview = WID("active_input_sources"); column = gtk_tree_view_column_new (); cell = gtk_cell_renderer_text_new (); gtk_tree_view_column_pack_start (column, cell, TRUE); gtk_tree_view_column_add_attribute (column, cell, "text", NAME_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_DESKTOP_APP_INFO); gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store)); input_sources_settings = g_settings_new (GNOME_DESKTOP_INPUT_SOURCES_DIR); g_settings_delay (input_sources_settings); g_object_weak_ref (G_OBJECT (builder), (GWeakNotify) g_object_unref, input_sources_settings); if (!xkb_info) xkb_info = gnome_xkb_info_new (); #ifdef HAVE_IBUS ibus_init (); if (!ibus) { ibus = ibus_bus_new_async (); if (ibus_bus_is_connected (ibus)) fetch_ibus_engines (builder); else g_signal_connect_swapped (ibus, "connected", G_CALLBACK (fetch_ibus_engines), builder); g_object_weak_ref (G_OBJECT (builder), (GWeakNotify) clear_ibus, NULL); } maybe_start_ibus (); #endif populate_with_active_sources (store); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); g_signal_connect_swapped (selection, "changed", G_CALLBACK (update_button_sensitivity), builder); /* set up the buttons */ g_signal_connect (WID("input_source_add"), "clicked", G_CALLBACK (add_input), builder); g_signal_connect (WID("input_source_remove"), "clicked", G_CALLBACK (remove_selected_input), builder); g_signal_connect (WID("input_source_move_up"), "clicked", G_CALLBACK (move_selected_input_up), builder); g_signal_connect (WID("input_source_move_down"), "clicked", G_CALLBACK (move_selected_input_down), builder); g_signal_connect (WID("input_source_show"), "clicked", G_CALLBACK (show_selected_layout), builder); g_signal_connect (WID("input_source_settings"), "clicked", G_CALLBACK (show_selected_settings), builder); /* use an em dash is no shortcut */ update_shortcuts (builder); /* g_signal_connect (WID("jump-to-shortcuts"), "activate-link", G_CALLBACK (go_to_shortcuts), page);*/ g_signal_connect (G_OBJECT (input_sources_settings), "changed::" KEY_INPUT_SOURCES, G_CALLBACK (input_sources_changed), builder); }
static void ibus_impanel_start (void) { ibus_init (); bus = ibus_bus_new (); if (!ibus_bus_is_connected (bus)) { exit (-1); } g_signal_connect (bus, "disconnected", G_CALLBACK (ibus_disconnected_cb), NULL); impanel = ibus_panel_impanel_new (ibus_bus_get_connection (bus)); ibus_bus_request_name (bus, IBUS_SERVICE_PANEL, 0); ibus_panel_impanel_set_bus(impanel, bus); #if !IBUS_CHECK_VERSION(1,4,99) ibus_main (); #else Display* dpy = XOpenDisplay(0); Window root = DefaultRootWindow(dpy); XEvent ev; unsigned int modifiers = ControlMask; int keycode = XKeysymToKeycode(dpy, XK_space); XGrabKey(dpy, keycode, modifiers, root, False, GrabModeAsync, GrabModeAsync); XGrabKey(dpy, keycode, modifiers | LockMask, root, False, GrabModeAsync, GrabModeAsync); // capslock XGrabKey(dpy, keycode, modifiers | Mod2Mask, root, False, GrabModeAsync, GrabModeAsync); // numlock XGrabKey(dpy, keycode, modifiers | LockMask | Mod2Mask, root, False, GrabModeAsync, GrabModeAsync); XSelectInput(dpy, root, KeyPressMask); // XCloseDisplay(dpy); main_loop = g_main_loop_new(NULL, FALSE); int dpyfd = ConnectionNumber(dpy); GPollFD dpy_pollfd = {dpyfd, G_IO_IN | G_IO_HUP | G_IO_ERR, 0}; GSourceFuncs x11_source_funcs = { x11_fd_prepare, x11_fd_check, x11_fd_dispatch, NULL, /* finalize */ NULL, /* closure_callback */ NULL /* closure_marshal */ }; GSource *x11_source = g_source_new(&x11_source_funcs, sizeof(x11_source_t)); ((x11_source_t*)x11_source)->dpy = dpy; g_source_add_poll(x11_source, &dpy_pollfd); g_source_set_can_recurse(x11_source, TRUE); g_source_attach(x11_source, NULL); g_main_loop_run (main_loop); g_main_loop_unref (main_loop); main_loop = NULL; XUngrabKey(dpy, keycode, modifiers, root); XUngrabKey(dpy, keycode, modifiers | LockMask, root); XUngrabKey(dpy, keycode, modifiers | Mod2Mask, root); XUngrabKey(dpy, keycode, modifiers | LockMask | Mod2Mask, root); XCloseDisplay(dpy); #endif }
static void _xim_init_IMdkit () { #if 0 XIMStyle ims_styles_overspot [] = { XIMPreeditPosition | XIMStatusNothing, XIMPreeditNothing | XIMStatusNothing, XIMPreeditPosition | XIMStatusCallbacks, XIMPreeditNothing | XIMStatusCallbacks, 0 }; #endif XIMStyle ims_styles_onspot [] = { XIMPreeditPosition | XIMStatusNothing, XIMPreeditCallbacks | XIMStatusNothing, XIMPreeditNothing | XIMStatusNothing, XIMPreeditPosition | XIMStatusCallbacks, XIMPreeditCallbacks | XIMStatusCallbacks, XIMPreeditNothing | XIMStatusCallbacks, 0 }; XIMEncoding ims_encodings[] = { "COMPOUND_TEXT", 0 }; GdkWindowAttr window_attr = { .title = "ibus-xim", .event_mask = GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK, .wclass = GDK_INPUT_OUTPUT, .window_type = GDK_WINDOW_TOPLEVEL, .override_redirect = 1, }; XIMStyles styles; XIMEncodings encodings; GdkWindow *win; win = gdk_window_new (NULL, &window_attr, GDK_WA_TITLE); styles.count_styles = sizeof (ims_styles_onspot)/sizeof (XIMStyle) - 1; styles.supported_styles = ims_styles_onspot; encodings.count_encodings = sizeof (ims_encodings)/sizeof (XIMEncoding) - 1; encodings.supported_encodings = ims_encodings; _xims = IMOpenIM(GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), IMModifiers, "Xi18n", IMServerWindow, GDK_WINDOW_XWINDOW(win), IMServerName, _server_name != NULL ? _server_name : "ibus", IMLocale, _locale != NULL ? _locale : LOCALES_STRING, IMServerTransport, "X/", IMInputStyles, &styles, IMEncodingList, &encodings, IMProtocolHandler, ims_protocol_handler, IMFilterEventMask, KeyPressMask | KeyReleaseMask, NULL); _init_ibus (); if (!ibus_bus_is_connected (_bus)) { g_warning ("Can not connect to ibus daemon"); exit (EXIT_FAILURE); } } static void _atexit_cb () { if (_bus && ibus_bus_is_connected (_bus)) { ibus_bus_exit(_bus, False); } } static void _sighandler (int sig) { exit(EXIT_FAILURE); }
gint main (gint argc, gchar **argv) { GOptionContext *context; BusServer *server; IBusBus *bus; GError *error = NULL; setlocale (LC_ALL, ""); context = g_option_context_new ("- ibus daemon"); g_option_context_add_main_entries (context, entries, "ibus-daemon"); g_argv = g_strdupv (argv); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_printerr ("Option parsing failed: %s\n", error->message); exit (-1); } if (g_mempro) { g_mem_set_vtable (glib_mem_profiler_table); signal (SIGUSR2, _sig_usr2_handler); } /* check uid */ { const gchar *username = ibus_get_user_name (); uid_t uid = getuid (); struct passwd *pwd = getpwuid (uid); if (pwd == NULL || g_strcmp0 (pwd->pw_name, username) != 0) { g_printerr ("Please run ibus-daemon with login user! Do not run ibus-daemon with sudo or su.\n"); exit (-1); } } /* daemonize process */ if (daemonize) { if (daemon (1, 0) != 0) { g_printerr ("Can not daemonize ibus.\n"); exit (-1); } } /* create a new process group */ setpgrp (); g_type_init (); g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING | G_LOG_LEVEL_DEBUG | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION, _my_log_handler, NULL); /* check if ibus-daemon is running in this session */ if (ibus_get_address () != NULL) { bus = ibus_bus_new (); if (ibus_bus_is_connected (bus)) { if (!replace) { g_printerr ("current session already has an ibus-daemon.\n"); exit (-1); } ibus_bus_exit (bus, FALSE); while (ibus_bus_is_connected (bus)) { g_main_context_iteration (NULL, TRUE); } } g_object_unref (bus); bus = NULL; } /* create ibus server */ server = bus_server_get_default (); bus_server_listen (server); if (!single) { /* execute config component */ if (g_strcmp0 (config, "default") == 0) { IBusComponent *component; component = bus_registry_lookup_component_by_name (BUS_DEFAULT_REGISTRY, IBUS_SERVICE_CONFIG); if (component == NULL || !ibus_component_start (component, g_verbose)) { g_printerr ("Can not execute default config program\n"); exit (-1); } } else if (g_strcmp0 (config, "disable") != 0 && g_strcmp0 (config, "") != 0) { if (!execute_cmdline (config)) exit (-1); } /* execut panel component */ if (g_strcmp0 (panel, "default") == 0) { IBusComponent *component; component = bus_registry_lookup_component_by_name (BUS_DEFAULT_REGISTRY, IBUS_SERVICE_PANEL); if (component == NULL || !ibus_component_start (component, g_verbose)) { g_printerr ("Can not execute default panel program\n"); exit (-1); } } else if (g_strcmp0 (panel, "disable") != 0 && g_strcmp0 (panel, "") != 0) { if (!execute_cmdline (panel)) exit (-1); } } /* execute ibus xim server */ if (xim) { if (!execute_cmdline (LIBEXECDIR"/ibus-x11 --kill-daemon")) exit (-1); } bus_server_run (server); return 0; }
static gboolean ibus_bus_call (IBusBus *bus, const gchar *name, const gchar *path, const gchar *interface, const gchar *member, GType first_arg_type, ...) { g_assert (IBUS_IS_BUS (bus)); g_assert (name != NULL); g_assert (path != NULL); g_assert (interface != NULL); g_assert (member); IBusMessage *message, *reply; IBusError *error; va_list args; GType type; gboolean retval; IBusBusPrivate *priv; g_return_val_if_fail (ibus_bus_is_connected (bus), FALSE); priv = IBUS_BUS_GET_PRIVATE (bus); message = ibus_message_new_method_call (name, path, interface, member); va_start (args, first_arg_type); ibus_message_append_args_valist (message, first_arg_type, args); va_end (args); reply = ibus_connection_send_with_reply_and_block ( priv->connection, message, -1, &error); ibus_message_unref (message); if (reply == NULL) { g_warning ("%s : %s", error->name, error->message); ibus_error_free (error); return FALSE; } if ((error = ibus_error_new_from_message (reply)) != NULL) { g_warning ("%s : %s", error->name, error->message); ibus_error_free (error); ibus_message_unref (reply); return FALSE; } va_start (args, first_arg_type); type = first_arg_type; while (type != G_TYPE_INVALID) { va_arg (args, gpointer); type = va_arg (args, GType); } type = va_arg (args, GType); if (type != G_TYPE_INVALID) { retval = ibus_message_get_args_valist (reply, &error, type, args); } else { retval = TRUE; } va_end (args); ibus_message_unref (reply); if (!retval) { g_warning ("%s: %s", error->name, error->message); ibus_error_free (error); return FALSE; } return TRUE; }
gint main (gint argc, gchar **argv) { setlocale (LC_ALL, ""); GOptionContext *context = g_option_context_new ("- ibus daemon"); g_option_context_add_main_entries (context, entries, "ibus-daemon"); g_argv = g_strdupv (argv); GError *error = NULL; if (!g_option_context_parse (context, &argc, &argv, &error)) { g_printerr ("Option parsing failed: %s\n", error->message); g_error_free (error); exit (-1); } if (g_gdbus_timeout < -1) { g_printerr ("Bad timeout (must be >= -1): %d\n", g_gdbus_timeout); exit (-1); } if (g_mempro) { g_mem_set_vtable (glib_mem_profiler_table); signal (SIGUSR2, _sig_usr2_handler); } /* check uid */ { const gchar *username = ibus_get_user_name (); uid_t uid = getuid (); struct passwd *pwd = getpwuid (uid); if (pwd == NULL || g_strcmp0 (pwd->pw_name, username) != 0) { g_printerr ("Please run ibus-daemon with login user! Do not run ibus-daemon with sudo or su.\n"); exit (-1); } } /* daemonize process */ if (daemonize) { if (daemon (1, 0) != 0) { g_printerr ("Can not daemonize ibus.\n"); exit (-1); } } /* create a new process group. this is important to kill all of its children by SIGTERM at a time in bus_ibus_impl_destroy. */ setpgid (0, 0); ibus_init (); ibus_set_log_handler (g_verbose); /* check if ibus-daemon is running in this session */ if (ibus_get_address () != NULL) { IBusBus *bus = ibus_bus_new (); if (ibus_bus_is_connected (bus)) { if (!replace) { g_printerr ("current session already has an ibus-daemon.\n"); exit (-1); } ibus_bus_exit (bus, FALSE); while (ibus_bus_is_connected (bus)) { g_main_context_iteration (NULL, TRUE); } } g_object_unref (bus); } bus_server_init (); if (!single) { /* execute config component */ if (g_strcmp0 (config, "default") == 0) { BusComponent *component; component = bus_ibus_impl_lookup_component_by_name ( BUS_DEFAULT_IBUS, IBUS_SERVICE_CONFIG); if (component) { bus_component_set_restart (component, restart); } if (component == NULL || !bus_component_start (component, g_verbose)) { g_printerr ("Can not execute default config program\n"); exit (-1); } } else if (g_strcmp0 (config, "disable") != 0 && g_strcmp0 (config, "") != 0) { if (!execute_cmdline (config)) exit (-1); } /* execute panel component */ if (g_strcmp0 (panel, "default") == 0) { BusComponent *component; component = bus_ibus_impl_lookup_component_by_name ( BUS_DEFAULT_IBUS, IBUS_SERVICE_PANEL); if (component) { bus_component_set_restart (component, restart); } if (component == NULL || !bus_component_start (component, g_verbose)) { g_printerr ("Can not execute default panel program\n"); exit (-1); } } else if (g_strcmp0 (panel, "disable") != 0 && g_strcmp0 (panel, "") != 0) { if (!execute_cmdline (panel)) exit (-1); } } /* execute ibus xim server */ if (xim) { if (!execute_cmdline (LIBEXECDIR "/ibus-x11 --kill-daemon")) exit (-1); } bus_server_run (); return 0; }
static void start_component(void) { IBUS_CHEWING_LOG(INFO, "start_component"); ibus_init(); bus = ibus_bus_new(); g_signal_connect(bus, "disconnected", G_CALLBACK(ibus_disconnected_cb), NULL); if (! ibus_bus_is_connected (bus)){ IBUS_CHEWING_LOG(ERROR, _("Can not connect to IBus!")); exit(2); } IBusComponent *component = NULL; if (xml) { component = ibus_component_new_from_file(QUOTE_ME(DATA_DIR) "/ibus/component/chewing.xml"); } else { component = ibus_component_new(QUOTE_ME(PROJECT_SCHEMA_ID), _("Chewing component"), QUOTE_ME(PRJ_VER), "GPLv2+", _("Peng Huang, Ding-Yi Chen"), "http://code.google.com/p/ibus", QUOTE_ME(LIBEXEC_DIR) "/ibus-engine-chewing --ibus", QUOTE_ME(PROJECT_NAME)); } IBusEngineDesc *engineDesc = ibus_engine_desc_new_varargs("name", "chewing", "longname", _("Chewing"), "description", _("Chinese chewing input method"), "language", "zh_TW", "license", "GPLv2+", "author", _("Peng Huang, Ding-Yi Chen"), "icon", QUOTE_ME(PRJ_DATA_DIR) "/icons/" QUOTE_ME(PROJECT_NAME) ".png", "layout", "us", "setup", QUOTE_ME(LIBEXEC_DIR) "/ibus-setup-chewing", "version", QUOTE_ME(PRJ_VER), "textdomain", QUOTE_ME(PROJECT_NAME), NULL); ibus_component_add_engine(component, engineDesc); factory = ibus_factory_new(ibus_bus_get_connection(bus)); ibus_factory_add_engine(factory, "chewing", IBUS_TYPE_CHEWING_ENGINE); if (ibus) { guint32 ret=ibus_bus_request_name(bus, QUOTE_ME(PROJECT_SCHEMA_ID), 0); IBUS_CHEWING_LOG(INFO, "start_component: request_name: %u",ret); } else { ibus_bus_register_component(bus, component); } ibus_main(); }