diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/metadata-menu-item.vala | 2 | ||||
-rw-r--r-- | src/player-controller.vala | 4 | ||||
-rw-r--r-- | src/player-windows-activator.vala (renamed from src/gtk-application-player.vala) | 86 |
4 files changed, 80 insertions, 16 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 381da56..9807477 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -68,7 +68,7 @@ music_bridge_VALASOURCES = \ playlists-menu-item.vala \ freedesktop-interfaces.vala \ fetch-file.vala \ - gtk-application-player.vala + player-windows-activator.vala music_bridge_VALAFLAGS = \ --ccode \ @@ -83,7 +83,9 @@ music_bridge_VALAFLAGS = \ --pkg gio-2.0 \ --pkg gio-unix-2.0 \ --pkg gdk-3.0 \ + --pkg gdk-x11-3.0 \ --pkg gdk-pixbuf-2.0 \ + --pkg libbamf3 \ --pkg libxml-2.0 $(MAINTAINER_VALAFLAGS) diff --git a/src/metadata-menu-item.vala b/src/metadata-menu-item.vala index a81c143..f4a7e68 100644 --- a/src/metadata-menu-item.vala +++ b/src/metadata-menu-item.vala @@ -177,7 +177,7 @@ public class MetadataMenuitem : PlayerItem this.owner.instantiate(timestamp); } else if (this.owner.current_state == PlayerController.state.CONNECTED) { - this.owner.gtk_app_player.activate(timestamp); + this.owner.player_activator.activate(timestamp); this.owner.mpris_bridge.expose(timestamp); } } diff --git a/src/player-controller.vala b/src/player-controller.vala index dbe7c3c..8c3339e 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -45,7 +45,7 @@ public class PlayerController : GLib.Object public string dbus_name { get; set;} public ArrayList<PlayerItem> custom_items; public Mpris2Controller mpris_bridge; - public GtkApplicationPlayer gtk_app_player; + public PlayerActivator player_activator; public AppInfo? app_info { get; set;} public int menu_offset { get; set;} public string icon_name { get; set; } @@ -150,7 +150,7 @@ public class PlayerController : GLib.Object debug ( " establish mpris connection - use playlists value = %s ", this.use_playlists.to_string() ); this.mpris_bridge = new Mpris2Controller (this); - this.gtk_app_player = new GtkApplicationPlayer (this); + this.player_activator = new PlayerActivator (this); this.determine_state (); } diff --git a/src/gtk-application-player.vala b/src/player-windows-activator.vala index 8422ca5..e8cd616 100644 --- a/src/gtk-application-player.vala +++ b/src/player-windows-activator.vala @@ -4,16 +4,16 @@ Copyright 2013 Canonical Ltd. Authors: Marco Trevisan <marco.trevisan@canonical.com> -This program is free software: you can redistribute it and/or modify it -under the terms of the GNU General Public License version 3, as published +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published by the Free Software Foundation. -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranties of -MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, 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 +You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ @@ -22,24 +22,44 @@ public interface DBusGtkApplication : Object { public abstract void Activate(GLib.HashTable<string, Variant?> platform_data) throws IOError; } -public class GtkApplicationPlayer : GLib.Object +public class PlayerActivator : GLib.Object { public PlayerController owner {get; construct;} private bool gtk_application_searched = false; private DBusGtkApplication gtk_application; + private Bamf.Application bamf_application; - public GtkApplicationPlayer(PlayerController ctrl) + private const uint MAX_BAMF_APPLICATION_WAIT_MS = 1000; + private int64 last_check_time; + + public PlayerActivator(PlayerController ctrl) { GLib.Object(owner: ctrl); } public void activate(uint timestamp) { + if (!activate_gtk_appplication(timestamp)) { + if (!activate_bamf_appplication(timestamp)) { + // Let's wait BAMF to update its windows list + this.last_check_time = get_monotonic_time(); + + Idle.add(() => { + bool activated = activate_bamf_appplication(timestamp); + int64 waited = (get_monotonic_time() - this.last_check_time) / 1000; + return !activated && waited < MAX_BAMF_APPLICATION_WAIT_MS; + }); + } + } + } + + private bool activate_gtk_appplication(uint timestamp) + { this.setup_gtk_application(); if (this.gtk_application == null) { - return; + return false; } var context = Gdk.Display.get_default().get_app_launch_context(); @@ -49,9 +69,13 @@ public class GtkApplicationPlayer : GLib.Object data["desktop-startup-id"] = context.get_startup_notify_id(this.owner.app_info, new GLib.List<GLib.File>()); try { - this.gtk_application.Activate(data); + this.gtk_application.Activate(data); } - catch (IOError e) {} + catch (IOError e) { + return false; + } + + return true; } private void setup_gtk_application() @@ -79,7 +103,7 @@ public class GtkApplicationPlayer : GLib.Object private void find_iface_path(DBusConnection connection, string name, string path, string target_iface, out string found_path) { - found_path = null; + found_path = null; DBusNodeInfo node = null; try { @@ -120,4 +144,42 @@ public class GtkApplicationPlayer : GLib.Object } } } + + private void setup_bamf_application() + { + this.bamf_application = null; + var desktop_app = this.owner.app_info as DesktopAppInfo; + + if (desktop_app == null) + return; + + foreach (var app in Bamf.Matcher.get_default().get_applications()) { + if (app.get_desktop_file() == desktop_app.get_filename()) { + this.bamf_application = app; + break; + } + } + } + + private bool activate_bamf_appplication(uint timestamp) + { + this.setup_bamf_application(); + + if (this.bamf_application == null) + return false; + + bool focused = false; + var dpy = Gdk.Display.get_default(); + + foreach (var win in this.bamf_application.get_windows()) { + if (win.get_window_type() != Bamf.WindowType.NORMAL) + continue; + + var xwin = Gdk.X11Window.foreign_new_for_display(dpy, win.get_xid()); + xwin.focus(timestamp); + focused = true; + } + + return focused; + } }
\ No newline at end of file |