Blame ui/gtk3/emojierapp.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) 2017 Peng Wu <alexepico@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
string emoji_font = null;
Packit Service 1d8f1c
string annotation_lang = null;
Packit Service 1d8f1c
bool partial_match = false;
Packit Service 1d8f1c
int partial_match_length = -1;
Packit Service 1d8f1c
int partial_match_condition = -1;
Packit Service 1d8f1c
Packit Service 1d8f1c
public class EmojiApplication : Gtk.Application {
Packit Service 1d8f1c
    private IBusEmojier? m_emojier;
Packit Service 1d8f1c
    private GLib.Settings m_settings_emoji =
Packit Service 1d8f1c
            new GLib.Settings("org.freedesktop.ibus.panel.emoji");
Packit Service 1d8f1c
    private ApplicationCommandLine? m_command_line = null;
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    private EmojiApplication() {
Packit Service 1d8f1c
        Object(application_id: "org.freedesktop.IBus.Panel.Emojier",
Packit Service 1d8f1c
               flags: ApplicationFlags.HANDLES_COMMAND_LINE);
Packit Service 1d8f1c
        set_inactivity_timeout(100000);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    private void show_dialog(ApplicationCommandLine command_line) {
Packit Service 1d8f1c
        m_command_line = command_line;
Packit Service 1d8f1c
        m_emojier.reset();
Packit Service 1d8f1c
        m_emojier.set_annotation("");
Packit Service 1d8f1c
        m_emojier.show_all();
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    public void candidate_clicked_lookup_table(uint index,
Packit Service 1d8f1c
                                               uint button,
Packit Service 1d8f1c
                                               uint state) {
Packit Service 1d8f1c
        if (m_command_line == null)
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        if (button == IBusEmojier.BUTTON_CLOSE_BUTTON) {
Packit Service 1d8f1c
            m_emojier.hide();
Packit Service 1d8f1c
            m_command_line.print("%s\n", _("Canceled to choose an emoji."));
Packit Service 1d8f1c
            m_command_line = null;
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        if (m_emojier == null)
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        bool show_candidate = false;
Packit Service 1d8f1c
        uint ncandidates = m_emojier.get_number_of_candidates();
Packit Service 1d8f1c
        if (ncandidates > 0 && ncandidates >= index) {
Packit Service 1d8f1c
            m_emojier.set_cursor_pos(index);
rpm-build 0a7332
            show_candidate = m_emojier.has_variants(index, false);
Packit Service 1d8f1c
        } else {
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        if (show_candidate) {
Packit Service 1d8f1c
            return;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        string emoji = m_emojier.get_current_candidate();
Packit Service 1d8f1c
        m_emojier.hide();
Packit Service 1d8f1c
        Gtk.Clipboard clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD);
Packit Service 1d8f1c
        clipboard.set_text(emoji, -1);
Packit Service 1d8f1c
        clipboard.store();
Packit Service 1d8f1c
Packit Service 1d8f1c
        var emojier_favorites = m_settings_emoji.get_strv("favorites");
Packit Service 1d8f1c
        bool has_favorite = false;
Packit Service 1d8f1c
        foreach (unowned string favorite in emojier_favorites) {
Packit Service 1d8f1c
            if (favorite == emoji) {
Packit Service 1d8f1c
                has_favorite = true;
Packit Service 1d8f1c
                break;
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        if (!has_favorite) {
Packit Service 1d8f1c
            emojier_favorites += emoji;
Packit Service 1d8f1c
            m_settings_emoji.set_strv("favorites", emojier_favorites);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        m_command_line.print("%s\n", _("Copied an emoji to your clipboard."));
Packit Service 1d8f1c
        m_command_line = null;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    public void activate_dialog(ApplicationCommandLine command_line) {
Packit Service 1d8f1c
        this.hold ();
Packit Service 1d8f1c
        show_dialog(command_line);
Packit Service 1d8f1c
        this.release ();
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    private int _command_line(ApplicationCommandLine command_line) {
Packit Service 1d8f1c
        // Set default font size
Packit Service 1d8f1c
        IBusEmojier.set_emoji_font(m_settings_emoji.get_string("font"));
Packit Service 1d8f1c
Packit Service 1d8f1c
        const OptionEntry[] options = {
Packit Service 1d8f1c
            { "font", 0, 0, OptionArg.STRING, out emoji_font,
Packit Service 1d8f1c
              /* TRANSLATORS: "FONT" should be capital and translatable.
Packit Service 1d8f1c
               * It's used for an argument command --font=FONT
Packit Service 1d8f1c
               */
Packit Service 1d8f1c
              N_("\"FONT\" for emoji characters on emoji dialog"),
Packit Service 1d8f1c
              N_("FONT") },
Packit Service 1d8f1c
            { "lang", 0, 0, OptionArg.STRING, out annotation_lang,
Packit Service 1d8f1c
              /* TRANSLATORS: "LANG" should be capital and translatable.
Packit Service 1d8f1c
               * It's used for an argument command --lang=LANG
Packit Service 1d8f1c
               */
Packit Service 1d8f1c
              N_("\"LANG\" for annotations on emoji dialog. E.g. \"en\""),
Packit Service 1d8f1c
              N_("LANG") },
Packit Service 1d8f1c
            { "partial-match", 0, 0, OptionArg.NONE, out partial_match,
Packit Service 1d8f1c
              N_("Emoji annotations can be match partially"),
Packit Service 1d8f1c
              null },
Packit Service 1d8f1c
            { "partial-match-length", 0, 0, OptionArg.INT,
Packit Service 1d8f1c
              out partial_match_length,
Packit Service 1d8f1c
              N_("Match with the length of the specified integer"),
Packit Service 1d8f1c
              null },
Packit Service 1d8f1c
            { "partial-match-condition", 0, 0, OptionArg.INT,
Packit Service 1d8f1c
              out partial_match_condition,
Packit Service 1d8f1c
              N_("Match with the condition of the specified integer"),
Packit Service 1d8f1c
              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
        // We have to make an extra copy of the array,
Packit Service 1d8f1c
        // since .parse assumes that it can remove strings
Packit Service 1d8f1c
        // from the array without freeing them.
Packit Service 1d8f1c
        string[] args = command_line.get_arguments();
Packit Service 1d8f1c
        string*[] _args = new string[args.length];
Packit Service 1d8f1c
        for (int i = 0; i < args.length; i++) {
Packit Service 1d8f1c
            _args[i] = args[i];
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
        // Need to initialize for the second instance.
Packit Service 1d8f1c
        emoji_font = null;
Packit Service 1d8f1c
        annotation_lang = null;
Packit Service 1d8f1c
Packit Service 1d8f1c
        try {
Packit Service 1d8f1c
            unowned string[] tmp = _args;
Packit Service 1d8f1c
            option.parse(ref tmp);
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
        if (m_emojier != null && m_emojier.is_running()) {
Packit Service 1d8f1c
            Gdk.Event event = new Gdk.Event(Gdk.EventType.KEY_PRESS);
Packit Service 1d8f1c
            event.key.time = Gdk.CURRENT_TIME;
Packit Service 1d8f1c
            m_emojier.present_centralize(event);
Packit Service 1d8f1c
            return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
        if (annotation_lang == null)
Packit Service 1d8f1c
            annotation_lang = m_settings_emoji.get_string("lang");
Packit Service 1d8f1c
        IBusEmojier.set_annotation_lang(annotation_lang);
Packit Service 1d8f1c
        IBusEmojier.set_partial_match(partial_match);
Packit Service 1d8f1c
        if (partial_match_length > 0) {
Packit Service 1d8f1c
            IBusEmojier.set_partial_match_length(partial_match_length);
Packit Service 1d8f1c
        } else {
Packit Service 1d8f1c
            IBusEmojier.set_partial_match_length(
Packit Service 1d8f1c
                    m_settings_emoji.get_int("partial-match-length"));
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        if (partial_match_condition > 2) {
Packit Service 1d8f1c
            warning("Need condition between 0 and 2.");
Packit Service 1d8f1c
            IBusEmojier.set_partial_match_condition(
Packit Service 1d8f1c
                    m_settings_emoji.get_int("partial-match-condition"));
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        else if (partial_match_condition >= 0) {
Packit Service 1d8f1c
            IBusEmojier.set_partial_match_condition(partial_match_condition);
Packit Service 1d8f1c
        } else {
Packit Service 1d8f1c
            IBusEmojier.set_partial_match_condition(
Packit Service 1d8f1c
                    m_settings_emoji.get_int("partial-match-condition"));
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
        if (emoji_font != null)
Packit Service 1d8f1c
            IBusEmojier.set_emoji_font(emoji_font);
Packit Service 1d8f1c
Packit Service 1d8f1c
        IBusEmojier.set_favorites(
Packit Service 1d8f1c
                m_settings_emoji.get_strv("favorites"),
Packit Service 1d8f1c
                m_settings_emoji.get_strv("favorite-annotations"));
Packit Service 1d8f1c
Packit Service 1d8f1c
        IBusEmojier.load_unicode_dict();
Packit Service 1d8f1c
Packit Service 1d8f1c
        if (m_emojier == null) {
Packit Service 1d8f1c
            m_emojier = new IBusEmojier();
Packit Service 1d8f1c
            // For title handling in gnome-shell
Packit Service 1d8f1c
            add_window(m_emojier);
Packit Service 1d8f1c
            m_emojier.candidate_clicked.connect((i, b, s) => {
Packit Service 1d8f1c
                candidate_clicked_lookup_table(i, b, s);
Packit Service 1d8f1c
            });
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
        activate_dialog(command_line);
Packit Service 1d8f1c
Packit Service 1d8f1c
        return Posix.EXIT_SUCCESS;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    public override int command_line(ApplicationCommandLine command_line) {
Packit Service 1d8f1c
        // keep the application running until we are done with this commandline
Packit Service 1d8f1c
        this.hold();
Packit Service 1d8f1c
        int result = _command_line(command_line);
Packit Service 1d8f1c
        this.release();
Packit Service 1d8f1c
        return result;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    public override void shutdown() {
Packit Service 1d8f1c
        base.shutdown();
Packit Service 1d8f1c
        remove_window(m_emojier);
Packit Service 1d8f1c
        m_emojier = null;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
Packit Service 1d8f1c
    public static int main (string[] args) {
Packit Service 1d8f1c
        GLib.Intl.bindtextdomain(Config.GETTEXT_PACKAGE,
Packit Service 1d8f1c
                                 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
        Gtk.init(ref args);
Packit Service 1d8f1c
Packit Service 1d8f1c
        EmojiApplication app = new EmojiApplication();
Packit Service 1d8f1c
        int status = app.run(args);
Packit Service 1d8f1c
        return status;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
}