On Fri May 23 04:23:45 2025 +0000, Alex Henrie wrote:
> Linux has only three [DVD
> ioctls](https://docs.kernel.org/userspace-api/ioctl/cdrom.html):
> DVD_READ_STRUCT, DVD_WRITE_STRUCT, and DVD_AUTH. It has no blu-ray
> ioctls. Of the three DVD ioctls, only DVD_READ_STRUCT would be suitable
> for disc type detection.
> DVD_READ_STRUCT can read five kinds of information: DVD_STRUCT_PHYSICAL,
> DVD_STRUCT_COPYRIGHT, DVD_STRUCT_DISCKEY, DVD_STRUCT_BCA, and
> DVD_STRUCT_MANUFACT. Of those five, only DVD_STRUCT_PHYSICAL would be
> suitable for disc type detection.
> At least on my LG WH16NS40 drive, DVD_STRUCT_PHYSICAL succeeds when
> there is a DVD in the drive, but it fails when there is a CD or a
> blu-ray in the drive. That means that we could use DVD_STRUCT_PHYSICAL
> to accurately detect whether there is a DVD in the drive, but we would
> still need another way to detect blu-rays.
> Is there another ioctl that you had in mind, or something else that I
> missed? Do you want to try DVD_STRUCT_PHYSICAL first and fall back to
> guessing based on the data size if it fails? Please let me know how to proceed.
Any chance it could be a driver bug?
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7747#note_104478
eric pouech (@epo) commented about programs/cmd/wcmdmain.c:
> +
> + /* Calculate cursor position at beginning of prompt, accounting for lines scrolled
> + * due to length of input.
> + */
> + GetConsoleScreenBufferInfo(hOutput, ¤tConsoleInfo);
> + currentConsoleInfo.dwCursorPosition.X = startConsoleInfo.dwCursorPosition.X;
> + len2 -= (currentConsoleInfo.dwSize.X - currentConsoleInfo.dwCursorPosition.X);
> + if (len2 > 0) {
> + currentConsoleInfo.dwCursorPosition.Y -= ((len2 / currentConsoleInfo.dwSize.X) + 1);
> + }
> + SetConsoleCursorPosition(hOutput, currentConsoleInfo.dwCursorPosition);
> +
> + WriteConsoleW(hOutput, inputBuffer, len, &numWritten, NULL);
> + if (maxLen > len) {
> + clear_console_characters(hOutput, maxLen - len, lastConsoleInfo.dwSize.X); /* width at time of last console update */
> + }
and likely you could do 'maxLen = len;' here: as screen is "cleared" after 'len' position, there's no need to clear it again (unless a wider string is needed, but you'll catch that later)
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7843#note_104474
eric pouech (@epo) commented about programs/cmd/wcmdmain.c:
> + len = lstrlenW(inputBuffer);
> + len2 = len;
> +
> + /* Update current input display in console */
> + set_cursor_visible(hOutput, FALSE);
> +
> + /* Calculate cursor position at beginning of prompt, accounting for lines scrolled
> + * due to length of input.
> + */
> + GetConsoleScreenBufferInfo(hOutput, ¤tConsoleInfo);
> + currentConsoleInfo.dwCursorPosition.X = startConsoleInfo.dwCursorPosition.X;
> + len2 -= (currentConsoleInfo.dwSize.X - currentConsoleInfo.dwCursorPosition.X);
> + if (len2 > 0) {
> + currentConsoleInfo.dwCursorPosition.Y -= ((len2 / currentConsoleInfo.dwSize.X) + 1);
> + }
> + SetConsoleCursorPosition(hOutput, currentConsoleInfo.dwCursorPosition);
did you try just reusing startConsoleInfo.dwCursorPosition here instead of recomputing the initial cursor position?
Actually I'm worried that we have to convert between cursor position from/to number of characters
- this makes assumptions about how the string is layed out (one vs multiple lines, one string character == one cell == one glyph on screen (this is not the case for CJK characters; if we support them one day))
- anyway, I don't see a simple straightforward way to do it (ReadConsole doesn't return the farthest cursor point where it has written to, and since it can be on multiple lines...).
- but the less code that does it, the better
the pain here comes from conhost wrapping the strings (in WriteConsole) larger than screen buffer width onto different lines... native use an unbounded line length and wraps it depending on window size.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/7843#note_104473
On Sun May 25 15:34:38 2025 +0000, Alexandros Frantzis wrote:
> Hi @yurih, from what I understand the reason alt(-tab) is problematic is
> because the alt menu mode is enabled when the key is released. However,
> avoiding the release just for this behavior doesn't seem like a viable
> way forward, since other applications may treat alt differently or may
> also require treating other keys the same way.
> I was experimenting a bit and sending WM_CANCELMODE (which winex11 does
> already) seems to help with the alt(-tab) menu situation in my tests.
> Could you try the following and let me know if it helps with your use case:
> ```patch
> --- a/dlls/winewayland.drv/wayland_keyboard.c
> +++ b/dlls/winewayland.drv/wayland_keyboard.c
> @@ -800,6 +800,11 @@ static void keyboard_handle_leave(void *data,
> struct wl_keyboard *wl_keyboard,
> * and for any key repetition to stop. */
> release_all_keys(hwnd);
>
> + if (hwnd == NtUserGetForegroundWindow())
> + {
> + if (!(NtUserGetWindowLongW(hwnd, GWL_STYLE) & WS_MINIMIZE))
> + send_message(hwnd, WM_CANCELMODE, 0, 0);
> + }
> /* FIXME: update foreground window as well */
> }
> ```
Yes it does indeed fix the alt menu mode without my patch. Though I don't think I understood clearly what you meant, as Alt is already filtered (VK_MENU), I just added the left and right keys as they are among the returned keyboard state and are not filtered, making Alt released anyway. You plan to remove the modifier's filtering altogether ?
Also, there's issues with extended scan code (for example my keyboard arrows) that aren't released, though it also happens with winex11.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/6199#note_104470
On Sun May 25 13:31:25 2025 +0000, Jayson Reis wrote:
> Hi there @epo thanks for the review!
> As I could not find any auto formatting tool configured, I tried
> maintaining the formatting around the code I was changing, do you mind
> point me out where did you find it different?
> I will change the calls to GetProcAddress, as there is no public header,
> this means that on console.c I cannot call the Wide function from ascii
> and just convert, right? Meaning I would need to implement the logic twice?
> About being racy, reading the docs I did not see anything special about
> it, it seems like a wrapper around the PeekInputConsole to be less
> blocking, something gives you the feel it should be reimplemented?
> Also, is it a good idea to copy the exe for tests and run on Windows to
> see how it goes?
> At least this showed something to me that my test and implementation
> seem to be wrong like when calling the function with nowait, and it is
> empty, the return should be false but GetLastError seems to be 0
You can call a function without public header, just move that prototype to console.c (either near the top, or just before ExA - I don't know what Wine code style says about that).
The race happens if two threads read from that console simultaneously, both with nowait; Peek returns for both, thread 1 calls Read, and thread 2 calls Read too and blocks because it's empty.
Tests should be run on Windows, yes. That's how we discover which behavior to implement in Wine.
We usually SetLastError(0xdeadbeef) before calling something that should (or shouldn't) set the last error, to make sure we're not seeing a leftover error from a previous operation.
If PeekW returns false, then you should return false too, not think you're in the *count=0 branch and return true.
The code style issue is probably the // comments, we use only /* in Wine. (Also it's spelled that, not tha.)
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/8137#note_104466
Hi there @epo thanks for the review!
As I could not find any auto formatting tool configured, I tried maintaining the formatting around the code I was changing, do you mind point me out where did you find it different?
I will change the calls to GetProcAddress, as there is no public header, this means that on console.c I cannot call the Wide function from ascii and just convert, right? Meaning I would need to implement the logic twice?
About being racy, reading the docs I did not see anything special about it, it seems like a wrapper around the PeekInputConsole to be less blocking, something gives you the feel it should be reimplemented?
Also, is it a good idea to copy the exe for tests and run on Windows to see how it goes?
At least this showed something to me that my test and implementation seem to be wrong like when calling the function with nowait, and it is empty, the return should be false but GetLastError seems to be 0
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/8137#note_104465
a couple of comments:
* please read and conform to [Wine Coding style](https://gitlab.winehq.org/wine/wine/-/wikis/Wine-Developer's-Guide/Coding-Practice#some-notes-about-style)
* AFAICT ReadConsoleInputEx\[AW\] isn't defined in Windows SDK so header files shouldn't be changed
* tests must reflect what Windows does, not what your implementation does (hence the generated failures in CI pipeline)
* this should be implemented using proper (new or modified) IOCTL:s; there's no way this API can be implemented on top of kernel32's one without being racy (as your proposal is). That's the reason why MS introduced this new API.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/8137#note_104458
The Aim of this MR is to fix https://bugs.winehq.org/show_bug.cgi?id=10941
In a nutshell:
- CUI app starts, and CRT inits its std streams from console,
- app calls FreeConsole() then AllocConsole() and expects the CRT I/O
functions to be able to output to newly created console.
It fails:
- when run with wineconsole, as the inherited std consoles are closed
in FreeConsole(). Added tests, but current implementation of kernelbase
is correct. So, the fix is to force wineconsole to pass unbound console
handles with standard inheritance (to they are not closed),
- when run from unix console, the std handles were also closed. There's
no unbound console in that case. The fix is not to close these
handles in FreeConsole().
- the other cases from the bug entry work because cmd was created with
unbound console handles.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/8136
I was able to replicate the issue seen in [Bug 58113](https://bugs.winehq.org/show_bug.cgi?id=58113) on my M1.
The issue stems from the usage of AudioDevicePropertyVolumeScalar, which the audio driver for the M1 does not support (at least so it appears.) Using AudioObjectIsPropertySettable allows for fast checking for this situation, including preemptively disabling main channel audio if it appears to be unsupported.
--
v2: winecoreaudio: revert unix_set_volumes from f46e9b8f120605d984f4ae14b4c815a67fbd1b59
https://gitlab.winehq.org/wine/wine/-/merge_requests/7920
1. For %fs/fsbase the patch follows the macOS logic with LDT descriptor registration and Linux with switching. One notable difference is that on 32->64 transition we set %fs to GSEL(GUFS32_SEL, SEL_UPL) before restoring fsbase, otherwise FreeBSD will just revert it by reloading the selector [at the first opportunity](https://github.com/freebsd/freebsd-src/blob/5673462af5330df207…. GSEL(GUFS32_SEL, SEL_UPL) is the default %fs value on FreeBSD and is special-cased to save/restore actual fsbase value to/from PCB.
2. I was told we could get rid of fsbase glitches in signal handlers by blocking signals with [sigfastblock(2)](https://man.freebsd.org/cgi/man.cgi?query=sigfastblock) between %fs reset to the default value and fsbase reset to pthread_teb. This is currently a part of internal API for libthr, which could be exposed as pthread_signal_block_np for Wine. I'm on the fence whether it's worth it.
3. I fully admit I have no idea what registers are worth preserving around fallback sysarch(AMD64_SET_FSBASE) syscalls and whether it's appropriate to push those registers to stack. ("Kernel" stack should be fine, I assume?) Syscalls definitely clobber r8-r11.
4. For %ss see https://lkml.org/lkml/2015/4/24/216. FreeBSD doesn't have a similar workaround in the kernel, so it goes into Wine.
--
v7: ntdll: Work around AMD SYSRET SS descriptor behavior on FreeBSD.
ntdll: Unbreak new wow64 mode on FreeBSD.
https://gitlab.winehq.org/wine/wine/-/merge_requests/8073