Download

← All updates

Update

quark 1.18.18

Everything that changed in this version, and why.

One fix to 1.18.14's Settings > VIDEO + AUDIO > DEVICES page. No gameplay, network, file format or setting change; the page looks and works the same.

DEVICES rows' ids (src/client/game.cpp drawDeviceSettings / devRowText, src/client/game.h)

  • The bug: the full UI test run with the UI customizer's extract probe failed: 2454 widgets, 0 failed, but 13 never tested, all on the DEVICES page, under garbled ids such as "[0.25098,0.85098,1,1]" and "REFRESH RATE: 165 HZ [CFG audio_output]".
  • Why: a widget's UI test id (UiExp::id) is a pointer the test keeps after the widget call. The page built each row's id ("OUTPUT: <NAME>") every frame into a static string by move-assigning a new temporary, which freed the previous frame's buffer and gave the row a new one each draw; REFRESH RATE's names were also cleared and made again every frame. The extract probe draws a captured frame a second time (mouse parked off the window) and then keeps the first draw's widgets, so their ids pointed into freed memory, by then reused for other text (a colour written to the capture, a refresh rate name). Their keys came out as garbage, so the rows registered under those keys were never found again to be tested. The plain UI test happened not to redraw, so it passed; the per-frame string building was also an allocation every frame on this page.
  • Fix: each row's id ("<PREFIX>: <NAME>") and its in-use label ("> NAME <") are made once per listing (Game::devRowText, called by listDevices: on opening the page, REFRESH, a monitor plugged in or out) and kept in Game (devRowId_ / devRowOn_); a listing that comes back the same keeps the very same strings. REFRESH RATE's names (devRateNames_) are made again only when the monitor's rates, its desktop rate or the saved rate change. The page now builds no strings per frame for its rows, and every id stays valid for as long as the lists don't change. The 64-row cap on ids is gone with the static array (every row has its own id).