diff --git a/src/DesktopIntegration.vala b/src/DesktopIntegration.vala index c949552e4..bfff84552 100644 --- a/src/DesktopIntegration.vala +++ b/src/DesktopIntegration.vala @@ -16,19 +16,24 @@ public class Gala.DesktopIntegration : GLib.Object { GLib.HashTable properties; } - private unowned WindowManagerGala wm; public uint version { get; default = 1; } public signal void running_applications_changed (); public signal void windows_changed (); public signal void active_workspace_changed (); public signal void workspace_removed (int index); + private unowned WindowManagerGala wm; + private GLib.HashTable time_appeared_on_workspace; + public DesktopIntegration (WindowManagerGala wm) { this.wm = wm; + time_appeared_on_workspace = new GLib.HashTable (GLib.direct_hash, GLib.direct_equal); + wm.window_tracker.windows_changed.connect (() => windows_changed ()); unowned var display = wm.get_display (); unowned var workspace_manager = display.get_workspace_manager (); + workspace_manager.active_workspace_changed.connect (() => { active_workspace_changed (); windows_changed (); // windows have 'on-active-workspace' property that we need to update @@ -42,7 +47,16 @@ public class Gala.DesktopIntegration : GLib.Object { // TODO: figure out if there's a better way to handle ws rearrangement display.window_created.connect ((window) => { - window.workspace_changed.connect (() => windows_changed ()); + time_appeared_on_workspace[window] = GLib.get_monotonic_time (); + + window.workspace_changed.connect ((_window) => { + time_appeared_on_workspace[_window] = GLib.get_monotonic_time (); + windows_changed (); + }); + + window.unmanaging.connect ((_window) => { + time_appeared_on_workspace.remove (_window); + }); }); } @@ -117,6 +131,10 @@ public class Gala.DesktopIntegration : GLib.Object { properties.insert ("sandboxed-app-id", new GLib.Variant.string (sandboxed_app_id)); } + if (window in time_appeared_on_workspace && time_appeared_on_workspace[window] != null) { + properties.insert ("time-appeared-on-workspace", new GLib.Variant.int64 (time_appeared_on_workspace[window])); + } + returned_windows += Window () { uid = window.get_id (), properties = properties