aboutsummaryrefslogtreecommitdiff
path: root/lib/main.vala
diff options
context:
space:
mode:
Diffstat (limited to 'lib/main.vala')
-rw-r--r--lib/main.vala203
1 files changed, 163 insertions, 40 deletions
diff --git a/lib/main.vala b/lib/main.vala
index 91466f8c..ef94b2f2 100644
--- a/lib/main.vala
+++ b/lib/main.vala
@@ -29,6 +29,7 @@ public class Indicator.Keyboard.Service : Object {
private Settings indicator_settings;
private Settings source_settings;
private Settings per_window_settings;
+ private SList<Act.User> users;
private Bamf.Matcher? matcher;
private Gee.HashMap<string, uint>? window_sources;
@@ -67,6 +68,11 @@ public class Indicator.Keyboard.Service : Object {
}
[DBus (visible = false)]
+ private static bool is_login_user () {
+ return Environment.get_user_name () == "lightdm";
+ }
+
+ [DBus (visible = false)]
private static IBus.Bus get_ibus () {
if (ibus == null) {
IBus.init ();
@@ -91,64 +97,177 @@ public class Indicator.Keyboard.Service : Object {
[DBus (visible = false)]
private void migrate_keyboard_layouts () {
- if (!indicator_settings.get_boolean ("migrated")) {
- var builder = new VariantBuilder (new VariantType ("a(ss)"));
- var length = 0;
+ if (is_login_user ()) {
+ Act.UserManager manager = Act.UserManager.get_default ();
+
+ if (manager.is_loaded) {
+ users = manager.list_users ();
+
+ foreach (var user in users) {
+ if (user.is_loaded) {
+ migrate_input_sources ();
+ } else {
+ user.notify["is-loaded"].connect ((pspec) => {
+ if (user.is_loaded) {
+ migrate_input_sources ();
+ }
+ });
+ }
+ }
+ } else {
+ manager.notify["is-loaded"].connect ((pspec) => {
+ if (manager.is_loaded) {
+ users = manager.list_users ();
+
+ foreach (var user in users) {
+ if (user.is_loaded) {
+ migrate_input_sources ();
+ } else {
+ user.notify["is-loaded"].connect ((pspec) => {
+ if (user.is_loaded) {
+ migrate_input_sources ();
+ }
+ });
+ }
+ }
+ }
+ });
+ }
+ } else {
+ if (!indicator_settings.get_boolean ("migrated")) {
+ var builder = new VariantBuilder (new VariantType ("a(ss)"));
+ var length = 0;
+
+ var layout_settings = new Settings ("org.gnome.libgnomekbd.keyboard");
+ var layouts = layout_settings.get_strv ("layouts");
+
+ foreach (var layout in layouts) {
+ var source = layout;
+ source = source.replace (" ", "+");
+ source = source.replace ("\t", "+");
- var layout_settings = new Settings ("org.gnome.libgnomekbd.keyboard");
- var layouts = layout_settings.get_strv ("layouts");
+ builder.add ("(ss)", "xkb", source);
+ length++;
+ }
- foreach (var layout in layouts) {
- var source = layout;
+ var engines = get_ibus ().list_active_engines ();
- source = source.replace (" ", "+");
- source = source.replace ("\t", "+");
+ foreach (var engine in engines) {
+ if (length == 0 || engine.name.has_prefix ("xkb")) {
+ var source = "us";
+ string? layout = engine.get_layout ();
+ string? variant = engine.get_layout_variant ();
- builder.add ("(ss)", "xkb", source);
- length++;
- }
+ if (layout != null && ((!) layout).length == 0) {
+ layout = null;
+ }
- var engines = get_ibus ().list_active_engines ();
+ if (variant != null && ((!) variant).length == 0) {
+ variant = null;
+ }
- foreach (var engine in engines) {
- if (length == 0 || engine.name.has_prefix ("xkb")) {
- var source = "us";
- string? layout = engine.get_layout ();
- string? variant = engine.get_layout_variant ();
+ if (layout != null && variant != null) {
+ source = @"$((!) layout)+$((!) variant)";
+ } else if (layout != null) {
+ source = (!) layout;
+ }
- if (layout != null && ((!) layout).length == 0) {
- layout = null;
+ builder.add ("(ss)", "xkb", source);
+ length++;
}
- if (variant != null && ((!) variant).length == 0) {
- variant = null;
+ if (!engine.name.has_prefix ("xkb")) {
+ builder.add ("(ss)", "ibus", engine.name);
+ length++;
}
+ }
- if (layout != null && variant != null) {
- source = @"$((!) layout)+$((!) variant)";
- } else if (layout != null) {
- source = (!) layout;
- }
+ source_settings.set_value ("sources", builder.end ());
+ indicator_settings.set_boolean ("migrated", true);
+ }
+ }
+ }
- builder.add ("(ss)", "xkb", source);
- length++;
+ [DBus (visible = false)]
+ private void migrate_input_sources () {
+ var list = new Gee.LinkedList<string> ();
+ var added = new Gee.HashSet<string> ();
+
+ foreach (var user in users) {
+ if (user.is_loaded) {
+ var sources = user.input_sources;
+ var layouts = user.xkeyboard_layouts;
+
+ VariantIter outer;
+ VariantIter inner;
+
+ sources.get ("aa{ss}", out outer);
+
+ while (outer.next ("a{ss}", out inner)) {
+ unowned string key;
+ unowned string source;
+
+ while (inner.next ("{&s&s}", out key, out source)) {
+ if (key == "xkb") {
+ if (!added.contains (source)) {
+ list.add (source);
+ added.add (source);
+ }
+ }
+ }
}
- if (!engine.name.has_prefix ("xkb")) {
- builder.add ("(ss)", "ibus", engine.name);
- length++;
+ foreach (var layout in layouts) {
+ var source = layout;
+ source = source.replace (" ", "+");
+ source = source.replace ("\t", "+");
+
+ if (!added.contains (source)) {
+ list.add (source);
+ added.add (source);
+ }
}
}
+ }
- source_settings.set_value ("sources", builder.end ());
+ var builder = new VariantBuilder (new VariantType ("a(ss)"));
- indicator_settings.set_boolean ("migrated", true);
+ foreach (var layout in list) {
+ builder.add ("(ss)", "xkb", layout);
+ }
+
+ source_settings.set_value ("sources", builder.end ());
+ }
+
+ [DBus (visible = false)]
+ private void update_login_layout () {
+ unowned List<LightDM.Layout> layouts = LightDM.get_layouts ();
+ var current = source_settings.get_uint ("current");
+
+ if (current < get_sources ().length) {
+ var source = get_sources ()[current];
+ string? name = null;
+
+ if (source.layout != null && source.variant != null) {
+ name = @"$((!) source.layout)\t$((!) source.variant)";
+ } else if (source.layout != null) {
+ name = source.layout;
+ }
+
+ if (name != null) {
+ foreach (var layout in layouts) {
+ if (layout.name == (!) name) {
+ LightDM.set_layout (layout);
+ break;
+ }
+ }
+ }
}
}
[DBus (visible = false)]
private void update_window_sources () {
- if (use_bamf) {
+ if (use_bamf && !is_login_user ()) {
var group_per_window = per_window_settings.get_boolean ("group-per-window");
if (group_per_window != (window_sources != null)) {
@@ -318,11 +437,13 @@ public class Indicator.Keyboard.Service : Object {
submenu.append_section (null, section_menu);
- var section = new Menu ();
- section.append (_ ("Character Map"), "indicator.map");
- section.append (_ ("Keyboard Layout Chart"), "indicator.chart");
- section.append (_ ("Text Entry Settings..."), "indicator.settings");
- submenu.append_section (null, section);
+ if (!is_login_user ()) {
+ var section = new Menu ();
+ section.append (_ ("Character Map"), "indicator.map");
+ section.append (_ ("Keyboard Layout Chart"), "indicator.chart");
+ section.append (_ ("Text Entry Settings..."), "indicator.settings");
+ submenu.append_section (null, section);
+ }
var indicator = new MenuItem.submenu ("x", submenu);
indicator.set_attribute ("x-canonical-type", "s", "com.canonical.indicator.root");
@@ -349,6 +470,7 @@ public class Indicator.Keyboard.Service : Object {
[DBus (visible = false)]
private void handle_changed_current (string key) {
update_indicator_action ();
+ update_login_layout ();
}
[DBus (visible = false)]
@@ -357,6 +479,7 @@ public class Indicator.Keyboard.Service : Object {
update_sources_menu ();
update_indicator_action ();
+ update_login_layout ();
}
[DBus (visible = false)]