From 4451d840969698c2d2106c013a95a3c6eb4baf70 Mon Sep 17 00:00:00 2001 From: William Hua Date: Wed, 7 Aug 2013 16:20:23 -0400 Subject: Work under lightdm/unity-greeter. --- lib/main.vala | 203 ++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 163 insertions(+), 40 deletions(-) (limited to 'lib/main.vala') 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 users; private Bamf.Matcher? matcher; private Gee.HashMap? window_sources; @@ -66,6 +67,11 @@ public class Indicator.Keyboard.Service : Object { acquire_bus_name (); } + [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) { @@ -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 (); + var added = new Gee.HashSet (); + + 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 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)] -- cgit v1.2.3 From 5c12e10be77351e88b6c550894e4ca34c99aacf8 Mon Sep 17 00:00:00 2001 From: William Hua Date: Mon, 12 Aug 2013 09:33:27 +0800 Subject: Fix out-of-bounds error. --- lib/main.vala | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 91466f8c..d601f6f9 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -220,8 +220,14 @@ public class Indicator.Keyboard.Service : Object { private void update_indicator_action () { var visible = indicator_settings.get_boolean ("visible"); var current = source_settings.get_uint ("current"); - var icon = get_sources ()[current].icon; + var sources = get_sources (); + Variant state; + Icon? icon = null; + + if (current < sources.length) { + icon = sources[current].icon; + } if (icon != null) { state = new Variant.parsed ("{ 'visible' : <%b>, 'icon' : %v }", visible, ((!) icon).serialize ()); -- cgit v1.2.3 From 201e48e1b010ebf180034abb8d61cafaba8a08a0 Mon Sep 17 00:00:00 2001 From: William Hua Date: Thu, 22 Aug 2013 15:12:38 +0800 Subject: Proper shutdown on SIGTERM. --- lib/main.vala | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index d601f6f9..073b0588 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -19,6 +19,7 @@ [DBus (name = "com.canonical.indicator.keyboard")] public class Indicator.Keyboard.Service : Object { + private static Service service; private static IBus.Bus? ibus; private bool force; @@ -76,6 +77,22 @@ public class Indicator.Keyboard.Service : Object { return (!) ibus; } + [DBus (visible = false)] + public void up () { + if (loop == null) { + loop = new MainLoop (); + ((!) loop).run (); + } + } + + [DBus (visible = false)] + public void down () { + if (loop != null) { + ((!) loop).quit (); + loop = null; + } + } + [DBus (visible = false)] private void acquire_bus_name () { Bus.own_name (BusType.SESSION, @@ -84,9 +101,6 @@ public class Indicator.Keyboard.Service : Object { handle_bus_acquired, null, handle_name_lost); - - loop = new MainLoop (); - ((!) loop).run (); } [DBus (visible = false)] @@ -428,13 +442,19 @@ public class Indicator.Keyboard.Service : Object { [DBus (visible = false)] private void handle_name_lost (DBusConnection? connection, string name) { - ((!) loop).quit (); - loop = null; + down (); } [DBus (visible = false)] public static int main (string[] args) { - new Service (ref args); + Service.service = new Service (ref args); + + Posix.signal (Posix.SIGTERM, (code) => { + Service.service.down (); + }); + + Service.service.up (); + return 0; } } -- cgit v1.2.3 From 09910321e6c720fe0d219d0342e7efaee0b30051 Mon Sep 17 00:00:00 2001 From: Matthieu Baerts Date: Wed, 28 Aug 2013 14:20:24 +0200 Subject: Added an 'accessible description' This description is used by other applications (like Cairo-Dock) as label for this icon. --- lib/main.vala | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 83e31dc0..d8b6588e 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -355,20 +355,24 @@ public class Indicator.Keyboard.Service : Object { var current = source_settings.get_uint ("current"); var sources = get_sources (); - Variant state; Icon? icon = null; + string? name = null; if (current < sources.length) { icon = sources[current].icon; + name = sources[current].name; } + var builder = new VariantBuilder (new VariantType ("a{sv}")); + builder.add ("{sv}", "visible", new Variant.boolean (visible)); + if (name != null) { + builder.add ("{sv}", "accessible-desc", new Variant.string ((!) name)); + } if (icon != null) { - state = new Variant.parsed ("{ 'visible' : <%b>, 'icon' : %v }", visible, ((!) icon).serialize ()); - } else { - state = new Variant.parsed ("{ 'visible' : <%b> }", visible); + builder.add ("{sv}", "icon", ((!) icon).serialize ()); } - get_indicator_action ().set_state (state); + get_indicator_action ().set_state (builder.end ()); } [DBus (visible = false)] -- cgit v1.2.3 From f1416ee304e6025e9b65270e6ab5810153632ad4 Mon Sep 17 00:00:00 2001 From: William Hua Date: Wed, 28 Aug 2013 23:08:44 +0800 Subject: Append input source suffix to accessible-desc. --- lib/main.vala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index d8b6588e..cf196650 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -366,7 +366,8 @@ public class Indicator.Keyboard.Service : Object { var builder = new VariantBuilder (new VariantType ("a{sv}")); builder.add ("{sv}", "visible", new Variant.boolean (visible)); if (name != null) { - builder.add ("{sv}", "accessible-desc", new Variant.string ((!) name)); + var suffix = _ ("input source"); + builder.add ("{sv}", "accessible-desc", new Variant.string (@"$((!) name) $suffix")); } if (icon != null) { builder.add ("{sv}", "icon", ((!) icon).serialize ()); -- cgit v1.2.3 From 807c6d8708d93d49c20ab14f13e343828d0bf3df Mon Sep 17 00:00:00 2001 From: William Hua Date: Thu, 29 Aug 2013 10:22:25 +0800 Subject: Use printf-style format string instead. --- lib/main.vala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index cf196650..7aac365c 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -366,8 +366,8 @@ public class Indicator.Keyboard.Service : Object { var builder = new VariantBuilder (new VariantType ("a{sv}")); builder.add ("{sv}", "visible", new Variant.boolean (visible)); if (name != null) { - var suffix = _ ("input source"); - builder.add ("{sv}", "accessible-desc", new Variant.string (@"$((!) name) $suffix")); + var description = _ ("%s input source").printf ((!) name); + builder.add ("{sv}", "accessible-desc", new Variant.string (description)); } if (icon != null) { builder.add ("{sv}", "icon", ((!) icon).serialize ()); -- cgit v1.2.3 From 8031d6831d622d6420fb2e1c4e65926f7ba46231 Mon Sep 17 00:00:00 2001 From: William Hua Date: Fri, 20 Sep 2013 20:56:11 -0400 Subject: Infer variable type. --- lib/main.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 7aac365c..e0557e34 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -112,7 +112,7 @@ public class Indicator.Keyboard.Service : Object { [DBus (visible = false)] private void migrate_keyboard_layouts () { if (is_login_user ()) { - Act.UserManager manager = Act.UserManager.get_default (); + var manager = Act.UserManager.get_default (); if (manager.is_loaded) { users = manager.list_users (); -- cgit v1.2.3 From 474217efa011b2f360edad72c1a8872dbe7d257e Mon Sep 17 00:00:00 2001 From: William Hua Date: Fri, 20 Sep 2013 21:06:51 -0400 Subject: Only use XKeyboardLayouts if InputSources is empty. --- lib/main.vala | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index e0557e34..485f37a4 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -209,12 +209,12 @@ public class Indicator.Keyboard.Service : Object { foreach (var user in users) { if (user.is_loaded) { - var sources = user.input_sources; - var layouts = user.xkeyboard_layouts; + var done = false; VariantIter outer; VariantIter inner; + var sources = user.input_sources; sources.get ("aa{ss}", out outer); while (outer.next ("a{ss}", out inner)) { @@ -223,6 +223,8 @@ public class Indicator.Keyboard.Service : Object { while (inner.next ("{&s&s}", out key, out source)) { if (key == "xkb") { + done = true; + if (!added.contains (source)) { list.add (source); added.add (source); @@ -231,14 +233,19 @@ public class Indicator.Keyboard.Service : Object { } } - foreach (var layout in layouts) { - var source = layout; - source = source.replace (" ", "+"); - source = source.replace ("\t", "+"); + if (!done) { + var layouts = user.xkeyboard_layouts; + foreach (var layout in layouts) { + done = true; - if (!added.contains (source)) { - list.add (source); - added.add (source); + var source = layout; + source = source.replace (" ", "+"); + source = source.replace ("\t", "+"); + + if (!added.contains (source)) { + list.add (source); + added.add (source); + } } } } -- cgit v1.2.3 From f485f87438c2c80bf378b42d997e9adde4d99cae Mon Sep 17 00:00:00 2001 From: William Hua Date: Fri, 20 Sep 2013 21:22:57 -0400 Subject: Fallback to LightDM default. --- lib/main.vala | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 485f37a4..7daba518 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -251,6 +251,16 @@ public class Indicator.Keyboard.Service : Object { } } + if (list.size == 0) { + var layout = LightDM.get_layout (); + + var source = layout.name; + source = source.replace (" ", "+"); + source = source.replace ("\t", "+"); + + list.add (source); + } + var builder = new VariantBuilder (new VariantType ("a(ss)")); foreach (var layout in list) { -- cgit v1.2.3 From b4546f5c93ecfd844621942388f526c82a8c10bd Mon Sep 17 00:00:00 2001 From: William Hua Date: Fri, 20 Sep 2013 23:23:17 -0400 Subject: Use old user layouts if they haven't migrated yet. --- lib/main.vala | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 7daba518..df962c98 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -147,6 +147,13 @@ public class Indicator.Keyboard.Service : Object { } }); } + + var user_list = LightDM.UserList.get_instance (); + + user_list.user_added.connect ((user) => { migrate_input_sources (); }); + user_list.user_changed.connect ((user) => { migrate_input_sources (); }); + user_list.user_removed.connect ((user) => { migrate_input_sources (); }); + user_list.get_user_by_name ("this line force loads the users"); } else { if (!indicator_settings.get_boolean ("migrated")) { var builder = new VariantBuilder (new VariantType ("a(ss)")); @@ -248,6 +255,27 @@ public class Indicator.Keyboard.Service : Object { } } } + + if (!done) { + var user_list = LightDM.UserList.get_instance (); + LightDM.User? light_user = user_list.get_user_by_name (user.user_name); + + if (light_user != null) { + var layouts = ((!) light_user).get_layouts (); + foreach (var layout in layouts) { + done = true; + + var source = layout; + source = source.replace (" ", "+"); + source = source.replace ("\t", "+"); + + if (!added.contains (source)) { + list.add (source); + added.add (source); + } + } + } + } } } -- cgit v1.2.3 From 04f6c6c8a443bd58d95be15b6860f3b0e98e18a7 Mon Sep 17 00:00:00 2001 From: William Hua Date: Sat, 21 Sep 2013 00:21:06 -0400 Subject: Don't waste space. --- lib/main.vala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index df962c98..026be597 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -153,7 +153,9 @@ public class Indicator.Keyboard.Service : Object { user_list.user_added.connect ((user) => { migrate_input_sources (); }); user_list.user_changed.connect ((user) => { migrate_input_sources (); }); user_list.user_removed.connect ((user) => { migrate_input_sources (); }); - user_list.get_user_by_name ("this line force loads the users"); + + /* Force the loading of the user list. */ + user_list.get_user_by_name (""); } else { if (!indicator_settings.get_boolean ("migrated")) { var builder = new VariantBuilder (new VariantType ("a(ss)")); -- cgit v1.2.3 From caa8187d0c9dd3e891b9a0ba4967fdeb901f76e9 Mon Sep 17 00:00:00 2001 From: William Hua Date: Sat, 21 Sep 2013 11:01:35 -0400 Subject: Always add the default layout. --- lib/main.vala | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 026be597..11802d8a 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -281,20 +281,21 @@ public class Indicator.Keyboard.Service : Object { } } - if (list.size == 0) { - var layout = LightDM.get_layout (); + var layout = LightDM.get_layout (); - var source = layout.name; - source = source.replace (" ", "+"); - source = source.replace ("\t", "+"); + var source = layout.name; + source = source.replace (" ", "+"); + source = source.replace ("\t", "+"); + if (!added.contains (source)) { list.add (source); + added.add (source); } var builder = new VariantBuilder (new VariantType ("a(ss)")); - foreach (var layout in list) { - builder.add ("(ss)", "xkb", layout); + foreach (var name in list) { + builder.add ("(ss)", "xkb", name); } source_settings.set_value ("sources", builder.end ()); -- cgit v1.2.3 From 4c4d3fe6179b3457c63d619ee3012cfba0d4a50d Mon Sep 17 00:00:00 2001 From: William Hua Date: Sat, 21 Sep 2013 11:55:33 -0400 Subject: Prevent index out of bounds. --- lib/main.vala | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 11802d8a..a0315590 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -41,6 +41,8 @@ public class Indicator.Keyboard.Service : Object { private MenuModel? menu_model; private Menu? sources_menu; + private uint lightdm_current; + [DBus (visible = false)] public Service (ref unowned string[] args) { force = "--force" in args; @@ -112,6 +114,8 @@ public class Indicator.Keyboard.Service : Object { [DBus (visible = false)] private void migrate_keyboard_layouts () { if (is_login_user ()) { + lightdm_current = source_settings.get_uint ("current"); + var manager = Act.UserManager.get_default (); if (manager.is_loaded) { @@ -298,6 +302,12 @@ public class Indicator.Keyboard.Service : Object { builder.add ("(ss)", "xkb", name); } + if (lightdm_current < list.size) { + source_settings.set_uint ("current", lightdm_current); + } else { + source_settings.set_uint ("current", list.size - 1); + } + source_settings.set_value ("sources", builder.end ()); } -- cgit v1.2.3 From 292ca060720c47dabfe938ea64abcf0ea243887b Mon Sep 17 00:00:00 2001 From: William Hua Date: Mon, 30 Sep 2013 09:45:06 -0400 Subject: Set initial layout whenever user is switched in unity-greeter. --- lib/main.vala | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index a0315590..1319c534 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -41,7 +41,9 @@ public class Indicator.Keyboard.Service : Object { private MenuModel? menu_model; private Menu? sources_menu; + private Greeter greeter; private uint lightdm_current; + private string? greeter_user; [DBus (visible = false)] public Service (ref unowned string[] args) { @@ -55,6 +57,15 @@ public class Indicator.Keyboard.Service : Object { Gdk.init (ref args); } + if (is_login_user ()) { + try { + greeter = Bus.get_proxy_sync (BusType.SESSION, "com.canonical.UnityGreeter.List", "/list"); + greeter.entry_selected.connect (handle_entry_selected); + } catch (IOError error) { + warning ("error: %s", error.message); + } + } + indicator_settings = new Settings ("com.canonical.indicator.keyboard"); indicator_settings.changed["visible"].connect (handle_changed_visible); @@ -111,6 +122,82 @@ public class Indicator.Keyboard.Service : Object { handle_name_lost); } + [DBus (visible = false)] + private void update_greeter_user () { + if (greeter_user != null) { + var manager = Act.UserManager.get_default (); + + if (manager.is_loaded) { + Act.User? user = manager.get_user ((!) greeter_user); + + if (user != null && ((!) user).is_loaded) { + string? source = null; + + VariantIter outer; + VariantIter inner; + + var sources = ((!) user).input_sources; + sources.get ("aa{ss}", out outer); + + if (outer.next ("a{ss}", out inner)) { + unowned string key; + unowned string value; + + while (inner.next ("{&s&s}", out key, out value)) { + if (key == "xkb") { + source = value; + } + } + } + + if (source == null) { + var layouts = ((!) user).xkeyboard_layouts; + + if (layouts.length == 0) { + var user_list = LightDM.UserList.get_instance (); + LightDM.User? light_user = user_list.get_user_by_name ((!) greeter_user); + + if (light_user != null) { + layouts = ((!) light_user).get_layouts (); + } + } + + if (layouts.length > 0) { + source = layouts[0]; + source = ((!) source).replace (" ", "+"); + source = ((!) source).replace ("\t", "+"); + } + } + + if (source != null) { + var array = source_settings.get_value ("sources"); + + for (int i = 0; i < array.n_children (); i++) { + unowned string type; + unowned string name; + + array.get_child (i, "(&s&s)", out type, out name); + + if (type == "xkb" && name == (!) source) { + source_settings.set_uint ("current", i); + break; + } + } + } + } + } + } + } + + [DBus (visible = false)] + private void handle_entry_selected (string entry_name) { + if (greeter_user == null || entry_name != (!) greeter_user) { + greeter_user = entry_name; + + update_greeter_user (); + } + } + [DBus (visible = false)] private void migrate_keyboard_layouts () { if (is_login_user ()) { @@ -309,6 +396,8 @@ public class Indicator.Keyboard.Service : Object { } source_settings.set_value ("sources", builder.end ()); + + update_greeter_user (); } [DBus (visible = false)] -- cgit v1.2.3 From 3e10c675a8a43678ab6b9bd7dc1197a6da246bc0 Mon Sep 17 00:00:00 2001 From: William Hua Date: Tue, 1 Oct 2013 16:17:16 -0400 Subject: Connect properly and handle edge cases. --- lib/main.vala | 45 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 9 deletions(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 1319c534..8c25bf55 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -41,7 +41,7 @@ public class Indicator.Keyboard.Service : Object { private MenuModel? menu_model; private Menu? sources_menu; - private Greeter greeter; + private Greeter? greeter; private uint lightdm_current; private string? greeter_user; @@ -58,12 +58,11 @@ public class Indicator.Keyboard.Service : Object { } if (is_login_user ()) { - try { - greeter = Bus.get_proxy_sync (BusType.SESSION, "com.canonical.UnityGreeter.List", "/list"); - greeter.entry_selected.connect (handle_entry_selected); - } catch (IOError error) { - warning ("error: %s", error.message); - } + Bus.watch_name (BusType.SESSION, + "com.canonical.UnityGreeter", + BusNameWatcherFlags.NONE, + handle_name_appeared, + handle_name_vanished); } indicator_settings = new Settings ("com.canonical.indicator.keyboard"); @@ -124,6 +123,14 @@ public class Indicator.Keyboard.Service : Object { [DBus (visible = false)] private void update_greeter_user () { + if (greeter_user == null && greeter != null) { + try { + greeter_user = ((!) greeter).get_active_entry (); + } catch (IOError error) { + warning ("error: %s", error.message); + } + } + if (greeter_user != null) { var manager = Act.UserManager.get_default (); @@ -139,21 +146,26 @@ public class Indicator.Keyboard.Service : Object { var sources = ((!) user).input_sources; sources.get ("aa{ss}", out outer); - if (outer.next ("a{ss}", out inner)) { + while (outer.next ("a{ss}", out inner)) { unowned string key; unowned string value; while (inner.next ("{&s&s}", out key, out value)) { if (key == "xkb") { source = value; + break; } } + + if (source != null) { + break; + } } if (source == null) { var layouts = ((!) user).xkeyboard_layouts; - if (layouts.length == 0) { + if (layouts.length <= 0) { var user_list = LightDM.UserList.get_instance (); LightDM.User? light_user = user_list.get_user_by_name ((!) greeter_user); @@ -705,6 +717,21 @@ public class Indicator.Keyboard.Service : Object { } } + [DBus (visible = false)] + private void handle_name_appeared (DBusConnection connection, string name, string name_owner) { + try { + greeter = Bus.get_proxy_sync (BusType.SESSION, "com.canonical.UnityGreeter", "/list"); + ((!) greeter).entry_selected.connect (handle_entry_selected); + } catch (IOError error) { + warning ("error: %s", error.message); + } + } + + [DBus (visible = false)] + private void handle_name_vanished (DBusConnection connection, string name) { + greeter = null; + } + [DBus (visible = false)] private void handle_bus_acquired (DBusConnection connection, string name) { try { -- cgit v1.2.3 From 673d3cc001462e480ce000c713b3994cd8c58354 Mon Sep 17 00:00:00 2001 From: William Hua Date: Tue, 1 Oct 2013 23:03:00 -0400 Subject: ocd --- lib/main.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 8c25bf55..5357862c 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -42,8 +42,8 @@ public class Indicator.Keyboard.Service : Object { private Menu? sources_menu; private Greeter? greeter; - private uint lightdm_current; private string? greeter_user; + private uint lightdm_current; [DBus (visible = false)] public Service (ref unowned string[] args) { -- cgit v1.2.3 From d5dab6b801cd8d3ab4519cbf45ae37c27feb3943 Mon Sep 17 00:00:00 2001 From: William Hua Date: Wed, 2 Oct 2013 11:53:34 -0400 Subject: Get greeter unique bus name from environment. --- lib/main.vala | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 5357862c..c40cc112 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -58,11 +58,15 @@ public class Indicator.Keyboard.Service : Object { } if (is_login_user ()) { - Bus.watch_name (BusType.SESSION, - "com.canonical.UnityGreeter", - BusNameWatcherFlags.NONE, - handle_name_appeared, - handle_name_vanished); + var name = Environment.get_variable ("UNITY_GREETER_DBUS_NAME"); + + if (name != null) { + Bus.watch_name (BusType.SESSION, + (!) name, + BusNameWatcherFlags.NONE, + handle_name_appeared, + handle_name_vanished); + } } indicator_settings = new Settings ("com.canonical.indicator.keyboard"); @@ -720,7 +724,7 @@ public class Indicator.Keyboard.Service : Object { [DBus (visible = false)] private void handle_name_appeared (DBusConnection connection, string name, string name_owner) { try { - greeter = Bus.get_proxy_sync (BusType.SESSION, "com.canonical.UnityGreeter", "/list"); + greeter = Bus.get_proxy_sync (BusType.SESSION, name, "/list"); ((!) greeter).entry_selected.connect (handle_entry_selected); } catch (IOError error) { warning ("error: %s", error.message); -- cgit v1.2.3 From 62e536eb83d30df39da4afe5e17e94a7625762ea Mon Sep 17 00:00:00 2001 From: William Hua Date: Wed, 2 Oct 2013 14:53:12 -0400 Subject: Switch to default layout for non-users in unity-greeter. --- lib/main.vala | 60 ++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 21 deletions(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index c40cc112..190276f8 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -135,6 +135,8 @@ public class Indicator.Keyboard.Service : Object { } } + string? source = null; + if (greeter_user != null) { var manager = Act.UserManager.get_default (); @@ -142,8 +144,6 @@ public class Indicator.Keyboard.Service : Object { Act.User? user = manager.get_user ((!) greeter_user); if (user != null && ((!) user).is_loaded) { - string? source = null; - VariantIter outer; VariantIter inner; @@ -184,22 +184,35 @@ public class Indicator.Keyboard.Service : Object { source = ((!) source).replace ("\t", "+"); } } + } + } + } - if (source != null) { - var array = source_settings.get_value ("sources"); + if (source == null) { + LightDM.Layout? layout = LightDM.get_layout (); - for (int i = 0; i < array.n_children (); i++) { - unowned string type; - unowned string name; + if (layout != null) { + source = ((!) layout).name; - array.get_child (i, "(&s&s)", out type, out name); + if (source != null) { + source = ((!) source).replace (" ", "+"); + source = ((!) source).replace ("\t", "+"); + } + } + } - if (type == "xkb" && name == (!) source) { - source_settings.set_uint ("current", i); - break; - } - } - } + if (source != null) { + var array = source_settings.get_value ("sources"); + + for (int i = 0; i < array.n_children (); i++) { + unowned string type; + unowned string name; + + array.get_child (i, "(&s&s)", out type, out name); + + if (type == "xkb" && name == (!) source) { + source_settings.set_uint ("current", i); + break; } } } @@ -388,15 +401,20 @@ public class Indicator.Keyboard.Service : Object { } } - var layout = LightDM.get_layout (); + LightDM.Layout? layout = LightDM.get_layout (); + + if (layout != null) { + string? source = ((!) layout).name; - var source = layout.name; - source = source.replace (" ", "+"); - source = source.replace ("\t", "+"); + if (source != null) { + source = ((!) source).replace (" ", "+"); + source = ((!) source).replace ("\t", "+"); - if (!added.contains (source)) { - list.add (source); - added.add (source); + if (!added.contains ((!) source)) { + list.add ((!) source); + added.add ((!) source); + } + } } var builder = new VariantBuilder (new VariantType ("a(ss)")); -- cgit v1.2.3 From 96ba3bfeba7badbce1a5f3592f6317a5657a324f Mon Sep 17 00:00:00 2001 From: William Hua Date: Wed, 9 Oct 2013 11:23:21 -0400 Subject: Don't set LightDM's layout if we're in a session. (LP: 1226962) --- lib/main.vala | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 190276f8..195ee140 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -436,24 +436,26 @@ public class Indicator.Keyboard.Service : Object { [DBus (visible = false)] private void update_login_layout () { - unowned List layouts = LightDM.get_layouts (); - var current = source_settings.get_uint ("current"); + if (is_login_user ()) { + unowned List 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 (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 (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; + if (name != null) { + foreach (var layout in layouts) { + if (layout.name == (!) name) { + LightDM.set_layout (layout); + break; + } } } } -- cgit v1.2.3 From 84fafd7a077a2383435c6668ce15559907df868f Mon Sep 17 00:00:00 2001 From: William Hua Date: Wed, 30 Oct 2013 17:22:26 -0700 Subject: Enable middle click and mouse wheel scrolling. --- lib/main.vala | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 190276f8..53878989 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -568,6 +568,22 @@ public class Indicator.Keyboard.Service : Object { return (!) indicator_action; } + [DBus (visible = false)] + private void handle_middle_click (Variant? parameter) { + handle_scroll_wheel (new Variant.int32 (-1)); + } + + [DBus (visible = false)] + private void handle_scroll_wheel (Variant? parameter) { + if (parameter != null) { + var sources = source_settings.get_value ("sources"); + var current = source_settings.get_uint ("current"); + var length = (int) sources.n_children (); + + source_settings.set_uint ("current", (current + (length - parameter.get_int32 ())) % length); + } + } + [DBus (visible = false)] protected virtual SimpleActionGroup create_action_group (Action root_action) { var group = new SimpleActionGroup (); @@ -575,7 +591,15 @@ public class Indicator.Keyboard.Service : Object { group.insert (root_action); group.insert (source_settings.create_action ("current")); - var action = new SimpleAction ("map", null); + var action = new SimpleAction ("next", null); + action.activate.connect (handle_middle_click); + group.insert (action); + + action = new SimpleAction ("scroll", VariantType.INT32); + action.activate.connect (handle_scroll_wheel); + group.insert (action); + + action = new SimpleAction ("map", null); action.activate.connect (handle_activate_map); group.insert (action); @@ -653,6 +677,8 @@ public class Indicator.Keyboard.Service : Object { var indicator = new MenuItem.submenu ("x", submenu); indicator.set_attribute ("x-canonical-type", "s", "com.canonical.indicator.root"); + indicator.set_attribute ("x-canonical-secondary-action", "s", "indicator.next"); + indicator.set_attribute ("x-canonical-scroll-action", "s", "indicator.scroll"); indicator.set_detailed_action ("indicator.indicator"); menu.append_item (indicator); -- cgit v1.2.3 From c01d6f3fa3e8663da142f23b9e36dcf57622c57d Mon Sep 17 00:00:00 2001 From: William Hua Date: Mon, 4 Nov 2013 12:05:42 -0500 Subject: Be careful around large scrolling offsets. --- lib/main.vala | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'lib/main.vala') diff --git a/lib/main.vala b/lib/main.vala index 53878989..e9eb27b6 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -580,7 +580,10 @@ public class Indicator.Keyboard.Service : Object { var current = source_settings.get_uint ("current"); var length = (int) sources.n_children (); - source_settings.set_uint ("current", (current + (length - parameter.get_int32 ())) % length); + if (length > 0) { + var offset = parameter.get_int32 () % length; + source_settings.set_uint ("current", (current + (length - offset)) % length); + } } } -- cgit v1.2.3