Implement Unicode choice on Emojier

This commit is contained in:
Takao Fujiwara 2018-02-06 14:43:55 +09:00
parent a8719e1d2d
commit a3692b8582
3 changed files with 4339 additions and 48 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,16 @@
From 1e358f28a2b36743847584671ef533769036b40d Mon Sep 17 00:00:00 2001
From c6c1e8ea01c8466dc97d7549e77538e2d7ec872a Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
Date: Sun, 22 Oct 2017 10:45:33 +0900
Date: Mon, 29 Jan 2018 18:27:09 +0900
Subject: [PATCH] Integrate custom rendering to use HarfBuzz glyph info
IBusFontSet offers FcFontSet, glyph info with HarfBuzz and rendering
on Cairo context.
Current Pango changes fonts by emoji variants and draws the separated
glyphs [1] but actually the emoji characters with variants can be drawn
as one glyph so this class manages Fontconfig fontsets to select a font,
HarfBuzz to get glyphs for emoji variants, Cairo to draw glyphs.
Now the most issues in Pango were fixed and I appreciate the changes [1].
However the latest changes in Pango, Fontconfig prevent users from
setting emoji fonts with GtkFontChooser.
This patch can enable the selected emoji font to draw emoji chars
on Emojier.
It's under the considerations if the font setting is deleted from ibus-setup.
Need configure --enable-harfbuzz-for-emoji option to enable this feature.
[1]: https://bugzilla.gnome.org/show_bug.cgi?id=780669
@ -19,10 +21,10 @@ Need configure --enable-harfbuzz-for-emoji option to enable this feature.
bindings/vala/ibus-fontset-1.0.deps | 1 +
configure.ac | 29 +
ui/gtk3/Makefile.am | 32 +
ui/gtk3/emojier.vala | 100 +++-
ui/gtk3/emojier.vala | 111 ++++
ui/gtk3/ibusfontset.c | 1030 ++++++++++++++++++++++++++++++++
ui/gtk3/ibusfontset.h | 302 ++++++++++
8 files changed, 1576 insertions(+), 2 deletions(-)
8 files changed, 1589 insertions(+)
create mode 100644 bindings/vala/IBusFontSet-1.0.metadata
create mode 100644 bindings/vala/ibus-fontset-1.0.deps
create mode 100644 ui/gtk3/ibusfontset.c
@ -153,11 +155,11 @@ index 00000000..129fe166
@@ -0,0 +1 @@
+cairo
diff --git a/configure.ac b/configure.ac
index 14556a3a..6ff8f4a9 100644
index bd41069b..243396ff 100644
--- a/configure.ac
+++ b/configure.ac
@@ -653,6 +653,34 @@ https://github.com/fujiwarat/cldr-emoji-annotation)
enable_emoji_dict="yes (enabled, use --disable-emoji-dict to disable)"
@@ -688,6 +688,34 @@ the UCD files from https://www.unicode.org/Public/UNIDATA/)
enable_unicode_dict="yes (enabled, use --disable-unicode-dict to disable)"
fi
+AC_ARG_ENABLE(harfbuzz-for-emoji,
@ -191,10 +193,10 @@ index 14556a3a..6ff8f4a9 100644
# Check iso-codes.
PKG_CHECK_MODULES(ISOCODES, [
iso-codes
@@ -743,6 +771,7 @@ Build options:
Enable Emoji dict $enable_emoji_dict
Unicode Emoji directory $UNICODE_EMOJI_DIR
@@ -780,6 +808,7 @@ Build options:
CLDR annotation directory $EMOJI_ANNOTATION_DIR
Enable Unicode dict $enable_unicode_dict
UCD directory $UCD_DIR
+ Enable HarfBuzz for Emoji $enable_harfbuzz_for_emoji
Run test cases $enable_tests
])
@ -250,22 +252,26 @@ index 786b80e6..cd1e9c2c 100644
man_seven_DATA =$(man_seven_files:.7=.7.gz)
man_sevendir = $(mandir)/man7
diff --git a/ui/gtk3/emojier.vala b/ui/gtk3/emojier.vala
index f3e9f15c..58a26dd6 100644
index 555ea68f..0a703383 100644
--- a/ui/gtk3/emojier.vala
+++ b/ui/gtk3/emojier.vala
@@ -99,6 +99,9 @@ class IBusEmojier : Gtk.ApplicationWindow {
@@ -99,16 +99,103 @@ public class IBusEmojier : Gtk.ApplicationWindow {
}
}
private class EWhiteLabel : Gtk.Label {
+#if ENABLE_HARFBUZZ_FOR_EMOJI
+ IBus.RequisitionEx m_requisition;
+ private IBus.RequisitionEx m_requisition;
+#else
private int m_minimum_width = 0;
private int m_natural_width = 0;
private int m_minimum_height = 0;
private int m_natural_height = 0;
+#endif
public EWhiteLabel(string text) {
GLib.Object(
name : "IBusEmojierWhiteLabel"
@@ -106,8 +109,78 @@ class IBusEmojier : Gtk.ApplicationWindow {
if (text != "")
set_label(text);
);
set_label(text);
}
+#if ENABLE_HARFBUZZ_FOR_EMOJI
+ private void get_preferred_size_with_hb(out int minimum_width,
@ -277,7 +283,8 @@ index f3e9f15c..58a26dd6 100644
+ minimum_height = 0;
+ natural_height = 0;
+ var text = this.get_text();
+ if (text == null || text == "")
+ GLib.return_if_fail (text != null);
+ if (text == "")
+ return;
+ var context = this.get_pango_context();
+ var language = context.get_language();
@ -288,6 +295,18 @@ index f3e9f15c..58a26dd6 100644
+ natural_width = widest.width;
+ minimum_height = widest.height;
+ natural_height = widest.height;
+ if (minimum_width <= minimum_height)
+ natural_width = minimum_width = minimum_height;
+ if (text.length == 1) {
+ switch(text.get_char()) {
+ case '\t':
+ natural_width = minimum_width = minimum_height;
+ break;
+ case '\v':
+ natural_height = minimum_height = minimum_width;
+ break;
+ }
+ }
+ }
+ public override void get_preferred_width(out int minimum_width,
+ out int natural_width) {
@ -302,12 +321,6 @@ index f3e9f15c..58a26dd6 100644
+ out natural_height);
+ }
+ public override bool draw(Cairo.Context cr) {
+ if (m_fontset == null)
+ return true;
+ if (m_requisition == null)
+ return true;
+ if (m_requisition.cairo_lines == null)
+ return true;
+ var style_context = get_style_context();
+ Gtk.Allocation allocation;
+ get_allocation(out allocation);
@ -315,6 +328,12 @@ index f3e9f15c..58a26dd6 100644
+ 0, 0,
+ allocation.width,
+ allocation.height);
+ if (m_fontset == null)
+ return true;
+ if (m_requisition == null)
+ return true;
+ if (m_requisition.cairo_lines == null)
+ return true;
+ Gdk.RGBA *normal_fg = null;
+ style_context.get(Gtk.StateFlags.NORMAL,
+ "color",
@ -336,33 +355,29 @@ index f3e9f15c..58a26dd6 100644
+ normal_fg = null;
+ return true;
+ }
+#else
public override void get_preferred_width(out int minimum_width,
out int natural_width) {
if (m_minimum_height == 0 && m_natural_height == 0) {
@@ -161,6 +248,7 @@ public class IBusEmojier : Gtk.ApplicationWindow {
m_minimum_height = minimum_height;
m_natural_height = natural_height;
}
+#endif
}
- private class ESelectedLabel : Gtk.Label {
+ private class ESelectedLabel : EWhiteLabel {
private class ESelectedLabel : EWhiteLabel {
public ESelectedLabel(string text) {
GLib.Object(
name : "IBusEmojierSelectedLabel"
@@ -116,7 +189,7 @@ class IBusEmojier : Gtk.ApplicationWindow {
set_label(text);
}
}
- private class EGoldLabel : Gtk.Label {
+ private class EGoldLabel : EWhiteLabel {
public EGoldLabel(string text) {
GLib.Object(
name : "IBusEmojierGoldLabel"
@@ -231,6 +304,9 @@ class IBusEmojier : Gtk.ApplicationWindow {
m_category_to_emojis_dict;
private static GLib.HashTable<string, GLib.SList<string>>?
m_emoji_to_emoji_variants_dict;
@@ -307,6 +395,9 @@ public class IBusEmojier : Gtk.ApplicationWindow {
private static bool m_show_unicode = false;
private static LoadProgressObject m_unicode_progress_object;
private static bool m_loaded_unicode = false;
+#if ENABLE_HARFBUZZ_FOR_EMOJI
+ private static IBus.FontSet m_fontset;
+#endif
private ThemedRGBA m_rgba;
private Gtk.Box m_vbox;
@@ -1666,6 +1742,22 @@ class IBusEmojier : Gtk.ApplicationWindow {
@@ -2064,6 +2155,22 @@ public class IBusEmojier : Gtk.ApplicationWindow {
}
@ -385,7 +400,7 @@ index f3e9f15c..58a26dd6 100644
public static bool has_loaded_emoji_dict() {
if (m_emoji_to_data_dict == null)
return false;
@@ -1696,6 +1788,10 @@ class IBusEmojier : Gtk.ApplicationWindow {
@@ -2094,6 +2201,10 @@ public class IBusEmojier : Gtk.ApplicationWindow {
int font_size = font_desc.get_size() / Pango.SCALE;
if (font_size != 0)
m_emoji_font_size = font_size;
@ -1741,5 +1756,5 @@ index 00000000..efcaa286
+G_END_DECLS
+#endif
--
2.13.4
2.14.3

View File

@ -30,7 +30,7 @@
Name: ibus
Version: 1.5.17
Release: 6%{?dist}
Release: 7%{?dist}
Summary: Intelligent Input Bus for Linux OS
License: LGPLv2+
Group: System Environment/Libraries
@ -78,6 +78,7 @@ BuildRequires: qt5-qtbase-devel
%endif
BuildRequires: cldr-emoji-annotation
BuildRequires: unicode-emoji
BuildRequires: unicode-ucd
%if %with_emoji_harfbuzz
BuildRequires: cairo-devel
BuildRequires: fontconfig-devel
@ -427,6 +428,9 @@ dconf update || :
%{_datadir}/gtk-doc/html/*
%changelog
* Tue Feb 06 2018 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.17-7
- Added Unicode typing on Emojier
* Sat Feb 03 2018 Igor Gnatenko <ignatenkobrain@fedoraproject.org> - 1.5.17-6
- Switch to %%ldconfig_scriptlets