summaryrefslogtreecommitdiffstats
path: root/src/kernel/qcursor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/qcursor.cpp')
-rw-r--r--src/kernel/qcursor.cpp287
1 files changed, 287 insertions, 0 deletions
diff --git a/src/kernel/qcursor.cpp b/src/kernel/qcursor.cpp
new file mode 100644
index 0000000..7956a94
--- /dev/null
+++ b/src/kernel/qcursor.cpp
@@ -0,0 +1,287 @@
+/****************************************************************************
+**
+** Implementation of QCursor class
+**
+** Created : 940220
+**
+** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved.
+**
+** This file is part of the kernel module of the Qt GUI Toolkit.
+**
+** This file may be used under the terms of the GNU General
+** Public License versions 2.0 or 3.0 as published by the Free
+** Software Foundation and appearing in the files LICENSE.GPL2
+** and LICENSE.GPL3 included in the packaging of this file.
+** Alternatively you may (at your option) use any later version
+** of the GNU General Public License if such license has been
+** publicly approved by Trolltech ASA (or its successors, if any)
+** and the KDE Free Qt Foundation.
+**
+** Please review the following information to ensure GNU General
+** Public Licensing requirements will be met:
+** http://trolltech.com/products/qt/licenses/licensing/opensource/.
+** If you are unsure which license is appropriate for your use, please
+** review the following information:
+** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
+** or contact the sales department at sales@trolltech.com.
+**
+** This file may be used under the terms of the Q Public License as
+** defined by Trolltech ASA and appearing in the file LICENSE.QPL
+** included in the packaging of this file. Licensees holding valid Qt
+** Commercial licenses may use this file in accordance with the Qt
+** Commercial License Agreement provided with the Software.
+**
+** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
+** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
+** herein.
+**
+**********************************************************************/
+
+#include "qcursor.h"
+
+#ifndef QT_NO_CURSOR
+
+#include "qbitmap.h"
+#include "qimage.h"
+#include "qdatastream.h"
+
+
+/*!
+ \class QCursor qcursor.h
+
+ \brief The QCursor class provides a mouse cursor with an arbitrary
+ shape.
+
+ \ingroup appearance
+ \ingroup shared
+
+ This class is mainly used to create mouse cursors that are
+ associated with particular widgets and to get and set the position
+ of the mouse cursor.
+
+ Qt has a number of standard cursor shapes, but you can also make
+ custom cursor shapes based on a QBitmap, a mask and a hotspot.
+
+ To associate a cursor with a widget, use QWidget::setCursor(). To
+ associate a cursor with all widgets (normally for a short period
+ of time), use QApplication::setOverrideCursor().
+
+ To set a cursor shape use QCursor::setShape() or use the QCursor
+ constructor which takes the shape as argument, or you can use one
+ of the predefined cursors defined in the \l CursorShape enum.
+
+ If you want to create a cursor with your own bitmap, either use
+ the QCursor constructor which takes a bitmap and a mask or the
+ constructor which takes a pixmap as arguments.
+
+ To set or get the position of the mouse cursor use the static
+ methods QCursor::pos() and QCursor::setPos().
+
+ \img cursors.png Cursor Shapes
+
+ \sa QWidget \link guibooks.html#fowler GUI Design Handbook:
+ Cursors\endlink
+
+ On X11, Qt supports the \link
+ http://www.xfree86.org/4.3.0/Xcursor.3.html Xcursor\endlink
+ library, which allows for full color icon themes. The table below
+ shows the cursor name used for each Qt::CursorShape value. If a
+ cursor cannot be found using the name shown below, a standard X11
+ cursor will be used instead. Note: X11 does not provide
+ appropriate cursors for all possible Qt::CursorShape values. It
+ is possible that some cursors will be taken from the Xcursor
+ theme, while others will use an internal bitmap cursor.
+
+ \table
+ \header \i Qt::CursorShape Values \i Cursor Names
+ \row \i Qt::ArrowCursor \i left_ptr
+ \row \i Qt::UpArrowCursor \i up_arrow
+ \row \i Qt::CrossCursor \i cross
+ \row \i Qt::WaitCursor \i wait
+ \row \i Qt::BusyCursor \i left_ptr_watch
+ \row \i Qt::IbeamCursor \i ibeam
+ \row \i Qt::SizeVerCursor \i size_ver
+ \row \i Qt::SizeHorCursor \i size_hor
+ \row \i Qt::SizeBDiagCursor \i size_bdiag
+ \row \i Qt::SizeFDiagCursor \i size_fdiag
+ \row \i Qt::SizeAllCursor \i size_all
+ \row \i Qt::SplitVCursor \i split_v
+ \row \i Qt::SplitHCursor \i split_h
+ \row \i Qt::PointingHandCursor \i pointing_hand
+ \row \i Qt::ForbiddenCursor \i forbidden
+ \row \i Qt::WhatsThisCursor \i whats_this
+ \endtable
+*/
+
+/*!
+ \enum Qt::CursorShape
+
+ This enum type defines the various cursors that can be used.
+
+ \value ArrowCursor standard arrow cursor
+ \value UpArrowCursor upwards arrow
+ \value CrossCursor crosshair
+ \value WaitCursor hourglass/watch
+ \value BusyCursor standard arrow with hourglass/watch
+ \value IbeamCursor ibeam/text entry
+ \value SizeVerCursor vertical resize
+ \value SizeHorCursor horizontal resize
+ \value SizeFDiagCursor diagonal resize (\)
+ \value SizeBDiagCursor diagonal resize (/)
+ \value SizeAllCursor all directions resize
+ \value BlankCursor blank/invisible cursor
+ \value SplitVCursor vertical splitting
+ \value SplitHCursor horizontal splitting
+ \value PointingHandCursor a pointing hand
+ \value ForbiddenCursor a slashed circle
+ \value WhatsThisCursor an arrow with a question mark
+ \value BitmapCursor
+
+ ArrowCursor is the default for widgets in a normal state.
+
+ \img cursors.png Cursor Shapes
+*/
+
+/*****************************************************************************
+ QCursor stream functions
+ *****************************************************************************/
+
+#ifndef QT_NO_DATASTREAM
+
+
+/*!
+ \relates QCursor
+ Writes the cursor \a c to the stream \a s.
+
+ \sa \link datastreamformat.html Format of the QDataStream operators \endlink
+*/
+
+QDataStream &operator<<( QDataStream &s, const QCursor &c )
+{
+ s << (Q_INT16)c.shape(); // write shape id to stream
+ if ( c.shape() == Qt::BitmapCursor ) { // bitmap cursor
+#if !defined(QT_NO_IMAGEIO)
+ s << *c.bitmap() << *c.mask();
+ s << c.hotSpot();
+#else
+ qWarning("No Image Cursor I/O");
+#endif
+ }
+ return s;
+}
+
+/*!
+ \relates QCursor
+ Reads a cursor from the stream \a s and sets \a c to the read data.
+
+ \sa \link datastreamformat.html Format of the QDataStream operators \endlink
+*/
+
+QDataStream &operator>>( QDataStream &s, QCursor &c )
+{
+ Q_INT16 shape;
+ s >> shape; // read shape id from stream
+ if ( shape == Qt::BitmapCursor ) { // read bitmap cursor
+#if !defined(QT_NO_IMAGEIO)
+ QBitmap bm, bmm;
+ QPoint hot;
+ s >> bm >> bmm >> hot;
+ c = QCursor( bm, bmm, hot.x(), hot.y() );
+#else
+ qWarning("No Image Cursor I/O");
+#endif
+ } else {
+ c.setShape( (int)shape ); // create cursor with shape
+ }
+ return s;
+}
+#endif // QT_NO_DATASTREAM
+
+
+/*!
+ Constructs a custom pixmap cursor.
+
+ \a pixmap is the image. It is usual to give it a mask (set using
+ QPixmap::setMask()). \a hotX and \a hotY define the cursor's hot
+ spot.
+
+ If \a hotX is negative, it is set to the \c{pixmap().width()/2}.
+ If \a hotY is negative, it is set to the \c{pixmap().height()/2}.
+
+ Valid cursor sizes depend on the display hardware (or the
+ underlying window system). We recommend using 32x32 cursors,
+ because this size is supported on all platforms. Some platforms
+ also support 16x16, 48x48 and 64x64 cursors.
+
+ Currently, only black-and-white pixmaps can be used.
+
+ \sa QPixmap::QPixmap(), QPixmap::setMask()
+*/
+
+QCursor::QCursor( const QPixmap &pixmap, int hotX, int hotY )
+{
+ QImage img = pixmap.convertToImage().
+ convertDepth( 8, Qt::ThresholdDither|Qt::AvoidDither );
+ QBitmap bm;
+ bm.convertFromImage( img, Qt::ThresholdDither|Qt::AvoidDither );
+ QBitmap bmm;
+ if ( bm.mask() ) {
+ bmm = *bm.mask();
+ QBitmap nullBm;
+ bm.setMask( nullBm );
+ }
+ else if ( pixmap.mask() ) {
+ QImage mimg = pixmap.mask()->convertToImage().
+ convertDepth( 8, Qt::ThresholdDither|Qt::AvoidDither );
+ bmm.convertFromImage( mimg, Qt::ThresholdDither|Qt::AvoidDither );
+ }
+ else {
+ bmm.resize( bm.size() );
+ bmm.fill( Qt::color1 );
+ }
+
+ setBitmap(bm,bmm,hotX,hotY);
+}
+
+
+
+/*!
+ Constructs a custom bitmap cursor.
+
+ \a bitmap and
+ \a mask make up the bitmap.
+ \a hotX and
+ \a hotY define the cursor's hot spot.
+
+ If \a hotX is negative, it is set to the \c{bitmap().width()/2}.
+ If \a hotY is negative, it is set to the \c{bitmap().height()/2}.
+
+ The cursor \a bitmap (B) and \a mask (M) bits are combined like this:
+ \list
+ \i B=1 and M=1 gives black.
+ \i B=0 and M=1 gives white.
+ \i B=0 and M=0 gives transparent.
+ \i B=1 and M=0 gives an undefined result.
+ \endlist
+
+ Use the global Qt color \c color0 to draw 0-pixels and \c color1 to
+ draw 1-pixels in the bitmaps.
+
+ Valid cursor sizes depend on the display hardware (or the
+ underlying window system). We recommend using 32x32 cursors,
+ because this size is supported on all platforms. Some platforms
+ also support 16x16, 48x48 and 64x64 cursors.
+
+ \sa QBitmap::QBitmap(), QBitmap::setMask()
+*/
+
+QCursor::QCursor( const QBitmap &bitmap, const QBitmap &mask,
+ int hotX, int hotY )
+{
+ setBitmap(bitmap,mask,hotX,hotY);
+}
+
+#endif // QT_NO_CURSOR
+
+