aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile.am36
-rw-r--r--lib/main.vala87
2 files changed, 87 insertions, 36 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 17e8f2dc..6569c9cb 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -1,3 +1,4 @@
+AM_CFLAGS = -DGNOME_DESKTOP_USE_UNSTABLE_API
AM_LDFLAGS = -lm
AM_VALAFLAGS = --metadatadir $(top_srcdir)/deps \
--vapidir $(top_srcdir)/deps
@@ -5,22 +6,25 @@ AM_VALAFLAGS = --metadatadir $(top_srcdir)/deps \
libexec_PROGRAMS = indicator-keyboard-service
indicator_keyboard_service_SOURCES = main.vala
-indicator_keyboard_service_VALAFLAGS = $(AM_VALAFLAGS) \
- --pkg posix \
- --pkg pangocairo \
- --pkg gtk+-3.0 \
- --pkg Xkl-1.0 \
- --pkg libgnomekbd \
+indicator_keyboard_service_VALAFLAGS = $(AM_VALAFLAGS) \
+ --pkg posix \
+ --pkg pangocairo \
+ --pkg gtk+-3.0 \
+ --pkg gnome-desktop-3.0 \
+ --pkg Xkl-1.0 \
+ --pkg libgnomekbd \
--pkg ibus-1.0
-indicator_keyboard_service_CFLAGS = $(GTK_CFLAGS) \
- $(PANGOCAIRO_CFLAGS) \
- $(LIBXKLAVIER_CFLAGS) \
- $(LIBGNOMEKBD_CFLAGS) \
- $(IBUS_CFLAGS) \
+indicator_keyboard_service_CFLAGS = $(GTK_CFLAGS) \
+ $(PANGOCAIRO_CFLAGS) \
+ $(GNOME_DESKTOP_CFLAGS) \
+ $(LIBXKLAVIER_CFLAGS) \
+ $(LIBGNOMEKBD_CFLAGS) \
+ $(IBUS_CFLAGS) \
$(AM_CFLAGS)
-indicator_keyboard_service_LDFLAGS = $(GTK_LIBS) \
- $(PANGOCAIRO_LIBS) \
- $(LIBXKLAVIER_LIBS) \
- $(LIBGNOMEKBD_LIBS) \
- $(IBUS_LIBS) \
+indicator_keyboard_service_LDFLAGS = $(GTK_LIBS) \
+ $(PANGOCAIRO_LIBS) \
+ $(GNOME_DESKTOP_LIBS) \
+ $(LIBXKLAVIER_LIBS) \
+ $(LIBGNOMEKBD_LIBS) \
+ $(IBUS_LIBS) \
$(AM_LDFLAGS)
diff --git a/lib/main.vala b/lib/main.vala
index 77ea4636..759b8cbb 100644
--- a/lib/main.vala
+++ b/lib/main.vala
@@ -4,6 +4,7 @@ public class Indicator.Keyboard.Service : Object {
private MainLoop loop;
private Settings indicator_settings;
private Settings source_settings;
+ private Gnome.XkbInfo xkb_info;
private IBus.Bus ibus;
private SimpleActionGroup action_group;
@@ -29,6 +30,8 @@ public class Indicator.Keyboard.Service : Object {
this.source_settings.changed["current"].connect (this.handle_changed_current);
this.source_settings.changed["sources"].connect (this.handle_changed_sources);
+ this.xkb_info = new Gnome.XkbInfo ();
+
this.loop = new MainLoop ();
this.loop.run ();
}
@@ -115,7 +118,22 @@ public class Indicator.Keyboard.Service : Object {
string name;
array.get_child (index, "(ss)", out type, out name);
- this.icons[index] = create_icon (name);
+
+ if (type == "xkb") {
+ this.icons[index] = create_icon (name);
+ } else if (type == "ibus") {
+ var ibus = get_ibus ();
+ string[] names = { name, null };
+ var engines = ibus.get_engines_by_names (names);
+ var engine = engines[0];
+
+ try {
+ this.icons[index] = Icon.new_for_string (engine.get_icon ());
+ } catch {
+ warn_if_reached ();
+ }
+ }
+
icon = this.icons[index];
}
}
@@ -230,15 +248,24 @@ public class Indicator.Keyboard.Service : Object {
for (var i = 0; iter.next ("(ss)", out type, out name); i++) {
if (type == "xkb") {
- var language = Xkl.get_language_name (name);
- var country = Xkl.get_country_name (name);
-
- if (language != null && country != null) {
- name = @"$language ($country)";
- } else if (language != null) {
- name = language;
- } else if (country != null) {
- name = country;
+ string display_name;
+ string layout_name;
+
+ this.xkb_info.get_layout_info (name, out display_name, null, out layout_name, null);
+
+ if (display_name == null) {
+ var language = Xkl.get_language_name (layout_name);
+ var country = Xkl.get_country_name (layout_name);
+
+ if (language != null && country != null) {
+ name = @"$language ($country)";
+ } else if (language != null) {
+ name = language;
+ } else if (country != null) {
+ name = country;
+ }
+ } else {
+ name = display_name;
}
}
else if (type == "ibus") {
@@ -246,16 +273,19 @@ public class Indicator.Keyboard.Service : Object {
string[] names = { name, null };
var engines = ibus.get_engines_by_names (names);
var engine = engines[0];
- var longname = engine.longname;
- var language = Xkl.get_language_name (engine.language);
- var country = Xkl.get_country_name (engine.language);
+ var language = engine.get_language ();
+ var display_name = engine.get_longname ();
if (language != null) {
- name = @"$language ($longname)";
- } else if (country != null) {
- name = @"$country ($longname)";
- } else {
- name = longname;
+ language = Xkl.get_language_name (language);
+ }
+
+ if (language != null && display_name != null) {
+ name = @"$language ($display_name)";
+ } else if (language != null) {
+ name = language;
+ } else if (display_name != null) {
+ name = display_name;
}
}
@@ -317,6 +347,7 @@ public class Indicator.Keyboard.Service : Object {
[DBus (visible = false)]
private void handle_activate_chart (Variant? parameter) {
var layout = "us";
+ string variant = null;
var current = this.source_settings.get_uint ("current");
Variant array;
@@ -329,12 +360,28 @@ public class Indicator.Keyboard.Service : Object {
array.get_child (current, "(ss)", out type, out name);
if (type == "xkb") {
- layout = name;
+ this.xkb_info.get_layout_info (name, null, null, out layout, out variant);
+ } else if (type == "ibus") {
+ var ibus = get_ibus ();
+ string[] names = { name, null };
+ var engines = ibus.get_engines_by_names (names);
+ var engine = engines[0];
+
+ layout = engine.get_layout ();
+ variant = engine.get_layout_variant ();
}
}
try {
- Process.spawn_command_line_async (@"gkbd-keyboard-display -l $layout");
+ string command;
+
+ if (variant != null) {
+ command = @"gkbd-keyboard-display -l \"$layout\t$variant\"";
+ } else {
+ command = @"gkbd-keyboard-display -l $layout";
+ }
+
+ Process.spawn_command_line_async (command);
} catch {
warn_if_reached ();
}