From 056c7acaf2784b602c362405355ae9fc8f2a43bf Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Sat, 27 Jul 2024 12:01:17 +0200 Subject: [PATCH 1/6] ShellClients: Allow X11 clients to use pantheon protocol via mutter hints --- src/ShellClients/ShellClientsManager.vala | 57 ++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/src/ShellClients/ShellClientsManager.vala b/src/ShellClients/ShellClientsManager.vala index bd322af7b..7908081e0 100644 --- a/src/ShellClients/ShellClientsManager.vala +++ b/src/ShellClients/ShellClientsManager.vala @@ -36,6 +36,12 @@ public class Gala.ShellClientsManager : Object { notifications_client = new NotificationsClient (wm.get_display ()); start_clients.begin (); + + //X11 only + wm.get_display ().window_created.connect ((window) => { + window.notify["mutter-hints"].connect ((obj, pspec) => parse_mutter_hints ((Meta.Window) obj)); + parse_mutter_hints (window); + }); } private async void start_clients () { @@ -98,7 +104,15 @@ public class Gala.ShellClientsManager : Object { } } - private void make_dock (Meta.Window window) { + public void make_dock (Meta.Window window) { + if (Meta.Util.is_wayland_compositor ()) { + make_dock_wayland (window); + } else { + make_dock_x11 (window); + } + } + + private void make_dock_wayland (Meta.Window window) { foreach (var client in protocol_clients) { if (client.wayland_client.owns_window (window)) { client.wayland_client.make_dock (window); @@ -107,6 +121,25 @@ public class Gala.ShellClientsManager : Object { } } + private void make_dock_x11 (Meta.Window window) requires (!Meta.Util.is_wayland_compositor ()) { + unowned var x11_display = wm.get_display ().get_x11_display (); + +#if HAS_MUTTER46 + var x_window = x11_display.lookup_xwindow (window); +#else + var x_window = window.get_xwindow (); +#endif + // gtk3's gdk_x11_window_set_type_hint() is used as a reference + unowned var xdisplay = x11_display.get_xdisplay (); + var atom = xdisplay.intern_atom ("_NET_WM_WINDOW_TYPE", false); + var dock_atom = xdisplay.intern_atom ("_NET_WM_WINDOW_TYPE_DOCK", false); + + // (X.Atom) 4 is XA_ATOM + // 32 is format + // 0 means replace + xdisplay.change_property (x_window, atom, (X.Atom) 4, 32, 0, (uchar[]) dock_atom, 1); + } + public void set_anchor (Meta.Window window, Meta.Side side) { if (window in windows) { windows[window].update_anchor (side); @@ -156,4 +189,26 @@ public class Gala.ShellClientsManager : Object { centered_windows[window] = new CenteredWindow (wm, window); } + + //X11 only + private void parse_mutter_hints (Meta.Window window) { + if (window.mutter_hints == null) { + return; + } + + var mutter_hints = window.mutter_hints.split (":"); + foreach (var mutter_hint in mutter_hints) { + var split = mutter_hint.split ("="); + var key = split[0]; + var val = split[1]; + + if (key == "anchor") { + set_anchor (window, int.parse (val)); + } + + if (key == "hide-mode") { + set_hide_mode (window, int.parse (val)); + } + } + } } From f1d513c8fc1e161825ca6756242edb3dab42f669 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Sat, 27 Jul 2024 12:24:02 +0200 Subject: [PATCH 2/6] Use switch case, support everything --- src/ShellClients/ShellClientsManager.vala | 34 +++++++++++++++++++---- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/ShellClients/ShellClientsManager.vala b/src/ShellClients/ShellClientsManager.vala index 7908081e0..edc6e2951 100644 --- a/src/ShellClients/ShellClientsManager.vala +++ b/src/ShellClients/ShellClientsManager.vala @@ -199,15 +199,39 @@ public class Gala.ShellClientsManager : Object { var mutter_hints = window.mutter_hints.split (":"); foreach (var mutter_hint in mutter_hints) { var split = mutter_hint.split ("="); + + if (split.length != 2) { + continue; + } + var key = split[0]; var val = split[1]; - if (key == "anchor") { - set_anchor (window, int.parse (val)); - } + switch (key) { + case "anchor": + set_anchor (window, int.parse (val)); + break; + + case "hide-mode": + set_hide_mode (window, int.parse (val)); + break; + + case "size": + var split_val = val.split (","); + if (split_val.length != 2) { + break; + } + var width = int.parse (split_val[0]); + var height = int.parse (split_val[1]); + set_size (window, width, height); + break; + + case "centered": + make_centered (window); + break; - if (key == "hide-mode") { - set_hide_mode (window, int.parse (val)); + default: + break; } } } From 6cabae8ceec19f1d5f6db8421cfeef8476b524f6 Mon Sep 17 00:00:00 2001 From: Leonhard <106322251+leolost2605@users.noreply.github.com> Date: Sun, 28 Jul 2024 12:01:39 +0200 Subject: [PATCH 3/6] Apply suggestions from code review Co-authored-by: Leo --- src/ShellClients/ShellClientsManager.vala | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/ShellClients/ShellClientsManager.vala b/src/ShellClients/ShellClientsManager.vala index edc6e2951..c97542280 100644 --- a/src/ShellClients/ShellClientsManager.vala +++ b/src/ShellClients/ShellClientsManager.vala @@ -37,11 +37,12 @@ public class Gala.ShellClientsManager : Object { start_clients.begin (); - //X11 only - wm.get_display ().window_created.connect ((window) => { - window.notify["mutter-hints"].connect ((obj, pspec) => parse_mutter_hints ((Meta.Window) obj)); - parse_mutter_hints (window); - }); + if (!Meta.Util.is_wayland_compositor ()) { + wm.get_display ().window_created.connect ((window) => { + window.notify["mutter-hints"].connect ((obj, pspec) => parse_mutter_hints ((Meta.Window) obj)); + parse_mutter_hints (window); + }); + } } private async void start_clients () { @@ -112,7 +113,7 @@ public class Gala.ShellClientsManager : Object { } } - private void make_dock_wayland (Meta.Window window) { + private void make_dock_wayland (Meta.Window window) requires (Meta.Util.is_wayland_compositor ()) { foreach (var client in protocol_clients) { if (client.wayland_client.owns_window (window)) { client.wayland_client.make_dock (window); @@ -191,7 +192,7 @@ public class Gala.ShellClientsManager : Object { } //X11 only - private void parse_mutter_hints (Meta.Window window) { + private void parse_mutter_hints (Meta.Window window) requires (!Meta.Util.is_wayland_compositor ()) { if (window.mutter_hints == null) { return; } From 3d81a87720b31958f26d7857d00f2181f7a4a41a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danielle=20For=C3=A9?= Date: Thu, 1 Aug 2024 10:56:25 -0700 Subject: [PATCH 4/6] Fix lint --- src/ShellClients/ShellClientsManager.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ShellClients/ShellClientsManager.vala b/src/ShellClients/ShellClientsManager.vala index c97542280..1075b4ae1 100644 --- a/src/ShellClients/ShellClientsManager.vala +++ b/src/ShellClients/ShellClientsManager.vala @@ -192,7 +192,7 @@ public class Gala.ShellClientsManager : Object { } //X11 only - private void parse_mutter_hints (Meta.Window window) requires (!Meta.Util.is_wayland_compositor ()) { + private void parse_mutter_hints (Meta.Window window) requires (!Meta.Util.is_wayland_compositor ()) { if (window.mutter_hints == null) { return; } From 42b035137d6e81072073b2c2758ab200c1c13145 Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 1 Aug 2024 20:30:37 +0200 Subject: [PATCH 5/6] Use try parse, add checks and warnings --- src/ShellClients/ShellClientsManager.vala | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/ShellClients/ShellClientsManager.vala b/src/ShellClients/ShellClientsManager.vala index 1075b4ae1..f7395218d 100644 --- a/src/ShellClients/ShellClientsManager.vala +++ b/src/ShellClients/ShellClientsManager.vala @@ -210,11 +210,21 @@ public class Gala.ShellClientsManager : Object { switch (key) { case "anchor": - set_anchor (window, int.parse (val)); + int parsed; + if (int.try_parse (val, out parsed) && 0 <= parsed && parsed <= 15) { + set_anchor (window, parsed); + } else { + warning ("Failed to parse %s as anchor", val); + } break; case "hide-mode": - set_hide_mode (window, int.parse (val)); + int parsed; + if (int.try_parse (val, out parsed) && 0 <= parsed && parsed <= 4) { + set_hide_mode (window, parsed); + } else { + warning ("Failed to parse %s as hide mode", val); + } break; case "size": @@ -222,9 +232,12 @@ public class Gala.ShellClientsManager : Object { if (split_val.length != 2) { break; } - var width = int.parse (split_val[0]); - var height = int.parse (split_val[1]); - set_size (window, width, height); + int parsed_width, parsed_height = 0; //set to 0 because vala doesn't realize height will be set too + if (int.try_parse (split_val[0], out parsed_width) && int.try_parse (split_val[1], out parsed_height)) { + set_size (window, parsed_width, parsed_height); + } else { + warning ("Failed to parse %s as width and height", val); + } break; case "centered": From 1830579569aad0c73c888bcc695f544953a29d6e Mon Sep 17 00:00:00 2001 From: Leonhard Kargl Date: Thu, 8 Aug 2024 12:05:54 +0200 Subject: [PATCH 6/6] Add comments --- src/ShellClients/ShellClientsManager.vala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ShellClients/ShellClientsManager.vala b/src/ShellClients/ShellClientsManager.vala index f7395218d..b65b2b2c4 100644 --- a/src/ShellClients/ShellClientsManager.vala +++ b/src/ShellClients/ShellClientsManager.vala @@ -210,7 +210,7 @@ public class Gala.ShellClientsManager : Object { switch (key) { case "anchor": - int parsed; + int parsed; // Will be used as Meta.Side which is a 4 value bitfield so check bounds for that if (int.try_parse (val, out parsed) && 0 <= parsed && parsed <= 15) { set_anchor (window, parsed); } else { @@ -219,7 +219,7 @@ public class Gala.ShellClientsManager : Object { break; case "hide-mode": - int parsed; + int parsed; // Will be used as Pantheon.Desktop.HideMode which is a 5 value enum so check bounds for that if (int.try_parse (val, out parsed) && 0 <= parsed && parsed <= 4) { set_hide_mode (window, parsed); } else {