diff options
Diffstat (limited to 'src')
42 files changed, 320 insertions, 1126 deletions
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java index bfdbaed43f..e0878f078f 100644 --- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java +++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java @@ -276,6 +276,9 @@ public class QtActivityDelegate if (m_softInputMode != 0) { m_activity.getWindow().setSoftInputMode(m_softInputMode); + final boolean softInputIsHidden = (m_softInputMode & WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) != 0; + if (softInputIsHidden) + return; } else { if (height > visibleHeight) m_activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); diff --git a/src/concurrent/qtconcurrentfunctionwrappers.h b/src/concurrent/qtconcurrentfunctionwrappers.h index a08be69123..111933410b 100644 --- a/src/concurrent/qtconcurrentfunctionwrappers.h +++ b/src/concurrent/qtconcurrentfunctionwrappers.h @@ -192,6 +192,32 @@ QtConcurrent::ConstMemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func return QtConcurrent::ConstMemberFunctionWrapper<T, C>(func); } +#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510 +template <typename T, typename U> +QtConcurrent::FunctionWrapper1<T, U> createFunctionWrapper(T (*func)(U) noexcept) +{ + return QtConcurrent::FunctionWrapper1<T, U>(func); +} + +template <typename T, typename C> +QtConcurrent::MemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func)() noexcept) +{ + return QtConcurrent::MemberFunctionWrapper<T, C>(func); +} + +template <typename T, typename C, typename U> +QtConcurrent::MemberFunctionWrapper1<T, C, U> createFunctionWrapper(T (C::*func)(U) noexcept) +{ + return QtConcurrent::MemberFunctionWrapper1<T, C, U>(func); +} + +template <typename T, typename C> +QtConcurrent::ConstMemberFunctionWrapper<T, C> createFunctionWrapper(T (C::*func)() const noexcept) +{ + return QtConcurrent::ConstMemberFunctionWrapper<T, C>(func); +} +#endif + struct PushBackWrapper { typedef void result_type; @@ -231,6 +257,20 @@ struct ReduceResultType<T(C::*)(U)> typedef C ResultType; }; +#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510 +template <class U, class V> +struct ReduceResultType<void(*)(U&,V) noexcept> +{ + typedef U ResultType; +}; + +template <class T, class C, class U> +struct ReduceResultType<T(C::*)(U) noexcept> +{ + typedef C ResultType; +}; +#endif + template <class InputSequence, class MapFunctor> struct MapResultType { @@ -249,6 +289,20 @@ struct MapResultType<void, T(C::*)() const> typedef T ResultType; }; +#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510 +template <class U, class V> +struct MapResultType<void, U (*)(V) noexcept> +{ + typedef U ResultType; +}; + +template <class T, class C> +struct MapResultType<void, T(C::*)() const noexcept> +{ + typedef T ResultType; +}; +#endif + #ifndef QT_NO_TEMPLATE_TEMPLATE_PARAMETERS template <template <typename> class InputSequence, typename MapFunctor, typename T> @@ -269,6 +323,21 @@ struct MapResultType<InputSequence<T>, U(C::*)() const> typedef InputSequence<U> ResultType; }; +#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510 + +template <template <typename> class InputSequence, class T, class U, class V> +struct MapResultType<InputSequence<T>, U (*)(V) noexcept> +{ + typedef InputSequence<U> ResultType; +}; + +template <template <typename> class InputSequence, class T, class U, class C> +struct MapResultType<InputSequence<T>, U(C::*)() const noexcept> +{ + typedef InputSequence<U> ResultType; +}; +#endif + #endif // QT_NO_TEMPLATE_TEMPLATE_PARAMETER template <class MapFunctor> @@ -289,6 +358,21 @@ struct MapResultType<QStringList, U(C::*)() const> typedef QList<U> ResultType; }; +#if defined(__cpp_noexcept_function_type) && __cpp_noexcept_function_type >= 201510 + +template <class U, class V> +struct MapResultType<QStringList, U (*)(V) noexcept> +{ + typedef QList<U> ResultType; +}; + +template <class U, class C> +struct MapResultType<QStringList, U(C::*)() const noexcept> +{ + typedef QList<U> ResultType; +}; +#endif + } // namespace QtPrivate. #endif //Q_QDOC diff --git a/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp b/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp index 1c7f9d4b54..4bdaa4d657 100644 --- a/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_tools_qrect.cpp @@ -55,6 +55,6 @@ QRect r2(QPoint(100, 200), QSize(11, 16)); //! [1] -QRectF r1(100, 200, 11, 16); -QRectF r2(QPoint(100, 200), QSize(11, 16)); +QRectF r1(100.0, 200.1, 11.2, 16.3); +QRectF r2(QPointF(100.0, 200.1), QSizeF(11.2, 16.3)); //! [1] diff --git a/src/corelib/global/qfeatures.txt b/src/corelib/global/qfeatures.txt deleted file mode 100644 index 458f87ec16..0000000000 --- a/src/corelib/global/qfeatures.txt +++ /dev/null @@ -1,956 +0,0 @@ -# Generic entry format -#Feature: UPPERCASENAME (for the #define) -#Description: One sentence description of what this does. -#Section: Categorization -#Requires: UPPERCASENAME... -#Name: CamelCaseName (often a class name) -#SeeAlso: UPPERCASENAME... (currently unused) - -# Kernel - -Feature: PROPERTIES -Description: Supports scripting Qt-based applications. -Section: Kernel -Requires: -Name: Properties - -Feature: TEXTHTMLPARSER -Description: Parser for HTML -Section: Kernel -Requires: -Name: HtmlParser - -Feature: TEXTODFWRITER -Description: Provides an ODF writer -Section: Kernel -Requires: XMLSTREAMWRITER -Name: OdfWriter - -Feature: CSSPARSER -Description: Parser for Style Sheets -Section: Kernel -Requires: -Name: CssParser - -Feature: REGULAREXPRESSION -Description: Perl-compatible regular expression APIs -Section: Kernel -Requires: -Name: QRegularExpression - -Feature: CONCURRENT -Description: Provides a high-level multi-threaded APIs -Section: Kernel -Requires: -Name: QtConcurrent - -Feature: DRAGANDDROP -Description: Supports the drag and drop mechansim. -Section: Kernel -Requires: IMAGEFORMAT_XPM -Name: Drag and drop - -Feature: SESSIONMANAGER -Description: Supports session management. -Section: Kernel -Requires: -Name: Session Manager - -Feature: SHORTCUT -Description: Supports keyboard accelerators and shortcuts. -Section: Kernel -Requires: -Name: QShortcut - -Feature: ACTION -Description: Supports widget actions. -Section: Kernel -Requires: -Name: QAction - -Feature: CURSOR -Description: Supports mouse cursors. -Section: Kernel -Requires: -Name: QCursor - -Feature: CLIPBOARD -Description: Supports cut and paste operations. -Section: Kernel -Requires: -Name: QClipboard - -Feature: WHEELEVENT -Description: Supports wheel events. -Section: Kernel -Requires: -Name: QWheelEvent - -Feature: TABLETEVENT -Description: Supports tablet events. -Section: Kernel -Requires: -Name: QTabletEvent - -Feature: EFFECTS -Description: Supports special widget effects (e.g. fading and scrolling). -Section: Kernel -Requires: -Name: Effects - -Feature: SHAREDMEMORY -Description: Provides access to a shared memory segment. -Section: Kernel -Requires: -Name: QSharedMemory - -Feature: SYSTEMSEMAPHORE -Description: Provides a general counting system semaphore. -Section: Kernel -Requires: SHAREDMEMORY -Name: QSystemSemaphore - -Feature: XMLSTREAM -Description: Provides a simple streaming API for XML. -Section: Kernel -Requires: -Name: XML Streaming APIs - -Feature: XMLSTREAMREADER -Description: Provides a well-formed XML parser with a simple streaming API. -Section: Kernel -Requires: XMLSTREAM -Name: QXmlStreamReader - -Feature: XMLSTREAMWRITER -Description: Provides a XML writer with a simple streaming API. -Section: Kernel -Requires: XMLSTREAM -Name: QXmlStreamWriter - -Feature: IM -Description: Inputmethods with QInputContext -Section: Kernel -Requires: LIBRARY -Name: QInputContext - -# Data structures - -Feature: TEXTDATE -Description: Supports month and day names in dates. -Section: Data structures -Requires: -Name: Text Date - -Feature: DATESTRING -Description: Supports convertion between dates and strings. -Section: Data structures -Requires: TEXTDATE -Name: QDate/QTime/QDateTime - -# File I/O - -Feature: PROCESS -Description: Supports external process invocation. -Section: File I/O -Requires: -Name: QProcess - -Feature: TEMPORARYFILE -Description: Provides an I/O device that operates on temporary files. -Section: File I/O -Requires: -Name: QTemporaryFile - -Feature: LIBRARY -Description: Supports a shared library wrapper. -Section: File I/O -Requires: -Name: QLibrary - -Feature: SETTINGS -Description: Supports persistent application settings. -Section: File I/O -Requires: -Name: QSettings - -Feature: DOM -Description: Supports the Document Object Model. -Section: File I/O -Requires: -Name: Document Object Model - -Feature: FILESYSTEMMODEL -Description: Provides a data model for the local filesystem. -Section: File I/O -Requires: -Name: QFileSystemModel - -Feature: FILESYSTEMWATCHER -Description: Provides an interface for monitoring files and directories for modications. -Section: File I/O -Requires: -Name: QFileSystemWatcher - -Feature: FILESYSTEMITERATOR -Description: Provides fast file-system iteration. -Section: File I/O -Requires: -Name: QFileSystemIterator - -# Widgets - -Feature: TREEWIDGET -Description: Supports views using tree models. -Section: Widgets -Requires: TREEVIEW -Name: QTreeWidget - -Feature: LISTWIDGET -Description: Supports item-based list widgets. -Section: Widgets -Requires: LISTVIEW -Name: QListWidget - -Feature: TABLEWIDGET -Description: Supports item-based table views. -Section: Widgets -Requires: TABLEVIEW -Name: QTableWidget - -Feature: DATETIMEEDIT -Description: Supports editing dates and times. -Section: Widgets -Requires: CALENDARWIDGET DATESTRING -Name: QDateTimeEdit - -Feature: STACKEDWIDGET -Description: Supports stacked widgets. -Section: Widgets -Requires: -Name: QStackedWidget - -Feature: TEXTBROWSER -Description: Supports HTML document browsing. -Section: Widgets -Requires: TEXTEDIT -Name: QTextBrowser - -Feature: SPLASHSCREEN -Description: Supports splash screens that can be shown during application startup. -Section: Widgets -Requires: -Name: Splash screen widget - -Feature: SPLITTER -Description: Supports user controlled splitter widgets. -Section: Widgets -Requires: RUBBERBAND -Name: QSplitter - -Feature: LCDNUMBER -Description: Supports LCD-like digits. -Section: Widgets -Requires: -Name: QLCDNumber - -Feature: MENU -Description: Supports popup-menus. -Section: Widgets -Requires: ACTION -Name: QMenu - -Feature: LINEEDIT -Description: Supports single-line edits. -Section: Widgets -Requires: -Name: QLineEdit - -Feature: SPINBOX -Description: Supports spin boxes handling integers and discrete sets of values. -Section: Widgets -Requires: SPINWIDGET LINEEDIT VALIDATOR -Name: QSpinBox - -Feature: TABBAR -Description: Supports tab bars, e.g. for use in tabbed dialogs. -Section: Widgets -Requires: TOOLBUTTON -Name: QTabBar - -Feature: TABWIDGET -Description: Supports stacking tabbed widgets. -Section: Widgets -Requires: TABBAR STACKEDWIDGET -Name: QTabWidget - -Feature: COMBOBOX -Description: Supports comboboxes presenting a list of options to the user. -Section: Widgets -Requires: LINEEDIT STANDARDITEMMODEL LISTVIEW -Name: QComboBox - -Feature: FONTCOMBOBOX -Description: Supports a combobox that lets the user select a font family. -Section: Widgets -Requires: COMBOBOX STRINGLISTMODEL -Name: QFontComboBox - -Feature: TOOLBUTTON -Description: Supports quick-access buttons to commands and options. -Section: Widgets -Requires: ACTION -Name: QToolButton - -Feature: TOOLBAR -Description: Supports movable panels containing a set of controls. -Section: Widgets -Requires: MAINWINDOW -Name: QToolBar - -Feature: TOOLBOX -Description: Supports columns of tabbed widget items. -Section: Widgets -Requires: TOOLBUTTON SCROLLAREA -Name: QToolBox - -Feature: GROUPBOX -Description: Supports group box frames. -Section: Widgets -Requires: -Name: QGroupBox - -Feature: BUTTONGROUP -Description: Supports organizing groups of button widgets. -Section: Widgets -Requires: GROUPBOX -Name: QButtonGroup - -Feature: MAINWINDOW -Description: Supports main application windows. -Section: Widgets -Requires: MENU RESIZEHANDLER TOOLBUTTON -Name: QMainWindow - -Feature: DOCKWIDGET -Description: Supports docking widgets inside a QMainWindow or floated as a top-level window on the desktop. -Section: Widgets -Requires: RUBBERBAND MAINWINDOW -Name: QDockwidget - -Feature: MDIAREA -Description: Provides an area in which MDI windows are displayed. -Section: Widgets -Requires: SCROLLAREA -Name: QMdiArea - -Feature: RESIZEHANDLER -Description: Supports an internal resize handler. -Section: Widgets -Requires: -Name: Resize Handler - -Feature: STATUSBAR -Description: Supports presentation of status information. -Section: Widgets -Requires: -Name: QStatusBar - -Feature: MENUBAR -Description: Supports pull-down menu items. -Section: Widgets -Requires: MENU TOOLBUTTON -Name: QMenuBar - -Feature: CONTEXTMENU -Description: Supports pop-up menus on right mouse click -Section: Widgets -Requires: MENU -Name: Context menu - -Feature: PROGRESSBAR -Description: Supports presentation of operation progress. -Section: Widgets -Requires: -Name: QProgressBar - -Feature: SLIDER -Description: Supports sliders controlling a bounded value. -Section: Widgets -Requires: -Name: QSlider - -Feature: SCROLLBAR -Description: Supports scrollbars allowing the user access parts of a document that is larger than the widget used to display it. -Section: Widgets -Requires: SLIDER -Name: QScrollBar - -Feature: DIAL -Description: Supports rounded range control, e.g. like a speedometer. -Section: Widgets -Requires: SLIDER -Name: QDial - -Feature: SCROLLAREA -Description: Supports scrolling views onto widgets. -Section: Widgets -Requires: SCROLLBAR -Name: QScrollArea - -Feature: GRAPHICSVIEW -Description: Supports the graphicsview classes. -Section: Widgets -Requires: SCROLLAREA -Name: QGraphicsView - -Feature: GRAPHICSEFFECT -Description: Supports the graphicseffect classes. -Section: Widgets -Requires: GRAPHICSVIEW -Name: QGraphicsEffect - -Feature: SPINWIDGET -Description: Supports spinbox control widgets. -Section: Widgets -Requires: -Name: Spin Widget - -Feature: TEXTEDIT -Description: Supports rich text editing. -Section: Widgets -Requires: SCROLLAREA PROPERTIES -Name: QTextEdit - -Feature: SYNTAXHIGHLIGHTER -Description: Supports custom syntax highlighting. -Section: Widgets -Requires: TEXTEDIT -Name: QSyntaxHighlighter - -Feature: RUBBERBAND -Description: Supports using rubberbands to indicate selections and boundaries. -Section: Widgets -Requires: -Name: QRubberBand - -Feature: TOOLTIP -Description: Supports presentation of tooltips. -Section: Widgets -Requires: -Name: QToolTip - -Feature: STATUSTIP -Description: Supports status tip functionality and events. -Section: Widgets -Requires: -Name: Status Tip - -Feature: WHATSTHIS -Description: Supports displaying "What's this" help. -Section: Widgets -Requires: TOOLBUTTON -Name: QWhatsThis - -Feature: VALIDATOR -Description: Supports validation of input text. -Section: Widgets -Requires: -Name: QValidator - -Feature: SIZEGRIP -Description: Supports corner-grips for resizing a top-level windows. -Section: Widgets -Requires: -Name: QSizeGrip - -Feature: CALENDARWIDGET -Description: Provides a monthly based calendar widget allowing the user to select a date. -Section: Widgets -Requires: TABLEVIEW MENU TEXTDATE SPINBOX TOOLBUTTON -Name: QCalendarWidget - -Feature: PRINTPREVIEWWIDGET -Description: Provides a widget for previewing page layouts for printer output. -Section: Widgets -Requires: GRAPHICSVIEW PRINTER MAINWINDOW -Name: QPrintPreviewWidget - -Feature: KEYSEQUENCEEDIT -Description: Provides a widget for editing QKeySequences -Section: Widgets -Requires: LINEEDIT SHORTCUT -Name: QKeySequenceEdit - -# Dialogs - -Feature: MESSAGEBOX -Description: Supports message boxes displaying -informative messages and simple questions. -Section: Dialogs -Requires: -Name: QMessageBox - -Feature: COLORDIALOG -Description: Supports a dialog widget for specifying colors. -Section: Dialogs -Requires: SPINBOX -Name: QColorDialog - -Feature: FILEDIALOG -Description: Supports a dialog widget for selecting files or directories. -Section: Dialogs -Requires: FILESYSTEMMODEL TREEVIEW COMBOBOX TOOLBUTTON BUTTONGROUP TOOLTIP SPLITTER STACKEDWIDGET PROXYMODEL -Name: QFileDialog - -Feature: FONTDIALOG -Description: Supports a dialog widget for selecting fonts. -Section: Dialogs -Requires: STRINGLISTMODEL COMBOBOX VALIDATOR GROUPBOX -Name: QFontDialog - -Feature: PRINTDIALOG -Description: Supports a dialog widget for specifying printer configuration. -Section: Dialogs -Requires: PRINTER COMBOBOX BUTTONGROUP SPINBOX TABWIDGET -Name: QPrintDialog - -Feature: PRINTPREVIEWDIALOG -Description: Provides a dialog for previewing and configuring page layouts for printer output. -Section: Dialogs -Requires: PRINTPREVIEWWIDGET PRINTDIALOG TOOLBAR -Name: QPrintPreviewDialog - -Feature: PROGRESSDIALOG -Description: Supports feedback on the progress of a slow operation. -Section: Dialogs -Requires: PROGRESSBAR -Name: QProgressDialog - -Feature: INPUTDIALOG -Description: Supports a simple convenience dialog to get a single value from the user. -Section: Dialogs -Requires: COMBOBOX SPINBOX STACKEDWIDGET -Name: QInputDialog - -Feature: ERRORMESSAGE -Description: Supports an error message display dialog. -Section: Dialogs -Requires: TEXTEDIT -Name: QErrorMessage - -Feature: WIZARD -Description: Provides a framework for wizards. -Section: Dialogs -Requires: PROPERTIES -Name: QWizard - -# ItemViews - -Feature: ITEMVIEWS -Description: Supports the model/view architecture managing the relationship between data and the way it is presented to the user. -Section: ItemViews -Requires: RUBBERBAND SCROLLAREA -Name: The Model/View Framework - -Feature: DIRMODEL -Description: Supports a data model for the local filesystem. -Section: ItemViews -Requires: ITEMVIEWS FILESYSTEMMODEL -Name: QDirModel - -Feature: STANDARDITEMMODEL -Description: Supports a generic model for storing custom data. -Section: ItemViews -Requires: ITEMVIEWS -Name: QStandardItemModel - -Feature: PROXYMODEL -Description: Supports processing of data passed between another model and a view. -Section: ItemViews -Requires: ITEMVIEWS -Name: QAbstractProxyModel - -Feature: SORTFILTERPROXYMODEL -Description: Supports sorting and filtering of data passed between another model and a view. -Section: ItemViews -Requires: PROXYMODEL -Name: QSortFilterProxyModel - -Feature: IDENTITYPROXYMODEL -Description: Supports proxying a source model unmodified. -Section: ItemViews -Requires: PROXYMODEL -Name: QIdentityProxyModel - -Feature: STRINGLISTMODEL -Description: Supports a model that supplies strings to views. -Section: ItemViews -Requires: ITEMVIEWS -Name: QStringListModel - -Feature: LISTVIEW -Description: Supports a list or icon view onto a model. -Section: ItemViews -Requires: ITEMVIEWS -Name: QListView - -Feature: TABLEVIEW -Description: Supports a default model/view implementation of a table view. -Section: ItemViews -Requires: ITEMVIEWS -Name: QTableView - -Feature: TREEVIEW -Description: Supports a default model/view implementation of a tree view. -Section: ItemViews -Requires: ITEMVIEWS -Name: QTreeView - -Feature: DATAWIDGETMAPPER -Description: Provides mapping between a section of a data model to widgets. -Section: ItemViews -Requires: ITEMVIEWS PROPERTIES -Name: QDataWidgetMapper - -Feature: COLUMNVIEW -Description: Provides a model/view implementation of a column view. -Section: ItemViews -Requires: LISTVIEW -Name: QColumnView - -# Styles - -Feature: STYLE_WINDOWS -Description: Supports a Microsoft Windows-like look and feel. -Section: Styles -Requires: -Name: QWindowsStyle - -Feature: STYLE_FUSION -Description: Supports a modern platform independent widget style. -Section: Styles -Requires: IMAGEFORMAT_XPM -Name: QFusionStyle - -Feature: STYLE_WINDOWSXP -Description: Supports a Microsoft WindowsXP-like look and feel. -Section: Styles -Requires: STYLE_WINDOWS -Name: QWindowsXPStyle - -Feature: STYLE_WINDOWSVISTA -Description: Supports a Microsoft WindowsVista-like look and feel. -Section: Styles -Requires: STYLE_WINDOWSXP -Name: QWindowsVistaStyle - -Feature: STYLE_WINDOWSCE -Description: WindowsCE look and feel -Section: Styles -Requires: STYLE_WINDOWS IMAGEFORMAT_XPM -Name: QWindowsCEStyle - -Feature: STYLE_WINDOWSMOBILE -Description: WindowsMobile look and feel -Section: Styles -Requires: STYLE_WINDOWS IMAGEFORMAT_XPM -Name: QWindowsMobileStyle - -Feature: STYLE_STYLESHEET -Description: -Section: Styles -Requires: STYLE_WINDOWS PROPERTIES CSSPARSER -Name: QStyleSheetStyle - -# Images - -Feature: IMAGEFORMATPLUGIN -Description: Supports writing an image format plugin. -Section: Images -Requires: LIBRARY -Name: QImageIOPlugin - -Feature: MOVIE -Description: Supports animated images. -Section: Images -Requires: -Name: QMovie - -Feature: IMAGEFORMAT_BMP -Description: Supports Microsoft's Bitmap image file format. -Section: Images -Requires: -Name: BMP Image Format - -Feature: IMAGEFORMAT_PPM -Description: Supports the Portable Pixmap image file format. -Section: Images -Requires: -Name: PPM Image Format - -Feature: IMAGEFORMAT_XBM -Description: Supports the X11 Bitmap image file format. -Section: Images -Requires: -Name: XBM Image Format - -Feature: IMAGEFORMAT_XPM -Description: Supports the X11 Pixmap image file format. -Section: Images -Requires: -Name: XPM Image Format - -Feature: IMAGEFORMAT_PNG -Description: Supports the Portable Network Graphics image file format. -Section: Images -Requires: -Name: PNG Image Format - -Feature: IMAGEFORMAT_JPEG -Description: Supports the Joint Photographic Experts Group image file format. -Section: Images -Requires: -Name: JPEG Image Format - -Feature: IMAGE_HEURISTIC_MASK -Description: Supports creating a 1-bpp heuristic mask for images. -Section: Images -Requires: -Name: QImage::createHeuristicMask() - -Feature: IMAGE_TEXT -Description: Supports image file text strings. -Section: Images -Requires: -Name: Image Text - -# Painting - -Feature: PICTURE -Description: Supports recording and replaying QPainter commands. -Section: Painting -Requires: -Name: QPicture - -Feature: COLORNAMES -Description: Supports color names such as "red", used by QColor and by some HTML documents. -Section: Painting -Requires: -Name: Color Names - -Feature: PDF -Description: Supports pdf format -Section: Painting -Requires: TEMPORARYFILE -Name: QPdf - -Feature: PRINTER -Description: Supports printing -Section: Painting -Requires: PICTURE TEMPORARYFILE PDF -Name: QPrinter - -Feature: CUPS -Description Supports the Common UNIX Printing System -Section: Painting -Requires: PRINTER LIBRARY -Name: Common UNIX Printing System - -Feature: PAINT_DEBUG -Description: Debug painting with the environment variables QT_FLUSH_UPDATE and QT_FLUSH_PAINT -Section: Painting -Requires: -Name: Painting Debug Utilities - -# Fonts - -Feature: FREETYPE -Description: Supports the FreeType 2 font engine (and its supported font formats). -Section: Fonts -Requires: -Name: Freetype Font Engine - -# Internationalization - -Feature: TRANSLATION -Description: Supports translations using QObject::tr(). -Section: Internationalization -Requires: -Name: Translation - -Feature: TEXTCODEC -Description: Supports conversions between text encodings. -Section: Internationalization -Requires: -Name: QTextCodec - -Feature: CODECS -Description: Supports non-unicode text conversions. -Section: Internationalization -Requires: TEXTCODEC -Name: Codecs - -Feature: BIG_CODECS -Description: Supports big codecs, e.g. CJK. -Section: Internationalization -Requires: TEXTCODEC -Name: Big Codecs - -Feature: ICONV -Description: Supports conversions between text encodings using iconv. -Section: Internationalization -Requires: TEXTCODEC -Name: iconv - -# Networking - -Feature: FTP -Description: Supports FTP file access. -Section: Networking -Requires: TEXTDATE -Name: File Transfer Protocol - -Feature: HTTP -Description: Supports HTTP file access. -Section: Networking -Requires: -Name: Hyper Text Transfer Protocol - -Feature: UDPSOCKET -Description: Supports User Datagram Protocol sockets. -Section: Networking -Requires: -Name: QUdpSocket - -Feature: NETWORKPROXY -Description: Supports configuring network layer proxy support to the Qt network classes. -Section: Networking -Requires: -Name: QNetworkProxy - -Feature: SOCKS5 -Description: Supports SOCKS v5 network proxy. -Section: Networking -Requires: NETWORKPROXY -Name: SOCKS5 - -Feature: NETWORKINTERFACE -Description: Supports listing the host's IP addresses and network interfaces -Section: Networking -Requires: -Name: QNetworkInterface - -Feature: NETWORKDISKCACHE -Description: Supports a disk cache for network resources -Section: Networking -Requires: TEMPORARYFILE -Name: QNetworkDiskCache - -Feature: BEARERMANAGEMENT -Description: Provides bearer management support -Section: Networking -Requires: LIBRARY NETWORKINTERFACE PROPERTIES -Name: Bearer Management - -Feature: LOCALSERVER -Description: Supports a local socket based server -Section: Networking -Requires: TEMPORARYFILE -Name: QLocalServer - -# Utilities - -Feature: COMPLETER -Description: Provides completions based on an item model. -Section: Utilities -Requires: PROXYMODEL -Name: QCompleter - -Feature: FSCOMPLETER -Description: Provides completions based on an item model. -Section: Utilities -Requires: FILESYSTEMMODEL COMPLETER -Name: QCompleter - -Feature: DESKTOPSERVICES -Description: Provides methods for accessing common desktop services. -Section: Utilities -Requires: -Name: QDesktopServices - -Feature: MIMETYPE -Description: Describes types of file or data, represented by a MIME type string. -Section: Utilities -Requires: -Name: QMimeType - -Feature: SYSTEMTRAYICON -Description: Provides an icon for an application in the system tray. -Section: Utilities -Requires: -Name: QSystemTrayIcon - -Feature: UNDOCOMMAND -Description: Applies (redo or) undo of a single change in a document. -Section: Utilities -Requires: -Name: QUndoCommand - -Feature: UNDOSTACK -Description: Provides the ability to (redo or) undo a list of changes in a document. -Section: Utilities -Requires: UNDOCOMMAND -Name: QUndoStack - -Feature: UNDOGROUP -Description: -Section: Utilities -Requires: UNDOSTACK -Name: QUndoGroup - -Feature: UNDOVIEW -Description: A widget which shows the contents of an undo stack. -Section: Utilities -Requires: UNDOSTACK LISTVIEW -Name: QUndoView - -Feature: ACCESSIBILITY -Description: Provides accessibility support. -Section: Utilities -Requires: PROPERTIES MENUBAR -Name: Accessibility - -Feature: ANIMATION -Description: Provides a framework for animations. -Section: Utilities -Requires: PROPERTIES -Name: Animation - -Feature: STATEMACHINE -Description: Provides hierarchical finite state machines. -Section: Utilities -Requires: PROPERTIES -Name: State machine - -Feature: GESTURES -Description: Provides a framework for gestures. -Section: Utilities -Requires: -Name: Gesture - -# D-Bus - -Feature: DBUS -Description: Provides classes for D-Bus. -Section: D-Bus -Requires: PROPERTIES XMLSTREAMREADER -Name: Qt D-Bus module - -# XML Patterns - -Feature: XMLSCHEMA -Description: Provides XML schema validation. -Section: Xml Patterns -Requires: -Name: XML Schema APIs diff --git a/src/corelib/io/qfilesystemengine_unix.cpp b/src/corelib/io/qfilesystemengine_unix.cpp index 40eadfb3e6..3cb412e47c 100644 --- a/src/corelib/io/qfilesystemengine_unix.cpp +++ b/src/corelib/io/qfilesystemengine_unix.cpp @@ -553,45 +553,75 @@ bool QFileSystemEngine::fillMetaData(const QFileSystemEntry &entry, QFileSystemM return data.hasFlags(what); } +// Note: if \a shouldMkdirFirst is false, we assume the caller did try to mkdir +// before calling this function. +static bool createDirectoryWithParents(const QByteArray &nativeName, bool shouldMkdirFirst = true) +{ + // helper function to check if a given path is a directory, since mkdir can + // fail if the dir already exists (it may have been created by another + // thread or another process) + const auto isDir = [](const QByteArray &nativeName) { + QT_STATBUF st; + return QT_STAT(nativeName.constData(), &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR; + }; + + if (shouldMkdirFirst && QT_MKDIR(nativeName, 0777) == 0) + return true; + if (errno == EEXIST) + return isDir(nativeName); + if (errno != ENOENT) + return false; + + // mkdir failed because the parent dir doesn't exist, so try to create it + int slash = nativeName.lastIndexOf('/'); + if (slash < 1) + return false; + + QByteArray parentNativeName = nativeName.left(slash); + if (!createDirectoryWithParents(parentNativeName)) + return false; + + // try again + if (QT_MKDIR(nativeName, 0777) == 0) + return true; + return errno == EEXIST && isDir(nativeName); +} + //static bool QFileSystemEngine::createDirectory(const QFileSystemEntry &entry, bool createParents) { QString dirName = entry.filePath(); - if (createParents) { - dirName = QDir::cleanPath(dirName); - for (int oldslash = -1, slash=0; slash != -1; oldslash = slash) { - slash = dirName.indexOf(QDir::separator(), oldslash+1); - if (slash == -1) { - if (oldslash == dirName.length()) - break; - slash = dirName.length(); - } - if (slash) { - const QByteArray chunk = QFile::encodeName(dirName.left(slash)); - if (QT_MKDIR(chunk.constData(), 0777) != 0) { - if (errno == EEXIST -#if defined(Q_OS_QNX) - // On QNX the QNet (VFS paths of other hosts mounted under a directory - // such as /net) mountpoint returns ENOENT, despite existing. stat() - // on the QNet mountpoint returns successfully and reports S_IFDIR. - || errno == ENOENT -#endif - ) { - QT_STATBUF st; - if (QT_STAT(chunk.constData(), &st) == 0 && (st.st_mode & S_IFMT) == S_IFDIR) - continue; - } - return false; - } - } - } + + // Darwin doesn't support trailing /'s, so remove for everyone + while (dirName.size() > 1 && dirName.endsWith(QLatin1Char('/'))) + dirName.chop(1); + + // try to mkdir this directory + QByteArray nativeName = QFile::encodeName(dirName); + if (QT_MKDIR(nativeName, 0777) == 0) return true; + if (!createParents) + return false; + + // we need the cleaned path in order to create the parents + // and we save errno just in case encodeName needs to load codecs + int savedErrno = errno; + bool pathChanged; + { + QString cleanName = QDir::cleanPath(dirName); + + // Check if the cleaned name is the same or not. If we were given a + // path with resolvable "../" sections, cleanPath will remove them, but + // this may change the target dir if one of those segments was a + // symlink. This operation depends on cleanPath's optimization of + // returning the original string if it didn't modify anything. + pathChanged = !dirName.isSharedWith(cleanName); + if (pathChanged) + nativeName = QFile::encodeName(cleanName); } -#if defined(Q_OS_DARWIN) // Mac X doesn't support trailing /'s - if (dirName.endsWith(QLatin1Char('/'))) - dirName.chop(1); -#endif - return (QT_MKDIR(QFile::encodeName(dirName).constData(), 0777) == 0); + + errno = savedErrno; + return createDirectoryWithParents(nativeName, pathChanged); } //static diff --git a/src/corelib/io/qloggingregistry.cpp b/src/corelib/io/qloggingregistry.cpp index b8d1919ee6..4f7bc95330 100644 --- a/src/corelib/io/qloggingregistry.cpp +++ b/src/corelib/io/qloggingregistry.cpp @@ -276,10 +276,11 @@ static QVector<QLoggingRule> loadRulesFromFile(const QString &filePath) */ void QLoggingRegistry::init() { + QVector<QLoggingRule> er, qr, cr; // get rules from environment const QByteArray rulesFilePath = qgetenv("QT_LOGGING_CONF"); if (!rulesFilePath.isEmpty()) - envRules = loadRulesFromFile(QFile::decodeName(rulesFilePath)); + er = loadRulesFromFile(QFile::decodeName(rulesFilePath)); const QByteArray rulesSrc = qgetenv("QT_LOGGING_RULES").replace(';', '\n'); if (!rulesSrc.isEmpty()) { @@ -287,7 +288,7 @@ void QLoggingRegistry::init() QLoggingSettingsParser parser; parser.setSection(QStringLiteral("Rules")); parser.setContent(stream); - envRules += parser.rules(); + er += parser.rules(); } const QString configFileName = QStringLiteral("qtlogging.ini"); @@ -296,17 +297,22 @@ void QLoggingRegistry::init() // get rules from Qt data configuration path const QString qtConfigPath = QDir(QLibraryInfo::location(QLibraryInfo::DataPath)).absoluteFilePath(configFileName); - qtConfigRules = loadRulesFromFile(qtConfigPath); + qr = loadRulesFromFile(qtConfigPath); #endif // get rules from user's/system configuration const QString envPath = QStandardPaths::locate(QStandardPaths::GenericConfigLocation, QString::fromLatin1("QtProject/") + configFileName); if (!envPath.isEmpty()) - configRules = loadRulesFromFile(envPath); + cr = loadRulesFromFile(envPath); + + const QMutexLocker locker(®istryMutex); + + envRules = std::move(er); + qtConfigRules = std::move(qr); + configRules = std::move(cr); if (!envRules.isEmpty() || !qtConfigRules.isEmpty() || !configRules.isEmpty()) { - QMutexLocker locker(®istryMutex); updateRules(); } } @@ -347,11 +353,11 @@ void QLoggingRegistry::setApiRules(const QString &content) parser.setSection(QStringLiteral("Rules")); parser.setContent(content); - QMutexLocker locker(®istryMutex); - if (qtLoggingDebug()) debugMsg("Loading logging rules set by QLoggingCategory::setFilterRules ..."); + const QMutexLocker locker(®istryMutex); + apiRules = parser.rules(); updateRules(); @@ -405,6 +411,8 @@ QLoggingRegistry *QLoggingRegistry::instance() /*! \internal Updates category settings according to rules. + + As a category filter, it is run with registryMutex held. */ void QLoggingRegistry::defaultCategoryFilter(QLoggingCategory *cat) { diff --git a/src/corelib/io/qloggingregistry_p.h b/src/corelib/io/qloggingregistry_p.h index 5197da1ba4..23740c4955 100644 --- a/src/corelib/io/qloggingregistry_p.h +++ b/src/corelib/io/qloggingregistry_p.h @@ -129,6 +129,7 @@ private: QMutex registryMutex; + // protected by mutex: QVector<QLoggingRule> qtConfigRules; QVector<QLoggingRule> configRules; QVector<QLoggingRule> envRules; diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp index fcdf13fddb..aa69e9e1db 100644 --- a/src/corelib/io/qprocess_win.cpp +++ b/src/corelib/io/qprocess_win.cpp @@ -844,7 +844,8 @@ static bool startDetachedUacPrompt(const QString &programIn, const QStringList & SHELLEXECUTEINFOW shellExecuteExInfo; memset(&shellExecuteExInfo, 0, sizeof(SHELLEXECUTEINFOW)); shellExecuteExInfo.cbSize = sizeof(SHELLEXECUTEINFOW); - shellExecuteExInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_UNICODE | SEE_MASK_FLAG_NO_UI; + shellExecuteExInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_UNICODE | SEE_MASK_FLAG_NO_UI | SEE_MASK_CLASSNAME; + shellExecuteExInfo.lpClass = L"exefile"; shellExecuteExInfo.lpVerb = L"runas"; const QString program = QDir::toNativeSeparators(programIn); shellExecuteExInfo.lpFile = reinterpret_cast<LPCWSTR>(program.utf16()); diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index a6372b75f6..18ad59f1cb 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -4169,10 +4169,10 @@ QUrl QUrl::fromUserInput(const QString &userInput, const QString &workingDirecto return url; } - QUrl url = QUrl(trimmedString, QUrl::TolerantMode); + QUrl url = QUrl(userInput, QUrl::TolerantMode); // Check both QUrl::isRelative (to detect full URLs) and QDir::isAbsolutePath (since on Windows drive letters can be interpreted as schemes) - if (url.isRelative() && !QDir::isAbsolutePath(trimmedString)) { - QFileInfo fileInfo(QDir(workingDirectory), trimmedString); + if (url.isRelative() && !QDir::isAbsolutePath(userInput)) { + QFileInfo fileInfo(QDir(workingDirectory), userInput); if ((options & AssumeLocalFile) || fileInfo.exists()) return QUrl::fromLocalFile(fileInfo.absoluteFilePath()); } diff --git a/src/corelib/kernel/qeventdispatcher_cf.mm b/src/corelib/kernel/qeventdispatcher_cf.mm index 27eb3d0337..608dea5426 100644 --- a/src/corelib/kernel/qeventdispatcher_cf.mm +++ b/src/corelib/kernel/qeventdispatcher_cf.mm @@ -44,7 +44,6 @@ #include <QtCore/qthread.h> #include <QtCore/private/qcoreapplication_p.h> #include <QtCore/private/qcore_unix_p.h> -#include <QtCore/private/qcore_mac_p.h> #include <QtCore/private/qthread_p.h> #include <limits> @@ -59,11 +58,13 @@ QT_USE_NAMESPACE -@interface RunLoopModeTracker : NSObject { +@interface QT_MANGLE_NAMESPACE(RunLoopModeTracker) : NSObject { QStack<CFStringRef> m_runLoopModes; } @end +QT_NAMESPACE_ALIAS_OBJC_CLASS(RunLoopModeTracker); + @implementation RunLoopModeTracker - (id) init diff --git a/src/corelib/kernel/qeventdispatcher_cf_p.h b/src/corelib/kernel/qeventdispatcher_cf_p.h index e6581e2bac..8a234ebc40 100644 --- a/src/corelib/kernel/qeventdispatcher_cf_p.h +++ b/src/corelib/kernel/qeventdispatcher_cf_p.h @@ -90,14 +90,11 @@ #include <QtCore/qabstracteventdispatcher.h> #include <QtCore/private/qtimerinfo_unix_p.h> #include <QtCore/private/qcfsocketnotifier_p.h> +#include <QtCore/private/qcore_mac_p.h> #include <QtCore/qdebug.h> #include <CoreFoundation/CoreFoundation.h> -#ifdef __OBJC__ -@class RunLoopModeTracker; -#else -typedef struct objc_object RunLoopModeTracker; -#endif +Q_FORWARD_DECLARE_OBJC_CLASS(QT_MANGLE_NAMESPACE(RunLoopModeTracker)); QT_BEGIN_NAMESPACE @@ -253,7 +250,7 @@ private: RunLoopSource<> m_postedEventsRunLoopSource; RunLoopObserver<> m_runLoopActivityObserver; - RunLoopModeTracker *m_runLoopModeTracker; + QT_MANGLE_NAMESPACE(RunLoopModeTracker) *m_runLoopModeTracker; QTimerInfoList m_timerInfoList; CFRunLoopTimerRef m_runLoopTimer; diff --git a/src/corelib/mimetypes/qmimeprovider.cpp b/src/corelib/mimetypes/qmimeprovider.cpp index 959421bf52..5c0acce4c3 100644 --- a/src/corelib/mimetypes/qmimeprovider.cpp +++ b/src/corelib/mimetypes/qmimeprovider.cpp @@ -296,12 +296,15 @@ QMimeGlobMatchResult QMimeBinaryProvider::findByFileName(const QString &fileName const QString lowerFileName = fileName.toLower(); // TODO this parses in the order (local, global). Check that it handles "NOGLOBS" correctly. for (CacheFile *cacheFile : qAsConst(m_cacheFiles)) { + // Check literals (e.g. "Makefile") matchGlobList(result, cacheFile, cacheFile->getUint32(PosLiteralListOffset), fileName); + // Check complex globs (e.g. "callgrind.out[0-9]*") matchGlobList(result, cacheFile, cacheFile->getUint32(PosGlobListOffset), fileName); + // Check the very common *.txt cases with the suffix tree const int reverseSuffixTreeOffset = cacheFile->getUint32(PosReverseSuffixTreeOffset); const int numRoots = cacheFile->getUint32(reverseSuffixTreeOffset); const int firstRootOffset = cacheFile->getUint32(reverseSuffixTreeOffset + 4); - matchSuffixTree(result, cacheFile, numRoots, firstRootOffset, lowerFileName, fileName.length() - 1, false); + matchSuffixTree(result, cacheFile, numRoots, firstRootOffset, lowerFileName, lowerFileName.length() - 1, false); if (result.m_matchingMimeTypes.isEmpty()) matchSuffixTree(result, cacheFile, numRoots, firstRootOffset, fileName, fileName.length() - 1, true); } diff --git a/src/corelib/plugin/qfactoryloader_p.h b/src/corelib/plugin/qfactoryloader_p.h index 0876d141c4..70a934c976 100644 --- a/src/corelib/plugin/qfactoryloader_p.h +++ b/src/corelib/plugin/qfactoryloader_p.h @@ -57,11 +57,22 @@ #include "QtCore/qobject.h" #include "QtCore/qstringlist.h" #include "QtCore/qjsonobject.h" +#include "QtCore/qjsondocument.h" #include "QtCore/qmap.h" +#include "QtCore/qendian.h" #include "private/qlibrary_p.h" QT_BEGIN_NAMESPACE +inline QJsonDocument qJsonFromRawLibraryMetaData(const char *raw) +{ + raw += strlen("QTMETADATA "); + // the size of the embedded JSON object can be found 8 bytes into the data (see qjson_p.h), + // but doesn't include the size of the header (8 bytes) + QByteArray json(raw, qFromLittleEndian<uint>(*(const uint *)(raw + 8)) + 8); + return QJsonDocument::fromBinaryData(json); +} + class QFactoryLoaderPrivate; class Q_CORE_EXPORT QFactoryLoader : public QObject { diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp index 96cf5371f9..a4a654cd88 100644 --- a/src/corelib/plugin/qlibrary.cpp +++ b/src/corelib/plugin/qlibrary.cpp @@ -42,6 +42,7 @@ #ifndef QT_NO_LIBRARY +#include "qfactoryloader_p.h" #include "qlibrary_p.h" #include <qstringlist.h> #include <qfile.h> diff --git a/src/corelib/plugin/qlibrary_p.h b/src/corelib/plugin/qlibrary_p.h index f883e74843..7147ff6ca2 100644 --- a/src/corelib/plugin/qlibrary_p.h +++ b/src/corelib/plugin/qlibrary_p.h @@ -58,25 +58,12 @@ #include "QtCore/qstringlist.h" #include "QtCore/qplugin.h" #include "QtCore/qsharedpointer.h" -#include "QtCore/qjsonobject.h" -#include "QtCore/qjsondocument.h" -#include "QtCore/qendian.h" #ifdef Q_OS_WIN # include "QtCore/qt_windows.h" #endif QT_BEGIN_NAMESPACE -// Needed also in case of QT_NO_LIBRARY, for static plugin loading. -inline QJsonDocument qJsonFromRawLibraryMetaData(const char *raw) -{ - raw += strlen("QTMETADATA "); - // the size of the embedded JSON object can be found 8 bytes into the data (see qjson_p.h), - // but doesn't include the size of the header (8 bytes) - QByteArray json(raw, qFromLittleEndian<uint>(*(const uint *)(raw + 8)) + 8); - return QJsonDocument::fromBinaryData(json); -} - #ifndef QT_NO_LIBRARY diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp index 4ec4e43952..6723877ad5 100644 --- a/src/corelib/plugin/qpluginloader.cpp +++ b/src/corelib/plugin/qpluginloader.cpp @@ -43,7 +43,7 @@ #include "qcoreapplication.h" #include "qpluginloader.h" #include <qfileinfo.h> -#include "qlibrary_p.h" +#include "qfactoryloader_p.h" #include "qdebug.h" #include "qdir.h" diff --git a/src/corelib/thread/qreadwritelock.cpp b/src/corelib/thread/qreadwritelock.cpp index 6302a3a515..42befc4b80 100644 --- a/src/corelib/thread/qreadwritelock.cpp +++ b/src/corelib/thread/qreadwritelock.cpp @@ -392,13 +392,13 @@ bool QReadWriteLock::tryLockForWrite(int timeout) */ void QReadWriteLock::unlock() { - QReadWriteLockPrivate *d = d_ptr.load(); + QReadWriteLockPrivate *d = d_ptr.loadAcquire(); while (true) { Q_ASSERT_X(d, "QReadWriteLock::unlock()", "Cannot unlock an unlocked lock"); // Fast case: no contention: (no waiters, no other readers) if (quintptr(d) <= 2) { // 1 or 2 (StateLockedForRead or StateLockedForWrite) - if (!d_ptr.testAndSetRelease(d, nullptr, d)) + if (!d_ptr.testAndSetOrdered(d, nullptr, d)) continue; return; } @@ -407,7 +407,7 @@ void QReadWriteLock::unlock() Q_ASSERT(quintptr(d) > (1U<<4)); //otherwise that would be the fast case // Just decrease the reader's count. auto val = reinterpret_cast<QReadWriteLockPrivate *>(quintptr(d) - (1U<<4)); - if (!d_ptr.testAndSetRelease(d, val, d)) + if (!d_ptr.testAndSetOrdered(d, val, d)) continue; return; } diff --git a/src/corelib/tools/qfreelist_p.h b/src/corelib/tools/qfreelist_p.h index c3efc41d62..a8d1132d06 100644 --- a/src/corelib/tools/qfreelist_p.h +++ b/src/corelib/tools/qfreelist_p.h @@ -237,7 +237,7 @@ inline int QFreeList<T, ConstantsType>::next() int id, newid, at; ElementType *v; do { - id = _next.load(); + id = _next.loadAcquire(); at = id & ConstantsType::IndexMask; const int block = blockfor(at); @@ -254,7 +254,7 @@ inline int QFreeList<T, ConstantsType>::next() } newid = v[at].next.load() | (id & ~ConstantsType::IndexMask); - } while (!_next.testAndSetRelaxed(id, newid)); + } while (!_next.testAndSetRelease(id, newid)); // qDebug("QFreeList::next(): returning %d (_next now %d, serial %d)", // id & ConstantsType::IndexMask, // newid & ConstantsType::IndexMask, diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp index cdda5292e7..ae4befcb9c 100644 --- a/src/corelib/tools/qlocale.cpp +++ b/src/corelib/tools/qlocale.cpp @@ -594,7 +594,6 @@ static QLocalePrivate *c_private() */ QSystemLocale::QSystemLocale() { - delete _systemLocale; _systemLocale = this; if (system_data) diff --git a/src/corelib/tools/qrect.cpp b/src/corelib/tools/qrect.cpp index 4b6183646b..895b6b9701 100644 --- a/src/corelib/tools/qrect.cpp +++ b/src/corelib/tools/qrect.cpp @@ -1323,8 +1323,8 @@ QDebug operator<<(QDebug dbg, const QRect &r) rendering. A QRectF can be constructed with a set of left, top, width and - height integers, or from a QPoint and a QSize. The following code - creates two identical rectangles. + height coordinates, or from a QPointF and a QSizeF. The following + code creates two identical rectangles. \snippet code/src_corelib_tools_qrect.cpp 1 @@ -1344,7 +1344,7 @@ QDebug operator<<(QDebug dbg, const QRect &r) translated copy of this rectangle. The size() function returns the rectange's dimensions as a - QSize. The dimensions can also be retrieved separately using the + QSizeF. The dimensions can also be retrieved separately using the width() and height() functions. To manipulate the dimensions use the setSize(), setWidth() or setHeight() functions. Alternatively, the size can be changed by applying either of the functions diff --git a/src/corelib/tools/qtimezone.cpp b/src/corelib/tools/qtimezone.cpp index 359c2d0bdb..ec2f7c4af6 100644 --- a/src/corelib/tools/qtimezone.cpp +++ b/src/corelib/tools/qtimezone.cpp @@ -674,9 +674,9 @@ bool QTimeZone::isDaylightTime(const QDateTime &atDateTime) const QTimeZone::OffsetData QTimeZone::offsetData(const QDateTime &forDateTime) const { if (hasTransitions()) - return d->toOffsetData(d->data(forDateTime.toMSecsSinceEpoch())); + return QTimeZonePrivate::toOffsetData(d->data(forDateTime.toMSecsSinceEpoch())); else - return d->invalidOffsetData(); + return QTimeZonePrivate::invalidOffsetData(); } /*! @@ -712,9 +712,9 @@ bool QTimeZone::hasTransitions() const QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime) const { if (hasTransitions()) - return d->toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch())); + return QTimeZonePrivate::toOffsetData(d->nextTransition(afterDateTime.toMSecsSinceEpoch())); else - return d->invalidOffsetData(); + return QTimeZonePrivate::invalidOffsetData(); } /*! @@ -733,9 +733,9 @@ QTimeZone::OffsetData QTimeZone::nextTransition(const QDateTime &afterDateTime) QTimeZone::OffsetData QTimeZone::previousTransition(const QDateTime &beforeDateTime) const { if (hasTransitions()) - return d->toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch())); + return QTimeZonePrivate::toOffsetData(d->previousTransition(beforeDateTime.toMSecsSinceEpoch())); else - return d->invalidOffsetData(); + return QTimeZonePrivate::invalidOffsetData(); } /*! @@ -755,7 +755,7 @@ QTimeZone::OffsetDataList QTimeZone::transitions(const QDateTime &fromDateTime, toDateTime.toMSecsSinceEpoch()); list.reserve(plist.count()); for (const QTimeZonePrivate::Data &pdata : plist) - list.append(d->toOffsetData(pdata)); + list.append(QTimeZonePrivate::toOffsetData(pdata)); } return list; } diff --git a/src/corelib/tools/qvarlengtharray.h b/src/corelib/tools/qvarlengtharray.h index 25f5176c22..ae2c75e7df 100644 --- a/src/corelib/tools/qvarlengtharray.h +++ b/src/corelib/tools/qvarlengtharray.h @@ -146,15 +146,25 @@ public: T value(int i, const T &defaultValue) const; inline void append(const T &t) { - if (s == a) // i.e. s != 0 + if (s == a) { // i.e. s != 0 + T copy(t); realloc(s, s<<1); - const int idx = s++; - if (QTypeInfo<T>::isComplex) { - new (ptr + idx) T(t); + const int idx = s++; + if (QTypeInfo<T>::isComplex) { + new (ptr + idx) T(std::move(copy)); + } else { + ptr[idx] = std::move(copy); + } } else { - ptr[idx] = t; + const int idx = s++; + if (QTypeInfo<T>::isComplex) { + new (ptr + idx) T(t); + } else { + ptr[idx] = t; + } } } + void append(const T *buf, int size); inline QVarLengthArray<T, Prealloc> &operator<<(const T &t) { append(t); return *this; } diff --git a/src/gui/configure.json b/src/gui/configure.json index 52ccb60024..4de560753d 100644 --- a/src/gui/configure.json +++ b/src/gui/configure.json @@ -161,9 +161,10 @@ "test": "unix/libpng", "sources": [ { "type": "pkgConfig", "args": "libpng" }, - { "libs": "-llibpng -lzdll", "condition": "config.msvc" }, - { "libs": "-lpng -lz", "condition": "!config.msvc" } - ] + { "libs": "-llibpng", "condition": "config.msvc" }, + { "libs": "-lpng", "condition": "!config.msvc" } + ], + "use": "zlib" }, "mirclient": { "label": "Mir client libraries", diff --git a/src/gui/text/qtextdocument_p.cpp b/src/gui/text/qtextdocument_p.cpp index 7107c7c26e..7341fa8e83 100644 --- a/src/gui/text/qtextdocument_p.cpp +++ b/src/gui/text/qtextdocument_p.cpp @@ -265,7 +265,7 @@ void QTextDocumentPrivate::clear() unreachableCharacterCount = 0; modifiedState = 0; modified = false; - formats = QTextFormatCollection(); + formats.clear(); int len = fragments.length(); fragments.clear(); blocks.clear(); diff --git a/src/gui/text/qtextformat.cpp b/src/gui/text/qtextformat.cpp index 39fec032dc..36e0a77bd0 100644 --- a/src/gui/text/qtextformat.cpp +++ b/src/gui/text/qtextformat.cpp @@ -3371,22 +3371,15 @@ QTextTableCellFormat::QTextTableCellFormat(const QTextFormat &fmt) // ------------------------------------------------------ - -QTextFormatCollection::QTextFormatCollection(const QTextFormatCollection &rhs) -{ - formats = rhs.formats; - objFormats = rhs.objFormats; -} - -QTextFormatCollection &QTextFormatCollection::operator=(const QTextFormatCollection &rhs) +QTextFormatCollection::~QTextFormatCollection() { - formats = rhs.formats; - objFormats = rhs.objFormats; - return *this; } -QTextFormatCollection::~QTextFormatCollection() +void QTextFormatCollection::clear() { + formats.clear(); + objFormats.clear(); + hashes.clear(); } int QTextFormatCollection::indexForFormat(const QTextFormat &format) diff --git a/src/gui/text/qtextformat_p.h b/src/gui/text/qtextformat_p.h index f05bfaff71..3557c17a97 100644 --- a/src/gui/text/qtextformat_p.h +++ b/src/gui/text/qtextformat_p.h @@ -63,8 +63,7 @@ public: QTextFormatCollection() {} ~QTextFormatCollection(); - QTextFormatCollection(const QTextFormatCollection &rhs); - QTextFormatCollection &operator=(const QTextFormatCollection &rhs); + void clear(); inline QTextFormat objectFormat(int objectIndex) const { return format(objectFormatIndex(objectIndex)); } @@ -104,6 +103,8 @@ public: private: QFont defaultFnt; + + Q_DISABLE_COPY(QTextFormatCollection) }; QT_END_NAMESPACE diff --git a/src/network/configure.json b/src/network/configure.json index 1e08aa7c49..7bd3f6164a 100644 --- a/src/network/configure.json +++ b/src/network/configure.json @@ -7,9 +7,6 @@ "commandline": { "assignments": { - "OPENSSL_LIBS": "openssl.libs", - "OPENSSL_LIBS_DEBUG": "openssl.libs.debug", - "OPENSSL_LIBS_RELEASE": "openssl.libs.release", "OPENSSL_PATH": "openssl.prefix" }, "options": { @@ -46,13 +43,24 @@ "-lproxy" ] }, + "openssl_headers": { + "label": "OpenSSL Headers", + "export": "openssl", + "test": "unix/openssl", + "sources": [ + { + "comment": "placeholder for OPENSSL_PATH", + "libs": "" + } + ] + }, "openssl": { - "label": "OpenSSL Libraries", - "export": "", + "label": "OpenSSL", + "test": "unix/openssl", "sources": [ { "type": "openssl" }, { - "comment": "placeholder for OPENSSL_LIBS{,_{DEBUG,RELEASE}}", + "comment": "placeholder for OPENSSL_{PATH,LIBS{,_{DEBUG,RELEASE}}}", "libs": "", "builds": { "debug": "", @@ -92,11 +100,6 @@ "test": "unix/ipv6ifname", "use": "network" }, - "openssl": { - "label": "OpenSSL", - "type": "compile", - "test": "unix/openssl" - }, "sctp": { "label": "SCTP support", "type": "compile", @@ -138,7 +141,7 @@ "enable": "input.openssl == 'yes' || input.openssl == 'linked' || input.openssl == 'runtime'", "disable": "input.openssl == 'no' || input.ssl == 'no'", "autoDetect": "!config.winrt", - "condition": "!features.securetransport && tests.openssl", + "condition": "!features.securetransport && (features.openssl-linked || libs.openssl_headers)", "output": [ "privateFeature", { "type": "publicQtConfig", "condition": "!features.openssl-linked" }, @@ -149,14 +152,9 @@ "label": " Qt directly linked to OpenSSL", "enable": "input.openssl == 'linked'", "disable": "input.openssl != 'linked'", - "condition": "features.openssl && libs.openssl", + "condition": "!features.securetransport && libs.openssl", "output": [ "privateFeature", - { "type": "varAssign", "name": "OPENSSL_LIBS", "value": "libs.openssl.libs", "eval": "true" }, - { "type": "varAssign", "name": "OPENSSL_LIBS_DEBUG", "value": "libs.openssl.builds.debug.libs", - "eval": "true", "condition": "config.win32" }, - { "type": "varAssign", "name": "OPENSSL_LIBS_RELEASE", "value": "libs.openssl.builds.release.libs", - "eval": "true", "condition": "config.win32" }, { "type": "define", "name": "QT_LINKED_OPENSSL" } ] }, diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp index d1efc21e09..e140b33ce9 100644 --- a/src/network/socket/qnativesocketengine_unix.cpp +++ b/src/network/socket/qnativesocketengine_unix.cpp @@ -679,10 +679,16 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d, if (interface.isValid()) { const QList<QNetworkAddressEntry> addressEntries = interface.addressEntries(); - if (!addressEntries.isEmpty()) { - QHostAddress firstIP = addressEntries.first().ip(); - mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address()); - } else { + bool found = false; + for (const QNetworkAddressEntry &entry : addressEntries) { + const QHostAddress ip = entry.ip(); + if (ip.protocol() == QAbstractSocket::IPv4Protocol) { + mreq4.imr_interface.s_addr = htonl(ip.toIPv4Address()); + found = true; + break; + } + } + if (!found) { d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::NetworkUnreachableErrorString); return false; diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp index 80147b47ba..28aea6be3d 100644 --- a/src/network/socket/qnativesocketengine_win.cpp +++ b/src/network/socket/qnativesocketengine_win.cpp @@ -955,10 +955,16 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d, if (iface.isValid()) { const QList<QNetworkAddressEntry> addressEntries = iface.addressEntries(); - if (!addressEntries.isEmpty()) { - QHostAddress firstIP = addressEntries.first().ip(); - mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address()); - } else { + bool found = false; + for (const QNetworkAddressEntry &entry : addressEntries) { + const QHostAddress ip = entry.ip(); + if (ip.protocol() == QAbstractSocket::IPv4Protocol) { + mreq4.imr_interface.s_addr = htonl(ip.toIPv4Address()); + found = true; + break; + } + } + if (!found) { d->setError(QAbstractSocket::NetworkError, QNativeSocketEnginePrivate::NetworkUnreachableErrorString); return false; diff --git a/src/network/ssl/ssl.pri b/src/network/ssl/ssl.pri index 79351017a6..52ce2eeade 100644 --- a/src/network/ssl/ssl.pri +++ b/src/network/ssl/ssl.pri @@ -56,7 +56,7 @@ qtConfig(ssl) { ssl/qsslellipticcurve_dummy.cpp } - qtConfig(openssl)|qtConfig(openssl-linked) { + qtConfig(openssl) { HEADERS += ssl/qsslcontext_openssl_p.h \ ssl/qsslsocket_openssl_p.h \ ssl/qsslsocket_openssl_symbols_p.h @@ -79,16 +79,10 @@ qtConfig(ssl) { # - libs in <OPENSSL_DIR>\lib\VC\static # - configure: -openssl -openssl-linked -I <OPENSSL_DIR>\include -L <OPENSSL_DIR>\lib\VC\static OPENSSL_LIBS="-lUser32 -lAdvapi32 -lGdi32" OPENSSL_LIBS_DEBUG="-lssleay32MDd -llibeay32MDd" OPENSSL_LIBS_RELEASE="-lssleay32MD -llibeay32MD" - include($$OUT_PWD/qtnetwork-config.pri) - - CONFIG(debug, debug|release) { - LIBS_PRIVATE += $$OPENSSL_LIBS_DEBUG - } else { - LIBS_PRIVATE += $$OPENSSL_LIBS_RELEASE - } - - QMAKE_CXXFLAGS += $$OPENSSL_CFLAGS - LIBS_PRIVATE += $$OPENSSL_LIBS + qtConfig(openssl-linked): \ + QMAKE_USE_FOR_PRIVATE += openssl + else: \ + QMAKE_USE_FOR_PRIVATE += openssl/nolink win32: LIBS_PRIVATE += -lcrypt32 } } diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp index 736c66ebc0..0a55f689c6 100644 --- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp +++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp @@ -572,7 +572,8 @@ QString QIBusPlatformInputContextPrivate::getSocketPath() if (debug) qDebug() << "host=" << host << "displayNumber" << displayNumber; - return QDir::homePath() + QLatin1String("/.config/ibus/bus/") + + return QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + + QLatin1String("/ibus/bus/") + QLatin1String(QDBusConnection::localMachineId()) + QLatin1Char('-') + QString::fromLocal8Bit(host) + QLatin1Char('-') + QString::fromLocal8Bit(displayNumber); } diff --git a/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp b/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp index d9ecdfac3d..d3810329c5 100644 --- a/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp +++ b/src/plugins/platforms/android/qandroidplatformopenglcontext.cpp @@ -100,10 +100,6 @@ bool QAndroidPlatformOpenGLContext::makeCurrent(QPlatformSurface *surface) bool ret = QEGLPlatformContext::makeCurrent(surface); QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(context()); - const char *rendererString = reinterpret_cast<const char *>(glGetString(GL_RENDERER)); - if (rendererString != 0 && qstrncmp(rendererString, "Android Emulator", 16) == 0) - ctx_d->workaround_missingPrecisionQualifiers = true; - if (!ctx_d->workaround_brokenFBOReadBack && needsFBOReadBackWorkaround()) ctx_d->workaround_brokenFBOReadBack = true; diff --git a/src/plugins/platforms/cocoa/qcocoadrag.mm b/src/plugins/platforms/cocoa/qcocoadrag.mm index de4fa95530..c71e80d191 100644 --- a/src/plugins/platforms/cocoa/qcocoadrag.mm +++ b/src/plugins/platforms/cocoa/qcocoadrag.mm @@ -201,6 +201,10 @@ QPixmap QCocoaDrag::dragPixmap(QDrag *drag, QPoint &hotSpot) const dpr = sourceWindow->devicePixelRatio(); } #endif + else { + if (const QWindow *focusWindow = qApp->focusWindow()) + dpr = focusWindow->devicePixelRatio(); + } pm = QPixmap(width * dpr, height * dpr); pm.setDevicePixelRatio(dpr); QPainter p(&pm); diff --git a/src/plugins/platforms/vnc/qvncclient.cpp b/src/plugins/platforms/vnc/qvncclient.cpp index dae3e83f37..58dcfc9b51 100644 --- a/src/plugins/platforms/vnc/qvncclient.cpp +++ b/src/plugins/platforms/vnc/qvncclient.cpp @@ -142,7 +142,7 @@ void QVncClient::convertPixels(char *dst, const char *src, int count) const case 16: { quint16 p = *reinterpret_cast<const quint16*>(src); #if Q_BYTE_ORDER == Q_BIG_ENDIAN - if (swapBytes) + if (m_swapBytes) p = ((p & 0xff) << 8) | ((p & 0xff00) >> 8); #endif r = (p >> 11) & 0x1f; @@ -484,7 +484,7 @@ void QVncClient::setPixelFormat() m_sameEndian = (QSysInfo::ByteOrder == QSysInfo::BigEndian) == !!m_pixelFormat.bigEndian; m_needConversion = pixelConversionNeeded(); #if Q_BYTE_ORDER == Q_BIG_ENDIAN - m_swapBytes = qvnc_screen->swapBytes(); + m_swapBytes = server()->screen()->swapBytes(); #endif } } @@ -639,7 +639,7 @@ bool QVncClient::pixelConversionNeeded() const return true; #if Q_BYTE_ORDER == Q_BIG_ENDIAN - if (qvnc_screen->swapBytes()) + if (server()->screen()->swapBytes()) return true; #endif diff --git a/src/plugins/platforms/vnc/qvncscreen.cpp b/src/plugins/platforms/vnc/qvncscreen.cpp index 91a8933dba..75c8bedff7 100644 --- a/src/plugins/platforms/vnc/qvncscreen.cpp +++ b/src/plugins/platforms/vnc/qvncscreen.cpp @@ -43,6 +43,7 @@ #include <QtFbSupport/private/qfbcursor_p.h> #include <QtGui/QPainter> +#include <QtGui/QScreen> #include <QtCore/QRegularExpression> @@ -172,14 +173,18 @@ QPixmap QVncScreen::grabWindow(WId wid, int x, int y, int width, int height) con } #if Q_BYTE_ORDER == Q_BIG_ENDIAN -bool QVNCScreen::swapBytes() const +bool QVncScreen::swapBytes() const { + return false; + + /* TODO if (depth() != 16) return false; if (screen()) return screen()->frameBufferLittleEndian(); return frameBufferLittleEndian(); + */ } #endif diff --git a/src/plugins/platforms/vnc/qvncscreen.h b/src/plugins/platforms/vnc/qvncscreen.h index c0a22ed140..b2dd89a2ed 100644 --- a/src/plugins/platforms/vnc/qvncscreen.h +++ b/src/plugins/platforms/vnc/qvncscreen.h @@ -75,7 +75,7 @@ public: void clearDirty() { dirtyRegion = QRegion(); } #if Q_BYTE_ORDER == Q_BIG_ENDIAN - bool swapBytes() const + bool swapBytes() const; #endif QStringList mArgs; diff --git a/src/sql/configure.json b/src/sql/configure.json index 72671b6df9..45b3fd9dd1 100644 --- a/src/sql/configure.json +++ b/src/sql/configure.json @@ -8,7 +8,6 @@ "commandline": { "assignments": { "MYSQL_PATH": "mysql.prefix", - "PSQL_LIBS": "psql.libs", "SYBASE": "tds.prefix", "SYBASE_LIBS": "tds.libs" }, @@ -115,8 +114,10 @@ "test": "unix/sqlite", "sources": [ { "type": "pkgConfig", "args": "sqlite3" }, - { "libs": "-lsqlite3", "condition": "config.win32" }, - { "libs": "-lsqlite3 -lz", "condition": "!config.win32" } + "-lsqlite3" + ], + "use": [ + { "lib": "zlib", "condition": "!config.win32" } ] } }, diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm index cc895e2c33..f884a1c279 100644 --- a/src/widgets/styles/qmacstyle_mac.mm +++ b/src/widgets/styles/qmacstyle_mac.mm @@ -6669,12 +6669,7 @@ QSize QMacStyle::sizeFromContents(ContentsType ct, const QStyleOption *opt, break; } case CT_Menu: { - QStyleHintReturnMask menuMask; - QStyleOption myOption = *opt; - myOption.rect.setSize(sz); - if (proxy()->styleHint(SH_Menu_Mask, &myOption, widget, &menuMask)) { - sz = menuMask.region.boundingRect().size(); - } + sz = csz; break; } case CT_HeaderSection:{ const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(opt); diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp index b33f2dc798..8d9280ebb5 100644 --- a/src/widgets/widgets/qdockarealayout.cpp +++ b/src/widgets/widgets/qdockarealayout.cpp @@ -2092,7 +2092,7 @@ void QDockAreaLayoutInfo::reparentWidgets(QWidget *parent) const QDockAreaLayoutItem &item = item_list.at(i); if (item.flags & QDockAreaLayoutItem::GapItem) continue; - if (!item.widgetItem && item.skip()) + if (item.skip()) continue; if (item.subinfo) item.subinfo->reparentWidgets(parent); diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp index aa5d809431..307a261a43 100644 --- a/src/widgets/widgets/qdockwidget.cpp +++ b/src/widgets/widgets/qdockwidget.cpp @@ -1026,6 +1026,12 @@ void QDockWidgetPrivate::nonClientAreaMouseEvent(QMouseEvent *event) } } +void QDockWidgetPrivate::recalculatePressPos(QResizeEvent *event) +{ + qreal ratio = event->oldSize().width() / (1.0 * event->size().width()); + state->pressPos.setX(state->pressPos.x() / ratio); +} + /*! \internal Called when the QDockWidget or the QDockWidgetGroupWindow is moved */ @@ -1542,6 +1548,13 @@ bool QDockWidget::event(QEvent *event) // if the mainwindow is plugging us, we don't want to update undocked geometry if (isFloating() && layout != 0 && layout->pluggingWidget != this) d->undockedGeometry = geometry(); + + // Usually the window won't get resized while it's being moved, but it can happen, + // for example on Windows when moving to a screen with bigger scale factor + // (and Qt::AA_EnableHighDpiScaling is enabled). If that happens we should + // update state->pressPos, otherwise it will be outside the window when the window shrinks. + if (d->state && d->state->dragging) + d->recalculatePressPos(static_cast<QResizeEvent*>(event)); break; default: break; diff --git a/src/widgets/widgets/qdockwidget_p.h b/src/widgets/widgets/qdockwidget_p.h index 94a3ad3b34..84bf8efacf 100644 --- a/src/widgets/widgets/qdockwidget_p.h +++ b/src/widgets/widgets/qdockwidget_p.h @@ -118,6 +118,7 @@ public: void startDrag(bool group = true); void endDrag(bool abort = false); void moveEvent(QMoveEvent *event); + void recalculatePressPos(QResizeEvent *event); void unplug(const QRect &rect); void plug(const QRect &rect); diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp index 68ca571acf..640154063e 100644 --- a/src/widgets/widgets/qmainwindowlayout.cpp +++ b/src/widgets/widgets/qmainwindowlayout.cpp @@ -2195,10 +2195,8 @@ void QMainWindowLayout::animationFinished(QWidget *widget) } if (QDockWidget *dw = qobject_cast<QDockWidget*>(widget)) { - if (currentHoveredFloat) { - dw->setParent(currentHoveredFloat); - dw->show(); - } + dw->setParent(currentHoveredFloat ? currentHoveredFloat.data() : parentWidget()); + dw->show(); dw->d_func()->plug(currentGapRect); } #endif @@ -2380,7 +2378,8 @@ QLayoutItem *QMainWindowLayout::unplug(QWidget *widget, bool group) // We are unplugging a dock widget from a floating window. if (QDockWidget *dw = qobject_cast<QDockWidget*>(widget)) { dw->d_func()->unplug(widget->geometry()); - return 0; + int index = widget->parentWidget()->layout()->indexOf(widget); + return widget->parentWidget()->layout()->itemAt(index); } } } |