Nikolay Sivov (@nsivov) commented about dlls/dwrite/gdiinterop.c:
> return hr;
> }
>
> - scaled_run = *run;
> - scaled_run.fontEmSize *= target->ppdip;
> - hr = IDWriteFactory7_CreateGlyphRunAnalysis(target->factory, &scaled_run, &target->m, rendermode, measuring_mode,
> + scaled_matrix = target->m;
> + scaled_matrix.m11 *= target->ppdip;
> + scaled_matrix.m22 *= target->ppdip;
> + hr = IDWriteFactory7_CreateGlyphRunAnalysis(target->factory, run, &scaled_matrix, rendermode, measuring_mode,
> gridfitmode, target->antialiasmode, originX, originY, &analysis);
> if (FAILED(hr))
The reason we currently modify font size is to produce better quality output. If you keep original size, then scale 10 times, it won't necessarily be looking good. Regarding matrix modification, how does that work for other components, for e.g. rotation? Maybe we should multiply by diagonal matrix instead?
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3718#note_48043
--
v2: uiautomationcore: Use EVENT_OBJECT_FOCUS to advise HWND providers of focus change events in the COM API.
uiautomationcore: Query EVENT_OBJECT_FOCUS HWND for a serverside provider if there is a registered focus change event handler.
uiautomationcore/tests: Add tests for IUIAutomationFocusChangedEventHandler event advisement behavior.
https://gitlab.winehq.org/wine/wine/-/merge_requests/4024
This allows *BSDs to also have a fast path similar to futexes for thread-ID alerts.
Also a kevent with `EV_CLEAR` and `NOTE_TRIGGER` maps perfectly to the thread alertable state, fixing the issue of the current mach-semaphore implementation not correctly waiting in the test case below:
```
NtAlertThreadByThreadId((HANDLE)GetCurrentThreadId());
NtAlertThreadByThreadId((HANDLE)GetCurrentThreadId());
NtWaitForAlertByThreadId(NULL, NULL);
NtWaitForAlertByThreadId(NULL, NULL);
```
I took the liberty to remove this mach semaphore implementation, since all versions of OSX have supported kqueue().
--
v3: ntdll: Implement thread-ID alerts using kqueue/kevent.
https://gitlab.winehq.org/wine/wine/-/merge_requests/4049
In clock_change_state() when a clock is running, a timer is removed from clock->timers. The same
timer is then used to create an async result, which will eventually calls present_clock_timer_callback_Invoke()
and removes the same timer.
--
v2: mf: Avoid a double free of presentation clock timers.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3955