aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile.am6
-rw-r--r--lib/indicator-menu.vala7
-rw-r--r--lib/main.vala45
-rw-r--r--lib/source.vala136
4 files changed, 132 insertions, 62 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am
index c57725c1..6543ccd4 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -2,8 +2,7 @@ pkglibexec_PROGRAMS = indicator-keyboard-service
AM_CFLAGS = -w -DGNOME_DESKTOP_USE_UNSTABLE_API
AM_LDFLAGS = -lm
-AM_VALAFLAGS = --enable-experimental-non-null \
- --metadatadir $(top_srcdir)/deps \
+AM_VALAFLAGS = --metadatadir $(top_srcdir)/deps \
--vapidir $(top_srcdir)/deps
indicator_keyboard_service_SOURCES = main.vala \
@@ -26,6 +25,7 @@ indicator_keyboard_service_VALAFLAGS = $(AM_VALAFLAGS) \
--pkg Xkl-1.0 \
--pkg Gkbd-3.0 \
--pkg ibus-1.0 \
+ --pkg fcitx \
--pkg accountsservice \
--pkg liblightdm-gobject-1
indicator_keyboard_service_CFLAGS = $(AM_CFLAGS) \
@@ -36,6 +36,7 @@ indicator_keyboard_service_CFLAGS = $(AM_CFLAGS) \
$(LIBXKLAVIER_CFLAGS) \
$(LIBGNOMEKBD_CFLAGS) \
$(IBUS_CFLAGS) \
+ $(FCITX_GCLIENT_CFLAGS) \
$(ACCOUNTSSERVICE_CFLAGS) \
$(LIGHTDM_CFLAGS) \
$(COVERAGE_CFLAGS)
@@ -47,6 +48,7 @@ indicator_keyboard_service_LDFLAGS = $(AM_LDFLAGS) \
$(LIBXKLAVIER_LIBS) \
$(LIBGNOMEKBD_LIBS) \
$(IBUS_LIBS) \
+ $(FCITX_GCLIENT_LIBS) \
$(ACCOUNTSSERVICE_LIBS) \
$(LIGHTDM_LIBS) \
$(COVERAGE_LDFLAGS)
diff --git a/lib/indicator-menu.vala b/lib/indicator-menu.vala
index 8e5661e2..115adc5f 100644
--- a/lib/indicator-menu.vala
+++ b/lib/indicator-menu.vala
@@ -22,7 +22,8 @@ public class Indicator.Keyboard.IndicatorMenu : MenuModel {
NONE = 0x0,
DCONF = 0x1,
IBUS = 0x2,
- SETTINGS = 0x4
+ FCITX = 0x4,
+ SETTINGS = 0x8
}
private Options options;
@@ -76,7 +77,9 @@ public class Indicator.Keyboard.IndicatorMenu : MenuModel {
sources_section.remove_all ();
for (var i = 0; i < sources.length; i++) {
- if (!sources[i].is_ibus || (options & Options.IBUS) != Options.NONE) {
+ if (sources[i].is_xkb ||
+ (sources[i].is_ibus && (options & Options.IBUS) != Options.NONE) ||
+ (sources[i].is_fcitx && (options & Options.FCITX) != Options.NONE)) {
string action;
if ((options & Options.DCONF) != Options.NONE) {
diff --git a/lib/main.vala b/lib/main.vala
index 1cb3896c..d2ea8c79 100644
--- a/lib/main.vala
+++ b/lib/main.vala
@@ -146,6 +146,18 @@ public class Indicator.Keyboard.Service : Object {
}
[DBus (visible = false)]
+ private static bool is_ibus_active () {
+ var module = Environment.get_variable ("GTK_IM_MODULE");
+ return module != null && (!) module == "ibus";
+ }
+
+ [DBus (visible = false)]
+ private static bool is_fcitx_active () {
+ var module = Environment.get_variable ("GTK_IM_MODULE");
+ return module != null && (!) module == "fcitx";
+ }
+
+ [DBus (visible = false)]
private IBus.Bus get_ibus () {
if (ibus == null) {
IBus.init ();
@@ -788,30 +800,30 @@ public class Indicator.Keyboard.Service : Object {
private void handle_scroll_wheel_when_locked (Variant? parameter) {
if (parameter != null) {
var sources = get_sources ();
- var non_ibus_length = 0;
+ var xkb_length = 0;
- /* Figure out how many non-IBus sources we have. */
+ /* Figure out how many Xkb sources we have. */
foreach (var source in sources) {
- if (!source.is_ibus) {
- non_ibus_length++;
+ if (source.is_xkb) {
+ xkb_length++;
}
}
- if (non_ibus_length > 1) {
+ if (xkb_length > 1) {
var active_action = get_active_action ();
var active = active_action.get_state ().get_uint32 ();
- var offset = -((!) parameter).get_int32 () % non_ibus_length;
+ var offset = -((!) parameter).get_int32 () % xkb_length;
- /* Make offset positive modulo non_ibus_length. */
+ /* Make offset positive modulo xkb_length. */
if (offset < 0) {
- offset += non_ibus_length;
+ offset += xkb_length;
}
- /* We need to cycle through non-IBus sources only. */
+ /* We need to cycle through Xkb sources only. */
while (offset > 0) {
do {
active = (active + 1) % sources.length;
- } while (sources[active].is_ibus);
+ } while (!sources[active].is_xkb);
offset--;
}
@@ -882,9 +894,16 @@ public class Indicator.Keyboard.Service : Object {
public IndicatorMenu get_desktop_menu () {
if (desktop_menu == null) {
var options = IndicatorMenu.Options.DCONF
- | IndicatorMenu.Options.IBUS
| IndicatorMenu.Options.SETTINGS;
+ if (is_ibus_active ()) {
+ options |= IndicatorMenu.Options.IBUS;
+ }
+
+ if (is_fcitx_active ()) {
+ options |= IndicatorMenu.Options.FCITX;
+ }
+
desktop_menu = new IndicatorMenu (get_action_group (), options);
((!) desktop_menu).set_sources (get_sources ());
((!) desktop_menu).activate.connect ((property, state) => {
@@ -1040,9 +1059,9 @@ public class Indicator.Keyboard.Service : Object {
if (sources.length > 0) {
var current = source_settings.get_uint ("current");
- if (current < sources.length && sources[current].is_ibus) {
+ if (current < sources.length && !sources[current].is_xkb) {
for (var i = 0; i < sources.length; i++) {
- if (!sources[i].is_ibus) {
+ if (sources[i].is_xkb) {
get_active_action ().change_state (new Variant.uint32 (i));
break;
}
diff --git a/lib/source.vala b/lib/source.vala
index 5fe7157d..2777f521 100644
--- a/lib/source.vala
+++ b/lib/source.vala
@@ -19,10 +19,12 @@
public class Indicator.Keyboard.Source : Object {
private static Gnome.XkbInfo? xkb_info;
- private static IBus.Bus? bus;
+ private static IBus.Bus? ibus_bus;
+ private static Fcitx.InputMethod? fcitx_proxy;
private string? xkb;
private string? ibus;
+ private string? fcitx;
private string? _name;
private string? _short_name;
@@ -77,6 +79,10 @@ public class Indicator.Keyboard.Source : Object {
get { return ibus != null; }
}
+ public bool is_fcitx {
+ get { return fcitx != null; }
+ }
+
public Source (Variant variant, bool use_gtk = false) {
Object (use_gtk: use_gtk);
@@ -90,6 +96,8 @@ public class Indicator.Keyboard.Source : Object {
xkb = name;
} else if (type == "ibus") {
ibus = name;
+ } else if (type == "fcitx") {
+ fcitx = name;
}
} else if (variant.is_of_type (new VariantType ("a{ss}"))) {
VariantIter iter;
@@ -103,6 +111,8 @@ public class Indicator.Keyboard.Source : Object {
xkb = value;
} else if (key == "ibus") {
ibus = value;
+ } else if (key == "fcitx") {
+ fcitx = value;
}
}
}
@@ -116,13 +126,21 @@ public class Indicator.Keyboard.Source : Object {
return (!) xkb_info;
}
- private static IBus.Bus get_bus () {
- if (bus == null) {
+ private static IBus.Bus get_ibus_bus () {
+ if (ibus_bus == null) {
IBus.init ();
- bus = new IBus.Bus ();
+ ibus_bus = new IBus.Bus ();
}
- return (!) bus;
+ return (!) ibus_bus;
+ }
+
+ private static Fcitx.InputMethod get_fcitx_proxy () throws Error {
+ if (fcitx_proxy == null) {
+ fcitx_proxy = new Fcitx.InputMethod (GLib.BusType.SESSION, GLib.DBusProxyFlags.NONE, 0);
+ }
+
+ return (!) fcitx_proxy;
}
private IBus.EngineDesc? get_engine () {
@@ -132,7 +150,7 @@ public class Indicator.Keyboard.Source : Object {
var names = new string[2];
names[0] = (!) ibus;
- var engines = get_bus ().get_engines_by_names (names);
+ var engines = get_ibus_bus ().get_engines_by_names (names);
if (engines.length > 0) {
engine = engines[0];
@@ -145,31 +163,7 @@ public class Indicator.Keyboard.Source : Object {
protected virtual string? _get_name () {
string? name = null;
- var engine = get_engine ();
-
- if (engine != null) {
- string? language = ((!) engine).get_language ();
- string? display_name = ((!) engine).get_longname ();
- var has_language = language != null && ((!) language).get_char () != '\0';
- var has_display_name = display_name != null && ((!) display_name).get_char () != '\0';
-
- if (has_language) {
- language = Xkl.get_language_name ((!) language);
- has_language = language != null && ((!) language).get_char () != '\0';
- }
-
- if (has_language && has_display_name) {
- name = @"$((!) language) ($((!) display_name))";
- } else if (has_language) {
- name = language;
- } else if (has_display_name) {
- name = display_name;
- }
- }
-
- var has_name = name != null && ((!) name).get_char () != '\0';
-
- if (!has_name && xkb != null) {
+ if (xkb != null) {
string? display_name = null;
string? layout = null;
@@ -194,14 +188,53 @@ public class Indicator.Keyboard.Source : Object {
name = country;
}
}
- }
- if (name == null || ((!) name).get_char () == '\0') {
- if (ibus != null) {
- name = ibus;
- } else if (xkb != null) {
+ if (name == null || ((!) name).get_char () == '\0') {
name = xkb;
}
+ } else if (ibus != null) {
+ var engine = get_engine ();
+
+ if (engine != null) {
+ string? language = ((!) engine).get_language ();
+ string? display_name = ((!) engine).get_longname ();
+ var has_language = language != null && ((!) language).get_char () != '\0';
+ var has_display_name = display_name != null && ((!) display_name).get_char () != '\0';
+
+ if (has_language) {
+ language = Xkl.get_language_name ((!) language);
+ has_language = language != null && ((!) language).get_char () != '\0';
+ }
+
+ if (has_language && has_display_name) {
+ name = @"$((!) language) ($((!) display_name))";
+ } else if (has_language) {
+ name = language;
+ } else if (has_display_name) {
+ name = display_name;
+ }
+ }
+
+ if (name == null || ((!) name).get_char () == '\0') {
+ name = ibus;
+ }
+ } else if (fcitx != null) {
+ try {
+ var input_methods = get_fcitx_proxy ().get_imlist_nofree ();
+
+ for (var i = 0; i < input_methods.length; i++) {
+ if (input_methods.get (i).unique_name == (!) fcitx) {
+ name = input_methods.get (i).name;
+ break;
+ }
+ }
+ } catch (Error error) {
+ warning ("error: %s", error.message);
+ }
+
+ if (name == null || ((!) name).get_char () == '\0') {
+ name = fcitx;
+ }
}
return name;
@@ -212,23 +245,36 @@ public class Indicator.Keyboard.Source : Object {
if (xkb != null) {
get_xkb_info ().get_layout_info ((!) xkb, null, out short_name, null, null);
- }
- var has_short_name = short_name != null && ((!) short_name).get_char () != '\0';
-
- if (!has_short_name) {
+ if (short_name == null || ((!) short_name).get_char () == '\0') {
+ short_name = xkb;
+ }
+ } else if (ibus != null) {
var engine = get_engine ();
if (engine != null) {
short_name = ((!) engine).get_name ();
}
- }
- if (short_name == null || ((!) short_name).get_char () == '\0') {
- if (ibus != null) {
+ if (short_name == null || ((!) short_name).get_char () == '\0') {
short_name = ibus;
- } else if (xkb != null) {
- short_name = xkb;
+ }
+ } else if (fcitx != null) {
+ try {
+ var input_methods = get_fcitx_proxy ().get_imlist_nofree ();
+
+ for (var i = 0; i < input_methods.length; i++) {
+ if (input_methods.get (i).unique_name == (!) fcitx) {
+ short_name = input_methods.get (i).langcode;
+ break;
+ }
+ }
+ } catch (Error error) {
+ warning ("error: %s", error.message);
+ }
+
+ if (short_name == null || ((!) short_name).get_char () == '\0') {
+ short_name = fcitx;
}
}