aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Makefile.am14
-rw-r--r--lib/main.vala96
-rw-r--r--lib/unity-greeter.vala (renamed from lib/greeter.vala)2
-rw-r--r--lib/window-stack.vala37
4 files changed, 108 insertions, 41 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 72f5f949..0e7cd266 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -5,10 +5,11 @@ AM_LDFLAGS = -lm
AM_VALAFLAGS = --metadatadir $(top_srcdir)/deps \
--vapidir $(top_srcdir)/deps
-indicator_keyboard_service_SOURCES = main.vala \
- source.vala \
- common.vala \
- greeter.vala
+indicator_keyboard_service_SOURCES = main.vala \
+ source.vala \
+ common.vala \
+ window-stack.vala \
+ unity-greeter.vala
indicator_keyboard_service_VALAFLAGS = $(AM_VALAFLAGS) \
--pkg gee-1.0 \
--pkg posix \
@@ -20,8 +21,7 @@ indicator_keyboard_service_VALAFLAGS = $(AM_VALAFLAGS) \
--pkg Gkbd-3.0 \
--pkg ibus-1.0 \
--pkg accountsservice \
- --pkg liblightdm-gobject-1 \
- --pkg libbamf3
+ --pkg liblightdm-gobject-1
indicator_keyboard_service_CFLAGS = $(AM_CFLAGS) \
$(GEE_CFLAGS) \
$(PANGOCAIRO_CFLAGS) \
@@ -32,7 +32,6 @@ indicator_keyboard_service_CFLAGS = $(AM_CFLAGS) \
$(IBUS_CFLAGS) \
$(ACCOUNTSSERVICE_CFLAGS) \
$(LIGHTDM_CFLAGS) \
- $(BAMF_CFLAGS) \
$(COVERAGE_CFLAGS)
indicator_keyboard_service_LDFLAGS = $(AM_LDFLAGS) \
$(GEE_LIBS) \
@@ -44,5 +43,4 @@ indicator_keyboard_service_LDFLAGS = $(AM_LDFLAGS) \
$(IBUS_LIBS) \
$(ACCOUNTSSERVICE_LIBS) \
$(LIGHTDM_LIBS) \
- $(BAMF_LIBS) \
$(COVERAGE_LDFLAGS)
diff --git a/lib/main.vala b/lib/main.vala
index 66147b18..ffc558ba 100644
--- a/lib/main.vala
+++ b/lib/main.vala
@@ -24,15 +24,16 @@ public class Indicator.Keyboard.Service : Object {
private bool force;
private bool use_gtk;
- private bool use_bamf;
private MainLoop? loop;
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;
+
+ private WindowStack? window_stack;
+ private Gee.HashMap<uint, uint>? window_sources;
+ private uint focused_window_id;
private Source[]? sources;
@@ -41,7 +42,7 @@ public class Indicator.Keyboard.Service : Object {
private MenuModel? menu_model;
private Menu? sources_menu;
- private Greeter? greeter;
+ private UnityGreeter? unity_greeter;
private string? greeter_user;
private uint lightdm_current;
@@ -49,7 +50,6 @@ public class Indicator.Keyboard.Service : Object {
public Service (ref unowned string[] args) {
force = "--force" in args;
use_gtk = "--use-gtk" in args;
- use_bamf = "--use-bamf" in args;
if (use_gtk) {
use_gtk = Gtk.init_check (ref args);
@@ -64,9 +64,15 @@ public class Indicator.Keyboard.Service : Object {
Bus.watch_name (BusType.SESSION,
(!) name,
BusNameWatcherFlags.NONE,
- handle_name_appeared,
- handle_name_vanished);
+ handle_unity_greeter_name_appeared,
+ handle_unity_greeter_name_vanished);
}
+ } else {
+ Bus.watch_name (BusType.SESSION,
+ "com.canonical.Unity.WindowStack",
+ BusNameWatcherFlags.NONE,
+ handle_window_stack_name_appeared,
+ handle_window_stack_name_vanished);
}
indicator_settings = new Settings ("com.canonical.indicator.keyboard");
@@ -127,9 +133,9 @@ public class Indicator.Keyboard.Service : Object {
[DBus (visible = false)]
private void update_greeter_user () {
- if (greeter_user == null && greeter != null) {
+ if (greeter_user == null && unity_greeter != null) {
try {
- greeter_user = ((!) greeter).get_active_entry ();
+ greeter_user = ((!) unity_greeter).get_active_entry ();
} catch (IOError error) {
warning ("error: %s", error.message);
}
@@ -464,17 +470,30 @@ public class Indicator.Keyboard.Service : Object {
[DBus (visible = false)]
private void update_window_sources () {
- if (use_bamf && !is_login_user ()) {
+ if (window_stack != null) {
var group_per_window = per_window_settings.get_boolean ("group-per-window");
if (group_per_window != (window_sources != null)) {
if (group_per_window) {
- window_sources = new Gee.HashMap<string, uint> ();
- matcher = Bamf.Matcher.get_default ();
- ((!) matcher).active_window_changed.connect (handle_active_window_changed);
+ focused_window_id = 0;
+
+ try {
+ var windows = ((!) window_stack).get_window_stack ();
+
+ foreach (var window in windows) {
+ if (window.focused) {
+ focused_window_id = window.window_id;
+ break;
+ }
+ }
+ } catch (IOError error) {
+ warning ("error: %s", error.message);
+ }
+
+ window_sources = new Gee.HashMap<uint, uint> ();
+ ((!) window_stack).focused_window_changed.connect (handle_focused_window_changed);
} else {
- ((!) matcher).active_window_changed.disconnect (handle_active_window_changed);
- matcher = null;
+ ((!) window_stack).focused_window_changed.disconnect (handle_focused_window_changed);
window_sources = null;
}
}
@@ -487,22 +506,20 @@ public class Indicator.Keyboard.Service : Object {
}
[DBus (visible = false)]
- private void handle_active_window_changed (Bamf.View? old_view, Bamf.View? new_view) {
- if (old_view != null) {
- ((!) window_sources)[((!) old_view).path] = source_settings.get_uint ("current");
- }
+ private void handle_focused_window_changed (uint window_id, string app_id, uint stage) {
+ ((!) window_sources)[focused_window_id] = source_settings.get_uint ("current");
- if (new_view != null) {
- if (!((!) window_sources).has_key (((!) new_view).path)) {
- var default_group = per_window_settings.get_int ("default-group");
+ if (!(((!) window_sources).has_key (window_id))) {
+ var default_group = per_window_settings.get_int ("default-group");
- if (default_group >= 0) {
- source_settings.set_uint ("current", (uint) default_group);
- }
- } else {
- source_settings.set_uint ("current", ((!) window_sources)[((!) new_view).path]);
+ if (default_group >= 0) {
+ source_settings.set_uint ("current", (uint) default_group);
}
+ } else {
+ source_settings.set_uint ("current", ((!) window_sources)[window_id]);
}
+
+ focused_window_id = window_id;
}
[DBus (visible = false)]
@@ -771,18 +788,33 @@ public class Indicator.Keyboard.Service : Object {
}
[DBus (visible = false)]
- private void handle_name_appeared (DBusConnection connection, string name, string name_owner) {
+ private void handle_unity_greeter_name_appeared (DBusConnection connection, string name, string name_owner) {
+ try {
+ unity_greeter = Bus.get_proxy_sync (BusType.SESSION, name, "/list");
+ ((!) unity_greeter).entry_selected.connect (handle_entry_selected);
+ } catch (IOError error) {
+ warning ("error: %s", error.message);
+ }
+ }
+
+ [DBus (visible = false)]
+ private void handle_unity_greeter_name_vanished (DBusConnection connection, string name) {
+ unity_greeter = null;
+ }
+
+ [DBus (visible = false)]
+ private void handle_window_stack_name_appeared (DBusConnection connection, string name, string name_owner) {
try {
- greeter = Bus.get_proxy_sync (BusType.SESSION, name, "/list");
- ((!) greeter).entry_selected.connect (handle_entry_selected);
+ window_stack = Bus.get_proxy_sync (BusType.SESSION, name, "/com/canonical/Unity/WindowStack");
+ update_window_sources ();
} catch (IOError error) {
warning ("error: %s", error.message);
}
}
[DBus (visible = false)]
- private void handle_name_vanished (DBusConnection connection, string name) {
- greeter = null;
+ private void handle_window_stack_name_vanished (DBusConnection connection, string name) {
+ window_stack = null;
}
[DBus (visible = false)]
diff --git a/lib/greeter.vala b/lib/unity-greeter.vala
index c378bbd5..2cdfe05c 100644
--- a/lib/greeter.vala
+++ b/lib/unity-greeter.vala
@@ -17,7 +17,7 @@
*/
[DBus (name="com.canonical.UnityGreeter.List")]
-public interface Greeter : Object {
+public interface UnityGreeter : Object {
public abstract string get_active_entry () throws IOError;
public abstract void set_active_entry (string entry_name) throws IOError;
diff --git a/lib/window-stack.vala b/lib/window-stack.vala
new file mode 100644
index 00000000..980eba4f
--- /dev/null
+++ b/lib/window-stack.vala
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2013 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>
+ */
+
+public struct WindowInfo {
+
+ public uint window_id;
+ public string app_id;
+ public bool focused;
+ public uint stage;
+}
+
+[DBus (name="com.canonical.Unity.WindowStack")]
+public interface WindowStack : Object {
+
+ public abstract string get_app_id_from_pid (uint pid) throws IOError;
+ public abstract string[] get_window_properties (uint window_id, string app_id, string[] property_names) throws IOError;
+ public abstract WindowInfo[] get_window_stack () throws IOError;
+
+ public signal void focused_window_changed (uint window_id, string app_id, uint stage);
+ public signal void window_created (uint window_id, string app_id);
+ public signal void window_destroyed (uint window_id, string app_id);
+}