Main changes
Compatibility
* Fix 583: python 3.12 compatibility by penguinolog in https://github.com/urwid/urwid/pull/598
* Python 37+ migration, Python < 3.7 support dropped by penguinolog in https://github.com/urwid/urwid/pull/522
* make tests compatible with Python 3.11 by dotlambda in https://github.com/urwid/urwid/pull/517
* Deprecate legacy property creation by penguinolog in https://github.com/urwid/urwid/pull/533
* Deprecate `__super` hack by penguinolog in https://github.com/urwid/urwid/pull/538
* [BREAKING CHANGE] Fixes: 90 Remove idle emulation from asyncio event loop by penguinolog in https://github.com/urwid/urwid/pull/541
New Features
* ZMQ event loop by waveform80 in https://github.com/urwid/urwid/pull/362
* Add two fonts based on Unicode 13 2x3 TRS-80/Teletext mosaic characters by rbanffy in https://github.com/urwid/urwid/pull/434
* Adds 256 color and truecolor support to vterm. Fixes 457 by danschwarz in https://github.com/urwid/urwid/pull/559
* Vterm now emits 'resize' signal upon terminal resize by danschwarz in https://github.com/urwid/urwid/pull/584
* vterm.py: Adds support for bracketed paste mode. Fixes 452 by danschwarz in https://github.com/urwid/urwid/pull/594
* Pass SelectableIcon `align` and `wrap` arguments to parent by penguinolog in https://github.com/urwid/urwid/pull/599
Fixes
* fix: restore normal screen on ctrl-z by proskur1n in https://github.com/urwid/urwid/pull/477
* Reconnect the 'modified' signal after setting a new ListBox.body by exquo in https://github.com/urwid/urwid/pull/474
* Allow signal handling interoperability with raw display by AnonymouX47 in https://github.com/urwid/urwid/pull/557
* Fix alternate/normal screen buffer switch for raw display by AnonymouX47 in https://github.com/urwid/urwid/pull/556
* Fix text layout for `align="center", wrap="clip"` when `maxcol` == `line_width - 1` by AnonymouX47 in https://github.com/urwid/urwid/pull/543
* Fix assertion failure when string contains SO but not SI by mfncooper in https://github.com/urwid/urwid/pull/489
* Fix empty markup handling by penguinolog in https://github.com/urwid/urwid/pull/536
* Resolve 499 and add tests by djyotta in https://github.com/urwid/urwid/pull/500
* vterm: Fixed OSC 0,2 to set widget title properly (decode bytestring) by danschwarz in https://github.com/urwid/urwid/pull/561
* vterm: Fixed a crash bug with DECALN command by danschwarz in https://github.com/urwid/urwid/pull/560
* Fix 443 : export ELLIPSIS constant by penguinolog in https://github.com/urwid/urwid/pull/527
* Fix: 445 - add `__len__` to listbox with validation if body `Sized` by penguinolog in https://github.com/urwid/urwid/pull/534
* Fix old_str_util.decode_one : support bytes and str as arguments by penguinolog in https://github.com/urwid/urwid/pull/531
* Use `locale.getpreferredencoding(False)` if possible (most systems) F… by penguinolog in https://github.com/urwid/urwid/pull/528
* Fix `TextCanvas` `CanvasError("Attribute extends beyond text...")` by penguinolog in https://github.com/urwid/urwid/pull/555
* Fix merging attributes while decomposing tag markup by mandre in https://github.com/urwid/urwid/pull/507
* fix: use trio.lowlevel instead of trio.hazmat with Trio >= 0.15 by ntamas in https://github.com/urwid/urwid/pull/439
* Fix TypeError in signals module on weak object finalize by GC by rvtpro in https://github.com/urwid/urwid/pull/503
* Include _resize_pipe_rd in fd_list for _wait_for_input_ready for raw_display by inducer in https://github.com/urwid/urwid/pull/453
* container: fix duplicate text by vapier in https://github.com/urwid/urwid/pull/490
* Provide 80x24 fallback for ansi and vt100 by roadriverrail in https://github.com/urwid/urwid/pull/465
Refactoring
* Use == instead of "is" for equality testing by naglis in https://github.com/urwid/urwid/pull/431
* Split event loop in several modules by penguinolog in https://github.com/urwid/urwid/pull/537
* Drop some compat for python < 2.6 by dlax in https://github.com/urwid/urwid/pull/409
* Annotate types in simple cases and use isinstance (& protocol) based type checking by penguinolog in https://github.com/urwid/urwid/pull/529
* Add type annotations and optimize `urwid.font` by penguinolog in https://github.com/urwid/urwid/pull/540
* Related 583: Cleanup C helper from python2-only code by penguinolog in https://github.com/urwid/urwid/pull/597
* Optimize `vterm`: adopt data types and add annotations. Fix tests by penguinolog in https://github.com/urwid/urwid/pull/547
* Split widget and introduce base enums by penguinolog in https://github.com/urwid/urwid/pull/595
Documentation and examples
* Use non deprecated template by jspricke in https://github.com/urwid/urwid/pull/424
* Mention asyncio event loop compatibility in readme by johtso in https://github.com/urwid/urwid/pull/463
* Fix documentation of TrioEventLoop.run_async() by ntamas in https://github.com/urwid/urwid/pull/438
* Fix column label typo in tour example by devfull in https://github.com/urwid/urwid/pull/473
* Update index.rst by adbenitez in https://github.com/urwid/urwid/pull/504
* fix typo by doctorcolossus in https://github.com/urwid/urwid/pull/493
* Update README.rst by yhh2021 in https://github.com/urwid/urwid/pull/481
* docs: fix simple typo, incompatable -> incompatible by timgates42 in https://github.com/urwid/urwid/pull/446
* Fixed twisted example: use `implementer` decorator instead of deprecated `implements`. by penguinolog in https://github.com/urwid/urwid/pull/591
* examples/terminal.py can run against older versions of Urwid again by danschwarz in https://github.com/urwid/urwid/pull/596
* fix: update links to examples by geier in https://github.com/urwid/urwid/pull/577
Other changes
* Test fixes by penguinolog in https://github.com/urwid/urwid/pull/524
* Fix input handling and extra type annotations by penguinolog in https://github.com/urwid/urwid/pull/530
* Fix regression: `Pile()` focus_item can be Widget -> need to set prop… by penguinolog in https://github.com/urwid/urwid/pull/535
* Fix incorrect type cast in vterm (`apply_mapping` should return `bytes`) by penguinolog in https://github.com/urwid/urwid/pull/545
* Return original code to the deprecated getters and setters by penguinolog in https://github.com/urwid/urwid/pull/549
* Fix CheckBox default state validation and initialization by penguinolog in https://github.com/urwid/urwid/pull/553
New Contributors
* johtso made their first contribution in https://github.com/urwid/urwid/pull/463
* devfull made their first contribution in https://github.com/urwid/urwid/pull/473
* adbenitez made their first contribution in https://github.com/urwid/urwid/pull/504
* doctorcolossus made their first contribution in https://github.com/urwid/urwid/pull/493
* yhh2021 made their first contribution in https://github.com/urwid/urwid/pull/481
* dotlambda made their first contribution in https://github.com/urwid/urwid/pull/517
* rvtpro made their first contribution in https://github.com/urwid/urwid/pull/503
* vapier made their first contribution in https://github.com/urwid/urwid/pull/490
* proskur1n made their first contribution in https://github.com/urwid/urwid/pull/477
* naglis made their first contribution in https://github.com/urwid/urwid/pull/431
* dlax made their first contribution in https://github.com/urwid/urwid/pull/409
* mandre made their first contribution in https://github.com/urwid/urwid/pull/507
* timgates42 made their first contribution in https://github.com/urwid/urwid/pull/446
* djyotta made their first contribution in https://github.com/urwid/urwid/pull/500
* penguinolog made their first contribution in https://github.com/urwid/urwid/pull/523
* exquo made their first contribution in https://github.com/urwid/urwid/pull/474
* roadriverrail made their first contribution in https://github.com/urwid/urwid/pull/465
* rbanffy made their first contribution in https://github.com/urwid/urwid/pull/434
* mfncooper made their first contribution in https://github.com/urwid/urwid/pull/489
* AnonymouX47 made their first contribution in https://github.com/urwid/urwid/pull/543
* danschwarz made their first contribution in https://github.com/urwid/urwid/pull/559
* dependabot made their first contribution in https://github.com/urwid/urwid/pull/570
**Full Changelog**: https://github.com/urwid/urwid/commits/2.2.0