diff options
author | William Hua <william.hua@canonical.com> | 2014-04-02 10:24:25 +1300 |
---|---|---|
committer | William Hua <william.hua@canonical.com> | 2014-04-02 10:24:25 +1300 |
commit | 414d5d9f8a41805ecec5808ace466c37d03fa9f3 (patch) | |
tree | 8dc12f064501b1a8ad44a8e99515c19878102399 /lib | |
parent | 8c6fd2e9daff0d486ab71c50413dadff6d1c12d8 (diff) | |
download | ayatana-indicator-keyboard-414d5d9f8a41805ecec5808ace466c37d03fa9f3.tar.gz ayatana-indicator-keyboard-414d5d9f8a41805ecec5808ace466c37d03fa9f3.tar.bz2 ayatana-indicator-keyboard-414d5d9f8a41805ecec5808ace466c37d03fa9f3.zip |
Switch to non-IBus input source when screen is locked.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Makefile.am | 1 | ||||
-rw-r--r-- | lib/main.vala | 54 | ||||
-rw-r--r-- | lib/unity-session.vala | 24 |
3 files changed, 79 insertions, 0 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am index b99073e1..fa8f43a0 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -12,6 +12,7 @@ indicator_keyboard_service_SOURCES = main.vala \ ibus-menu.vala \ ibus-panel.vala \ window-stack.vala \ + unity-session.vala \ unity-greeter.vala indicator_keyboard_service_VALAFLAGS = $(AM_VALAFLAGS) \ --pkg gee-1.0 \ diff --git a/lib/main.vala b/lib/main.vala index 55c46b02..7cfb5fac 100644 --- a/lib/main.vala +++ b/lib/main.vala @@ -49,6 +49,9 @@ public class Indicator.Keyboard.Service : Object { private Menu? sources_menu; private IBusMenu? ibus_menu; + private UnitySession? unity_session; + private uint session_current; + private UnityGreeter? unity_greeter; private string? greeter_user; private uint lightdm_current; @@ -96,6 +99,12 @@ public class Indicator.Keyboard.Service : Object { } } else { Bus.watch_name (BusType.SESSION, + "com.canonical.Unity", + BusNameWatcherFlags.NONE, + handle_unity_name_appeared, + handle_unity_name_vanished); + + Bus.watch_name (BusType.SESSION, "com.canonical.Unity.WindowStack", BusNameWatcherFlags.NONE, handle_window_stack_name_appeared, @@ -924,6 +933,51 @@ public class Indicator.Keyboard.Service : Object { } [DBus (visible = false)] + private void handle_unity_name_appeared (DBusConnection connection, string name, string name_owner) { + try { + unity_session = Bus.get_proxy_sync (BusType.SESSION, name, "/com/canonical/Unity/Session"); + ((!) unity_session).locked.connect (() => { + session_current = source_settings.get_uint ("current"); + + var sources = get_sources (); + + if (session_current < 0) { + session_current = 0; + } else if (session_current >= sources.length) { + session_current = sources.length - 1; + } + + if (0 <= session_current && session_current < sources.length) { + var source = sources[session_current]; + + if (source.is_ibus) { + for (var i = 0; i < sources.length; i++) { + if (!sources[i].is_ibus) { + source_settings.set_uint ("current", i); + break; + } + } + } + } + }); + ((!) unity_session).unlocked.connect (() => { + var locked_current = source_settings.get_uint ("current"); + + if (locked_current != session_current) { + source_settings.set_uint ("current", session_current); + } + }); + } catch (IOError error) { + warning ("error: %s", error.message); + } + } + + [DBus (visible = false)] + private void handle_unity_name_vanished (DBusConnection connection, string name) { + unity_session = null; + } + + [DBus (visible = false)] private void handle_window_stack_name_appeared (DBusConnection connection, string name, string name_owner) { try { window_stack = Bus.get_proxy_sync (BusType.SESSION, name, "/com/canonical/Unity/WindowStack"); diff --git a/lib/unity-session.vala b/lib/unity-session.vala new file mode 100644 index 00000000..04bf3349 --- /dev/null +++ b/lib/unity-session.vala @@ -0,0 +1,24 @@ +/* + * Copyright 2014 Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Authors: William Hua <william.hua@canonical.com> + */ + +[DBus (name="com.canonical.Unity.Session")] +public interface UnitySession : Object { + + public signal void locked (); + public signal void unlocked (); +} |