From becf805cc0c4699d3e0bc0d2d82d55f1ebf69d89 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Tue, 2 Apr 2024 00:42:31 +0200 Subject: [PATCH 1/4] Sort windows by stacking --- src/DesktopIntegration.vala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/DesktopIntegration.vala b/src/DesktopIntegration.vala index ed26d253a..e799c08ff 100644 --- a/src/DesktopIntegration.vala +++ b/src/DesktopIntegration.vala @@ -59,7 +59,9 @@ public class Gala.DesktopIntegration : GLib.Object { Window[] returned_windows = {}; var apps = Gala.AppSystem.get_default ().get_running_apps (); foreach (unowned var app in apps) { - foreach (weak Meta.Window window in app.get_windows ()) { + var windows = wm.get_display ().sort_windows_by_stacking (app.get_windows ()); + windows.reverse (); + foreach (weak Meta.Window window in windows) { if (!is_eligible_window (window)) { continue; } From 8dd08cc68b77315f3bf229e22580051898692bf6 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Tue, 2 Apr 2024 00:42:49 +0200 Subject: [PATCH 2/4] Emit windows changed on stacking order change --- src/WindowTracker.vala | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/WindowTracker.vala b/src/WindowTracker.vala index 3f8af4eb6..d0c8528d0 100644 --- a/src/WindowTracker.vala +++ b/src/WindowTracker.vala @@ -9,6 +9,8 @@ public class Gala.WindowTracker : GLib.Object { public signal void windows_changed (); + private uint changed_idle_id = 0; + construct { window_to_app = new GLib.HashTable (direct_hash, direct_equal); } @@ -20,6 +22,10 @@ public class Gala.WindowTracker : GLib.Object { init_window_tracking (display); } + private void emit_changed () { + windows_changed (); + } + private void load_initial_windows (Meta.Display display) { GLib.List windows = display.list_all_windows (); foreach (weak Meta.Window window in windows) { @@ -306,9 +312,11 @@ public class Gala.WindowTracker : GLib.Object { window.notify["gtk-application-id"].connect (tracked_window_notified); window.unmanaged.connect (disassociate_window); + window.raised.connect (emit_changed); + app.add_window (window); - windows_changed (); + emit_changed (); } private void disassociate_window (Meta.Window window) { @@ -320,9 +328,12 @@ public class Gala.WindowTracker : GLib.Object { window.unmanaged.disconnect (disassociate_window); window.notify["wm-class"].disconnect (tracked_window_notified); window.notify["gtk-application-id"].disconnect (tracked_window_notified); + + window.raised.disconnect (emit_changed); + app.remove_window (window); window_to_app.remove (window); - windows_changed (); + emit_changed (); } } From f9acc7763713b27c1bd5ba09c55d2f3d7e5618dd Mon Sep 17 00:00:00 2001 From: Leonhard Date: Tue, 2 Apr 2024 14:03:08 +0200 Subject: [PATCH 3/4] Connect to display restacked instead of window raised --- src/DesktopIntegration.vala | 1 + src/WindowTracker.vala | 15 ++------------- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/DesktopIntegration.vala b/src/DesktopIntegration.vala index e799c08ff..010a1ae59 100644 --- a/src/DesktopIntegration.vala +++ b/src/DesktopIntegration.vala @@ -24,6 +24,7 @@ public class Gala.DesktopIntegration : GLib.Object { public DesktopIntegration (WindowManagerGala wm) { this.wm = wm; wm.window_tracker.windows_changed.connect (() => windows_changed ()); + wm.get_display ().restacked.connect (() => windows_changed ()); } public RunningApplication[] get_running_applications () throws GLib.DBusError, GLib.IOError { diff --git a/src/WindowTracker.vala b/src/WindowTracker.vala index d0c8528d0..3f8af4eb6 100644 --- a/src/WindowTracker.vala +++ b/src/WindowTracker.vala @@ -9,8 +9,6 @@ public class Gala.WindowTracker : GLib.Object { public signal void windows_changed (); - private uint changed_idle_id = 0; - construct { window_to_app = new GLib.HashTable (direct_hash, direct_equal); } @@ -22,10 +20,6 @@ public class Gala.WindowTracker : GLib.Object { init_window_tracking (display); } - private void emit_changed () { - windows_changed (); - } - private void load_initial_windows (Meta.Display display) { GLib.List windows = display.list_all_windows (); foreach (weak Meta.Window window in windows) { @@ -312,11 +306,9 @@ public class Gala.WindowTracker : GLib.Object { window.notify["gtk-application-id"].connect (tracked_window_notified); window.unmanaged.connect (disassociate_window); - window.raised.connect (emit_changed); - app.add_window (window); - emit_changed (); + windows_changed (); } private void disassociate_window (Meta.Window window) { @@ -328,12 +320,9 @@ public class Gala.WindowTracker : GLib.Object { window.unmanaged.disconnect (disassociate_window); window.notify["wm-class"].disconnect (tracked_window_notified); window.notify["gtk-application-id"].disconnect (tracked_window_notified); - - window.raised.disconnect (emit_changed); - app.remove_window (window); window_to_app.remove (window); - emit_changed (); + windows_changed (); } } From a476bc0477879234fa437b74c100b061021b1b80 Mon Sep 17 00:00:00 2001 From: Leonhard Date: Tue, 2 Apr 2024 20:20:22 +0200 Subject: [PATCH 4/4] Emit windows_changed less, add comment --- src/DesktopIntegration.vala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/DesktopIntegration.vala b/src/DesktopIntegration.vala index 010a1ae59..60ee40933 100644 --- a/src/DesktopIntegration.vala +++ b/src/DesktopIntegration.vala @@ -19,12 +19,11 @@ public class Gala.DesktopIntegration : GLib.Object { private unowned WindowManagerGala wm; public uint version { get; default = 1; } public signal void running_applications_changed (); - public signal void windows_changed (); + public signal void windows_changed (); // Only emitted if the number of windows changes, not if window properties change public DesktopIntegration (WindowManagerGala wm) { this.wm = wm; wm.window_tracker.windows_changed.connect (() => windows_changed ()); - wm.get_display ().restacked.connect (() => windows_changed ()); } public RunningApplication[] get_running_applications () throws GLib.DBusError, GLib.IOError {