Added a new AppStream release block for 2.18.0-pre1 and restored the prior 2.17.4 release record, so release history remains additive.
Fixed Debian changelog handling by prepending a new pre-release entry 2.18.0~pre1-1 and restoring the historical 2.17.0-1 / 2.17.0-0 entries unchanged.
zoitechat-common (desktop integration, dbus service, icons, locales, appdata, mime).
zoitechat-dev (plugin development header + pkg-config file).
zoitechat-lua, zoitechat-perl, zoitechat-plugins, and zoitechat-python3 (plugin/shared module payloads).
Simplified zoitechat.install to only the core executable + man page, with shared data moved to zoitechat-common to match package split intent.
Updated user list creation to apply the current input font in GTK3 when palette styling is applied, so the user list reflects font changes consistently.
Updated channel view creation in GTK3 to always pass the current input font to chanview_new, ensuring channel list typography starts with the configured font.
Updated settings re-apply logic to always include the current input font for the user list in GTK3, so runtime font updates take effect there as well.
Replaced the previous direct Meson configure/build/test/install steps with a Debian package build step using dpkg-buildpackage -us -uc -b.
Added artifact upload for generated Debian package outputs (*.deb, *.changes, *.buildinfo).
Added a Windows-specific guard in waitline() that checks _get_osfhandle(sok) before calling read() in non-socket mode; if the CRT file descriptor is invalid, it now fails gracefully with -1 instead of hitting the debug CRT assertion you reported.
Wrapped shortcut-folder setup with existence checks and explicit GError handling so invalid config paths don’t propagate into GTK chooser failures/crashes on Windows.
Removed an unused get_xdir_fs extern declaration from this function while introducing a single xdir value reused across chooser setup logic.
Added type guards before using the stored plugin view/model (GTK_IS_TREE_VIEW, GTK_IS_LIST_STORE) so stale or unexpected object data doesn’t get dereferenced.
Switched plugin list population to always pass non-null strings for name/version/description via plugingui_safe_string, preventing null string propagation into GTK model setters.
Added an unload guard for empty/null modname before calling unload logic, preventing unsafe calls into plugin teardown paths with invalid identifiers.
fe_pluginlist_update() now guards against pl == NULL, pl->version == NULL, and pl->filename == NULL before dereferencing, and uses safe empty-string fallbacks for filename-backed columns. This prevents null dereferences from malformed or partially-populated plugin entries.
plugingui_unload() now early-returns when the selected plugin filepath is NULL/empty before suffix checks and command formatting, preventing invalid string operations in unload flow.
Updated plugin Unload and Reload callbacks to use the guarded session helper before issuing command-based unload/reload for script plugins, and to exit cleanly when no session is available.
Fixed plugin list layout sizing by forcing the tree view’s scrolled container to expand/fill inside the plugin window’s vbox, so the loaded-plugins list now uses full available height above the button row.
Added a defensive check that reports a user-facing error ("No active session available for loading addons.") and exits early when no valid session exists, instead of calling handle_command() with invalid state.
Updated the file request call to pass NULL userdata for load operations, so the callback no longer retains a stale session pointer while the chooser is open.
Fixed the single-file open path in gtkutil_file_req_done() to fetch the filename once and only call gtkutil_check_file() when a non-NULL filename is returned, preventing the crash path when GTK returns no file on accept/load.
Moved all wildcard-based includes (*.dll, **\*, etc.) into an ItemGroup inside the Build target so they’re evaluated at build time instead of as VC project item definitions, preserving the copy behavior
Added a PowerShellPath resolution chain in zoitechat.props so builds can use:
POWERSHELL_EXE override,
%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe when present,
fallback powershell.exe from PATH.
Switched hardcoded DLL names to wildcard patterns (ex: atk-1.0-0.dll → *atk-1.0-0.dll, iconv.dll → *iconv*.dll, etc.) so it correctly picks up lib* prefixed builds.
Made Enchant provider copying resilient by copying lib\enchant\*.dll instead of a single hardcoded libenchant_myspell.dll.
Added optional copy support for LuaJIT DLLs (luajit*.dll) alongside lua51.dll.
win32/installer/zoitechat.iss.tt
Updated DLL Source: entries to match real-world names from dependency bundles using wildcards (*glib-2*.dll, *gtk-3*.dll, etc.).
Added optional LuaJIT inclusion (skip if missing) and wildcarded girepository.
win32/zoitechat.props
Added env overrides so CI (and humans) can actually control paths:
ZOITECHAT_DEPS_PATH
ZOITECHAT_PYTHON3_PATH
already supported ISCC_EXE and now it actually matters.
Fixed glib-genmarshal handling to prefer glib-genmarshal.exe if present (and only use Python script path if needed).
Added library-name auto-detection for MSVC import libs (gtk-3.lib vs gtk-3.0.lib vs libgtk-3.lib, etc.) so linking doesn’t die just because the bundle names differ.
Ensured InstallerEnabled gets re-evaluated after IsccPath is resolved (GTK3 had the order wrong, so installer builds could be silently disabled).
.github/workflows/windows-build.yml
Made artifact collection and plugin validation tolerate win32 vs Win32 output directory naming, instead of assuming humans are consistent (they aren’t).
Preserved the existing Win32 alias junction logic, but now gate it on both the win32 matrix target and the presence of C:\gtk-build\gtk\x86 from the extracted archive.
Fixed ISCC path normalization by trimming surrounding quotes from ZOITECHAT_ISCC_PATH and storing discovered default paths unquoted (so they can be checked reliably with Exists(...)).
Fixed installer invocation by quoting $(IsccPath) at execution time in the pre-build command, which supports paths like C:\Program Files (x86)\Inno Setup 6\ISCC.exe
Python3Enabled (python executable + import lib + cffi)
PerlEnabled (perl executable + perl runtime DLL + gendef.exe)
InstallerEnabled (Inno Setup iscc.exe).
Updated the Python plugin project to compile only when Python3Enabled is true, and otherwise emit a clear skip message instead of failing prebuild/import steps.
Updated the Perl plugin project similarly to gate build steps on PerlEnabled and print a skip message when prerequisites are missing.
Updated the installer project so it only uses C++ targets when InstallerEnabled is true, with a fallback skip message when Inno Setup is unavailable.
Added a new MSBuild target (ValidateWindowsBuildEnvironment) that runs before build prep and fails fast with explicit errors when GTK/GLib/OpenSSL headers or Python are missing, instead of allowing a long cascade of downstream compile/link/copy failures.
Fixed the top-level preferences window layout so the central horizontal content area expands within the main vertical container, instead of staying at natural height.
Updated the Windows build to prefer glib-genmarshal executables with a Python fallback for marshal generation.
Made GTK link dependencies more robust by selecting available ATK library names before assembling GTK libs.
Added compile-time selection to use AppIndicator when available and fall back to GtkStatusIcon otherwise, keeping the status-icon backend available for non-AppIndicator builds (including GTK3 fallback).
Updated multiple GTK UI layout paths (setup, server list, notify, ban list, join dialog, and menu) to use the new helpers for GTK3-safe box/grid creation and attachment behavior.
Added GTK3-safe attach option definitions and updated helper signatures to avoid GTK2-only types/macros in public headers.
Updated gtkutil grid-attachment helpers to use the new attach option type in alignment/expansion logic.
Switched banlist grid attachments to the new helper option flags for GTK3 builds.
Confirmed inbound_cap_ls only returns early when sts_upgrade_triggered is set by sts_handle_capability, which now only happens for real upgrade/reconnect initiation or in‑progress upgrades.
Added a GTK3-only helper to translate Pango font fields into font-family, font-size, font-style, font-weight, font-variant, and font-stretch CSS declarations while preserving GTK2 behavior under #if !HAVE_GTK3.
Reused the GTK3 font CSS helper in the main UI font styling path to eliminate remaining Pango font: shorthand usage that triggers GTK3 theme parsing warnings.
Exposed the GTK3 font CSS helper in gtkutil so callers can emit CSS-compliant font properties consistently.
Updated gtk_entry_find_position to use GTK3-safe layout offsets and cursor position APIs while preserving GTK2-only field access behind #if !HAVE_GTK3.
Replaced the GTK3 G_DECLARE_DERIVABLE_TYPE usage with explicit GtkXText typedefs/macros to keep the instance struct visible in GTK3 builds and avoid missing member errors.
Updated GTK3-specific palette color storage handling in DCC, notify, and user list views to align with HAVE_GTK3 guards.
Standardized setup color application and dialog logic to use HAVE_GTK3 branches for GTK3/GTK2 separation.