Qt 3.0.7 is a bugfix release. It maintains both forward and backward
compatibility (source and binary) with Qt 3.0.6.

****************************************************************************
*                              General                                     *
****************************************************************************

Smaller documentation fixes. Some build issues fixed. Upgraded libpng
to 1.0.15.

****************************************************************************
*                              Library                                     *
****************************************************************************

- QAction
	Avoid emitting activated() twice for actions in a
	toolbar. Possibility to remove an iconset from an action by
	specifying a null iconset.

- QApplication
	Fixed a font sharing problem with setFont(). Fixed window
	close with modality. Don't overwrite an explicitely set font
	with the default font when using the static methods before
	calling the constructor. When the programmer/user explicitly
	sets the style (either with QApplication::setStyle or -style
	command line option), do not reset the style on settings
	changes.
	Windows only: Serialize calls to OutputDebugString, as this
	API is not reentrant. Emit aboutToQuit() when the user logs
	off. Send a focusOut event to the focus widget when the user
	tries to switch applications via Alt+Tab.
	Windows95/98/Me: Fixed enter/leave handling. Among others this
	makes tooltips work more reliable.
	X11 only: Spit out warning then the user passes an invalid
	Display* argument. Fixed figuring out the depth of the visual
	in case a private colormap is supplied. Some startup
	performance improvements with QSettings. Mark the internal
	wakeUpGuiThread() pipe with FD_CLOEXEC. Call XFilterEvent
	before the public X11 event filters to avoid applications
	filtering out events that are necessary for input methods to
	operate.

- QBuffer
	Make IO_Truncate not detach the explicitely shared byte array.

- QButton
	In setPixmap(), avoid relayouting if the new pixmap doesn't
	change the size.

- QCanvasEllipse
	Windows only: Workaround a Windows limitation that doesn't
	support 2x2 ellipse rendering without a pen. Don't try to
	double buffer invalid areas.

- QClipboard
	Flush the clipboard contents when the application object is
	destroyed.
	X11 only: another race condition fixed. Handle paste
	operations with empty data.

- QComboBox
	Accept enter/return key press events on the line edit. Fixed
	vertical alignment of text when a global strut is set. Clip
	drawing of large items. Fixed problem with items not being
	highlighted the first time the popup is shown.

- QCommonStyle
	Fixed SR_CheckBoxFocusRect for empty checkboxes (now inside
	the indicator)

- QComplexText
	Added correct positioning specs for all of thai and lao. Some
	reordering fixes.

- QCustomEvent
	Removed bogus warning on illegal type ids.

- QDataTable
	Don't display a single empty row if result set is empty and
	QuerySize cannot be determined. Don't resize the table after a
	refresh() if the size is already known.
	In closeEvent(), accept the event only when isHidden()

- QDateTime
	Fixed addYears() for days missing in certain years.

- QDns
	Slightly more reliable now, fixed a memory leak.

- QDockArea
	Fixed resizing of a QDockWindow is no longer affected by
	another closed QDockWindow in the same QDockArea.

- QDom
	Fixed memory consumption when QDomElement::setAttribute() is
	called multiple times to change the value of an
	attribute. Fixed a memory leak in QDomDocument::importNode().

- QDragManager
	X11 only: Fixed a dangling pointer case when the current
	widget was deleted. Raise cursor decoration.
	Windows only: Made dropping of URLs work on Japanese Windows98

- QEffects
	More robust through deferred deletion. Some code improvements. 
	X11 only: disable effects on displays with <16bpp (rather then
	falling back to the scrolling).

- QFileDialog
	Fixed problems with '#' in path. Fixed creation on
	non-existing directories. Make previewMode() check if
	the preview widgets are visible. Enable renaming in
	ExistingFiles mode. Fix drag'n'drop for the first click into
	the listbox. Don't auto-complete when saving a file. Enabled
	drag'n'drop of files for all modes.

- QFont
	Windows only: Fixed boundingRect(QChar) for non true type
	fonts. Fixed some positioning issues with Thai diacritics.
	Win95 only: Make symbol fonts work.
	X11 only: Fixed some issues with diacritics in non unicode
	encoded fonts.

- QFontDialog
	Fixed getFont() in case no default font is specified.

- QFrame
	Fixed erasing the margin region for flicker-optimized
	subclasses (e.g. QLineEdit). Turn on focus and mouse-over
	style flags for frame painting.

- QHeader
	Some speed improvements for the sake of QTable and
	QListView. Fix redrawing problems when moving header sections.

- QIconView
	Fixed contentsContextMenuEvent(). Only call
	QIconViewItem::dragLeft() when the cursor has left the
	bounding rect and only call QIconViewItem::dragEnter() when
	the cursor has entered the bounding rect. Some performance
	improvements.

- QInputContext
	X11 only: Improved XFontSet cache (also for cases where the X
	server does not know the locale).

- QKeyEvent
	Windows only: Fixed internal ascii to keycode conversion for
	codes > 0x80.

- QLineEdit
	Fixed doubleclick selection to only use spaces as word
	seperators. Don't validate twice in a row if fixup() did
	nothing. Fixed support for background pixmaps. Improved undo
	mechanism. Respect maxLength() in setText().

- QListBox
	Fixed null-pointer crash in extended selection mode.

- QListView
	Improved auto scrolling. Restrict drop events to items that
	have drop enabled and accept the event. Added more
	null-pointer checks to prevent crashes when reimplementing
	insertItem. Try harder to draw the focus rectangle with an
	appropriate contrast.  Do not resize a stretachable column in
	widthChanged(). Fixed selecting when auto scrolling.

- QLocalFs
	The network protocol for local file systems sets sets the
	right permissions for the QUrlInfo objects if you do a
	QUrlOperator::listChildren().

- QMainWindow
	Fixed orientation handler calls.

- QMenuBar
	Fixed resizing when it was emptied. Caused some strange
	problems in QMainWindow widgets. Allow stealing of focus in
	alt-mode. Activate alt-mode only with the plain Alt key, not
	AltGr.

- QMimeSourceFactory
	Windows only: If a path starts with \\ then it's an absolute
	path pointing to a network drive

- QMovie
	For animated GIFs, use a minimum delay of 10ms. This is
	compatible with both IE and Mozilla and avoids huge loads on
	application and X-Server.

-QPainter
	Fixed pos() in combination with transformations save/restore
	pairs. Fixed a bug in the BiDi algorithm.
	X11 only: some problems when drawing rotated text on Solaris
	fix (due to floating point arithmetrics). Fixed a matrix
	related crash on Tru64.
	Windows only: Draw end pixel in lineTo only for 0-width
	pens. Avoid painting with invalid transformations.

- QPaintDeviceMetrics
	Windows only: Fixed numColors() for 32 bit displays.

- QPixmap
	Windodws only: Fixed array bounds read error in win32
	function in convertFromImage.

- QPopupMenu
	Avoid flickering when showing a just created menu
	immediately. If there is a custom QWhatsThis installed for the
	whole menu but no whatsThis set for the item, use the custom
	QWhatsThis to get the help text.
	MacOS only: improved scrollable popups

- QPrintDialog
	Unix only: Continue parsing the nsswitch.conf file using
	additional services when /etc/printers.conf is not found.
	Windows only: Handle lack of default printers more
	gracefully. Fix reentrancy issues when reading printer dialog
	settings.

- QPrinter
	Unix only: Fixes for 64 bit safety.
	Windows only: fixed a possible double-freeing of memory of a
	hdc passed to the Windows Common Dialog.

- QProcess
	Windows only: Less command quoting for clients that use
	GetCommandLine() directly. Make tryTerminate() robust in case
	the process does not run. Make it possible to start batch
	files with spaces in the filename. Make it safe to call
	qApp->processEvents() in a slot connected to
	QProcess::readyReadStdout().

- QPSPrinter
	Fixed codec for korean postscript fonts (ksc5601.1987-0, not
	the listbox. Don't auto-complete when saving a fileeucKR).

- QRichText
	Fixed a case-sensitive compare for alignment. Fixed a free'd
	memory access problem with floating items on destruction.

- QScrollView
	If a contents mouse event is accepted, don't propagate as
	a normal mouse event.

- QSemaphore
	Fixed race condition in operator -=.
	Unix only: a bit more robust.

- QSettings
	Unix only: Fixed requesting subkeylists for single
	subkeys. Don't read in QSettings stuff in non-gui mode if
	desktop-settings-aware is set to false.

- QSlider
	Emit sliderMoved() after the slider was moved.

- QSocket
	If the read retruns 0, safely assume assume that the peer
	closed the connection. Fixed readyRead sometimes not being
	emitted.

- QSpinBox
	Fixed setValue so it will ignore input but yet
	not interpreted text

- QSqlDatabase
	Fixed a crash on manual deletion of the QApplication object.

- QSqlDriver
	Various fixes and improvements for Oracle, Postgres, MySQL

- QSqlForm
	Fixed crash in clearValues() on empty fields.

- QString
	Fixed setNum(n,base) with n == LONG_MIN and n != 10. Make
	toLong() and toULong() 64bit clean (problems on Tru64).

- QStyle
	Make more use of Style_HasFocus. Enforce a usable size for
	subcontrols for small scrollbars. Improve titlebar drawing
	(e.g. no gradient on 95/NT). Allow drawing of list view
	expand controls without branches .
	In Windows style: increase default PM_MaximumDragDistance
	value.
	Windows only: fixed PM_ScrollBarExtent

- QStyleSheet
	More accurate mightBeRichText() heuristic. Fixed setMargin()
	to only set left/right/top/bottom as documented, not the
	firstline margin.

- QSvgDevice
	Fixed curve command mixup. Some bounding rect fixes. Fixed
	output coordinates for drawArc, drawPie and drawChord. Proper
	x-axis-rotation and other angle fixes for arcs, pies and
	chords. Respect text alignments. No background for Bezier
	the listbox. Don't auto-complete when saving a filecurves.

- QTabBar
	Move focus to the current tab if the tab with focus is being
	removed.

- QTable
	Fixed contentsContextMenuEvent(). Fixed
	adjustRow()/adjustColumn() for multi line sections. Support
	for QApplicaton::globalStrut(). Speed improvements for
	setNumRows(). Improved sizeHint() to include the left/top
	header. Fix for mouse release handling. Update geometry of
	cell widgets when changing rowHeight/colWidth. Fixed
	QTableItem::sizeHint() for items with wordwrap. Catch
	hideColumn() on tables with too few columns. Fixed an endless
	recursion when swapping header sections.

- QTableItem
	Fixed multiple calls to setSpan().

- QTextCodec:
	Initialize locale before loading textcodec plugins. Fixed a
	bug in the unicode -> jisx0208 conversion table.

- QTextEdit	
	Reset cursor on undos that leave us with an empty
	textedit. Quote quotes when exporting rich text. Fixed
	possible crash when appending empty paragraphs like
	"<p>". Some drawing problems fixed. Made removeParagraph() and
	friends work in read-only mode. Fixed cursor blinking with
	setEnabled() / setDisabled(). When exporting HTML, quote the
	src attribute of img tags tags that contains spaces. Made 
	setFormat() much faster in case undo/redo is disabled. Fixed
	double deletion crash when clearing a document with floating
	custom items.

- QToolButton
	In sizeHint() don't reserve space for icons if button has
	only a textlabel. Made popups more robust (e.g. if the slot
	connected to the popup menu results in the destruction of the
	toolbutton)

- QVariant
	Fixed canCast() for Bool -> String conversion. Fixed
	operator== for maps.

- QWaitCondition
	Windows only: Fixed multiple waits()

- QWheelEvent
	X11 only: Support for two-wheel mice. This relies on the
	X-Server option "ZAxisMapping" "4 5 6 7"
	On Windows, we have not found a reliable way to distringuish
	the two wheels. Some drivers use larger deltas, something that
	breaks with other drivers.

- QWidget
	Make focusWidget() return the focus widget even if it has no
	focus policy. In setEnabled(FALSE) always clear the focus.
	Made grabWidget() more robust. Fixed isEnabledTo().
	X11 only: set WM_WINDOW_ROLE instead of WINDOW_ROLE.
	Windows only: fixed widget-origin pixmap backgrounds.

- QWidgetStack
	More fixes to reduce flicker.

- QWorkspace
	Traditional activeWindow() fixes. Make maximizing a window while
	the workspace is invisible work. If the already active window
	is clicked on, transfer focus to the child. Restore focus to
	old subcontrol when changing the active MDI window. Make sure
	a MDI window is not resized below a child widget's minimum
	size. Do not allow resizing windows when we have an active
	popup window.

- QXmlSimpleReader
	Fixed a memory leak for incremental parsing.
