github ryzendew/Linux-Affinity-Installer 3.3.1
New Appimage using wine 11.19

4 hours ago

Changelog

Source: https://github.com/ryzendew/Affinity-Wine-Builder/commits/main/

Scope: Wine 11.18 added as a new build target. Wine 11.19 added as a new build target with the Affinity 3.3 patch set rebased and extended to 0085. CI now builds only 11.18 and 11.19.

Attribution below follows commit authorship. jfacemyer is his work. Mattscreative is my work.


His work — jfacemyer

Wine 11.16 baseline, for context — 2026-10-02 — d4502f1

Build-Wine-11.16.sh plus patches/wine-11.16/0001-0049. ElementalWarrior base carried as 0001-0031. Affinity set added as 0032-0049. This is the set both later versions build on. Tested with Affinity 3.3.0.4850 on Intel Arc A750 with vkd3d-proton.

Wine 11.18 base — 2026-10-02 — 88b674f

New Build-Wine-11.18.sh. patches/wine-11.18/0001-0031 is the ElementalWarrior base, carried over unchanged.

  • 0001-downgrade-dxcore-to-10_8: skipped on 11.18, reports reversed. Leaves 10.8 sources for 0002/0006. Same result as 11.16.
  • 0004-vkd3d-shader-zero-pad-output-signature: skipped on 11.18. Upstream bundled vkd3d already has all seven hunks.

0032-0049 is the Affinity set. Fifteen files byte-identical to 11.16. Three ported for upstream 09eba117, which moved winmd data into struct winmd. 0033 drops one fix, now upstream as 8b963e98.

What each patch does:

  • 0032-wintypes-implement-RoResolveNamespace: implements namespace-to-winmd lookup, most-specific to least-specific. Lets a running Affinity accept a document handed to it, such as double-click in a file manager.
  • 0033-widl-metadata-two-fixes: NULL-safe contract lookup for parameterized interfaces such as IMap<K,V> and IIterable<T>. Emits static() MemberRefs for every attribute, not only the first.
  • 0034-widl-metadata-fix-sizeofimage: computes SizeOfImage from section virtual address plus virtual size. Fixes loader rejection with STATUS_INVALID_IMAGE_FORMAT.
  • 0035-widl-metadata-assembly-name-not-path: assembly and module names use the file name, not the -o output path. Required for 0032, otherwise the CLR fails later and harder than a stub.
  • 0036-widl-metadata-assemblyref-nested-namespaces: resolves nested namespaces to the parent assembly with ancestor walk-up. Excludes the current module namespace.
  • 0037-widl-metadata-encode-interfaces-and-generics: keeps type arguments for ELEMENT_TYPE_GENERICINST via winmd_params. Correct generic interface encoding.
  • 0038-winex11-move-owned-tool-windows-internally: owned tool windows use win32u move loop instead of window-manager move. Restores mouse messages during drag so floating panels can find dock targets. Main windows still use the window manager.
  • 0039-win32u-end-move-loop-when-button-released: polls button state each loop iteration for mouse-initiated moves. Fixes stuck GUI_INMOVESIZE capture when the app consumes WM_LBUTTONUP.
  • 0040-win32u-end-move-loop-when-the-window-is-destroyed: ends move/size loop when the moved window is destroyed mid-drag. Fixes panel docking then jumping back out, and swallowed WM_LBUTTONUP leaving drag adornments up.
  • 0041-server-do-not-treat-the-desktop-window-as-a-foreground-process: stops recording explorer.exe as foreground when focus leaves Wine. Fixes SetForegroundWindow returning access denied on file-manager double-click open.
  • 0042-winex11-set-net-wm-state-modal-for-modal-dialogs: adds _NET_WM_STATE_MODAL and recomputes it when owner WS_DISABLED changes. Fixes modal dialog stacking below its disabled owner, seen on Export dialog under Plasma 6.
  • 0043-comdlg32-portal-dialog-modal-parented-and-titled: portal file path disables the owner for the dialog lifetime, pumps messages to stay repainting, blocks re-entrant input. Prevents second Export while chooser is open.
  • 0044-winex11-take-focus-offered-for-disabled-windows: accepts WM_TAKE_FOCUS even when disabled. Fixes dead keyboard when portal returns focus to a disabled owner under KWin null-focus.
  • 0045-comdlg32-affinity-file-chooser-folders: tracks real app SetDefaultFolder vs synthesized Desktop default. Unescapes RecentFiles.xml entities so portal gets absolute current_folder. Fixes Save As folder and dialog opening in wrong place.
  • 0046-comdlg32-restore-focus-after-the-portal-dialog: saves and restores focused control across portal dialog. Enable-disable cycle otherwise leaves focus nowhere. Distinct from focus-loss fixes.
  • 0047-ole32-dodragdrop-handles-mouse-input-itself: drag loop tracks mouse itself instead of dispatching. Fixes Studio tab reorder NullReferenceException when Affinity recaptures mouse mid-drag.
  • 0048-comdlg32-name-the-application-in-every-portal-dialog-title: appends (exe) to app-titled portal dialogs. Lets keep-above window rules match, needed under Wayland where portal ignores X11 parent.
  • 0049-ntdll-finish-process-exit-instead-of-waiting-on-orphaned-srw-locks: from GE-Proton. Finishes termination instead of blocking on orphaned SRW during detach. Fixes Affinity 3.3 never exiting.

Verified in commit message: no fuzz on pristine wine-11.18.tar.xz, winmds validate, prefix upgrade keeps fonts, cold and warm opens work, close exits.

Wine 11.19 rebase, 0032-0073 — 2026-10-05 — 8ba7871, merged 2026-10-10 as PR 10 d31bc05

ElementalWarrior 0001-0031 unchanged. 0001 and 0004 skipped as on 11.18. Affinity set rebased to 0032-0073, applies with no fuzz.

New since 11.18 in this range, by file:

  • 0049-d2d1-cache-path-geometry-close-and-cut-its-quadratic-work: caches Close() results keyed on full input, LRU 24 MiB. Skips distant segment pairs, buckets polygon edges by y, double-precision in-circle filter. Fixes about 0.4 s per redraw on ruler-label heavy documents.
  • 0050-opencl-deliver-event-callbacks-from-a-dispatcher-thread-and-flush: registers host-driver callbacks, queues them, runs them on one Wine thread in order. Restores real clFlush. Adds clSVMAlloc/clSVMFree. Fixes startup hang with OpenCL on real GPU. Filter exports about 30 percent faster on Arc A750.
  • 0051-wined3d-report-the-vulkan-fixed-function-caps-again: restores upstream FFP caps reverted by base 0009. Lifts WPF from tier 0 CPU raster to tier 2 D3D9. Must ship with presentation fixes that follow.
  • 0052-wined3d-offset-the-vulkan-viewport-for-d3d9-pixel-centers: half-pixel viewport shift for integer pixel centers, matching GL backend. Fixes blurred edges and soft text on Vulkan d3d9.
  • 0053-wined3d-clear-vulkan-swapchain-handles-when-destroying-them: NULLs destroyed swapchain handles and pointers. Fixes crash on failed recreate and divide-by-zero blit during popup teardown.
  • 0054-wined3d-create-vulkan-swapchains-on-first-use-present-partial-copies-whole: defers Vulkan swapchain creation to first present. Fixes layered WPF popups showing as black boxes. Presents whole client area for eligible partial COPY presents.
  • 0055-wined3d-present-a-copy-swapchains-last-frame-again: re-presents COPY frame at 5 ms and 45 ms on empty command queue. Pushes frame out under Xwayland Mesa WSI. Fixes one-click-behind tool highlight and empty studio panels.
  • 0056-win32u-wait-for-offscreen-vulkan-presents-before-copying-them: waits with VK_KHR_present_wait, capped at 100 ms, before offscreen copy. Fixes canvas showing previous frame and stale color-picker zoom.
  • 0057-winex11-manage-owned-windows-that-are-neither-popups-nor-topmost: manages borderless owned windows such as sub-tool panel. Fixes panel staying above other apps on Wayland. Keeps it out of pager and Alt-Tab.
  • 0058-winex11-drop-window-manager-attention-for-owned-windows-shown-inactive: clears wrongful attention mark on SWP_NOACTIVATE owned windows unless FlashWindowEx asked. Fixes orange taskbar highlight when panel is up.
  • 0059-winex11-the-modal-dialog-is-the-owners-last-active-popup: uses last active popup instead of first enabled popup for modal state. Fixes palette wrongly marked modal and nested dialogs losing modal state.
  • 0060-winex11-offered-focus-for-a-disabled-window-activate-its-dialog: focuses last active popup when offered window is disabled. Raises dialog. Fixes recovery prompt going behind startup dialog on click or Alt-Tab.
  • 0061-winex11-do-not-draw-a-window-surface-over-client-surface-windows: draws with ClipByChildren. Fixes 572-725 ms white flash at startup between splash and interface.
  • 0062-win32u-do-not-copy-window-surface-bits-over-a-client-surface: leaves client area out of old-surface copy when client surface takes over. Fixes white prompts for 1-2 s on busy thread.
  • 0063-wined3d-only-send-the-state-that-changed-when-switching-device-context-state: diffs device-context state and sends changed ranges only. UI thread 2.87 s to 1.95 s and command thread 3.73 s to 2.74 s over a 4 s brush stroke in commit measurement.
  • 0064-win32u-copy-presents-to-offscreen-surfaces-on-a-helper-thread: moves offscreen present wait plus copy off presenting thread. Brush lag 193-253 ms to 110-122 ms in commit measurement. Bumps WINE_VULKAN_DRIVER_VERSION to 49.
  • 0065-winex11-move-owned-windows-without-a-caption-internally-too: captionless owned windows use internal move loop. Restores dock adorner and pinning for sub-tool panel grip drags.
  • 0066-winex11-keep-a-client-windows-last-frame-while-its-surface-goes-offscreen: clears background before redirect so last frame persists until first copy. Fixes 65-90 ms black or white flash opening first document.
  • 0067-win32u-winex11-clip-a-new-window-surface-before-its-first-flush: sets clip before shape flush, clips empty region out. Fixes white frame when surface goes offscreen and on dialogs.
  • 0068-ntdll-fail-to-create-a-stream-of-an-existing-file: returns invalid name for file:stream when base exists. Stops leaving <name>~lock~:com.dropbox.ignored files beside every opened document. Existing colon names still open and delete.
  • 0069-win32u-dont-activate-a-noactivate-window-when-the-active-one-goes: skips WS_EX_NOACTIVATE in can_activate_window. Fixes studio list closing after every reorder.
  • 0070-wined3d-put-small-buffers-in-mappable-device-memory: places small GPU-only buffers up to 64 KiB in host-visible device memory on resizable BAR. Removes about 3000 staging copies per frame. Brush behind cursor 106 ms to 49 ms with OpenCL off and 121 ms to 61 ms with OpenCL on in commit measurement, together with 0051.
  • 0071-wined3d-present-vsynced-swapchains-in-mailbox-mode: uses mailbox where available for non-zero intervals. Present queue 37-51 ms to under 1 ms in commit measurement. MailboxPresent registry value restores FIFO.
  • 0072-winex11-draw-unclipped-child-windows-in-their-toplevel: draws unclipped child client window as X child of toplevel. Canvas no longer pays offscreen copy plus Xwayland timer. Brush behind cursor 51 ms to 35 ms with OpenCL off and 62 ms to 54 ms with OpenCL on in commit measurement. Fixes size-vs-origin clipping comparison.
  • 0073-win32u-winex11-mouse-leave-when-another-application-covers-the-pointer: driver reports leave on LeaveNotify and cross-app focus change. Sends WM_MOUSELEAVE. Fixes tooltips staying above other apps after Alt-Tab.

Direct2D throughput, 0074 — 2026-10-06 — 8285013

  • 0074-d2d1-upload-geometry-through-a-reused-dynamic-buffer: one dynamic buffer per device context, single NO_OVERWRITE map per draw, rename on wrap. Replaces per-primitive index plus vertex buffer create, upload, release. Conformance unchanged. Panning CPU per frame 7.4 ms to 6.3 ms on command thread and 6.6 ms to 5.7 ms on UI thread in commit measurement. Brush behind cursor 59 ms to 51 ms.

Draw overhead and heap stall, 0075-0077 — 2026-10-06 — 94384a7

  • 0075-d2d1-keep-our-device-context-state-bound-across-draws: keeps D2D state bound from first draw to EndDraw, Flush, SetTarget, destroy, or competing context. Removes two full state switches per primitive. WINE_D2D_NO_STATE_BATCHING=1 restores old path.
  • 0076-d2d1-write-constant-data-to-a-reused-buffer-bound-with-offsets: appends constants to one dynamic buffer with NO_OVERWRITE, binds slices with VSSetConstantBuffers1/PSSetConstantBuffers1. Removes per-draw rename allocation.
  • 0077-ntdll-bound-the-free-list-scan-in-find_free_block: checks at most 32 blocks in first list, then takes next non-empty list. Fixes UI thread at 96 percent in heap scan opening 100 MB SVG with 1.87 M rectangles.

Stroke path and command rate, 0078-0081 — 2026-10-07 — da482df

  • 0078-d2d1-build-path-outlines-when-first-stroked: builds stroke outline on first stroke, not at EndFigure. Removes outline array churn on fill-only paths. Glyph and ruler rebuild path cited in commit.
  • 0079-d2d1-draw-lines-without-a-path-geometry: builds line outline directly, four vertices and two triangles. Removes per-line geometry, sink, figure, Close, and release. Ruler ticks path. Median brush behind cursor 30 ms to 26 ms on top of prior work in commit measurement.
  • 0080-d2d1-wined3d-fewer-commands-per-direct2d-draw: skips identical viewport commands, binds upload buffer at offset zero with start index plus base vertex, packs vertex plus pixel constants into one map. d2d1, d3d11, and d3d9 visual conformance unchanged.
  • 0081-wined3d-spin-less-before-the-command-thread-sleeps: spins 200 times instead of 2000 on empty queue. Command-thread CPU per frame lower across drag, node edit, zoom, and typing in commit measurement. Frame rate and latency unchanged.

Color, printing, login on 11.19, 0082-0085 — 2026-10-08 — aac1555

  • 0082-win32u-report-the-sdr-white-level: reports default 80 nits, value 1000. Fixes DXRenderer.cpp(1014) E_NOTIMPL path during device creation.
  • 0083-dxgi-d3d11-color-space-semi-stubs: accepts default sRGB in CheckColorSpaceSupport and SetColorSpace1, mirrors d3d12 stubs. Rejects others with invalid argument.
  • 0084-winspool-map-printer-connections-to-local-printers: maps PRINTER_ENUM_CONNECTIONS to local CUPS printers. Fixes Affinity print dialog showing no printers while Notepad lists them.
  • 0085-twinapi-appcore-implement-shared-storage-access-manager: implements SharedStorageAccessManager with interfaces, class, and registration. Lets second-instance file handoff path resolve. Commit notes file-handoff case not yet tested on 11.19.

My work — Mattscreative

Login the right way plus performance, 11.18 — 2026-10-09 — 3803d5a

Message: Fix login the right way. no janky loader and push performance.

  • 0050-win32u-implement-get-sdr-white-level.patch: same problem as 11.19 0082. Affinity queries SDR white level during D3D device creation. Wine returned invalid parameter. Reports default 80 nits so hardware path proceeds instead of falling back with DXRenderer.cpp(1014) error.
  • 0051-dxgi-d3d11-colorspace-semi-stubs.patch: same problem as 11.19 0083. Accepts default SDR colorspace, 7 calls and 7 errors in traced session before fix. Wide-gamut and HDR left for later.
  • 0052-d2d1-cache-geometry-upload-buffers.patch: per-context freelists, 8 index plus 8 vertex entries, 4 MB cap each. Refills with UpdateSubresource and explicit D3D11_BOX bounded to request size. Falls back to create and destroy path for uncacheable sizes. Removes about 14k paired CreateBuffer and destroy churn seen in traces. Records buffer ByteWidth, not last-write size, so larger reused entries stay safe.
  • Second 0052-winspool-map-printer-connections-to-local.patch: same problem as 11.19 0084. Verified with virtual queue AffinityTest over socket. Local query returned 1 printer, connections-only query returned 0 before fix. Later renumbered to 0059 on 11.18 with no content change.
  • 0053-twinapi-appcore-SharedStorageAccessManager-loginfix.patch: declares SharedStorageAccessManager runtime class and static factory. ProcessCommandLineArguments references RedeemTokenForFileAsync. CLR resolves all types in a method body at JIT time, so missing type threw TypeLoadException even on the unrelated affinity:// OAuth callback path forwarded over named pipe to SingleInstanceThread. Stub lets JIT succeed and login callback proceed. Open-file token branch itself returns failure.
  • Tooling in same commit: new Fix-Wine-TLS.sh:58 lines, new Log-Affinity-Login.sh:26 lines, build-wine.sh reworked, new .github/workflows/build-wine-11.18.yml, .circleci/config.yml updated, removed bundled PDF.

Merge more patches, 11.18 — 2026-10-10 — f385272

  • 0052-d2d1-cache-geometry-upload-buffers.patch modified, 50 additions and 18 deletions.
  • 0054-RoGetParameterizedTypeInstanceIID.prototype.patchOFF added but disabled. Prototype only, not applied by build.
  • 0055-opencl-populate-info-cache-when-ret-size-is-null.patch: changes info-cache lookup to return hit data and stored size even when caller passes NULL size pointer. Fixes cache miss path for size-query-then-read pattern.
  • 0056-opencl-cache-immutable-clgetmemobjectinfo.patch: adds device, platform, and memory-object immutable info cache with hit, miss, and too-small states. Avoids repeated PE to Unix round trips for hammered values.
  • 0057-wined3d-vk-add-legacy-ffp-state-representatives.patch: adds state_nop representatives for legacy fixed-function render states on Vulkan fragment pipe. Stops validate_state_table representative warnings and spurious dirty bit from fallback path.
  • 0058-dxgi-do-not-hold-wined3d-mutex-across-window-creation.patch: unlocks global wined3d mutex across CreateWindowA in device-window path. Window creation dispatches app code and can fault without releasing the mutex. Device is still private with refcount 1, factory kept alive by caller, inner helper locks wined3d itself. Fixes present thread stalling behind leaked mutex.
  • 0059 renumber, no content change. See numbering note below.
  • 0060-winex11-revert-pass-fullscreen-flag.patch: rebased from 10.11 set onto 11.18. Reverts upstream is_window_managed fullscreen-flag change. Fixes Affinity Sub-Tools panel appearing above File Explorer and other desktop windows. Eleven of thirteen winex11 hunks and two of three Wayland hunks applied clean, three reworked for 11.18 locals and renamed Wayland owner variable.
  • 0061-ntdll-heap-large-block-retention-cache.patch: rebased Neutron large-block retention work verbatim onto 11.18 heap. Ships disabled unless NEUTRON_HEAP_LARGE_CACHE=1. Added as churn probe with WINEDEBUG=neutronheap counter path, because perf, gdb, /proc/PID/syscall, and strace were unavailable. Does not collide with 0049, which touches sync.c while this touches heap.c.
  • patches/wine-11.18/README.md updated with numbering notes: 0024/0025 are deliberate gaps carried from alt 11.11 set, not deletions. Former duplicate 0052 winspool entry is now 0059. 0054 ships disabled.
  • .gitignore updated.

Build scope cut — 2026-10-10 — 75d1b2c

  • .circleci/config.yml: 9 additions, 9 deletions.
  • .github/workflows/build-wine-11.19.yml: renamed path with 13 additions and 13 deletions.
  • Net effect: build only Wine 11.18 and 11.19.

Counts on main

  • patches/wine-11.18: 0001-0023, 0026-0061, plus disabled 0054.patchOFF and README.md. 0024/0025 intentionally absent.
  • patches/wine-11.19: 0001-0023, 0026-0085. 0024/0025 intentionally absent. 85 patch files total including base.

Don't miss a new Linux-Affinity-Installer release

NewReleases is sending notifications on new releases.