smooth logo
Copyright (C) 2020 The smooth project

Welcome to the smooth Class Library project

smooth is an object oriented C++ class library for Windows, macOS, Linux and most Unix-like operating systems. It provides basic functionality and platform support for applications and libraries.

Features provided by smooth include:

  • a user interface API with various widgets
  • a simple to use multithreading API
  • a file and network IO interface
  • completely transparent Unicode and software internationalization support
  • a libxml2 based XML parser

smooth is Free Software and is made available under the terms of "The Artistic License, Version 2.0".

05.03.2023 - smooth version 0.9.10

Version 0.9.10 of the smooth Class Library has been released today. This service release improves handling of scaling and color schemes on Linux, updates bundled 3rd party libraries and fixes several issues found in earlier releases.

05.03.23 15:38 - smooth alpha 0.9.10

- windowgdi.cpp		- apply dark mode to top window edge too on Windows 10 and 11
- fontcairo.cpp		- respect text scaling factor in addition to font size setting
- surfacecairo.cpp	- attempt to read desktop scale factor from KDE settings if GDK query fails
- backendxlib.cpp	- added support for KDE color schemes (including dark mode)
- windowxlib.cpp	- improved compatibility of drag & drop implementation with KDE running under Wayland
			- fixed focus handling for windows without window manager decorations
- surfacecocoa.mm	- fixed crash trying to draw to windows before they are fully constructed
- application.cpp	- fixed determination of application path when running under Rosetta
- listbox.cpp		- fixed and improved list entry dragging behavior
- http.cpp		- fixed libcurl proxy feature detection
- cpu.cpp		- fixed number of cores reported for CPUs with different core types (performance/efficiency)
			- fixed number of cores reported for SMP systems (now reporting total number of cores)
- instream.cpp		- allow data pointer to be NULL in InputData if number of bytes is 0
- outstream.cpp		- allow data pointer to be NULL in OutputData if number of bytes is 0

- various minor performance optimizations
- fixed long paths being converted to 8.3 format on recent versions of Windows
- fixed handling of long UNC paths on Windows
- upgraded fribidi to version 1.0.12
- upgraded libcpuid to version 0.6.2
- upgraded libxml2 to version 2.10.3
- upgraded libcurl to version 7.87.0
- upgraded libiconv to version 1.17
- upgraded libpng to version 1.6.39
- upgraded libwebp to version 1.3.0
- upgraded zlib to version 1.2.13
	  

21.01.2022 - smooth version 0.9.9

Version 0.9.9 of the smooth Class Library has been released today. This service release adds support for building Windows ARM64 binaries and fixes several issues affecting all supported systems.

21.01.22 19:17 - smooth alpha 0.9.9

- instream.cpp		- prevent opening folders with file IO classes
			- abort InputLine call when encoutering NUL bytes
- datetime.cpp		- fixed potential crash upon failed time conversion
- filedlg_cocoa.mm	- fixed incompatibility with macOS 12.0 Monterey
- dirdlg_win32.cpp	- prepend a newline to caption for improved layout

- added support for building Windows ARM64 binaries
- upgraded fribidi to version 1.0.11
- upgraded libcpuid to version 0.5.1
- upgraded libxml2 to version 2.9.12
- upgraded libjpeg to version 9e
	  

27.06.2021 - smooth version 0.9.8

Version 0.9.8 of the smooth Class Library has been released today. This service release adds support for the decoding images in the WebP format and fixes several issues affecting all supported systems.

27.06.21 13:24 - smooth alpha 0.9.8

- imageloader.cpp	- added support for auto-detecting image formats
- webp.cpp		- added support for WebP image decoding
- windowgdi.cpp		- improved scaling when setting icons via SetIcon()
- init.cpp		- warn about incomplete application shutdown in debug builds
- thread.cpp		- made it illegal to call Stop on the current thread
			- fixed thread synchronization issues in wait and exit functions
- array.cpp		- fixed thread synchronization issues when accessing arrays
- rwlock.cpp		- fixed thread synchronization issues
- combobox.cpp		- fixed dropdown staying open when parent window moves or resizes
- popupmenu.cpp		- fixed popup staying open when parent window moves or resizes
- popupmenuentry.cpp	- fixed occasional crashes when opening third level popup menus
- backendxlib.cpp	- fixed timers being invoked in GTK threads despite denyTimerInterrupts state
- backendcocoa.mm	- fixed possible crash when quitting applications through a dock command
- surfacecocoa.mm	- fixed rendering of bitmaps with alpha channel
- surfacecairo.cpp	- fixed drawing of diagonal lines when running in a Wayland session
			- respect custom DPI settings on Xfce desktop
- windowxlib.cpp	- fixed possible crash on exit when running in a Wayland session
			- fixed drag & drop working unreliably
			- fixed incorrect usage of XGetInputFocus API
- application.cpp	- fixed determination of binary path on FreeBSD
- file.cpp		- fixed accessing files via file:// URLs

- fixed several instances of undefined behavior found with -fsanitize=undefined
- fixed translation field not being focused after selecting entries in Translator utility
- upgraded libcurl to version 7.77.0
	  

14.02.2021 - smooth version 0.9.7

Version 0.9.7 of the smooth Class Library has been released today. This service release adds support for building on Apple Silicon Macs and fixes several issues affecting macOS and X11 based systems.

14.02.21 14:56 - smooth alpha 0.9.7

- backendcocoa.mm	- added support for opening registered file types on macOS
- screenxlib.cpp	- improved multi-monitor support for X11 based systems
- surfacecocoa.mm	- fixed popup windows appearing black on older versions of macOS
- backendxlib.cpp	- fixed issues querying GTK theme colors
- window.cpp		- fixed drawing issues on KDE systems
- arrows.cpp		- fixed unintentional wrap-around when going below zero value
- cursor.cpp		- avoid sending two onInput signals when replacing selected text
- semaphoreposix.cpp	- use custom semaphore implementation based on condition variable

- added support for building for Apple Silicon Macs
- implemented alpha-blending for drawing bitmaps with alpha channel
- upgraded libcurl to version 7.73.0
- upgraded libcpuid to version 0.5.0
	  

10.10.2020 - smooth version 0.9.6

Version 0.9.6 of the smooth Class Library has been released today. This service release improves support for macOS and fixes several issues found in smooth 0.9.5 and earlier releases.

10.10.20 18:20 - smooth alpha 0.9.6

- surfacegdi.cpp	- fixed too high DPI values being reported
- surfacegdiplus.cpp	- fixed too high DPI values being reported
- windowcocoa.mm	- fixed glitches after closing tabs in tabbed mode
- menubar_cocoa.mm	- fixed possible crash after menubar contents change
- droptarget.cpp	- fixed rare crash related to drag & drop handling
- translator.cpp	- also look for translations in application data folder
- tree.cpp		- improved rendering of tree widget in scaled mode
- http.cpp		- include status code in response header fields

- implemented proper multi-monitor support for macOS
- added support for macOS 11.0 Big Sur
- added a separate error code for denied access to file IO drivers
- fixed wrong color space returned in BitmapBackend::GetPixel for multiple backends
- upgraded fribidi to version 1.0.10
	  

17.06.2020 - smooth version 0.9.5

Version 0.9.5 of the smooth Class Library has been released today. This service release enables UI scaling to the system default font size on all platforms, adds support for theme colors and dark mode on X11 based systems, improves support for window maximize and restore on X11 based systems and macOS and fixes some minor issues found in smooth 0.9.4 and earlier releases.

17.06.20 23:22 - smooth alpha 0.9.5

- threadcocoa.mm	- set stack size for new threads to process stack size
- surfacecairo.cpp	- fixed crash when DISPLAY variable is not set
- surfacecocoa.mm	- fixed drawing inverted rects with scale factors greater than 1.0
			- fixed paint rect calculation for drawing lines
- windowxlib.cpp	- implemented handling of maximized state and restore
- windowcocoa.mm	- implemented handling of maximized and full screen state and restore
- backendxlib.cpp	- added support for theme colors and dark mode
- backendhaiku.cpp	- load actual app signature from application binary

- scale UI to adjust to system font size on all operating systems
	  

22.03.2020 - smooth version 0.9.4

Version 0.9.4 of the smooth Class Library has been released today. This service release fixes some minor issues found in smooth 0.9.3 and enables compilation for Windows on ARM with Visual Studio.

22.03.20 11:44 - smooth alpha 0.9.4

- fontgdi.cpp		- fixed text length calculation for fonts using kerning
- cursor.cpp		- fixed cursor positioning and text selection in right-to-left mode

- allow compilation for Windows on ARM with Visual Studio
- removed support for using Cairo graphics backend on Windows
	  

08.03.2020 - smooth version 0.9.3

Version 0.9.3 of the smooth Class Library has been released today. This service release fixes some issues found in smooth 0.9.2, improves the smooth Translator utility and updates dependencies.

08.03.20 11:36 - smooth alpha 0.9.3

- popupmenuentry.cpp	- react on mouse up even if mouse down was not on the same entry
- windowgdi.cpp		- fixed drag & drop not accepting long file paths
			- fixed positioning of IME in non-resizable windows
- backendwin32.cpp	- fixed black title bar color on Windows Vista, 7 and 8/8.1
			- respect colorization tint color on Windows Vista, 7 and 8/8.1
- surfacecairo.cpp	- improved HiDPI detection on Linux/FreeBSD systems
- translator.cpp	- fixed loading translations with different prefix from resources folder
- bitmapbackend.cpp	- retain alpha channel when grayscaling bitmaps

- added support for drag and drop in Translator utility
- made editing area resizable in Translator utility
- added a button for copying the original text to the translation to Translator utility
- also check for _WIN32 definition on Windows instead of requiring __WIN32__ to be defined
- adapt include files to work around long path issue when building on Windows
- adapt Makefiles to allow spaces in build path
- upgraded fribidi to version 1.0.9
	  

09.02.2020 - smooth version 0.9.2

Version 0.9.2 of the smooth Class Library has been released today. This service release fixes some issues found in smooth 0.9.1, adds support for dark mode on Windows and updates dependencies.

09.02.20 16:26 - smooth alpha 0.9.2

- string.cpp		- fixed compatibility issues with Windows 10 UTF-8 codepage beta setting
- windowxlib.cpp	- fixed a crash when placing a text cursor on some systems without an input manager
- windowgdi.cpp		- fixed mouse events still arriving at parent window after opening popup menu
- driver_ansi.cpp	- fixed issues with setting buffer size on macOS
- backendwin32.cpp	- added support for Windows 10 dark mode
- backendhaiku.cpp	- set locale to user default at startup
- button.cpp		- draw icons in gray when buttons are disabled
- messagebox.cpp	- also look for icons in path relative to application directory
			- fixed text placement when no icon is available

- added a Makefile target for code signing
- upgraded libjpeg to version 9d
	  

12.01.2020 - smooth version 0.9.1

Version 0.9.1 of the smooth Class Library has been released today. This service release fixes minor issues found in smooth 0.9.0 and updates dependencies.

12.01.20 17:52 - smooth alpha 0.9.1

- backendwin32.cpp	- added support for Windows 10 accent colors
- driver_ansi.cpp	- fixed switching between read and write mode
- widget.cpp		- fixed artifacts when hiding child widgets extending outside their containers
- optionbox.cpp		- fixed placement of selection indicator
- windowhaiku.cpp	- fixed possible crash when exiting programs
- eventhaiku.cpp	- ensure message queue locking is enabled before enqueuing messages
- windowxlib.cpp	- actually keep topmost windows on top
			- reset input context before deleting it

- fixed interaction with topmost windows when a modal window is active on non-Windows platforms
- upgraded libcurl to version 7.68.0
	  

15.12.2019 - smooth version 0.9.0

Version 0.9.0 of the smooth Class Library has been released today. It is a major update from the v0.8.73.x series and includes lots of improvements and bug fixes.

15.12.19 12:54 - smooth alpha 0.9.0

- application.cpp	- new Application::Lock class implementing a global lock for UI processing
- widget.cpp		- explicitly show/hide child widgets in Show/Hide methods
- layer.cpp		- use standard widget implementations of Show/Hide methods
- menu.cpp		- simplified API for adding menu entries
- combobox.cpp		- fixed selected entry not being updated when new entry has the same memory address
- cursor.cpp		- fixed text not being drawn correctly after undo/redo
			- fixed multi-line cursors not responding after clicking below the last line
			- performance optimizations for text input
- scrollbar.cpp		- added support for smooth scrolling
- container.cpp		- new common base class for menus and lists
- tree.cpp		- draw horizontal branch lines to improve tree look
- tabwidget.cpp		- added support for displaying bitmaps on tab handles
- image.cpp		- set background color for bitmaps
- hyperlink.cpp		- set background color for bitmaps
- backendxlib.cpp	- allow console applications to run without an X display available
- windowxlib.cpp	- fixed thread-safety issues with Xlib windows
- windowgdi.cpp		- added support for high precision touchpad scrolling
- windowcocoa.mm	- made drag & drop work more reliably on macOS
			- added support for high precision scrolling on macOS 10.7 and later
- surfacecocoa.mm	- added support for dark mode on macOS
- keyboard.cpp		- improved thread-safety
- crc16.cpp		- added Hash::CRC16 class to calculate 16 bit CRCs
- driver_posix.cpp	- fixed permissions of newly created files to respect umask setting
- driver.cpp		- added Truncate() and Close() methods to public API
			- added IsBuffered() and SetBufferSize() methods to control buffering
			- implemented Flush() method for file drivers
- outstream.cpp		- added Truncate() method
- directory.cpp		- Copy() and Move() method now take a const Directory & argument
			- fixed permissions of newly created directories to respect umask setting
- file.cpp		- Copy() and Move() method now take a const File & argument
			- added methods to change modification and access time
- string.cpp		- added scoped string format setters String::InputFormat and String::OutputFormat
- system.cpp		- added GetApplicationCacheDirectory() method
- thread.cpp		- added GetCurrentThreadID() method
- math.cpp		- added methods for pseudo random number generation
- datetime.cpp		- fixed possible crashes
- cpu.cpp		- added support for querying CPU vendor and brand strings
			- added support for measuring CPU clock rate

- added Float32 and Float64 type defintions
- added support for Unicode console I/O on Windows
- added stream API to CRC32 and CRC64 classes
- performance improvements for CRC calculations
- added plain text export to Translator utility
- removed support for building with Xlib backend on macOS
- removed dependency on libXmu
- upgraded libcurl to version 7.56.1
- upgraded libpng to version 1.6.37
- upgraded libjpeg to version 9c
- upgraded libiconv to version 1.16
- upgraded libxml2 to version 2.9.10
- upgraded libbzip2 to version 1.0.8
- upgraded fribidi to version 1.0.8
- upgraded libcpuid to version 0.4.1