Skip to content

Commit 35c74f0

Browse files
committed
WIP: POF dock workspace switcher
1 parent 75a4e56 commit 35c74f0

File tree

1 file changed

+54
-1
lines changed

1 file changed

+54
-1
lines changed

src/DesktopIntegration.vala

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)