I’ve just pushed 0.2.1, which is mostly a bugfix-only release. Changelog follows:
- XHTML files that specify two different encodings are now fixed by removing the incorrect one
- Sigil now checks the XML encoding attribute for an encoding before the HTML metatag and charset; should now be more compatible with Calibre created epub books
- created/used 16px versions of all icons; icons in menus are not blurry anymore (issue #121)
- the Find&Replace dialog now uses the currently selected text (if any) as the default search term (issue #370)
- fixed issues with unnecessary reloads of the code view (issue #412, issue #398)
- fixed an issue with the HTML file filter in the open file dialog not correctly filtering files (issue #416)
- fixed an issue with files without extensions not being saved in the final epub (issue #400)
- fixed an issue with XPGT resources sometimes being saved blank (issue #433)
- fixed a regression that made it impossible to add removed headings back into the TOC (issue #439)
- fixed a problem with some file-wide replacements reverting
- fixed a problem with the opened tabs not being updated until the user gave them keyboard focus when a file-wide replace was performed (issue 408)
- fixed a problem with Book View not reflecting changes done in Code View when the Code View was used for editing, and then the tab closed
- use of custom synchronization primitives should resolve most infrequent hang bugs
- fixed a problem with the search not progressing in Book View find&replace when using recursive replacements
- fixed an issue with inserting images that have apostrophes in the filename (issue #391)
- TOC text now has leading and trailing whitespace trimmed, and inner whitespace condensed (issue #422)
- an empty ALT attribute is now added to "img" elements that don't have them (issue #406)
- added the build time to the About dialog, showing date and time in UTC
Remember when I said that 0.2.0 was surprisingly free of major bugs? I spoke too soon. :)
The major issue was that replacements performed with the Find&Replace dialog could sometimes revert back. Horrible, I know. This should now be fixed.
The next major issue actually goes way back to the start of 0.2.0 betas, I just couldn’t track it down: Sigil could sometimes completely hang. This usually happened during saves, and should also be fixed now. I’ve written some custom synchronization primitives that should alleviate these problems. This also involved rewriting the way tabs release their locks etc. Lot’s of nice things. Should work now.
And the last major problem was a regression that made it impossible to add removed TOC items back in.
 Nothing too fancy, I needed a ReadWriteLock that was shallow and non-recursive. Qt provides one that is non-recursive by default, but not shallow. By “shallow”, I mean a lock that allows only one level of locking by the same thread, thus silently letting multiple lock calls succeed, even though only the first one did. Same thing goes for unlock: the first call unlocks, the others just skip. The lock and unlock calls are appropriately called LockIfNeeded() and UnlockIfNeeded().
Admittedly, a shallow lock is rarely needed, and if you’re using one, you damn well better know what you’re doing.