diff options
Diffstat (limited to 'src')
25 files changed, 136 insertions, 30 deletions
diff --git a/src/plugins/platforms/windows/cursors.qrc b/src/plugins/platforms/windows/cursors.qrc new file mode 100644 index 0000000000..fded527aac --- /dev/null +++ b/src/plugins/platforms/windows/cursors.qrc @@ -0,0 +1,25 @@ +<RCC> + <qresource prefix="/qt-project.org/windows/cursors"> + <file>images/closedhandcursor_32.png</file> + <file>images/closedhandcursor_48.png</file> + <file>images/closedhandcursor_64.png</file> + <file>images/dragcopycursor_32.png</file> + <file>images/dragcopycursor_48.png</file> + <file>images/dragcopycursor_64.png</file> + <file>images/draglinkcursor_32.png</file> + <file>images/draglinkcursor_48.png</file> + <file>images/draglinkcursor_64.png</file> + <file>images/dragmovecursor_32.png</file> + <file>images/dragmovecursor_48.png</file> + <file>images/dragmovecursor_64.png</file> + <file>images/openhandcursor_32.png</file> + <file>images/openhandcursor_48.png</file> + <file>images/openhandcursor_64.png</file> + <file>images/splithcursor_32.png</file> + <file>images/splithcursor_48.png</file> + <file>images/splithcursor_64.png</file> + <file>images/splitvcursor_32.png</file> + <file>images/splitvcursor_48.png</file> + <file>images/splitvcursor_64.png</file> + </qresource> +</RCC> diff --git a/src/plugins/platforms/windows/images/closedhandcursor_32.png b/src/plugins/platforms/windows/images/closedhandcursor_32.png Binary files differnew file mode 100644 index 0000000000..7b3cba1965 --- /dev/null +++ b/src/plugins/platforms/windows/images/closedhandcursor_32.png diff --git a/src/plugins/platforms/windows/images/closedhandcursor_48.png b/src/plugins/platforms/windows/images/closedhandcursor_48.png Binary files differnew file mode 100644 index 0000000000..e63031605e --- /dev/null +++ b/src/plugins/platforms/windows/images/closedhandcursor_48.png diff --git a/src/plugins/platforms/windows/images/closedhandcursor_64.png b/src/plugins/platforms/windows/images/closedhandcursor_64.png Binary files differnew file mode 100644 index 0000000000..438680ed4e --- /dev/null +++ b/src/plugins/platforms/windows/images/closedhandcursor_64.png diff --git a/src/plugins/platforms/windows/images/dragcopycursor_32.png b/src/plugins/platforms/windows/images/dragcopycursor_32.png Binary files differnew file mode 100644 index 0000000000..f40ac6a600 --- /dev/null +++ b/src/plugins/platforms/windows/images/dragcopycursor_32.png diff --git a/src/plugins/platforms/windows/images/dragcopycursor_48.png b/src/plugins/platforms/windows/images/dragcopycursor_48.png Binary files differnew file mode 100644 index 0000000000..21ee467f46 --- /dev/null +++ b/src/plugins/platforms/windows/images/dragcopycursor_48.png diff --git a/src/plugins/platforms/windows/images/dragcopycursor_64.png b/src/plugins/platforms/windows/images/dragcopycursor_64.png Binary files differnew file mode 100644 index 0000000000..c49bcf33aa --- /dev/null +++ b/src/plugins/platforms/windows/images/dragcopycursor_64.png diff --git a/src/plugins/platforms/windows/images/draglinkcursor_32.png b/src/plugins/platforms/windows/images/draglinkcursor_32.png Binary files differnew file mode 100644 index 0000000000..5efbce90d3 --- /dev/null +++ b/src/plugins/platforms/windows/images/draglinkcursor_32.png diff --git a/src/plugins/platforms/windows/images/draglinkcursor_48.png b/src/plugins/platforms/windows/images/draglinkcursor_48.png Binary files differnew file mode 100644 index 0000000000..51205101b1 --- /dev/null +++ b/src/plugins/platforms/windows/images/draglinkcursor_48.png diff --git a/src/plugins/platforms/windows/images/draglinkcursor_64.png b/src/plugins/platforms/windows/images/draglinkcursor_64.png Binary files differnew file mode 100644 index 0000000000..55eb0e313a --- /dev/null +++ b/src/plugins/platforms/windows/images/draglinkcursor_64.png diff --git a/src/plugins/platforms/windows/images/dragmovecursor_32.png b/src/plugins/platforms/windows/images/dragmovecursor_32.png Binary files differnew file mode 100644 index 0000000000..32781a15ff --- /dev/null +++ b/src/plugins/platforms/windows/images/dragmovecursor_32.png diff --git a/src/plugins/platforms/windows/images/dragmovecursor_48.png b/src/plugins/platforms/windows/images/dragmovecursor_48.png Binary files differnew file mode 100644 index 0000000000..6b15af6e84 --- /dev/null +++ b/src/plugins/platforms/windows/images/dragmovecursor_48.png diff --git a/src/plugins/platforms/windows/images/dragmovecursor_64.png b/src/plugins/platforms/windows/images/dragmovecursor_64.png Binary files differnew file mode 100644 index 0000000000..e9e4ece29f --- /dev/null +++ b/src/plugins/platforms/windows/images/dragmovecursor_64.png diff --git a/src/plugins/platforms/windows/images/openhandcursor_32.png b/src/plugins/platforms/windows/images/openhandcursor_32.png Binary files differnew file mode 100644 index 0000000000..a6948d48f7 --- /dev/null +++ b/src/plugins/platforms/windows/images/openhandcursor_32.png diff --git a/src/plugins/platforms/windows/images/openhandcursor_48.png b/src/plugins/platforms/windows/images/openhandcursor_48.png Binary files differnew file mode 100644 index 0000000000..e8beb8d29d --- /dev/null +++ b/src/plugins/platforms/windows/images/openhandcursor_48.png diff --git a/src/plugins/platforms/windows/images/openhandcursor_64.png b/src/plugins/platforms/windows/images/openhandcursor_64.png Binary files differnew file mode 100644 index 0000000000..d12e3a7283 --- /dev/null +++ b/src/plugins/platforms/windows/images/openhandcursor_64.png diff --git a/src/plugins/platforms/windows/images/splithcursor_32.png b/src/plugins/platforms/windows/images/splithcursor_32.png Binary files differnew file mode 100644 index 0000000000..1ad479eddf --- /dev/null +++ b/src/plugins/platforms/windows/images/splithcursor_32.png diff --git a/src/plugins/platforms/windows/images/splithcursor_48.png b/src/plugins/platforms/windows/images/splithcursor_48.png Binary files differnew file mode 100644 index 0000000000..bf59b9cdca --- /dev/null +++ b/src/plugins/platforms/windows/images/splithcursor_48.png diff --git a/src/plugins/platforms/windows/images/splithcursor_64.png b/src/plugins/platforms/windows/images/splithcursor_64.png Binary files differnew file mode 100644 index 0000000000..b857458671 --- /dev/null +++ b/src/plugins/platforms/windows/images/splithcursor_64.png diff --git a/src/plugins/platforms/windows/images/splitvcursor_32.png b/src/plugins/platforms/windows/images/splitvcursor_32.png Binary files differnew file mode 100644 index 0000000000..ebb55ae2e1 --- /dev/null +++ b/src/plugins/platforms/windows/images/splitvcursor_32.png diff --git a/src/plugins/platforms/windows/images/splitvcursor_48.png b/src/plugins/platforms/windows/images/splitvcursor_48.png Binary files differnew file mode 100644 index 0000000000..5408920652 --- /dev/null +++ b/src/plugins/platforms/windows/images/splitvcursor_48.png diff --git a/src/plugins/platforms/windows/images/splitvcursor_64.png b/src/plugins/platforms/windows/images/splitvcursor_64.png Binary files differnew file mode 100644 index 0000000000..7f09a40c01 --- /dev/null +++ b/src/plugins/platforms/windows/images/splitvcursor_64.png diff --git a/src/plugins/platforms/windows/qwindowscursor.cpp b/src/plugins/platforms/windows/qwindowscursor.cpp index bfe22dac3f..021a1dfb02 100644 --- a/src/plugins/platforms/windows/qwindowscursor.cpp +++ b/src/plugins/platforms/windows/qwindowscursor.cpp @@ -208,12 +208,13 @@ static HCURSOR createBitmapCursor(const QImage &bbits, const QImage &mbits, static inline QSize systemCursorSize() { return QSize(GetSystemMetrics(SM_CXCURSOR), GetSystemMetrics(SM_CYCURSOR)); } static inline QSize standardCursorSize() { return QSize(32, 32); } +#if defined (Q_OS_WINCE) || defined (QT_NO_IMAGEFORMAT_PNG) // Create pixmap cursors from data and scale the image if the cursor size is // higher than the standard 32. Note that bitmap cursors as produced by // createBitmapCursor() only work for standard sizes (32,48,64...), which does // not work when scaling the 16x16 openhand cursor bitmaps to 150% (resulting // in a non-standard 24x24 size). -static HCURSOR createPixmapCursorFromData(const QSize &systemCursorSize, +static QCursor createPixmapCursorFromData(const QSize &systemCursorSize, // The cursor size the bitmap is targeted for const QSize &bitmapTargetCursorSize, // The actual size of the bitmap data @@ -231,33 +232,11 @@ static HCURSOR createPixmapCursorFromData(const QSize &systemCursorSize, rawImage = rawImage.transformed(transform, Qt::SmoothTransformation); } const QPoint hotSpot(rawImage.width() / 2, rawImage.height() / 2); - return QWindowsCursor::createPixmapCursor(rawImage, hotSpot); + return QCursor(rawImage, hotSpot.x(), hotSpot.y()); } -struct QWindowsStandardCursorMapping { - Qt::CursorShape shape; - LPCWSTR resource; -}; - -HCURSOR QWindowsCursor::createSystemCursor(const QCursor &c) +QCursor QWindowsCursor::customCursor(Qt::CursorShape cursorShape) { - static const QWindowsStandardCursorMapping standardCursors[] = { - { Qt::ArrowCursor, IDC_ARROW}, - { Qt::UpArrowCursor, IDC_UPARROW }, - { Qt::CrossCursor, IDC_CROSS }, - { Qt::WaitCursor, IDC_WAIT }, - { Qt::IBeamCursor, IDC_IBEAM }, - { Qt::SizeVerCursor, IDC_SIZENS }, - { Qt::SizeHorCursor, IDC_SIZEWE }, - { Qt::SizeBDiagCursor, IDC_SIZENESW }, - { Qt::SizeFDiagCursor, IDC_SIZENWSE }, - { Qt::SizeAllCursor, IDC_SIZEALL }, - { Qt::ForbiddenCursor, IDC_NO }, - { Qt::WhatsThisCursor, IDC_HELP }, - { Qt::BusyCursor, IDC_APPSTARTING }, - { Qt::PointingHandCursor, IDC_HAND } - }; - // Non-standard Windows cursors are created from bitmaps static const uchar vsplit_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -324,6 +303,107 @@ HCURSOR QWindowsCursor::createSystemCursor(const QCursor &c) 0xf0,0x7f,0xf8,0x7f,0xfc,0x7f,0xfc,0x3f,0xf8,0x3f,0xf0,0x1f, 0xe0,0x1f,0xe0,0x1f,0x00,0x00,0x00,0x00}; + switch (cursorShape) { + case Qt::SplitVCursor: + return createPixmapCursorFromData(systemCursorSize(), standardCursorSize(), 32, vsplit_bits, vsplitm_bits); + case Qt::SplitHCursor: + return createPixmapCursorFromData(systemCursorSize(), standardCursorSize(), 32, hsplit_bits, hsplitm_bits); + case Qt::OpenHandCursor: + return createPixmapCursorFromData(systemCursorSize(), standardCursorSize(), 16, openhand_bits, openhandm_bits); + case Qt::ClosedHandCursor: + return createPixmapCursorFromData(systemCursorSize(), standardCursorSize(), 16, closedhand_bits, closedhandm_bits); + case Qt::DragCopyCursor: + case Qt::DragMoveCursor: + case Qt::DragLinkCursor: + return QCursor(QGuiApplicationPrivate::instance()->getPixmapCursor(cursorShape), 0, 0); + } + + return QCursor(); +} +#else // Q_OS_WINCE || QT_NO_IMAGEFORMAT_PNG +struct QWindowsCustomPngCursor { + Qt::CursorShape shape; + int size; + const char *fileName; + int hotSpotX; + int hotSpotY; +}; + +QCursor QWindowsCursor::customCursor(Qt::CursorShape cursorShape) +{ + static const QWindowsCustomPngCursor pngCursors[] = { + { Qt::SplitVCursor, 32, "splitvcursor_32.png", 11, 11 }, + { Qt::SplitVCursor, 48, "splitvcursor_48.png", 16, 17 }, + { Qt::SplitVCursor, 64, "splitvcursor_64.png", 22, 22 }, + { Qt::SplitHCursor, 32, "splithcursor_32.png", 11, 11 }, + { Qt::SplitHCursor, 48, "splithcursor_48.png", 16, 17 }, + { Qt::SplitHCursor, 64, "splithcursor_64.png", 22, 22 }, + { Qt::OpenHandCursor, 32, "openhandcursor_32.png", 10, 12 }, + { Qt::OpenHandCursor, 48, "openhandcursor_48.png", 15, 16 }, + { Qt::OpenHandCursor, 64, "openhandcursor_64.png", 20, 24 }, + { Qt::ClosedHandCursor, 32, "closedhandcursor_32.png", 10, 12 }, + { Qt::ClosedHandCursor, 48, "closedhandcursor_48.png", 15, 16 }, + { Qt::ClosedHandCursor, 64, "closedhandcursor_64.png", 20, 24 }, + { Qt::DragCopyCursor, 32, "dragcopycursor_32.png", 0, 0 }, + { Qt::DragCopyCursor, 48, "dragcopycursor_48.png", 0, 0 }, + { Qt::DragCopyCursor, 64, "dragcopycursor_64.png", 0, 0 }, + { Qt::DragMoveCursor, 32, "dragmovecursor_32.png", 0, 0 }, + { Qt::DragMoveCursor, 48, "dragmovecursor_48.png", 0, 0 }, + { Qt::DragMoveCursor, 64, "dragmovecursor_64.png", 0, 0 }, + { Qt::DragLinkCursor, 32, "draglinkcursor_32.png", 0, 0 }, + { Qt::DragLinkCursor, 48, "draglinkcursor_48.png", 0, 0 }, + { Qt::DragLinkCursor, 64, "draglinkcursor_64.png", 0, 0 } + }; + + const int cursorSize = GetSystemMetrics(SM_CXCURSOR); + const QWindowsCustomPngCursor *sEnd = pngCursors + sizeof(pngCursors) / sizeof(pngCursors[0]); + const QWindowsCustomPngCursor *bestFit = 0; + int sizeDelta = INT_MAX; + for (const QWindowsCustomPngCursor *s = pngCursors; s < sEnd; ++s) { + if (s->shape != cursorShape) + continue; + const int currentSizeDelta = qMax(s->size, cursorSize) - qMin(s->size, cursorSize); + if (currentSizeDelta < sizeDelta) { + bestFit = s; + if (currentSizeDelta == 0) + break; // Perfect match found + sizeDelta = currentSizeDelta; + } + } + + if (!bestFit) + return QCursor(); + + const QPixmap rawImage(QStringLiteral(":/qt-project.org/windows/cursors/images/") + + QString::fromLatin1(bestFit->fileName)); + return QCursor(rawImage, bestFit->hotSpotX, bestFit->hotSpotY); +} +#endif // Q_OS_WINCE || QT_NO_IMAGEFORMAT_PNG + +struct QWindowsStandardCursorMapping { + Qt::CursorShape shape; + LPCWSTR resource; +}; + +HCURSOR QWindowsCursor::createSystemCursor(const QCursor &c) +{ + static const QWindowsStandardCursorMapping standardCursors[] = { + { Qt::ArrowCursor, IDC_ARROW}, + { Qt::UpArrowCursor, IDC_UPARROW }, + { Qt::CrossCursor, IDC_CROSS }, + { Qt::WaitCursor, IDC_WAIT }, + { Qt::IBeamCursor, IDC_IBEAM }, + { Qt::SizeVerCursor, IDC_SIZENS }, + { Qt::SizeHorCursor, IDC_SIZEWE }, + { Qt::SizeBDiagCursor, IDC_SIZENESW }, + { Qt::SizeFDiagCursor, IDC_SIZENWSE }, + { Qt::SizeAllCursor, IDC_SIZEALL }, + { Qt::ForbiddenCursor, IDC_NO }, + { Qt::WhatsThisCursor, IDC_HELP }, + { Qt::BusyCursor, IDC_APPSTARTING }, + { Qt::PointingHandCursor, IDC_HAND } + }; + const Qt::CursorShape cursorShape = c.shape(); switch (cursorShape) { case Qt::BitmapCursor: { @@ -342,17 +422,13 @@ HCURSOR QWindowsCursor::createSystemCursor(const QCursor &c) return createBitmapCursor(blank, blank); } case Qt::SplitVCursor: - return createPixmapCursorFromData(systemCursorSize(), standardCursorSize(), 32, vsplit_bits, vsplitm_bits); case Qt::SplitHCursor: - return createPixmapCursorFromData(systemCursorSize(), standardCursorSize(), 32, hsplit_bits, hsplitm_bits); case Qt::OpenHandCursor: - return createPixmapCursorFromData(systemCursorSize(), standardCursorSize(), 16, openhand_bits, openhandm_bits); case Qt::ClosedHandCursor: - return createPixmapCursorFromData(systemCursorSize(), standardCursorSize(), 16, closedhand_bits, closedhandm_bits); case Qt::DragCopyCursor: case Qt::DragMoveCursor: case Qt::DragLinkCursor: - return createPixmapCursor(QGuiApplicationPrivate::instance()->getPixmapCursor(cursorShape), c.hotSpot()); + return createSystemCursor(customCursor(cursorShape)); default: break; } diff --git a/src/plugins/platforms/windows/qwindowscursor.h b/src/plugins/platforms/windows/qwindowscursor.h index 81ae051824..bf2021cd9d 100644 --- a/src/plugins/platforms/windows/qwindowscursor.h +++ b/src/plugins/platforms/windows/qwindowscursor.h @@ -107,6 +107,7 @@ public: static HCURSOR createPixmapCursor(const QPixmap &pixmap, const QPoint &hotSpot); static HCURSOR createSystemCursor(const QCursor &c); + static QCursor customCursor(Qt::CursorShape cursorShape); static QPoint mousePosition(); static CursorState cursorState(); diff --git a/src/plugins/platforms/windows/windows.pri b/src/plugins/platforms/windows/windows.pri index fec9af2645..104d882fba 100644 --- a/src/plugins/platforms/windows/windows.pri +++ b/src/plugins/platforms/windows/windows.pri @@ -113,6 +113,10 @@ contains(QT_CONFIG,dynamicgl) { HEADERS += $$PWD/qwindowssessionmanager.h } +!wince*:!contains( DEFINES, QT_NO_IMAGEFORMAT_PNG ) { + RESOURCES += $$PWD/cursors.qrc +} + contains(QT_CONFIG, freetype) { DEFINES *= QT_NO_FONTCONFIG QT_FREETYPE_DIR = $$QT_SOURCE_TREE/src/3rdparty/freetype |