0.3.0 (2016-01-29)
------------------

 * PulseView now uses libsigrokcxx (the libsigrok C++ bindings library).
 * Update to use the new APIs of libsigrokcxx 0.4.x and libsigrokdecode 0.4.x.
 * Add support for vertical scaling of analog and logic traces.
 * Add a "Save selection range as..." feature. This allows the user to select
   a subset of the data (using the cursors) and save that into a file in the
   libsigrok session format (*.sr).
 * Remember the directory of the last file that was opened/saved.
 * Automatically save and restore (upon PulseView shutdown/startup):
    - the window state (size, position)
    - the most recently used device
 * Implement pinch-zoom support (useful e.g. on tablets).
 * Implement an "always zoom-to-fit" feature.
 * Implement a "sticky scrolling" feature, using hotkey 's' (bug #121).
 * Show icons for active triggers on the right-hand side of the window.
 * Cursors: Also show the frequency in addition to distance/time (bug #502).
 * List available serial ports (for serial-based devices) in a drop-down.
 * Add support for trace groups. An arbitrary number of traces can be grouped
   together, which allows for dragging them around as a group and re-ordering
   traces within the group. Hotkeys: group (CTRL+g), ungroup (CTRL+u).
 * Use either alternating gray values as trace background color, or the
   trace's own color (slightly modified). This behaviour is configurable
   via the menu or the 'b' hotkey.
 * Show a vertical marker at the trigger point (bug #685).
 * Sampling bar: Show the total sampling time in a tooltip.
 * Trace/Decoder popups: Close the popup when the ENTER/RETURN key is pressed.
 * Improve horizontal arrow-key scrolling step size.
 * The viewport can now be dragged vertically as well.
 * Add support for placing arbitrary markers (double-click at the desired
   position in the ruler area) with arbitrary name/content. Markers can be
   removed via the delete key (or the right-click context menu).
 * Show full device names in the device drop-down.
 * The device selector combobox is now a split button. Clicking on a device
   name will open the "Connect to Device" dialog which allows for manual
   device selection. Clicking on the small arrow will open a drop-down with
   all autodetected devices.
 * The main menu is now hidden by default, pressing ALT will make it appear,
   pressing ALT or ESC will hide it again.
 * Add an Export menu item, which can export the data in various formats.
 * Add an Import menu item, which allows data import of various formats.
 * Support specifying input files + formats on the command-line (-i and -I).
 * Update the possible samplerates/samplecounts widgets when needed.
 * Various UI fixes and improvements (colors, font sizes, clipping, etc).
 * Add support for the SR_CONF_{POWER_OFF,PROBE_FACTOR} config keys.
 * Include the device / filename in the window title (bug #244).
 * Keyboard shortcuts:
   - Add space as a shortcut to start/stop an acquisition.
   - Add shortcuts for the open/save menu items (CTRL-o, CTRL-s).
   - Add trace group shortcuts: group (CTRL+g), ungroup (CTRL+u).
   - Add 's' as shortcut for enabling/disabling sticky scrolling.
   - Add 'b' as shortcut for colored / alternating-gray trace backgrounds.
 * Add a few missing toolbar buttons.
 * Provide tooltips for decoder annotations (which show the "full" annotation
   text regardless of zoom-level).
 * Improvements to work (better) with Qt5 (Qt4 remains supported as well).
 * The whole code-base has been converted to C++11 (dropping the use
   of various Boost functionality in favor of std:: equivalents).
 * Build system:
   - Always build with -std=c++11.
   - Auto-detect Qt4 or Qt5. If both are available, Qt5 will be selected
     unless the cmake option FORCE_QT4 is set to TRUE.
   - Don't use Qt-defined keywords (can cause issues with other headers).
   - Fix an issue with QtSvg linking (bug #369).
   - Fix a build issue related to Qt4 MOC.
   - Add "-git-<hash>" suffix to development version numbers (bug #609).
   - Fix the build for older glibmm versions (bug #548).
 * Updated build requirements:
   - A C++ compiler with C++11 support (g++ >= 4.7 or clang++ >= 3.1)
   - glibmm-2.4 (>= 2.28.0)
   - Qt4 >= 4.5 or Qt5 (including the following components):
    - Qt4: QtCore, QtGui, QtSvg
    - Qt5: Qt5Core, Qt5Gui, Qt5Widgets, Qt5Svg
   - Boost >= 1.53 (bugs #722, #593).
   - libsigrokcxx >= 0.4.0 (libsigrok C++ bindings)
   - libsigrokdecode >= 0.4.0
   - libsigrokandroidutils >= 0.1.0 (optional, only needed on Android)
 * Dropped build requirements:
   - libsigrok (PulseView now uses libsigrokcxx instead).
 * manpage:
   - Various fixes and updates.
   - Document all keyboard shortcuts.
 * Android:
   - Add basic Android support and support for building a PulseView APK.
   - Install logging callbacks for Android.
   - Fix a rendering issue by disabling the system background.
   - Fix an issue due to a missing libintl.so in the APK (bug #575).
   - Add asset reader functionality, e.g. for firmware files.
   - Include firmware files (from sigrok-firmware) in the APK (bug #400).
 * Windows:
   - Fix an issue related to CMAKE_MODULE_PATH usage.
   - Fix multiple Boost- and thread-related issues.
   - Fix a build issue due to windows.h namespace pollution (bug #517).
   - Fix an issue when saving .sr files (bug #615).
 * Mac OS X:
   - Fix an issue related to Glib::Variant types.
   - Fix a build failure on Mac OS X 10.10 (bug #621).
 * NSIS:
   - Drop libusb0.dll, we use libusb-1.0 everywhere now.
   - Add start menu entries for Zadig (bug #542).
   - Support out-of-tree builds.
   - Don't hardcode the MXE install location.
 * README: Drop reference to obsolete sigrok-commits mailing list.
 * Add a Doxygen file for auto-generated code documentation.
 * Populate signal popup combo box with signal names (not probe names).
 * Fix various thread related issues.
 * Fix various compiler warnings and compiler portability issues.
 * Adapt PulseView to use the new libsigrokcxx trigger API (bugs #448, #452).
 * Reimplement file save using the "srzip" output module (bug #451).
 * Check whether config keys are available before use (bug #487).
 * Markers: Fix display of negative values in popups (bug #460).
 * Properly handle device selection failure (bug #455).
 * Fix a progressbar issue when saving files (bug #451).
 * Fix incorrect channel names in .sr files (bug #490).
 * Save and load signal names as UTF-8 strings (bug #498).
 * Add a workaround for QTBUG-22829 (bug #532).
 * Allow vertical scrolling via CTRL + mouse-wheel (bug #497).
 * Fix an isnan() related compiler error (bug #531).
 * Gracefully handle the case of a failing SAMPLERATE query (bug #529).
 * Show less device info in the device dropdown (bug #285).
 * Always show full device info in device selection tooltips (bug #489).
 * Fix a segfault due to a missing Capability::LIST check (bug #453).
 * Allow PulseView to be killed via CTRL-C from a terminal (bug #368).
 * Support having no selected device (bug #488, #392).
 * Add menu actions to the main window too (bug #590).
 * Avoid confusing autocompletion in the channel name popups (bug #501).
 * Fix an issue with channel ordering being reset incorrectly (bug #536).
 * Fix an issue related to a disappearing samplerate dropdown (bug #594).
 * Fix an issue with incorrect samplenumbers when running decoders.
 * Suppress warnings from glibmm about deprecated auto_ptr (bug #654).
 * Add a workaround for a corrupted timescale issue (bug #627).
 * Fix a libzip-related issue resulting in errors writing .sr files (bug #570).
 * Fix an issue that caused incorrect .sr files being saved (bug #599).
 * When clicking a channel name, place the cursor in the text field (bug #298).
 * Fix a double-free issue/segfault when trying to open an .sr file (bug #405).
 * Fix an issue with incorrect placement of PD annotation tooltips (bug #477).
 * Allow drag-moving both cursors (left + right) at the same time (bug #514).
 * Improve the step-size of the vertical scroll bar click-movement (bug #513).
 * Fix a too small display area for devices with many channels (bug #515).
 * Fix a Qt5 QWellArray related static linking issue (bug #525).
 * Fix broken session saving for devices with more than one channel (bug #404).
 * Fix incorrect ruler units of kilo-/mega-/giga-seconds (bug #371).
 * Fix an issue with segment sizes wasting huge amounts of memory (bug #622).
 * Avoid a crash when running out of memory, show an error instead (bug #626).
 * Improve behaviour when the last PD is removed from the stack (bug #510).
 * Disable device options GUI elements after an acquisition start (bug #597).
 * Fix an issue with the samplerate input format option (bug #595).
 * Fix a segfault when switching from a file to a device and back (bug #596).
 * Fix a segfault when loading very large .sr files (bug #592).
 * Fix a segfault when selecting a device twice (bug #605).
 * Fix an incorrect decode trace background color (bug #718).
 * Fix incorrect annotation row background color behaviour (bug #719).
 * Fix an issue with lingering decoder traces (bug #687).
 * Fix non-intuitive channel name editing behaviour (bug #717).
 * Speed up annotation drawing by quite a bit (bug #325).

0.2.0 (2014-05-06)
------------------

 * Add support for protocol decoding.
   - A menu item Decoders->Add can add (only) low-level protocol decoders.
   - Clicking on a decoder's arrow on the left-hand side allows stacking
     (only) further, higher-level decoders (bug #333).
   - Add support for multiple decoder rows per PD (bugs #161, #303).
 * Add support for loading data from input files.
 * Add support for saving logic analyzer data in *.sr files (bug #245).
 * Show the filename of loaded *.sr files as "device name" in a drop-down.
 * Add support for the new "channel groups" feature in libsigrok.
 * Add a "Zoom to fit" and a "Zoom 1:1" icon/button.
 * Add a "Channels" icon/button for enabling and configuring device channels.
 * Add a "Device options" icon/button for configuring device specific settings
   such as voltage thresholds.
 * Double-clicking will zoom into the location the cursor points to.
 * Add shortcut keys for Zoom-in (CTRL++) and Zoom-out (Ctrl+-) (bug #235).
 * Add initial, basic support for analog data sources, such as oscilloscopes.
   This has been tested on e.g. the Rigol DS1052E oscilloscope (bug #127).
 * Almost all operations in PulseView work in an "auto-apply" style, i.e.
   any changes in the GUI popups (decoder channel assignment, decoder option
   changes, device channel changes, device option changes, and so on) have an
   immediate effect (you don't have to click on any "OK" buttons).
 * Open file dialog: Add 'All files' selection possibility.
 * Added GUI support for the following libsigrok config options:
   - SR_CONF_VOLTAGE_THRESHOLD
   - SR_CONF_TRIGGER_SLOPE
   - SR_CONF_EXTERNAL_CLOCK
   - SR_CONF_CLOCK_EDGE
 * Updated build requirements:
   - cmake >= 2.8.6 (required)
   - libsigrok >= 0.3.0 (required)
   - libsigrokdecode >= 0.3.0 (required)
     Note: libsigrokdecode is now always required (was optional before).
   - libboost-filesystem >= 1.42 (required)
   - libboost-test >= 1.42 (optional, only needed for running unit tests)
 * Fix a build issue on NetBSD due to an incorrect #include.
 * Fix a channel handling issue for devices with >= 16 channels.
 * Fixed a few display issues related to UTF-8 strings in decoder annotations,
   decoder options, and so on (bug #307, and other fixes without bug numbers).
 * Don't decode if required PD channels were not supplied (bug #204).
 * Fix some issues with partially disappearing PD annotations.
 * Update the samplerate selector when the device config changes (since e.g.
   en-/disabling logic analyzer channels can change available samplerates).
 * Fix a samplerate selector and device config update issue (bug #296).
 * Minor performance improvements via memory pre-allocation in some areas.
 * Remove old PD annotations upon new captures (bugs #172, #302).
 * Portability improvements by using portable sample pack/unpack code.
 * Fix a segfault related to thread joining (bug #323).
 * Fix a minor issue which lead to trigger config being unusable (bug #318).
 * Fix an issue which lead to the user-selected samplerate in the drop-down
   box not being selected and shown again after clicking "Run" (bug #324).
 * Start a new decode session whenever a new frame begins.
 * Fix an issue which arose when a session file load failed (bug #331).
 * Fix a segfault if only exactly one libsigrok driver is available (bug #334).
 * Fix an issue with channel names not being updated while typing (bug #338).
 * Fix an issue by stopping the capture when a device is changed (bug #223).
 * Fix an issue with the displayed cursor popup time (bug #229).
 * Fix handling of different integer types in some properties (bug #203).
 * Hide the 'Configure device' button when the popup would be empty (bug #232).
 * Fix a decoding chunk buffer / unitsize issue (bugs #171, #225).
 * Fix a zoom issue due to invalid samplerate, assume 1Hz if needed (bug #278).
 * Fix a QWellArray related issue by dropping QT_NO_MENU code (bug #265).
 * Fix an analog data channel interleaving issue (bug #279).
 * Only show the sample count widget if needed (i.e., hide it for scopes).
 * SweepTimingWidget: Show a 1-2-5 based list for samplerate and samplecount.
 * Fixed a unit test issue with AnalogSnapshotTest (bug #286).
 * Add an extra sample to edges to make the end sample visible (bug #280).
 * Fix an issue with decoder errors being shown even after the error was fixed.
 * Add support for SR_CONF_LIMIT_SAMPLES (device-specific limits) (bug #74).
 * Windows:
   - Use the sigrok logo as icon for pulseview.exe (bugs #110, #238).
   - Fix SVG icons not being displayed on Windows (bug #239).
   - Ship libusb0.dll in the NSIS based installer (bug #241).
   - Additionally ship decoders, firmware files, example *.sr files, and
     zadig.exe and zadig_xp.exe in the NSIS based installer.
   - Fix a "working path" issue resulting in PDs not being usable.
 * Device scan: Disable "OK" button if no devices were found (bug #237).
 * Fix a segfault related to incorrect decoder option handling (bug #160).
 * Fix an off-by-one issue resulting in one PD not being usable (bug #164).
 * Fix a PD channel auto-select logic issue with optional channels (bug #310).
 * Fix an issue when cancelling "Connect to Device" (bug #242).
 * Avoid confusing annotation color changes (bug #311).
 * Fix an issue that caused some decoded data to not be shown (bug #308).
 * Don't allow disabled channels (channel arrows) to be selected (bug #313).
 * The channel name field is now resized to always fit the contents (bug #167).
 * Build fixes for systems with (among other versions) Qt5 installed.
 * Fix a build issue related to missing libboost-filesystem (bug #133).
 * Add Cotire (optional, disabled by default) support for build performance.
 * Fix a build issue related to Cotire (bug #217).
 * Fix an issue with missing channel names from loaded files (bug #126).
 * Fix missing samplerate loading from session files (bug #123).
 * Fix some build issues related to C++ namespaces (bug #196).
 * Fix a file loading issue which triggered an assert (bug #320).

0.1.0 (2013-05-04)
------------------

 * Initial release.

