From c9676dfd5e6f512fadee2aff1a9fb04fa4317918 Mon Sep 17 00:00:00 2001 From: 12thgenpenguin Date: Sun, 1 Oct 2023 17:40:09 +1000 Subject: [PATCH 01/11] Initial mpris blacklist support --- man/swaync.5.scd | 22 +++++++++++++- src/config.json.in | 3 +- src/controlCenter/widgets/mpris/mpris.vala | 34 ++++++++++++++++++++-- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/man/swaync.5.scd b/man/swaync.5.scd index 685259d6..63c215fb 100644 --- a/man/swaync.5.scd +++ b/man/swaync.5.scd @@ -330,6 +330,20 @@ config file to be able to detect config errors optional: true ++ default: 12 ++ description: The border radius of the album art. ++ + blacklist: ++ + type: object ++ + optional: true ++ + description: Audio sources for the mpris widget to ignore. ++ + properties: ++ + : ++ + type: object ++ + properties: ++ + state: ++ + type: string ++ + description: State of the source, typically "blacklisted". ++ + app-name: ++ + type: string ++ + description: Hint `$ qdbus | grep mpris` to find app names. Uses regex. ++ description: A widget that displays multiple music players. ++ *menubar*++ type: object ++ @@ -549,7 +563,13 @@ config file to be able to detect config errors }, "mpris": { "image-size": 96, - "image-radius": 12 + "image-radius": 12, + "blacklist": { + "firefox": { + "state": "blacklisted", + "app-name": "firefox.*" + } + } }, "menubar": { "menu#power": { diff --git a/src/config.json.in b/src/config.json.in index da2c46c2..9ffaae75 100644 --- a/src/config.json.in +++ b/src/config.json.in @@ -73,7 +73,8 @@ }, "mpris": { "image-size": 96, - "image-radius": 12 + "image-radius": 12, + "blacklist": } } } diff --git a/src/controlCenter/widgets/mpris/mpris.vala b/src/controlCenter/widgets/mpris/mpris.vala index 3bac6c9b..51d274c8 100644 --- a/src/controlCenter/widgets/mpris/mpris.vala +++ b/src/controlCenter/widgets/mpris/mpris.vala @@ -2,6 +2,7 @@ namespace SwayNotificationCenter.Widgets.Mpris { public struct Config { int image_size; int image_radius; + string[] blacklist; } public class Mpris : BaseWidget { @@ -91,6 +92,24 @@ namespace SwayNotificationCenter.Widgets.Mpris { // Clamp the radius mpris_config.image_radius = mpris_config.image_radius.clamp ( 0, (int) (mpris_config.image_size * 0.5)); + + // Blacklist + if (config.has_member("blacklist")) { + Json.Object? blacklist_object = config.get_object_member("blacklist"); + if (blacklist_object != null) { + var blacklisted_apps = new Gee.ArrayList(); + foreach (var key in blacklist_object.get_members()) { + Json.Object? app_object = blacklist_object.get_object_member(key); + if (app_object != null && app_object.has_member("state") && app_object.has_member("app-name")) { + string? state = app_object.get_string_member("state"); + if (state == "blacklisted") { + blacklisted_apps.add(app_object.get_string_member("app-name")); + } + } + } + mpris_config.blacklist = blacklisted_apps.to_array(); + } + } } hide (); @@ -117,10 +136,11 @@ namespace SwayNotificationCenter.Widgets.Mpris { private void setup_mpris () throws Error { dbus_iface = Bus.get_proxy_sync (BusType.SESSION, "org.freedesktop.DBus", - "/org/freedesktop/DBus"); + "/org/freedesktop/DBus"); string[] names = dbus_iface.list_names (); foreach (string name in names) { if (!name.has_prefix (MPRIS_PREFIX)) continue; + if (is_blacklisted(name)) continue; if (check_player_exists (name)) return; MprisSource ? source = MprisSource.get_player (name); if (source != null) add_player (name, source); @@ -190,5 +210,15 @@ namespace SwayNotificationCenter.Widgets.Mpris { 0, children_length - 1); carousel.scroll_to (children.nth_data (position)); } + + private bool is_blacklisted (string name) { + foreach (string blacklistedPattern in mpris_config.blacklist) { + string fullPattern = MPRIS_PREFIX + blacklistedPattern; + if (GLib.Regex.match_simple(fullPattern, name, GLib.RegexCompileFlags.JAVASCRIPT_COMPAT, 0)) { + return true; + } + } + return false; + } } -} +} \ No newline at end of file From 7f8b71f8e5ab52f39e5b9c356cf879736d417be2 Mon Sep 17 00:00:00 2001 From: abmantis Date: Sun, 25 Feb 2024 19:04:59 +0000 Subject: [PATCH 02/11] Fix merge conflict --- src/controlCenter/widgets/mpris/mpris.vala | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/controlCenter/widgets/mpris/mpris.vala b/src/controlCenter/widgets/mpris/mpris.vala index 4d1d4a92..c384cdd6 100644 --- a/src/controlCenter/widgets/mpris/mpris.vala +++ b/src/controlCenter/widgets/mpris/mpris.vala @@ -2,11 +2,8 @@ namespace SwayNotificationCenter.Widgets.Mpris { public struct Config { int image_size; int image_radius; -<<<<<<< HEAD - string[] blacklist; -======= bool blur; ->>>>>>> 7e4a8a1c5ec46b6d0319b8e689f326b123c87ef4 + string[] blacklist; } public class Mpris : BaseWidget { From 1c2155fbf979eb4da69bffe900f60872d5ebf7a5 Mon Sep 17 00:00:00 2001 From: abmantis Date: Sun, 25 Feb 2024 19:06:54 +0000 Subject: [PATCH 03/11] Simplify blacklist type and parse --- man/swaync.5.scd | 17 ++++++---------- src/config.json.in | 2 +- src/controlCenter/widgets/mpris/mpris.vala | 23 ++++++++-------------- 3 files changed, 15 insertions(+), 27 deletions(-) diff --git a/man/swaync.5.scd b/man/swaync.5.scd index d93a367f..0441c4ca 100644 --- a/man/swaync.5.scd +++ b/man/swaync.5.scd @@ -331,19 +331,14 @@ config file to be able to detect config errors default: 12 ++ description: The border radius of the album art. ++ blacklist: ++ - type: object ++ + type: array ++ optional: true ++ + default: [] ++ description: Audio sources for the mpris widget to ignore. ++ - properties: ++ - : ++ - type: object ++ - properties: ++ - state: ++ - type: string ++ - description: State of the source, typically "blacklisted". ++ - app-name: ++ - type: string ++ - description: Hint `$ qdbus | grep mpris` to find app names. Uses regex. ++ + Valid array values: ++ + type: string ++ + description: Audio source/app name. Regex alowed. Hint ++ + `$ qdbus | grep mpris` to find source names. ++ description: A widget that displays multiple music players. ++ *menubar*++ type: object ++ diff --git a/src/config.json.in b/src/config.json.in index 64af1957..ddfac1cd 100644 --- a/src/config.json.in +++ b/src/config.json.in @@ -74,7 +74,7 @@ "mpris": { "image-size": 96, "image-radius": 12 - "blacklist": + "blacklist": [] }, "buttons-grid": { "actions": [ diff --git a/src/controlCenter/widgets/mpris/mpris.vala b/src/controlCenter/widgets/mpris/mpris.vala index c384cdd6..84fc424e 100644 --- a/src/controlCenter/widgets/mpris/mpris.vala +++ b/src/controlCenter/widgets/mpris/mpris.vala @@ -102,21 +102,13 @@ namespace SwayNotificationCenter.Widgets.Mpris { if (blur_found) mpris_config.blur = blur; // Blacklist - if (config.has_member("blacklist")) { - Json.Object? blacklist_object = config.get_object_member("blacklist"); - if (blacklist_object != null) { - var blacklisted_apps = new Gee.ArrayList(); - foreach (var key in blacklist_object.get_members()) { - Json.Object? app_object = blacklist_object.get_object_member(key); - if (app_object != null && app_object.has_member("state") && app_object.has_member("app-name")) { - string? state = app_object.get_string_member("state"); - if (state == "blacklisted") { - blacklisted_apps.add(app_object.get_string_member("app-name")); - } - } - } - mpris_config.blacklist = blacklisted_apps.to_array(); + Json.Array ? blacklist = get_prop_array (config, "blacklist"); + if (blacklist != null) { + string[] apps = new string[blacklist.get_length ()]; + for (int i = 0; i < blacklist.get_length (); i++) { + apps[i] = blacklist.get_string_element (i); } + mpris_config.blacklist = apps; } } @@ -267,7 +259,8 @@ namespace SwayNotificationCenter.Widgets.Mpris { private bool is_blacklisted (string name) { foreach (string blacklistedPattern in mpris_config.blacklist) { string fullPattern = MPRIS_PREFIX + blacklistedPattern; - if (GLib.Regex.match_simple(fullPattern, name, GLib.RegexCompileFlags.JAVASCRIPT_COMPAT, 0)) { + if (GLib.Regex.match_simple (fullPattern, name, GLib.RegexCompileFlags.JAVASCRIPT_COMPAT, 0)) { + message ("\"%s\" is blacklisted", name); return true; } } From 4960ac280f85c62eefe35faa43ed24705edabe4e Mon Sep 17 00:00:00 2001 From: abmantis Date: Sun, 25 Feb 2024 19:13:18 +0000 Subject: [PATCH 04/11] Fix man --- man/swaync.5.scd | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/man/swaync.5.scd b/man/swaync.5.scd index 0441c4ca..effcbc67 100644 --- a/man/swaync.5.scd +++ b/man/swaync.5.scd @@ -605,12 +605,7 @@ config file to be able to detect config errors "mpris": { "image-size": 96, "image-radius": 12, - "blacklist": { - "firefox": { - "state": "blacklisted", - "app-name": "firefox.*" - } - } + "blacklist": ["playerctld"] }, "menubar": { "menu#power": { From 97b60af6f34469a2a5eaed181d74fd223a64b37e Mon Sep 17 00:00:00 2001 From: abmantis Date: Sun, 25 Feb 2024 19:14:07 +0000 Subject: [PATCH 05/11] Trim whitespaces --- src/controlCenter/widgets/mpris/mpris.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controlCenter/widgets/mpris/mpris.vala b/src/controlCenter/widgets/mpris/mpris.vala index 84fc424e..24e4d648 100644 --- a/src/controlCenter/widgets/mpris/mpris.vala +++ b/src/controlCenter/widgets/mpris/mpris.vala @@ -181,7 +181,7 @@ namespace SwayNotificationCenter.Widgets.Mpris { private void setup_mpris () throws Error { dbus_iface = Bus.get_proxy_sync (BusType.SESSION, "org.freedesktop.DBus", - "/org/freedesktop/DBus"); + "/org/freedesktop/DBus"); string[] names = dbus_iface.list_names (); foreach (string name in names) { if (!name.has_prefix (MPRIS_PREFIX)) continue; From 13bee9c2190dcc6625391f713a729e6a767c33fb Mon Sep 17 00:00:00 2001 From: abmantis Date: Fri, 10 May 2024 00:34:20 +0100 Subject: [PATCH 06/11] Fix blacklisting when a new player appears --- flake.nix | 35 ++++++++++++++++++++++ src/controlCenter/widgets/mpris/mpris.vala | 2 ++ 2 files changed, 37 insertions(+) create mode 100644 flake.nix diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..ec6413a1 --- /dev/null +++ b/flake.nix @@ -0,0 +1,35 @@ +{ + description = "A very basic flake"; + nixConfig.bash-prompt-prefix = "(nix dev)"; + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-23.11"; + }; + + outputs = { self, nixpkgs }: + let + system = "x86_64-linux"; + pkgs = nixpkgs.legacyPackages.${system}; + in + { + devShells.${system} = { + default = pkgs.mkShell { + name = "SwayNC shell"; + inherit (pkgs.swaynotificationcenter) buildInputs depsBuildBuild depsBuildBuildPropagated depsBuildTarget + depsBuildTargetPropagated depsHostHost depsHostHostPropagated depsTargetTarget + depsTargetTargetPropagated propagatedBuildInputs propagatedNativeBuildInputs strictDeps; + + # overrides for local development + nativeBuildInputs = pkgs.swaynotificationcenter.nativeBuildInputs ++ (with pkgs; [ + sassc + pantheon.granite + vala-language-server + uncrustify + ]); + + configurePhase = "rm -r build ; meson setup build"; + buildPhase = "meson compile -C build"; + launchPhase = "meson devenv -C build ./src/swaync"; + }; + }; + }; +} diff --git a/src/controlCenter/widgets/mpris/mpris.vala b/src/controlCenter/widgets/mpris/mpris.vala index 24e4d648..9a672c3d 100644 --- a/src/controlCenter/widgets/mpris/mpris.vala +++ b/src/controlCenter/widgets/mpris/mpris.vala @@ -197,6 +197,7 @@ namespace SwayNotificationCenter.Widgets.Mpris { remove_player (name); return; } + if (is_blacklisted(name)) return; if (check_player_exists (name)) return; MprisSource ? source = MprisSource.get_player (name); if (source != null) add_player (name, source); @@ -212,6 +213,7 @@ namespace SwayNotificationCenter.Widgets.Mpris { } private void add_player (string name, MprisSource source) { + message ("Adding player \"%s\"", name); MprisPlayer player = new MprisPlayer (source, mpris_config); player.get_style_context ().add_class ("%s-player".printf (css_class_name)); carousel.prepend (player); From 007f59ba930084f75a95b281859e2a43d922a486 Mon Sep 17 00:00:00 2001 From: abmantis Date: Fri, 17 May 2024 21:38:17 +0100 Subject: [PATCH 07/11] Remove flake.nix --- flake.nix | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 flake.nix diff --git a/flake.nix b/flake.nix deleted file mode 100644 index ec6413a1..00000000 --- a/flake.nix +++ /dev/null @@ -1,35 +0,0 @@ -{ - description = "A very basic flake"; - nixConfig.bash-prompt-prefix = "(nix dev)"; - inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixos-23.11"; - }; - - outputs = { self, nixpkgs }: - let - system = "x86_64-linux"; - pkgs = nixpkgs.legacyPackages.${system}; - in - { - devShells.${system} = { - default = pkgs.mkShell { - name = "SwayNC shell"; - inherit (pkgs.swaynotificationcenter) buildInputs depsBuildBuild depsBuildBuildPropagated depsBuildTarget - depsBuildTargetPropagated depsHostHost depsHostHostPropagated depsTargetTarget - depsTargetTargetPropagated propagatedBuildInputs propagatedNativeBuildInputs strictDeps; - - # overrides for local development - nativeBuildInputs = pkgs.swaynotificationcenter.nativeBuildInputs ++ (with pkgs; [ - sassc - pantheon.granite - vala-language-server - uncrustify - ]); - - configurePhase = "rm -r build ; meson setup build"; - buildPhase = "meson compile -C build"; - launchPhase = "meson devenv -C build ./src/swaync"; - }; - }; - }; -} From eeb9574a615207529ed2744f5f3fc975d12c9b10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ab=C3=ADlio=20Costa?= Date: Fri, 17 May 2024 21:38:45 +0100 Subject: [PATCH 08/11] Remove log --- src/controlCenter/widgets/mpris/mpris.vala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/controlCenter/widgets/mpris/mpris.vala b/src/controlCenter/widgets/mpris/mpris.vala index 9a672c3d..738c1d3a 100644 --- a/src/controlCenter/widgets/mpris/mpris.vala +++ b/src/controlCenter/widgets/mpris/mpris.vala @@ -213,7 +213,6 @@ namespace SwayNotificationCenter.Widgets.Mpris { } private void add_player (string name, MprisSource source) { - message ("Adding player \"%s\"", name); MprisPlayer player = new MprisPlayer (source, mpris_config); player.get_style_context ().add_class ("%s-player".printf (css_class_name)); carousel.prepend (player); From fb09aaf9ecaf9443fd0ce6f1aa84f31f738f89d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ab=C3=ADlio=20Costa?= Date: Fri, 17 May 2024 21:39:17 +0100 Subject: [PATCH 09/11] Remove comment --- src/controlCenter/widgets/mpris/mpris.vala | 1 - 1 file changed, 1 deletion(-) diff --git a/src/controlCenter/widgets/mpris/mpris.vala b/src/controlCenter/widgets/mpris/mpris.vala index 738c1d3a..c75abf3f 100644 --- a/src/controlCenter/widgets/mpris/mpris.vala +++ b/src/controlCenter/widgets/mpris/mpris.vala @@ -101,7 +101,6 @@ namespace SwayNotificationCenter.Widgets.Mpris { bool? blur = get_prop (config, "blur", out blur_found); if (blur_found) mpris_config.blur = blur; - // Blacklist Json.Array ? blacklist = get_prop_array (config, "blacklist"); if (blacklist != null) { string[] apps = new string[blacklist.get_length ()]; From ce1d127b478737e9ec74e0ff843ac4a2619281a1 Mon Sep 17 00:00:00 2001 From: abmantis Date: Sun, 14 Jul 2024 00:32:18 +0100 Subject: [PATCH 10/11] Address review suggestions --- src/controlCenter/widgets/mpris/mpris.vala | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/controlCenter/widgets/mpris/mpris.vala b/src/controlCenter/widgets/mpris/mpris.vala index 9a672c3d..6bd70a1a 100644 --- a/src/controlCenter/widgets/mpris/mpris.vala +++ b/src/controlCenter/widgets/mpris/mpris.vala @@ -104,11 +104,14 @@ namespace SwayNotificationCenter.Widgets.Mpris { // Blacklist Json.Array ? blacklist = get_prop_array (config, "blacklist"); if (blacklist != null) { - string[] apps = new string[blacklist.get_length ()]; + mpris_config.blacklist = new string[blacklist.get_length ()]; for (int i = 0; i < blacklist.get_length (); i++) { - apps[i] = blacklist.get_string_element (i); + if(blacklist.get_element (i).get_node_type () != Json.NodeType.VALUE) { + warning ("Blacklist entries should be strings"); + continue; + } + mpris_config.blacklist[i] = blacklist.get_string_element (i); } - mpris_config.blacklist = apps; } } @@ -260,8 +263,10 @@ namespace SwayNotificationCenter.Widgets.Mpris { private bool is_blacklisted (string name) { foreach (string blacklistedPattern in mpris_config.blacklist) { - string fullPattern = MPRIS_PREFIX + blacklistedPattern; - if (GLib.Regex.match_simple (fullPattern, name, GLib.RegexCompileFlags.JAVASCRIPT_COMPAT, 0)) { + if (blacklistedPattern == null || blacklistedPattern.length == 0) { + continue; + } + if (GLib.Regex.match_simple (blacklistedPattern, name, GLib.RegexCompileFlags.JAVASCRIPT_COMPAT, 0)) { message ("\"%s\" is blacklisted", name); return true; } From 22dda5a15fae779eb1fc515049c81ba92186015e Mon Sep 17 00:00:00 2001 From: Erik Reider <35975961+ErikReider@users.noreply.github.com> Date: Wed, 24 Jul 2024 12:59:33 +0200 Subject: [PATCH 11/11] Fixed linter errors --- src/controlCenter/widgets/mpris/mpris.vala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/controlCenter/widgets/mpris/mpris.vala b/src/controlCenter/widgets/mpris/mpris.vala index a738f57b..041c58a9 100644 --- a/src/controlCenter/widgets/mpris/mpris.vala +++ b/src/controlCenter/widgets/mpris/mpris.vala @@ -105,7 +105,7 @@ namespace SwayNotificationCenter.Widgets.Mpris { if (blacklist != null) { mpris_config.blacklist = new string[blacklist.get_length ()]; for (int i = 0; i < blacklist.get_length (); i++) { - if(blacklist.get_element (i).get_node_type () != Json.NodeType.VALUE) { + if (blacklist.get_element (i).get_node_type () != Json.NodeType.VALUE) { warning ("Blacklist entries should be strings"); continue; } @@ -187,7 +187,7 @@ namespace SwayNotificationCenter.Widgets.Mpris { string[] names = dbus_iface.list_names (); foreach (string name in names) { if (!name.has_prefix (MPRIS_PREFIX)) continue; - if (is_blacklisted(name)) continue; + if (is_blacklisted (name)) continue; if (check_player_exists (name)) return; MprisSource ? source = MprisSource.get_player (name); if (source != null) add_player (name, source); @@ -199,7 +199,7 @@ namespace SwayNotificationCenter.Widgets.Mpris { remove_player (name); return; } - if (is_blacklisted(name)) return; + if (is_blacklisted (name)) return; if (check_player_exists (name)) return; MprisSource ? source = MprisSource.get_player (name); if (source != null) add_player (name, source);