|
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 |
}
|