On Sat, 17 Oct 2026 03:43:17 GMT, Sergey Bylokhov <[email protected]> wrote:

>> Ubuntu 26.10 may send multiple stream format events, and our screen capture 
>> code doesn't handle it correctly: 
>> 
>> `onStreamParamChanged()` calls blocking `pw_thread_loop_signal(..., TRUE)` 
>> and expects the corresponding `pw_thread_loop_accept` call.
>> However, `pw_thread_loop_accept` is only called while waiting for the 
>> initial format, so a subsequent event can block PipeWire thread indefinitely.
>> 
>> --- 
>> 
>> So the minimal fix would be to replace it with a non-blocking 
>> `pw_thread_loop_signal(..., FALSE)` call and remove the corresponding accept 
>> call(with some other minor changes).
>> 
>> However, this alone leaves several other issues to address:
>> 
>> - The `isAllDataReady` check and the wait now run under the same lock, 
>> preventing lost wakeups.
>> - Added a 10s shared timeout for format negotiation and frame capture, so 
>> missing events don't block java indefinitely.
>> - After capturing a frame, `onStreamProcess()` now returns any additional 
>> buffers to PipeWire so they can be reused while the stream is still active, 
>> e.g., while waiting for frames from other screens.
>> - Requeuing a PipeWire buffer allows its pixel data to be reused before we 
>> copy it to the Java array. The `captureDataPixbuf` now always owns pixel 
>> data.
>> - `NULL` checks were added for pixbuf creation and scaling.
>> - Capture cleanup and stream deactivation now run under the same PipeWire 
>> loop lock, preventing callbacks from observing partially reset capture state.
>> - Other cleanup improvements (pw context destruction, captureDataPixbuf 
>> unref)
>> - A valid restore token can be rejected incorrectly for uiScale other than 1 
>> for non standard resolutions(e.g. rounding for height on VirtualBox screen 
>> `1359` > `680` > `1360` with uiScale 2). 
>> Now it uses native screen bounds directly.
>> 
>> 
>> Testing looks good.
>> 
>> ---------
>> - [x] I confirm that I make this contribution in accordance with the 
>> [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai).
>
> src/java.desktop/unix/classes/sun/awt/X11GraphicsDevice.java line 163:
> 
>> 161:      */
>> 162:     public Rectangle getNativeBounds() {
>> 163:         return pGetBounds(getScreen());
> 
> Any reason why this data is not cached and invalidated on displaychange 
> events(does that events actually supported by awt toolkit on wayland)?

There is no specific reason, filed 
[JDK-8394835](https://bugs.openjdk.org/browse/JDK-8394835) to track this

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/33384#discussion_r4311715107

Reply via email to