Changelog
All notable changes to this project are documented in this file, one entry per release. Format loosely follows Keep a Changelog; entries are kept high-level (what shipped, breaking changes) rather than a full commit-by-commit log — see git history for that.
[5.6.9.0] - 2026-11-03
Changed
- Vendors Scintilla 5.6.9, up from 5.6.3 (#23). See ScintillaHistory for the full list: faster layout and lower memory use, Unicode 17 case conversion and character categories, and crash fixes.
updateUi(SCN_UPDATEUI) and the styling after an edit now run from a posted Qt event rather than inside painting (Scintilla 5.6.5): they arrive once the event loop runs, before the next repaint, and also for a widget that isn't being painted (e.g. hidden).- Building from source finds the Qt SDK matching the installed PySide6 by
itself (#25): it looks for that Qt release in the standard install
locations (
C:/Qt,~/Qt,/opt/Qt) unlessCMAKE_PREFIX_PATHalready provides a matching one, and stops with a clear message naming the needed Qt version instead of failing inside PySide6's headers.
Added
setScaleTechnique()/scaleTechnique()(SCI_SETSCALETECHNIQUE) and theScintilla.ScaleTechniqueenum.ScaleTechnique.PixelAlignedaligns lines to physical pixels, removing the 'seams' between background rectangles under fractional display scaling (e.g. 150%).- The pixel methods (
setMarginWidthN,textWidth,pointXFromPosition, ... -- the messages Scintilla now types aspixels) take and return logical pixels, like upstream'sScintillaEdit: underPixelAligned, where the engine works in device pixels, they convert (rounding), while rawsend()sees device pixels. Each has a...Ftwin (textWidthF,setMarginWidthNF, ...) with unroundedfloatpixels. With the default technique nothing changes. Scintilla.Update.TextandUpdate.LineCount(SC_UPDATE_TEXT/SC_UPDATE_LINE_COUNT) forupdateUi. WithUpdate.Text, the notification'sposition(NotificationData.position, from thenotifysignal) holds the start of the changes.
[5.6.3.11] - 2026-11-03
Changed (breaking)
- Built for PySide6 6.12 (#15): requires
PySide6-Essentials>=6.12,<6.13andshiboken6>=6.12,<6.13. Keep using 5.6.3.10 with PySide6 6.11 -- pip picks the release matching the installed PySide6 minor. - macOS wheels need macOS 14.4 (tagged
macosx_14_0, like PySide6 6.12's own wheels), up from 13.0: Qt 6.12'sQtCore5Compat.framework, bundled in the wheel, requires it.
Added
- Python 3.15 classifier (PySide6 6.12 supports it; the
cp311-abi3wheel already ran on it).
[5.6.3.10] - 2026-11-03
Changed
- The project moved into the scintilla-py
monorepo (as
packages/pyside6-scintilla/), next to lexilla. Docs: https://borco.github.io/scintilla-py/. Releases are now taggedpyside6-scintilla-<version>. - The PyPI project links (homepage, repository, issues) and the README's links point to the new locations; 5.6.3.9's docs link 404s since the move. No code changes: still built for PySide6 6.11.
[5.6.3.9] - 2026-11-02
Changed (breaking)
- Colours are
QColor(#17). The 45 colour methods --styleSetFore/styleFore,styleSetBack,markerSetBack,setElementColour,indicSetFore,setCaretLineBack,setSelBack,setRepresentationColour, ... -- used to take and return Scintilla's packed0xBBGGRRints (0xAABBGGRRfor the alpha ones). They now take and returnQColor(anything PySide6 converts to one:QColor,Qt.GlobalColor, a colour name). Plaincolourmessages ignore alpha and read back opaque.
Check every colour call: an int is still accepted, because PySide6
converts it to QColor -- but as Qt's 0xRRGGBB with the alpha byte
ignored, so old code passing Scintilla's packed ints keeps running with red
and blue swapped, and the ...Translucent/element/representation colours
become opaque. Replace 0xBBGGRR values with QColor(r, g, b) (or QColor(r, g, b,
a)). The raw send() still takes Scintilla's packed ints.
Added
colour_to_scintilla()/colour_from_scintilla()(#17): convert between aQColor(or colour name such as"#00ff00", orQt.GlobalColor) and Scintilla's packed0xBBGGRR/0xAABBGGRRints, for code using the rawsend(). They reject anintargument rather than guess its byte order.
Fixed
- Linux wheels no longer bundle private copies of
libOpenGL,libGLXandlibGLdispatch. Qt's CMake target linked OpenGL into the extension although it never uses it, so auditwheel grafted those libraries into the wheel, next to the system ones PySide6 loads, and a locally built wheel neededlibopengl0installed. OpenGL is now kept off the link line.
[5.6.3.8] - 2026-11-02
Changed (breaking)
-
Requires PySide6 6.11 exactly (
PySide6-Essentials>=6.11,<6.12, and the same forshiboken6) (#15). The extension links against shiboken6/PySide6's C++ libraries, whose ABI changes between minor releases: 5.6.3.7 and earlier declared>=6.10with no upper bound, so they installed beside PySide6 6.12 and then failed to import ("The specified procedure could not be found"). Each PySide6 minor now gets its own release, so pip picks the one matching your PySide6 -- once the unpinned 5.6.3.0-5.6.3.7 are yanked on PyPI (otherwise pip still falls back to them). 6.12 support follows in the next release. -
A strict, consistent text/bytes API (#16). Text -- document text, names, display strings -- is
strin and out, encoded with the document's encoding (UTF-8 by default; the matching codec for other code pages). Raw data -- style bytes, images, the rawsends-- is bytes in, andQByteArrayout. Nothing is converted implicitly: passing bytes to a text method, orstrto a bytes one, raisesTypeError.
| Before | Now |
|---|---|
editor.getText(n).data().decode() |
editor.getText() |
editor.getText(n).data() (for the raw bytes) |
editor.getBytes() / getBytes(start, end) -- the document's stored bytes, undecoded |
doc.get_char_range(...) (for the raw bytes) |
doc.get_byte_range(...) |
editor.getLine(i), getSelText(), textRange(a, b), styleFont(s), ... returned QByteArray |
return str |
editor.addText(len(b), s), appendText, replaceTarget, searchInTarget, copyText, ... |
editor.addText(s) -- the byte length is computed from the encoded text |
editor.setStylingEx(n, styles), addStyledText(n, cells) |
editor.setStylingEx(styles) -- bytes, length computed |
editor.getCurLine(n) returned the line |
editor.getCurLine() returns (line, caret) |
base.sends(msg, w, "text") |
base.sends(msg, w, b"text") -- bytes only |
editor.TextReturner(msg, w) |
base.sendr(msg, w) (also on ScintillaEditBase) |
doc.insert_string(pos, b"..."), doc.get_char_range(...) returned bytes |
str in and out; doc.style_at() returns an int |
modified signals' text was QByteArray |
str |
NotificationData.text (raw notify signal) was a UTF-8-decoded str |
QByteArray: the raw length bytes, in the document's encoding |
targetAsUTF8()/encodedFromUTF8() (always empty on Qt) |
removed |
Positions and lengths elsewhere are still Scintilla's byte offsets. Each
method's docstring names the SCI_* message it sends and how its signature
differs from it.
Fixed
- A wrong argument type raised
NameError: name '_pyside6_scintilla' is not definedfrom shiboken's error reporting instead of aTypeError. getText(n)/getCurLine(n)padded their result with NULs.setText/insertText/replaceSelsilently cut text off at an embedded NUL character; they now keep it.- The type stub claimed text methods accepted
bytes | bytearray | memoryview; it now matches the runtime exactly. ScintillaEditis generated from the vendoredScintilla.ifaceagain (upstream's generated copy was about 40 messages behind), adding e.g.undoActionText,selectionSerialized,replaceTargetMinimalandcopySeparator.macroRecord/commandsignal parameters were truncated to 32 bits on Windows.NotificationData.textraisedUnicodeDecodeErrorin non-UTF-8 code pages and ignoredlength.
[5.6.3.7] - 2026-07-28
Changed
- Depends on
PySide6-Essentialsinstead of thePySide6meta-package, which requiredPySide6-Addonsas well -- ~175 MB (compressed) of modules these bindings never import, 205 MB unpacked of it a full Chromium inQt6WebEngineCore. Essentials provides the wholePySide6import namespace, includingpy.typedand the.pyistubs, so nothing changes for code importingPySide6.QtCore/QtGui/QtWidgets.
Not breaking for this library's own API, but a fresh install no longer
brings Qt WebEngine, Qt3D, QtCharts and the other add-ons along with it:
if your code imports one of those, depend on PySide6 or
PySide6-Addons explicitly.
[5.6.3.6] - 2026-07-14
Changed
- A single
cp311-abi3wheel per platform instead of one per Python version (cp311/cp312/cp313/cp314) -- the extension now compiles against Python's limited API (shiboken6'sFORCE_LIMITED_API), the same approach PySide6's own wheels use. 5 wheels per release instead of 20.
No breaking changes.
[5.6.3.5] - 2026-07-14
Added
- Linux aarch64 wheels, built via cibuildwheel's
manylinux_aarch64target (Qt installed through aqtinstall'slinux_arm64host).
No breaking changes.
[5.6.3.4] - 2026-06-27
Added
- All 74 Scintilla enum classes now bound (previously 11), each with
class- and member-level docstrings sourced from
ScintillaDoc.html, for IDE hover docs. - New example:
lexilla_highlighting, using lexilla-py'sset_lexer()glue and runtime style-name resolution (Lexer.named_styles()/name_of_style()).
No breaking changes.
[5.6.3.3] - 2026-06-19
Fixed
modified-style signals carryingScintilla::Position/enum-typed parameters (e.g.modified) never reached connected Python slots onScintillaEditBase/ScintillaEdit.Unknowntypes in the generated.pyistub forScintillaEdit.get_doc(),setText(),getText(), etc., caused by an unresolvable self-import in the stub generator.
Added
- pyright added to CI to catch typing regressions.
- Typed
Scintilla.<Name>namespace constants (InvalidPosition,CpUtf8,MarkerMax, etc.) with docstrings. - New examples:
bscintillaedit,pygments_highlighting,tree_sitter_highlighting.
No breaking changes.
[5.6.3.2] - 2026-06-14
Added
ScintillaEdit, a typed per-message wrapper overScintillaEditBase(~780 methods generated fromScintilla.iface).ScintillaDocument, wrapping Scintilla's shared/refcounted document buffer for multi-view editing.- New example:
examples/simple_scintilla_edit/. - Full
.pyistub docstrings forScintillaEdit,ScintillaDocument, andScintillaEditBase.
No breaking changes to ScintillaEditBase's existing API.
[5.6.3.1] - 2026-06-13
Docs-only release: corrects the PyPI README to reflect that pre-built wheels are published.
[5.6.3.0] - 2026-06-13
First published release: ScintillaEditBase binding with pre-built wheels
for Linux (x86_64), Windows (x86_64), and macOS (arm64, x86_64), Python
3.11-3.14.