aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Hua <william.hua@canonical.com>2014-03-28 14:58:59 +0000
committerCI bot <ps-jenkins@lists.canonical.com>2014-03-28 14:58:59 +0000
commita452e71a92c99224e1a49ecc52685f1fb8072de9 (patch)
tree8a9946045df4da595844ffc1be86fda6ec9ccf5e
parentcc698d1e5dee774217c9d8d1bf45f9be01ac37f2 (diff)
parenta08ab0c4f8f80366eb7c08795e9d5407aef8ecff (diff)
downloadayatana-indicator-keyboard-a452e71a92c99224e1a49ecc52685f1fb8072de9.tar.gz
ayatana-indicator-keyboard-a452e71a92c99224e1a49ecc52685f1fb8072de9.tar.bz2
ayatana-indicator-keyboard-a452e71a92c99224e1a49ecc52685f1fb8072de9.zip
Use Ubuntu-specific IBus D-Bus API so that we don't have to replace the old IBus panel service in order to inspect and activate IBus engine properties. Fixes: 1290881
-rw-r--r--debian/control1
-rw-r--r--lib/Makefile.am1
-rw-r--r--lib/ibus-panel.vala26
-rw-r--r--lib/main.vala65
-rw-r--r--po/indicator-keyboard.pot10
5 files changed, 88 insertions, 15 deletions
diff --git a/debian/control b/debian/control
index 4148227e..585af9c5 100644
--- a/debian/control
+++ b/debian/control
@@ -30,6 +30,7 @@ Package: indicator-keyboard
Architecture: any
Depends: ${misc:Depends},
${shlibs:Depends},
+Breaks: ibus (<< 1.5.5-1ubuntu3),
Description: Keyboard indicator
This package contains the keyboard indicator, which should show as an icon in
the top panel when using the Unity environment. It can be used to switch
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 7432d15c..b99073e1 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -10,6 +10,7 @@ indicator_keyboard_service_SOURCES = main.vala \
source.vala \
common.vala \
ibus-menu.vala \
+ ibus-panel.vala \
window-stack.vala \
unity-greeter.vala
indicator_keyboard_service_VALAFLAGS = $(AM_VALAFLAGS) \
diff --git a/lib/ibus-panel.vala b/lib/ibus-panel.vala
new file mode 100644
index 00000000..460b1eac
--- /dev/null
+++ b/lib/ibus-panel.vala
@@ -0,0 +1,26 @@
+/*
+ * 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.IBus.Panel.Private")]
+public interface IBusPanel : Object {
+
+ public abstract void activate_property (string name, uint state) throws IOError;
+
+ public signal void properties_registered (Variant variant);
+ public signal void property_updated (Variant variant);
+}
diff --git a/lib/main.vala b/lib/main.vala
index f012ecb0..55c46b02 100644
--- a/lib/main.vala
+++ b/lib/main.vala
@@ -37,7 +37,8 @@ public class Indicator.Keyboard.Service : Object {
private uint focused_window_id;
private IBus.Bus? ibus;
- private IBus.PanelService? panel_service;
+ private IBusPanel? ibus_panel;
+ private ulong ibus_connected_id;
private uint panel_timeout;
private Source[]? sources;
@@ -132,6 +133,43 @@ public class Indicator.Keyboard.Service : Object {
}
[DBus (visible = false)]
+ private IBusPanel? get_ibus_panel () {
+ if (ibus_panel == null && get_ibus ().is_connected ()) {
+ var connection = get_ibus ().get_connection ();
+ var name = "org.freedesktop.IBus.Panel";
+ var path = "/org/freedesktop/IBus/Panel";
+
+ try {
+ ibus_panel = connection.get_proxy_sync (name, path);
+
+ ((!) ibus_panel).properties_registered.connect ((variant) => {
+ var properties = new IBus.PropList ();
+ properties.deserialize (variant);
+
+ if (properties is IBus.PropList) {
+ handle_properties_registered ((!) (properties as IBus.PropList));
+ }
+ });
+ ((!) ibus_panel).property_updated.connect ((variant) => {
+ var type = IBus.PropType.NORMAL;
+ var state = IBus.PropState.INCONSISTENT;
+ var text = new IBus.Text.from_static_string ("");
+ var property = new IBus.Property ("", type, text, null, text, false, false, state, null);
+ property.deserialize (variant);
+
+ if (property is IBus.Property) {
+ handle_property_updated ((!) (property as IBus.Property));
+ }
+ });
+ } catch (IOError error) {
+ warning ("error: %s", error.message);
+ }
+ }
+
+ return ibus_panel;
+ }
+
+ [DBus (visible = false)]
public void up () {
if (loop == null) {
loop = new MainLoop ();
@@ -576,11 +614,12 @@ public class Indicator.Keyboard.Service : Object {
}
}
- if (panel_service == null && sources[i].is_ibus) {
- if (get_ibus ().request_name (IBus.SERVICE_PANEL, IBus.BusNameFlag.REPLACE_EXISTING) > 0) {
- panel_service = new IBus.PanelService (get_ibus ().get_connection ());
- ((!) panel_service).register_properties.connect (handle_registered_properties);
- ((!) panel_service).update_property.connect (handle_updated_property);
+ if (ibus_connected_id == 0 && sources[i].is_ibus) {
+ ibus_connected_id = get_ibus ().connected.connect (() => { get_ibus_panel (); });
+ get_ibus ().disconnected.connect (() => { ibus_panel = null; });
+
+ if (get_ibus ().is_connected ()) {
+ get_ibus_panel ();
}
}
}
@@ -590,7 +629,7 @@ public class Indicator.Keyboard.Service : Object {
}
[DBus (visible = false)]
- private void handle_registered_properties (IBus.PropList list) {
+ private void handle_properties_registered (IBus.PropList list) {
if (panel_timeout > 0) {
GLib.Source.remove (panel_timeout);
panel_timeout = 0;
@@ -604,7 +643,7 @@ public class Indicator.Keyboard.Service : Object {
}
[DBus (visible = false)]
- private void handle_updated_property (IBus.Property property) {
+ private void handle_property_updated (IBus.Property property) {
get_ibus_menu ().update_property (property);
}
@@ -747,8 +786,14 @@ public class Indicator.Keyboard.Service : Object {
if (ibus_menu == null) {
ibus_menu = new IBusMenu (get_action_group ());
((!) ibus_menu).activate.connect ((property, state) => {
- if (panel_service != null) {
- ((!) panel_service).property_activate (property.key, state);
+ var panel = get_ibus_panel ();
+
+ if (panel != null) {
+ try {
+ ((!) panel).activate_property (property.key, state);
+ } catch (IOError error) {
+ warning ("error: %s", error.message);
+ }
}
});
}
diff --git a/po/indicator-keyboard.pot b/po/indicator-keyboard.pot
index 34931572..5647f938 100644
--- a/po/indicator-keyboard.pot
+++ b/po/indicator-keyboard.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-09-27 16:28+0200\n"
+"POT-Creation-Date: 2014-03-20 12:25+1300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,19 +17,19 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: ../lib/main.vala:427
+#: ../lib/main.vala:667
#, c-format
msgid "%s input source"
msgstr ""
-#: ../lib/main.vala:525
+#: ../lib/main.vala:815
msgid "Character Map"
msgstr ""
-#: ../lib/main.vala:526
+#: ../lib/main.vala:816
msgid "Keyboard Layout Chart"
msgstr ""
-#: ../lib/main.vala:527
+#: ../lib/main.vala:817
msgid "Text Entry Settings..."
msgstr ""