Blame engine/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) 2011-2013 Peng Huang <shawn.p.huang@gmail.com>
Packit Service 1d8f1c
 * Copyright (c) 2015 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
using IBus;
Packit Service 1d8f1c
Packit Service 1d8f1c
class DummyEngine : IBus.EngineSimple {
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
public int main(string[] args) {
Packit Service 1d8f1c
    Intl.setlocale(LocaleCategory.ALL, "");
Packit Service 1d8f1c
    IBus.init();
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBus.Bus bus = new IBus.Bus();
Packit Service 1d8f1c
    if (!bus.is_connected()) {
Packit Service 1d8f1c
        warning("ibus-daemon does not exist.");
Packit Service 1d8f1c
        return 1;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    bus.disconnected.connect((bus) => {
Packit Service 1d8f1c
        debug("bus disconnected");
Packit Service 1d8f1c
        IBus.quit();
Packit Service 1d8f1c
    });
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBus.Factory factory = new IBus.Factory(bus.get_connection());
Packit Service 1d8f1c
    
Packit Service 1d8f1c
    int id = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
    factory.create_engine.connect((factory, name) => {
Packit Service 1d8f1c
        if (!name.has_prefix("xkb:"))
Packit Service 1d8f1c
            return null;
Packit Service 1d8f1c
Packit Service 1d8f1c
        const string path = "/org/freedesktop/IBus/engine/simple/%d";
Packit Service 1d8f1c
Packit Service 1d8f1c
        IBus.Engine engine = new IBus.Engine.with_type(
Packit Service 1d8f1c
            typeof(IBus.EngineSimple), name,
Packit Service 1d8f1c
            path.printf(++id), bus.get_connection());
Packit Service 1d8f1c
Packit Service 1d8f1c
        /* Use Idle.add() to reduce the lag caused by file io */
Packit Service 1d8f1c
        GLib.Idle.add(() => {
Packit Service 1d8f1c
            /* I think "c" + "'" is c with acute U+0107 and
Packit Service 1d8f1c
             * "c" + "," is c with cedilla U+00E7 and they are
Packit Service 1d8f1c
             * visually comprehensible. But pt-br people need
Packit Service 1d8f1c
             * "c" + "'" is c with cedilla and I think the
Packit Service 1d8f1c
             * cedilla_compose_seqs is needed for the specific keyboards
Packit Service 1d8f1c
             * or regions.
Packit Service 1d8f1c
             * X11 uses compose by locale:
Packit Service 1d8f1c
             * In /usr/share/X11/locale/en_US.UTF-8/Compose ,
Packit Service 1d8f1c
             * <Multi_key> <apostrophe> <c> : U0107
Packit Service 1d8f1c
             */
Packit Service 1d8f1c
            IBus.EngineSimple? simple = (IBus.EngineSimple ?) engine; 
Packit Service 1d8f1c
            simple.add_table_by_locale(null);
Packit Service 1d8f1c
Packit Service 1d8f1c
            string user_file = null;
Packit Service 1d8f1c
Packit Service 1d8f1c
            var home = GLib.Environment.get_home_dir();
Packit Service 1d8f1c
            if (home != null) {
Packit Service 1d8f1c
                user_file = home + "/.XCompose";
Packit Service 1d8f1c
                if (GLib.FileUtils.test(user_file, GLib.FileTest.EXISTS))
Packit Service 1d8f1c
                    simple.add_compose_file(user_file);
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
Packit Service 1d8f1c
            user_file = GLib.Environment.get_variable("XCOMPOSEFILE");
Packit Service 1d8f1c
            if (user_file != null) {
Packit Service 1d8f1c
                if (GLib.FileUtils.test(user_file, GLib.FileTest.EXISTS))
Packit Service 1d8f1c
                    simple.add_compose_file(user_file);
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
Packit Service 1d8f1c
            return false;
Packit Service 1d8f1c
        });
Packit Service 1d8f1c
Packit Service 1d8f1c
        return engine;
Packit Service 1d8f1c
    });
Packit Service 1d8f1c
Packit Service 1d8f1c
    uint flags = 
Packit Service 1d8f1c
        IBus.BusNameFlag.REPLACE_EXISTING |
Packit Service 1d8f1c
        IBus.BusNameFlag.ALLOW_REPLACEMENT;
Packit Service 1d8f1c
    uint retval = bus.request_name("org.freedesktop.IBus.Simple", flags);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (retval == 0) {
Packit Service 1d8f1c
        warning("Registry bus name org.freedesktop.IBus.Simple failed!");
Packit Service 1d8f1c
        return 1;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    IBus.main();
Packit Service 1d8f1c
Packit Service 1d8f1c
    return 0;
Packit Service 1d8f1c
}