Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package gnome-shell for openSUSE:Factory 
checked in at 2026-02-12 17:25:21
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gnome-shell (Old)
 and      /work/SRC/openSUSE:Factory/.gnome-shell.new.1977 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gnome-shell"

Thu Feb 12 17:25:21 2026 rev:285 rq:1332482 version:49.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/gnome-shell/gnome-shell.changes  2026-02-03 
21:25:49.494329982 +0100
+++ /work/SRC/openSUSE:Factory/.gnome-shell.new.1977/gnome-shell.changes        
2026-02-12 17:25:33.590690588 +0100
@@ -1,0 +2,15 @@
+Tue Feb 10 23:01:22 UTC 2026 - Bjørn Lie <[email protected]>
+
+- Update to version 49.4:
+  + Fix screen time tracking with idle inhibitors
+  + Do not recreate default folders after they were removed
+  + Fix tab focus behavior in quick settings menu
+  + Do not expose password text in IM pre-edits
+  + Plugged leak
+  + Misc. bug fixes and cleanups
+  + Updated translations.
+- Update libgnome-volume-control (gvc) tarball following upstreams
+  changes.
+- Following the above, drop 31.patch and 32.patch, merged upstream.
+
+-------------------------------------------------------------------

Old:
----
  31.patch
  32.patch
  gnome-shell-49.3.obscpio

New:
----
  gnome-shell-49.4.obscpio

----------(Old B)----------
  Old:  changes.
- Following the above, drop 31.patch and 32.patch, merged upstream.
  Old:  changes.
- Following the above, drop 31.patch and 32.patch, merged upstream.
----------(Old E)----------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gnome-shell.spec ++++++
--- /var/tmp/diff_new_pack.7TSyNI/_old  2026-02-12 17:25:34.758740140 +0100
+++ /var/tmp/diff_new_pack.7TSyNI/_new  2026-02-12 17:25:34.762740310 +0100
@@ -21,7 +21,7 @@
 %define mutter_req 49.0
 
 Name:           gnome-shell
-Version:        49.3
+Version:        49.4
 Release:        0
 Summary:        GNOME Shell
 # shew extension is LGPL 2.1; gnome-shell-extension-tool is GPL-3.0-or-later
@@ -42,11 +42,6 @@
 # PATCH-FEATURE-OPENSUSE -- Do not ask to launch gnome-tour; openSUSE handles 
the logic in opensuse-welcome-launcher
 Patch100:       gnome-shell-no-gnome-tour.patch
 
-# PATCH-FIX-UPSTREAM - High patch ID nummber, as it needs to be manually 
applied in the gvc submodule directory
-Patch2000:      
https://gitlab.gnome.org/GNOME/libgnome-volume-control/-/merge_requests/31.patch
-# PATCH-FIX-UPSTREAM 32.patch bsc#1257512, 
glgo#GNOME/libgnome-volume-control#39 [email protected] -- Fix duplicated new 
devices introduced by glgo#GNOME/libgnome-volume-control!31
-Patch2001:      
https://gitlab.gnome.org/GNOME/libgnome-volume-control/-/merge_requests/32.patch
-
 ## NOTE: Keep SLE-only patches at bottom (starting on 1000).
 # PATCH-FEATURE-SLE gnome-shell-gdm-login-applet.patch fate#314545 
[email protected] -- Add an applet on login UI to display suse icon, product 
name, hostname.
 Patch1001:      gnome-shell-gdm-login-applet.patch
@@ -188,17 +183,13 @@
 pushd subprojects
 tar xf %{SOURCE1}
 mv libgnome-volume-control-0.gitmodule gvc
-pushd gvc
-%patch -P 2000 -p1
-%patch -P 2001 -p1
-popd
 tar xf %{SOURCE2}
 mv libshew-0.gitmodule libshew
 popd
 %autopatch -p1 -M 999
 
 %if !0%{?is_opensuse} || 0%{?suse_version} <= 1600
-%autopatch -p1 -m 1000 -M 1999
+%autopatch -p1 -m 1000
 %endif
 
 cp %{SOURCE100} data/theme/

++++++ _service ++++++
--- /var/tmp/diff_new_pack.7TSyNI/_old  2026-02-12 17:25:34.810742347 +0100
+++ /var/tmp/diff_new_pack.7TSyNI/_new  2026-02-12 17:25:34.818742686 +0100
@@ -3,7 +3,7 @@
   <service name="obs_scm" mode="manual">
     <param name="scm">git</param>
     <param name="url">https://gitlab.gnome.org/GNOME/gnome-shell.git</param>
-    <param name="revision">49.3</param>
+    <param name="revision">49.4</param>
     <param name="versionformat">@PARENT_TAG@+@TAG_OFFSET@</param>
     <param name="versionrewrite-pattern">(.*)\+0</param>
     <param name="versionrewrite-replacement">\1</param>
@@ -12,7 +12,7 @@
   <service name="obs_scm" mode="manual">
     <param name="scm">git</param>
     <param 
name="url">https://gitlab.gnome.org/GNOME/libgnome-volume-control.git</param>
-    <param name="revision">5f9768a2eac29c1ed56f1fbb449a77a3523683b6</param>
+    <param name="revision">664eba4c054ecc4a140f0ef01ae9297422b71fdc</param>
     <param name="versionformat">0.gitmodule</param>
   </service>
   <service name="obs_scm" mode="manual">

++++++ gnome-shell-49.3.obscpio -> gnome-shell-49.4.obscpio ++++++
++++ 13562 lines of diff (skipped)

++++++ gnome-shell.obsinfo ++++++
--- /var/tmp/diff_new_pack.7TSyNI/_old  2026-02-12 17:25:36.714823123 +0100
+++ /var/tmp/diff_new_pack.7TSyNI/_new  2026-02-12 17:25:36.726823633 +0100
@@ -1,5 +1,5 @@
 name: gnome-shell
-version: 49.3
-mtime: 1768994628
-commit: 6d168562aa00632bfed6caa17cd192e44767f8f1
+version: 49.4
+mtime: 1770743135
+commit: 5e7de8cff584c92823f4f721d0fbd3422605862d
 

++++++ libgnome-volume-control-0.gitmodule.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libgnome-volume-control-0.gitmodule/gvc-mixer-control.c 
new/libgnome-volume-control-0.gitmodule/gvc-mixer-control.c
--- old/libgnome-volume-control-0.gitmodule/gvc-mixer-control.c 2024-05-14 
17:00:36.000000000 +0200
+++ new/libgnome-volume-control-0.gitmodule/gvc-mixer-control.c 2026-02-04 
13:28:08.000000000 +0100
@@ -239,7 +239,6 @@
                                              GvcMixerStream *stream)
 {
         GList                   *devices, *d;
-        gboolean                 is_network_stream;
         const GList             *ports;
         GvcMixerUIDevice        *ret;
 
@@ -253,43 +252,43 @@
 
         ret = NULL;
         ports = gvc_mixer_stream_get_ports (stream);
-        is_network_stream = (ports == NULL);
 
         for (d = devices; d != NULL; d = d->next) {
                 GvcMixerUIDevice *device = d->data;
                 guint stream_id = G_MAXUINT;
+                const GvcMixerStreamPort *port;
 
                 g_object_get (G_OBJECT (device),
                              "stream-id", &stream_id,
                               NULL);
 
-                if (is_network_stream &&
-                    stream_id == gvc_mixer_stream_get_id (stream)) {
-                        g_debug ("lookup device from stream - %s - it is a 
network_stream ",
+                if (stream_id != gvc_mixer_stream_get_id (stream))
+                        continue;
+
+                if (ports == NULL) {
+                        g_debug ("lookup-device-from-stream - %s - is portless 
",
                                  gvc_mixer_ui_device_get_description (device));
                         ret = device;
                         break;
-                } else if (!is_network_stream) {
-                        const GvcMixerStreamPort *port;
-                        port = gvc_mixer_stream_get_port (stream);
-
-                        if (stream_id == gvc_mixer_stream_get_id (stream) &&
-                            g_strcmp0 (gvc_mixer_ui_device_get_port (device),
-                                       port->port) == 0) {
-                                g_debug ("lookup-device-from-stream found 
device: device description '%s', device port = '%s', device stream id %i AND 
stream port = '%s' stream id '%u' and stream description '%s'",
-                                         gvc_mixer_ui_device_get_description 
(device),
-                                         gvc_mixer_ui_device_get_port (device),
-                                         stream_id,
-                                         port->port,
-                                         gvc_mixer_stream_get_id (stream),
-                                         gvc_mixer_stream_get_description 
(stream));
-                                ret = device;
-                                break;
-                        }
+                }
+
+                port = gvc_mixer_stream_get_port (stream);
+                if (g_strcmp0 (gvc_mixer_ui_device_get_port (device), 
port->port) == 0) {
+                        g_debug ("lookup-device-from-stream found device: 
device description '%s', device port = '%s', device stream id %i AND stream 
port = '%s' stream id '%u' and stream description '%s'",
+                                 gvc_mixer_ui_device_get_description (device),
+                                 gvc_mixer_ui_device_get_port (device),
+                                 stream_id,
+                                 port->port,
+                                 gvc_mixer_stream_get_id (stream),
+                                 gvc_mixer_stream_get_description (stream));
+                        ret = device;
+                        break;
+
                 }
         }
 
-        g_debug ("gvc_mixer_control_lookup_device_from_stream - Could not find 
a device for stream '%s'",gvc_mixer_stream_get_description (stream));
+        if (!ret)
+                g_debug ("lookup-device-from-stream - Could not find a device 
for stream '%s'", gvc_mixer_stream_get_description (stream));
 
         g_list_free (devices);
 
@@ -340,7 +339,6 @@
 gvc_mixer_control_set_default_source (GvcMixerControl *control,
                                       GvcMixerStream  *stream)
 {
-        GvcMixerUIDevice* input;
         pa_operation *o;
 
         g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), FALSE);
@@ -372,13 +370,6 @@
 
         pa_operation_unref (o);
 
-        /* source change successful, update the UI. */
-        input = gvc_mixer_control_lookup_device_from_stream (control, stream);
-        g_signal_emit (G_OBJECT (control),
-                       signals[ACTIVE_INPUT_UPDATE],
-                       0,
-                       gvc_mixer_ui_device_get_id (input));
-
         return TRUE;
 }
 
@@ -532,7 +523,7 @@
  * @profile: (allow-none): Can be %NULL if any profile present on this port is 
okay
  *
  * Returns: This method will attempt to swap the profile on the card of
- * the device with given profile name.  If successfull it will set the
+ * the device with given profile name.  If successful it will set the
  * preferred profile on that device so as we know the next time the user
  * moves to that device it should have this profile active.
  */
@@ -584,7 +575,7 @@
  * - Firstly it queries the stream from the device.
  *   - It assumes that if the stream is null that it cannot be a bluetooth or 
network stream (they never show unless they have valid sinks and sources)
  *   In the scenario of a NULL stream on the device
- *        - It fetches the device's preferred profile or if NUll the profile 
with the highest priority on that device.
+ *        - It fetches the device's preferred profile or if NULL the profile 
with the highest priority on that device.
  *        - It then caches this device in 
control->priv->cached_desired_output_id so that when the update_sink triggered
  *          from when we attempt to change profile we will know exactly what 
device to highlight on that stream.
  *        - It attempts to swap the profile on the card from that device and 
returns.
@@ -616,14 +607,7 @@
 
         if (!gvc_mixer_ui_device_has_ports (output)) {
                 g_debug ("Did we try to move to a software/bluetooth sink ?");
-                if (gvc_mixer_control_set_default_sink (control, stream)) {
-                        /* sink change was successful,  update the UI.*/
-                        g_signal_emit (G_OBJECT (control),
-                                       signals[ACTIVE_OUTPUT_UPDATE],
-                                       0,
-                                       gvc_mixer_ui_device_get_id (output));
-                }
-                else {
+                if (!gvc_mixer_control_set_default_sink (control, stream)) {
                         g_warning ("Failed to set default sink with stream 
from output %s",
                                    gvc_mixer_ui_device_get_description 
(output));
                 }
@@ -645,23 +629,11 @@
 
         /* Finally if we are not on the correct stream, swap over. */
         if (stream != default_stream) {
-                GvcMixerUIDevice* device;
-
                 g_debug ("Attempting to swap over to stream %s ",
                          gvc_mixer_stream_get_description (stream));
-                if (gvc_mixer_control_set_default_sink (control, stream)) {
-                        device = gvc_mixer_control_lookup_device_from_stream 
(control, stream);
-                        g_signal_emit (G_OBJECT (control),
-                                       signals[ACTIVE_OUTPUT_UPDATE],
-                                       0,
-                                       gvc_mixer_ui_device_get_id (device));
-                } else {
-                        /* If the move failed for some reason reset the UI. */
-                        device = gvc_mixer_control_lookup_device_from_stream 
(control, default_stream);
-                        g_signal_emit (G_OBJECT (control),
-                                       signals[ACTIVE_OUTPUT_UPDATE],
-                                       0,
-                                       gvc_mixer_ui_device_get_id (device));
+                if (!gvc_mixer_control_set_default_sink (control, stream)) {
+                        g_warning ("Failed to set default sink from output %s",
+                                   gvc_mixer_ui_device_get_description 
(output));
                 }
         }
 }
@@ -675,7 +647,7 @@
  * - Firstly it queries the stream from the device.
  *   - It assumes that if the stream is null that it cannot be a bluetooth or 
network stream (they never show unless they have valid sinks and sources)
  *   In the scenario of a NULL stream on the device
- *        - It fetches the device's preferred profile or if NUll the profile 
with the highest priority on that device.
+ *        - It fetches the device's preferred profile or if NULL the profile 
with the highest priority on that device.
  *        - It then caches this device in 
control->priv->cached_desired_input_id so that when the update_source triggered
  *          from when we attempt to change profile we will know exactly what 
device to highlight on that stream.
  *        - It attempts to swap the profile on the card from that device and 
returns.
@@ -729,7 +701,10 @@
         if (stream != default_stream) {
                 g_debug ("change-input - attempting to swap over to stream %s",
                          gvc_mixer_stream_get_description (stream));
-                gvc_mixer_control_set_default_source (control, stream);
+                if (!gvc_mixer_control_set_default_source (control, stream)) {
+                        g_warning ("Failed to set default source from input 
%s",
+                                   gvc_mixer_ui_device_get_description 
(input));
+                }
         }
 }
 
@@ -1003,11 +978,14 @@
                                new_id);
 
                 input = gvc_mixer_control_lookup_device_from_stream (control, 
stream);
-
-                g_signal_emit (G_OBJECT (control),
-                               signals[ACTIVE_INPUT_UPDATE],
-                               0,
-                               gvc_mixer_ui_device_get_id (input));
+                if (input) {
+                        g_signal_emit (G_OBJECT (control),
+                                       signals[ACTIVE_INPUT_UPDATE],
+                                       0,
+                                       gvc_mixer_ui_device_get_id (input));
+                } else {
+                        g_warning ("Can't find input for stream-id %d",new_id);
+                }
         }
 }
 
@@ -1211,6 +1189,13 @@
         g_object_unref (stream);
 }
 
+/**
+ * add_stream: (skip)
+ * @control: The control to add the stream to
+ * @stream:(transfer full): The stream to add
+ *
+ * Add a stream to the hash table of all known streams
+ */
 static void
 add_stream (GvcMixerControl *control,
             GvcMixerStream  *stream)
@@ -1235,7 +1220,7 @@
                            GvcMixerStreamPort *stream_port,
                            GvcMixerStream     *stream)
 {
-        GList                   *devices, *d;
+        g_autoptr (GList)        devices = NULL;
         guint                    stream_card_id;
         guint                    stream_id;
         gboolean                 in_possession = FALSE;
@@ -1245,12 +1230,12 @@
 
         devices  = g_hash_table_get_values (GVC_IS_MIXER_SOURCE (stream) ? 
control->priv->ui_inputs : control->priv->ui_outputs);
 
-        for (d = devices; d != NULL; d = d->next) {
+        for (GList *d = devices; d != NULL; d = d->next) {
                 GvcMixerUIDevice *device;
                 guint             device_stream_id;
-                gchar            *device_port_name;
-                gchar            *origin;
-                gchar            *description;
+                g_autofree gchar *device_port_name = NULL;
+                g_autofree gchar *origin = NULL;
+                g_autofree gchar *description = NULL;
                 GvcMixerCard     *card;
                 guint             card_id;
 
@@ -1280,33 +1265,63 @@
                                  stream_port->port,
                                  stream_card_id);
 
-                        if (stream_card_id == card_id &&
-                            g_strcmp0 (device_port_name, stream_port->port) == 
0) {
-                                g_debug ("Match device with stream: We have a 
match with description: '%s', origin: '%s', cached already with device id %u, 
so set stream id to %i",
-                                         description,
-                                         origin,
-                                         gvc_mixer_ui_device_get_id (device),
-                                         stream_id);
-
-                                g_object_set (G_OBJECT (device),
-                                              "stream-id", stream_id,
-                                              NULL);
-                                in_possession = TRUE;
+                        if (stream_card_id == card_id) {
+                                if (g_strcmp0 (device_port_name, 
stream_port->port) == 0) {
+                                        g_debug ("Match device with stream: We 
have a match with description: '%s', origin: '%s', cached already with device 
id %u, so set stream id to %i",
+                                                 description,
+                                                 origin,
+                                                 gvc_mixer_ui_device_get_id 
(device),
+                                                 stream_id);
+
+                                        g_object_set (G_OBJECT (device),
+                                                      "stream-id", stream_id,
+                                                      NULL);
+                                        in_possession = TRUE;
+                                } else {
+                                        /* Other UI devices on that card that 
match the stream can't be valid */
+                                        if (device_stream_id == stream_id) {
+                                                g_object_set (G_OBJECT 
(device),
+                                                              "stream-id", 
GVC_MIXER_UI_DEVICE_INVALID,
+                                                              NULL);
+                                                g_debug ("Found another UI 
device for this stream: %d, resetting", stream_id);
+                                        }
+                                }
                         }
                 }
-
-                g_free (device_port_name);
-                g_free (origin);
-                g_free (description);
-
-                if (in_possession == TRUE)
-                        break;
         }
 
-        g_list_free (devices);
         return in_possession;
 }
 
+
+/* Clear stream-id from all UI devices that reference the stream that lost all 
ports */
+static void
+clear_stream_from_devices (GvcMixerControl    *control,
+                           GvcMixerStream     *stream)
+{
+        g_autoptr (GList)        devices = NULL;
+        guint                    stream_id;
+
+        stream_id = gvc_mixer_stream_get_id (stream);
+        devices = g_hash_table_get_values (GVC_IS_MIXER_SOURCE (stream) ? 
control->priv->ui_inputs : control->priv->ui_outputs);
+
+        for (GList *d = devices; d != NULL; d = d->next) {
+                guint             device_stream_id;
+                GvcMixerUIDevice *device = d->data;
+
+                g_object_get (G_OBJECT (device),
+                              "stream-id", &device_stream_id,
+                              NULL);
+
+                if (device_stream_id == stream_id) {
+                        g_object_set (G_OBJECT (device),
+                                      "stream-id", GVC_MIXER_UI_DEVICE_INVALID,
+                                      NULL);
+                        g_debug ("Clearing stream-id: %d", stream_id);
+                }
+        }
+}
+
 /*
  * This method attempts to match a sink or source with its relevant UI device.
  * GvcMixerStream can represent both a sink or source.
@@ -1327,7 +1342,9 @@
  */
 static void
 sync_devices (GvcMixerControl *control,
-              GvcMixerStream* stream)
+              GvcMixerStream*  stream,
+              gboolean         is_new,
+              gboolean         is_bluetooth)
 {
         /* Go through ports to see what outputs can be created. */
         const GList *stream_ports;
@@ -1336,7 +1353,12 @@
 
         stream_ports = gvc_mixer_stream_get_ports (stream);
 
-        if (stream_ports == NULL) {
+        if (stream_ports == NULL && is_bluetooth) {
+                clear_stream_from_devices (control, stream);
+                return;
+        }
+
+        if (stream_ports == NULL && is_new) {
                 GvcMixerUIDevice *device;
                 GObject *object;
 
@@ -1352,7 +1374,7 @@
 
                 g_hash_table_insert (is_output ? control->priv->ui_outputs : 
control->priv->ui_inputs,
                                      GUINT_TO_POINTER 
(gvc_mixer_ui_device_get_id (device)),
-                                     g_object_ref (device));
+                                     device);
 
                 g_signal_emit (G_OBJECT (control),
                                signals[is_output ? OUTPUT_ADDED : INPUT_ADDED],
@@ -1447,6 +1469,20 @@
         }
 }
 
+static gboolean
+is_bluetooth (const pa_proplist *proplist)
+{
+        const char *bus = pa_proplist_gets (proplist, "device.bus");
+
+        if (bus == NULL)
+                return FALSE;
+
+        if (g_str_equal ("bluetooth", bus))
+                return TRUE;
+
+        return FALSE;
+}
+
 /*
  * Called when anything changes with a sink.
  */
@@ -1459,6 +1495,8 @@
         pa_volume_t     max_volume;
         GvcChannelMap   *map;
         char            map_buff[PA_CHANNEL_MAP_SNPRINT_MAX];
+        GList          *list = NULL;
+        gboolean        is_bt;
 
         pa_channel_map_snprint (map_buff, PA_CHANNEL_MAP_SNPRINT_MAX, 
&info->channel_map);
 #if 1
@@ -1475,27 +1513,10 @@
                                       GUINT_TO_POINTER (info->index));
 
         if (stream == NULL) {
-                GList *list = NULL;
-                guint i;
-
                 map = gvc_channel_map_new_from_pa_channel_map 
(&info->channel_map);
                 stream = gvc_mixer_sink_new (control->priv->pa_context,
                                              info->index,
                                              map);
-
-                for (i = 0; i < info->n_ports; i++) {
-                        GvcMixerStreamPort *port;
-
-                        port = g_slice_new0 (GvcMixerStreamPort);
-                        port->port = g_strdup (info->ports[i]->name);
-                        port->human_port = g_strdup 
(info->ports[i]->description);
-                        port->priority = info->ports[i]->priority;
-                        port->available = info->ports[i]->available != 
PA_PORT_AVAILABLE_NO;
-
-                        list = g_list_prepend (list, port);
-                }
-                gvc_mixer_stream_set_ports (stream, list);
-
                 g_object_unref (map);
                 is_new = TRUE;
 
@@ -1505,6 +1526,19 @@
                 return;
         }
 
+        for (guint i = 0; i < info->n_ports; i++) {
+                GvcMixerStreamPort *port;
+
+                port = g_slice_new0 (GvcMixerStreamPort);
+                port->port = g_strdup (info->ports[i]->name);
+                port->human_port = g_strdup (info->ports[i]->description);
+                port->priority = info->ports[i]->priority;
+                port->available = info->ports[i]->available != 
PA_PORT_AVAILABLE_NO;
+
+                list = g_list_prepend (list, port);
+        }
+        gvc_mixer_stream_set_ports (stream, g_steal_pointer (&list));
+
         max_volume = pa_cvolume_max (&info->volume);
         gvc_mixer_stream_set_name (stream, info->name);
         gvc_mixer_stream_set_card_index (stream, info->card);
@@ -1518,6 +1552,11 @@
         gvc_mixer_stream_set_base_volume (stream, (guint32) info->base_volume);
         gvc_mixer_stream_set_state (stream, translate_pa_state (info->state));
 
+        is_bt = is_bluetooth (info->proplist);
+        /* Sync devices as the port on the stream might have changed */
+        if (!is_new)
+                sync_devices (control, stream, is_new, is_bt);
+
         /* Messy I know but to set the port everytime regardless of whether it 
has changed will cost us a
          * port change notify signal which causes the frontend to resync.
          * Only update the UI when something has changed. */
@@ -1530,7 +1569,8 @@
                         if (active_port == NULL ||
                             g_strcmp0 (active_port->port, 
info->active_port->name) != 0) {
                                 g_debug ("update sink - apparently a port 
update");
-                                gvc_mixer_stream_set_port (stream, 
info->active_port->name);
+                                if (!gvc_mixer_stream_set_port (stream, 
info->active_port->name))
+                                        g_warning ("Port update to of %d '%s' 
failed", info->index, info->active_port->name);
                         }
                 }
         }
@@ -1542,9 +1582,9 @@
                                      GUINT_TO_POINTER (info->index),
                                      g_object_ref (stream));
                 add_stream (control, stream);
-                /* Always sink on a new stream to able to assign the right 
stream id
+                /* Always sync on a new stream to able to assign the right 
stream id
                  * to the appropriate outputs (multiple potential outputs per 
stream). */
-                sync_devices (control, stream);
+                sync_devices (control, stream, is_new, is_bt);
         } else {
                 g_signal_emit (G_OBJECT (control),
                                signals[STREAM_CHANGED],
@@ -1584,6 +1624,7 @@
         gvc_channel_map_volume_changed (map, &info->volume, FALSE);
 }
 
+
 static void
 update_source (GvcMixerControl      *control,
                const pa_source_info *info)
@@ -1591,6 +1632,8 @@
         GvcMixerStream *stream;
         gboolean        is_new;
         pa_volume_t     max_volume;
+        GList          *list = NULL;
+        gboolean        is_bt;
 
 #if 1
         g_debug ("Updating source: index=%u name='%s' description='%s'",
@@ -1609,26 +1652,12 @@
         stream = g_hash_table_lookup (control->priv->sources,
                                       GUINT_TO_POINTER (info->index));
         if (stream == NULL) {
-                GList *list = NULL;
-                guint i;
                 GvcChannelMap *map;
 
                 map = gvc_channel_map_new_from_pa_channel_map 
(&info->channel_map);
                 stream = gvc_mixer_source_new (control->priv->pa_context,
                                                info->index,
                                                map);
-
-                for (i = 0; i < info->n_ports; i++) {
-                        GvcMixerStreamPort *port;
-
-                        port = g_slice_new0 (GvcMixerStreamPort);
-                        port->port = g_strdup (info->ports[i]->name);
-                        port->human_port = g_strdup 
(info->ports[i]->description);
-                        port->priority = info->ports[i]->priority;
-                        list = g_list_prepend (list, port);
-                }
-                gvc_mixer_stream_set_ports (stream, list);
-
                 g_object_unref (map);
                 is_new = TRUE;
         } else if (gvc_mixer_stream_is_running (stream)) {
@@ -1637,6 +1666,17 @@
                 return;
         }
 
+        for (guint i = 0; i < info->n_ports; i++) {
+                GvcMixerStreamPort *port;
+
+                port = g_slice_new0 (GvcMixerStreamPort);
+                port->port = g_strdup (info->ports[i]->name);
+                port->human_port = g_strdup (info->ports[i]->description);
+                port->priority = info->ports[i]->priority;
+                list = g_list_prepend (list, port);
+        }
+        gvc_mixer_stream_set_ports (stream, list);
+
         max_volume = pa_cvolume_max (&info->volume);
 
         gvc_mixer_stream_set_name (stream, info->name);
@@ -1650,6 +1690,11 @@
         gvc_mixer_stream_set_base_volume (stream, (guint32) info->base_volume);
         g_debug ("update source");
 
+        is_bt = is_bluetooth (info->proplist);
+        /* Sync devices as the port on the stream might have changed */
+        if (!is_new)
+                sync_devices (control, stream, is_new, is_bt);
+
         if (info->active_port != NULL) {
                 if (is_new)
                         gvc_mixer_stream_set_port (stream, 
info->active_port->name);
@@ -1659,7 +1704,8 @@
                         if (active_port == NULL ||
                             g_strcmp0 (active_port->port, 
info->active_port->name) != 0) {
                                 g_debug ("update source - apparently a port 
update");
-                                gvc_mixer_stream_set_port (stream, 
info->active_port->name);
+                                if (!gvc_mixer_stream_set_port (stream, 
info->active_port->name))
+                                        g_warning ("Port update to of %d '%s' 
failed", info->index, info->active_port->name);
                         }
                 }
         }
@@ -1669,7 +1715,7 @@
                                      GUINT_TO_POINTER (info->index),
                                      g_object_ref (stream));
                 add_stream (control, stream);
-                sync_devices (control, stream);
+                sync_devices (control, stream, is_new, is_bt);
         } else {
                 g_signal_emit (G_OBJECT (control),
                                signals[STREAM_CHANGED],
@@ -1919,9 +1965,9 @@
                                 supported_profiles = g_list_append 
(supported_profiles, prof);
                 }
         }
-        g_debug ("%i profiles supported on port %s",
+        g_debug ("%i profiles supported on port %s / %s",
                  g_list_length (supported_profiles),
-                 port->description);
+                 port->description, port->name);
         return g_list_sort (supported_profiles, (GCompareFunc) 
gvc_mixer_card_profile_compare);
 }
 
@@ -1971,7 +2017,7 @@
                                gvc_mixer_ui_device_get_id (uidevice));
         }
 
-        g_debug ("update_ui_device_on_port_added, direction %u, description 
'%s', origin '%s', port available %i", 
+        g_debug ("update_ui_device_on_port_added, direction %u, description 
'%s', origin '%s', port available %i",
                  direction,
                  port->human_port,
                  gvc_mixer_card_get_name (card),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libgnome-volume-control-0.gitmodule/gvc-mixer-stream.c 
new/libgnome-volume-control-0.gitmodule/gvc-mixer-stream.c
--- old/libgnome-volume-control-0.gitmodule/gvc-mixer-stream.c  2024-05-14 
17:00:36.000000000 +0200
+++ new/libgnome-volume-control-0.gitmodule/gvc-mixer-stream.c  2026-02-04 
13:28:08.000000000 +0100
@@ -532,8 +532,6 @@
                 }
         }
 
-        g_assert_not_reached ();
-
         return NULL;
 }
 
@@ -626,9 +624,13 @@
                             GList          *ports)
 {
         g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
-        g_return_val_if_fail (stream->priv->ports == NULL, FALSE);
 
-        stream->priv->ports = g_list_sort (ports, (GCompareFunc) sort_ports);
+        if (stream->priv->ports) {
+                g_list_free_full (stream->priv->ports, (GDestroyNotify) 
free_port);
+                stream->priv->ports = NULL;
+        }
+        if (ports)
+                stream->priv->ports = g_list_sort (ports, (GCompareFunc) 
sort_ports);
 
         return TRUE;
 }

++++++ libgnome-volume-control.obsinfo ++++++
--- /var/tmp/diff_new_pack.7TSyNI/_old  2026-02-12 17:25:37.038836869 +0100
+++ /var/tmp/diff_new_pack.7TSyNI/_new  2026-02-12 17:25:37.050837378 +0100
@@ -1,5 +1,5 @@
 name: libgnome-volume-control
 version: 0.gitmodule
-mtime: 1715698836
-commit: 5f9768a2eac29c1ed56f1fbb449a77a3523683b6
+mtime: 1770208088
+commit: 664eba4c054ecc4a140f0ef01ae9297422b71fdc
 

Reply via email to