diff --git a/gui-apps/swaync/Manifest b/gui-apps/swaync/Manifest index cd310e6293..1957ad3a66 100644 --- a/gui-apps/swaync/Manifest +++ b/gui-apps/swaync/Manifest @@ -1 +1,2 @@ DIST swaync-0.7.3.tar.gz 3155355 BLAKE2B d976d908c12eef9a0fe71e269fd4dd1bca44cb7a389ea3b6fbcf7ef0a7cfd17623e4fa03fb61cb7d5a26837deafd0b3f8197774fe1ce17c47d512632d5aedc81 SHA512 fe049fae8ece0e54badd44ea6d04f7fa0a09c7cb258612897dbcb4b7b60ef28fc19113ec4b84520ac8226901b9d5a0b9cd11c3b071d9e90e840ac7e4595a51fc +DIST swaync-0.8.0.tar.gz 3170861 BLAKE2B a43fd4d095b3bb1b39ff914cf3f09f9d97807d95365839a30c46c607c601c8e557e4365e3c23cbf650dca7b5a51523e4fbc8ecf49d7863b717b04e0c90e04f46 SHA512 c1ee542fff2b6b06cd0def99c96bede5cb3dc576ab4e0498bd110f1b6e3df2786526d5ec58dbfc7f5c488afc2c1c85541e878c76118486530b8937a5e13a0799 diff --git a/gui-apps/swaync/files/swaync-0.8.0-pulsefree.patch b/gui-apps/swaync/files/swaync-0.8.0-pulsefree.patch new file mode 100644 index 0000000000..5ef56ca477 --- /dev/null +++ b/gui-apps/swaync/files/swaync-0.8.0-pulsefree.patch @@ -0,0 +1,942 @@ +diff --git a/.github/workflows/arch-build.yml b/.github/workflows/arch-build.yml +index aa7ac12..395339a 100644 +--- a/.github/workflows/arch-build.yml ++++ b/.github/workflows/arch-build.yml +@@ -18,7 +18,7 @@ jobs: + container: archlinux:latest + runs-on: ubuntu-latest + env: +- PACKAGES: meson gtk3 gobject-introspection vala json-glib libhandy gtk-layer-shell scdoc libpulse libgee ++ PACKAGES: meson gtk3 gobject-introspection vala json-glib libhandy gtk-layer-shell scdoc + steps: + - name: Install packages + run: | +diff --git a/.github/workflows/ubuntu-build.yml b/.github/workflows/ubuntu-build.yml +index e29f197..61d119d 100644 +--- a/.github/workflows/ubuntu-build.yml ++++ b/.github/workflows/ubuntu-build.yml +@@ -19,7 +19,7 @@ jobs: + runs-on: ubuntu-latest + env: + DEBIAN_FRONTEND: noninteractive +- PACKAGES: meson libwayland-dev libgtk-3-dev gobject-introspection libgirepository1.0-dev valac libjson-glib-dev libhandy-1-dev libgtk-layer-shell-dev scdoc libgee-0.8-dev libpulse-dev ++ PACKAGES: meson libwayland-dev libgtk-3-dev gobject-introspection libgirepository1.0-dev valac libjson-glib-dev libhandy-1-dev libgtk-layer-shell-dev scdoc + steps: + - name: Install packages + run: | +diff --git a/README.md b/README.md +index 5de6365..2bd742d 100644 +--- a/README.md ++++ b/README.md +@@ -53,7 +53,6 @@ These widgets can be customized, added, removed and even reordered + - Mpris (Media player controls for Spotify, Firefox, Chrome, etc...) + - Menubar with dropdown and buttons + - Button grid +-- Volume slider using PulseAudio + - Backlight slider + + ## Planned Features +diff --git a/build-scripts/PKGBUILD b/build-scripts/PKGBUILD +index bdcbdaf..5df0d85 100644 +--- a/build-scripts/PKGBUILD ++++ b/build-scripts/PKGBUILD +@@ -11,7 +11,7 @@ arch=( + 'armv7h' # ARM v7 hardfloat + ) + license=(GPL3) +-depends=("gtk3" "gtk-layer-shell" "dbus" "glib2" "gobject-introspection" "libgee" "json-glib" "libhandy" "libpulse") ++depends=("gtk3" "gtk-layer-shell" "dbus" "glib2" "gobject-introspection" "libgee" "json-glib" "libhandy") + conflicts=("swaync" "swaync-client") + provides=("swaync" "swaync-client") + makedepends=(vala meson git scdoc) +diff --git a/build-scripts/PKGBUILD-git b/build-scripts/PKGBUILD-git +index 6effc15..53de290 100644 +--- a/build-scripts/PKGBUILD-git ++++ b/build-scripts/PKGBUILD-git +@@ -11,7 +11,7 @@ arch=( + 'armv7h' # ARM v7 hardfloat + ) + license=('GPL3') +-depends=("gtk3" "gtk-layer-shell" "dbus" "glib2" "gobject-introspection" "libgee" "json-glib" "libhandy" "libpulse" ) ++depends=("gtk3" "gtk-layer-shell" "dbus" "glib2" "gobject-introspection" "libgee" "json-glib" "libhandy") + conflicts=("swaync" "swaync-client") + provides=("swaync" "swaync-client") + makedepends=(vala meson git scdoc) +diff --git a/build-scripts/swaync.rpkg.spec b/build-scripts/swaync.rpkg.spec +index a16b073..b2ef198 100644 +--- a/build-scripts/swaync.rpkg.spec ++++ b/build-scripts/swaync.rpkg.spec +@@ -23,7 +23,6 @@ BuildRequires: libhandy-devel >= 1.4.0 + BuildRequires: systemd-devel + BuildRequires: systemd + BuildRequires: scdoc +-BuildRequires: pulseaudio-libs-devel + %{?systemd_requires} + + %description +diff --git a/man/swaync.5.scd b/man/swaync.5.scd +index ba83f55..f4c0157 100644 +--- a/man/swaync.5.scd ++++ b/man/swaync.5.scd +@@ -375,16 +375,6 @@ config file to be able to detect config errors + description: "Command to be executed on click" ++ + description: A list of actions containing a label and a command ++ + description: A grid of buttons that execute shell commands ++ +- *volume*++ +- type: object ++ +- css class: widget-volume ++ +- properties: ++ +- label: ++ +- type: string ++ +- optional: true ++ +- default: "Volume" ++ +- description: Text displayed in front of the volume slider ++ +- description: Slider to control pulse volume ++ + *backlight*++ + type: object ++ + css class: widget-backlight ++ +@@ -431,7 +421,6 @@ config file to be able to detect config errors + default: "Clear All" ++ + description: "Clear All" button text ++ + description: Displayed if notifications are inhibited. +- + example: + ``` + { +diff --git a/src/configSchema.json b/src/configSchema.json +index 9bbb649..c2bd07b 100644 +--- a/src/configSchema.json ++++ b/src/configSchema.json +@@ -293,9 +293,6 @@ + "^menubar(#[a-zA-Z0-9_-]{1,}){0,1}?$": { + "$ref": "#/widgets/menubar" + }, +- "^volume(#[a-zA-Z0-9_-]{1,}){0,1}?$": { +- "$ref": "#/widgets/volume" +- }, + "^backlight(#[a-zA-Z0-9_-]{1,}){0,1}?$": { + "$ref": "#/widgets/backlight" + }, +@@ -446,18 +443,6 @@ + } + } + }, +- "volume": { +- "type": "object", +- "description": "Slider to control pulse volume", +- "additionalProperties": false, +- "properties": { +- "label": { +- "type": "string", +- "description": "Text displayed in front of the volume slider", +- "default": "Volume" +- } +- } +- }, + "backlight": { + "type": "object", + "description": "Slider to control monitor brightness", +diff --git a/src/controlCenter/widgets/factory.vala b/src/controlCenter/widgets/factory.vala +index aea178d..f2ed445 100644 +--- a/src/controlCenter/widgets/factory.vala ++++ b/src/controlCenter/widgets/factory.vala +@@ -26,9 +26,6 @@ namespace SwayNotificationCenter.Widgets { + case "buttons-grid": + widget = new ButtonsGrid (suffix, swaync_daemon, noti_daemon); + break; +- case "volume": +- widget = new Volume (suffix, swaync_daemon, noti_daemon); +- break; + case "backlight": + widget = new Backlight (suffix, swaync_daemon, noti_daemon); + break; +diff --git a/src/controlCenter/widgets/volume/pulseDaemon.vala b/src/controlCenter/widgets/volume/pulseDaemon.vala +deleted file mode 100644 +index 766bf45..0000000 +--- a/src/controlCenter/widgets/volume/pulseDaemon.vala ++++ /dev/null +@@ -1,531 +0,0 @@ +-// From SwaySettings PulseAudio page: https://github.com/ErikReider/SwaySettings/blob/407c9e99dd3e50a0f09c64d94a9e6ff741488378/src/Pages/Pulse/PulseDaemon.vala +-using PulseAudio; +-using Gee; +- +-namespace SwayNotificationCenter.Widgets { +- /** +- * Loosely based off of Elementary OS switchboard-plug-sound +- * https://github.com/elementary/switchboard-plug-sound +- */ +- public class PulseDaemon : Object { +- private Context context; +- private GLibMainLoop mainloop; +- private bool quitting = false; +- +- public bool running { get; private set; } +- +- private string default_sink_name { get; private set; } +- private string default_source_name { get; private set; } +- +- private PulseDevice ? default_sink = null; +- +- public HashMap sinks { get; private set; } +- +- construct { +- mainloop = new GLibMainLoop (); +- +- sinks = new HashMap (); +- } +- +- public void start () { +- get_context (); +- } +- +- public void close () { +- quitting = true; +- context.disconnect (); +- context = null; +- } +- +- public signal void change_default_device (PulseDevice device); +- +- public signal void new_device (PulseDevice device); +- public signal void change_device (PulseDevice device); +- public signal void remove_device (PulseDevice device); +- +- private void get_context () { +- var ctx = new Context (mainloop.get_api (), null); +- ctx.set_state_callback ((ctx) => { +- debug ("Pulse Status: %s\n", ctx.get_state ().to_string ()); +- switch (ctx.get_state ()) { +- case Context.State.CONNECTING: +- case Context.State.AUTHORIZING: +- case Context.State.SETTING_NAME: +- break; +- case Context.State.READY: +- ctx.set_subscribe_callback (subscription); +- ctx.subscribe (Context.SubscriptionMask.SINK_INPUT | +- Context.SubscriptionMask.SINK | +- Context.SubscriptionMask.CARD | +- Context.SubscriptionMask.SERVER); +- // Init data +- ctx.get_server_info (this.get_server_info); +- running = true; +- break; +- case Context.State.TERMINATED: +- case Context.State.FAILED: +- running = false; +- if (quitting) { +- quitting = false; +- break; +- } +- stderr.printf ( +- "PulseAudio connection lost. Will retry connection.\n"); +- get_context (); +- break; +- default: +- running = false; +- stderr.printf ("Connection failure: %s\n", +- PulseAudio.strerror (ctx.errno ())); +- break; +- } +- }); +- if (ctx.connect ( +- null, Context.Flags.NOFAIL, null) < 0) { +- stdout.printf ("pa_context_connect() failed: %s\n", +- PulseAudio.strerror (ctx.errno ())); +- } +- this.context = ctx; +- } +- +- private void subscription (Context ctx, +- Context.SubscriptionEventType t, +- uint32 index) { +- var type = t & Context.SubscriptionEventType.FACILITY_MASK; +- var event = t & Context.SubscriptionEventType.TYPE_MASK; +- switch (type) { +- case Context.SubscriptionEventType.SINK: +- switch (event) { +- default: break; +- case Context.SubscriptionEventType.NEW: +- case Context.SubscriptionEventType.CHANGE: +- ctx.get_sink_info_by_index (index, this.get_sink_info); +- break; +- case Context.SubscriptionEventType.REMOVE: +- foreach (var sink in sinks.values) { +- if (sink.device_index != index) continue; +- sink.removed = true; +- sink.is_default = false; +- this.remove_device (sink); +- break; +- } +- break; +- } +- break; +- case Context.SubscriptionEventType.CARD: +- switch (event) { +- default: break; +- case Context.SubscriptionEventType.NEW: +- case Context.SubscriptionEventType.CHANGE: +- ctx.get_card_info_by_index (index, this.get_card_info); +- break; +- case Context.SubscriptionEventType.REMOVE: +- // A safe way of removing the sink_input +- var iter = sinks.map_iterator (); +- while (iter.next ()) { +- var device = iter.get_value (); +- if (device.card_index != index) continue; +- device.removed = true; +- device.is_default = false; +- iter.unset (); +- this.remove_device (device); +- break; +- } +- break; +- } +- break; +- case Context.SubscriptionEventType.SERVER: +- ctx.get_server_info (this.get_server_info); +- break; +- default: break; +- } +- } +- +- /* +- * Getters +- */ +- +- /** +- * Gets called when any server value changes like default devices +- * Calls `get_card_info_list` and `get_sink_info_list` +- */ +- private void get_server_info (Context ctx, ServerInfo ? info) { +- if (this.default_sink_name == null) { +- this.default_sink_name = info.default_sink_name; +- } +- if (this.default_sink_name != info.default_sink_name) { +- this.default_sink_name = info.default_sink_name; +- } +- +- ctx.get_card_info_list (this.get_card_info); +- ctx.get_sink_info_list (this.get_sink_info); +- } +- +- private void get_card_info (Context ctx, CardInfo ? info, int eol) { +- if (info == null || eol != 0) return; +- +- unowned string ? description = info.proplist +- .gets ("device.description"); +- unowned string ? props_icon = info.proplist +- .gets ("device.icon_name"); +- +- PulseDevice[] ports = {}; +- foreach (var port in info.ports) { +- if (port->available == PortAvailable.NO) continue; +- +- bool is_input = port->direction == Direction.INPUT; +- HashMap devices = this.sinks; +- string id = PulseDevice.get_hash_map_key ( +- description, port.name); +- +- bool has_device = devices.has_key (id); +- PulseDevice device = has_device +- ? devices.get (id) : new PulseDevice (); +- bool device_is_removed = device.removed; +- device.removed = false; +- +- device.is_bluetooth = info.proplist.gets ("device.api") == "bluez5"; +- +- device.card_index = info.index; +- device.direction = port.direction; +- +- device.card_name = info.name; +- device.card_description = description; +- device.card_active_profile = info.active_profile2->name; +- +- device.port_name = port.name; +- device.port_description = port.description; +- device.port_id = port->proplist.gets ("card.profile.port"); +- +- // Get port profiles2 (profiles is "Superseded by profiles2") +- // and sort largest priority first +- var profiles = new ArrayList +- .wrap (port->profiles2); +- +- profiles.sort ((a, b) => { +- if (a->priority == b->priority) return 0; +- return a.priority > b.priority ? -1 : 1; +- }); +- string[] new_profiles = {}; +- Array pulse_profiles = new Array (); +- foreach (var profile in profiles) { +- new_profiles += profile->name; +- +- var card_profile = new PulseCardProfile (profile); +- pulse_profiles.append_val (card_profile); +- if (profile->name == device.card_active_profile) { +- device.active_profile = card_profile; +- } +- } +- device.port_profiles = new_profiles; +- device.profiles = pulse_profiles; +- +- device.icon_name = port->proplist.gets ("device.icon_name") +- ?? props_icon; +- if (device.icon_name == null) { +- device.icon_name = is_input +- ? "microphone-sensitivity-high" +- : "audio-speakers"; +- } +- devices.set (id, device); +- ports += device; +- if (!has_device || device_is_removed) { +- this.new_device (device); +- } +- } +- +- /** Removes ports that are no longer available */ +- var iter = sinks.map_iterator (); +- while (iter.next ()) { +- var device = iter.get_value (); +- if (device.card_index != info.index) continue; +- bool found = false; +- foreach (var p in ports) { +- if (device.get_current_hash_key () +- == p.get_current_hash_key ()) { +- found = true; +- break; +- } +- } +- if (!found) { +- iter.unset (); +- remove_device (device); +- break; +- } +- } +- } +- +- private void get_sink_info (Context ctx, SinkInfo ? info, int eol) { +- if (info == null || eol != 0) return; +- +- bool found = false; +- foreach (PulseDevice device in sinks.values) { +- if (device.card_index == info.card) { +- // Sets the name and index to profiles that aren't active +- // Ex: The HDMI audio port that's not active +- device.device_name = info.name; +- device.device_description = info.description; +- device.device_index = info.index; +- // If the current selected sink profile is this +- if (info.active_port != null +- && info.active_port->name == device.port_name) { +- found = true; +- +- device.card_sink_port_name = info.active_port->name; +- bool is_default = +- device.device_name == this.default_sink_name; +- device.is_default = is_default; +- +- device.is_muted = info.mute == 1; +- +- device.is_virtual = info.proplist.gets ("node.virtual") == "true"; +- +- device.cvolume = info.volume; +- device.channel_map = info.channel_map; +- device.balance = device.cvolume +- .get_balance (device.channel_map); +- device.volume_operations.foreach ((op) => { +- if (op.get_state () != Operation.State.RUNNING) { +- device.volume_operations.remove (op); +- } +- return Source.CONTINUE; +- }); +- if (device.volume_operations.is_empty) { +- device.volume = volume_to_double ( +- device.cvolume.max ()); +- } +- +- if (is_default) { +- this.default_sink = device; +- this.change_default_device (device); +- } +- } +- this.change_device (device); +- } +- } +- // If not found, it's a cardless device +- if (found) return; +- +- HashMap devices = this.sinks; +- string id = PulseDevice.get_hash_map_key ( +- info.index.to_string (), info.description); +- bool has_device = devices.has_key (id); +- PulseDevice device = has_device ? devices.get (id) : new PulseDevice (); +- +- bool device_is_removed = device.removed; +- device.removed = false; +- +- device.has_card = false; +- +- device.direction = PulseAudio.Direction.OUTPUT; +- +- device.device_name = info.name; +- device.device_description = info.description; +- device.device_index = info.index; +- +- bool is_default = device.device_name == this.default_source_name; +- device.is_default = is_default; +- +- device.is_muted = info.mute == 1; +- +- device.is_virtual = info.proplist.gets ("node.virtual") == "true"; +- +- device.icon_name = "application-x-executable-symbolic"; +- +- device.cvolume = info.volume; +- device.channel_map = info.channel_map; +- device.balance = device.cvolume +- .get_balance (device.channel_map); +- device.volume_operations.foreach ((op) => { +- if (op.get_state () != Operation.State.RUNNING) { +- device.volume_operations.remove (op); +- } +- return Source.CONTINUE; +- }); +- if (device.volume_operations.is_empty) { +- device.volume = volume_to_double ( +- device.cvolume.max ()); +- } +- +- devices.set (id, device); +- +- if (is_default) { +- this.default_sink = device; +- this.change_default_device (device); +- } +- if (!has_device || device_is_removed) { +- this.new_device (device); +- } +- this.change_device (device); +- } +- +- /* +- * Setters +- */ +- public void set_device_volume (PulseDevice device, double volume) { +- device.volume_operations.foreach ((operation) => { +- if (operation.get_state () == Operation.State.RUNNING) { +- operation.cancel (); +- } +- +- device.volume_operations.remove (operation); +- return GLib.Source.CONTINUE; +- }); +- +- var cvol = device.cvolume; +- cvol.scale (double_to_volume (volume)); +- Operation ? operation = null; +- if (device.direction == Direction.OUTPUT) { +- operation = context.set_sink_volume_by_name ( +- device.device_name, cvol); +- } +- +- if (operation != null) { +- device.volume_operations.add (operation); +- } +- } +- +- public async void set_default_device (PulseDevice device) { +- if (device == null) return; +- bool is_input = device.direction == Direction.INPUT; +- +- // Only set port and card profile if the device is attached to a card +- if (device.has_card) { +- // Gets the profile that includes support for your other device +- string profile_name = device.port_profiles[0]; +- PulseDevice alt_device = default_sink; +- if (alt_device != null) { +- foreach (var profile in device.port_profiles) { +- if (profile in alt_device.port_profiles) { +- profile_name = profile; +- break; +- } +- } +- } +- +- if (profile_name != device.card_active_profile) { +- yield set_card_profile_by_index (profile_name, device); +- yield wait_for_update (device, "device-name"); +- } +- +- if (!is_input) { +- if (device.port_name != device.card_sink_port_name) { +- debug ("Setting port to: %s", device.port_name); +- yield set_sink_port_by_name (device); +- } +- } +- +- if (device.device_name == null) { +- yield wait_for_update (device, "device-name"); +- } +- } +- +- if (!is_input) { +- if (device.device_name != default_sink_name) { +- debug ("Setting default sink to: %s", device.device_name); +- yield set_default_sink (device); +- } +- } +- } +- +- private async void wait_for_update (PulseDevice device, +- string prop_name) { +- SourceFunc callback = wait_for_update.callback; +- ulong handler_id = 0; +- handler_id = device.notify[prop_name].connect ((s, p) => { +- T prop_value; +- device.get (prop_name, out prop_value); +- if (prop_value != null) { +- device.disconnect (handler_id); +- Idle.add ((owned) callback); +- } +- }); +- yield; +- } +- +- public async void set_bluetooth_card_profile (PulseCardProfile profile, +- PulseDevice device) { +- context.set_card_profile_by_index (device.card_index, +- profile.name, +- (c, success) => { +- if (success == 1) { +- set_bluetooth_card_profile.callback (); +- } else { +- stderr.printf ("setting the card %s profile to %s failed\n", +- device.card_name, profile.name); +- } +- }); +- yield; +- // Wait until the device has been updated +- yield wait_for_update (device, "device-name"); +- } +- +- private async void set_card_profile_by_index (string profile_name, +- PulseDevice device) { +- context.set_card_profile_by_index (device.card_index, +- profile_name, +- (c, success) => { +- if (success == 1) { +- set_card_profile_by_index.callback (); +- } else { +- stderr.printf ("setting the card %s profile to %s failed\n", +- device.card_name, profile_name); +- } +- }); +- yield; +- } +- +- private async void set_sink_port_by_name (PulseDevice device) { +- context.set_sink_port_by_name (device.device_name, +- device.port_name, +- (c, success) => { +- if (success == 1) { +- set_sink_port_by_name.callback (); +- } else { +- stderr.printf ("setting sink port to %s failed\n", +- device.port_name); +- } +- }); +- yield; +- } +- +- private async void set_default_sink (PulseDevice device) { +- context.set_default_sink (device.device_name, (c, success) => { +- if (success == 1) { +- set_default_sink.callback (); +- } else { +- stderr.printf ("setting default sink to %s failed\n", +- device.device_name); +- } +- }); +- yield; +- } +- +- public void set_device_mute (bool state, PulseDevice device) { +- if (device.is_muted == state) return; +- if (device.direction == Direction.OUTPUT) { +- context.set_sink_mute_by_index ( +- device.device_index, state); +- } +- } +- +- // public void set_sink_input_mute (bool state, PulseSinkInput sink_input) { +- // if (sink_input.is_muted == state) return; +- // context.set_sink_input_mute (sink_input.index, state); +- // } +- +- /* +- * Volume utils +- */ +- +- private static double volume_to_double (PulseAudio.Volume vol) { +- double tmp = (double) (vol - PulseAudio.Volume.MUTED); +- return 100 * tmp / (double) (PulseAudio.Volume.NORM - PulseAudio.Volume.MUTED); +- } +- +- private static PulseAudio.Volume double_to_volume (double vol) { +- double tmp = (double) (PulseAudio.Volume.NORM - PulseAudio.Volume.MUTED) * vol / 100; +- return (PulseAudio.Volume) tmp + PulseAudio.Volume.MUTED; +- } +- } +-} +diff --git a/src/controlCenter/widgets/volume/pulseDevice.vala b/src/controlCenter/widgets/volume/pulseDevice.vala +deleted file mode 100644 +index accb8dc..0000000 +--- a/src/controlCenter/widgets/volume/pulseDevice.vala ++++ /dev/null +@@ -1,135 +0,0 @@ +-// From SwaySettings PulseAudio page: https://github.com/ErikReider/SwaySettings/blob/407c9e99dd3e50a0f09c64d94a9e6ff741488378/src/Pages/Pulse/PulseDevice.vala +-using PulseAudio; +-using Gee; +- +-namespace SwayNotificationCenter.Widgets { +- public class PulseCardProfile : Object { +- public string name; +- public string description; +- public uint32 n_sinks; +- public uint32 priority; +- int available; +- +- public PulseCardProfile (CardProfileInfo2 * profile) { +- this.name = profile->name; +- this.description = profile->description; +- this.n_sinks = profile->n_sinks; +- this.priority = profile->priority; +- this.available = profile->available; +- } +- +- public bool cmp (PulseCardProfile profile) { +- return profile.name == name +- && profile.description == description +- && profile.n_sinks == n_sinks +- && profile.priority == priority +- && profile.available == available; +- } +- } +- +- public class PulseDevice : Object { +- +- public bool removed { get; set; default = false; } +- +- public bool has_card { get; set; default = true; } +- +- /** The card index: ex. `Card #49` */ +- public uint32 card_index { get; set; } +- /** Sink index: ex. `Sink #55` */ +- public uint32 device_index { get; set; } +- +- /** Input or Output */ +- public Direction direction { get; set; } +- +- /** Is default Sink */ +- public bool is_default { get; set; } +- /** If the device is virtual */ +- public bool is_virtual { get; set; default = false; } +- /** If the device is a bluetooth device */ +- public bool is_bluetooth { get; set; default = false; } +- +- /** The icon name: `device.icon_name` */ +- public string icon_name { get; set; } +- +- /** The card name: `Name` */ +- public string card_name { get; set; } +- /** The card description: `device.description` */ +- public string card_description { get; set; } +- /** The card active profile: `Active Profile` */ +- public string card_active_profile { get; set; } +- /** The card sink port name: `Active Port` */ +- public string card_sink_port_name { get; set; } +- +- /** The Sink name: `Name` */ +- public string ? device_name { get; set; } +- /** The Sink description: `Description` */ +- public string device_description { get; set; } +- /** If the Sink is muted: `Mute` */ +- public bool is_muted { get; set; } +- +- public double volume { get; set; } +- public float balance { get; set; default = 0; } +- public CVolume cvolume; +- public ChannelMap channel_map; +- public LinkedList volume_operations { get; set; } +- +- /** Gets the name to be shown to the user: +- * "port_description - card_description" +- */ +- public string ? get_display_name () { +- if (card_name == null) { +- return device_description; +- } +- string p_desc = port_description; +- string c_desc = card_description; +- return "%s - %s".printf (p_desc, c_desc); +- } +- +- /** Compares PulseDevices. Returns true if they're the same */ +- public bool cmp (PulseDevice device) { +- return device.card_index == card_index +- && device.device_index == device_index +- && device.device_name == device_name +- && device.device_description == device_description +- && device.is_default == is_default +- && device.removed == removed +- && device.card_active_profile == card_active_profile +- && device.port_name == port_name; +- } +- +- /** +- * Gets the name to be shown to the user: +- * If has card: "card_description:port_name" +- * If cardless: "device_index:device_description" +- */ +- public string get_current_hash_key () { +- if (card_name == null) { +- return get_hash_map_key (device_index.to_string (), +- device_description); +- } +- return get_hash_map_key (card_description, port_name); +- } +- +- /** Gets the name to be shown to the user: +- * "card_description:port_name" +- */ +- public static string get_hash_map_key (string c_desc, string p_name) { +- return string.joinv (":", new string[] { c_desc, p_name }); +- } +- +- /** The port name: `Name` */ +- public string port_name { get; set; } +- /** The port name: `Description` */ +- public string port_description { get; set; } +- /** The port name: `card.profile.port` */ +- public string port_id { get; set; } +- /** All port profiles */ +- public string[] port_profiles { get; set; } +- public Array profiles { get; set; } +- public PulseCardProfile ? active_profile { get; set; } +- +- construct { +- volume_operations = new LinkedList (); +- } +- } +-} +diff --git a/src/controlCenter/widgets/volume/volume.vala b/src/controlCenter/widgets/volume/volume.vala +deleted file mode 100644 +index 4575921..0000000 +--- a/src/controlCenter/widgets/volume/volume.vala ++++ /dev/null +@@ -1,61 +0,0 @@ +-namespace SwayNotificationCenter.Widgets { +- public class Volume : BaseWidget { +- public override string widget_name { +- get { +- return "volume"; +- } +- } +- +- Gtk.Label label_widget = new Gtk.Label (null); +- Gtk.Scale slider = new Gtk.Scale.with_range (Gtk.Orientation.HORIZONTAL, 0, 100, 1); +- +- private PulseDevice ? default_sink = null; +- private PulseDaemon client = new PulseDaemon (); +- +- construct { +- this.client.change_default_device.connect (default_device_changed); +- +- slider.value_changed.connect (() => { +- if (default_sink != null) { +- this.client.set_device_volume ( +- default_sink, +- (float) slider.get_value ()); +- slider.tooltip_text = ((int) slider.get_value ()).to_string (); +- } +- }); +- } +- +- +- public Volume (string suffix, SwayncDaemon swaync_daemon, NotiDaemon noti_daemon) { +- base (suffix, swaync_daemon, noti_daemon); +- +- Json.Object ? config = get_config (this); +- if (config != null) { +- string ? label = get_prop (config, "label"); +- label_widget.set_label (label ?? "Volume"); +- } +- +- slider.draw_value = false; +- +- add (label_widget); +- pack_start (slider, true, true, 0); +- +- show_all (); +- } +- +- public override void on_cc_visibility_change (bool val) { +- if (val) { +- this.client.start (); +- } else { +- this.client.close (); +- } +- } +- +- private void default_device_changed (PulseDevice device) { +- if (device != null && device.direction == PulseAudio.Direction.OUTPUT) { +- this.default_sink = device; +- slider.set_value (device.volume); +- } +- } +- } +-} +diff --git a/src/meson.build b/src/meson.build +index 94a8e2f..2746db2 100644 +--- a/src/meson.build ++++ b/src/meson.build +@@ -40,10 +40,6 @@ widget_sources = [ + 'controlCenter/widgets/menubar/menubar.vala', + # Widget: Buttons Grid + 'controlCenter/widgets/buttonsGrid/buttonsGrid.vala', +- # Widget: Volume +- 'controlCenter/widgets/volume/volume.vala', +- 'controlCenter/widgets/volume/pulseDaemon.vala', +- 'controlCenter/widgets/volume/pulseDevice.vala', + # Widget: Backlight Slider + 'controlCenter/widgets/backlight/backlight.vala', + 'controlCenter/widgets/backlight/backlightUtil.vala', +@@ -75,9 +71,6 @@ app_deps = [ + meson.get_compiler('c').find_library('gtk-layer-shell'), + meson.get_compiler('c').find_library('m', required : true), + meson.get_compiler('vala').find_library('posix'), +- dependency('gee-0.8'), +- dependency('libpulse'), +- dependency('libpulse-mainloop-glib'), + ] + + # Checks if the user wants scripting enabled +diff --git a/src/style.css b/src/style.css +index 96b84a4..b2c7ed6 100644 +--- a/src/style.css ++++ b/src/style.css +@@ -282,15 +282,6 @@ + background: transparent; + } + +-/* Volume widget */ +- +-.widget-volume { +- background-color: @noti-bg; +- padding: 8px; +- margin: 8px; +- border-radius: 12px; +-} +- + /* Backlight widget */ + .widget-backlight { + background-color: @noti-bg; diff --git a/gui-apps/swaync/swaync-0.8.0.ebuild b/gui-apps/swaync/swaync-0.8.0.ebuild new file mode 100644 index 0000000000..2e76984ae1 --- /dev/null +++ b/gui-apps/swaync/swaync-0.8.0.ebuild @@ -0,0 +1,52 @@ +# Copyright 2022-2023 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +inherit meson vala gnome2-utils + +MY_PN="SwayNotificationCenter" +DESCRIPTION="A simple notification daemon with a GTK gui for notifications and control center" +HOMEPAGE="https://github.com/ErikReider/SwayNotificationCenter" +SRC_URI="https://github.com/ErikReider/${MY_PN}/archive/v${PV}.tar.gz -> ${P}.tar.gz" +S="${WORKDIR}/${MY_PN}-${PV}" + +LICENSE="GPL-3" +SLOT="0" +KEYWORDS="~amd64 ~x86" +IUSE="pulseaudio" + +DEPEND=" + dev-libs/glib:2 + dev-libs/gobject-introspection + dev-libs/json-glib + pulseaudio? ( + dev-libs/libgee:= + media-libs/libpulse + ) + dev-libs/wayland + >=gui-libs/gtk-layer-shell-0.7.0[introspection] + gui-libs/libhandy:1 + sys-apps/dbus + x11-libs/gdk-pixbuf:2 + x11-libs/gtk+:3 +" +RDEPEND="${DEPEND}" +BDEPEND=" + $(vala_depend) + app-text/scdoc +" + +src_prepare() { + ! use pulseaudio && local PATCHES=( "${FILESDIR}"/${P}-pulsefree.patch ) + default + vala_setup +} + +pkg_postinst() { + gnome2_schemas_update +} + +pkg_postrm() { + gnome2_schemas_update +}