I know we've had a policy to avoid window manager specific workarounds, I think we could reconsider it. The fix could be unguarded and applied with every window manager, and could very well work, but I think it is ugly enough to justify checking for KWin specifically.
The problem is that as soon as a window configure request is sent to a maximized window, KWin internal state gets bogus and it loses track of the window maximized state. I've described the KWin source details on https://bugs.kde.org/show_bug.cgi?id=496966 and opened https://invent.kde.org/plasma/kwin/-/merge_requests/6854 as a possible fix for it, but the time it will take to land could justify working around it in Wine.
The workaround is to avoid sending configure requests to maximized windows, which sounds sensible and we already avoid resizing maximized windows, but, moving a maximized window to a different monitor *requires* sending a configure request. KWin bug makes no difference to requests with only position changes, and they trigger it all the same. So, the only solution is to temporarily remove the maximized state bits before sending the configure request, putting them back afterwards. This is quite straightforward to do with the new state tracker, but it could very well trigger other problems with other window managers.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57465
--
v4: winex11: Workaround KWin bug with maximized windows.
winex11: Set _NET_WM_USER_TIME to 0 to implement SWP_NOACTIVATE.
winex11: Keep track of the SWP flags to be used when mapping windows.
winex11: Keep _NET_WM_USER_TIME on the individual windows.
winex11: Workaround Mutter bug when changing decorations.
winex11: Avoid creating windows with override-redirect flag set.
winex11: Track _MOTIF_WM_HINTS property in the state tracker.
winex11: Introduce a new handle_state_change helper.
winex11: Ignore transient state changes in other processes.
winex11: Give focus to the expected window when unampping with focus.
winex11: Use the current state when deciding how to reply to WM_TAKE_FOCUS.
winex11: Use the state tracker for the desktop window _NET_WM_STATE.
win32u: Use the winstation monitor update serial to detect updates.
server: Add a winstation monitor update serial counter.
win32u: Extend display_lock CS around winstation check.
win32u: Release the Win16 mutex when yielding in peek_message.
win32u: Skip updating the cache on driver load if we're already updating it.
This merge request has too many patches to be relayed via email.
Please visit the URL below to see the contents of the merge request.
https://gitlab.winehq.org/wine/wine/-/merge_requests/6944
On Sat Dec 7 21:14:33 2024 +0000, Robbert van der Helm wrote:
> Embedding the entire virtual desktop window will sadly not work for this
> use case. The context here is that professional audio production
> software usually lets users use third party synthesizers and effects
> through various plugin systems. Those plugins are native shared
> libraries that implement one of the various standardized plugin ABIs.
> Most of these plugins are only available for Windows and macOS, which
> means they can't be loaded on Linux. Yabridge makes it possible to use
> these plugins on Linux by acting as both a plugin and a plugin host, and
> then passing through any and all function calls made by either the
> native host or the Windows plugin so it appears that they're talking to
> a regular old native plugin or host.
> The thing is that users usually need to interact with those plugins
> through a custom GUI provided by the plugin. In all of the common plugin
> standards the host provides a native window handle that the plugin then
> embeds itself into (reparent on X11, child window on Windows, etc.). So
> to make this work, yabridge creates a Win32 window, asks the plugin to
> embed itself into that window, and then reparents the X11 window (i.e.
> `GetProp(hwnd, "__wine_x11_whole_window")`) into the X11 window provided
> by the host. This approach works surprisingly well, except for the
> aforementioned mouse coordinate offset thing. In the past yabridge was
> able to fix this by directly sending `ConfigureNotify` events to Wine
> without actually moving the window so Wine knows where the window is
> actually located on screen, but that no longer works with the stricter
> implementation from this PR.
> So my question is more or less: can we make this behavior work with the
> updated winex11 implementation, or would it be feasible to make Wine
> aware of this behavior so it would just work without having to inform
> Wine where on screen an embedded window is?
I don't know for sure but there are probably some ways to make it work. It works already more or less well with embedded systray windows, so maybe doing something similar could be enough.
Alternatively mouse input is mapped in `map_event_coords` and we preferred event root/x_root/y_root values when available because it avoided some inconsistencies when moving windows, but window positioning has been refactored lately, and maybe this isn't necessary anymore.
Using window-relative mouse input could solve your case too (or we could also perhaps consider a winecfg option to prefer it over absolute positions).
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/6569#note_90107
On Mon Dec 2 22:41:17 2024 +0000, Rémi Bernon wrote:
> There has been various changes in the way we handle window positioning,
> and it's now probably more flexible to arbitrary X11 parent windows, but
> in any case we still always consider the X root window coordinates as
> the origin for the Win32 desktop.
> If you want to embed all Wine windows into another window and use its
> position as the Win32 desktop origin, it's basically what the "virtual
> desktop" mode is doing already. It's an option in winecfg, where we
> create a dedicated window for the Win32 desktop and every Wine window
> will be a child of it. You could probably then reparent the desktop
> window to the window you want?
Embedding the entire virtual desktop window will sadly not work for this use case. The context here is that professional audio production software usually lets users use third party synthesizers and effects through various plugin systems. Those plugins are native shared libraries that implement one of the various standardized plugin ABIs. Most of these plugins are only available for Windows and macOS, which means they can't be loaded on Linux. Yabridge makes it possible to use these plugins on Linux by acting as both a plugin and a plugin host, and then passing through any and all function calls made by either the native host or the Windows plugin so it appears that they're talking to a regular old native plugin or host.
The thing is that users usually need to interact with those plugins through a custom GUI provided by the plugin. In all of the common plugin standards the host provides a native window handle that the plugin then embeds itself into (reparent on X11, child window on Windows, etc.). So to make this work, yabridge creates a Win32 window, asks the plugin to embed itself into that window, and then reparents the X11 window (i.e. `GetProp(hwnd, "__wine_x11_whole_window")`) into the X11 window provided by the host. This approach works surprisingly well, except for the aforementioned mouse coordinate offset thing. In the past yabridge was able to fix this by directly sending `ConfigureNotify` events to Wine without actually moving the window so Wine knows where the window is actually located on screen, but that no longer works with the stricter implementation from this PR.
So my question is more or less: can we make this behavior work with the updated winex11 implementation, or would it be feasible to make Wine aware of this behavior so it would just work without having to inform Wine where on screen an embedded window is?
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/6569#note_90101
I know we've had a policy to avoid window manager specific workarounds, I think we could reconsider it. The fix could be unguarded and applied with every window manager, and could very well work, but I think it is ugly enough to justify checking for KWin specifically.
The problem is that as soon as a window configure request is sent to a maximized window, KWin internal state gets bogus and it loses track of the window maximized state. I've described the KWin source details on https://bugs.kde.org/show_bug.cgi?id=496966 and opened https://invent.kde.org/plasma/kwin/-/merge_requests/6854 as a possible fix for it, but the time it will take to land could justify working around it in Wine.
The workaround is to avoid sending configure requests to maximized windows, which sounds sensible and we already avoid resizing maximized windows, but, moving a maximized window to a different monitor *requires* sending a configure request. KWin bug makes no difference to requests with only position changes, and they trigger it all the same. So, the only solution is to temporarily remove the maximized state bits before sending the configure request, putting them back afterwards. This is quite straightforward to do with the new state tracker, but it could very well trigger other problems with other window managers.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57465
--
v3: winex11: Workaround KWin bug with maximized windows.
winex11: Keep track of the window manager name.
winex11: Keep track of the _NET_SUPPORTING_WM_CHECK window.
winex11: Listen to root window _NET_SUPPORTED property changes.
winex11: Move the _NET_SUPPORTED information to the thread data.
https://gitlab.winehq.org/wine/wine/-/merge_requests/6944
--
v4: server: Check for zero access in alloc_handle().
shell32: Don't open reg keys with zero access mask.
wbemprox: Don't open reg keys with zero access mask.
quartz: Don't open reg keys with zero access mask.
devenum: Don't open reg keys with zero access mask.
setupapi: Don't open reg keys with zero access mask.
kernel32: Don't open reg keys with zero access mask.
httpapi: Don't open files with zero access.
server: Skip inaccessible threads in (get_next_thread).
ntoskrnl.exe/tests: Open directory object with nonzero access in test_permanent().
https://gitlab.winehq.org/wine/wine/-/merge_requests/6047
Loading the driver the first time will call update_display_cache again,
and will need to enter the lock.
--
v3: win32u: Skip updating the cache on driver load if we're already updating it.
https://gitlab.winehq.org/wine/wine/-/merge_requests/6978
Loading the driver the first time will call update_display_cache again,
and will need to enter the lock.
--
v2: win32u: Always load the user driver before entering display_lock.
https://gitlab.winehq.org/wine/wine/-/merge_requests/6978
Returns MAC address by:
- search local interfaces, or
- send UDP packed that does not need linux privilege, then search local cache
solve https://bugs.winehq.org/show_bug.cgi?id=9418
files updated
- /dlls/iphlpapi/iphlpapi_main.c
- /dlls/iphlpapi/tests/iphlpapi.c
--
v15: jscript: Add support for deleting host properties.
jscript: Move property allocation to update_external_prop.
include: Add SQL_C_TCHAR define.
include: Add DB_VARNUMERIC struct.
include: Add _WIN32_WINNT_ version defines.
server: Ensure in pending delete on close that path to unlink are unique.
winegstreamer: Handle null transform in WMA IMediaObject::Flush().
winegstreamer: Handle null transform in video IMFTransform::ProcessMessage() FLUSH.
winegstreamer: Handle null transform in video IMFTransform::ProcessMessage() DRAIN.
winegstreamer: Handle null transform in video IMediaObject::Flush().
ucrtbase: Enable utf8 support.
msvcrt: Prepare remaining process creation functions to handle utf-8 encoded arguments.
msvcrt: Prepare _execle to handle utf-8 encoded arguments.
msvcrt: Prepare _spawnl to handle utf-8 encoded arguments.
msvcrt: Prepare _loaddll to handle utf-8 encoded path.
msvcrt: Prepare freopen to handle utf-8 encoded path.
msvcrt: Prepare _sopen_dispatch to handle utf-8 encoded path.
msvcrt: Return error on NULL path parameter in _wsopen_dispatch.
msvcrt: Add putenv() utf-8 tests.
msvcrt: Call _wfindnext64i32 in _findnext64i32 function.
msvcrt: Call _wfindfirst64i32 in _findfirst64i32 function.
server: Print signal names in traces.
wrc: Use the correct error function for syntax errors.
winebuild: Remove support for .def files as import libraries.
winegcc: Remove support for .def files as import libraries.
configure: Correctly check the --enable-build-id option.
bcrypt: Trace returned handles.
include: Use inline assembly on Clang MSVC mode in exception helpers.
windows.networking.connectivity: Use %I64d instead of %llu.
mfmediaengine: Fallback to sample copy if scaling is required.
mfmediaengine: Implement D3D-aware video frame sink.
mfmediaengine: Implement the Simple Video Renderer.
ntdll: Use sched_getcpu instead of the getcpu syscall.
win32u: Hold the display_lock when checking the cache update time.
win32u: Remove recursive lock_display_devices calls.
win32u: Implement update_display_cache with lock_display_devices.
win32u: Add a force parameter to lock_display_devices.
ntdll: Implement NtGetCurrentProcessorNumber for macOS on x86_64.
qasf: Correctly return failure in process_output.
qasf/tests: Add more tests for dmo_wrapper_sink_Receive.
windowscodecs: Implement CreateMetadataReader().
windowscodecs/metadata: Add a helper to iterate over components.
windowscodecs/tests: Add a basic test for CreateComponentEnumerator().
windowscodecs/tests: Add some tests for CreateMetadataReader().
windowscodecs/tests: Use string literals in the metadata tests.
mshtml: Get rid of unused HTMLElement_toString_dispids.
mshtml: Expose respective props from StyleSheetPrototype.
mshtml: Don't expose toString from styles in IE9+ modes.
mshtml: Don't expose the *Expression methods from styles in IE9+ modes.
mshtml: Don't expose the clip* props from style declaration or properties in IE9+ modes.
mshtml: Don't expose 'behavior' prop from styles in IE11 mode.
mshtml: Move 'filter' prop to MSCSSPropertiesPrototype in IE9 mode.
mshtml: Prefer builtins for style aliases that have the same name.
mshtml: Expose respective props from MSCSSPropertiesPrototype.
mshtml/tests: Add more tests for the style aliased prop names.
msvcrt: Call _wfindnext64 in _findnext64 function.
msvcrt: Call _wfindfirst64 in _findfirst64 function.
msvcrt: Call _wfindnext32 in _findnext32 function.
msvcrt: Call _wfindfirst32 in _findfirst32 function.
include: Cleanup corecrt_io.h file and use it in io.h.
msvcrt: Prepare _searchenv_s() for utf-8 encoded filename.
msvcrt: Don't return success on GetFullPathName error in _wsearchenv_s.
msvcrt: Call _wtempnam in _tempnam function.
msvcrt: Call _wrename in rename function.
msvcrt: Call _wstat64 in _stat64 function.
d3dcompiler/tests: Test the 'double' HLSL data type.
d3dx9/tests: Test the 'double' HLSL data type.
d3dx9/tests: Add d3dx9_43 tests.
d3dx9_43: Generate an import library.
d3dcompiler/tests: Clean up further tests fixed by vkd3d merges.
d3dx11/tests: Clean up tests fixed by vkd3d merges.
d3d10_1/tests: Clean up tests fixed by vkd3d merges.
d3dcompiler/tests: Clean up tests fixed by vkd3d merges.
kernelbase: Improve logging of information classes in GetTokenInformation.
Revert "win32u: Create explorer with the thread effective access token.".
explorer: Apply a default admin token when running for the desktop.
widl: Avoid unused variable warning.
wbemprox: Avoid unused variable warning.
vbscript: Avoid unused variable warning.
msxml: Avoid unused variable warning.
msi: Avoid unused variable warning.
jscript: Avoid unused variable warning.
windows.networking.connectivity: Implement IConnectionProfile::GetNetworkConnectivityLevel().
windows.networking.connectivity/tests: Add some INetworkInformationStatics::GetInternetConnectionProfile() tests.
windows.networking.connectivity: Implement INetworkInformationStatics::GetInternetConnectionProfile().
windows.networking.connectivity: Add INetworkInformationStatics stub interface.
windows.networking.connectivity: Add stub dll.
dbghelp: Search debug info with buildid for RSDS debug entry w/o filenames.
dbghelp: Extend search for buildid in system directories.
ntdll: Use %fs/%gs prefixes instead of a separate .byte 0x64/.byte 0x65.
include: Use %fs/%gs prefixes instead of a separate .byte 0x64/.byte 0x65.
server: Only store a Unix name for regular files.
taskmgr: Only list dynamically settable debug channels.
quartz/dsoundrender: Make trace messages more consistent.
quartz/dsoundrender: Use a consistent style for method names.
quartz/dsoundrender: Make brace placement consistent.
quartz/dsoundrender: Add missing static qualifier to IDispatch methods.
quartz/dsoundrender: Rename "This" to "filter".
qasf: Return failure in dmo_wrapper_sink_Receive if process_output fails.
qasf/tests: Test dmo_wrapper_sink_Receive if downstream fail to receive.
qasf: Return S_FALSE for flushing in dmo_wrapper_sink_Receive.
msvcrt: Prepare _mktemp_s to handle UTF-8 strings.
msvcrt: Prepare _mktemp to handle UTF-8 strings.
msvcrt: Call _wunlink in _wremove function.
msvcrt: Call _unlink in remove function.
msvcrt: Call _wchmod in _chmod function.
msvcrt: Call _waccess in _access function.
msvcrt: Call _wunlink in _unlink function.
msvcrt: Prepare _fsopen to handle UTF-8 strings.
gdiplus: Cast enums to unsigned type when validating its value.
winevulkan: Use WINE_UNIX_LIB instead of WINE_VK_HOST.
winevulkan: Mirror function handling in vk_is_available_instance_function32().
ntdll: Make a debug channel dynamically settable only if there's no specified class.
loader: Add Default, Failed, and LastKnownGood values to HKLM\System\Select.
advapi32/tests: Add test for CurrentControlSet link.
winevulkan: Update to VK spec version 1.4.303.
msvcp140: Add a version resource.
winex11: Use bilinear filtering in xrender_blit.
win32u: Let fullscreen windows cover entire monitors, keeping aspect ratio.
winex11: Set a non-transparent window background pixel color.
configure: Don't add -Wl,--build-id linker option to CFLAGS.
configure: Use -Wl,--build-id unconditionally if requested.
winegcc: Remap build-id linker option for clang.
configure: Properly test clang for dwarf support.
gdiplus: Use the FormatID of the source image when cloning.
winex11: Do not use desired_state when computing state updates.
explorer: Prevent apps from showing Wine specific shell tray window with no icons.
ntdll/tests: Fix format warning with clang.
ntdll: Fix reported exception code for some brk immediates.
ntdll: Test more ARM64 brk instruction exception behaviour.
winex11: Don't update Win32 window position for offscreen windows.
d2d1/effect: Improve handling of blob properties.
kernelbase: Add test for EnumSystemFirmwareTables on missing provider.
kernelbase: Properly return 0 from EnumSystemFirmwareTable on error.
kernel32: Use a proper import for HeapFree.
win32u: Move surface and swapchain wrappers from winevulkan.
winevulkan: Keep the host function pointers in devices and instances.
winevulkan: Use the vulkan object as the wrapper tree node.
winevulkan: Get rid of unnecessary *to_handle helpers.
winevulkan: Avoid changing client command buffer pointer.
winevulkan: Fix incorrect client queue pointers.
winevulkan: Introduce a new vulkan_object_init helper.
winevulkan: Use the result to decide if creation failed.
server: Make CurrentControlSet a symlink in new prefixes.
include: Enable format attributes for debug traces in Clang MSVC mode.
mmdevapi/tests: Use %u format for unsigned int arguments.
imagehlp: Cast AddressOfData to size_t in debug traces.
ole32/tests: Add more FMTID_UserDefinedProperties property storage tests.
ole32: Read property storage section from correct location.
ole32/tests: Add FMTID_UserDefinedProperties property storage tests.
ole32: Fix unsupported vector elements detection in PropertyStorage_ReadProperty.
msvcrt: Call _wfullpath in _fullpath function.
msvcrt: Call _wgetdcwd in _getdcwd function.
msvcrt: Call _wgetcwd in _getcwd function.
msvcrt: Call _wchdir in _chdir function.
msvcrt: Call _wrmdir in _rmdir function.
msvcrt: Call _wmkdir in _mkdir function.
bluetoothapis: Implement BluetoothFindFirstRadio, BluetoothFindNextRadio, BluetoothFindRadioClose.
bluetoothapis/tests: Add tests for BluetoothFindRadioClose.
bluetoothapis/tests: Add tests for BluetoothFindNextRadio.
bluetoothapis/tests: Add tests for BluetoothFindFirstRadio.
bluetoothapis/tests: Fix potential test failure from memcmp'ing uninitialized bytes.
msxml3: Accept the domdoc MaxElementDepth property.
This merge request has too many patches to be relayed via email.
Please visit the URL below to see the contents of the merge request.
https://gitlab.winehq.org/wine/wine/-/merge_requests/6884
Tested by running chrome without no-sandbox successfully.
--
v3: ntdll: Force redirect all ARM64EC indirect calls until the JIT is ready.
ntdll: Add arm64ec_get_module_metadata helper.
https://gitlab.winehq.org/wine/wine/-/merge_requests/6877