Hello community, here is the log from the commit of package ibus-rime for openSUSE:Factory checked in at 2020-09-29 19:01:24 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ibus-rime (Old) and /work/SRC/openSUSE:Factory/.ibus-rime.new.4249 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ibus-rime" Tue Sep 29 19:01:24 2020 rev:13 rq:838145 version:1.4.1~git20200712.33b2755 Changes: -------- --- /work/SRC/openSUSE:Factory/ibus-rime/ibus-rime.changes 2019-04-04 15:27:03.050889826 +0200 +++ /work/SRC/openSUSE:Factory/.ibus-rime.new.4249/ibus-rime.changes 2020-09-29 19:01:51.117777027 +0200 @@ -1,0 +2,15 @@ +Mon Sep 28 00:52:42 UTC 2020 - [email protected] + +- Update to version 1.4.1~git20200712.33b2755: + * fix(rime_engine): ignore keys with super modifier + * feat(ibus_rime.yaml): install config file for ibus-rime, set default UI style + * fix(logging): wrong log file name + * feat(rime_settings): add config options: style/preedit_style, style/cursor_type + * fix(rime_settings.h): compile with gcc 10 + * feat(plugin): dynamically load librime plugins read from `ibus_rime.yaml` (#73) + * chore(CHANGELOG.md): fix typo + * chore(release): 1.4.0 :tada: + * chore(README.md, rime.xml): use https link + * fix(rime_main.cc): deploy ibus_rime.yaml on maintenance + +------------------------------------------------------------------- Old: ---- ibus-rime-1.4.1~git20190223.c80c02f.tar.xz New: ---- ibus-rime-1.4.1~git20200712.33b2755.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ibus-rime.spec ++++++ --- /var/tmp/diff_new_pack.I5TqOl/_old 2020-09-29 19:01:51.901777980 +0200 +++ /var/tmp/diff_new_pack.I5TqOl/_new 2020-09-29 19:01:51.901777980 +0200 @@ -1,7 +1,7 @@ # # spec file for package ibus-rime # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,12 +17,12 @@ Name: ibus-rime -Version: 1.4.1~git20190223.c80c02f +Version: 1.4.1~git20200712.33b2755 Release: 0 Summary: Rime for Linux/IBus License: GPL-3.0-or-later Group: System/I18n/Chinese -Url: https://github.com/rime/ibus-rime +URL: https://github.com/rime/ibus-rime Source: %{name}-%{version}.tar.xz %if 0%{?suse_version} > 1325 BuildRequires: libboost_headers-devel @@ -36,7 +36,6 @@ BuildRequires: libkyotocabinet-devel BuildRequires: libnotify-devel BuildRequires: librime-devel >= 1.0 -BuildRequires: opencc BuildRequires: opencc-devel Requires: rime @@ -55,8 +54,10 @@ %files %defattr(-,root,root) %doc README.md +%dir %{_datadir}/rime-data %{_ibus_componentdir}/rime.xml %{_datadir}/ibus-rime/ -%{_libexecdir}/ibus-rime/ +%{_datadir}/rime-data/ibus_rime.yaml +%{_prefix}/lib/ibus-rime/ %changelog ++++++ ibus-rime-1.4.1~git20190223.c80c02f.tar.xz -> ibus-rime-1.4.1~git20200712.33b2755.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ibus-rime-1.4.1~git20190223.c80c02f/Makefile new/ibus-rime-1.4.1~git20200712.33b2755/Makefile --- old/ibus-rime-1.4.1~git20190223.c80c02f/Makefile 2019-02-23 05:01:20.000000000 +0100 +++ new/ibus-rime-1.4.1~git20200712.33b2755/Makefile 2020-07-12 09:30:51.000000000 +0200 @@ -28,11 +28,14 @@ install -m 755 -d $(sharedir)/ibus-rime install -m 755 -d $(sharedir)/ibus-rime/icons install -m 644 -t $(sharedir)/ibus-rime/icons/ icons/*.png + install -m 755 -d $(sharedir)/rime-data + install -m 644 -t $(sharedir)/rime-data/ ibus_rime.yaml uninstall: rm $(sharedir)/ibus/component/rime.xml rm -R $(sharedir)/ibus-rime rm -R $(libexecdir)/ibus-rime + rm $(sharedir)/rime-data/ibus_rime.yaml clean: if [ -e $(builddir) ]; then rm -R $(builddir); fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ibus-rime-1.4.1~git20190223.c80c02f/ibus_rime.yaml new/ibus-rime-1.4.1~git20200712.33b2755/ibus_rime.yaml --- old/ibus-rime-1.4.1~git20190223.c80c02f/ibus_rime.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/ibus-rime-1.4.1~git20200712.33b2755/ibus_rime.yaml 2020-07-12 09:30:51.000000000 +0200 @@ -0,0 +1,28 @@ +# ibus-rime configuration + +config_version: '1.0' + +style: + # candidate list orientation (false|true). + horizontal: false + + # embed preedit text in the input field (false|true). + inline_preedit: true + + # `preedit_style` specifies what to display as inline preedit text. + # display inline the input under conversion. + preedit_style: composition + # preview the converted text. + # preedit_style: preview + + # `cursor_type` specifies where the inline cursor is located. + # inline cursor is at the insertion point. + cursor_type: insert + # inline cursor is at the beginning of text under conversion. + # cursor_type: select + + # built-in color schemes for highlighting the portion of inline preedit text + # that needs focus. (null|aqua|azure|ink|luna) + # by default highlighting color is not used. + color_scheme: ~ + # color_scheme: aqua diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ibus-rime-1.4.1~git20190223.c80c02f/rime_engine.c new/ibus-rime-1.4.1~git20200712.33b2755/rime_engine.c --- old/ibus-rime-1.4.1~git20190223.c80c02f/rime_engine.c 2019-02-23 05:01:20.000000000 +0100 +++ new/ibus-rime-1.4.1~git20200712.33b2755/rime_engine.c 2020-07-12 09:30:51.000000000 +0200 @@ -90,7 +90,11 @@ ibus_rime_create_session (IBusRimeEngine *rime_engine) { rime_engine->session_id = rime_api->create_session(); - rime_api->set_option(rime_engine->session_id, "soft_cursor", True); + Bool inline_caret = + g_ibus_rime_settings.embed_preedit_text && + g_ibus_rime_settings.preedit_style == PREEDIT_STYLE_COMPOSITION && + g_ibus_rime_settings.cursor_type == CURSOR_TYPE_INSERT; + rime_api->set_option(rime_engine->session_id, "soft_cursor", !inline_caret); } static void @@ -302,60 +306,102 @@ } IBusText* inline_text = NULL; - IBusText* text = NULL; + IBusText* auxiliary_text = NULL; guint inline_cursor_pos = 0; - int offset = 0; - gboolean inline_preedit = - g_ibus_rime_settings.embed_preedit_text && context.commit_text_preview; - gboolean highlighting = + int preedit_offset = 0; + + const gboolean has_highlighted_span = (context.composition.sel_start < context.composition.sel_end); - if (inline_preedit) { + + // display preview text inline, if the commit_text_preview API is supported. + if (g_ibus_rime_settings.embed_preedit_text && + g_ibus_rime_settings.preedit_style == PREEDIT_STYLE_PREVIEW && + RIME_STRUCT_HAS_MEMBER(context, context.commit_text_preview) && + context.commit_text_preview) { inline_text = ibus_text_new_from_string(context.commit_text_preview); - guint inline_text_len = ibus_text_get_length(inline_text); - inline_cursor_pos = inline_text_len; + const guint inline_text_len = ibus_text_get_length(inline_text); + inline_cursor_pos = + g_ibus_rime_settings.cursor_type == CURSOR_TYPE_SELECT ? + g_utf8_strlen(context.composition.preedit, + context.composition.sel_start) : + inline_text_len; inline_text->attrs = ibus_attr_list_new(); ibus_attr_list_append( inline_text->attrs, ibus_attr_underline_new( IBUS_ATTR_UNDERLINE_SINGLE, 0, inline_text_len)); - // hide converted range of auxiliary text if preedit is inline - if (highlighting) { - offset = context.composition.sel_start; - glong highlighting_start = - g_utf8_strlen(context.composition.preedit, offset); + // show the unconverted range of preedit text as auxiliary text + if (has_highlighted_span) { + preedit_offset = context.composition.sel_start; + if (g_ibus_rime_settings.color_scheme) { + const guint start = g_utf8_strlen( + context.composition.preedit, context.composition.sel_start); + const guint end = inline_text_len; + ibus_attr_list_append( + inline_text->attrs, + ibus_attr_foreground_new( + g_ibus_rime_settings.color_scheme->text_color, start, end)); + ibus_attr_list_append( + inline_text->attrs, + ibus_attr_background_new( + g_ibus_rime_settings.color_scheme->back_color, start, end)); + } + } else { + // hide auxiliary text + preedit_offset = context.composition.length; + } + } + // display preedit text inline + else if (g_ibus_rime_settings.embed_preedit_text && + g_ibus_rime_settings.preedit_style == PREEDIT_STYLE_COMPOSITION) { + inline_text = ibus_text_new_from_string(context.composition.preedit); + const guint inline_text_len = ibus_text_get_length(inline_text); + inline_cursor_pos = + g_ibus_rime_settings.cursor_type == CURSOR_TYPE_SELECT ? + g_utf8_strlen(context.composition.preedit, + context.composition.sel_start) : + g_utf8_strlen(context.composition.preedit, + context.composition.cursor_pos); + inline_text->attrs = ibus_attr_list_new(); + ibus_attr_list_append( + inline_text->attrs, + ibus_attr_underline_new( + IBUS_ATTR_UNDERLINE_SINGLE, 0, inline_text_len)); + if (has_highlighted_span && g_ibus_rime_settings.color_scheme) { + const guint start = g_utf8_strlen( + context.composition.preedit, context.composition.sel_start); + const glong end = g_utf8_strlen( + context.composition.preedit, context.composition.sel_end); ibus_attr_list_append( inline_text->attrs, ibus_attr_foreground_new( - g_ibus_rime_settings.color_scheme->text_color, - highlighting_start, - inline_text_len)); + g_ibus_rime_settings.color_scheme->text_color, start, end)); ibus_attr_list_append( inline_text->attrs, ibus_attr_background_new( - g_ibus_rime_settings.color_scheme->back_color, - highlighting_start, - inline_text_len)); - } - else { - offset = context.composition.length; // hide auxiliary text + g_ibus_rime_settings.color_scheme->back_color, start, end)); } + preedit_offset = context.composition.length; } - if (offset < context.composition.length) { - const char* preedit = context.composition.preedit + offset; - text = ibus_text_new_from_string(preedit); - glong preedit_len = g_utf8_strlen(preedit, -1); - glong cursor_pos = - g_utf8_strlen(preedit, context.composition.cursor_pos - offset); - text->attrs = ibus_attr_list_new(); - if (highlighting) { - glong start = g_utf8_strlen( - preedit,context.composition.sel_start - offset); - glong end = g_utf8_strlen(preedit, context.composition.sel_end - offset); + + // calculate auxiliary text + if (preedit_offset < context.composition.length) { + const char* preedit = context.composition.preedit + preedit_offset; + auxiliary_text = ibus_text_new_from_string(preedit); + // glong preedit_len = g_utf8_strlen(preedit, -1); + // glong cursor_pos = g_utf8_strlen( + // preedit, context.composition.cursor_pos - preedit_offset); + if (has_highlighted_span) { + auxiliary_text->attrs = ibus_attr_list_new(); + const glong start = g_utf8_strlen( + preedit, context.composition.sel_start - preedit_offset); + const glong end = g_utf8_strlen( + preedit, context.composition.sel_end - preedit_offset); ibus_attr_list_append( - text->attrs, + auxiliary_text->attrs, ibus_attr_foreground_new(RIME_COLOR_BLACK, start, end)); ibus_attr_list_append( - text->attrs, + auxiliary_text->attrs, ibus_attr_background_new(RIME_COLOR_LIGHT, start, end)); } } @@ -363,14 +409,13 @@ if (inline_text) { ibus_engine_update_preedit_text( (IBusEngine *)rime_engine, inline_text, inline_cursor_pos, TRUE); - } - else { + } else { ibus_engine_hide_preedit_text((IBusEngine *)rime_engine); } - if (text) { - ibus_engine_update_auxiliary_text((IBusEngine *)rime_engine, text, TRUE); - } - else { + if (auxiliary_text) { + ibus_engine_update_auxiliary_text( + (IBusEngine *)rime_engine, auxiliary_text, TRUE); + } else { ibus_engine_hide_auxiliary_text((IBusEngine *)rime_engine); } @@ -458,10 +503,15 @@ guint keycode, guint modifiers) { + // ignore super key + if (modifiers & IBUS_SUPER_MASK) { + return FALSE; + } + IBusRimeEngine *rime_engine = (IBusRimeEngine *)engine; modifiers &= (IBUS_RELEASE_MASK | IBUS_LOCK_MASK | IBUS_SHIFT_MASK | - IBUS_CONTROL_MASK | IBUS_MOD1_MASK | IBUS_SUPER_MASK); + IBUS_CONTROL_MASK | IBUS_MOD1_MASK); if (!rime_api->find_session(rime_engine->session_id)) { ibus_rime_create_session(rime_engine); @@ -481,9 +531,10 @@ guint prop_state) { extern void ibus_rime_start(gboolean full_check); + extern void ibus_rime_stop(); IBusRimeEngine *rime_engine = (IBusRimeEngine *)engine; if (!strcmp("deploy", prop_name)) { - rime_api->finalize(); + ibus_rime_stop(); ibus_rime_start(TRUE); ibus_rime_engine_update(rime_engine); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ibus-rime-1.4.1~git20190223.c80c02f/rime_main.c new/ibus-rime-1.4.1~git20200712.33b2755/rime_main.c --- old/ibus-rime-1.4.1~git20190223.c80c02f/rime_main.c 2019-02-23 05:01:20.000000000 +0100 +++ new/ibus-rime-1.4.1~git20200712.33b2755/rime_main.c 2020-07-12 09:30:51.000000000 +0200 @@ -64,6 +64,117 @@ } } +static int n_plugin_handles = 0; +static void **plugin_handles; +static const char **plugin_modules; + +static void load_plugins(RimeConfig *config) { + void **new_plugin_handles; + + // reserve space new plugins + int n = rime_api->config_list_size(config, "plugins"); + new_plugin_handles = realloc(plugin_handles, sizeof(void *) * (n_plugin_handles + n)); + if (!new_plugin_handles) { + return; + } else { + plugin_handles = new_plugin_handles; + } + + RimeConfigIterator iter; + n = n_plugin_handles; + if (rime_api->config_begin_list(&iter, config, "plugins")) { + while(rime_api->config_next(&iter)) { + const char *file = rime_api->config_get_cstring(config, iter.path); + if (file) { + plugin_handles[n] = dlopen(file, RTLD_LAZY | RTLD_GLOBAL); + if (plugin_handles[n]) { + int k; + for (k = 0; k < n_plugin_handles; k++) + if (plugin_handles[k] == plugin_handles[n]) { + // already in plugin_handles, close + dlclose(plugin_handles[n]); + break; + } + if (k == n_plugin_handles) + n++; + } + } + } + rime_api->config_end(&iter); + } + n_plugin_handles = n; +} + +static void load_modules(RimeConfig *config) { + int m = rime_api->config_list_size(config, "modules"); + if (m == 0) { + return; + } + + plugin_modules = malloc(sizeof(const char *) * (m + 2)); + if (!plugin_modules) { + return; + } + + RimeConfigIterator iter; + m = 1; + plugin_modules[0] = "default"; + if (rime_api->config_begin_list(&iter, config, "modules")) { + while(rime_api->config_next(&iter)) { + const char *mod = rime_api->config_get_cstring(config, iter.path); + if (mod) { + plugin_modules[m] = strdup(mod); + m++; + } + } + rime_api->config_end(&iter); + } + plugin_modules[m] = NULL; +} + +static void load_plugins_modules(const char *config_file) +{ + RimeConfig config = {0}; + + if (!rime_api->config_open(config_file, &config)) { + g_error("error loading settings for %s\n", config_file); + return; + } + + load_plugins(&config); + load_modules(&config); + + rime_api->config_close(&config); +} + +static void unload_plugins() { + if (plugin_handles) { + for (int i = 0; i < n_plugin_handles; i++) { + dlclose(plugin_handles[i]); + } + free(plugin_handles); + plugin_handles = NULL; + } +} + +static void unload_modules() { + if (plugin_modules) { + for (int i = 1; plugin_modules[i]; i++) { + free((void *) plugin_modules[i]); + } + free(plugin_modules); + plugin_modules = NULL; + } +} + +static void fill_traits(RimeTraits *traits) { + traits->shared_data_dir = IBUS_RIME_SHARED_DATA_DIR; + traits->distribution_name = DISTRIBUTION_NAME; + traits->distribution_code_name = DISTRIBUTION_CODE_NAME; + traits->distribution_version = DISTRIBUTION_VERSION; + traits->app_name = "rime.ibus"; +} + void ibus_rime_start(gboolean full_check) { char user_data_dir[512] = {0}; char old_user_data_dir[512] = {0}; @@ -79,29 +190,30 @@ } rime_api->set_notification_handler(notification_handler, NULL); RIME_STRUCT(RimeTraits, ibus_rime_traits); - ibus_rime_traits.shared_data_dir = IBUS_RIME_SHARED_DATA_DIR; + fill_traits(&ibus_rime_traits); ibus_rime_traits.user_data_dir = user_data_dir; - ibus_rime_traits.distribution_name = DISTRIBUTION_NAME; - ibus_rime_traits.distribution_code_name = DISTRIBUTION_CODE_NAME; - ibus_rime_traits.distribution_version = DISTRIBUTION_VERSION; - ibus_rime_traits.app_name = "ibus"; - static RIME_MODULE_LIST(ibus_rime_modules, "default", "legacy"); - ibus_rime_traits.modules = ibus_rime_modules; + + // first initialization (without extra modules) rime_api->initialize(&ibus_rime_traits); if (rime_api->start_maintenance((Bool)full_check)) { // update frontend config rime_api->deploy_config_file("ibus_rime.yaml", "config_version"); } -} -static void* legacy_module_handle = NULL; + // load plugins & modules + load_plugins_modules("ibus_rime"); -static void load_plugin_modules() { - legacy_module_handle = dlopen("librime-legacy.so", RTLD_LAZY); + // reinitialize if we have extra modules + if (plugin_modules) { + rime_api->finalize(); + ibus_rime_traits.modules = plugin_modules; + rime_api->initialize(&ibus_rime_traits); + } } -static void unload_plugin_modules() { - dlclose(legacy_module_handle); +void ibus_rime_stop() { + rime_api->finalize(); + unload_modules(); } static void ibus_disconnect_cb(IBusBus *bus, gpointer user_data) { @@ -135,15 +247,18 @@ exit(1); } - load_plugin_modules(); + RIME_STRUCT(RimeTraits, ibus_rime_traits); + fill_traits(&ibus_rime_traits); + rime_api->setup(&ibus_rime_traits); + gboolean full_check = FALSE; ibus_rime_start(full_check); ibus_rime_load_settings(); ibus_main(); - rime_api->finalize(); - unload_plugin_modules(); + ibus_rime_stop(); + unload_plugins(); notify_uninit(); g_object_unref(factory); @@ -152,7 +267,7 @@ static void sigterm_cb(int sig) { if (rime_api) { - rime_api->finalize(); + ibus_rime_stop(); } notify_uninit(); exit(EXIT_FAILURE); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ibus-rime-1.4.1~git20190223.c80c02f/rime_settings.c new/ibus-rime-1.4.1~git20200712.33b2755/rime_settings.c --- old/ibus-rime-1.4.1~git20190223.c80c02f/rime_settings.c 2019-02-23 05:01:20.000000000 +0100 +++ new/ibus-rime-1.4.1~git20200712.33b2755/rime_settings.c 2020-07-12 09:30:51.000000000 +0200 @@ -14,9 +14,11 @@ }; static struct IBusRimeSettings ibus_rime_settings_default = { - FALSE, - IBUS_ORIENTATION_SYSTEM, - &preset_color_schemes[0], + .embed_preedit_text = TRUE, + .preedit_style = PREEDIT_STYLE_COMPOSITION, + .cursor_type = CURSOR_TYPE_INSERT, + .lookup_table_orientation = IBUS_ORIENTATION_SYSTEM, + .color_scheme = NULL, }; struct IBusRimeSettings g_ibus_rime_settings; @@ -34,7 +36,7 @@ } } // fallback to default - settings->color_scheme = &preset_color_schemes[0]; + settings->color_scheme = NULL; } void @@ -54,6 +56,26 @@ g_ibus_rime_settings.embed_preedit_text = !!inline_preedit; } + const char* preedit_style_str = + rime_api->config_get_cstring(&config, "style/preedit_style"); + if(preedit_style_str) { + if(!strcmp(preedit_style_str, "composition")) { + g_ibus_rime_settings.preedit_style = PREEDIT_STYLE_COMPOSITION; + } else if(!strcmp(preedit_style_str, "preview")) { + g_ibus_rime_settings.preedit_style = PREEDIT_STYLE_PREVIEW; + } + } + + const char* cursor_type_str = + rime_api->config_get_cstring(&config, "style/cursor_type"); + if (cursor_type_str) { + if (!strcmp(cursor_type_str, "insert")) { + g_ibus_rime_settings.cursor_type = CURSOR_TYPE_INSERT; + } else if (!strcmp(cursor_type_str, "select")) { + g_ibus_rime_settings.cursor_type = CURSOR_TYPE_SELECT; + } + } + Bool horizontal = False; if (rime_api->config_get_bool(&config, "style/horizontal", &horizontal)) { g_ibus_rime_settings.lookup_table_orientation = diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ibus-rime-1.4.1~git20190223.c80c02f/rime_settings.h new/ibus-rime-1.4.1~git20200712.33b2755/rime_settings.h --- old/ibus-rime-1.4.1~git20190223.c80c02f/rime_settings.h 2019-02-23 05:01:20.000000000 +0100 +++ new/ibus-rime-1.4.1~git20200712.33b2755/rime_settings.h 2020-07-12 09:30:51.000000000 +0200 @@ -8,6 +8,16 @@ #define RIME_COLOR_DARK 0x606060 #define RIME_COLOR_BLACK 0x000000 +enum PreeditStyle { + PREEDIT_STYLE_COMPOSITION, + PREEDIT_STYLE_PREVIEW, +}; + +enum CursorType { + CURSOR_TYPE_INSERT, + CURSOR_TYPE_SELECT, +}; + struct ColorSchemeDefinition { const char* color_scheme_id; int text_color; @@ -16,11 +26,13 @@ struct IBusRimeSettings { gboolean embed_preedit_text; + gint preedit_style; + gint cursor_type; gint lookup_table_orientation; struct ColorSchemeDefinition* color_scheme; }; -struct IBusRimeSettings g_ibus_rime_settings; +extern struct IBusRimeSettings g_ibus_rime_settings; void ibus_rime_load_settings();
