@@ -16,15 +16,42 @@ public class Gala.DesktopIntegration : GLib.Object {
1616 GLib . HashTable<unowned string, Variant > properties;
1717 }
1818
19+ public struct Workspace {
20+ Window [] windows;
21+ }
22+
1923 private unowned WindowManagerGala wm;
2024 public uint version { get ; default = 1 ; }
2125 public signal void running_applications_changed ();
2226 public signal void windows_changed ();
27+ public signal void workspaces_changed ();
2328
2429 public DesktopIntegration (WindowManagerGala wm ) {
2530 this . wm = wm;
2631 wm. window_tracker. windows_changed. connect (() = > windows_changed ());
27- wm. get_display (). get_workspace_manager (). active_workspace_changed. connect (() = > windows_changed ());
32+
33+ unowned var workspace_manager = wm. get_display (). get_workspace_manager ();
34+ workspace_manager. active_workspace_changed. connect (() = > windows_changed ());
35+
36+ workspace_manager. workspaces_reordered. connect (() = > workspaces_changed ());
37+ workspace_manager. workspace_added. connect ((_workspace_manager, index) = > {
38+ workspaces_changed ();
39+
40+ unowned var workspace = _workspace_manager. get_workspace_by_index (index);
41+ if (workspace == null ) {
42+ critical (" Couldn't get workspace" );
43+ return ;
44+ }
45+
46+ workspace. window_added. connect (() = > workspaces_changed ());
47+ workspace. window_removed. connect (() = > workspaces_changed ());
48+ });
49+ workspace_manager. workspace_removed. connect (() = > workspaces_changed ());
50+
51+ foreach (unowned var workspace in workspace_manager. get_workspaces ()) {
52+ workspace. window_added. connect (() = > workspaces_changed ());
53+ workspace. window_removed. connect (() = > workspaces_changed ());
54+ }
2855 }
2956
3057 public RunningApplication [] get_running_applications () throws GLib .DBusError , GLib .IOError {
@@ -107,6 +134,32 @@ public class Gala.DesktopIntegration : GLib.Object {
107134 return (owned ) returned_windows;
108135 }
109136
137+ public Workspace [] get_workspaces () throws GLib .DBusError , GLib .IOError {
138+ var n_workspaces = wm. get_display (). get_workspace_manager (). n_workspaces;
139+ var workspaces = new Workspace [n_workspaces];
140+
141+ var apps = Gala . AppSystem . get_default (). get_running_apps ();
142+ foreach (unowned var app in apps) {
143+ foreach (weak Meta . Window window in app. get_windows ()) {
144+ if (! is_eligible_window (window)) {
145+ continue ;
146+ }
147+
148+ var properties = new GLib .HashTable<unowned string, Variant > (str_hash, str_equal);
149+ properties. insert (" app-id" , new GLib .Variant .string (app. id));
150+
151+ var w = workspaces[window. get_workspace (). workspace_index]. windows;
152+ w + = Window () {
153+ uid = window. get_id (),
154+ properties = properties
155+ };
156+ workspaces[window. get_workspace (). workspace_index]. windows = w;
157+ }
158+ }
159+
160+ return (owned ) workspaces;
161+ }
162+
110163 public void focus_window (uint64 uid ) throws GLib .DBusError , GLib .IOError {
111164 var apps = Gala . AppSystem . get_default (). get_running_apps ();
112165 foreach (unowned var app in apps) {
0 commit comments