/nimf

nimf Qt5 Input method plugins for tdesktop

Primary LanguageC

This patch is merged into tdesktop project via PR.

Build instructions for tdesktop client to compatible with nimf

This document is based on Telegram v1.3.10 version and nimf 2018.08.03 version.

Build instructions for GYP/CMake under Ubuntu 16.04

Create & Run docker container for build

docker run -it --name "telegram-build" ubuntu:16.04 /bin/bash

Prepare folder

Choose an empty folder for the future build, for example /home/user/TBuild. It will be named BuildPath in the rest of this document.

Install software and required packages

You will need GCC 7.2 and CMake 3.2 installed. To install them and all the required dependencies run

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo add-apt-repository ppa:george-edison55/cmake-3.x
sudo apt-get update
sudo apt-get install gcc-7 g++-7 cmake
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 60
sudo add-apt-repository --remove ppa:ubuntu-toolchain-r/test
sudo add-apt-repository --remove ppa:george-edison55/cmake-3.x
sudo apt update
sudo apt-get install software-properties-common


sudo apt-get install git libexif-dev liblzma-dev libz-dev libssl-dev libappindicator-dev libunity-dev libicu-dev libdee-dev libdrm-dev dh-autoreconf autoconf automake build-essential libass-dev libfreetype6-dev libgpac-dev libsdl1.2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-image0-dev libxcb-shm0-dev libxcb-xfixes0-dev libxcb-keysyms1-dev libxcb-icccm4-dev libxcb-render-util0-dev libxcb-util0-dev libxrender-dev libasound-dev libpulse-dev libxcb-sync0-dev libxcb-randr0-dev libx11-xcb-dev libffi-dev libncurses5-dev pkg-config texi2html zlib1g-dev yasm cmake xutils-dev bison python-xcbgen

You can set the multithreaded make parameter by running

MAKE_THREADS_CNT=-j8

Clone source code and prepare libraries

Go to BuildPath and run

git clone --recursive https://github.com/telegramdesktop/tdesktop.git

mkdir Libraries
cd Libraries

git clone https://github.com/ericniebler/range-v3

git clone https://github.com/telegramdesktop/zlib.git
cd zlib
./configure
make $MAKE_THREADS_CNT
sudo make install
cd ..

git clone https://github.com/xiph/opus
cd opus
git checkout v1.2.1
./autogen.sh
./configure
make $MAKE_THREADS_CNT
sudo make install
cd ..

git clone https://github.com/01org/libva.git
cd libva
./autogen.sh --enable-static
make $MAKE_THREADS_CNT
sudo make install
cd ..

git clone git://anongit.freedesktop.org/vdpau/libvdpau
cd libvdpau
./autogen.sh --enable-static
make $MAKE_THREADS_CNT
sudo make install
cd ..

git clone https://github.com/FFmpeg/FFmpeg.git ffmpeg
cd ffmpeg
git checkout release/3.4

./configure --prefix=/usr/local --disable-programs --disable-doc --disable-everything --enable-protocol=file --enable-libopus --enable-decoder=aac --enable-decoder=aac_latm --enable-decoder=aasc --enable-decoder=flac --enable-decoder=gif --enable-decoder=h264 --enable-decoder=h264_vdpau --enable-decoder=mp1 --enable-decoder=mp1float --enable-decoder=mp2 --enable-decoder=mp2float --enable-decoder=mp3 --enable-decoder=mp3adu --enable-decoder=mp3adufloat --enable-decoder=mp3float --enable-decoder=mp3on4 --enable-decoder=mp3on4float --enable-decoder=mpeg4 --enable-decoder=mpeg4_vdpau --enable-decoder=msmpeg4v2 --enable-decoder=msmpeg4v3 --enable-decoder=opus --enable-decoder=pcm_alaw --enable-decoder=pcm_alaw_at --enable-decoder=pcm_f32be --enable-decoder=pcm_f32le --enable-decoder=pcm_f64be --enable-decoder=pcm_f64le --enable-decoder=pcm_lxf --enable-decoder=pcm_mulaw --enable-decoder=pcm_mulaw_at --enable-decoder=pcm_s16be --enable-decoder=pcm_s16be_planar --enable-decoder=pcm_s16le --enable-decoder=pcm_s16le_planar --enable-decoder=pcm_s24be --enable-decoder=pcm_s24daud --enable-decoder=pcm_s24le --enable-decoder=pcm_s24le_planar --enable-decoder=pcm_s32be --enable-decoder=pcm_s32le --enable-decoder=pcm_s32le_planar --enable-decoder=pcm_s64be --enable-decoder=pcm_s64le --enable-decoder=pcm_s8 --enable-decoder=pcm_s8_planar --enable-decoder=pcm_u16be --enable-decoder=pcm_u16le --enable-decoder=pcm_u24be --enable-decoder=pcm_u24le --enable-decoder=pcm_u32be --enable-decoder=pcm_u32le --enable-decoder=pcm_u8 --enable-decoder=pcm_zork --enable-decoder=vorbis --enable-decoder=wavpack --enable-decoder=wmalossless --enable-decoder=wmapro --enable-decoder=wmav1 --enable-decoder=wmav2 --enable-decoder=wmavoice --enable-encoder=libopus --enable-hwaccel=h264_vaapi --enable-hwaccel=h264_vdpau --enable-hwaccel=mpeg4_vaapi --enable-hwaccel=mpeg4_vdpau --enable-parser=aac --enable-parser=aac_latm --enable-parser=flac --enable-parser=h264 --enable-parser=mpeg4video --enable-parser=mpegaudio --enable-parser=opus --enable-parser=vorbis --enable-demuxer=aac --enable-demuxer=flac --enable-demuxer=gif --enable-demuxer=h264 --enable-demuxer=mov --enable-demuxer=mp3 --enable-demuxer=ogg --enable-demuxer=wav --enable-muxer=ogg --enable-muxer=opus

make $MAKE_THREADS_CNT
sudo make install
cd ..

git clone https://git.assembla.com/portaudio.git
cd portaudio
git checkout 396fe4b669
./configure
make $MAKE_THREADS_CNT
sudo make install
cd ..

git clone git://repo.or.cz/openal-soft.git
cd openal-soft
git checkout v1.18
cd build
cmake -D LIBTYPE:STRING=STATIC ..
make $MAKE_THREADS_CNT
sudo make install
cd ../..

git clone https://github.com/openssl/openssl
cd openssl
git checkout OpenSSL_1_0_2-stable
./config
make $MAKE_THREADS_CNT
sudo make install
cd ..

git clone https://github.com/xkbcommon/libxkbcommon.git
cd libxkbcommon
./autogen.sh --disable-x11
make $MAKE_THREADS_CNT
sudo make install
cd ..

git clone git://code.qt.io/qt/qt5.git qt5_6_2
cd qt5_6_2
perl init-repository --module-subset=qtbase,qtimageformats
git checkout v5.6.2
cd qtimageformats && git checkout v5.6.2 && cd ..
cd qtbase && git checkout v5.6.2 && cd ..
cd qtbase && git apply ../../../tdesktop/Telegram/Patches/qtbase_5_6_2.diff && cd ..
cd qtbase/src/plugins/platforminputcontexts
git clone https://github.com/telegramdesktop/fcitx.git
git clone https://github.com/telegramdesktop/hime.git

Add nimf QT5 im module from github & change directory name

git clone https://github.com/5HARK/im-nimf-qt5
mv im-nimf-qt5 nimf

Add nimf plugin into platforminputcontexts.pro

cd ../

Modify the platforminputcontexts.pro

TEMPLATE = subdirs

qtHaveModule(dbus) {
# Patch: Adding fcitx/hime/nimf input context plugin to our static build.
!mac:!win32:SUBDIRS += ibus fcitx hime nimf
}

contains(QT_CONFIG, xcb-plugin): SUBDIRS += compose

Continue to work on the rest

# on path Libraries/qt5_6_2 
cd ../../../..

./configure -prefix "/usr/local/tdesktop/Qt-5.6.2" -release -force-debug-info -opensource -confirm-license -qt-zlib -qt-libpng -qt-libjpeg -qt-freetype -qt-harfbuzz -qt-pcre -qt-xcb -qt-xkbcommon-x11 -no-opengl -no-gtkstyle -static -openssl-linked -nomake examples -nomake tests

make $MAKE_THREADS_CNT
sudo make install
cd ..

git clone https://chromium.googlesource.com/external/gyp
cd gyp
git checkout 702ac58e47
git apply ../../tdesktop/Telegram/Patches/gyp.diff
cd ..

git clone https://chromium.googlesource.com/breakpad/breakpad
cd breakpad
git checkout bc8fb886
git clone https://chromium.googlesource.com/linux-syscall-support src/third_party/lss
cd src/third_party/lss
git checkout a91633d1
cd ../../..
./configure
make $MAKE_THREADS_CNT
sudo make install
cd src/tools
../../../gyp/gyp  --depth=. --generator-output=.. -Goutput_dir=../out tools.gyp --format=cmake
cd ../../out/Default
cmake .
make $MAKE_THREADS_CNT dump_syms
cd ../../..

Add static builded nimf Qt5 im plugin into qt_static_plugins.cpp

Modify the tdesktop/Telegram/SourceFiles/qt_static_plugins.cpp

--- a/Telegram/SourceFiles/qt_static_plugins.cpp
+++ b/Telegram/SourceFiles/qt_static_plugins.cpp
@@ -24,4 +24,5 @@ Q_IMPORT_PLUGIN(QComposePlatformInputContextPlugin)
 Q_IMPORT_PLUGIN(QIbusPlatformInputContextPlugin)
 Q_IMPORT_PLUGIN(QFcitxPlatformInputContextPlugin)
 Q_IMPORT_PLUGIN(QHimePlatformInputContextPlugin)
+Q_IMPORT_PLUGIN(NimfInputContextPlugin)
 #endif // Q_OS_WIN | Q_OS_MAC | Q_OS_LINUX

Modify the tdesktop/Telegram/gyp/telegram_linux.gypi

--- a/Telegram/gyp/telegram_linux.gypi
+++ b/Telegram/gyp/telegram_linux.gypi
@@ -48,6 +48,10 @@
       'ibusplatforminputcontextplugin',
       'fcitxplatforminputcontextplugin',
       'himeplatforminputcontextplugin',
+      'nimfplatforminputcontextplugin',
+      'gio-2.0',
+      'gobject-2.0',
       'liblzma.a',
       'libopenal.a',
       'libavformat.a',

Building the project

Go to BuildPath/tdesktop/Telegram and run

gyp/refresh.sh

To make Debug version go to BuildPath/tdesktop/out/Debug and run

make $MAKE_THREADS_CNT

To make Release version go to BuildPath/tdesktop/out/Release and run

make $MAKE_THREADS_CNT

You can debug your builds from Qt Creator, just open CMakeLists.txt from BuildPath/tdesktop/out/Debug and launch with debug.

Reference

https://gitlab.com/nimf-i18n/nimf/blob/master/README

https://gitlab.com/nimf-i18n/nimf/issues/16

https://github.com/telegramdesktop/tdesktop/blob/dev/docs/building-cmake.md