Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package xdg-desktop-portal-wlr for 
openSUSE:Factory checked in at 2026-07-28 21:23:28
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/xdg-desktop-portal-wlr (Old)
 and      /work/SRC/openSUSE:Factory/.xdg-desktop-portal-wlr.new.2004 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "xdg-desktop-portal-wlr"

Tue Jul 28 21:23:28 2026 rev:14 rq:1368241 version:0.8.4

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/xdg-desktop-portal-wlr/xdg-desktop-portal-wlr.changes
    2026-06-18 19:21:33.075472858 +0200
+++ 
/work/SRC/openSUSE:Factory/.xdg-desktop-portal-wlr.new.2004/xdg-desktop-portal-wlr.changes
  2026-07-28 21:23:30.317935729 +0200
@@ -1,0 +2,8 @@
+Tue Jul 28 17:33:42 UTC 2026 - Arnav Singh <[email protected]>
+
+- Update to 0.8.4:
+  * Fix source selection not working when portal client does not specify
+    source type.
+  * Fix stream freezing on PipeWire buffer starvation.
+
+-------------------------------------------------------------------

Old:
----
  xdg-desktop-portal-wlr-0.8.3.tar.gz
  xdg-desktop-portal-wlr-0.8.3.tar.gz.sig

New:
----
  xdg-desktop-portal-wlr-0.8.4.tar.gz
  xdg-desktop-portal-wlr-0.8.4.tar.gz.sig

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

Other differences:
------------------
++++++ xdg-desktop-portal-wlr.spec ++++++
--- /var/tmp/diff_new_pack.g7CTaL/_old  2026-07-28 21:23:31.329971440 +0200
+++ /var/tmp/diff_new_pack.g7CTaL/_new  2026-07-28 21:23:31.333971581 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           xdg-desktop-portal-wlr
-Version:        0.8.3
+Version:        0.8.4
 Release:        0
 Summary:        An xdg-desktop-portal backend for wlroots
 License:        MIT

++++++ xdg-desktop-portal-wlr-0.8.3.tar.gz -> 
xdg-desktop-portal-wlr-0.8.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xdg-desktop-portal-wlr-0.8.3/include/screencast_common.h 
new/xdg-desktop-portal-wlr-0.8.4/include/screencast_common.h
--- old/xdg-desktop-portal-wlr-0.8.3/include/screencast_common.h        
2026-06-18 17:23:58.000000000 +0200
+++ new/xdg-desktop-portal-wlr-0.8.4/include/screencast_common.h        
2026-07-28 18:58:20.000000000 +0200
@@ -198,6 +198,7 @@
        uint32_t node_id;
        bool pwr_stream_state;
        uint32_t framerate;
+       struct xdpw_timer *process_retry;
 
        // wlroots
        union {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/xdg-desktop-portal-wlr-0.8.3/meson.build 
new/xdg-desktop-portal-wlr-0.8.4/meson.build
--- old/xdg-desktop-portal-wlr-0.8.3/meson.build        2026-06-18 
17:23:58.000000000 +0200
+++ new/xdg-desktop-portal-wlr-0.8.4/meson.build        2026-07-28 
18:58:20.000000000 +0200
@@ -1,7 +1,7 @@
 project(
        'xdg-desktop-portal-wlr',
        'c',
-       version: '0.8.3',
+       version: '0.8.4',
        license: 'MIT',
        meson_version: '>=0.60.0',
        default_options: ['c_std=c11', 'warning_level=2', 'werror=true'],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xdg-desktop-portal-wlr-0.8.3/src/screencast/pipewire_screencast.c 
new/xdg-desktop-portal-wlr-0.8.4/src/screencast/pipewire_screencast.c
--- old/xdg-desktop-portal-wlr-0.8.3/src/screencast/pipewire_screencast.c       
2026-06-18 17:23:58.000000000 +0200
+++ new/xdg-desktop-portal-wlr-0.8.4/src/screencast/pipewire_screencast.c       
2026-07-28 18:58:20.000000000 +0200
@@ -233,6 +233,7 @@
 
        if (cast->current_frame.y_invert) {
                //TODO: Flip buffer or set stride negative
+               logprint(ERROR, "pipewire: Y-invert flag is not supported");
                xdpw_screencast_instance_destroy(cast);
                return;
        }
@@ -347,6 +348,11 @@
        wl_array_release(&params);
 }
 
+static void pwr_disarm_process_retry(struct xdpw_screencast_instance *cast) {
+       xdpw_destroy_timer(cast->process_retry);
+       cast->process_retry = NULL;
+}
+
 static void pwr_handle_stream_state_changed(void *data,
                enum pw_stream_state old, enum pw_stream_state state, const 
char *error) {
        struct xdpw_screencast_instance *cast = data;
@@ -363,12 +369,13 @@
                xdpw_wlr_frame_capture(cast);
                break;
        case PW_STREAM_STATE_PAUSED:
-               if (old == PW_STREAM_STATE_STREAMING) {
+               if (old == PW_STREAM_STATE_STREAMING && 
cast->current_frame.pw_buffer) {
                        xdpw_pwr_enqueue_buffer(cast);
                }
                // fall through
        default:
                cast->pwr_stream_state = false;
+               pwr_disarm_process_retry(cast);
                break;
        }
 }
@@ -588,6 +595,38 @@
        buffer->user_data = NULL;
 }
 
+static uint64_t pwr_process_retry_delay(struct xdpw_screencast_instance *cast) 
{
+       // max_framerate is only valid when framerate is (0/1) (variable rate 
negotiated)
+       struct spa_fraction *rate = &cast->pwr_format.framerate;
+       if (rate->num == 0) {
+               rate = &cast->pwr_format.max_framerate;
+       }
+       if (rate->num > 0 && rate->denom > 0) {
+               return (uint64_t)SPA_NSEC_PER_SEC * rate->denom / rate->num;
+       }
+       return SPA_NSEC_PER_SEC / 60; // ~16ms/60fps fallback
+}
+
+static void pwr_process_retry(void *data);
+
+static void pwr_arm_process_retry(struct xdpw_screencast_instance *cast) {
+       if (cast->process_retry) {
+               return;
+       }
+       cast->process_retry = xdpw_add_timer(cast->ctx->state,
+               pwr_process_retry_delay(cast), pwr_process_retry, cast);
+       if (!cast->process_retry) {
+               logprint(ERROR, "pipewire: failed to arm process retry timer, 
stream may stall");
+       }
+}
+
+static void pwr_process_retry(void *data) {
+       struct xdpw_screencast_instance *cast = data;
+       cast->process_retry = NULL; // timer destroyed in event loop
+       pwr_arm_process_retry(cast);
+       pw_stream_trigger_process(cast->stream);
+}
+
 static void pwr_handle_stream_on_process(void *data) {
        struct xdpw_screencast_instance *cast = data;
 
@@ -605,13 +644,15 @@
 
        xdpw_pwr_dequeue_buffer(cast);
        if (!cast->current_frame.pw_buffer) {
-               logprint(WARN, "pipewire: unable to export buffer");
+               logprint(WARN, "pipewire: unable to export buffer, dropping 
frame");
+               pwr_arm_process_retry(cast);
                return;
        }
+
+       pwr_disarm_process_retry(cast);
        xdpw_wlr_frame_capture(cast);
 }
 
-
 static const struct pw_stream_events pwr_stream_events = {
        PW_VERSION_STREAM_EVENTS,
        .state_changed = pwr_handle_stream_state_changed,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/xdg-desktop-portal-wlr-0.8.3/src/screencast/screencast.c 
new/xdg-desktop-portal-wlr-0.8.4/src/screencast/screencast.c
--- old/xdg-desktop-portal-wlr-0.8.3/src/screencast/screencast.c        
2026-06-18 17:23:58.000000000 +0200
+++ new/xdg-desktop-portal-wlr-0.8.4/src/screencast/screencast.c        
2026-07-28 18:58:20.000000000 +0200
@@ -371,7 +371,7 @@
 
        char *key;
        int innerRet = 0;
-       uint32_t type_mask = 0;
+       uint32_t type_mask = MONITOR;
        struct xdpw_screencast_restore_data restore_data = {0};
        while ((ret = sd_bus_message_enter_container(msg, 'e', "sv")) > 0) {
                innerRet = sd_bus_message_read(msg, "s", &key);

Reply via email to