From 8f24dbaf0703cf792c263d7d26400892c527a712 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Wed, 24 Apr 2019 09:45:57 +0200 Subject: [PATCH 1/7] Android: Fix deleting of new lines when using backspace With some keyboards (ASOP, SwiftKey) it was not deleting any new lines when using backspace. So this ensures that it is correctly deleting at these points. Tested with the Samsung, Gboard and SwiftKey keyboards. Fixes: QTBUG-74824 Fixes: QTBUG-57798 Change-Id: Id2e4f96c18c3fec0e7f444b55dd3db2653625fd0 Done-with: Vova Mshanetskiy Reviewed-by: Paul Olav Tvete --- .../android/qandroidinputcontext.cpp | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/android/qandroidinputcontext.cpp b/src/plugins/platforms/android/qandroidinputcontext.cpp index c31e43e0bbf..00ab3409d3d 100644 --- a/src/plugins/platforms/android/qandroidinputcontext.cpp +++ b/src/plugins/platforms/android/qandroidinputcontext.cpp @@ -978,15 +978,25 @@ jboolean QAndroidInputContext::deleteSurroundingText(jint leftLength, jint right m_composingText.clear(); m_composingTextStart = -1; - QString text = query->value(Qt::ImSurroundingText).toString(); - if (text.isEmpty()) - return JNI_TRUE; - if (leftLength < 0) { rightLength += -leftLength; leftLength = 0; } + QVariant textBeforeCursor = query->value(Qt::ImTextBeforeCursor); + QVariant textAfterCursor = query->value(Qt::ImTextAfterCursor); + if (textBeforeCursor.isValid() && textAfterCursor.isValid()) { + leftLength = qMin(leftLength, textBeforeCursor.toString().length()); + rightLength = qMin(rightLength, textAfterCursor.toString().length()); + } else { + int cursorPos = query->value(Qt::ImCursorPosition).toInt(); + leftLength = qMin(leftLength, cursorPos); + rightLength = qMin(rightLength, query->value(Qt::ImSurroundingText).toString().length() - cursorPos); + } + + if (leftLength == 0 && rightLength == 0) + return JNI_TRUE; + QInputMethodEvent event; event.setCommitString(QString(), -leftLength, leftLength+rightLength); sendInputMethodEvent(&event); @@ -1075,6 +1085,14 @@ const QAndroidInputContext::ExtractedText &QAndroidInputContext::getExtractedTex int cpos = localPos + composeLength; //actual cursor pos relative to the current block int localOffset = 0; // start of extracted text relative to the current block + if (blockPos > 0) { + QString prevBlockEnding = query->value(Qt::ImTextBeforeCursor).toString(); + prevBlockEnding.chop(localPos); + if (prevBlockEnding.endsWith(QLatin1Char('\n'))) { + localOffset = -qMin(20, prevBlockEnding.length()); + blockText = prevBlockEnding.right(-localOffset) + blockText; + } + } // It is documented that we should try to return hintMaxChars // characters, but that's not what the standard Android controls do, and From ff447717a28392c3b1c103a8ec0d6e2fdcc9cee2 Mon Sep 17 00:00:00 2001 From: Massimo Callegari Date: Fri, 7 Dec 2018 17:53:00 +0100 Subject: [PATCH 2/7] configure: skip Freetype/Fontconfig autodetection only on MSVC In Windows there are package-based systems like MSYS2 that provide pkg-config for packages lookup. This change skips autodetection only for MSVC which doesn't provide the aforementioned feature. Task-number: QTBUG-57436 Change-Id: Iaed517e93031adbd2fd9dbf350764f76569b94ea Reviewed-by: Kai Koehne --- src/gui/configure.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/configure.json b/src/gui/configure.json index 5039934c26a..c51e3ceee30 100644 --- a/src/gui/configure.json +++ b/src/gui/configure.json @@ -1206,14 +1206,14 @@ "label": " Using system FreeType", "enable": "input.freetype == 'system'", "disable": "input.freetype == 'qt'", - "autoDetect": "!config.win32", + "autoDetect": "!config.msvc", "condition": "features.freetype && libs.freetype", "output": [ "privateFeature" ] }, "fontconfig": { "label": "Fontconfig", "autoDetect": "!config.darwin", - "condition": "!config.win32 && features.system-freetype && libs.fontconfig", + "condition": "!config.msvc && features.system-freetype && libs.fontconfig", "output": [ "privateFeature", "feature" ] }, "gbm": { From 835c3e94f6089751421a19008d442faec9649ed8 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 2 May 2019 12:53:42 +0200 Subject: [PATCH 3/7] Only call addFontToDatabase once per family,style We get a call to storeFont for each supported script-type of a font, but we use the font signature to register all the supported types at once, and can thus save ~3/4 calls to addFontToDatabase. Change-Id: I9d06252fb7f805e7babac58d82fa412ec4e0e36a Fixes: QTBUG-59360 Reviewed-by: Eskil Abrahamsen Blomfeldt --- .../windows/qwindowsfontdatabase.cpp | 15 ++++++++++++--- .../windows/qwindowsfontdatabase_ft.cpp | 15 ++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp index bd4338feb83..9e6e5d88c7a 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase.cpp @@ -1118,7 +1118,7 @@ static bool addFontToDatabase(QString familyName, } static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *textmetric, - DWORD type, LPARAM) + DWORD type, LPARAM lparam) { const ENUMLOGFONTEX *f = reinterpret_cast(logFont); const QString familyName = QString::fromWCharArray(f->elfLogFont.lfFaceName); @@ -1128,8 +1128,16 @@ static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *t // to the documentation is identical to a TEXTMETRIC except for the last four // members, which we don't use anyway const FONTSIGNATURE *signature = nullptr; - if (type & TRUETYPE_FONTTYPE) + if (type & TRUETYPE_FONTTYPE) { signature = &reinterpret_cast(textmetric)->ntmFontSig; + // We get a callback for each script-type supported, but we register them all + // at once using the signature, so we only need one call to addFontToDatabase(). + QSet> *foundFontAndStyles = reinterpret_cast> *>(lparam); + QPair fontAndStyle(familyName, styleName); + if (foundFontAndStyles->contains(fontAndStyle)) + return 1; + foundFontAndStyles->insert(fontAndStyle); + } addFontToDatabase(familyName, styleName, *logFont, textmetric, signature, type); // keep on enumerating @@ -1149,7 +1157,8 @@ void QWindowsFontDatabase::populateFamily(const QString &familyName) familyName.toWCharArray(lf.lfFaceName); lf.lfFaceName[familyName.size()] = 0; lf.lfPitchAndFamily = 0; - EnumFontFamiliesEx(dummy, &lf, storeFont, 0, 0); + QSet> foundFontAndStyles; + EnumFontFamiliesEx(dummy, &lf, storeFont, reinterpret_cast(&foundFontAndStyles), 0); ReleaseDC(0, dummy); } diff --git a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp index db2186644bb..fdef0f5ff1e 100644 --- a/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp +++ b/src/platformsupport/fontdatabases/windows/qwindowsfontdatabase_ft.cpp @@ -303,7 +303,7 @@ static bool addFontToDatabase(QString familyName, } static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *textmetric, - DWORD type, LPARAM) + DWORD type, LPARAM lparam) { const ENUMLOGFONTEX *f = reinterpret_cast(logFont); const QString faceName = QString::fromWCharArray(f->elfLogFont.lfFaceName); @@ -314,8 +314,16 @@ static int QT_WIN_CALLBACK storeFont(const LOGFONT *logFont, const TEXTMETRIC *t // to the documentation is identical to a TEXTMETRIC except for the last four // members, which we don't use anyway const FONTSIGNATURE *signature = nullptr; - if (type & TRUETYPE_FONTTYPE) + if (type & TRUETYPE_FONTTYPE) { signature = &reinterpret_cast(textmetric)->ntmFontSig; + // We get a callback for each script-type supported, but we register them all + // at once using the signature, so we only need one call to addFontToDatabase(). + QSet> *foundFontAndStyles = reinterpret_cast> *>(lparam); + QPair fontAndStyle(faceName, styleName); + if (foundFontAndStyles->contains(fontAndStyle)) + return 1; + foundFontAndStyles->insert(fontAndStyle); + } addFontToDatabase(faceName, styleName, fullName, *logFont, textmetric, signature, type); // keep on enumerating @@ -344,7 +352,8 @@ void QWindowsFontDatabaseFT::populateFamily(const QString &familyName) lf.lfFaceName[familyName.size()] = 0; lf.lfCharSet = DEFAULT_CHARSET; lf.lfPitchAndFamily = 0; - EnumFontFamiliesEx(dummy, &lf, storeFont, 0, 0); + QSet> foundFontAndStyles; + EnumFontFamiliesEx(dummy, &lf, storeFont, reinterpret_cast(&foundFontAndStyles), 0); ReleaseDC(0, dummy); } From 4d5fb551d6bcf32d74459ab378c231914c48ab10 Mon Sep 17 00:00:00 2001 From: Nick Shaforostov Date: Fri, 3 May 2019 12:30:49 +0200 Subject: [PATCH 4/7] fix compilation with various -no-feature-* options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ic1975db497613e3efe50be4246c167efe10d8e31 Reviewed-by: Morten Johan Sørvig --- src/gui/text/qfontsubset.cpp | 4 +++- src/gui/text/qtexthtmlparser.cpp | 4 ++-- .../themes/genericunix/dbusmenu/qdbusmenuconnection_p.h | 2 ++ src/plugins/platforms/cocoa/qcocoasystemtrayicon.h | 3 ++- src/widgets/itemviews/qabstractitemdelegate.cpp | 2 ++ src/widgets/widgets/qwidgetanimator.cpp | 6 +++++- src/widgets/widgets/qwidgetanimator_p.h | 2 ++ 7 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/gui/text/qfontsubset.cpp b/src/gui/text/qfontsubset.cpp index f5fc562e136..fb12b681a41 100644 --- a/src/gui/text/qfontsubset.cpp +++ b/src/gui/text/qfontsubset.cpp @@ -49,6 +49,8 @@ QT_BEGIN_NAMESPACE +#ifndef QT_NO_PDF + // This map is used for symbol fonts to get the correct glyph names for the latin range static const unsigned short symbol_map[0x100] = { 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, @@ -90,7 +92,7 @@ static const unsigned short symbol_map[0x100] = { // ---------------------------- PS/PDF helper methods ----------------------------------- -#ifndef QT_NO_PDF + QByteArray QFontSubset::glyphName(unsigned short unicode, bool symbol) { diff --git a/src/gui/text/qtexthtmlparser.cpp b/src/gui/text/qtexthtmlparser.cpp index c9a2a33e5aa..5169c0325a6 100644 --- a/src/gui/text/qtexthtmlparser.cpp +++ b/src/gui/text/qtexthtmlparser.cpp @@ -1720,6 +1720,8 @@ QStringList QTextHtmlStyleSelector::nodeNames(NodePtr node) const #endif // QT_NO_CSSPARSER +#ifndef QT_NO_CSSPARSER + static inline int findAttribute(const QStringList &attributes, const QString &name) { int idx = -1; @@ -1729,8 +1731,6 @@ static inline int findAttribute(const QStringList &attributes, const QString &na return idx; } -#ifndef QT_NO_CSSPARSER - QString QTextHtmlStyleSelector::attribute(NodePtr node, const QString &name) const { const QStringList &attributes = parser->at(node.id).attributes; diff --git a/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection_p.h b/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection_p.h index c7c3f4bc5bd..7959f0c28ac 100644 --- a/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection_p.h +++ b/src/platformsupport/themes/genericunix/dbusmenu/qdbusmenuconnection_p.h @@ -55,6 +55,8 @@ #include #include +#include + QT_BEGIN_NAMESPACE class QDBusServiceWatcher; diff --git a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.h b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.h index d831612c22c..6779bda4918 100644 --- a/src/plugins/platforms/cocoa/qcocoasystemtrayicon.h +++ b/src/plugins/platforms/cocoa/qcocoasystemtrayicon.h @@ -42,8 +42,9 @@ #define QCOCOASYSTEMTRAYICON_P_H #include +#include -#ifndef QT_NO_SYSTEMTRAYICON +#if QT_CONFIG(systemtrayicon) #include "QtCore/qstring.h" #include "QtGui/qpa/qplatformsystemtrayicon.h" diff --git a/src/widgets/itemviews/qabstractitemdelegate.cpp b/src/widgets/itemviews/qabstractitemdelegate.cpp index 9508aed3d3f..50668b3251c 100644 --- a/src/widgets/itemviews/qabstractitemdelegate.cpp +++ b/src/widgets/itemviews/qabstractitemdelegate.cpp @@ -386,6 +386,8 @@ bool QAbstractItemDelegate::helpEvent(QHelpEvent *event, const QModelIndex &index) { Q_D(QAbstractItemDelegate); + Q_UNUSED(d); + Q_UNUSED(index); Q_UNUSED(option); if (!event || !view) diff --git a/src/widgets/widgets/qwidgetanimator.cpp b/src/widgets/widgets/qwidgetanimator.cpp index b1e527e3b6a..486d65d92cb 100644 --- a/src/widgets/widgets/qwidgetanimator.cpp +++ b/src/widgets/widgets/qwidgetanimator.cpp @@ -50,8 +50,12 @@ QT_BEGIN_NAMESPACE -QWidgetAnimator::QWidgetAnimator(QMainWindowLayout *layout) : m_mainWindowLayout(layout) +QWidgetAnimator::QWidgetAnimator(QMainWindowLayout *layout) +#if QT_CONFIG(mainwindow) +: m_mainWindowLayout(layout) +#endif { + Q_UNUSED(layout) } void QWidgetAnimator::abort(QWidget *w) diff --git a/src/widgets/widgets/qwidgetanimator_p.h b/src/widgets/widgets/qwidgetanimator_p.h index 920cc3ffc87..9d08d035936 100644 --- a/src/widgets/widgets/qwidgetanimator_p.h +++ b/src/widgets/widgets/qwidgetanimator_p.h @@ -81,7 +81,9 @@ private Q_SLOTS: private: typedef QHash > AnimationMap; AnimationMap m_animation_map; +#if QT_CONFIG(mainwindow) QMainWindowLayout *m_mainWindowLayout; +#endif }; QT_END_NAMESPACE From 5d76529580b72ead582b6e09112b5b94c0b11113 Mon Sep 17 00:00:00 2001 From: Nick Shaforostov Date: Wed, 26 Sep 2018 17:16:10 +0200 Subject: [PATCH 5/7] fix crash when using ALDI usb-stick with broken filesystem I was using a cheap usb-stick from ALDI supermarket with fat32, and my application crashed because filesystem was empty. Unrealistic scenario, but still just returning here false is better than a crash Change-Id: I8979d5a4e19ce57770ab03983e847b272ebf7019 Reviewed-by: Thiago Macieira --- src/corelib/io/qdiriterator.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/corelib/io/qdiriterator.cpp b/src/corelib/io/qdiriterator.cpp index 648593b020b..ccde9745bff 100644 --- a/src/corelib/io/qdiriterator.cpp +++ b/src/corelib/io/qdiriterator.cpp @@ -320,7 +320,8 @@ void QDirIteratorPrivate::checkAndPushDirectory(const QFileInfo &fileInfo) bool QDirIteratorPrivate::matchesFilters(const QString &fileName, const QFileInfo &fi) const { - Q_ASSERT(!fileName.isEmpty()); + if (fileName.isEmpty()) + return false; // filter . and ..? const int fileNameSize = fileName.size(); From 6288c12bb4316c8970ab8437ef5beefce89f5836 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Mon, 29 Apr 2019 12:39:52 +0200 Subject: [PATCH 6/7] Resolve QMAKE_INCDIR_VULKAN on every qmake call Do not store this variable locally, because a) it might change if the SDK location changes b) does not play well with Qt installer packages which would provide the include path of the build machine. To achieve this we introduce the (usual) magic value - for QMAKE_EXPORT_INCDIR_VULKAN to denote "do not export this value". Fixes: QTBUG-73796 Change-Id: Ied26ee12cbcdf7f5f6e1caef5d29dadf6309c5d6 Reviewed-by: Laszlo Agocs Reviewed-by: Kai Koehne --- mkspecs/common/windows-vulkan.conf | 5 +---- mkspecs/features/qt_configure.prf | 6 ++++-- mkspecs/features/qt_module_pris.prf | 8 ++++++-- mkspecs/features/win32/windows_vulkan_sdk.prf | 8 ++++++++ 4 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 mkspecs/features/win32/windows_vulkan_sdk.prf diff --git a/mkspecs/common/windows-vulkan.conf b/mkspecs/common/windows-vulkan.conf index 5f930c7910e..da061422dca 100644 --- a/mkspecs/common/windows-vulkan.conf +++ b/mkspecs/common/windows-vulkan.conf @@ -1,5 +1,2 @@ -# Pick up the VULKAN_SDK env var set by the LunarG SDK so that the Vulkan -# headers are found out-of-the-box on typical Windows setups. - -QMAKE_INCDIR_VULKAN = $$(VULKAN_SDK)\\include +load(windows_vulkan_sdk) QMAKE_LIBS_VULKAN = diff --git a/mkspecs/features/qt_configure.prf b/mkspecs/features/qt_configure.prf index b2dd846b115..95e54d72c9b 100644 --- a/mkspecs/features/qt_configure.prf +++ b/mkspecs/features/qt_configure.prf @@ -959,8 +959,10 @@ defineTest(qtConfExportLibrary) { defines = $$eval($${spfx}.defines) !isEmpty(defines): qtConfOutputVar(assign, $$output, QMAKE_DEFINES_$$NAME, $$defines) includes = $$eval($${spfx}.exportincludedir) - isEmpty(includes): includes = $$eval($${spfx}.includedir) - !isEmpty(includes): qtConfOutputVar(assign, $$output, QMAKE_INCDIR_$$NAME, $$includes) + !equals(includes, -) { + isEmpty(includes): includes = $$eval($${spfx}.includedir) + !isEmpty(includes): qtConfOutputVar(assign, $$output, QMAKE_INCDIR_$$NAME, $$includes) + } uses = $$eval($${lpfx}.dependencies) !isEmpty(uses) { # FIXME: ideally, we would export transitive deps only for static diff --git a/mkspecs/features/qt_module_pris.prf b/mkspecs/features/qt_module_pris.prf index e0556ce9605..e892f834326 100644 --- a/mkspecs/features/qt_module_pris.prf +++ b/mkspecs/features/qt_module_pris.prf @@ -60,8 +60,12 @@ defineReplace(qtExportLibsForModule) { QMAKE_LIBS_$$NAME QMAKE_LIBS_$${NAME}_DEBUG QMAKE_LIBS_$${NAME}_RELEASE \ QMAKE_DEFINES_$$NAME QMAKE_INCDIR_$$NAME for (var, vars) { - defined($$var, var): \ - result += "$$var = $$val_escape($$var)" + expvar = $$var + expvar ~= s/^QMAKE_/QMAKE_EXPORT_/ + defined($$expvar, var):equals($$expvar, -): next() + !defined($$expvar, var): expvar = $$var + defined($$expvar, var): \ + result += "$$var = $$val_escape($$expvar)" } } return($$result) diff --git a/mkspecs/features/win32/windows_vulkan_sdk.prf b/mkspecs/features/win32/windows_vulkan_sdk.prf new file mode 100644 index 00000000000..6c08e28fe91 --- /dev/null +++ b/mkspecs/features/win32/windows_vulkan_sdk.prf @@ -0,0 +1,8 @@ +isEmpty(QMAKE_INCDIR_VULKAN) { + # Pick up the VULKAN_SDK env var set by the LunarG SDK so that the Vulkan + # headers are found out-of-the-box on typical Windows setups. + QMAKE_INCDIR_VULKAN = $$(VULKAN_SDK)\\include + + # Do not export the include dir but resolve it on every qmake call. + QMAKE_EXPORT_INCDIR_VULKAN = - +} From a50b29d65bddae44aedfd9372502f656656803d5 Mon Sep 17 00:00:00 2001 From: Mikhail Svetkin Date: Mon, 29 Apr 2019 15:45:14 +0200 Subject: [PATCH 7/7] Fix dnd regression c427ba53aa0ee1a71aa670783f65bcfd230da653 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Qt starts drag-and-drop on a mouse button press event. Cococa in this case won't send the matching release event, so we have to synthesize it here. Task-number: QTBUG-72417 Change-Id: I645b6a2733c1ea11ac4545cf3405f826af45fa47 Reviewed-by: Gatis Paeglis Reviewed-by: Tor Arne Vestbø --- .../platforms/cocoa/qnsview_dragging.mm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/plugins/platforms/cocoa/qnsview_dragging.mm b/src/plugins/platforms/cocoa/qnsview_dragging.mm index 002cb3279eb..37e972dba9e 100644 --- a/src/plugins/platforms/cocoa/qnsview_dragging.mm +++ b/src/plugins/platforms/cocoa/qnsview_dragging.mm @@ -293,7 +293,26 @@ static QPoint mapWindowCoordinates(QWindow *source, QWindow *target, QPoint poin QCocoaDrag* nativeDrag = QCocoaIntegration::instance()->drag(); nativeDrag->setAcceptedAction(qt_mac_mapNSDragOperation(operation)); + // Qt starts drag-and-drop on a mouse button press event. Cococa in + // this case won't send the matching release event, so we have to + // synthesize it here. m_buttons = currentlyPressedMouseButtons(); + const auto modifiers = [QNSView convertKeyModifiers:NSApp.currentEvent.modifierFlags]; + + NSPoint windowPoint = [self.window convertRectFromScreen:NSMakeRect(screenPoint.x, screenPoint.y, 1, 1)].origin; + NSPoint nsViewPoint = [self convertPoint: windowPoint fromView: nil]; + + QPoint qtWindowPoint(nsViewPoint.x, nsViewPoint.y); + QPoint qtScreenPoint = QCocoaScreen::mapFromNative(screenPoint).toPoint(); + + QWindowSystemInterface::handleMouseEvent( + target, + mapWindowCoordinates(m_platformWindow->window(), target, qtWindowPoint), + qtScreenPoint, + m_buttons, + Qt::NoButton, + QEvent::MouseButtonRelease, + modifiers); qCDebug(lcQpaMouse) << "Drag session" << session << "ended, with" << m_buttons; }