Blame tools/main.vala

Packit Service 1d8f1c
/* vim:set et sts=4 sw=4:
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * ibus - The Input Bus
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * Copyright(c) 2013 Peng Huang <shawn.p.huang@gmail.com>
Packit Service 1d8f1c
 * Copyright(c) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * This library is free software; you can redistribute it and/or
Packit Service 1d8f1c
 * modify it under the terms of the GNU Lesser General Public
Packit Service 1d8f1c
 * License as published by the Free Software Foundation; either
Packit Service 1d8f1c
 * version 2.1 of the License, or (at your option) any later version.
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * This library is distributed in the hope that it will be useful,
Packit Service 1d8f1c
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 1d8f1c
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 1d8f1c
 * Lesser General Public License for more details.
Packit Service 1d8f1c
 *
Packit Service 1d8f1c
 * You should have received a copy of the GNU Lesser General Public
Packit Service 1d8f1c
 * License along with this library; if not, write to the Free Software
Packit Service 1d8f1c
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
Packit Service 1d8f1c
 * USA
Packit Service 1d8f1c
 */
Packit Service 1d8f1c
Packit Service 1d8f1c
private const string IBUS_SCHEMAS_GENERAL = "org.freedesktop.ibus.general";
Packit Service 1d8f1c
private const string IBUS_SCHEMAS_GENERAL_HOTKEY =
Packit Service 1d8f1c
        "org.freedesktop.ibus.general.hotkey";
Packit Service 1d8f1c
private const string IBUS_SCHEMAS_PANEL = "org.freedesktop.ibus.panel";
Packit Service 1d8f1c
private const string IBUS_SCHEMAS_PANEL_EMOJI =
Packit Service 1d8f1c
        "org.freedesktop.ibus.panel.emoji";
Packit Service 1d8f1c
Packit Service 1d8f1c
bool name_only = false;
Packit Service 1d8f1c
/* system() exists as a public API. */
Packit Service 1d8f1c
bool is_system = false;
Packit Service 1d8f1c
string cache_file = null;
Packit Service 1d8f1c
string engine_id = null;
Packit Service 1d8f1c
Packit Service 1d8f1c
class EngineList {
Packit Service 1d8f1c
    public IBus.EngineDesc[] data = {};
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
IBus.Bus? get_bus() {
Packit Service 1d8f1c
    var bus = new IBus.Bus();
Packit Service 1d8f1c
    if (!bus.is_connected ())
Packit Service 1d8f1c
        return null;
Packit Service 1d8f1c
    return bus;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
int list_engine(string[] argv) {
Packit Service 1d8f1c
    const OptionEntry[] options = {
Packit Service 1d8f1c
        { "name-only", 0, 0, OptionArg.NONE, out name_only,
Packit Service 1d8f1c
          N_("List engine name only"), null },
Packit Service 1d8f1c
        { null }
Packit Service 1d8f1c
    };
Packit Service 1d8f1c
Packit Service 1d8f1c
    var option = new OptionContext();
Packit Service 1d8f1c
    option.add_main_entries(options, Config.GETTEXT_PACKAGE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    try {
Packit Service 1d8f1c
        option.parse(ref argv);
Packit Service 1d8f1c
    } catch (OptionError e) {
Packit Service 1d8f1c
        stderr.printf("%s\n", e.message);
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    var bus = get_bus();
Packit Service 1d8f1c
    if (bus == null) {
Packit Service 1d8f1c
        stderr.printf(_("Can't connect to IBus.\n"));
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    var engines = bus.list_engines();
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (name_only) {
Packit Service 1d8f1c
        foreach (var engine in engines) {
Packit Service 1d8f1c
            print("%s\n", engine.get_name());
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    var map = new HashTable<string, EngineList>(GLib.str_hash, GLib.str_equal);
Packit Service 1d8f1c
Packit Service 1d8f1c
    foreach (var engine in engines) {
Packit Service 1d8f1c
        var list = map.get(engine.get_language());
Packit Service 1d8f1c
        if (list == null) {
Packit Service 1d8f1c
            list = new EngineList();
Packit Service 1d8f1c
            map.insert(engine.get_language(), list);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        list.data += engine;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    foreach (var language in map.get_keys()) {
Packit Service 1d8f1c
        var list = map.get(language);
Packit Service 1d8f1c
        print(_("language: %s\n"), IBus.get_language_name(language));
Packit Service 1d8f1c
        foreach (var engine in list.data) {
Packit Service 1d8f1c
            print("  %s - %s\n", engine.get_name(), engine.get_longname());
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
private int exec_setxkbmap(IBus.EngineDesc engine) {
Packit Service 1d8f1c
    string layout = engine.get_layout();
Packit Service 1d8f1c
    string variant = engine.get_layout_variant();
Packit Service 1d8f1c
    string option = engine.get_layout_option();
Packit Service 1d8f1c
    string standard_error = null;
Packit Service 1d8f1c
    int exit_status = 0;
Packit Service 1d8f1c
    string[] args = { "setxkbmap" };
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (layout != null && layout != "" && layout != "default") {
Packit Service 1d8f1c
        args += "-layout";
Packit Service 1d8f1c
        args += layout;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    if (variant != null && variant != "" && variant != "default") {
Packit Service 1d8f1c
        args += "-variant";
Packit Service 1d8f1c
        args += variant;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    if (option != null && option != "" && option != "default") {
Packit Service 1d8f1c
        /*TODO: Need to get the session XKB options */
Packit Service 1d8f1c
        args += "-option";
Packit Service 1d8f1c
        args += "-option";
Packit Service 1d8f1c
        args += option;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (args.length == 1) {
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    try {
Packit Service 1d8f1c
        if (!GLib.Process.spawn_sync(null, args, null,
Packit Service 1d8f1c
                                     GLib.SpawnFlags.SEARCH_PATH,
Packit Service 1d8f1c
                                     null, null,
Packit Service 1d8f1c
                                     out standard_error,
Packit Service 1d8f1c
                                     out exit_status)) {
Packit Service 1d8f1c
            warning("Switch xkb layout to %s failed.",
Packit Service 1d8f1c
                    engine.get_layout());
Packit Service 1d8f1c
            return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    } catch (GLib.SpawnError e) {
Packit Service 1d8f1c
        warning("Execute setxkbmap failed: %s", e.message);
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (exit_status != 0) {
Packit Service 1d8f1c
        warning("Execute setxkbmap failed: %s", standard_error ?? "(null)");
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
int get_set_engine(string[] argv) {
Packit Service 1d8f1c
    var bus = get_bus();
Packit Service 1d8f1c
    string engine = null;
Packit Service 1d8f1c
    if (argv.length > 1)
Packit Service 1d8f1c
        engine = argv[1];
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (engine == null) {
Packit Service 1d8f1c
        var desc = bus.get_global_engine();
Packit Service 1d8f1c
        if (desc == null) {
Packit Service 1d8f1c
            stderr.printf(_("No engine is set.\n"));
Packit Service 1d8f1c
            return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        print("%s\n", desc.get_name());
Packit Service 1d8f1c
        return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    if(!bus.set_global_engine(engine)) {
Packit Service 1d8f1c
        stderr.printf(_("Set global engine failed.\n"));
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    var desc = bus.get_global_engine();
Packit Service 1d8f1c
    if (desc == null) {
Packit Service 1d8f1c
        stderr.printf(_("Get global engine failed.\n"));
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    var settings = new GLib.Settings(IBUS_SCHEMAS_GENERAL);
Packit Service 1d8f1c
    if (!settings.get_boolean("use-system-keyboard-layout"))
Packit Service 1d8f1c
        return exec_setxkbmap(desc);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
int message_watch(string[] argv) {
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
int restart_daemon(string[] argv) {
Packit Service 1d8f1c
    var bus = get_bus();
Packit Service 1d8f1c
    if (bus == null) {
Packit Service 1d8f1c
        stderr.printf(_("Can't connect to IBus.\n"));
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    bus.exit(true);
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
int exit_daemon(string[] argv) {
Packit Service 1d8f1c
    var bus = get_bus();
Packit Service 1d8f1c
    if (bus == null) {
Packit Service 1d8f1c
        stderr.printf(_("Can't connect to IBus.\n"));
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    bus.exit(false);
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
int print_version(string[] argv) {
Packit Service 1d8f1c
    print("IBus %s\n", Config.PACKAGE_VERSION);
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
int read_cache (string[] argv) {
Packit Service 1d8f1c
    const OptionEntry[] options = {
Packit Service 1d8f1c
        { "system", 0, 0, OptionArg.NONE, out is_system,
Packit Service 1d8f1c
          N_("Read the system registry cache."), null },
Packit Service 1d8f1c
        { "file", 0, 0, OptionArg.STRING, out cache_file,
Packit Service 1d8f1c
          N_("Read the registry cache FILE."), "FILE" },
Packit Service 1d8f1c
        { null }
Packit Service 1d8f1c
    };
Packit Service 1d8f1c
Packit Service 1d8f1c
    var option = new OptionContext();
Packit Service 1d8f1c
    option.add_main_entries(options, Config.GETTEXT_PACKAGE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    try {
Packit Service 1d8f1c
        option.parse(ref argv);
Packit Service 1d8f1c
    } catch (OptionError e) {
Packit Service 1d8f1c
        stderr.printf("%s\n", e.message);
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    var registry = new IBus.Registry();
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (cache_file != null) {
Packit Service 1d8f1c
        if (!registry.load_cache_file(cache_file)) {
Packit Service 1d8f1c
            stderr.printf(_("The registry cache is invalid.\n"));
Packit Service 1d8f1c
            return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    } else {
Packit Service 1d8f1c
        if (!registry.load_cache(!is_system)) {
Packit Service 1d8f1c
            stderr.printf(_("The registry cache is invalid.\n"));
Packit Service 1d8f1c
            return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    var output = new GLib.StringBuilder();
Packit Service 1d8f1c
    registry.output(output, 1);
Packit Service 1d8f1c
Packit Service 1d8f1c
    print ("%s\n", output.str);
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
int write_cache (string[] argv) {
Packit Service 1d8f1c
    const OptionEntry[] options = {
Packit Service 1d8f1c
        { "system", 0, 0, OptionArg.NONE, out is_system,
Packit Service 1d8f1c
          N_("Write the system registry cache."), null },
Packit Service 1d8f1c
        { "file", 0, 0, OptionArg.STRING, out cache_file,
Packit Service 1d8f1c
          N_("Write the registry cache FILE."),
Packit Service 1d8f1c
          "FILE" },
Packit Service 1d8f1c
        { null }
Packit Service 1d8f1c
    };
Packit Service 1d8f1c
Packit Service 1d8f1c
    var option = new OptionContext();
Packit Service 1d8f1c
    option.add_main_entries(options, Config.GETTEXT_PACKAGE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    try {
Packit Service 1d8f1c
        option.parse(ref argv);
Packit Service 1d8f1c
    } catch (OptionError e) {
Packit Service 1d8f1c
        stderr.printf("%s\n", e.message);
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    var registry = new IBus.Registry();
Packit Service 1d8f1c
    registry.load();
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (cache_file != null) {
Packit Service 1d8f1c
        return registry.save_cache_file(cache_file) ?
Packit Service 1d8f1c
                Posix.EXIT_SUCCESS : Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return registry.save_cache(!is_system) ?
Packit Service 1d8f1c
            Posix.EXIT_SUCCESS : Posix.EXIT_FAILURE;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
int print_address(string[] argv) {
Packit Service 1d8f1c
    string address = IBus.get_address();
Packit Service 1d8f1c
    print("%s\n", address != null ? address : "(null)");
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
private int read_config_options(string[] argv) {
Packit Service 1d8f1c
    const OptionEntry[] options = {
Packit Service 1d8f1c
        { "engine-id", 0, 0, OptionArg.STRING, out engine_id,
Packit Service 1d8f1c
          N_("Use engine schema paths instead of ibus core, " +
Packit Service 1d8f1c
             "which can be comma-separated values."), "ENGINE_ID" },
Packit Service 1d8f1c
        { null }
Packit Service 1d8f1c
    };
Packit Service 1d8f1c
Packit Service 1d8f1c
    var option = new OptionContext();
Packit Service 1d8f1c
    option.add_main_entries(options, Config.GETTEXT_PACKAGE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    try {
Packit Service 1d8f1c
        option.parse(ref argv);
Packit Service 1d8f1c
    } catch (OptionError e) {
Packit Service 1d8f1c
        stderr.printf("%s\n", e.message);
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
private GLib.SList<string> get_ibus_schemas() {
Packit Service 1d8f1c
    string[] ids = {};
Packit Service 1d8f1c
    if (engine_id != null) {
Packit Service 1d8f1c
        ids = engine_id.split(",");
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    GLib.SList<string> ibus_schemas = new GLib.SList<string>();
Packit Service 1d8f1c
    GLib.SettingsSchemaSource schema_source =
Packit Service 1d8f1c
            GLib.SettingsSchemaSource.get_default();
Packit Service 1d8f1c
    string[] list_schemas = {};
Packit Service 1d8f1c
    schema_source.list_schemas(true, out list_schemas, null);
Packit Service 1d8f1c
    foreach (string schema in list_schemas) {
Packit Service 1d8f1c
        if (ids.length != 0) {
Packit Service 1d8f1c
            foreach (unowned string id in ids) {
Packit Service 1d8f1c
                if (id == schema ||
Packit Service 1d8f1c
                    schema.has_prefix("org.freedesktop.ibus.engine." + id)) {
Packit Service 1d8f1c
                    ibus_schemas.prepend(schema);
Packit Service 1d8f1c
                    break;
Packit Service 1d8f1c
                }
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
        } else if (schema.has_prefix("org.freedesktop.ibus") &&
Packit Service 1d8f1c
            !schema.has_prefix("org.freedesktop.ibus.engine")) {
Packit Service 1d8f1c
            ibus_schemas.prepend(schema);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    if (ibus_schemas.length() == 0) {
Packit Service 1d8f1c
        printerr("Not found schemas of \"org.freedesktop.ibus\"\n");
Packit Service 1d8f1c
        return ibus_schemas;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    ibus_schemas.sort(GLib.strcmp);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return ibus_schemas;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
int read_config(string[] argv) {
Packit Service 1d8f1c
    if (read_config_options(argv) == Posix.EXIT_FAILURE)
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    GLib.SList<string> ibus_schemas = get_ibus_schemas();
Packit Service 1d8f1c
    if (ibus_schemas.length() == 0)
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    GLib.SettingsSchemaSource schema_source =
Packit Service 1d8f1c
            GLib.SettingsSchemaSource.get_default();
Packit Service 1d8f1c
    var output = new GLib.StringBuilder();
Packit Service 1d8f1c
    foreach (string schema in ibus_schemas) {
Packit Service 1d8f1c
        GLib.SettingsSchema settings_schema = schema_source.lookup(schema,
Packit Service 1d8f1c
                                                                   false);
Packit Service 1d8f1c
        GLib.Settings settings = new GLib.Settings(schema);
Packit Service 1d8f1c
Packit Service 1d8f1c
        output.append_printf("SCHEMA: %s\n", schema);
Packit Service 1d8f1c
Packit Service 1d8f1c
        foreach (string key in settings_schema.list_keys()) {
Packit Service 1d8f1c
            GLib.Variant variant = settings.get_value(key);
Packit Service 1d8f1c
            output.append_printf("  %s: %s\n", key, variant.print(true));
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    print("%s", output.str);
Packit Service 1d8f1c
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
int reset_config(string[] argv) {
Packit Service 1d8f1c
    if (read_config_options(argv) == Posix.EXIT_FAILURE)
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    GLib.SList<string> ibus_schemas = get_ibus_schemas();
Packit Service 1d8f1c
    if (ibus_schemas.length() == 0)
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
Packit Service 1d8f1c
    print("%s\n", _("Resetting…"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    GLib.SettingsSchemaSource schema_source =
Packit Service 1d8f1c
            GLib.SettingsSchemaSource.get_default();
Packit Service 1d8f1c
    foreach (string schema in ibus_schemas) {
Packit Service 1d8f1c
        GLib.SettingsSchema settings_schema = schema_source.lookup(schema,
Packit Service 1d8f1c
                                                                   false);
Packit Service 1d8f1c
        GLib.Settings settings = new GLib.Settings(schema);
Packit Service 1d8f1c
Packit Service 1d8f1c
        print("SCHEMA: %s\n", schema);
Packit Service 1d8f1c
Packit Service 1d8f1c
        foreach (string key in settings_schema.list_keys()) {
Packit Service 1d8f1c
            print("  %s\n", key);
Packit Service 1d8f1c
            settings.reset(key);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    GLib.Settings.sync();
Packit Service 1d8f1c
    print("%s\n", _("Done"));
Packit Service 1d8f1c
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
#if EMOJI_DICT
Packit Service 1d8f1c
int emoji_dialog(string[] argv) {
Packit Service 1d8f1c
    string cmd = Config.LIBEXECDIR + "/ibus-ui-emojier";
Packit Service 1d8f1c
Packit Service 1d8f1c
    var file = File.new_for_path(cmd);
Packit Service 1d8f1c
    if (!file.query_exists())
Packit Service 1d8f1c
        cmd = "../ui/gtk3/ibus-ui-emojier";
Packit Service 1d8f1c
Packit Service 1d8f1c
    argv[0] = cmd;
Packit Service 1d8f1c
Packit Service 1d8f1c
    string[] env = Environ.get();
Packit Service 1d8f1c
Packit Service 1d8f1c
    try {
Packit Service 1d8f1c
        // Non-blocking
Packit Service 1d8f1c
        Process.spawn_async(null, argv, env,
Packit Service 1d8f1c
                            SpawnFlags.SEARCH_PATH,
Packit Service 1d8f1c
                            null, null);
Packit Service 1d8f1c
    } catch (SpawnError e) {
Packit Service 1d8f1c
        stderr.printf("%s\n", e.message);
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
#endif
Packit Service 1d8f1c
Packit Service 1d8f1c
int print_help(string[] argv) {
Packit Service 1d8f1c
    print_usage(stdout);
Packit Service 1d8f1c
    return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
delegate int EntryFunc(string[] argv);
Packit Service 1d8f1c
Packit Service 1d8f1c
struct CommandEntry {
Packit Service 1d8f1c
    unowned string name;
Packit Service 1d8f1c
    unowned string description;
Packit Service 1d8f1c
    unowned EntryFunc entry;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
const CommandEntry commands[]  = {
Packit Service 1d8f1c
    { "engine", N_("Set or get engine"), get_set_engine },
Packit Service 1d8f1c
    { "exit", N_("Exit ibus-daemon"), exit_daemon },
Packit Service 1d8f1c
    { "list-engine", N_("Show available engines"), list_engine },
Packit Service 1d8f1c
    { "watch", N_("(Not implemented)"), message_watch },
Packit Service 1d8f1c
    { "restart", N_("Restart ibus-daemon"), restart_daemon },
Packit Service 1d8f1c
    { "version", N_("Show version"), print_version },
Packit Service 1d8f1c
    { "read-cache", N_("Show the content of registry cache"), read_cache },
Packit Service 1d8f1c
    { "write-cache", N_("Create registry cache"), write_cache },
Packit Service 1d8f1c
    { "address", N_("Print the D-Bus address of ibus-daemon"), print_address },
Packit Service 1d8f1c
    { "read-config", N_("Show the configuration values"), read_config },
Packit Service 1d8f1c
    { "reset-config", N_("Reset the configuration values"), reset_config },
Packit Service 1d8f1c
#if EMOJI_DICT
Packit Service 1d8f1c
    { "emoji", N_("Save emoji on dialog to clipboard "), emoji_dialog },
Packit Service 1d8f1c
#endif
Packit Service 1d8f1c
    { "help", N_("Show this information"), print_help }
Packit Service 1d8f1c
};
Packit Service 1d8f1c
Packit Service 1d8f1c
static string program_name;
Packit Service 1d8f1c
Packit Service 1d8f1c
void print_usage(FileStream stream) {
Packit Service 1d8f1c
    stream.printf(_("Usage: %s COMMAND [OPTION...]\n\n"), program_name);
Packit Service 1d8f1c
    stream.printf(_("Commands:\n"));
Packit Service 1d8f1c
    for (int i = 0; i < commands.length; i++) {
Packit Service 1d8f1c
        stream.printf("  %-12s    %s\n",
Packit Service 1d8f1c
                      commands[i].name,
Packit Service 1d8f1c
                      GLib.dgettext(null, commands[i].description));
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
public int main(string[] argv) {
Packit Service 1d8f1c
    GLib.Intl.setlocale(GLib.LocaleCategory.ALL, "");
Packit Service 1d8f1c
    GLib.Intl.bindtextdomain(Config.GETTEXT_PACKAGE, Config.GLIB_LOCALE_DIR);
Packit Service 1d8f1c
    GLib.Intl.bind_textdomain_codeset(Config.GETTEXT_PACKAGE, "UTF-8");
Packit Service 1d8f1c
    GLib.Intl.textdomain(Config.GETTEXT_PACKAGE);
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBus.init();
Packit Service 1d8f1c
Packit Service 1d8f1c
    program_name = Path.get_basename(argv[0]);
Packit Service 1d8f1c
    if (argv.length < 2) {
Packit Service 1d8f1c
        print_usage(stderr);
Packit Service 1d8f1c
        return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    string[] new_argv = argv[1:argv.length];
Packit Service 1d8f1c
    new_argv[0] = "%s %s".printf(program_name, new_argv[0]);
Packit Service 1d8f1c
    for (int i = 0; i < commands.length; i++) {
Packit Service 1d8f1c
        if (commands[i].name == argv[1])
Packit Service 1d8f1c
            return commands[i].entry(new_argv);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    stderr.printf(_("%s is unknown command!\n"), argv[1]);
Packit Service 1d8f1c
    print_usage(stderr);
Packit Service 1d8f1c
    return Posix.EXIT_FAILURE;
Packit Service 1d8f1c
}