ibus-m17n/ibus-m17n-HEAD.patch

1487 lines
47 KiB
Diff
Raw Normal View History

2010-12-08 09:25:29 +00:00
diff --git a/autogen.sh b/autogen.sh
index 14db0b1..99be006 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -1,13 +1,27 @@
#!/bin/sh
-set -e
-set -x
-
-autopoint
-libtoolize --automake --copy
-aclocal -I m4
-autoheader
-automake --add-missing --copy
-autoconf
+# Run this to generate all the initial makefiles, etc.
+
+srcdir=`dirname $0`
+test -z "$srcdir" && srcdir=.
+
+PKG_NAME="ibus-m17n"
+
+(test -f $srcdir/configure.ac \
+ && test -f $srcdir/README ) || {
+ echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
+ echo " top-level $PKG_NAME directory"
+ exit 1
+}
+
+which gnome-autogen.sh || {
+ echo "You need to install gnome-common from the GNOME CVS"
+ exit 1
+}
+
export CFLAGS="-g -O0"
export CXXFLAGS="$CFLAGS"
-./configure --enable-maintainer-mode $*
+
+ACLOCAL_FLAGS="$ACLOCAL_FLAGS -I m4"
+REQUIRED_AUTOMAKE_VERSION=1.10
+
+. gnome-autogen.sh
2010-11-05 02:42:24 +00:00
diff --git a/codereview.settings b/codereview.settings
new file mode 100644
index 0000000..71ecbee
--- /dev/null
+++ b/codereview.settings
@@ -0,0 +1,2 @@
+# This file is used by "git cl" to get code review information.
+CODE_REVIEW_SERVER: codereview.appspot.com
2010-12-08 09:25:29 +00:00
diff --git a/configure.ac b/configure.ac
index 4d5ecc7..d9aeb11 100644
--- a/configure.ac
+++ b/configure.ac
@@ -80,6 +80,7 @@ Makefile
ibus-m17n.spec
src/Makefile
src/m17n.xml.in
+src/default.xml.in
icons/Makefile
m4/Makefile
])
diff --git a/src/Makefile.am b/src/Makefile.am
index 07e4432..eaa8bd8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -22,6 +22,8 @@ AM_CFLAGS = \
@IBUS_CFLAGS@ \
@M17N_CFLAGS@ \
-DPKGDATADIR=\"$(pkgdatadir)\" \
+ -DLIBEXECDIR=\"$(libexecdir)\" \
+ -DSETUPDIR=\"$(setupdir)\" \
$(NULL)
AM_LDADD = \
@IBUS_LIBS@ \
@@ -50,41 +52,38 @@ test_m17n_LDADD = \
libexec_PROGRAMS = ibus-engine-m17n ibus-setup-m17n
-ibus_engine_m17n_SOURCES = \
+noinst_LIBRARIES = libm17ncommon.a
+
+libm17ncommon_a_SOURCES = \
m17nutil.c \
m17nutil.h \
+ $(NULL)
+ibus_engine_m17n_SOURCES = \
main.c \
engine.c \
engine.h \
$(NULL)
-ibus_engine_m17n_CFLAGS = \
- @IBUS_CFLAGS@ \
- @M17N_CFLAGS@ \
- -DPKGDATADIR=\"$(pkgdatadir)\" \
- -DLIBEXECDIR=\"$(libexecdir)\" \
- $(NULL)
ibus_engine_m17n_LDADD = \
+ libm17ncommon.a \
@IBUS_LIBS@ \
@M17N_LIBS@ \
$(NULL)
setup_DATA = \
ibus-m17n-preferences.ui \
+ default.xml \
$(NULL)
setupdir = $(pkgdatadir)/setup
ibus_setup_m17n_SOURCES = \
- m17nutil.c \
- m17nutil.h \
setup.c \
$(NULL)
ibus_setup_m17n_CFLAGS = \
- @IBUS_CFLAGS@ \
- @M17N_CFLAGS@ \
@GTK2_CFLAGS@ \
- -DSETUPDIR=\"$(setupdir)\" \
+ $(AM_CFLAGS) \
$(NULL)
ibus_setup_m17n_LDADD = \
+ libm17ncommon.a \
@IBUS_LIBS@ \
@M17N_LIBS@ \
@GTK2_LIBS@ \
@@ -96,19 +95,31 @@ component_DATA = \
componentdir = @datadir@/ibus/component
EXTRA_DIST = \
- m17n.xml.in \
+ m17n.xml.in.in \
+ default.xml.in \
$(setup_DATA) \
$(NULL)
+DISTCLEANFILES = \
+ m17n.xml.in \
+ default.xml.in \
+ $(NULL)
+
CLEANFILES = \
m17n.xml \
+ default.xml \
$(NULL)
m17n.xml: m17n.xml.in
+default.xml: default.xml.in
+
+SUFFIXES = .xml.in .xml
+.xml.in.xml:
$(AM_V_GEN) \
( \
libexecdir=${libexecdir}; \
pkgdatadir=${pkgdatadir}; \
+ setupdir=${setupdir}; \
s=`cat $<`; \
eval "echo \"$${s}\""; \
) > $@
diff --git a/src/default.xml.in.in b/src/default.xml.in.in
new file mode 100644
2010-12-10 06:43:35 +00:00
index 0000000..5c5d67d
2010-12-08 09:25:29 +00:00
--- /dev/null
+++ b/src/default.xml.in.in
2010-12-10 06:43:35 +00:00
@@ -0,0 +1,246 @@
2010-12-08 09:25:29 +00:00
+<?xml version="1.0" encoding="utf-8"?>
+<engines>
2010-12-10 06:43:35 +00:00
+ <!-- This file defines the default config value for each
+ engine. The "engine" elements below are checked in
+ first-to-last order and a "name" element in an "engine"
+ element allows wildcard patterns. Please keep more
+ specific entries to appear first. -->
2010-12-08 09:25:29 +00:00
+ <!-- Indic engines which represent languages. -->
+ <engine>
+ <name>m17n:as:phonetic</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:bn:inscript</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:gu:inscript</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:hi:inscript</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:kn:kgp</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:ks:kbd</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:mai:inscript</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:ml:inscript</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:mr:inscript</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:ne:rom</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:or:inscript</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:pa:inscript</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:sa:harvard-kyoto</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:sd:inscript</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:si:wijesekera</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:ta:tamil99</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:te:inscript</name>
+ <rank>2</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
2010-12-10 06:43:35 +00:00
+ <!-- Samanala should have lower rank than other Sinhala
+ engines since it is the only non-keyboard input method in
+ Sinhala. -->
+ <engine>
+ <name>m17n:si:samanala</name>
+ <rank>0</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <!-- Chinese and Japanese engines which require preedit decoration. -->
+ <engine>
+ <name>m17n:ja:anthy</name>
+ <rank>0</rank>
+ <preedit-highlight>TRUE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:zh:cangjie</name>
+ <rank>0</rank>
+ <preedit-highlight>TRUE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:zh:py-b5</name>
+ <rank>0</rank>
+ <preedit-highlight>TRUE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:zh:py-gb</name>
+ <rank>0</rank>
+ <preedit-highlight>TRUE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:zh:py</name>
+ <rank>0</rank>
+ <preedit-highlight>TRUE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:zh:quick</name>
+ <rank>0</rank>
+ <preedit-highlight>TRUE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:zh:tonepy-b5</name>
+ <rank>0</rank>
+ <preedit-highlight>TRUE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:zh:tonepy-gb</name>
+ <rank>0</rank>
+ <preedit-highlight>TRUE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:zh:tonepy</name>
+ <rank>0</rank>
+ <preedit-highlight>TRUE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:zh:util</name>
+ <rank>0</rank>
+ <preedit-highlight>TRUE</preedit-highlight>
+ </engine>
2010-12-08 09:25:29 +00:00
+ <!-- Other Indic engines should be selected by default:
+ https://bugzilla.redhat.com/show_bug.cgi?id=640896 -->
+ <engine>
+ <name>m17n:as:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:bn:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:gu:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:hi:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:kn:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:ks:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:mai:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:ml:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:mr:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:ne:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:or:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:pa:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:sa:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:sd:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:si:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:ta:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
+ <engine>
+ <name>m17n:te:*</name>
+ <rank>1</rank>
+ <preedit-highlight>FALSE</preedit-highlight>
+ </engine>
2010-12-10 06:43:35 +00:00
+ <!-- Default for other engines. -->
2010-12-08 09:25:29 +00:00
+ <engine>
2010-12-10 06:43:35 +00:00
+ <name>m17n:*</name>
2010-12-08 09:25:29 +00:00
+ <rank>0</rank>
2010-12-10 06:43:35 +00:00
+ <preedit-highlight>FALSE</preedit-highlight>
2010-12-08 09:25:29 +00:00
+ </engine>
+</engines>
2010-10-14 03:30:14 +00:00
diff --git a/src/engine.c b/src/engine.c
2010-12-08 09:25:29 +00:00
index 260a806..f8e7fe5 100644
2010-10-14 03:30:14 +00:00
--- a/src/engine.c
+++ b/src/engine.c
2010-12-08 09:25:29 +00:00
@@ -6,6 +6,23 @@
#include "m17nutil.h"
#include "engine.h"
+/* type module to assign different GType to each engine */
+#define IBUS_TYPE_M17N_TYPE_MODULE (ibus_m17n_type_module_get_type ())
+#define IBUS_M17N_TYPE_MODULE (module) (G_TYPE_CHECK_INSTANCE_CAST (module, IBUS_TYPE_M17N_TYPE_MODULE, IBusM17NTypeModule)
+
+typedef struct _IBusM17NTypeModule IBusM17NTypeModule;
+typedef struct _IBusM17NTypeModuleClass IBusM17NTypeModuleClass;
+
+struct _IBusM17NTypeModule
+{
+ GTypeModule parent_instance;
+};
+
+struct _IBusM17NTypeModuleClass
+{
+ GTypeModuleClass parent_class;
+};
+
typedef struct _IBusM17NEngine IBusM17NEngine;
typedef struct _IBusM17NEngineClass IBusM17NEngineClass;
@@ -18,20 +35,36 @@ struct _IBusM17NEngine {
IBusProperty *status_prop;
IBusProperty *setup_prop;
IBusPropList *prop_list;
- gchar *config_section;
};
struct _IBusM17NEngineClass {
IBusEngineClass parent;
+
+ /* configurations are per class */
+ gchar *config_section;
+ guint preedit_foreground;
+ guint preedit_background;
+ gint preedit_underline;
+ gint lookup_table_orientation;
+
+ MInputMethod *im;
};
/* functions prototype */
+static GType
+ ibus_m17n_type_module_get_type (void);
static void ibus_m17n_engine_class_init (IBusM17NEngineClass *klass);
-static void ibus_m17n_engine_init (IBusM17NEngine *m17n);
+static void ibus_m17n_engine_class_finalize (IBusM17NEngineClass *klass);
+static void ibus_m17n_config_value_changed (IBusConfig *config,
+ const gchar *section,
+ const gchar *name,
+ GValue *value,
+ IBusM17NEngineClass *klass);
static GObject*
ibus_m17n_engine_constructor (GType type,
guint n_construct_params,
GObjectConstructParam *construct_params);
+static void ibus_m17n_engine_init (IBusM17NEngine *m17n);
static void ibus_m17n_engine_destroy (IBusM17NEngine *m17n);
static gboolean
ibus_m17n_engine_process_key_event
@@ -77,13 +110,9 @@ static void ibus_m17n_engine_update_lookup_table
(IBusM17NEngine *m17n);
static IBusEngineClass *parent_class = NULL;
-static GHashTable *im_table = NULL;
static IBusConfig *config = NULL;
-static guint preedit_foreground = INVALID_COLOR;
-static guint preedit_background = INVALID_COLOR;
-static gint preedit_underline = IBUS_ATTR_UNDERLINE_NONE;
-static gint lookup_table_orientation = IBUS_ORIENTATION_SYSTEM;
+static IBusM17NTypeModule *module = NULL;
void
ibus_m17n_init (IBusBus *bus)
@@ -92,31 +121,149 @@ ibus_m17n_init (IBusBus *bus)
if (config)
g_object_ref_sink (config);
ibus_m17n_init_common ();
+
+ module = g_object_new (IBUS_TYPE_M17N_TYPE_MODULE, NULL);
}
-GType
-ibus_m17n_engine_get_type (void)
+static gboolean
+ibus_m17n_type_module_load (GTypeModule *module)
+{
+ return TRUE;
+}
+
+static void
+ibus_m17n_type_module_unload (GTypeModule *module)
+{
+}
+
+static void
+ibus_m17n_type_module_class_init (IBusM17NTypeModuleClass *klass)
+{
+ GTypeModuleClass *module_class = G_TYPE_MODULE_CLASS (klass);
+
+ module_class->load = ibus_m17n_type_module_load;
+ module_class->unload = ibus_m17n_type_module_unload;
+}
+
+static GType
+ibus_m17n_type_module_get_type (void)
{
static GType type = 0;
static const GTypeInfo type_info = {
+ sizeof (IBusM17NTypeModuleClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) ibus_m17n_type_module_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL,
+ sizeof (IBusM17NTypeModule),
+ 0,
+ (GInstanceInitFunc) NULL,
+ };
+
+ if (type == 0) {
+ type = g_type_register_static (G_TYPE_TYPE_MODULE,
+ "IBusM17NTypeModule",
+ &type_info,
+ (GTypeFlags) 0);
+ }
+
+ return type;
+}
+
+static gboolean
+ibus_m17n_scan_engine_name (const gchar *engine_name,
+ gchar **lang,
+ gchar **name)
+{
+ gchar **strv;
+
+ g_return_val_if_fail (g_str_has_prefix (engine_name, "m17n:"), FALSE);
+ strv = g_strsplit (engine_name, ":", 3);
+
+ if (g_strv_length (strv) != 3) {
+ g_strfreev (strv);
+ g_return_val_if_reached (FALSE);
+ }
+
+ *lang = strv[1];
+ *name = strv[2];
+
+ g_free (strv[0]);
+ g_free (strv);
+
+ return TRUE;
+}
+
+static gboolean
+ibus_m17n_scan_class_name (const gchar *class_name,
+ gchar **lang,
+ gchar **name)
+{
+ gchar *p;
+
+ g_return_val_if_fail (g_str_has_prefix (class_name, "IBusM17N"), FALSE);
+ g_return_val_if_fail (g_str_has_suffix (class_name, "Engine"), FALSE);
+
+ /* Strip prefix and suffix */
+ p = *lang = g_strdup (class_name + 8);
+ p = g_strrstr (p, "Engine");
+ *p = '\0';
+
+ /* Find the start position of <Name> */
+ while (g_ascii_islower (*--p) && p > *lang)
+ ;
+ g_return_val_if_fail (p > *lang, FALSE);
+ *name = g_strdup (p);
+ *p = '\0';
+
+ *lang[0] = g_ascii_tolower (*lang[0]);
+ *name[0] = g_ascii_tolower (*name[0]);
+
+ return TRUE;
+}
+
+GType
+ibus_m17n_engine_get_type_for_name (const gchar *engine_name)
+{
+ GType type;
+ gchar *type_name, *lang = NULL, *name = NULL;
+
+ GTypeInfo type_info = {
sizeof (IBusM17NEngineClass),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) ibus_m17n_engine_class_init,
- NULL,
+ (GClassFinalizeFunc)ibus_m17n_engine_class_finalize,
NULL,
sizeof (IBusM17NEngine),
0,
(GInstanceInitFunc) ibus_m17n_engine_init,
};
+ if (!ibus_m17n_scan_engine_name (engine_name, &lang, &name)) {
+ g_free (lang);
+ g_free (name);
+ return G_TYPE_INVALID;
+ }
+ lang[0] = g_ascii_toupper (lang[0]);
+ name[0] = g_ascii_toupper (name[0]);
+ type_name = g_strdup_printf ("IBusM17N%s%sEngine", lang, name);
+ g_free (lang);
+ g_free (name);
+
+ type = g_type_from_name (type_name);
+ g_assert (type == 0 || g_type_is_a (type, IBUS_TYPE_ENGINE));
+
if (type == 0) {
- type = g_type_register_static (IBUS_TYPE_ENGINE,
- "IBusM17NEngine",
- &type_info,
- (GTypeFlags) 0);
+ type = g_type_module_register_type (G_TYPE_MODULE (module),
+ IBUS_TYPE_ENGINE,
+ type_name,
+ &type_info,
+ (GTypeFlags) 0);
}
+ g_free (type_name);
return type;
}
@@ -127,8 +274,12 @@ ibus_m17n_engine_class_init (IBusM17NEngineClass *klass)
GObjectClass *object_class = G_OBJECT_CLASS (klass);
IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass);
IBusEngineClass *engine_class = IBUS_ENGINE_CLASS (klass);
+ GValue value = { 0 };
+ gchar *engine_name, *lang = NULL, *name = NULL;
+ IBusM17NEngineConfig *engine_config;
- parent_class = (IBusEngineClass *) g_type_class_peek_parent (klass);
+ if (parent_class == NULL)
+ parent_class = (IBusEngineClass *) g_type_class_peek_parent (klass);
object_class->constructor = ibus_m17n_engine_constructor;
ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_m17n_engine_destroy;
@@ -149,50 +300,117 @@ ibus_m17n_engine_class_init (IBusM17NEngineClass *klass)
2010-11-05 02:42:24 +00:00
engine_class->cursor_down = ibus_m17n_engine_cursor_down;
engine_class->property_activate = ibus_m17n_engine_property_activate;
+
2010-12-08 09:25:29 +00:00
+ if (!ibus_m17n_scan_class_name (G_OBJECT_CLASS_NAME (klass),
+ &lang, &name)) {
+ g_free (lang);
+ g_free (name);
+ return;
+ }
+ engine_name = g_strdup_printf ("m17n:%s:%s", lang, name);
+ klass->config_section = g_strdup_printf ("engine/M17N/%s/%s", lang, name);
+ g_free (lang);
+ g_free (name);
+
+ /* configurations are per class */
+ klass->preedit_foreground = INVALID_COLOR;
+ klass->preedit_background = INVALID_COLOR;
+ klass->preedit_underline = IBUS_ATTR_UNDERLINE_NONE;
+ klass->lookup_table_orientation = IBUS_ORIENTATION_SYSTEM;
+
+ engine_config = ibus_m17n_get_engine_config (engine_name);
+ g_free (engine_name);
+
+ if (ibus_config_get_value (config,
+ klass->config_section,
+ "preedit_foreground",
+ &value)) {
+ const gchar *hex = g_value_get_string (&value);
+
+ klass->preedit_foreground = ibus_m17n_parse_color (hex);
+ g_value_unset (&value);
+ } else if (engine_config->preedit_highlight)
+ klass->preedit_foreground = PREEDIT_FOREGROUND;
+
+ if (ibus_config_get_value (config,
+ klass->config_section,
+ "preedit_background",
+ &value)) {
+ const gchar *hex = g_value_get_string (&value);
+
+ klass->preedit_background = ibus_m17n_parse_color (hex);
+ g_value_unset (&value);
+ } else if (engine_config->preedit_highlight)
+ klass->preedit_background = PREEDIT_BACKGROUND;
+
+ if (ibus_config_get_value (config,
+ klass->config_section,
+ "preedit_underline",
+ &value)) {
+ klass->preedit_underline = g_value_get_int (&value);
+ g_value_unset (&value);
+ } else
+ klass->preedit_underline = IBUS_ATTR_UNDERLINE_NONE;
+
+ if (ibus_config_get_value (config,
+ klass->config_section,
+ "lookup_table_orientation",
+ &value)) {
+ klass->lookup_table_orientation = g_value_get_int (&value);
+ g_value_unset (&value);
+ } else
+ klass->lookup_table_orientation = IBUS_ORIENTATION_SYSTEM;
+
+ g_signal_connect (config, "value-changed",
+ G_CALLBACK(ibus_m17n_config_value_changed),
+ klass);
+
+ klass->im = NULL;
2010-11-05 02:42:24 +00:00
}
static void
2010-12-08 09:25:29 +00:00
-ibus_config_value_changed (IBusConfig *config,
- const gchar *section,
- const gchar *name,
- GValue *value,
- gpointer user_data)
+ibus_m17n_config_value_changed (IBusConfig *config,
+ const gchar *section,
+ const gchar *name,
+ GValue *value,
+ IBusM17NEngineClass *klass)
{
- IBusM17NEngine *m17n = (IBusM17NEngine *) user_data;
-
- if (g_strcmp0 (section, m17n->config_section) == 0) {
+ if (g_strcmp0 (section, klass->config_section) == 0) {
if (g_strcmp0 (name, "preedit_foreground") == 0) {
const gchar *hex = g_value_get_string (value);
guint color;
color = ibus_m17n_parse_color (hex);
if (color != INVALID_COLOR) {
- preedit_foreground = color;
- ibus_m17n_engine_update_preedit (m17n);
+ klass->preedit_foreground = color;
}
} else if (g_strcmp0 (name, "preedit_background") == 0) {
const gchar *hex = g_value_get_string (value);
guint color;
color = ibus_m17n_parse_color (hex);
if (color != INVALID_COLOR) {
- preedit_background = color;
- ibus_m17n_engine_update_preedit (m17n);
+ klass->preedit_background = color;
}
} else if (g_strcmp0 (name, "preedit_underline") == 0) {
- preedit_underline = g_value_get_int (value);
- ibus_m17n_engine_update_preedit (m17n);
+ klass->preedit_underline = g_value_get_int (value);
} else if (g_strcmp0 (name, "lookup_table_orientation") == 0) {
- lookup_table_orientation = g_value_get_int (value);
- ibus_m17n_engine_update_lookup_table (m17n);
+ klass->lookup_table_orientation = g_value_get_int (value);
}
2010-11-05 02:42:24 +00:00
}
2010-12-08 09:25:29 +00:00
}
static void
+ibus_m17n_engine_class_finalize (IBusM17NEngineClass *klass)
+{
+ if (klass->im)
+ minput_close_im (klass->im);
+ g_free (klass->config_section);
+}
+
+static void
ibus_m17n_engine_init (IBusM17NEngine *m17n)
{
IBusText* label;
IBusText* tooltip;
- const gchar *engine_name;
2010-11-05 02:42:24 +00:00
2010-12-08 09:25:29 +00:00
m17n->status_prop = ibus_property_new ("status",
PROP_TYPE_NORMAL,
@@ -234,123 +452,60 @@ ibus_m17n_engine_constructor (GType type,
GObjectConstructParam *construct_params)
{
IBusM17NEngine *m17n;
- MInputMethod *im;
- const gchar *engine_name;
- gchar *lang;
- gchar *name;
- gchar **strv;
- GValue value = { 0 };
- gboolean preedit_highlight;
+ GObjectClass *object_class;
+ IBusM17NEngineClass *klass;
m17n = (IBusM17NEngine *) G_OBJECT_CLASS (parent_class)->constructor (type,
n_construct_params,
construct_params);
- engine_name = ibus_engine_get_name ((IBusEngine *) m17n);
- g_assert (engine_name);
-
- strv = g_strsplit (engine_name, ":", 3);
+ object_class = G_OBJECT_GET_CLASS (m17n);
+ klass = (IBusM17NEngineClass *) object_class;
+ if (klass->im == NULL) {
+ const gchar *engine_name;
+ gchar *lang = NULL, *name = NULL;
- g_assert (g_strv_length (strv) == 3);
- g_assert (g_strcmp0 (strv[0], "m17n") == 0);
-
- lang = strv[1];
- name = strv[2];
-
- if (im_table == NULL) {
- im_table = g_hash_table_new_full (g_str_hash,
- g_str_equal,
- g_free,
- (GDestroyNotify) minput_close_im);
- }
-
- im = (MInputMethod *) g_hash_table_lookup (im_table, engine_name);
- if (im == NULL) {
- im = minput_open_im (msymbol (lang), msymbol (name), NULL);
- if (im != NULL) {
- mplist_put (im->driver.callback_list, Minput_preedit_start, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_preedit_draw, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_preedit_done, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_status_start, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_status_draw, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_status_done, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_candidates_start, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_candidates_draw, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_candidates_done, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_set_spot, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_toggle, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_reset, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_get_surrounding_text, ibus_m17n_engine_callback);
- mplist_put (im->driver.callback_list, Minput_delete_surrounding_text, ibus_m17n_engine_callback);
-
- g_hash_table_insert (im_table, g_strdup (engine_name), im);
+ engine_name = ibus_engine_get_name ((IBusEngine *) m17n);
+ if (!ibus_m17n_scan_engine_name (engine_name, &lang, &name)) {
+ g_free (lang);
+ g_free (name);
+ return NULL;
}
- }
-
- if (im == NULL) {
- g_warning ("Can not find m17n keymap %s", engine_name);
- g_strfreev (strv);
- g_object_unref (m17n);
- return NULL;
- }
-
2010-11-05 02:42:24 +00:00
- m17n->context = minput_create_ic (im, NULL);
- mplist_add (m17n->context->plist, msymbol ("IBusEngine"), m17n);
2010-12-08 09:25:29 +00:00
-
- m17n->config_section = g_strdup_printf ("engine/M17N/%s/%s",
- lang, name);
- g_strfreev (strv);
-
- preedit_highlight = ibus_m17n_preedit_highlight (engine_name);
- if (ibus_config_get_value (config,
- m17n->config_section,
- "preedit_foreground",
- &value)) {
- const gchar *hex = g_value_get_string (&value);
- guint color = ibus_m17n_parse_color (hex);
- if (color != (guint)-1)
- preedit_foreground = color;
- g_value_unset (&value);
- } else if (preedit_highlight)
- preedit_foreground = PREEDIT_FOREGROUND;
- if (ibus_config_get_value (config,
- m17n->config_section,
- "preedit_background",
- &value)) {
- const gchar *hex = g_value_get_string (&value);
- guint color = ibus_m17n_parse_color (hex);
- if (color != (guint)-1)
- preedit_background = color;
- g_value_unset (&value);
- } else if (preedit_highlight)
- preedit_background = PREEDIT_BACKGROUND;
+ klass->im = minput_open_im (msymbol (lang), msymbol (name), NULL);
+ g_free (lang);
+ g_free (name);
- if (ibus_config_get_value (config,
- m17n->config_section,
- "preedit_underline",
- &value)) {
- preedit_underline = g_value_get_int (&value);
- g_value_unset (&value);
- } else
- preedit_underline = IBUS_ATTR_UNDERLINE_NONE;
-
- if (ibus_config_get_value (config,
- m17n->config_section,
- "lookup_table_orientation",
- &value)) {
- lookup_table_orientation = g_value_get_int (&value);
- g_value_unset (&value);
- } else
- lookup_table_orientation = IBUS_ORIENTATION_SYSTEM;
+ if (klass->im == NULL) {
+ g_warning ("Can not find m17n keymap %s", engine_name);
+ g_object_unref (m17n);
+ return NULL;
+ }
- g_signal_connect (config, "value-changed",
- G_CALLBACK(ibus_config_value_changed), m17n);
+ mplist_put (klass->im->driver.callback_list, Minput_preedit_start, ibus_m17n_engine_callback);
+ mplist_put (klass->im->driver.callback_list, Minput_preedit_draw, ibus_m17n_engine_callback);
+ mplist_put (klass->im->driver.callback_list, Minput_preedit_done, ibus_m17n_engine_callback);
+ mplist_put (klass->im->driver.callback_list, Minput_status_start, ibus_m17n_engine_callback);
+ mplist_put (klass->im->driver.callback_list, Minput_status_draw, ibus_m17n_engine_callback);
+ mplist_put (klass->im->driver.callback_list, Minput_status_done, ibus_m17n_engine_callback);
+ mplist_put (klass->im->driver.callback_list, Minput_candidates_start, ibus_m17n_engine_callback);
+ mplist_put (klass->im->driver.callback_list, Minput_candidates_draw, ibus_m17n_engine_callback);
+ mplist_put (klass->im->driver.callback_list, Minput_candidates_done, ibus_m17n_engine_callback);
+ mplist_put (klass->im->driver.callback_list, Minput_set_spot, ibus_m17n_engine_callback);
+ mplist_put (klass->im->driver.callback_list, Minput_toggle, ibus_m17n_engine_callback);
+ /*
+ Does not set reset callback, uses the default callback in m17n.
+ mplist_put (klass->im->driver.callback_list, Minput_reset, ibus_m17n_engine_callback);
+ */
+ mplist_put (klass->im->driver.callback_list, Minput_get_surrounding_text, ibus_m17n_engine_callback);
+ mplist_put (klass->im->driver.callback_list, Minput_delete_surrounding_text, ibus_m17n_engine_callback);
+ }
+
+ m17n->context = minput_create_ic (klass->im, m17n);
return (GObject *) m17n;
}
-
static void
ibus_m17n_engine_destroy (IBusM17NEngine *m17n)
{
@@ -379,11 +534,6 @@ ibus_m17n_engine_destroy (IBusM17NEngine *m17n)
m17n->context = NULL;
}
- if (m17n->config_section) {
- g_free (m17n->config_section);
- m17n->config_section = NULL;
- }
-
IBUS_OBJECT_CLASS (parent_class)->destroy ((IBusObject *)m17n);
}
2010-11-05 02:42:24 +00:00
2010-12-08 09:25:29 +00:00
@@ -392,18 +542,19 @@ ibus_m17n_engine_update_preedit (IBusM17NEngine *m17n)
{
IBusText *text;
gchar *buf;
+ IBusM17NEngineClass *klass = (IBusM17NEngineClass *) G_OBJECT_GET_CLASS (m17n);
buf = ibus_m17n_mtext_to_utf8 (m17n->context->preedit);
if (buf) {
text = ibus_text_new_from_static_string (buf);
- if (preedit_foreground != INVALID_COLOR)
+ if (klass->preedit_foreground != INVALID_COLOR)
ibus_text_append_attribute (text, IBUS_ATTR_TYPE_FOREGROUND,
- preedit_foreground, 0, -1);
- if (preedit_background != INVALID_COLOR)
+ klass->preedit_foreground, 0, -1);
+ if (klass->preedit_background != INVALID_COLOR)
ibus_text_append_attribute (text, IBUS_ATTR_TYPE_BACKGROUND,
- preedit_background, 0, -1);
+ klass->preedit_background, 0, -1);
ibus_text_append_attribute (text, IBUS_ATTR_TYPE_UNDERLINE,
- preedit_underline, 0, -1);
+ klass->preedit_underline, 0, -1);
ibus_engine_update_preedit_text ((IBusEngine *) m17n,
text,
m17n->context->cursor_pos,
@@ -421,9 +572,9 @@ ibus_m17n_engine_commit_string (IBusM17NEngine *m17n,
2010-10-14 03:30:14 +00:00
ibus_m17n_engine_update_preedit (m17n);
}
-/* Note on AltGr handling: While currently we expect AltGr == mod5, it
- would be better to not expect the modifier always be assigned
- to particular modX. However, it needs some code like:
+/* Note on AltGr (Level3 Shift) handling: While currently we expect
+ AltGr == mod5, it would be better to not expect the modifier always
+ be assigned to particular modX. However, it needs some code like:
KeyCode altgr = XKeysymToKeycode (display, XK_ISO_Level3_Shift);
XModifierKeymap *mods = XGetModifierMapping (display);
2010-12-08 09:25:29 +00:00
@@ -445,20 +596,26 @@ ibus_m17n_key_event_to_symbol (guint keycode,
2010-10-14 03:30:14 +00:00
MSymbol mkeysym = Mnil;
guint mask = 0;
IBusKeymap *keymap;
- guint base_keyval;
if (keyval >= IBUS_Shift_L && keyval <= IBUS_Hyper_R) {
return Mnil;
}
- keymap = ibus_keymap_get ("us");
- base_keyval = ibus_keymap_lookup_keysym (keymap, keycode, 0);
- g_object_unref (keymap);
+ /* Here, keyval is already translated by IBUS_MOD5_MASK. Obtain
+ the untranslated keyval from the underlying keymap and
+ represent the translated keyval as the form "G-<untranslated
+ keyval>", which m17n-lib accepts. */
+ if (modifiers & IBUS_MOD5_MASK) {
+ keymap = ibus_keymap_get ("us");
+ keyval = ibus_keymap_lookup_keysym (keymap, keycode,
+ modifiers & ~IBUS_MOD5_MASK);
+ g_object_unref (keymap);
+ }
keysym = g_string_new ("");
- if (base_keyval >= IBUS_space && base_keyval <= IBUS_asciitilde) {
- gint c = (modifiers & IBUS_MOD5_MASK) ? base_keyval : keyval;
+ if (keyval >= IBUS_space && keyval <= IBUS_asciitilde) {
+ gint c = keyval;
if (keyval == IBUS_space && modifiers & IBUS_SHIFT_MASK)
mask |= IBUS_SHIFT_MASK;
2010-12-08 09:25:29 +00:00
@@ -572,7 +729,7 @@ ibus_m17n_engine_focus_in (IBusEngine *engine)
2010-11-05 02:42:24 +00:00
IBusM17NEngine *m17n = (IBusM17NEngine *) engine;
ibus_engine_register_properties (engine, m17n->prop_list);
- ibus_m17n_engine_process_key (m17n, msymbol ("input-focus-in"));
+ ibus_m17n_engine_process_key (m17n, Minput_focus_in);
parent_class->focus_in (engine);
}
2010-12-08 09:25:29 +00:00
@@ -582,7 +739,7 @@ ibus_m17n_engine_focus_out (IBusEngine *engine)
2010-11-05 02:42:24 +00:00
{
IBusM17NEngine *m17n = (IBusM17NEngine *) engine;
- ibus_m17n_engine_process_key (m17n, msymbol ("input-focus-out"));
+ ibus_m17n_engine_process_key (m17n, Minput_focus_out);
parent_class->focus_out (engine);
}
2010-12-08 09:25:29 +00:00
@@ -593,7 +750,8 @@ ibus_m17n_engine_reset (IBusEngine *engine)
2010-11-05 02:42:24 +00:00
IBusM17NEngine *m17n = (IBusM17NEngine *) engine;
parent_class->reset (engine);
- ibus_m17n_engine_focus_in (engine);
+
+ minput_reset_ic (m17n->context);
}
static void
2010-12-08 09:25:29 +00:00
@@ -676,7 +834,7 @@ ibus_m17n_engine_property_activate (IBusEngine *engine,
2010-11-05 02:42:24 +00:00
static void
ibus_m17n_engine_update_lookup_table (IBusM17NEngine *m17n)
{
- ibus_lookup_table_clear (m17n->table);
+ ibus_lookup_table_clear (m17n->table);
if (m17n->context->candidate_list && m17n->context->candidate_show) {
IBusText *text;
2010-12-08 09:25:29 +00:00
@@ -684,6 +842,7 @@ ibus_m17n_engine_update_lookup_table (IBusM17NEngine *m17n)
group = m17n->context->candidate_list;
gint i = 0;
gint page = 1;
+ IBusM17NEngineClass *klass = (IBusM17NEngineClass *) G_OBJECT_GET_CLASS (m17n);
while (1) {
gint len;
@@ -734,7 +893,7 @@ ibus_m17n_engine_update_lookup_table (IBusM17NEngine *m17n)
}
ibus_lookup_table_set_cursor_pos (m17n->table, m17n->context->candidate_index - i);
- ibus_lookup_table_set_orientation (m17n->table, lookup_table_orientation);
+ ibus_lookup_table_set_orientation (m17n->table, klass->lookup_table_orientation);
text = ibus_text_new_from_printf ("( %d / %d )", page, mplist_length (m17n->context->candidate_list));
@@ -752,15 +911,14 @@ ibus_m17n_engine_callback (MInputContext *context,
2010-11-05 02:42:24 +00:00
MSymbol command)
{
IBusM17NEngine *m17n = NULL;
- MPlist *p = NULL;
- p = mplist_find_by_key (context->plist, msymbol ("IBusEngine"));
- if (p) {
- m17n = (IBusM17NEngine *) mplist_value (p);
- }
+ m17n = context->arg;
+ g_return_if_fail (m17n != NULL);
- if (m17n == NULL) {
- return;
+ /* the callback may be called in minput_create_ic, in the time
+ * m17n->context has not be assigned, so need assign it. */
+ if (m17n->context == NULL) {
+ m17n->context = context;
}
if (command == Minput_preedit_start) {
2010-12-08 09:25:29 +00:00
diff --git a/src/engine.h b/src/engine.h
index 7c0b4d9..bdd6492 100644
--- a/src/engine.h
+++ b/src/engine.h
@@ -4,9 +4,6 @@
#include <ibus.h>
-#define IBUS_TYPE_M17N_ENGINE \
- (ibus_m17n_engine_get_type ())
-
-GType ibus_m17n_engine_get_type (void);
+GType ibus_m17n_engine_get_type_for_name (const gchar *name);
#endif
diff --git a/src/m17n.xml.in.in b/src/m17n.xml.in.in
index 3ea4394..97d72d2 100644
--- a/src/m17n.xml.in.in
+++ b/src/m17n.xml.in.in
@@ -11,6 +11,7 @@
<textdomain>ibus-m17n</textdomain>
<observed-paths>
<path>/usr/share/m17n/</path>
+ <path>${setupdir}/default.xml</path>
</observed-paths>
<engines exec=\"${libexecdir}/ibus-engine-m17n --xml\" />
</component>
2010-10-14 03:30:14 +00:00
diff --git a/src/m17nutil.c b/src/m17nutil.c
2010-12-10 06:43:35 +00:00
index ae0fe56..6d6961f 100644
2010-10-14 03:30:14 +00:00
--- a/src/m17nutil.c
+++ b/src/m17nutil.c
2010-12-10 06:43:35 +00:00
@@ -7,39 +7,17 @@
2010-10-14 03:30:14 +00:00
static MConverter *utf8_converter = NULL;
-static const gchar *keymap[] = {
- "m17n:as:phonetic",
- "m17n:bn:inscript",
- "m17n:gu:inscript",
- "m17n:hi:inscript",
- "m17n:kn:kgp",
- "m17n:ks:kbd",
- "m17n:mai:inscript",
- "m17n:ml:inscript",
- "m17n:mr:inscript",
- "m17n:ne:rom",
- "m17n:or:inscript",
- "m17n:pa:inscript",
- "m17n:sa:harvard-kyoto",
- "m17n:sd:inscript",
- "m17n:si:wijesekera",
- "m17n:ta:tamil99",
- "m17n:te:inscript"
2010-12-10 06:43:35 +00:00
-};
2010-12-08 09:25:29 +00:00
+#define DEFAULT_XML (SETUPDIR "/default.xml")
2010-10-14 03:30:14 +00:00
-static const gchar *preedit_highlight[] = {
- "m17n:ja:anthy",
- "m17n:zh:cangjie",
- "m17n:zh:py-b5",
- "m17n:zh:py-gb",
- "m17n:zh:py",
- "m17n:zh:quick",
- "m17n:zh:tonepy-b5",
- "m17n:zh:tonepy-gb",
- "m17n:zh:tonepy",
- "m17n:zh:util",
2010-12-08 09:25:29 +00:00
+struct _IBusM17NEngineConfigNode {
+ gchar *name;
+ IBusM17NEngineConfig config;
2010-10-14 03:30:14 +00:00
};
2010-12-08 09:25:29 +00:00
+typedef struct _IBusM17NEngineConfigNode IBusM17NEngineConfigNode;
+
+static GSList *config_list = NULL;
+
2010-10-14 03:30:14 +00:00
void
2010-12-08 09:25:29 +00:00
ibus_m17n_init_common (void)
{
2010-12-10 06:43:35 +00:00
@@ -101,11 +79,16 @@ guint
2010-10-14 03:30:14 +00:00
ibus_m17n_parse_color (const gchar *hex)
{
guint color;
- if (hex && *hex == '#' &&
- ((color = strtoul (&hex[1], NULL, 16)) != ULONG_MAX ||
- errno != ERANGE))
- return color;
- return (guint)-1;
+
+ if (!hex || *hex != '#')
+ return (guint)-1;
+
+ errno = 0;
+ color = strtoul (&hex[1], NULL, 16);
+ if ((errno == ERANGE && color == ULONG_MAX)
+ || (errno != 0 && color == 0))
+ return (guint)-1;
+ return color;
}
static IBusEngineDesc *
2010-12-10 06:43:35 +00:00
@@ -113,7 +96,8 @@ ibus_m17n_engine_new (MSymbol lang,
MSymbol name,
MText *title,
MText *icon,
- MText *desc)
+ MText *desc,
+ IBusM17NEngineConfig *config)
{
IBusEngineDesc *engine;
gchar *engine_name;
@@ -121,7 +105,6 @@ ibus_m17n_engine_new (MSymbol lang,
2010-12-08 09:25:29 +00:00
gchar *engine_title;
gchar *engine_icon;
gchar *engine_desc;
- gint i;
engine_name = g_strdup_printf ("m17n:%s:%s", msymbol_name (lang), msymbol_name (name));
2010-12-10 06:43:35 +00:00
@@ -138,16 +121,7 @@ ibus_m17n_engine_new (MSymbol lang,
"",
engine_icon ? engine_icon : "",
"us");
- /* set default rank to 0 */
- engine->rank = 0;
-
2010-10-14 03:30:14 +00:00
- for (i = 0; i < G_N_ELEMENTS(keymap); i++) {
- if (strcmp (engine_name, keymap[i]) == 0) {
2010-12-08 09:25:29 +00:00
- /* set rank of default keymap to 1 */
2010-10-14 03:30:14 +00:00
- engine->rank = 1;
2010-12-08 09:25:29 +00:00
- break;
- }
- }
2010-12-10 06:43:35 +00:00
+ engine->rank = config->rank;
2010-12-08 09:25:29 +00:00
g_free (engine_name);
g_free (engine_longname);
2010-12-10 06:43:35 +00:00
@@ -178,10 +152,28 @@ ibus_m17n_list_engines (void)
MText *icon = NULL;
MText *desc = NULL;
MPlist *l;
+ gchar *engine_name;
+ IBusM17NEngineConfig *config;
lang = tag[1];
name = tag[2];
+ /* ignore input-method explicitly blacklisted in default.xml */
+ engine_name = g_strdup_printf ("m17n:%s:%s", msymbol_name (lang), msymbol_name (name));
+ config = ibus_m17n_get_engine_config (engine_name);
+ if (config == NULL) {
+ g_warning ("can't load config for %s", engine_name);
+ g_free (engine_name);
+ continue;
+ }
+ if (config->rank < 0) {
+ g_warning ("skipped %s since its rank is lower than 0",
+ engine_name);
+ g_free (engine_name);
+ continue;
+ }
+ g_free (engine_name);
+
l = minput_get_variable (lang, name, msymbol ("candidates-charset"));
if (l) {
/* check candidates encoding */
@@ -226,7 +218,7 @@ ibus_m17n_list_engines (void)
icon = mplist_value (n);
}
- engines = g_list_append (engines, ibus_m17n_engine_new (lang, name, title, icon, desc));
+ engines = g_list_append (engines, ibus_m17n_engine_new (lang, name, title, icon, desc, config));
if (desc)
m17n_object_unref (desc);
@@ -241,11 +233,58 @@ ibus_m17n_list_engines (void)
2010-12-08 09:25:29 +00:00
return engines;
}
+IBusM17NEngineConfig *
+ibus_m17n_get_engine_config (const gchar *engine_name)
+{
+ GSList *p;
+
+ for (p = config_list; p != NULL; p = p->next) {
+ IBusM17NEngineConfigNode *cnode = p->data;
+
+ if (g_pattern_match_simple (cnode->name, engine_name))
+ return &cnode->config;
+ }
2010-12-10 06:43:35 +00:00
+ g_return_val_if_reached (NULL);
2010-12-08 09:25:29 +00:00
+}
+
+static gboolean
+ibus_m17n_engine_config_parse_xml_node (IBusM17NEngineConfigNode *cnode,
+ XMLNode *node)
+{
+ GList *p;
+
+ for (p = node->sub_nodes; p != NULL; p = p->next) {
+ XMLNode *sub_node = (XMLNode *) p->data;
+
+ if (g_strcmp0 (sub_node->name, "name") == 0) {
+ g_free (cnode->name);
+ cnode->name = g_strdup (sub_node->text);
+ continue;
+ }
+ if (g_strcmp0 (sub_node->name , "rank") == 0) {
+ cnode->config.rank = atoi (sub_node->text);
+ continue;
+ }
+ if (g_strcmp0 (sub_node->name , "preedit-highlight") == 0) {
+ if (g_ascii_strcasecmp ("TRUE", sub_node->text) == 0)
+ cnode->config.preedit_highlight = TRUE;
+ else if (g_ascii_strcasecmp ("FALSE", sub_node->text) != 0)
+ g_warning ("<%s> element contains invalid boolean value %s",
+ sub_node->name, sub_node->text);
+ continue;
+ }
+ g_warning ("<engine> element contains invalid element <%s>",
+ sub_node->name);
+ }
+ return TRUE;
+}
+
IBusComponent *
ibus_m17n_get_component (void)
2010-10-14 03:30:14 +00:00
{
2010-12-08 09:25:29 +00:00
GList *engines, *p;
IBusComponent *component;
+ XMLNode *node;
component = ibus_component_new ("org.freedesktop.IBus.M17n",
N_("M17N"),
2010-12-10 06:43:35 +00:00
@@ -256,26 +295,39 @@ ibus_m17n_get_component (void)
2010-12-08 09:25:29 +00:00
"",
"ibus-m17n");
+ node = ibus_xml_parse_file (DEFAULT_XML);
+ if (node && g_strcmp0 (node->name, "engines") == 0) {
+ for (p = node->sub_nodes; p != NULL; p = p->next) {
+ XMLNode *sub_node = p->data;
+ IBusM17NEngineConfigNode *cnode;
+
+ if (g_strcmp0 (sub_node->name, "engine") != 0) {
+ g_warning ("<engines> element contains invalid element <%s>",
+ sub_node->name);
+ continue;
+ }
+
2010-12-10 06:43:35 +00:00
+ cnode = g_slice_new0 (IBusM17NEngineConfigNode);
2010-12-08 09:25:29 +00:00
+ if (!ibus_m17n_engine_config_parse_xml_node (cnode, sub_node)) {
+ g_slice_free (IBusM17NEngineConfigNode, cnode);
+ continue;
+ }
+ config_list = g_slist_prepend (config_list, cnode);
+ }
+ config_list = g_slist_reverse (config_list);
+ } else
+ g_warning ("failed to parse %s", DEFAULT_XML);
+ if (node)
+ ibus_xml_free (node);
+
engines = ibus_m17n_list_engines ();
2010-10-14 03:30:14 +00:00
2010-12-10 06:43:35 +00:00
- for (p = engines; p != NULL; p = p->next) {
2010-12-08 09:25:29 +00:00
- ibus_component_add_engine (component, (IBusEngineDesc *) p->data);
2010-12-10 06:43:35 +00:00
- }
+ for (p = engines; p != NULL; p = p->next)
+ ibus_component_add_engine (component, p->data);
2010-12-08 09:25:29 +00:00
g_list_free (engines);
- return component;
-}
-gboolean
-ibus_m17n_preedit_highlight (const gchar *engine_name)
-{
- gint i;
-
2010-10-14 03:30:14 +00:00
- for (i = 0; i < G_N_ELEMENTS(preedit_highlight); i++) {
- if (strcmp (engine_name, preedit_highlight[i]) == 0)
- return TRUE;
2010-12-08 09:25:29 +00:00
- }
- return FALSE;
+ return component;
}
#ifdef DEBUG
2010-12-10 06:43:35 +00:00
@@ -304,4 +356,3 @@ int main ()
2010-12-08 09:25:29 +00:00
return 0;
2010-10-14 03:30:14 +00:00
}
2010-12-08 09:25:29 +00:00
#endif
-
diff --git a/src/m17nutil.h b/src/m17nutil.h
2010-12-10 06:43:35 +00:00
index 7561505..a9be667 100644
2010-12-08 09:25:29 +00:00
--- a/src/m17nutil.h
+++ b/src/m17nutil.h
@@ -10,6 +10,16 @@
#define PREEDIT_FOREGROUND 0x00000000
#define PREEDIT_BACKGROUND 0x00c8c8f0
+struct _IBusM17NEngineConfig {
2010-12-10 06:43:35 +00:00
+ /* engine rank */
2010-12-08 09:25:29 +00:00
+ gint rank;
+
2010-12-10 06:43:35 +00:00
+ /* whether to highlight preedit */
2010-12-08 09:25:29 +00:00
+ gboolean preedit_highlight;
+};
+
+typedef struct _IBusM17NEngineConfig IBusM17NEngineConfig;
+
void ibus_m17n_init_common (void);
void ibus_m17n_init (IBusBus *bus);
GList *ibus_m17n_list_engines (void);
@@ -18,5 +28,6 @@ gchar *ibus_m17n_mtext_to_utf8 (MText *text);
gunichar *ibus_m17n_mtext_to_ucs4 (MText *text,
glong *nchars);
guint ibus_m17n_parse_color (const gchar *hex);
-gboolean ibus_m17n_preedit_highlight (const gchar *engine_name);
+IBusM17NEngineConfig
+ *ibus_m17n_get_engine_config (const gchar *engine_name);
#endif
2010-11-05 02:42:24 +00:00
diff --git a/src/main.c b/src/main.c
2010-12-08 09:25:29 +00:00
index b8d7c72..e76898d 100644
2010-11-05 02:42:24 +00:00
--- a/src/main.c
+++ b/src/main.c
2010-12-08 09:25:29 +00:00
@@ -51,7 +51,13 @@ start_component (void)
engines = ibus_component_get_engines (component);
for (p = engines; p != NULL; p = p->next) {
IBusEngineDesc *engine = (IBusEngineDesc *)p->data;
- ibus_factory_add_engine (factory, engine->name, IBUS_TYPE_M17N_ENGINE);
+ GType type = ibus_m17n_engine_get_type_for_name (engine->name);
+
+ if (type == G_TYPE_INVALID) {
+ g_debug ("Can not create engine type for %s", engine->name);
+ continue;
+ }
+ ibus_factory_add_engine (factory, engine->name, type);
}
if (ibus) {
@@ -74,8 +80,7 @@ print_engines_xml (void)
2010-11-05 02:42:24 +00:00
ibus_init ();
- bus = ibus_bus_new ();
- ibus_m17n_init (bus);
+ ibus_m17n_init_common ();
component = ibus_m17n_get_component ();
output = g_string_new ("");
2010-10-14 03:30:14 +00:00
diff --git a/src/setup.c b/src/setup.c
index 7442159..0fe6e1b 100644
--- a/src/setup.c
+++ b/src/setup.c
@@ -83,6 +83,7 @@ parse_value (MPlist *plist, gchar *text)
if (mplist_key (plist) == Minteger) {
long val;
+ errno = 0;
val = strtol (text, NULL, 10);
if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
|| (errno != 0 && val == 0))