Here is a list of user-visible changes in Qt from 1.0 to 1.1.  As
usual, we fixed some bugs, made some more speedups, and improved the
documentation.


****************************************************************************
*               Changes that might affect runtime behavior                 *
****************************************************************************

We've added keyboard interface to more widgets, and changed the
default focus policy radically.  For example, by default you can TAB
to button, but it does not grab focus when you click it.  The new
QWidget::setFocusPolicy() function can be used to change focus policy
for all widgets.

The font matching algorithm has been tweaked in order to provide more
predictable fonts in more cases.  For some users (such as those with a
75dpi X server and only 100dpi fonts installed) it may change the
output of some programs.

sizeHint() and hence default size has been tweaked for some widgets;
QMenuBar and QPushButton in particular.


****************************************************************************
*               Changes that might generate compile errors                 *
*                        when compiling old code                           *
****************************************************************************

We've renamed "declare" in qgeneric.h to Q_DECLARE due to naming
conflicts.  Though we try to provide backward compatibility, there may
be problems for a few programs.


****************************************************************************
*               Type changes that might generate warnings:                 *
****************************************************************************

none


****************************************************************************
*                         Obsoleted functions                              *
****************************************************************************

none


****************************************************************************
* 			     New classes				   *
****************************************************************************

QTabDialog (and QTabBar) provide a tabbed dialog.  examples/pref shows
simple usage of QTabDialog.

QMultiLineEditor is the long-awaited multi-line editor.

QGridLayout provides grid-like geometry management for any widget,
with flexible row/column elasticity, minimum and maximum sizes.

QBoxLayout provides more complex and powerful geometry management:
boxes and widgets stacked inside other boxes, and finally a top-level
box connected to a widget.

QToolTip provides tool tips for any widget.


****************************************************************************
*		       Other changes from 1.0 to 1.1			   *
****************************************************************************

Added QApplication::setColorMode() and colorMode().

Added QColor::setAllocContext() and friends; these functions enable
applications to allocate discardable colors and then discard them.

Removed some GNU-make features from the makefiles.

Added a QPalette constructor to construct an entire palette from a single
background color, for convenience.

moc output now has a version number #define.

AIX support added.  IRIX and NetBSD fixed.

Rewrote a couple of functions to work around compiler bugs, or
purify/boundschecker overzealousness.

Fixed that ugly man-page SYNOPSIS bug.

Added the static function QMessageBox::query().

QRect::unite() now produces the desired results if exactly one of the
rectangles is invalid.

QObject::parent() is now public.

QPainter::drawWinFocusRect() draws a Windows 95-style focus rectangle.
(A focus rectangle can not be drawn using ordinary Windows drawing
functions.)

QApplication::processEvents() added to cater for long-running
computations; it processes one round of window system events and
timers and then returns.

QComboBox has been extended to provide an editable combo box and Motif
2.x compatible look and feel.

We've also added a host of new workarounds for bugs in Borland C++,
Microsoft VC++, DEC CXX and HP CC.
