From 390a1b0754afb0efb9cdb5ad6ac600cee4153518 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 26 Apr 2016 16:00:23 +0300 Subject: [PATCH] Some improvements for winrt. --- Telegram/Patches/qtbase_5_6_0.diff | 125 ++++++++++++++++---------- Telegram/SourceFiles/application.cpp | 3 + Telegram/SourceFiles/logs.cpp | 9 +- Telegram/SourceFiles/ui/flatinput.cpp | 29 +++++- Telegram/SourceFiles/ui/text/text.cpp | 4 - 5 files changed, 113 insertions(+), 57 deletions(-) diff --git a/Telegram/Patches/qtbase_5_6_0.diff b/Telegram/Patches/qtbase_5_6_0.diff index 96f9d84908..2bb9052fbe 100644 --- a/Telegram/Patches/qtbase_5_6_0.diff +++ b/Telegram/Patches/qtbase_5_6_0.diff @@ -16,6 +16,21 @@ index eec9e1f..ec3015e 100644 QMAKE_CFLAGS_YACC = QMAKE_CFLAGS_LTCG = -GL QMAKE_CFLAGS_SSE2 = -arch:SSE2 +diff --git a/src/corelib/io/qfilesystemengine_win.cpp b/src/corelib/io/qfilesystemengine_win.cpp +index f1a6019..a53a6c4 100644 +--- a/src/corelib/io/qfilesystemengine_win.cpp ++++ b/src/corelib/io/qfilesystemengine_win.cpp +@@ -1416,8 +1416,9 @@ bool QFileSystemEngine::copyFile(const QFileSystemEntry &source, const QFileSyst + COPYFILE2_EXTENDED_PARAMETERS copyParams = { + sizeof(copyParams), COPY_FILE_FAIL_IF_EXISTS, NULL, NULL, NULL + }; ++ // CopyFile2 returns HRESULT, not BOOL, so it should be tested for S_OK, not 0. + bool ret = ::CopyFile2((const wchar_t*)source.nativeFilePath().utf16(), +- (const wchar_t*)target.nativeFilePath().utf16(), ©Params) != 0; ++ (const wchar_t*)target.nativeFilePath().utf16(), ©Params) == S_OK; + #endif // Q_OS_WINRT + if(!ret) + error = QSystemError(::GetLastError(), QSystemError::NativeError); diff --git a/src/corelib/tools/qunicodetables.cpp b/src/corelib/tools/qunicodetables.cpp index 14e4fd1..c31c62b 100644 --- a/src/corelib/tools/qunicodetables.cpp @@ -82,8 +97,22 @@ index 918c989..55ef783 100644 +#endif + } } - + // Make sure we're inside the viewport. +diff --git a/src/gui/text/qtextengine_p.h b/src/gui/text/qtextengine_p.h +index 39c228f..b72fdc0 100644 +--- a/src/gui/text/qtextengine_p.h ++++ b/src/gui/text/qtextengine_p.h +@@ -283,7 +283,8 @@ private: + + struct QScriptItem; + /// Internal QTextItem +-class QTextItemInt : public QTextItem ++// Enable access to QTextItemInt in .dll for WinRT build. ++class Q_GUI_EXPORT QTextItemInt : public QTextItem + { + public: + inline QTextItemInt() diff --git a/src/gui/text/qtextlayout.cpp b/src/gui/text/qtextlayout.cpp index 9e2a23a..861f202 100644 --- a/src/gui/text/qtextlayout.cpp @@ -105,7 +134,7 @@ index 9e2a23a..861f202 100644 - while (oldPos < len && attributes[oldPos].whiteSpace) - oldPos++; } - + return oldPos; diff --git a/src/gui/text/qtextlayout.h b/src/gui/text/qtextlayout.h index f74d4d4..57d449a 100644 @@ -119,8 +148,8 @@ index f74d4d4..57d449a 100644 + // allow access to private constructor + friend class TextBlock; }; - - + + diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp index ca0a8b9..26ee865 100644 --- a/src/network/socket/qnativesocketengine_win.cpp @@ -144,9 +173,9 @@ index 728b166..12364db 100644 --- a/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp +++ b/src/platformsupport/fontdatabases/basic/qbasicfontdatabase.cpp @@ -172,6 +172,79 @@ void QBasicFontDatabase::releaseHandle(void *handle) - + extern FT_Library qt_getFreetype(); - + +// Enable Open Sans Semibold font family reading. +// Copied from freetype with some modifications. + @@ -240,9 +269,9 @@ index a5fe888..5878a4f 100644 --- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp +++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp @@ -381,6 +381,17 @@ static void populateFromPattern(FcPattern *pattern) - + familyName = QString::fromUtf8((const char *)value); - + + // Enable Open Sans Semibold font family reading. + if (familyName == QLatin1String("Open Sans")) { + FcChar8 *styl = 0; @@ -301,7 +330,7 @@ index 0af7790..c16f154 100644 --- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm +++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm @@ -259,6 +259,13 @@ static void getFontDescription(CTFontDescriptorRef font, FontDescription *fd) - + fd->foundryName = QStringLiteral("CoreText"); fd->familyName = (CFStringRef) CTFontDescriptorCopyAttribute(font, kCTFontFamilyNameAttribute); + @@ -11138,13 +11167,13 @@ index faea54b..7d85080 100644 +++ b/src/plugins/platforminputcontexts/platforminputcontexts.pro @@ -1,7 +1,8 @@ TEMPLATE = subdirs - + qtHaveModule(dbus) { -!mac:!win32:SUBDIRS += ibus +# Adding fcitx input context plugin to our static build. +!mac:!win32:SUBDIRS += ibus fcitx } - + contains(QT_CONFIG, xcb-plugin): SUBDIRS += compose diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.mm index caa8884..b083e65 100644 @@ -11158,7 +11187,7 @@ index caa8884..b083e65 100644 + // Don't terminate if reflectionDelegate does not respond to that selector, just use the default. + //return NSTerminateNow; } - + if ([self canQuit]) { diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.h b/src/plugins/platforms/cocoa/qcocoabackingstore.h index 5a199de..5622728 100644 @@ -11172,7 +11201,7 @@ index 5a199de..5622728 100644 + // Optimize redraw - don't clear image if it will be fully redrawn. + bool m_qImageNeedsClear; }; - + QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.mm b/src/plugins/platforms/cocoa/qcocoabackingstore.mm index ca92103..225d85f 100644 @@ -11180,14 +11209,14 @@ index ca92103..225d85f 100644 +++ b/src/plugins/platforms/cocoa/qcocoabackingstore.mm @@ -38,7 +38,8 @@ QT_BEGIN_NAMESPACE - + QCocoaBackingStore::QCocoaBackingStore(QWindow *window) - : QPlatformBackingStore(window) + // Optimize redraw - don't clear image if it will be fully redrawn. + : QPlatformBackingStore(window), m_qImageNeedsClear(false) { } - + @@ -59,9 +60,11 @@ QPaintDevice *QCocoaBackingStore::paintDevice() if (m_qImage.size() != effectiveBufferSize) { QImage::Format format = (window()->format().hasAlpha() || cocoaWindow->m_drawContentBorderGradient) @@ -11202,7 +11231,7 @@ index ca92103..225d85f 100644 } return &m_qImage; @@ -100,7 +103,8 @@ bool QCocoaBackingStore::scroll(const QRegion &area, int dx, int dy) - + void QCocoaBackingStore::beginPaint(const QRegion ®ion) { - if (m_qImage.hasAlphaChannel()) { @@ -11227,7 +11256,7 @@ index c2d206f..0f9b512 100644 + return true; } - + @@ -466,7 +472,8 @@ QList QCocoaKeyMapper::possibleKeys(const QKeyEvent *event) const Qt::KeyboardModifiers neededMods = ModsTbl[i]; int key = kbItem->qtKey[i]; @@ -11261,7 +11290,7 @@ index 8152c57..a7c1ca0 100644 + const int padding = 0; const int menuHeight = [[NSStatusBar systemStatusBar] thickness]; const int maxImageHeight = menuHeight - padding; - + @@ -207,8 +211,11 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon) // devicePixelRatio for the "best" screen on the system. qreal devicePixelRatio = qApp->devicePixelRatio(); @@ -11276,21 +11305,21 @@ index 8152c57..a7c1ca0 100644 // with a height smaller or equal to maxPixmapHeight. The pixmap // may rectangular; assume it has a reasonable size. If there is @@ -224,9 +231,9 @@ void QCocoaSystemTrayIcon::updateIcon(const QIcon &icon) - + // Handle SVG icons, which do not return anything for availableSizes(). if (!selectedSize.isValid()) - selectedSize = icon.actualSize(QSize(maxPixmapHeight, maxPixmapHeight)); + selectedSize = icon.actualSize(QSize(maxPixmapHeight, maxPixmapHeight), mode); - + - QPixmap pixmap = icon.pixmap(selectedSize); + QPixmap pixmap = icon.pixmap(selectedSize, mode); - + // Draw a low-resolution icon if there is not enough pixels for a retina // icon. This prevents showing a small icon on retina displays. @@ -374,6 +381,11 @@ QT_END_NAMESPACE Q_UNUSED(notification); down = NO; - + + // Create a rich os x tray icon (pixel-perfect, theme switching). + parent->iconSelected = false; + parent->systray->updateIcon(parent->icon); @@ -11298,11 +11327,11 @@ index 8152c57..a7c1ca0 100644 + [self setNeedsDisplay:YES]; } - + @@ -383,6 +395,10 @@ QT_END_NAMESPACE int clickCount = [mouseEvent clickCount]; [self setNeedsDisplay:YES]; - + + // Create a rich os x tray icon (pixel-perfect, theme switching). + parent->iconSelected = (clickCount != 2) && parent->menu; + parent->systray->updateIcon(parent->icon); @@ -11321,7 +11350,7 @@ index 8152c57..a7c1ca0 100644 + [self menuTrackingDone:nil]; } - + @@ -410,6 +431,11 @@ QT_END_NAMESPACE -(void)rightMouseUp:(NSEvent *)mouseEvent { @@ -11333,10 +11362,10 @@ index 8152c57..a7c1ca0 100644 + [self menuTrackingDone:nil]; } - + @@ -425,7 +451,8 @@ QT_END_NAMESPACE } - + -(void)drawRect:(NSRect)rect { - [[parent item] drawStatusBarBackgroundInRect:rect withHighlight:down]; + // Create a rich os x tray icon (pixel-perfect, theme switching). @@ -11373,7 +11402,7 @@ index 00cb43c..4530862 100644 @@ -141,7 +141,8 @@ static bool isMouseEvent(NSEvent *ev) if (!self.window.delegate) return; // Already detached, pending NSAppKitDefined event - + - if (pw && pw->frameStrutEventsEnabled() && isMouseEvent(theEvent)) { + // Fix restore after minimize or close by window buttons. + if (pw && pw->frameStrutEventsEnabled() && pw->m_synchedWindowState != Qt::WindowMinimized && pw->m_isExposed && isMouseEvent(theEvent)) { @@ -11383,7 +11412,7 @@ index 00cb43c..4530862 100644 @@ -931,6 +932,15 @@ void QCocoaWindow::setWindowFilePath(const QString &filePath) [m_nsWindow setRepresentedFilename: fi.exists() ? QCFString::toNSString(filePath) : @""]; } - + +// Create a good os x window icon (pixel-perfect). +qreal _win_devicePixelRatio() { + qreal result = 1.0; @@ -11423,7 +11452,7 @@ index 0d80333..729d4d0 100644 } @@ -1451,14 +1452,14 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) quint32 nativeVirtualKey = [nsevent keyCode]; - + QChar ch = QChar::ReplacementCharacter; - int keyCode = Qt::Key_unknown; - if ([characters length] != 0) { @@ -11441,13 +11470,13 @@ index 0d80333..729d4d0 100644 + ch = QChar([charactersIgnoringModifiers characterAtIndex:0]); + + int keyCode = [self convertKeyCode:ch]; - + // we will send a key event unless the input method sets m_sendKeyEvent to false m_sendKeyEvent = true; @@ -1524,6 +1525,23 @@ static QTabletEvent::TabletDevice wacomTabletDevice(NSEvent *theEvent) [self handleKeyEvent:nsevent eventType:int(QEvent::KeyRelease)]; } - + +// Enable Ctrl+Tab and Ctrl+Shift+Tab / Ctrl+Backtab handle in-app. +- (BOOL)performKeyEquivalent:(NSEvent *)nsevent +{ @@ -11475,7 +11504,7 @@ index 9211fd1..283aabd 100644 @@ -716,12 +716,20 @@ public: void setSelectedFiles(const QList &); QString selectedFile() const; - + + // Adding select-by-url for Windows file dialog. + void setSelectedRemoteContent(const QByteArray &); + QByteArray selectedRemoteContent() const; @@ -11496,7 +11525,7 @@ index 9211fd1..283aabd 100644 @@ -775,6 +783,21 @@ inline void QWindowsFileDialogSharedData::setSelectedFiles(const QList &ur m_data->selectedFiles = urls; } - + +// Adding select-by-url for Windows file dialog. +inline QByteArray QWindowsFileDialogSharedData::selectedRemoteContent() const +{ @@ -11518,7 +11547,7 @@ index 9211fd1..283aabd 100644 @@ -899,6 +922,9 @@ public: // example by appended default suffixes, etc. virtual QList dialogResult() const = 0; - + + // Adding select-by-url for Windows file dialog. + virtual QByteArray dialogRemoteContent() const { return QByteArray(); } + @@ -11540,7 +11569,7 @@ index 9211fd1..283aabd 100644 + m_fileDialog->SetFileName((wchar_t*)file.utf16());; + } } - + // Return the index of the selected filter, accounting for QFileDialog @@ -1405,7 +1438,11 @@ bool QWindowsNativeFileDialogBase::onFileOk() { @@ -11553,12 +11582,12 @@ index 9211fd1..283aabd 100644 + + return true; } - + void QWindowsNativeFileDialogBase::close() @@ -1534,6 +1571,9 @@ public: QList selectedFiles() const Q_DECL_OVERRIDE; QList dialogResult() const Q_DECL_OVERRIDE; - + + // Adding select-by-url for Windows file dialog. + QByteArray dialogRemoteContent() const Q_DECL_OVERRIDE; + @@ -11568,7 +11597,7 @@ index 9211fd1..283aabd 100644 @@ -1548,6 +1588,62 @@ QList QWindowsNativeOpenFileDialog::dialogResult() const return result; } - + +// Adding select-by-url for Windows file dialog. +QByteArray QWindowsNativeOpenFileDialog::dialogRemoteContent() const +{ @@ -11642,7 +11671,7 @@ index 9211fd1..283aabd 100644 @@ -1704,6 +1804,12 @@ QList QWindowsFileDialogHelper::selectedFiles() const return m_data.selectedFiles(); } - + +// Adding select-by-url for Windows file dialog. +QByteArray QWindowsFileDialogHelper::selectedRemoteContent() const +{ @@ -11666,7 +11695,7 @@ index 9211fd1..283aabd 100644 @@ -2036,6 +2146,12 @@ QList QWindowsXpFileDialogHelper::selectedFiles() const return m_data.selectedFiles(); } - + +// Adding select-by-url for Windows file dialog. +QByteArray QWindowsXpFileDialogHelper::selectedRemoteContent() const +{ @@ -11749,7 +11778,7 @@ index 3f3a6e7..f1cf176 100644 @@ -1200,6 +1200,15 @@ QList QFileDialogPrivate::userSelectedFiles() const return files; } - + +// Adding select-by-url for Windows file dialog. +QByteArray QFileDialogPrivate::userSelectedRemoteContent() const +{ @@ -11765,7 +11794,7 @@ index 3f3a6e7..f1cf176 100644 @@ -1267,6 +1276,14 @@ QStringList QFileDialog::selectedFiles() const return files; } - + +// Adding select-by-url for Windows file dialog. +QByteArray QFileDialog::selectedRemoteContent() const +{ @@ -11784,13 +11813,13 @@ index ffe49a2..4213206 100644 @@ -108,6 +108,9 @@ public: void selectFile(const QString &filename); QStringList selectedFiles() const; - + + // Adding select-by-url for Windows file dialog. + QByteArray selectedRemoteContent() const; + void selectUrl(const QUrl &url); QList selectedUrls() const; - + diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h index f610e46..ca71d55 100644 --- a/src/widgets/dialogs/qfiledialog_p.h @@ -11820,7 +11849,7 @@ index f610e46..ca71d55 100644 @@ -393,6 +401,14 @@ inline QList QFileDialogPrivate::selectedFiles_sys() const return QList(); } - + +// Adding select-by-url for Windows file dialog. +inline QByteArray QFileDialogPrivate::selectedRemoteContent_sys() const +{ @@ -11859,7 +11888,7 @@ index ebb2921..8119bad 100644 + qpa_sys->updateMenu(nullptr); } } - + diff --git a/src/widgets/widgets/qwidgetlinecontrol.cpp b/src/widgets/widgets/qwidgetlinecontrol.cpp index 436937b..fc7a843 100644 --- a/src/widgets/widgets/qwidgetlinecontrol.cpp @@ -11878,7 +11907,7 @@ index 436937b..fc7a843 100644 #endif @@ -1881,11 +1886,21 @@ void QWidgetLineControl::processKeyEvent(QKeyEvent* event) } - + // QTBUG-35734: ignore Ctrl/Ctrl+Shift; accept only AltGr (Alt+Ctrl) on German keyboards - if (unknown && !isReadOnly() - && event->modifiers() != Qt::ControlModifier diff --git a/Telegram/SourceFiles/application.cpp b/Telegram/SourceFiles/application.cpp index e7126a7d65..c5fc890e4d 100644 --- a/Telegram/SourceFiles/application.cpp +++ b/Telegram/SourceFiles/application.cpp @@ -174,12 +174,15 @@ void Application::socketError(QLocalSocket::LocalSocketError e) { } _localSocket.close(); +// Local server does not work in WinRT build. +#ifndef Q_OS_WINRT psCheckLocalSocket(_localServerName); if (!_localServer.listen(_localServerName)) { LOG(("Failed to start listening to %1 server, error %2").arg(_localServerName).arg(int(_localServer.serverError()))); return App::quit(); } +#endif // !Q_OS_WINRT #ifndef TDESKTOP_DISABLE_AUTOUPDATE if (!cNoStartUpdate() && checkReadyUpdate()) { diff --git a/Telegram/SourceFiles/logs.cpp b/Telegram/SourceFiles/logs.cpp index 0040b4f1b1..cdc88186e6 100644 --- a/Telegram/SourceFiles/logs.cpp +++ b/Telegram/SourceFiles/logs.cpp @@ -326,7 +326,11 @@ namespace Logs { moveOldDataFrom = initialWorkingDir; #endif // Q_OS_LINUX && !_DEBUG -#endif // Q_OS_MAC || Q_OS_LINUX +#elif defined Q_OS_WINRT // Q_OS_MAC || Q_OS_LINUX + } else { + cForceWorkingDir(psAppDataPath()); + workingDirChosen = true; +#endif // Q_OS_WINRT } LogsData = new LogsDataFields(); @@ -341,7 +345,10 @@ namespace Logs { } cForceWorkingDir(QDir(cWorkingDir()).absolutePath() + '/'); +// WinRT build requires the working dir to stay the same for plugin loading. +#ifndef Q_OS_WINRT QDir().setCurrent(cWorkingDir()); +#endif // !Q_OS_WINRT QDir().mkpath(cWorkingDir() + qstr("tdata")); Sandbox::WorkingDirReady(); diff --git a/Telegram/SourceFiles/ui/flatinput.cpp b/Telegram/SourceFiles/ui/flatinput.cpp index 465ff2dd3d..0a3d90f02f 100644 --- a/Telegram/SourceFiles/ui/flatinput.cpp +++ b/Telegram/SourceFiles/ui/flatinput.cpp @@ -31,6 +31,7 @@ namespace { class InputStyle : public QCommonStyle { public: InputStyle() { + setParent(QCoreApplication::instance()); } void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const { @@ -44,9 +45,29 @@ namespace { } return QCommonStyle::subElementRect(r, opt, widget); } + + static InputStyle *instance() { + if (!_instance) { + if (!QGuiApplication::instance()) { + return nullptr; + } + _instance = new InputStyle(); + } + return _instance; + } + + ~InputStyle() { + _instance = nullptr; + } + + private: + static InputStyle *_instance; + }; - InputStyle _flatInputStyle; - InputStyle _inputFieldStyle; + + template + InputStyle *InputStyle::_instance = nullptr; + } FlatInput::FlatInput(QWidget *parent, const style::flatInput &st, const QString &pholder, const QString &v) : QLineEdit(v, parent) @@ -76,7 +97,7 @@ FlatInput::FlatInput(QWidget *parent, const style::flatInput &st, const QString connect(this, SIGNAL(textEdited(const QString &)), this, SLOT(onTextEdited())); if (App::wnd()) connect(this, SIGNAL(selectionChanged()), App::wnd(), SLOT(updateGlobalMenu())); - setStyle(&_flatInputStyle); + setStyle(InputStyle::instance()); QLineEdit::setTextMargins(0, 0, 0, 0); setContentsMargins(0, 0, 0, 0); @@ -2018,7 +2039,7 @@ MaskedInputField::MaskedInputField(QWidget *parent, const style::InputField &st, connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(onTextEdited())); if (App::wnd()) connect(this, SIGNAL(selectionChanged()), App::wnd(), SLOT(updateGlobalMenu())); - setStyle(&_inputFieldStyle); + setStyle(InputStyle::instance()); QLineEdit::setTextMargins(0, 0, 0, 0); setContentsMargins(0, 0, 0, 0); diff --git a/Telegram/SourceFiles/ui/text/text.cpp b/Telegram/SourceFiles/ui/text/text.cpp index 3d0c46d378..2aaf88c84a 100644 --- a/Telegram/SourceFiles/ui/text/text.cpp +++ b/Telegram/SourceFiles/ui/text/text.cpp @@ -1470,7 +1470,6 @@ public: } return false; } else if (_p) { -#ifndef TDESKTOP_WINRT // temp QTextCharFormat format; QTextItemInt gf(glyphs.mid(glyphsStart, glyphsEnd - glyphsStart), &_e->fnt, engine.layoutData->string.unicode() + itemStart, @@ -1479,7 +1478,6 @@ public: gf.width = itemWidth; gf.justified = false; gf.initWithScriptItem(si); -#endif // !TDESKTOP_WINRT if (_localFrom + itemStart < _selection.to && _localFrom + itemEnd > _selection.from) { QFixed selX = x, selWidth = itemWidth; if (_localFrom + itemEnd > _selection.to || _localFrom + itemStart < _selection.from) { @@ -1520,9 +1518,7 @@ public: _p->fillRect(QRectF(selX.toReal(), _y + _yDelta, selWidth.toReal(), _fontHeight), _textStyle->selectBg->b); } -#ifndef TDESKTOP_WINRT // temp _p->drawTextItem(QPointF(x.toReal(), textY), gf); -#endif // !TDESKTOP_WINRT } x += itemWidth;