From f5e4c7f6483e7ea4b24782350debde05bc9bf842 Mon Sep 17 00:00:00 2001 From: alihanozturk Date: Tue, 1 Sep 2015 21:11:28 +0300 Subject: [PATCH] qt:add --- desktop/toolkit/qt/actions.py | 180 ++ desktop/toolkit/qt/files/CVE-2014-0190.patch | 32 + .../toolkit/qt/files/data/assistant.desktop | 136 ++ desktop/toolkit/qt/files/data/assistant.png | Bin 0 -> 15052 bytes .../toolkit/qt/files/data/designer.desktop | 132 ++ desktop/toolkit/qt/files/data/designer.png | Bin 0 -> 2302 bytes .../qt/files/data/hi128-app-qt4-logo.png | Bin 0 -> 16119 bytes .../qt/files/data/hi48-app-qt4-logo.png | Bin 0 -> 3307 bytes .../toolkit/qt/files/data/linguist.desktop | 128 ++ desktop/toolkit/qt/files/data/linguist.png | Bin 0 -> 14785 bytes .../qt/files/data/phonon-gstreamer.svg | 54 + .../toolkit/qt/files/data/qdbusviewer.desktop | 11 + .../toolkit/qt/files/data/qtconfig.desktop | 9 + desktop/toolkit/qt/files/data/qtdemo.desktop | 10 + .../qt/files/fedora/qt-cupsEnumDests.patch | 238 +++ ...everywhere-opensource-src-4.6.2-cups.patch | 84 + ...e-src-4.6.3-glib_eventloop_nullcheck.patch | 69 + ...ere-opensource-src-4.8.0-QTBUG-22037.patch | 41 + ...ource-src-4.8.0-tp-multilib-optflags.patch | 36 + ...ource-src-4.8.1-qt3support_debuginfo.patch | 10 + ...where-opensource-src-4.8.3-no_Werror.patch | 12 + ...8.4-qmake_pkgconfig_requires_private.patch | 16 + ...ere-opensource-src-4.8.5-QTBUG-14467.patch | 24 + ...ere-opensource-src-4.8.5-QTBUG-21900.patch | 84 + ...ere-opensource-src-4.8.5-QTBUG-35459.patch | 12 + ...here-opensource-src-4.8.5-QTBUG-4862.patch | 29 + ...re-opensource-src-4.8.5-mysql_config.patch | 19 + ....5-qgtkstyle_disable_gtk_theme_check.patch | 22 + ...-opensource-src-4.8.5-qt_plugin_path.patch | 19 + ...rce-src-4.8.5-tds_no_strict_aliasing.patch | 12 + ...re-opensource-src-4.8.5-uic_multilib.patch | 28 + ...ensource-src-4.8.5-webcore_debuginfo.patch | 16 + ...ere-opensource-src-4.8.6-QTBUG-34614.patch | 95 ++ ...ere-opensource-src-4.8.6-QTBUG-37380.patch | 64 + ...ere-opensource-src-4.8.6-QTBUG-38585.patch | 13 + ...rce-src-4.5.0-fix-qatomic-inline-asm.patch | 50 + ...source-src-4.5.1-enable_ft_lcdfilter.patch | 12 + desktop/toolkit/qt/files/mkspecs.patch | 54 + ...001-Don-t-crash-on-broken-GIF-images.patch | 42 + .../qt/files/opensuse/0180-window-role.diff | 96 ++ .../0188-fix-moc-parser-same-name-header.diff | 37 + .../0191-listview-alternate-row-colors.diff | 24 + .../opensuse/0195-compositing-properties.diff | 60 + ...nvalidate-tabbar-geometry-on-refresh.patch | 35 + .../qt/files/opensuse/QSystemTrayicon.diff | 1486 +++++++++++++++++ .../qt/files/opensuse/build-qvfb-tool.diff | 13 + ...ix-moc-from-choking-on-boost-headers.patch | 12 + .../fix_assistant_segfault_QTBUG-25324.patch | 14 + .../opensuse/handle-tga-files-properly.diff | 56 + .../files/opensuse/libqt4-libtool-nodate.diff | 13 + .../qt/files/opensuse/no-moc-date.diff | 26 + .../qt/files/opensuse/qatomic-generic.patch | 21 + .../qdbusconnection-no-warning-output.patch | 15 + .../qt/files/opensuse/qfatal-noreturn.diff | 12 + .../qlocale_icu-no-warning-output.patch | 61 + .../qt/files/opensuse/qt-debug-timer.diff | 26 + .../qt/files/opensuse/qt-never-strip.diff | 30 + .../files/opensuse/use-freetype-default.diff | 40 + desktop/toolkit/qt/files/turkish.patch.bz2 | Bin 0 -> 35990 bytes desktop/toolkit/qt/pspec.xml | 496 ++++++ desktop/toolkit/qt/translations.xml | 35 + 61 files changed, 4401 insertions(+) create mode 100644 desktop/toolkit/qt/actions.py create mode 100644 desktop/toolkit/qt/files/CVE-2014-0190.patch create mode 100644 desktop/toolkit/qt/files/data/assistant.desktop create mode 100644 desktop/toolkit/qt/files/data/assistant.png create mode 100644 desktop/toolkit/qt/files/data/designer.desktop create mode 100644 desktop/toolkit/qt/files/data/designer.png create mode 100644 desktop/toolkit/qt/files/data/hi128-app-qt4-logo.png create mode 100644 desktop/toolkit/qt/files/data/hi48-app-qt4-logo.png create mode 100644 desktop/toolkit/qt/files/data/linguist.desktop create mode 100644 desktop/toolkit/qt/files/data/linguist.png create mode 100644 desktop/toolkit/qt/files/data/phonon-gstreamer.svg create mode 100755 desktop/toolkit/qt/files/data/qdbusviewer.desktop create mode 100755 desktop/toolkit/qt/files/data/qtconfig.desktop create mode 100644 desktop/toolkit/qt/files/data/qtdemo.desktop create mode 100644 desktop/toolkit/qt/files/fedora/qt-cupsEnumDests.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.6.2-cups.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.6.3-glib_eventloop_nullcheck.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.0-QTBUG-22037.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.0-tp-multilib-optflags.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.1-qt3support_debuginfo.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.3-no_Werror.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.4-qmake_pkgconfig_requires_private.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-14467.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-21900.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-35459.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-4862.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-mysql_config.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-qgtkstyle_disable_gtk_theme_check.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-qt_plugin_path.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-tds_no_strict_aliasing.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-uic_multilib.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-webcore_debuginfo.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-34614.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-37380.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-38585.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-x11-opensource-src-4.5.0-fix-qatomic-inline-asm.patch create mode 100644 desktop/toolkit/qt/files/fedora/qt-x11-opensource-src-4.5.1-enable_ft_lcdfilter.patch create mode 100644 desktop/toolkit/qt/files/mkspecs.patch create mode 100644 desktop/toolkit/qt/files/opensuse/0001-Don-t-crash-on-broken-GIF-images.patch create mode 100644 desktop/toolkit/qt/files/opensuse/0180-window-role.diff create mode 100644 desktop/toolkit/qt/files/opensuse/0188-fix-moc-parser-same-name-header.diff create mode 100644 desktop/toolkit/qt/files/opensuse/0191-listview-alternate-row-colors.diff create mode 100644 desktop/toolkit/qt/files/opensuse/0195-compositing-properties.diff create mode 100644 desktop/toolkit/qt/files/opensuse/0225-invalidate-tabbar-geometry-on-refresh.patch create mode 100644 desktop/toolkit/qt/files/opensuse/QSystemTrayicon.diff create mode 100644 desktop/toolkit/qt/files/opensuse/build-qvfb-tool.diff create mode 100644 desktop/toolkit/qt/files/opensuse/fix-moc-from-choking-on-boost-headers.patch create mode 100644 desktop/toolkit/qt/files/opensuse/fix_assistant_segfault_QTBUG-25324.patch create mode 100644 desktop/toolkit/qt/files/opensuse/handle-tga-files-properly.diff create mode 100644 desktop/toolkit/qt/files/opensuse/libqt4-libtool-nodate.diff create mode 100644 desktop/toolkit/qt/files/opensuse/no-moc-date.diff create mode 100644 desktop/toolkit/qt/files/opensuse/qatomic-generic.patch create mode 100644 desktop/toolkit/qt/files/opensuse/qdbusconnection-no-warning-output.patch create mode 100644 desktop/toolkit/qt/files/opensuse/qfatal-noreturn.diff create mode 100644 desktop/toolkit/qt/files/opensuse/qlocale_icu-no-warning-output.patch create mode 100644 desktop/toolkit/qt/files/opensuse/qt-debug-timer.diff create mode 100644 desktop/toolkit/qt/files/opensuse/qt-never-strip.diff create mode 100644 desktop/toolkit/qt/files/opensuse/use-freetype-default.diff create mode 100644 desktop/toolkit/qt/files/turkish.patch.bz2 create mode 100644 desktop/toolkit/qt/pspec.xml create mode 100644 desktop/toolkit/qt/translations.xml diff --git a/desktop/toolkit/qt/actions.py b/desktop/toolkit/qt/actions.py new file mode 100644 index 0000000000..f7726b60db --- /dev/null +++ b/desktop/toolkit/qt/actions.py @@ -0,0 +1,180 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Licensed under the GNU General Public License, version 3. +# See the file http://www.gnu.org/licenses/gpl.txt + +from pisi.actionsapi import shelltools +from pisi.actionsapi import autotools +from pisi.actionsapi import pisitools +from pisi.actionsapi import qt4 +from pisi.actionsapi import get + +import os + +WorkDir = "qt-everywhere-opensource-src-%s" % get.srcVERSION().replace('_','-').replace('pre1', 'tp') + +qtbase = qt4.prefix +absoluteWorkDir = "%s/%s" % (get.workDIR(), WorkDir) +bindirQt4="/usr/lib/qt4/bin" + +def setup(): + pisitools.flags.add("-I/usr/include/gtk-2.0/gdk") + #make sure we don't use them + checkdeletepath="%s/qtbase/src/3rdparty" % absoluteWorkDir + for dir in ('libjpeg', 'freetype', 'libpng', 'zlib', "libtiff"): + if os.path.exists(checkdeletepath+dir): + shelltools.unlinkDir(checkdeletepath+dir) + + filteredCFLAGS = get.CFLAGS().replace("-g3", "-g") + filteredCXXFLAGS = get.CXXFLAGS().replace("-g3", "-g") + + vars = {"PISILINUX_CC" : get.CC() + (" -m32" if get.buildTYPE() == "emul32" else ""), + "PISILINUX_CXX": get.CXX() + (" -m32" if get.buildTYPE() == "emul32" else ""), + "PISILINUX_CFLAGS": filteredCFLAGS + (" -m32" if get.buildTYPE() == "emul32" else ""), + "PISILINUX_LDFLAGS": get.LDFLAGS() + (" -m32" if get.buildTYPE() == "emul32" else "")} + + for k, v in vars.items(): + pisitools.dosed("mkspecs/common/g++-base.conf", k, v) + pisitools.dosed("mkspecs/common/g++-unix.conf", k, v) + + shelltools.export("CFLAGS", filteredCFLAGS) + shelltools.export("CXXFLAGS", filteredCXXFLAGS) + #check that dosed commands without releated patches + pisitools.dosed("mkspecs/common/gcc-base-unix.conf", "\-Wl,\-rpath,") + pisitools.dosed("mkspecs/common/gcc-base.conf", "\-O2", filteredCFLAGS) + pisitools.dosed("mkspecs/common/gcc-base.conf", "^(QMAKE_LFLAGS\s+\+=)", r"\1 %s" % get.LDFLAGS()) + + if not get.buildTYPE() == "emul32": + #-no-pch makes build ccache-friendly + options = "-no-pch \ + -v \ + -stl \ + -fast \ + -qdbus \ + -qvfb \ + -glib \ + -no-sql-sqlite2 \ + -system-sqlite \ + -system-zlib \ + -system-libpng \ + -system-libjpeg \ + -system-libtiff \ + -system-libmng \ + -plugin-sql-sqlite \ + -plugin-sql-odbc \ + -plugin-sql-psql \ + -plugin-sql-ibase \ + -I/usr/include/firebird/ \ + -I/usr/include/postgresql/server/ \ + -release \ + -no-separate-debug-info \ + -phonon \ + -no-phonon-backend \ + -webkit \ + -no-rpath \ + -openssl-linked \ + -dbus-linked \ + -xmlpatterns \ + -opensource \ + -reduce-relocations \ + -prefix %s \ + -bindir %s \ + -libdir %s \ + -docdir %s \ + -examplesdir %s \ + -demosdir %s\ + -plugindir %s \ + -translationdir %s \ + -sysconfdir %s \ + -datadir %s \ + -importdir %s \ + -headerdir %s \ + -confirm-license " % (qt4.prefix, bindirQt4, qt4.libdir, qt4.docdir, qt4.examplesdir, qt4.demosdir, qt4.plugindir, qt4.translationdir, +qt4.sysconfdir, +qt4.datadir, qt4.importdir, qt4.includedir) + else: + pisitools.dosed("mkspecs/linux-g++-64/qmake.conf", "-m64", "-m32") + shelltools.export("LDFLAGS", "-m32 %s" % get.LDFLAGS()) + options = "-no-pch \ + -v \ + -prefix /usr \ + -libdir /usr/lib32 \ + -plugindir /usr/lib32/qt/plugins \ + -importdir /usr/lib32/qt/imports \ + -datadir /usr/share/qt \ + -translationdir /usr/share/qt/translations \ + -sysconfdir /etc \ + -system-sqlite \ + -no-phonon \ + -no-phonon-backend \ + -webkit \ + -graphicssystem raster \ + -openssl-linked \ + -nomake demos \ + -nomake examples \ + -nomake docs \ + -nomake tools \ + -optimized-qmake \ + -no-rpath \ + -dbus-linked \ + -reduce-relocations \ + -no-openvg \ + -confirm-license \ + -opensource " + + autotools.rawConfigure(options) + +def build(): + shelltools.export("LD_LIBRARY_PATH", "%s/lib:%s" % (get.curDIR(), get.ENV("LD_LIBRARY_PATH"))) + autotools.make() + +def install(): + if get.buildTYPE() == "emul32": + qt4.install("INSTALL_ROOT=%s32" % get.installDIR()) + shelltools.move("%s32/usr/lib32" % get.installDIR(), "%s/usr" % get.installDIR()) + return + + qt4.install() + pisitools.dodir(qt4.bindir) + + #Remove phonon, we use KDE's phonon but we have to build Qt with Phonon support for webkit and some other stuff + pisitools.remove("%s/libphonon*" % qt4.libdir) + pisitools.removeDir("%s/phonon" % qt4.includedir) + if shelltools.isDirectory("%s/%s/phonon_backend" % (get.installDIR(), qt4.plugindir)): + pisitools.removeDir("%s/phonon_backend" % qt4.plugindir) + pisitools.remove("%s/pkgconfig/phonon*" % qt4.libdir) + # Phonon 4.5 provides libphononwidgets.so file + pisitools.remove("%s/designer/libphononwidgets.so" % qt4.plugindir) + + #Remove lost /usr/tests directory + pisitools.removeDir("usr/tests") + + # Turkish translations + shelltools.export("LD_LIBRARY_PATH", "%s%s" % (get.installDIR(), qt4.libdir)) + shelltools.system("%s%s/lrelease l10n-tr/*.ts" % (get.installDIR(), bindirQt4)) + pisitools.insinto(qt4.translationdir, "l10n-tr/*.qm") + + # Fix all occurances of WorkDir in pc files + pisitools.dosed("%s%s/pkgconfig/*.pc" % (get.installDIR(), qt4.libdir), "%s/qt-x11-opensource-src-%s" % (get.workDIR(), get.srcVERSION()), qt4.prefix) + + #I hope qtchooser will manage this issue + for bin in shelltools.ls("%s/usr/lib/qt4/bin" % get.installDIR()): + pisitools.dosym("/usr/lib/qt4/bin/%s" % bin, "/usr/bin/%s-qt4" % bin) + + mkspecPath = "%s/mkspecs" % qtbase + + for root, dirs, files in os.walk("%s%s" % (get.installDIR(), qtbase)): + # Remove unnecessary spec files.. + if root.endswith(mkspecPath): + for dir in dirs: + if not dir.startswith("linux") and dir not in ["common","qws","features","default"]: + pisitools.removeDir(os.path.join(mkspecPath,dir)) + for name in files: + if name.endswith(".prl"): + pisitools.dosed(os.path.join(root, name), "^QMAKE_PRL_BUILD_DIR.*", "") + + # Remove useless image directory, images of HTML docs are in doc/html/images + pisitools.removeDir("%s/src" % qt4.docdir) + + pisitools.dodoc("changes-*", "LGPL_EXCEPTION.txt", "LICENSE.*", "README") diff --git a/desktop/toolkit/qt/files/CVE-2014-0190.patch b/desktop/toolkit/qt/files/CVE-2014-0190.patch new file mode 100644 index 0000000000..da0b69d163 --- /dev/null +++ b/desktop/toolkit/qt/files/CVE-2014-0190.patch @@ -0,0 +1,32 @@ +Don't crash on broken GIF images + +Broken GIF images could set invalid width and height +values inside the image, leading to Qt creating a null +QImage for it. In that case we need to abort decoding +the image and return an error. + +Initial patch by Rich Moore. + +Backport of Id82a4036f478bd6e49c402d6598f57e7e5bb5e1e from Qt 5 + +Task-number: QTBUG-38367 +Change-Id: I0680740018aaa8356d267b7af3f01fac3697312a +Security-advisory: CVE-2014-0190 + +diff -up qt-everywhere-opensource-src-4.8.6/src/gui/image/qgifhandler.cpp.QTBUG-38367 qt-everywhere-opensource-src-4.8.6/src/gui/image/qgifhandler.cpp +--- qt-everywhere-opensource-src-4.8.6/src/gui/image/qgifhandler.cpp.QTBUG-38367 2014-04-10 13:37:12.000000000 -0500 ++++ qt-everywhere-opensource-src-4.8.6/src/gui/image/qgifhandler.cpp 2014-04-24 15:58:54.515862458 -0500 +@@ -359,6 +359,13 @@ int QGIFFormat::decode(QImage *image, co + memset(bits, 0, image->byteCount()); + } + ++ // Check if the previous attempt to create the image failed. If it ++ // did then the image is broken and we should give up. ++ if (image->isNull()) { ++ state = Error; ++ return -1; ++ } ++ + disposePrevious(image); + disposed = false; + diff --git a/desktop/toolkit/qt/files/data/assistant.desktop b/desktop/toolkit/qt/files/data/assistant.desktop new file mode 100644 index 0000000000..55a65a8d3a --- /dev/null +++ b/desktop/toolkit/qt/files/data/assistant.desktop @@ -0,0 +1,136 @@ +[Desktop Entry] +Encoding=UTF-8 +Exec=/usr/lib/qt4/bin/assistant +Name=Qt4 Assistant +Name[af]=Qt4 Assistent +Name[ar]=معاون Qt4 +Name[az]=Qt4 Yardımçısı +Name[bn]=কিউ-টি সহায়ক +Name[br]=Skoazeller Qt4 +Name[bs]=Qt4 Asistent +Name[ca]=Assistent Qt4 +Name[cs]=Qt4 asistent +Name[cy]=Cymhorthwr Qt4 +Name[de]=Qt4-Assistent +Name[el]=Βοηθός Qt4 +Name[eo]=Qt4-Asistilo +Name[es]=Asistente Qt4 +Name[eu]=Qt4 laguntzailea +Name[fa]=دستیار Qt4 +Name[fo]=Qt4-hjálpari +Name[fy]=Qt4-assistent +Name[hi]=क्यूटी सहायक +Name[hr]=Qt4 Asistent +Name[hsb]=Qt4 Asistent +Name[ja]=Qt4 アシスタント +Name[km]=អ្នក​ជំនួយការ Qt4 +Name[ko]=Qt4 도우미 +Name[lo]=ຄຳແນະນຳການໃ້ຊ້Qt4 +Name[lv]=Qt4 Asistents +Name[mk]=Qt4-Асистент +Name[mn]=Qt4-туслагч +Name[ms]=Pembantu Qt4 +Name[nds]=Qt4-Hölper +Name[nl]=Qt4 Assistent +Name[nso]=Mothusi wa Qt4 +Name[pa]=Qt4 ਸਹਾਇਕ +Name[pt]=Assistente do Qt4 +Name[pt_BR]=Assistente Qt4 +Name[ro]=Asistent Qt4 +Name[ru]=Помощник Qt4 +Name[rw]=Umufasha Qt4 +Name[sl]=Pomočnik za Qt4 +Name[ss]=Lisekela leQt4 +Name[ta]=Qt4 துணைவன் +Name[tg]=Дастёри Qt4 +Name[th]=คำแนะนำการใช้ Qt4 +Name[tr]=Qt4 Asistanı +Name[uk]=Qt4-асистент +Name[uz]=Qt43 ёрдамчи +Name[ven]=Qt4 Muthusi +Name[vi]=Trợ giúp Qt4 +Name[wa]=Macrea Qt4 +Name[xh]=Qt4 Umncedi +Name[zh_CN]=Qt4 助手 +Name[zh_TW]=Qt4 助理 +Name[zu]=Umsizi we-Qt4 +GenericName=Document Browser +GenericName[af]=Dokument Blaaier +GenericName[ar]=متصفح المستندات +GenericName[az]=Sənəd Səyyahı +GenericName[bg]=Преглед на документи +GenericName[bn]=নথী ব্রাউজার +GenericName[br]=Furcher Teulioù +GenericName[bs]=Preglednik QT dokumenata +GenericName[ca]=Navegador de documents +GenericName[cs]=Prohlížeč dokumentace +GenericName[cy]=Porydd Dogfen +GenericName[da]=Dokumentfremviser +GenericName[de]=Dokumentbrowser +GenericName[el]=Προβολέας εγγράφων +GenericName[eo]=Dokumentorigardilo +GenericName[es]=Navegador de documentos +GenericName[et]=Dokumentatsiooni brauser +GenericName[eu]=Dokumentu arakatzailea +GenericName[fa]=مرورگر سند +GenericName[fi]=Asiakirjaselain +GenericName[fo]=Skjalakagari +GenericName[fr]=Explorateur de documentation Qt4 +GenericName[fy]=Dokumintblêder +GenericName[ga]=Brabhsálaí Cáipéise +GenericName[gl]=Navegador de Documentos +GenericName[he]=דפדפן מסמכים +GenericName[hi]=दस्तावेज़ ब्राउज़रज़र +GenericName[hr]=Preglednik dokumenata +GenericName[hu]=Dokumentumböngésző +GenericName[id]=Peselancar Document +GenericName[is]=Skjalavafri +GenericName[it]=Visualizzatore di documenti +GenericName[ja]=ドキュメントブラウザ +GenericName[km]=កម្មវិធី​រុករក​ឯកសារ +GenericName[ko]=문서 탐색기 +GenericName[lo]=ເຄື່ອງມືເລືອກເບິ່ງແຟ້ມເອກະສານ +GenericName[lt]=Dokumentų naršyklė +GenericName[lv]=Dokumentu Pārlūks +GenericName[mk]=Прелистувач на документи +GenericName[mn]=Баримтын хөтөч +GenericName[ms]=Pelungsur Dokumen +GenericName[mt]=Browser ta' Dokumenti +GenericName[nb]=Dokumentleser +GenericName[nds]=Dokmentkieker +GenericName[nl]=Documentbrowser +GenericName[nn]=Dokumentlesar +GenericName[nso]=Seinyakisi sa Tokomane +GenericName[pa]=ਦਸਤਾਵੇਜ਼ ਝਲਕਾਰਾ +GenericName[pl]=Przeglądarka dokumentów +GenericName[pt]=Navegador de Documentos +GenericName[pt_BR]=Navegador de Documentos +GenericName[ro]=Navigator de documente +GenericName[ru]=Программа просмотра документов +GenericName[rw]=Mucukumbuzi w'Inyandiko +GenericName[se]=Dokumeantalogan +GenericName[sk]=Prehliadač dokumentácie +GenericName[sl]=Pregledovalnik dokumentov +GenericName[sr]=Прегледач докумената +GenericName[sr@Latn]=Pregledač dokumenata +GenericName[ss]=Ibrawuza yelidokhumente +GenericName[sv]=Dokumentbläddrare +GenericName[ta]=ஆவண உலாவி +GenericName[tg]=Тафсири ҳуҷҷат +GenericName[th]=เครื่องมือเลือกดูแฟ้มเอกสาร +GenericName[tr]=Belge Tarayıcısı +GenericName[tt]=İstälek Küzätüçe +GenericName[uk]=Навігатор документів +GenericName[uz]=Ҳужжат браузери +GenericName[ven]=Buronza ya manwalwa +GenericName[vi]=Trình duyệt tài liệu +GenericName[wa]=Foyteu di documints +GenericName[xh]=Umkhangeli Wencwadi Zoxwebhu +GenericName[zh_CN]=文档浏览器 +GenericName[zh_TW]=文件閱讀器 +GenericName[zu]=Umcingi Woshicilelo +X-KDE-StartupNotify=true +Icon=assistant +Terminal=false +Type=Application +Categories=Qt;Development; diff --git a/desktop/toolkit/qt/files/data/assistant.png b/desktop/toolkit/qt/files/data/assistant.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb642dc2d1718109dd71b4cd5b1ba38d916450b GIT binary patch literal 15052 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 Y1ppbD4msK+4FCWD07*qoM6N<$f=8TF?EnA( literal 0 HcmV?d00001 diff --git a/desktop/toolkit/qt/files/data/hi128-app-qt4-logo.png b/desktop/toolkit/qt/files/data/hi128-app-qt4-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b8f8263bbe8af00a6f368dfd092b28bdd3c1c20c GIT binary patch literal 16119 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 literal 0 HcmV?d00001 diff --git a/desktop/toolkit/qt/files/data/linguist.desktop b/desktop/toolkit/qt/files/data/linguist.desktop new file mode 100644 index 0000000000..223d18a749 --- /dev/null +++ b/desktop/toolkit/qt/files/data/linguist.desktop @@ -0,0 +1,128 @@ +[Desktop Entry] +Encoding=UTF-8 +Exec=/usr/lib/qt4/bin/linguist +Name=Qt4 Linguist +Name[ar]=لغوي Qt4 +Name[bn]=কিউ-টি লিঙ্গুইস্ট +Name[ca]=Lingüista Qt4 +Name[cy]=Ieithydd Qt4 +Name[de]=Qt4-Linguist +Name[eo]=Qt4-Lingvisto +Name[es]=Lingüista Qt4 +Name[fa]=Qt4 زبان‌شناس +Name[fi]=Qt4 Linquist +Name[fy]=Qt4 Linquist +Name[gl]=Lingüista Qt4 +Name[hi]=क्यूटी लिंग्विस्ट +Name[hr]=Qt4 Lingvist +Name[km]=ភាសាវិទូ Qt4 +Name[ko]=Qt4 언어학자 +Name[lo]=ແປພາສາຂອງ Qt4 +Name[lv]=Qt4 Lingvists +Name[mk]=Qt4-Јазичар +Name[mn]=Qt4-Хэл зүй +Name[ms]=Jurubahasa Qt4 +Name[mt]=Lingwist Qt4 +Name[nb]=Qt4-Linguist +Name[nds]=Qt4-Linguist +Name[nl]=Qt4 Linquist +Name[nso]=Sekaleleme sa Qt4 +Name[pa]=Qt4 ਲੈਂਗੂਇਸਟ +Name[pl]=Lingwista Qt4 +Name[ru]=Qt4 Лингвист +Name[rw]=Byindimi Qt4 +Name[sl]=Jezikoslovec Qt4 +Name[sv]=Qt4 linguist +Name[ta]=Qt4 மொழியறிஞர் +Name[tg]=Забони Qt4 +Name[th]=แปลภาษาของ Qt4 +Name[tr]=Qt4 Dilci +Name[tt]=Qt4 Telbelgeç +Name[uk]=Qt4-лінгвіст +Name[uz]=Qt4 лингвист +Name[ven]=Qt4 Radzinyambo +Name[vi]=Ngôn ngữ Qt4 +Name[xh]=Usolwimi we Qt4 +Name[zh_CN]=Qt4 语言家 +Name[zh_TW]=Qt4 語言學家 +Name[zu]=Owozolimi we-Qt4 +GenericName=Translation Tool +GenericName[af]=Vertaling Program +GenericName[ar]=أداة للترجمة +GenericName[az]=Tərcümə Vasitəsi +GenericName[bn]=অনুবাদ টুল +GenericName[br]=Ostilh troidigezh +GenericName[bs]=Alat za prevođenje +GenericName[ca]=Eina de traducció +GenericName[cs]=Překladatelský nástroj +GenericName[cy]=Erfyn Cyfieithu +GenericName[da]=Oversættelsesværktøj +GenericName[de]=Übersetzungsprogramm +GenericName[el]=Εργαλείο μεταφράσεων +GenericName[eo]=Tradukilo por Qt4-programoj +GenericName[es]=Herramienta de traducción +GenericName[et]=Tõlkimise rakendus +GenericName[eu]=Itzulpenerako tresnak +GenericName[fa]=ابزار ترجمه +GenericName[fi]=Käännöstyökalu +GenericName[fo]=Umsetingaramboð +GenericName[fr]=Outil de traduction +GenericName[fy]=Fertaalprogramma +GenericName[ga]=Uirlis Aistriúcháin +GenericName[gl]=Ferramenta de Tradución +GenericName[he]=כלי תרגום +GenericName[hi]=अनुवाद औज़ार +GenericName[hr]=Alat za prevođenje +GenericName[hsb]=Grat za přełožowanje +GenericName[hu]=Fordítássegítő +GenericName[id]=Kakas Penerjemah +GenericName[is]=Þýðingartól +GenericName[it]=Strumento per le traduzioni +GenericName[ja]=翻訳ツール +GenericName[km]=កម្មវិធី​បកប្រែ +GenericName[ko]=번역 도구 +GenericName[lo]=ເຄື່ອງມືແປພາສາ +GenericName[lt]=Vertimo įrankis +GenericName[lv]=Tulkošanas Rīks +GenericName[mk]=Алатка за преведување +GenericName[mn]=Орчуулгын програм +GenericName[ms]=Perkakasan Penterjemahan +GenericName[mt]=Għodda tat-traduzzjoni +GenericName[nb]=Oversettelsesverktøy +GenericName[nds]=Warktüüch för't Översetten +GenericName[nl]=Vertaalprogramma +GenericName[nn]=Omsetjingsverktøy +GenericName[nso]=Sebereka sa Thlathollo +GenericName[pa]=ਅਨੁਵਾਦ ਸੰਦ +GenericName[pl]=Narzędzie dla tłumaczy +GenericName[pt]=Ferramenta de Tradução +GenericName[pt_BR]=Ferramenta de Tradução +GenericName[ro]=Utilitar de traducere +GenericName[ru]=Переводчик для Qt4 +GenericName[se]=Jorgalanreaidu +GenericName[sk]=Prekladací nástroj +GenericName[sl]=Orodje za prevajanje +GenericName[sr]=Алат за превођење +GenericName[sr@Latn]=Alat za prevođenje +GenericName[ss]=Lithulusi lekuhumusha +GenericName[sv]=Översättningsverktyg +GenericName[ta]=மொழிபெயர்ப்புக் கருவி +GenericName[tg]=Тарҷумагар барои QT +GenericName[th]=เครื่องมือแปลภาษา +GenericName[tr]=Çeviri Aracı +GenericName[tt]=Tärcemäläw Qoralı +GenericName[uk]=Засіб для перекладів +GenericName[uz]=Таржима қилиш воситаси +GenericName[ven]=Zwishumiswa zwau Dologa +GenericName[vi]=Công cụ dịch +GenericName[wa]=Usteye di ratournaedje +GenericName[xh]=Isixhobo Soguqulelo lomsebenzi kolunye ulwimi +GenericName[zh_CN]=翻译工具 +GenericName[zh_TW]=翻譯工具 +GenericName[zu]=Ithuluzi Lokuguqulela +X-KDE-StartupNotify=true +MimeType=application/x-linguist; +Terminal=false +Type=Application +Icon=linguist +Categories=Qt;Development; diff --git a/desktop/toolkit/qt/files/data/linguist.png b/desktop/toolkit/qt/files/data/linguist.png new file mode 100644 index 0000000000000000000000000000000000000000..47c9f17a4f91ed41a17a794a31479f090ed64fb3 GIT binary patch literal 14785 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 + + + +]> + + + + + + + + + + + + + + diff --git a/desktop/toolkit/qt/files/data/qdbusviewer.desktop b/desktop/toolkit/qt/files/data/qdbusviewer.desktop new file mode 100755 index 0000000000..d1b05715d0 --- /dev/null +++ b/desktop/toolkit/qt/files/data/qdbusviewer.desktop @@ -0,0 +1,11 @@ +#!/usr/bin/env xdg-open +[Desktop Entry] +Name=Qt4 QDbusViewer +GenericName=D-Bus Debugger +Comment=Debug D-Bus applications +Exec=/usr/lib/qt4/bin/qdbusviewer +Icon=qdbusviewer +Terminal=false +Type=Application +Categories=Qt;Development;Debugger; + diff --git a/desktop/toolkit/qt/files/data/qtconfig.desktop b/desktop/toolkit/qt/files/data/qtconfig.desktop new file mode 100755 index 0000000000..3f461f8e22 --- /dev/null +++ b/desktop/toolkit/qt/files/data/qtconfig.desktop @@ -0,0 +1,9 @@ +#!/usr/bin/env xdg-open +[Desktop Entry] +Name=Qt4 Config +Comment=Configure Qt4 behavior, styles, fonts +Exec=/usr/lib/qt4/bin/qtconfig +Icon=qt4-logo +Terminal=false +Type=Application +Categories=Qt;Settings; diff --git a/desktop/toolkit/qt/files/data/qtdemo.desktop b/desktop/toolkit/qt/files/data/qtdemo.desktop new file mode 100644 index 0000000000..1f0b5baa0e --- /dev/null +++ b/desktop/toolkit/qt/files/data/qtdemo.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Qt4 Demo +Comment=Show Qt4 demos and programming examples +Comment[tr]=Qt4 demolarını ve programlama örneklerini göster +Exec=/usr/lib/qt4/bin/qtdemo +Icon=qt4-logo +Terminal=false +Encoding=UTF-8 +Type=Application +Categories=Qt;Development; diff --git a/desktop/toolkit/qt/files/fedora/qt-cupsEnumDests.patch b/desktop/toolkit/qt/files/fedora/qt-cupsEnumDests.patch new file mode 100644 index 0000000000..7d59f22e8d --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-cupsEnumDests.patch @@ -0,0 +1,238 @@ +diff -up qt-everywhere-opensource-src-4.8.4/src/gui/painting/qcups.cpp.cupsEnumDests qt-everywhere-opensource-src-4.8.4/src/gui/painting/qcups.cpp +--- qt-everywhere-opensource-src-4.8.4/src/gui/painting/qcups.cpp.cupsEnumDests 2012-11-23 10:09:53.000000000 +0000 ++++ qt-everywhere-opensource-src-4.8.4/src/gui/painting/qcups.cpp 2013-07-03 15:30:06.232936976 +0100 +@@ -50,9 +50,19 @@ + + QT_BEGIN_NAMESPACE + ++typedef int (*CupsEnumDests)(unsigned flags, int msec, int *cancel, ++ cups_ptype_t type, cups_ptype_t mask, ++ cups_dest_cb_t cb, void *user_data); ++typedef http_t * (*CupsConnectDest)(cups_dest_t *dest, unsigned flags, ++ int msec, int *cancel, ++ char *resource, size_t resourcesize, ++ cups_dest_cb_t cb, void *user_data); ++typedef int (*CupsCopyDest)(cups_dest_t *dest, int num_dests, ++ cups_dest_t **dests); + typedef int (*CupsGetDests)(cups_dest_t **dests); + typedef void (*CupsFreeDests)(int num_dests, cups_dest_t *dests); + typedef const char* (*CupsGetPPD)(const char *printer); ++typedef const char* (*CupsGetPPD2)(http_t *http, const char *printer); + typedef int (*CupsMarkOptions)(ppd_file_t *ppd, int num_options, cups_option_t *options); + typedef ppd_file_t* (*PPDOpenFile)(const char *filename); + typedef void (*PPDMarkDefaults)(ppd_file_t *ppd); +@@ -66,12 +76,24 @@ typedef const char* (*CupsLangEncoding)( + typedef int (*CupsAddOption)(const char *name, const char *value, int num_options, cups_option_t **options); + typedef int (*CupsTempFd)(char *name, int len); + typedef int (*CupsPrintFile)(const char * name, const char * filename, const char * title, int num_options, cups_option_t * options); ++typedef int (*CupsPrintFile2)(http_t *http, const char *name, const char *filename, const char *title, int num_options, cups_option_t *options); ++ ++typedef struct ++{ ++ cups_dest_t *printers; ++ int num_printers; ++} EnumDestsContext; + + static bool cupsLoaded = false; + static int qt_cups_num_printers = 0; ++static cups_dest_t *qt_cups_printers = 0; ++static CupsEnumDests _cupsEnumDests = 0; ++static CupsConnectDest _cupsConnectDest = 0; ++static CupsCopyDest _cupsCopyDest = 0; + static CupsGetDests _cupsGetDests = 0; + static CupsFreeDests _cupsFreeDests = 0; + static CupsGetPPD _cupsGetPPD = 0; ++static CupsGetPPD2 _cupsGetPPD2 = 0; + static PPDOpenFile _ppdOpenFile = 0; + static PPDMarkDefaults _ppdMarkDefaults = 0; + static PPDClose _ppdClose = 0; +@@ -84,14 +106,35 @@ static CupsLangEncoding _cupsLangEncodin + static CupsAddOption _cupsAddOption = 0; + static CupsTempFd _cupsTempFd = 0; + static CupsPrintFile _cupsPrintFile = 0; ++static CupsPrintFile2 _cupsPrintFile2 = 0; ++ ++static int enum_dest_cb (void *user_data, unsigned flags, cups_dest_t *dest) ++{ ++ EnumDestsContext *context = (EnumDestsContext *) user_data; ++ ++ if ((flags & (CUPS_DEST_FLAGS_UNCONNECTED | ++ CUPS_DEST_FLAGS_REMOVED | ++ CUPS_DEST_FLAGS_ERROR | ++ CUPS_DEST_FLAGS_RESOLVING | ++ CUPS_DEST_FLAGS_CONNECTING | ++ CUPS_DEST_FLAGS_CANCELED)) == 0) ++ context->num_printers = _cupsCopyDest (dest, context->num_printers, ++ &context->printers); ++ ++ return 1; ++} + + static void resolveCups() + { + QLibrary cupsLib(QLatin1String("cups"), 2); + if(cupsLib.load()) { ++ _cupsEnumDests = (CupsEnumDests) cupsLib.resolve("cupsEnumDests"); ++ _cupsConnectDest = (CupsConnectDest) cupsLib.resolve("cupsConnectDest"); ++ _cupsCopyDest = (CupsCopyDest) cupsLib.resolve("cupsCopyDest"); + _cupsGetDests = (CupsGetDests) cupsLib.resolve("cupsGetDests"); + _cupsFreeDests = (CupsFreeDests) cupsLib.resolve("cupsFreeDests"); + _cupsGetPPD = (CupsGetPPD) cupsLib.resolve("cupsGetPPD"); ++ _cupsGetPPD2 = (CupsGetPPD2) cupsLib.resolve("cupsGetPPD2"); + _cupsLangGet = (CupsLangGet) cupsLib.resolve("cupsLangGet"); + _cupsLangEncoding = (CupsLangEncoding) cupsLib.resolve("cupsLangEncoding"); + _ppdOpenFile = (PPDOpenFile) cupsLib.resolve("ppdOpenFile"); +@@ -104,14 +147,27 @@ static void resolveCups() + _cupsAddOption = (CupsAddOption) cupsLib.resolve("cupsAddOption"); + _cupsTempFd = (CupsTempFd) cupsLib.resolve("cupsTempFd"); + _cupsPrintFile = (CupsPrintFile) cupsLib.resolve("cupsPrintFile"); ++ _cupsPrintFile2 = (CupsPrintFile2) cupsLib.resolve("cupsPrintFile2"); + +- if (_cupsGetDests && _cupsFreeDests) { +- cups_dest_t *printers; ++ if (_cupsEnumDests && _cupsCopyDest && ++ _cupsConnectDest && _cupsGetPPD2 && ++ _cupsPrintFile2) { ++ EnumDestsContext context; ++ context.printers = 0; ++ context.num_printers = 0; ++ _cupsEnumDests(0, -1, 0, 0, 0, ++ enum_dest_cb, &context); ++ ++ qt_cups_printers = context.printers; ++ qt_cups_num_printers = context.num_printers; ++ } else if (_cupsGetDests && _cupsFreeDests) { ++ cups_dest_t *printers; + int num_printers = _cupsGetDests(&printers); +- if (num_printers) +- _cupsFreeDests(num_printers, printers); +- qt_cups_num_printers = num_printers; +- } ++ ++ if (num_printers) ++ _cupsFreeDests(num_printers, printers); ++ qt_cups_num_printers = num_printers; ++ } + } + cupsLoaded = true; + } +@@ -134,7 +190,15 @@ QCUPSSupport::QCUPSSupport() + return; + + // Update the available printer count +- qt_cups_num_printers = prnCount = _cupsGetDests(&printers); ++ if (qt_cups_printers && _cupsCopyDest) { ++ int i; ++ for (i = 0; i < qt_cups_num_printers; ++i) { ++ prnCount = _cupsCopyDest (&qt_cups_printers[i], ++ prnCount, ++ &printers); ++ } ++ } else ++ qt_cups_num_printers = prnCount = _cupsGetDests(&printers); + + for (int i = 0; i < prnCount; ++i) { + if (printers[i].is_default) { +@@ -188,7 +252,19 @@ const ppd_file_t* QCUPSSupport::setCurre + currPPD = 0; + page_sizes = 0; + +- const char *ppdFile = _cupsGetPPD(printers[index].name); ++ const char *ppdFile = 0; ++ if (_cupsConnectDest && _cupsGetPPD2) { ++ char resource[HTTP_MAX_URI]; ++ http_t *http = _cupsConnectDest (&printers[index], 0, -1, 0, ++ resource, sizeof (resource), ++ 0, 0); ++ if (http) { ++ char *name = strrchr (resource, '/'); ++ if (name) ++ ppdFile = _cupsGetPPD2 (http, ++name); ++ } ++ } else ++ ppdFile = _cupsGetPPD(printers[index].name); + + if (!ppdFile) + return 0; +@@ -343,7 +419,29 @@ bool QCUPSSupport::printerHasPPD(const c + { + if (!isAvailable()) + return false; +- const char *ppdFile = _cupsGetPPD(printerName); ++ ++ const char *ppdFile = 0; ++ if (_cupsConnectDest && _cupsGetPPD2) { ++ int i; ++ for (i = 0; i < prnCount; ++i) ++ if (!strcmp (printers[i].name, printerName)) ++ break; ++ ++ if (i == prnCount) ++ return false; ++ ++ char resource[HTTP_MAX_URI]; ++ http_t *http = _cupsConnectDest (&printers[i], 0, -1, 0, ++ resource, sizeof (resource), ++ 0, 0); ++ if (http) { ++ char *name = strrchr (resource, '/'); ++ if (name) ++ ppdFile = _cupsGetPPD2 (http, ++name); ++ } ++ } else ++ ppdFile = _cupsGetPPD(printerName); ++ + if (ppdFile) + unlink(ppdFile); + return (ppdFile != 0); +@@ -394,6 +492,26 @@ QPair QCUPSSupport::tempFd + int QCUPSSupport::printFile(const char * printerName, const char * filename, const char * title, + int num_options, cups_option_t * options) + { ++ if (_cupsConnectDest && _cupsPrintFile2) { ++ int i; ++ for (i = 0; i < prnCount; ++i) ++ if (!strcmp (printers[i].name, printerName)) ++ break; ++ ++ if (i != prnCount) { ++ char resource[HTTP_MAX_URI]; ++ http_t *http = _cupsConnectDest (&printers[i], 0, -1, 0, ++ resource, sizeof (resource), ++ 0, 0); ++ if (http) { ++ char *name = strrchr (resource, '/'); ++ if (name) ++ return _cupsPrintFile2 (http, ++name, filename, title, ++ num_options, options); ++ } ++ } ++ } ++ + return _cupsPrintFile(printerName, filename, title, num_options, options); + } + +diff -up qt-everywhere-opensource-src-4.8.4/src/gui/painting/qcups_p.h.cupsEnumDests qt-everywhere-opensource-src-4.8.4/src/gui/painting/qcups_p.h +--- qt-everywhere-opensource-src-4.8.4/src/gui/painting/qcups_p.h.cupsEnumDests 2012-11-23 10:09:53.000000000 +0000 ++++ qt-everywhere-opensource-src-4.8.4/src/gui/painting/qcups_p.h 2013-07-03 15:27:24.733343017 +0100 +@@ -92,7 +92,7 @@ public: + + QStringList options() const; + +- static bool printerHasPPD(const char *printerName); ++ bool printerHasPPD(const char *printerName); + + QString unicodeString(const char *s); + +diff -up qt-everywhere-opensource-src-4.8.4/src/gui/painting/qprinter.cpp.cupsEnumDests qt-everywhere-opensource-src-4.8.4/src/gui/painting/qprinter.cpp +--- qt-everywhere-opensource-src-4.8.4/src/gui/painting/qprinter.cpp.cupsEnumDests 2013-07-03 15:27:24.531342277 +0100 ++++ qt-everywhere-opensource-src-4.8.4/src/gui/painting/qprinter.cpp 2013-07-03 15:27:24.733343017 +0100 +@@ -844,7 +844,7 @@ void QPrinter::setPrinterName(const QStr + if(d->use_default_engine + && d->outputFormat == QPrinter::NativeFormat) { + if (QCUPSSupport::cupsVersion() >= 10200 +- && QCUPSSupport::printerHasPPD(name.toLocal8Bit().constData())) ++ && QCUPSSupport().printerHasPPD(name.toLocal8Bit().constData())) + setOutputFormat(QPrinter::PdfFormat); + else + setOutputFormat(QPrinter::PostScriptFormat); diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.6.2-cups.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.6.2-cups.patch new file mode 100644 index 0000000000..e0305e11b8 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.6.2-cups.patch @@ -0,0 +1,84 @@ +diff -ur qt-everywhere-opensource-src-4.6.2/src/gui/dialogs/qprintdialog_unix.cpp qt-everywhere-opensource-src-4.6.2-cups/src/gui/dialogs/qprintdialog_unix.cpp +--- qt-everywhere-opensource-src-4.6.2/src/gui/dialogs/qprintdialog_unix.cpp 2010-02-11 16:55:22.000000000 +0100 ++++ qt-everywhere-opensource-src-4.6.2-cups/src/gui/dialogs/qprintdialog_unix.cpp 2010-02-28 04:34:16.000000000 +0100 +@@ -569,6 +569,32 @@ + void QPrintDialogPrivate::selectPrinter(QCUPSSupport *cups) + { + options.duplex->setEnabled(cups && cups->ppdOption("Duplex")); ++ ++ if (cups) { ++ const ppd_option_t* duplex = cups->ppdOption("Duplex"); ++ if (duplex) { ++ // copy default ppd duplex to qt dialog ++ if (qstrcmp(duplex->defchoice, "DuplexTumble") == 0) ++ options.duplexShort->setChecked(true); ++ else if (qstrcmp(duplex->defchoice, "DuplexNoTumble") == 0) ++ options.duplexLong->setChecked(true); ++ else ++ options.noDuplex->setChecked(true); ++ } ++ ++ if (cups->currentPPD()) { ++ // set default color ++ if (cups->currentPPD()->color_device) ++ options.color->setChecked(true); ++ else ++ options.grayscale->setChecked(true); ++ } ++ ++ // set collation ++ const ppd_option_t *collate = cups->ppdOption("Collate"); ++ if (collate) ++ options.collate->setChecked(qstrcmp(collate->defchoice, "True")==0); ++ } + } + #endif + +diff -ur qt-everywhere-opensource-src-4.6.2/src/gui/painting/qprinter.cpp qt-everywhere-opensource-src-4.6.2-cups/src/gui/painting/qprinter.cpp +--- qt-everywhere-opensource-src-4.6.2/src/gui/painting/qprinter.cpp 2010-02-11 16:55:22.000000000 +0100 ++++ qt-everywhere-opensource-src-4.6.2-cups/src/gui/painting/qprinter.cpp 2010-02-28 04:55:15.000000000 +0100 +@@ -627,6 +627,44 @@ + && d_ptr->paintEngine->type() != QPaintEngine::MacPrinter) { + setOutputFormat(QPrinter::PdfFormat); + } ++ ++#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) ++ // fill in defaults from ppd file ++ QCUPSSupport cups; ++ ++ int printernum = -1; ++ for (int i = 0; i < cups.availablePrintersCount(); i++) { ++ if (printerName().toLocal8Bit() == cups.availablePrinters()[i].name) ++ printernum = i; ++ } ++ if (printernum >= 0) { ++ cups.setCurrentPrinter(printernum); ++ ++ const ppd_option_t* duplex = cups.ppdOption("Duplex"); ++ if (duplex) { ++ // copy default ppd duplex to qt dialog ++ if (qstrcmp(duplex->defchoice, "DuplexTumble") == 0) ++ setDuplex(DuplexShortSide); ++ else if (qstrcmp(duplex->defchoice, "DuplexNoTumble") == 0) ++ setDuplex(DuplexLongSide); ++ else ++ setDuplex(DuplexNone); ++ } ++ ++ if (cups.currentPPD()) { ++ // set default color ++ if (cups.currentPPD()->color_device) ++ setColorMode(Color); ++ else ++ setColorMode(GrayScale); ++ } ++ ++ // set collation ++ const ppd_option_t *collate = cups.ppdOption("Collate"); ++ if (collate) ++ setCollateCopies(qstrcmp(collate->defchoice, "True")==0); ++ } ++#endif + } + + /*! diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.6.3-glib_eventloop_nullcheck.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.6.3-glib_eventloop_nullcheck.patch new file mode 100644 index 0000000000..d4e5924dff --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.6.3-glib_eventloop_nullcheck.patch @@ -0,0 +1,69 @@ +diff -ur qt-everywhere-opensource-src-4.6.3/src/gui/kernel/qguieventdispatcher_glib.cpp qt-everywhere-opensource-src-4.6.3-glib_eventloop_nullcheck/src/gui/kernel/qguieventdispatcher_glib.cpp +--- qt-everywhere-opensource-src-4.6.3/src/gui/kernel/qguieventdispatcher_glib.cpp 2010-06-02 04:03:15.000000000 +0200 ++++ qt-everywhere-opensource-src-4.6.3-glib_eventloop_nullcheck/src/gui/kernel/qguieventdispatcher_glib.cpp 2010-12-08 22:22:38.000000000 +0100 +@@ -76,7 +76,7 @@ + GX11EventSource *source = reinterpret_cast(s); + return (XEventsQueued(X11->display, QueuedAfterFlush) + || (!(source->flags & QEventLoop::ExcludeUserInputEvents) +- && !source->d->queuedUserInputEvents.isEmpty())); ++ && source->d && !source->d->queuedUserInputEvents.isEmpty())); + } + + static gboolean x11EventSourceCheck(GSource *s) +@@ -84,7 +84,7 @@ + GX11EventSource *source = reinterpret_cast(s); + return (XEventsQueued(X11->display, QueuedAfterFlush) + || (!(source->flags & QEventLoop::ExcludeUserInputEvents) +- && !source->d->queuedUserInputEvents.isEmpty())); ++ && source->d && !source->d->queuedUserInputEvents.isEmpty())); + } + + static gboolean x11EventSourceDispatch(GSource *s, GSourceFunc callback, gpointer user_data) +@@ -95,7 +95,7 @@ + do { + XEvent event; + if (!(source->flags & QEventLoop::ExcludeUserInputEvents) +- && !source->d->queuedUserInputEvents.isEmpty()) { ++ && source->d && !source->d->queuedUserInputEvents.isEmpty()) { + // process a pending user input event + event = source->d->queuedUserInputEvents.takeFirst(); + } else if (XEventsQueued(X11->display, QueuedAlready)) { +@@ -112,7 +112,8 @@ + case XKeyRelease: + case EnterNotify: + case LeaveNotify: +- source->d->queuedUserInputEvents.append(event); ++ if (source->d) ++ source->d->queuedUserInputEvents.append(event); + continue; + + case ClientMessage: +@@ -127,7 +128,8 @@ + break; + } + } +- source->d->queuedUserInputEvents.append(event); ++ if (source->d) ++ source->d->queuedUserInputEvents.append(event); + continue; + + default: +@@ -140,7 +142,7 @@ + } + + // send through event filter +- if (source->q->filterEvent(&event)) ++ if (source->q && source->q->filterEvent(&event)) + continue; + + if (qApp->x11ProcessEvent(&event) == 1) +@@ -152,7 +154,8 @@ + + out: + +- source->d->runTimersOnceWithNormalPriority(); ++ if (source->d) ++ source->d->runTimersOnceWithNormalPriority(); + + if (callback) + callback(user_data); diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.0-QTBUG-22037.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.0-QTBUG-22037.patch new file mode 100644 index 0000000000..4279ce2e77 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.0-QTBUG-22037.patch @@ -0,0 +1,41 @@ +diff -up qt-everywhere-opensource-src-4.8.0/src/corelib/tools/qlist.h.QTBUG-22037 qt-everywhere-opensource-src-4.8.0/src/corelib/tools/qlist.h +--- qt-everywhere-opensource-src-4.8.0/src/corelib/tools/qlist.h.QTBUG-22037 2011-10-03 22:44:32.000000000 -0500 ++++ qt-everywhere-opensource-src-4.8.0/src/corelib/tools/qlist.h 2011-10-15 14:25:52.238694974 -0500 +@@ -769,26 +769,18 @@ Q_OUTOFLINE_TEMPLATE void QList::clea + template + Q_OUTOFLINE_TEMPLATE int QList::removeAll(const T &_t) + { +- int index = indexOf(_t); +- if (index == -1) +- return 0; +- ++ detachShared(); + const T t = _t; +- detach(); +- +- Node *i = reinterpret_cast(p.at(index)); +- Node *e = reinterpret_cast(p.end()); +- Node *n = i; +- node_destruct(i); +- while (++i != e) { +- if (i->t() == t) +- node_destruct(i); +- else +- *n++ = *i; +- } +- +- int removedCount = e - n; +- d->end -= removedCount; ++ int removedCount=0, i=0; ++ Node *n; ++ while (i < p.size()) ++ if ((n = reinterpret_cast(p.at(i)))->t() == t) { ++ node_destruct(n); ++ p.remove(i); ++ ++removedCount; ++ } else { ++ ++i; ++ } + return removedCount; + } + diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.0-tp-multilib-optflags.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.0-tp-multilib-optflags.patch new file mode 100644 index 0000000000..5c8b5a1dda --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.0-tp-multilib-optflags.patch @@ -0,0 +1,36 @@ +diff -up qt-everywhere-opensource-src-4.8.0-tp/mkspecs/linux-g++-32/qmake.conf.multilib qt-everywhere-opensource-src-4.8.0-tp/mkspecs/linux-g++-32/qmake.conf +--- qt-everywhere-opensource-src-4.8.0-tp/mkspecs/linux-g++-32/qmake.conf.multilib 2011-05-23 12:26:21.000000000 +0200 ++++ qt-everywhere-opensource-src-4.8.0-tp/mkspecs/linux-g++-32/qmake.conf 2011-05-25 13:39:38.789054074 +0200 +@@ -12,6 +12,8 @@ QMAKE_INCREMENTAL_STYLE = sublib + QMAKE_CFLAGS = -m32 + QMAKE_LFLAGS = -m32 + ++QMAKE_CFLAGS_RELEASE += -O2 ++ + include(../common/linux.conf) + include(../common/gcc-base-unix.conf) + include(../common/g++-unix.conf) +diff -up qt-everywhere-opensource-src-4.8.0-tp/mkspecs/linux-g++-64/qmake.conf.multilib qt-everywhere-opensource-src-4.8.0-tp/mkspecs/linux-g++-64/qmake.conf +--- qt-everywhere-opensource-src-4.8.0-tp/mkspecs/linux-g++-64/qmake.conf.multilib 2011-05-23 12:26:21.000000000 +0200 ++++ qt-everywhere-opensource-src-4.8.0-tp/mkspecs/linux-g++-64/qmake.conf 2011-05-25 13:39:47.460747770 +0200 +@@ -15,6 +15,8 @@ QMAKE_INCREMENTAL_STYLE = sublib + QMAKE_CFLAGS = -m64 + QMAKE_LFLAGS = -m64 + ++QMAKE_CFLAGS_RELEASE += -O2 ++ + include(../common/linux.conf) + include(../common/gcc-base-unix.conf) + include(../common/g++-unix.conf) +diff -up qt-everywhere-opensource-src-4.8.0-tp/mkspecs/linux-g++/qmake.conf.multilib qt-everywhere-opensource-src-4.8.0-tp/mkspecs/linux-g++/qmake.conf +--- qt-everywhere-opensource-src-4.8.0-tp/mkspecs/linux-g++/qmake.conf.multilib 2011-05-23 12:26:21.000000000 +0200 ++++ qt-everywhere-opensource-src-4.8.0-tp/mkspecs/linux-g++/qmake.conf 2011-05-25 13:39:26.630088814 +0200 +@@ -9,6 +9,8 @@ CONFIG += qt warn_on release increment + QT += core gui + QMAKE_INCREMENTAL_STYLE = sublib + ++QMAKE_CFLAGS_RELEASE += -O2 ++ + include(../common/linux.conf) + include(../common/gcc-base-unix.conf) + include(../common/g++-unix.conf) diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.1-qt3support_debuginfo.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.1-qt3support_debuginfo.patch new file mode 100644 index 0000000000..7458314672 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.1-qt3support_debuginfo.patch @@ -0,0 +1,10 @@ +diff -up qt-everywhere-opensource-src-4.8.1/src/qt3support/qt3support.pro.debuginfo qt-everywhere-opensource-src-4.8.1/src/qt3support/qt3support.pro +--- qt-everywhere-opensource-src-4.8.1/src/qt3support/qt3support.pro.debuginfo 2012-03-14 09:01:17.000000000 -0500 ++++ qt-everywhere-opensource-src-4.8.1/src/qt3support/qt3support.pro 2012-05-11 11:55:37.780070386 -0500 +@@ -34,6 +34,3 @@ MOCDIR = .moc + + *-g++*: QMAKE_CXXFLAGS += -fno-strict-aliasing + +-CONFIG -= separate_debug_info +-CONFIG += no_debug_info +- diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.3-no_Werror.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.3-no_Werror.patch new file mode 100644 index 0000000000..86dcc288d5 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.3-no_Werror.patch @@ -0,0 +1,12 @@ +diff -up qt-everywhere-opensource-src-4.8.3/src/3rdparty/webkit/Source/WebKit.pri.no_Werror qt-everywhere-opensource-src-4.8.3/src/3rdparty/webkit/Source/WebKit.pri +--- qt-everywhere-opensource-src-4.8.3/src/3rdparty/webkit/Source/WebKit.pri.no_Werror 2012-09-06 02:33:50.000000000 -0500 ++++ qt-everywhere-opensource-src-4.8.3/src/3rdparty/webkit/Source/WebKit.pri 2012-09-11 09:03:19.152159783 -0500 +@@ -102,7 +102,7 @@ CONFIG -= warn_on + + # Treat warnings as errors on x86/Linux/GCC + linux-g++* { +- !CONFIG(standalone_package):if(isEqual(QT_ARCH,x86_64)|isEqual(QT_ARCH,i386)): QMAKE_CXXFLAGS += -Werror ++ #!CONFIG(standalone_package):if(isEqual(QT_ARCH,x86_64)|isEqual(QT_ARCH,i386)): QMAKE_CXXFLAGS += -Werror + + greaterThan(QT_GCC_MAJOR_VERSION, 3):greaterThan(QT_GCC_MINOR_VERSION, 5) { + if (!contains(QMAKE_CXXFLAGS, -std=c++0x) && !contains(QMAKE_CXXFLAGS, -std=gnu++0x)) { diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.4-qmake_pkgconfig_requires_private.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.4-qmake_pkgconfig_requires_private.patch new file mode 100644 index 0000000000..0494c81f06 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.4-qmake_pkgconfig_requires_private.patch @@ -0,0 +1,16 @@ +diff -up qt-everywhere-opensource-src-4.8.4/qmake/generators/makefile.cpp.qmake_pkgconfig_requires_private qt-everywhere-opensource-src-4.8.4/qmake/generators/makefile.cpp +--- qt-everywhere-opensource-src-4.8.4/qmake/generators/makefile.cpp.qmake_pkgconfig_requires_private 2012-11-23 04:11:21.000000000 -0600 ++++ qt-everywhere-opensource-src-4.8.4/qmake/generators/makefile.cpp 2013-02-11 07:36:36.192779528 -0600 +@@ -3293,6 +3293,12 @@ MakefileGenerator::writePkgConfigFile() + t << "Requires: " << requires << endl; + } + ++ // requires.private ++ const QString requires_private = project->values("QMAKE_PKGCONFIG_REQUIRES_PRIVATE").join(" "); ++ if (!requires_private.isEmpty()) { ++ t << "Requires.private: " << requires_private << endl; ++ } ++ + t << endl; + } + diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-14467.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-14467.patch new file mode 100644 index 0000000000..81d74ff4d5 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-14467.patch @@ -0,0 +1,24 @@ +diff -up qt-everywhere-opensource-src-4.8.5/mkspecs/features/qt_functions.prf.QTBUG-14467 qt-everywhere-opensource-src-4.8.5/mkspecs/features/qt_functions.prf +--- qt-everywhere-opensource-src-4.8.5/mkspecs/features/qt_functions.prf.QTBUG-14467 2013-05-30 16:19:17.000000000 -0500 ++++ qt-everywhere-opensource-src-4.8.5/mkspecs/features/qt_functions.prf 2013-06-09 11:53:45.709773603 -0500 +@@ -72,7 +72,7 @@ defineTest(qtAddLibrary) { + } + isEmpty(LINKAGE) { + if(!debug_and_release|build_pass):CONFIG(debug, debug|release) { +- win32:LINKAGE = -l$${LIB_NAME}$${QT_LIBINFIX}d ++ win32:LINKAGE = -l$${LIB_NAME}d$${QT_LIBINFIX} + mac:LINKAGE = -l$${LIB_NAME}$${QT_LIBINFIX}_debug + } + isEmpty(LINKAGE):LINKAGE = -l$${LIB_NAME}$${QT_LIBINFIX} +diff -up qt-everywhere-opensource-src-4.8.5/mkspecs/features/win32/windows.prf.QTBUG-14467 qt-everywhere-opensource-src-4.8.5/mkspecs/features/win32/windows.prf +--- qt-everywhere-opensource-src-4.8.5/mkspecs/features/win32/windows.prf.QTBUG-14467 2013-05-30 16:19:17.000000000 -0500 ++++ qt-everywhere-opensource-src-4.8.5/mkspecs/features/win32/windows.prf 2013-06-09 11:53:45.710773593 -0500 +@@ -6,7 +6,7 @@ contains(TEMPLATE, ".*app"){ + + qt:for(entryLib, $$list($$unique(QMAKE_LIBS_QT_ENTRY))) { + isEqual(entryLib, -lqtmain): { +- CONFIG(debug, debug|release): QMAKE_LIBS += $${entryLib}$${QT_LIBINFIX}d ++ CONFIG(debug, debug|release): QMAKE_LIBS += $${entryLib}d$${QT_LIBINFIX} + else: QMAKE_LIBS += $${entryLib}$${QT_LIBINFIX} + } else { + QMAKE_LIBS += $${entryLib} diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-21900.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-21900.patch new file mode 100644 index 0000000000..018872f6d4 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-21900.patch @@ -0,0 +1,84 @@ +diff -up qt-everywhere-opensource-src-4.8.5/src/gui/kernel/qapplication_x11.cpp.QTBUG-21900 qt-everywhere-opensource-src-4.8.5/src/gui/kernel/qapplication_x11.cpp +--- qt-everywhere-opensource-src-4.8.5/src/gui/kernel/qapplication_x11.cpp.QTBUG-21900 2013-05-30 16:18:05.000000000 -0500 ++++ qt-everywhere-opensource-src-4.8.5/src/gui/kernel/qapplication_x11.cpp 2013-06-09 11:53:45.891771748 -0500 +@@ -818,6 +818,27 @@ static Bool qt_sync_request_scanner(Disp + #endif + #endif // QT_NO_XSYNC + ++struct qt_configure_event_data ++{ ++ WId window; ++ WId parent; ++}; ++ ++static Bool qt_configure_event_scanner(Display*, XEvent *event, XPointer arg) ++{ ++ qt_configure_event_data *data = ++ reinterpret_cast(arg); ++ if (event->type == ConfigureNotify && ++ event->xconfigure.window == data->window) { ++ return true; ++ } else if (event->type == ReparentNotify && ++ event->xreparent.window == data->window) { ++ data->parent = event->xreparent.parent; ++ } ++ ++ return false; ++} ++ + static void qt_x11_create_intern_atoms() + { + const char *names[QX11Data::NAtoms]; +@@ -5302,8 +5323,11 @@ bool QETWidget::translateConfigEvent(con + if (d->extra->compress_events) { + // ConfigureNotify compression for faster opaque resizing + XEvent otherEvent; +- while (XCheckTypedWindowEvent(X11->display, internalWinId(), ConfigureNotify, +- &otherEvent)) { ++ qt_configure_event_data configureData; ++ configureData.window = internalWinId(); ++ configureData.parent = d->topData()->parentWinId; ++ while (XCheckIfEvent(X11->display, &otherEvent, ++ &qt_configure_event_scanner, (XPointer)&configureData)) { + if (qt_x11EventFilter(&otherEvent)) + continue; + +@@ -5316,13 +5340,19 @@ bool QETWidget::translateConfigEvent(con + newSize.setWidth(otherEvent.xconfigure.width); + newSize.setHeight(otherEvent.xconfigure.height); + ++ trust = isVisible() ++ && (configureData.parent == XNone || ++ configureData.parent == QX11Info::appRootWindow()); ++ + if (otherEvent.xconfigure.send_event || trust) { + newCPos.rx() = otherEvent.xconfigure.x + + otherEvent.xconfigure.border_width; + newCPos.ry() = otherEvent.xconfigure.y + + otherEvent.xconfigure.border_width; + isCPos = true; +- } ++ } else { ++ isCPos = false; ++ } + } + #ifndef QT_NO_XSYNC + qt_sync_request_event_data sync_event; +@@ -5335,9 +5365,14 @@ bool QETWidget::translateConfigEvent(con + } + + if (!isCPos) { +- // we didn't get an updated position of the toplevel. +- // either we haven't moved or there is a bug in the window manager. +- // anyway, let's query the position to be certain. ++ // If the last configure event didn't have a trustable position, ++ // it's necessary to query, see ICCCM 4.24: ++ // ++ // Any real ConfigureNotify event on a top-level window implies ++ // that the window’s position on the root may have changed, even ++ // though the event reports that the window’s position in its ++ // parent is unchanged because the window may have been reparented. ++ + int x, y; + Window child; + XTranslateCoordinates(X11->display, internalWinId(), diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-35459.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-35459.patch new file mode 100644 index 0000000000..dede8324d5 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-35459.patch @@ -0,0 +1,12 @@ +diff -ur qt-everywhere-opensource-src-4.8.5-CVE-2013-4549/src/xml/sax/qxml.cpp qt-everywhere-opensource-src-4.8.5-QTBUG-35459/src/xml/sax/qxml.cpp +--- qt-everywhere-opensource-src-4.8.5-CVE-2013-4549/src/xml/sax/qxml.cpp 2013-12-05 19:23:33.000000000 +0100 ++++ qt-everywhere-opensource-src-4.8.5-QTBUG-35459/src/xml/sax/qxml.cpp 2014-01-13 20:13:59.000000000 +0100 +@@ -428,7 +428,7 @@ + // for the DTD currently being parsed. + static const int dtdRecursionLimit = 2; + // The maximum amount of characters an entity value may contain, after expansion. +- static const int entityCharacterLimit = 1024; ++ static const int entityCharacterLimit = 65536; + + const QString &string(); + void stringClear(); diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-4862.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-4862.patch new file mode 100644 index 0000000000..ee1d19136a --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-4862.patch @@ -0,0 +1,29 @@ +diff -up qt-everywhere-opensource-src-4.8.5/src/corelib/io/qfilesystemengine_unix.cpp.QTBUG-4862 qt-everywhere-opensource-src-4.8.5/src/corelib/io/qfilesystemengine_unix.cpp +--- qt-everywhere-opensource-src-4.8.5/src/corelib/io/qfilesystemengine_unix.cpp.QTBUG-4862 2013-06-09 12:02:50.323221694 -0500 ++++ qt-everywhere-opensource-src-4.8.5/src/corelib/io/qfilesystemengine_unix.cpp 2013-06-09 12:38:53.140804742 -0500 +@@ -624,6 +624,25 @@ QString QFileSystemEngine::homePath() + { + QString home = QFile::decodeName(qgetenv("HOME")); + if (home.isEmpty()) ++ { ++#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD) ++ int size_max = sysconf(_SC_GETPW_R_SIZE_MAX); ++ if (size_max == -1) ++ size_max = 1024; ++ QVarLengthArray buf(size_max); ++#endif ++ struct passwd *pw = 0; ++ uid_t user_id = getuid(); ++ pw = getpwuid(user_id); ++#if !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_OPENBSD) ++ struct passwd entry; ++ getpwuid_r(user_id, &entry, buf.data(), buf.size(), &pw); ++#else ++ pw = getpwuid(user_id); ++#endif ++ home = QFile::decodeName(QByteArray(pw->pw_dir)); ++ } ++ if (home.isEmpty()) + home = rootPath(); + return QDir::cleanPath(home); + } diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-mysql_config.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-mysql_config.patch new file mode 100644 index 0000000000..fc0ee7670b --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-mysql_config.patch @@ -0,0 +1,19 @@ +diff -up qt-everywhere-opensource-src-4.8.5/configure.mysql_config qt-everywhere-opensource-src-4.8.5/configure +--- qt-everywhere-opensource-src-4.8.5/configure.mysql_config 2013-06-07 00:16:41.000000000 -0500 ++++ qt-everywhere-opensource-src-4.8.5/configure 2014-03-07 10:09:27.412071146 -0600 +@@ -5480,8 +5480,15 @@ for _SQLDR in $CFG_SQL_AVAILABLE; do + [ -z "$CFG_MYSQL_CONFIG" ] && CFG_MYSQL_CONFIG=`"$WHICH" mysql_config` + if [ -x "$CFG_MYSQL_CONFIG" ]; then + QT_CFLAGS_MYSQL=`$CFG_MYSQL_CONFIG --include 2>/dev/null` ++ $CFG_MYSQL_CONFIG --variable=pkglibdir &>/dev/null && \ ++ QT_MYSQL_PKGLIBDIR=`$CFG_MYSQL_CONFIG --variable=pkglibdir 2>/dev/null` ++ if [ -n "$QT_MYSQL_PKGLIBDIR" ]; then ++ QT_LFLAGS_MYSQL_R="-L$QT_MYSQL_PKGLIBDIR -lmysqlclient_r" ++ QT_LFLAGS_MYSQL="-L$QT_MYSQL_PKGLIBDIR -lmysqlclient" ++ else + QT_LFLAGS_MYSQL_R=`$CFG_MYSQL_CONFIG --libs_r 2>/dev/null` + QT_LFLAGS_MYSQL=`$CFG_MYSQL_CONFIG --libs 2>/dev/null` ++ fi + QT_MYSQL_VERSION=`$CFG_MYSQL_CONFIG --version 2>/dev/null` + QT_MYSQL_VERSION_MAJOR=`echo $QT_MYSQL_VERSION | cut -d . -f 1` + fi diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-qgtkstyle_disable_gtk_theme_check.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-qgtkstyle_disable_gtk_theme_check.patch new file mode 100644 index 0000000000..9a9f773537 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-qgtkstyle_disable_gtk_theme_check.patch @@ -0,0 +1,22 @@ +diff -up qt-everywhere-opensource-src-4.8.5/src/gui/styles/qgtkstyle_p.cpp.qgtkstyle_disable_gtk_theme_check qt-everywhere-opensource-src-4.8.5/src/gui/styles/qgtkstyle_p.cpp +--- qt-everywhere-opensource-src-4.8.5/src/gui/styles/qgtkstyle_p.cpp.qgtkstyle_disable_gtk_theme_check 2013-06-09 16:28:22.938840346 -0500 ++++ qt-everywhere-opensource-src-4.8.5/src/gui/styles/qgtkstyle_p.cpp 2013-06-09 17:03:01.781125479 -0500 +@@ -503,18 +503,6 @@ void QGtkStylePrivate::initGtkWidgets() + return; + } + +- static QString themeName; +- if (!gtkWidgetMap()->contains("GtkWindow") && themeName.isEmpty()) { +- themeName = getThemeName(); +- +- if (themeName == QLS("Qt") || themeName == QLS("Qt4")) { +- // Due to namespace conflicts with Qt3 and obvious recursion with Qt4, +- // we cannot support the GTK_Qt Gtk engine +- qWarning("QGtkStyle cannot be used together with the GTK_Qt engine."); +- return; +- } +- } +- + if (QGtkStylePrivate::gtk_init) { + // Gtk will set the Qt error handler so we have to reset it afterwards + x11ErrorHandler qt_x_errhandler = XSetErrorHandler(0); diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-qt_plugin_path.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-qt_plugin_path.patch new file mode 100644 index 0000000000..6a87783e3a --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-qt_plugin_path.patch @@ -0,0 +1,19 @@ +diff -up qt-everywhere-opensource-src-4.8.5/src/corelib/kernel/qcoreapplication.cpp.qt_plugin_path qt-everywhere-opensource-src-4.8.5/src/corelib/kernel/qcoreapplication.cpp +--- qt-everywhere-opensource-src-4.8.5/src/corelib/kernel/qcoreapplication.cpp.qt_plugin_path 2013-06-07 00:16:52.000000000 -0500 ++++ qt-everywhere-opensource-src-4.8.5/src/corelib/kernel/qcoreapplication.cpp 2013-06-21 07:14:10.045039936 -0500 +@@ -2511,6 +2511,15 @@ QStringList QCoreApplication::libraryPat + if (!app_libpaths->contains(installPathPlugins)) + app_libpaths->append(installPathPlugins); + } ++ ++ // hack in support for kde4 plugin paths -- Rex ++ QString kde4PathPlugins = QLibraryInfo::location(QLibraryInfo::LibrariesPath) + QLatin1String("/kde4/plugins"); ++ if (QFile::exists(kde4PathPlugins)) { ++ // Make sure we convert from backslashes to slashes. ++ //kde4PathPlugins = QDir(kde4PathPlugins).canonicalPath(); ++ if (!app_libpaths->contains(kde4PathPlugins)) ++ app_libpaths->append(kde4PathPlugins); ++ } + #endif + + // If QCoreApplication is not yet instantiated, diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-tds_no_strict_aliasing.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-tds_no_strict_aliasing.patch new file mode 100644 index 0000000000..2deeb51bbf --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-tds_no_strict_aliasing.patch @@ -0,0 +1,12 @@ +diff -up qt-everywhere-opensource-src-4.8.5/src/sql/drivers/tds/qsql_tds.pri.tds_no_strict_aliasing qt-everywhere-opensource-src-4.8.5/src/sql/drivers/tds/qsql_tds.pri +--- qt-everywhere-opensource-src-4.8.5/src/sql/drivers/tds/qsql_tds.pri.tds_no_strict_aliasing 2013-06-09 11:57:49.198291245 -0500 ++++ qt-everywhere-opensource-src-4.8.5/src/sql/drivers/tds/qsql_tds.pri 2013-06-09 12:01:24.120100371 -0500 +@@ -1,6 +1,8 @@ + HEADERS += $$PWD/qsql_tds.h + SOURCES += $$PWD/qsql_tds.cpp + ++*-g++*: QMAKE_CXXFLAGS += -fno-strict-aliasing ++ + unix|win32-g++*: { + LIBS += $$QT_LFLAGS_TDS + !contains(LIBS, .*sybdb.*):LIBS += -lsybdb diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-uic_multilib.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-uic_multilib.patch new file mode 100644 index 0000000000..d04d1be5af --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-uic_multilib.patch @@ -0,0 +1,28 @@ +diff -up qt-everywhere-opensource-src-4.8.5/src/tools/moc/moc.cpp.uic_multilib qt-everywhere-opensource-src-4.8.5/src/tools/moc/moc.cpp +diff -up qt-everywhere-opensource-src-4.8.5/src/tools/uic3/embed.cpp.uic_multilib qt-everywhere-opensource-src-4.8.5/src/tools/uic3/embed.cpp +--- qt-everywhere-opensource-src-4.8.5/src/tools/uic3/embed.cpp.uic_multilib 2013-05-30 16:18:04.000000000 -0500 ++++ qt-everywhere-opensource-src-4.8.5/src/tools/uic3/embed.cpp 2013-06-09 11:50:25.597813974 -0500 +@@ -152,8 +152,7 @@ void Ui3Reader::embed(const char *projec + for ( it = images.begin(); it != images.end(); ++it ) + out << "** " << *it << "\n"; + out << "**\n"; +- out << "** Created: " << QDateTime::currentDateTime().toString() << "\n"; +- out << "** by: The User Interface Compiler for Qt version " << QT_VERSION_STR << "\n"; ++ out << "** Created: by: The User Interface Compiler for Qt version " << QT_VERSION_STR << "\n"; + out << "**\n"; + out << "** WARNING! All changes made in this file will be lost!\n"; + out << "****************************************************************************/\n"; +diff -up qt-everywhere-opensource-src-4.8.5/src/tools/uic3/uic.cpp.uic_multilib qt-everywhere-opensource-src-4.8.5/src/tools/uic3/uic.cpp +--- qt-everywhere-opensource-src-4.8.5/src/tools/uic3/uic.cpp.uic_multilib 2013-05-30 16:18:04.000000000 -0500 ++++ qt-everywhere-opensource-src-4.8.5/src/tools/uic3/uic.cpp 2013-06-09 11:51:28.310174526 -0500 +@@ -146,8 +146,7 @@ void Uic::writeCopyrightHeader(DomUI *ui + out << "/********************************************************************************\n"; + out << "** Form generated from reading UI file '" << QFileInfo(opt.inputFile).fileName() << "'\n"; + out << "**\n"; +- out << "** Created: " << QDateTime::currentDateTime().toString() << "\n"; +- out << "** " << QString::fromLatin1("by: Qt User Interface Compiler version %1\n").arg(QLatin1String(QT_VERSION_STR)); ++ out << "** Created by: " << QString::fromLatin1("Qt User Interface Compiler version %1\n").arg(QLatin1String(QT_VERSION_STR)); + out << "**\n"; + out << "** WARNING! All changes made in this file will be lost when recompiling UI file!\n"; + out << "********************************************************************************/\n\n"; +diff -up qt-everywhere-opensource-src-4.8.5/src/tools/uic/uic.cpp.uic_multilib qt-everywhere-opensource-src-4.8.5/src/tools/uic/uic.cpp diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-webcore_debuginfo.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-webcore_debuginfo.patch new file mode 100644 index 0000000000..1ea8af2b0e --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.5-webcore_debuginfo.patch @@ -0,0 +1,16 @@ +diff -up qt-everywhere-opensource-src-4.8.5/src/3rdparty/webkit/Source/WebCore/WebCore.pri.webkit_debuginfo qt-everywhere-opensource-src-4.8.5/src/3rdparty/webkit/Source/WebCore/WebCore.pri +--- qt-everywhere-opensource-src-4.8.5/src/3rdparty/webkit/Source/WebCore/WebCore.pri.webkit_debuginfo 2013-06-07 00:16:55.000000000 -0500 ++++ qt-everywhere-opensource-src-4.8.5/src/3rdparty/webkit/Source/WebCore/WebCore.pri 2013-07-11 14:04:19.937056249 -0500 +@@ -5,6 +5,12 @@ include(features.pri) + + # Uncomment this to enable Texture Mapper. + # CONFIG += texmap ++# ++equals(QT_ARCH, s390)|equals(QT_ARCH, arm)|equals(QT_ARCH, mips)|equals(QT_ARCH, i386)|equals(QT_ARCH, i686)|equals(QT_ARCH, x86_64)|equals(QT_ARCH, powerpc64)|equals(QT_ARCH, powerpc) { ++ message("WebCore workaround for QtWebkit: do not build with -g, but with -g1") ++ QMAKE_CXXFLAGS_RELEASE -= -g ++ QMAKE_CXXFLAGS_RELEASE += -g1 ++} + + QT *= network + diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-34614.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-34614.patch new file mode 100644 index 0000000000..8b0468bb66 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-34614.patch @@ -0,0 +1,95 @@ +--- src/corelib/kernel/qeventdispatcher_glib.cpp.sav 2014-03-28 15:26:37.000000000 +0100 ++++ qt-everywhere-opensource-src-4.8.6/src/corelib/kernel/qeventdispatcher_glib.cpp 2014-04-24 09:44:09.358659204 +0200 +@@ -255,22 +255,30 @@ struct GPostEventSource + GSource source; + QAtomicInt serialNumber; + int lastSerialNumber; ++ QEventLoop::ProcessEventsFlags processEventsFlags; + QEventDispatcherGlibPrivate *d; + }; + + static gboolean postEventSourcePrepare(GSource *s, gint *timeout) + { ++ GPostEventSource *source = reinterpret_cast(s); + QThreadData *data = QThreadData::current(); + if (!data) + return false; + ++ QEventLoop::ProcessEventsFlags excludeAllFlags ++ = QEventLoop::ExcludeUserInputEvents ++ | QEventLoop::ExcludeSocketNotifiers ++ | QEventLoop::X11ExcludeTimers; ++ if ((source->processEventsFlags & excludeAllFlags) == excludeAllFlags) ++ return false; ++ + gint dummy; + if (!timeout) + timeout = &dummy; + const bool canWait = data->canWaitLocked(); + *timeout = canWait ? -1 : 0; + +- GPostEventSource *source = reinterpret_cast(s); + return (!canWait + || (source->serialNumber != source->lastSerialNumber)); + } +@@ -284,8 +292,14 @@ static gboolean postEventSourceDispatch( + { + GPostEventSource *source = reinterpret_cast(s); + source->lastSerialNumber = source->serialNumber; +- QCoreApplication::sendPostedEvents(); +- source->d->runTimersOnceWithNormalPriority(); ++ QEventLoop::ProcessEventsFlags excludeAllFlags ++ = QEventLoop::ExcludeUserInputEvents ++ | QEventLoop::ExcludeSocketNotifiers ++ | QEventLoop::X11ExcludeTimers; ++ if ((source->processEventsFlags & excludeAllFlags) != excludeAllFlags) { ++ QCoreApplication::sendPostedEvents(); ++ source->d->runTimersOnceWithNormalPriority(); ++ } + return true; // i dunno, george... + } + +@@ -329,6 +343,7 @@ QEventDispatcherGlibPrivate::QEventDispa + postEventSource = reinterpret_cast(g_source_new(&postEventSourceFuncs, + sizeof(GPostEventSource))); + postEventSource->serialNumber = 1; ++ postEventSource->processEventsFlags = QEventLoop::AllEvents; + postEventSource->d = this; + g_source_set_can_recurse(&postEventSource->source, true); + g_source_attach(&postEventSource->source, mainContext); +@@ -423,6 +438,7 @@ bool QEventDispatcherGlib::processEvents + + // tell postEventSourcePrepare() and timerSource about any new flags + QEventLoop::ProcessEventsFlags savedFlags = d->timerSource->processEventsFlags; ++ d->postEventSource->processEventsFlags = flags; + d->timerSource->processEventsFlags = flags; + d->socketNotifierSource->processEventsFlags = flags; + +@@ -435,6 +451,7 @@ bool QEventDispatcherGlib::processEvents + while (!result && canWait) + result = g_main_context_iteration(d->mainContext, canWait); + ++ d->postEventSource->processEventsFlags = savedFlags; + d->timerSource->processEventsFlags = savedFlags; + d->socketNotifierSource->processEventsFlags = savedFlags; + +--- src/corelib/kernel/qeventdispatcher_unix.cpp.sav 2013-06-07 07:16:52.000000000 +0200 ++++ qt-everywhere-opensource-src-4.8.6/src/corelib/kernel/qeventdispatcher_unix.cpp 2014-04-24 09:43:06.927589535 +0200 +@@ -905,7 +905,15 @@ bool QEventDispatcherUNIX::processEvents + + // we are awake, broadcast it + emit awake(); +- QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData); ++ ++ QEventLoop::ProcessEventsFlags excludeAllFlags ++ = QEventLoop::ExcludeUserInputEvents ++ | QEventLoop::ExcludeSocketNotifiers ++ | QEventLoop::X11ExcludeTimers; ++ if ((flags & excludeAllFlags) == excludeAllFlags) ++ return false; ++ if(( flags & excludeAllFlags ) != excludeAllFlags ) ++ QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData); + + int nevents = 0; + const bool canWait = (d->threadData->canWaitLocked() + diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-37380.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-37380.patch new file mode 100644 index 0000000000..296a5ada69 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-37380.patch @@ -0,0 +1,64 @@ +Author: Jan-Marek Glogowski +Date: Thu Mar 06 18:44:43 2014 +0100 + + Honor QEventLoop::ExcludeSocketNotifiers in glib event loop. + + Implements QEventLoop::ExcludeSocketNotifiers in the same way + QEventLoop::X11ExcludeTimers is already implemented for the glib + event loop. + +--- qt4-x11-4.8.1.orig/src/corelib/kernel/qeventdispatcher_glib.cpp ++++ qt4-x11-4.8.1/src/corelib/kernel/qeventdispatcher_glib.cpp +@@ -65,6 +65,7 @@ struct GPollFDWithQSocketNotifier + struct GSocketNotifierSource + { + GSource source; ++ QEventLoop::ProcessEventsFlags processEventsFlags; + QList pollfds; + }; + +@@ -80,6 +81,9 @@ static gboolean socketNotifierSourceChec + GSocketNotifierSource *src = reinterpret_cast(source); + + bool pending = false; ++ if (src->processEventsFlags & QEventLoop::ExcludeSocketNotifiers) ++ return pending; ++ + for (int i = 0; !pending && i < src->pollfds.count(); ++i) { + GPollFDWithQSocketNotifier *p = src->pollfds.at(i); + +@@ -103,6 +107,9 @@ static gboolean socketNotifierSourceDisp + QEvent event(QEvent::SockAct); + + GSocketNotifierSource *src = reinterpret_cast(source); ++ if (src->processEventsFlags & QEventLoop::ExcludeSocketNotifiers) ++ return true; ++ + for (int i = 0; i < src->pollfds.count(); ++i) { + GPollFDWithQSocketNotifier *p = src->pollfds.at(i); + +@@ -330,6 +337,7 @@ QEventDispatcherGlibPrivate::QEventDispa + reinterpret_cast(g_source_new(&socketNotifierSourceFuncs, + sizeof(GSocketNotifierSource))); + (void) new (&socketNotifierSource->pollfds) QList(); ++ socketNotifierSource->processEventsFlags = QEventLoop::AllEvents; + g_source_set_can_recurse(&socketNotifierSource->source, true); + g_source_attach(&socketNotifierSource->source, mainContext); + +@@ -415,6 +423,7 @@ bool QEventDispatcherGlib::processEvents + // tell postEventSourcePrepare() and timerSource about any new flags + QEventLoop::ProcessEventsFlags savedFlags = d->timerSource->processEventsFlags; + d->timerSource->processEventsFlags = flags; ++ d->socketNotifierSource->processEventsFlags = flags; + + if (!(flags & QEventLoop::EventLoopExec)) { + // force timers to be sent at normal priority +@@ -426,6 +435,7 @@ bool QEventDispatcherGlib::processEvents + result = g_main_context_iteration(d->mainContext, canWait); + + d->timerSource->processEventsFlags = savedFlags; ++ d->socketNotifierSource->processEventsFlags = savedFlags; + + if (canWait) + emit awake(); + diff --git a/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-38585.patch b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-38585.patch new file mode 100644 index 0000000000..6aee4fee73 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-38585.patch @@ -0,0 +1,13 @@ +--- src/gui/kernel/qclipboard_x11.cpp.sav 2014-04-25 09:52:03.855693228 +0200 ++++ qt-everywhere-opensource-src-4.8.6/src/gui/kernel/qclipboard_x11.cpp 2014-04-25 09:51:58.038693777 +0200 +@@ -548,7 +548,8 @@ bool QX11Data::clipboardWaitForEvent(Win + return false; + + XSync(X11->display, false); +- usleep(50000); ++ if (!XPending(X11->display)) ++ usleep(5000); + + now.start(); + + diff --git a/desktop/toolkit/qt/files/fedora/qt-x11-opensource-src-4.5.0-fix-qatomic-inline-asm.patch b/desktop/toolkit/qt/files/fedora/qt-x11-opensource-src-4.5.0-fix-qatomic-inline-asm.patch new file mode 100644 index 0000000000..e5ab4bad96 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-x11-opensource-src-4.5.0-fix-qatomic-inline-asm.patch @@ -0,0 +1,50 @@ +diff -ur qt-x11-opensource-src-4.5.0/src/corelib/arch/qatomic_i386.h qt-x11-opensource-src-4.5.0-fix-qatomic-inline-asm/src/corelib/arch/qatomic_i386.h +--- qt-x11-opensource-src-4.5.0/src/corelib/arch/qatomic_i386.h 2009-02-25 22:09:21.000000000 +0100 ++++ qt-x11-opensource-src-4.5.0-fix-qatomic-inline-asm/src/corelib/arch/qatomic_i386.h 2009-04-01 17:54:21.000000000 +0200 +@@ -115,8 +115,8 @@ + asm volatile("lock\n" + "incl %0\n" + "setne %1" +- : "=m" (_q_value), "=qm" (ret) +- : "m" (_q_value) ++ : "+m" (_q_value), "=qm" (ret) ++ : + : "memory"); + return ret != 0; + } +@@ -127,8 +127,8 @@ + asm volatile("lock\n" + "decl %0\n" + "setne %1" +- : "=m" (_q_value), "=qm" (ret) +- : "m" (_q_value) ++ : "+m" (_q_value), "=qm" (ret) ++ : + : "memory"); + return ret != 0; + } +diff -ur qt-x11-opensource-src-4.5.0/src/corelib/arch/qatomic_x86_64.h qt-x11-opensource-src-4.5.0-fix-qatomic-inline-asm/src/corelib/arch/qatomic_x86_64.h +--- qt-x11-opensource-src-4.5.0/src/corelib/arch/qatomic_x86_64.h 2009-02-25 22:09:21.000000000 +0100 ++++ qt-x11-opensource-src-4.5.0-fix-qatomic-inline-asm/src/corelib/arch/qatomic_x86_64.h 2009-04-01 17:54:32.000000000 +0200 +@@ -116,8 +116,8 @@ + asm volatile("lock\n" + "incl %0\n" + "setne %1" +- : "=m" (_q_value), "=qm" (ret) +- : "m" (_q_value) ++ : "+m" (_q_value), "=qm" (ret) ++ : + : "memory"); + return ret != 0; + } +@@ -128,8 +128,8 @@ + asm volatile("lock\n" + "decl %0\n" + "setne %1" +- : "=m" (_q_value), "=qm" (ret) +- : "m" (_q_value) ++ : "+m" (_q_value), "=qm" (ret) ++ : + : "memory"); + return ret != 0; + } diff --git a/desktop/toolkit/qt/files/fedora/qt-x11-opensource-src-4.5.1-enable_ft_lcdfilter.patch b/desktop/toolkit/qt/files/fedora/qt-x11-opensource-src-4.5.1-enable_ft_lcdfilter.patch new file mode 100644 index 0000000000..4ab3ea4b11 --- /dev/null +++ b/desktop/toolkit/qt/files/fedora/qt-x11-opensource-src-4.5.1-enable_ft_lcdfilter.patch @@ -0,0 +1,12 @@ +diff -up qt-x11-opensource-src-4.5.1/src/gui/text/qfontengine_ft.cpp.enable_ft_lcdfilter qt-x11-opensource-src-4.5.1/src/gui/text/qfontengine_ft.cpp +--- qt-x11-opensource-src-4.5.1/src/gui/text/qfontengine_ft.cpp.enable_ft_lcdfilter 2009-04-21 18:57:41.000000000 -0500 ++++ qt-x11-opensource-src-4.5.1/src/gui/text/qfontengine_ft.cpp 2009-04-24 11:17:49.562695405 -0500 +@@ -72,7 +72,7 @@ + #include FT_CONFIG_OPTIONS_H + #endif + +-#if defined(FT_LCD_FILTER_H) && defined(FT_CONFIG_OPTION_SUBPIXEL_RENDERING) ++#if defined(FT_LCD_FILTER_H) + #define QT_USE_FREETYPE_LCDFILTER + #endif + diff --git a/desktop/toolkit/qt/files/mkspecs.patch b/desktop/toolkit/qt/files/mkspecs.patch new file mode 100644 index 0000000000..2cd05f90e5 --- /dev/null +++ b/desktop/toolkit/qt/files/mkspecs.patch @@ -0,0 +1,54 @@ +diff -Naur mkspecs/common.orig/g++-base.conf mkspecs/common/g++-base.conf +--- mkspecs/common.orig/g++-base.conf 2012-03-14 16:01:12.000000000 +0200 ++++ mkspecs/common/g++-base.conf 2012-04-05 14:53:05.670347102 +0300 +@@ -8,17 +8,23 @@ + # you can use the manual test in tests/manual/mkspecs. + # + +-QMAKE_CC = gcc ++QMAKE_CC = PISILINUX_CC + + QMAKE_LINK_C = $$QMAKE_CC + QMAKE_LINK_C_SHLIB = $$QMAKE_CC + +-QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -g ++QMAKE_CFLAGS_RELEASE += PISILINUX_CFLAGS ++QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += PISILINUX_CFLAGS -g + +-QMAKE_CXX = g++ ++QMAKE_CXX = PISILINUX_CXX + +-QMAKE_LINK = $$QMAKE_CXX +-QMAKE_LINK_SHLIB = $$QMAKE_CXX ++ ++QMAKE_LINK = PISILINUX_CXX ++QMAKE_LINK_SHLIB = PISILINUX_CXX ++QMAKE_LINK_C = PISILINUX_CC ++QMAKE_LINK_C_SHLIB = PISILINUX_CC ++ ++QMAKE_LFLAGS_RELEASE += PISILINUX_LDFLAGS + + QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO + +diff -Naur mkspecs/common.orig/g++-unix.conf mkspecs/common/g++-unix.conf +--- mkspecs/common.orig/g++-unix.conf 2012-03-14 16:01:12.000000000 +0200 ++++ mkspecs/common/g++-unix.conf 2012-04-05 14:49:41.723399705 +0300 +@@ -10,5 +10,5 @@ + + include(g++-base.conf) + +-QMAKE_LFLAGS_RELEASE += -Wl,-O1 ++QMAKE_LFLAGS_RELEASE += PISILINUX_LDFLAGS + QMAKE_LFLAGS_NOUNDEF += -Wl,--no-undefined +diff -Naur mkspecs/common.orig/linux.conf mkspecs/common/linux.conf +--- mkspecs/common.orig/linux.conf 2012-03-14 16:01:12.000000000 +0200 ++++ mkspecs/common/linux.conf 2012-04-05 14:54:23.487037709 +0300 +@@ -57,7 +57,7 @@ + QMAKE_MOVE = mv -f + QMAKE_DEL_FILE = rm -f + QMAKE_DEL_DIR = rmdir +-QMAKE_STRIP = strip ++QMAKE_STRIP = + QMAKE_STRIPFLAGS_LIB += --strip-unneeded + QMAKE_CHK_DIR_EXISTS = test -d + QMAKE_MKDIR = mkdir -p diff --git a/desktop/toolkit/qt/files/opensuse/0001-Don-t-crash-on-broken-GIF-images.patch b/desktop/toolkit/qt/files/opensuse/0001-Don-t-crash-on-broken-GIF-images.patch new file mode 100644 index 0000000000..011918935e --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/0001-Don-t-crash-on-broken-GIF-images.patch @@ -0,0 +1,42 @@ +From 19d31c5b036a46365584d7d97e87f7fe16150623 Mon Sep 17 00:00:00 2001 +From: Lars Knoll +Date: Thu, 24 Apr 2014 15:33:27 +0200 +Subject: [PATCH] Don't crash on broken GIF images + +Broken GIF images could set invalid width and height +values inside the image, leading to Qt creating a null +QImage for it. In that case we need to abort decoding +the image and return an error. + +Initial patch by Rich Moore. + +Backport of Id82a4036f478bd6e49c402d6598f57e7e5bb5e1e from Qt 5 + +Task-number: QTBUG-38367 +Change-Id: I0680740018aaa8356d267b7af3f01fac3697312a +Security-advisory: CVE-2014-0190 +--- + src/gui/image/qgifhandler.cpp | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/src/gui/image/qgifhandler.cpp b/src/gui/image/qgifhandler.cpp +index 3324f04..5199dd3 100644 +--- a/src/gui/image/qgifhandler.cpp ++++ b/src/gui/image/qgifhandler.cpp +@@ -359,6 +359,13 @@ int QGIFFormat::decode(QImage *image, const uchar *buffer, int length, + memset(bits, 0, image->byteCount()); + } + ++ // Check if the previous attempt to create the image failed. If it ++ // did then the image is broken and we should give up. ++ if (image->isNull()) { ++ state = Error; ++ return -1; ++ } ++ + disposePrevious(image); + disposed = false; + +-- +1.9.0 + diff --git a/desktop/toolkit/qt/files/opensuse/0180-window-role.diff b/desktop/toolkit/qt/files/opensuse/0180-window-role.diff new file mode 100644 index 0000000000..661c3ba5b2 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/0180-window-role.diff @@ -0,0 +1,96 @@ +Index: src/corelib/kernel/qobject.cpp +=================================================================== +--- src/corelib/kernel/qobject.cpp.orig ++++ src/corelib/kernel/qobject.cpp +@@ -1102,10 +1102,19 @@ void QObject::setObjectName(const QStrin + + d->objectName = name; + ++#if defined(Q_WS_X11) ++ d->checkWindowRole(); ++#endif ++ + if (objectNameChanged) + d->declarativeData->objectNameChanged(d->declarativeData, this); + } + ++#if defined(Q_WS_X11) ++void QObjectPrivate::checkWindowRole() ++{ ++} ++#endif + + #ifdef QT3_SUPPORT + /*! \internal +Index: src/corelib/kernel/qobject_p.h +=================================================================== +--- src/corelib/kernel/qobject_p.h.orig ++++ src/corelib/kernel/qobject_p.h +@@ -162,6 +162,9 @@ public: + #ifdef QT3_SUPPORT + void sendPendingChildInsertedEvents(); + #endif ++#if defined(Q_WS_X11) ++ virtual void checkWindowRole(); ++#endif + + static inline Sender *setCurrentSender(QObject *receiver, + Sender *sender); +Index: src/gui/kernel/qwidget_p.h +=================================================================== +--- src/gui/kernel/qwidget_p.h.orig ++++ src/gui/kernel/qwidget_p.h +@@ -784,6 +784,7 @@ public: + static QWidget *keyboardGrabber; + + void setWindowRole(); ++ virtual void checkWindowRole(); + void sendStartupMessage(const char *message) const; + void setNetWmWindowTypes(); + void x11UpdateIsOpaque(); +Index: src/gui/kernel/qwidget_x11.cpp +=================================================================== +--- src/gui/kernel/qwidget_x11.cpp.orig ++++ src/gui/kernel/qwidget_x11.cpp +@@ -849,13 +849,17 @@ void QWidgetPrivate::create_sys(WId wind + + + // declare the widget's window role ++ QByteArray windowRole; + if (QTLWExtra *topData = maybeTopData()) { +- if (!topData->role.isEmpty()) { +- QByteArray windowRole = topData->role.toUtf8(); +- XChangeProperty(dpy, id, +- ATOM(WM_WINDOW_ROLE), XA_STRING, 8, PropModeReplace, +- (unsigned char *)windowRole.constData(), windowRole.length()); +- } ++ if (!topData->role.isEmpty()) ++ windowRole = topData->role.toUtf8(); ++ } ++ if (windowRole.isEmpty()) // use object name as a fallback ++ windowRole = objectName.toUtf8(); ++ if (!windowRole.isEmpty()) { ++ XChangeProperty(dpy, id, ++ ATOM(WM_WINDOW_ROLE), XA_STRING, 8, PropModeReplace, ++ (unsigned char *)windowRole.constData(), windowRole.length()); + } + + // set client leader property +@@ -3015,6 +3019,17 @@ void QWidgetPrivate::setWindowRole() + XChangeProperty(X11->display, q->internalWinId(), + ATOM(WM_WINDOW_ROLE), XA_STRING, 8, PropModeReplace, + (unsigned char *)windowRole.constData(), windowRole.length()); ++} ++ ++void QWidgetPrivate::checkWindowRole() ++{ ++ Q_Q(QWidget); ++ if( !q->windowRole().isEmpty() || !q->internalWinId()) ++ return; ++ QByteArray windowRole = objectName.toUtf8(); // use as a fallback ++ XChangeProperty(X11->display, q->internalWinId(), ++ ATOM(WM_WINDOW_ROLE), XA_STRING, 8, PropModeReplace, ++ (unsigned char *)windowRole.constData(), windowRole.length()); + } + + Q_GLOBAL_STATIC(QX11PaintEngine, qt_widget_paintengine) diff --git a/desktop/toolkit/qt/files/opensuse/0188-fix-moc-parser-same-name-header.diff b/desktop/toolkit/qt/files/opensuse/0188-fix-moc-parser-same-name-header.diff new file mode 100644 index 0000000000..660dfdf0ad --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/0188-fix-moc-parser-same-name-header.diff @@ -0,0 +1,37 @@ +qt-bugs@ issue : none +Trolltech task ID : none +applied: yes +author: Helio Chissini de Castro +os: unix + +In situations where included header have same name as their parent dir, i.e. +include/QtMyModule/QtMyModule and #include on code. moc will fail if parent dir was +added in front of includepath. +moc -Iinclude -Iinclude/QtMyModule fails +moc -Iinclude/QtMyModule works +This patch move dir test to proper place, as entry is validated only if is a real file, not a dir. +Detected by qca2 plugins code that uses QtCrypto/QtCrypto +Thanks to Thiago to find proper syntax + +Index: src/tools/moc/preprocessor.cpp +=================================================================== +--- src/tools/moc/preprocessor.cpp.orig ++++ src/tools/moc/preprocessor.cpp +@@ -799,7 +799,7 @@ void Preprocessor::preprocess(const QByt + QFileInfo fi; + if (local) + fi.setFile(QFileInfo(QString::fromLocal8Bit(filename)).dir(), QString::fromLocal8Bit(include)); +- for (int j = 0; j < Preprocessor::includes.size() && !fi.exists(); ++j) { ++ for (int j = 0; j < Preprocessor::includes.size() && ( !fi.exists() || fi.isDir() ); ++j) { + const IncludePath &p = Preprocessor::includes.at(j); + if (p.isFrameworkPath) { + const int slashPos = include.indexOf('/'); +@@ -819,7 +819,7 @@ void Preprocessor::preprocess(const QByt + } + } + +- if (!fi.exists() || fi.isDir()) ++ if ( !fi.exists() ) + continue; + include = fi.canonicalFilePath().toLocal8Bit(); + diff --git a/desktop/toolkit/qt/files/opensuse/0191-listview-alternate-row-colors.diff b/desktop/toolkit/qt/files/opensuse/0191-listview-alternate-row-colors.diff new file mode 100644 index 0000000000..480464cee2 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/0191-listview-alternate-row-colors.diff @@ -0,0 +1,24 @@ +qt-bugs@ issue : 178507 +Trolltech task ID : 179170 +applied: no +author: Matthew Woehlke + +This patch fixes incorrect setting of the palette color group in +QListView that resulted in alternate rows being drawn with the Active +AlternateBase color even for inactive widgets (while the rest of the +widget is drawn correctly). Please let me know if QListView is not +the only culprit. (QTreeView was fixed by TT already.) + +Index: src/gui/itemviews/qlistview.cpp +=================================================================== +--- src/gui/itemviews/qlistview.cpp.orig ++++ src/gui/itemviews/qlistview.cpp +@@ -997,7 +997,7 @@ void QListView::paintEvent(QPaintEvent * + option.state &= ~QStyle::State_Enabled; + cg = QPalette::Disabled; + } else { +- cg = QPalette::Normal; ++ cg = window()->isActiveWindow() ? QPalette::Active : QPalette::Inactive; + } + option.palette.setCurrentColorGroup(cg); + } diff --git a/desktop/toolkit/qt/files/opensuse/0195-compositing-properties.diff b/desktop/toolkit/qt/files/opensuse/0195-compositing-properties.diff new file mode 100644 index 0000000000..53789264c5 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/0195-compositing-properties.diff @@ -0,0 +1,60 @@ +qt-bugs@ issue : none +bugs.kde.org number : none +applied: no +author: Lubos Lunak + +This patch makes override-redirect windows (popup menu, dropdown menu, +tooltip, combobox, etc.) also have more window properties like WM_CLASS, +so they can be used when compositing. + +Index: src/gui/kernel/qwidget_x11.cpp +=================================================================== +--- src/gui/kernel/qwidget_x11.cpp.orig ++++ src/gui/kernel/qwidget_x11.cpp +@@ -773,6 +773,11 @@ void QWidgetPrivate::create_sys(WId wind + Q_ASSERT(id); + XChangeWindowAttributes(dpy, id, CWOverrideRedirect | CWSaveUnder, + &wsa); ++ XClassHint class_hint; ++ QByteArray appName = qAppName().toLatin1(); ++ class_hint.res_name = appName.data(); // application name ++ class_hint.res_class = const_cast(QX11Info::appClass()); // application class ++ XSetWMProperties(dpy, id, 0, 0, 0, 0, 0, 0, &class_hint); + } else if (topLevel && !desktop) { // top-level widget + if (!X11->wm_client_leader) + create_wm_client_leader(); +@@ -827,13 +832,21 @@ void QWidgetPrivate::create_sys(WId wind + // set EWMH window types + setNetWmWindowTypes(); + ++ // when we create a toplevel widget, the frame strut should be dirty ++ data.fstrut_dirty = 1; ++ ++ } else { ++ // non-toplevel widgets don't have a frame, so no need to ++ // update the strut ++ data.fstrut_dirty = 0; ++ } ++ ++ if (initializeWindow && (popup || (topLevel && !desktop))) { // properties set on all toplevel windows + // set _NET_WM_PID + long curr_pid = getpid(); + XChangeProperty(dpy, id, ATOM(_NET_WM_PID), XA_CARDINAL, 32, PropModeReplace, + (unsigned char *) &curr_pid, 1); + +- // when we create a toplevel widget, the frame strut should be dirty +- data.fstrut_dirty = 1; + + // declare the widget's window role + if (QTLWExtra *topData = maybeTopData()) { +@@ -849,10 +862,6 @@ void QWidgetPrivate::create_sys(WId wind + XChangeProperty(dpy, id, ATOM(WM_CLIENT_LEADER), + XA_WINDOW, 32, PropModeReplace, + (unsigned char *)&X11->wm_client_leader, 1); +- } else { +- // non-toplevel widgets don't have a frame, so no need to +- // update the strut +- data.fstrut_dirty = 0; + } + + if (initializeWindow && q->internalWinId()) { diff --git a/desktop/toolkit/qt/files/opensuse/0225-invalidate-tabbar-geometry-on-refresh.patch b/desktop/toolkit/qt/files/opensuse/0225-invalidate-tabbar-geometry-on-refresh.patch new file mode 100644 index 0000000000..d79c6f0897 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/0225-invalidate-tabbar-geometry-on-refresh.patch @@ -0,0 +1,35 @@ +qt-bugs@ issue : None +Trolltech task ID : None +bugs.kde.org number : 159014 +applied: no +author: Robert Knight + +When tabs are inserted or removed in a QTabBar, QTabBarPrivate::refresh() +is called to update the layout. If the tabbar widget is hidden, this +just sets a boolean variable (layoutDirty) and returns, so the parent widget's layout +is not notified about the possible geometry change. + +Prior to Qt 4.4 this was not a problem because the geometry was recalculated +in QTabBar::sizeHint() if the layoutDirty variable was set. In Qt 4.4 however the layout +caches size hint information in QWidgetItemV2. Since the cache information is not invalidated, +the layout may end up using out-of-date size hint information to compute the widget size. + +If the QTabBar is empty when QTabBar::sizeHint() is called, it will return a size with a height +of 0, which will be kept in the cache and so the tab bar will never be shown. + +This patch fixes the problem by calling updateGeometry() whenever the tab bar's layout is refreshed. + +Index: src/gui/widgets/qtabbar.cpp +=================================================================== +--- src/gui/widgets/qtabbar.cpp.orig ++++ src/gui/widgets/qtabbar.cpp +@@ -723,8 +723,8 @@ void QTabBarPrivate::refresh() + layoutTabs(); + makeVisible(currentIndex); + q->update(); +- q->updateGeometry(); + } ++ q->updateGeometry(); + } + + /*! diff --git a/desktop/toolkit/qt/files/opensuse/QSystemTrayicon.diff b/desktop/toolkit/qt/files/opensuse/QSystemTrayicon.diff new file mode 100644 index 0000000000..2be68adba4 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/QSystemTrayicon.diff @@ -0,0 +1,1486 @@ +Description: Introduce a plugin system for QSystemTrayIcon. + Designed to be used with sni-qt (https://launchpad.net/sni-qt) +Author: agateau@kde.org +Forwarded: no + +Introduce a plugin system for QSystemTrayIcon. Designed to be used with sni-qt +(https://launchpad.net/sni-qt) +--- + examples/desktop/systray/window.cpp | 40 ++ + examples/desktop/systray/window.h | 6 + src/gui/util/qabstractsystemtrayiconsys.cpp | 65 +++ + src/gui/util/qabstractsystemtrayiconsys_p.h | 106 ++++++ + src/gui/util/qsystemtrayicon.cpp | 6 + src/gui/util/qsystemtrayicon_p.h | 85 ++--- + src/gui/util/qsystemtrayicon_x11.cpp | 356 ++++----------------- + src/gui/util/qxembedsystemtrayicon_x11.cpp | 469 ++++++++++++++++++++++++++++ + src/gui/util/qxembedsystemtrayicon_x11_p.h | 104 ++++++ + src/gui/util/util.pri | 7 + 10 files changed, 916 insertions(+), 328 deletions(-) + +Index: qt-everywhere-opensource-src-4.8.6/examples/desktop/systray/window.cpp +=================================================================== +--- qt-everywhere-opensource-src-4.8.6.orig/examples/desktop/systray/window.cpp ++++ qt-everywhere-opensource-src-4.8.6/examples/desktop/systray/window.cpp +@@ -158,15 +158,23 @@ void Window::createIconGroupBox() + iconComboBox->addItem(QIcon(":/images/bad.svg"), tr("Bad")); + iconComboBox->addItem(QIcon(":/images/heart.svg"), tr("Heart")); + iconComboBox->addItem(QIcon(":/images/trash.svg"), tr("Trash")); ++ iconComboBox->addItem(QIcon::fromTheme("system-file-manager"), tr("File Manager")); + + showIconCheckBox = new QCheckBox(tr("Show icon")); + showIconCheckBox->setChecked(true); + ++#if defined(Q_WS_X11) ++ jitToolTipCheckBox = new QCheckBox(tr("Just In Time Tooltip")); ++#endif ++ + QHBoxLayout *iconLayout = new QHBoxLayout; + iconLayout->addWidget(iconLabel); + iconLayout->addWidget(iconComboBox); + iconLayout->addStretch(); + iconLayout->addWidget(showIconCheckBox); ++#if defined(Q_WS_X11) ++ iconLayout->addWidget(jitToolTipCheckBox); ++#endif + iconGroupBox->setLayout(iconLayout); + } + +@@ -254,5 +262,37 @@ void Window::createTrayIcon() + trayIconMenu->addAction(quitAction); + + trayIcon = new QSystemTrayIcon(this); ++ QByteArray category = qgetenv("SNI_CATEGORY"); ++ if (!category.isEmpty()) { ++ trayIcon->setProperty("_qt_sni_category", QString::fromLocal8Bit(category)); ++ } + trayIcon->setContextMenu(trayIconMenu); ++ ++#if defined(Q_WS_X11) ++ trayIcon->installEventFilter(this); ++#endif ++} ++ ++#if defined(Q_WS_X11) ++bool Window::eventFilter(QObject *, QEvent *event) ++{ ++ switch(event->type()) { ++ case QEvent::ToolTip: ++ if (jitToolTipCheckBox->isChecked()) { ++ QString timeString = QTime::currentTime().toString(); ++ trayIcon->setToolTip(tr("Current Time: %1").arg(timeString)); ++ } ++ break; ++ case QEvent::Wheel: { ++ QWheelEvent *wheelEvent = static_cast(event); ++ int delta = wheelEvent->delta() > 0 ? 1 : -1; ++ int index = (iconComboBox->currentIndex() + delta) % iconComboBox->count(); ++ iconComboBox->setCurrentIndex(index); ++ break; ++ } ++ default: ++ break; ++ } ++ return false; + } ++#endif +Index: qt-everywhere-opensource-src-4.8.6/examples/desktop/systray/window.h +=================================================================== +--- qt-everywhere-opensource-src-4.8.6.orig/examples/desktop/systray/window.h ++++ qt-everywhere-opensource-src-4.8.6/examples/desktop/systray/window.h +@@ -69,6 +69,9 @@ public: + + protected: + void closeEvent(QCloseEvent *event); ++#if defined(Q_WS_X11) ++ bool eventFilter(QObject *object, QEvent *event); ++#endif + + private slots: + void setIcon(int index); +@@ -86,6 +89,9 @@ private: + QLabel *iconLabel; + QComboBox *iconComboBox; + QCheckBox *showIconCheckBox; ++#if defined(Q_WS_X11) ++ QCheckBox *jitToolTipCheckBox; ++#endif + + QGroupBox *messageGroupBox; + QLabel *typeLabel; +Index: qt-everywhere-opensource-src-4.8.6/src/gui/util/qabstractsystemtrayiconsys.cpp +=================================================================== +--- /dev/null ++++ qt-everywhere-opensource-src-4.8.6/src/gui/util/qabstractsystemtrayiconsys.cpp +@@ -0,0 +1,65 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). ++** All rights reserved. ++** Contact: Nokia Corporation (qt-info@nokia.com) ++** ++** This file is part of the QtGui module of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** GNU Lesser General Public License Usage ++** This file may be used under the terms of the GNU Lesser General Public ++** License version 2.1 as published by the Free Software Foundation and ++** appearing in the file LICENSE.LGPL included in the packaging of this ++** file. Please review the following information to ensure the GNU Lesser ++** General Public License version 2.1 requirements will be met: ++** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Nokia gives you certain additional ++** rights. These rights are described in the Nokia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU General ++** Public License version 3.0 as published by the Free Software Foundation ++** and appearing in the file LICENSE.GPL included in the packaging of this ++** file. Please review the following information to ensure the GNU General ++** Public License version 3.0 requirements will be met: ++** http://www.gnu.org/copyleft/gpl.html. ++** ++** Other Usage ++** Alternatively, this file may be used in accordance with the terms and ++** conditions contained in a signed written agreement between you and Nokia. ++** ++** ++** ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++#ifndef QT_NO_SYSTEMTRAYICON ++ ++#include "qabstractsystemtrayiconsys_p.h" ++ ++ ++QSystemTrayIconSysFactoryInterface::QSystemTrayIconSysFactoryInterface() ++{ ++} ++ ++///////////////////////////////////////////////// ++QAbstractSystemTrayIconSys::QAbstractSystemTrayIconSys(QSystemTrayIcon *icon) ++: trayIcon(icon) ++{ ++} ++ ++QAbstractSystemTrayIconSys::~QAbstractSystemTrayIconSys() ++{ ++} ++ ++void QAbstractSystemTrayIconSys::sendActivated(QSystemTrayIcon::ActivationReason reason) ++{ ++ qtsystray_sendActivated(trayIcon, reason); ++} ++ ++#endif +Index: qt-everywhere-opensource-src-4.8.6/src/gui/util/qabstractsystemtrayiconsys_p.h +=================================================================== +--- /dev/null ++++ qt-everywhere-opensource-src-4.8.6/src/gui/util/qabstractsystemtrayiconsys_p.h +@@ -0,0 +1,106 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). ++** All rights reserved. ++** Contact: Nokia Corporation (qt-info@nokia.com) ++** ++** This file is part of the QtGui module of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** GNU Lesser General Public License Usage ++** This file may be used under the terms of the GNU Lesser General Public ++** License version 2.1 as published by the Free Software Foundation and ++** appearing in the file LICENSE.LGPL included in the packaging of this ++** file. Please review the following information to ensure the GNU Lesser ++** General Public License version 2.1 requirements will be met: ++** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Nokia gives you certain additional ++** rights. These rights are described in the Nokia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU General ++** Public License version 3.0 as published by the Free Software Foundation ++** and appearing in the file LICENSE.GPL included in the packaging of this ++** file. Please review the following information to ensure the GNU General ++** Public License version 3.0 requirements will be met: ++** http://www.gnu.org/copyleft/gpl.html. ++** ++** Other Usage ++** Alternatively, this file may be used in accordance with the terms and ++** conditions contained in a signed written agreement between you and Nokia. ++** ++** ++** ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef QABSTRACTSYSTEMTRAYICONSYS_P_H ++#define QABSTRACTSYSTEMTRAYICONSYS_P_H ++ ++// ++// W A R N I N G ++// ------------- ++// ++// This file is not part of the Qt API. It exists for the convenience ++// of a number of Qt sources files. This header file may change from ++// version to version without notice, or even be removed. ++// ++// We mean it. ++// ++ ++#ifndef QT_NO_SYSTEMTRAYICON ++ ++#include ++#include ++ ++class QAbstractSystemTrayIconSys; ++ ++class Q_GUI_EXPORT QSystemTrayIconSysFactoryInterface : public QObject, public QFactoryInterface ++{ ++ Q_OBJECT ++public: ++ QSystemTrayIconSysFactoryInterface(); ++ virtual QAbstractSystemTrayIconSys * create(QSystemTrayIcon *) = 0; ++ virtual bool isAvailable() const = 0; ++ ++ // \reimp ++ virtual QStringList keys() const { return QStringList() << QLatin1String("default"); } ++ ++Q_SIGNALS: ++ void availableChanged(bool); ++}; ++ ++#define QSystemTrayIconSysFactoryInterface_iid "com.nokia.qt.QSystemTrayIconSysFactoryInterface" ++Q_DECLARE_INTERFACE(QSystemTrayIconSysFactoryInterface, QSystemTrayIconSysFactoryInterface_iid) ++ ++class QRect; ++ ++class Q_GUI_EXPORT QAbstractSystemTrayIconSys ++{ ++public: ++ QAbstractSystemTrayIconSys(QSystemTrayIcon *icon); ++ virtual ~QAbstractSystemTrayIconSys(); ++ ++ virtual QRect geometry() const = 0; ++ virtual void updateVisibility() = 0; ++ virtual void updateIcon() = 0; ++ virtual void updateToolTip() = 0; ++ virtual void updateMenu() = 0; ++ virtual void showMessage(const QString &title, const QString &message, ++ QSystemTrayIcon::MessageIcon icon, int msecs) = 0; ++ ++ void sendActivated(QSystemTrayIcon::ActivationReason); ++ ++protected: ++ QSystemTrayIcon *trayIcon; ++}; ++ ++#endif // QT_NO_SYSTEMTRAYICON ++ ++#endif // QABSTRACTSYSTEMTRAYICONSYS_P_H ++ +Index: qt-everywhere-opensource-src-4.8.6/src/gui/util/qsystemtrayicon.cpp +=================================================================== +--- qt-everywhere-opensource-src-4.8.6.orig/src/gui/util/qsystemtrayicon.cpp ++++ qt-everywhere-opensource-src-4.8.6/src/gui/util/qsystemtrayicon.cpp +@@ -287,12 +287,6 @@ bool QSystemTrayIcon::isVisible() const + */ + bool QSystemTrayIcon::event(QEvent *e) + { +-#if defined(Q_WS_X11) +- if (e->type() == QEvent::ToolTip) { +- Q_D(QSystemTrayIcon); +- return d->sys->deliverToolTipEvent(e); +- } +-#endif + return QObject::event(e); + } + +Index: qt-everywhere-opensource-src-4.8.6/src/gui/util/qsystemtrayicon_p.h +=================================================================== +--- qt-everywhere-opensource-src-4.8.6.orig/src/gui/util/qsystemtrayicon_p.h ++++ qt-everywhere-opensource-src-4.8.6/src/gui/util/qsystemtrayicon_p.h +@@ -62,10 +62,17 @@ + #include "QtGui/qpixmap.h" + #include "QtCore/qstring.h" + #include "QtCore/qpointer.h" ++#if defined(Q_WS_X11) ++#include "QtCore/qset.h" ++#endif + + QT_BEGIN_NAMESPACE + ++#if defined(Q_WS_X11) ++class QAbstractSystemTrayIconSys; ++#else + class QSystemTrayIconSys; ++#endif + class QToolButton; + class QLabel; + +@@ -75,6 +82,9 @@ class QSystemTrayIconPrivate : public QO + + public: + QSystemTrayIconPrivate() : sys(0), visible(false) { } ++ #if defined(Q_WS_X11) ++ ~QSystemTrayIconPrivate(); ++ #endif + + void install_sys(); + void remove_sys(); +@@ -90,7 +100,11 @@ public: + QPointer menu; + QIcon icon; + QString toolTip; ++ #if defined(Q_WS_X11) ++ QAbstractSystemTrayIconSys *sys; ++ #else + QSystemTrayIconSys *sys; ++ #endif + bool visible; + }; + +@@ -123,60 +137,37 @@ private: + }; + + #if defined(Q_WS_X11) +-QT_BEGIN_INCLUDE_NAMESPACE +-#include +-#include +-#include +-#include +-QT_END_INCLUDE_NAMESPACE ++class QSystemTrayIconSysFactoryInterface; + +-class QSystemTrayIconSys : public QWidget ++/** ++ * This class acts as a composite QSystemTrayIconSysFactory: It can create ++ * instances of QAbstractSystemTrayIconSys* using either a plugin or the ++ * builtin factory and will cause QSystemTrayIconPrivate to recreate their ++ * 'sys' instances if the plugin availability changes. ++ */ ++class QSystemTrayIconSysFactory : public QObject + { +- friend class QSystemTrayIconPrivate; +- ++ Q_OBJECT + public: +- QSystemTrayIconSys(QSystemTrayIcon *q); +- ~QSystemTrayIconSys(); +- enum { +- SYSTEM_TRAY_REQUEST_DOCK = 0, +- SYSTEM_TRAY_BEGIN_MESSAGE = 1, +- SYSTEM_TRAY_CANCEL_MESSAGE =2 +- }; +- +- void addToTray(); +- void updateIcon(); +- XVisualInfo* getSysTrayVisualInfo(); +- +- // QObject::event is public but QWidget's ::event() re-implementation +- // is protected ;( +- inline bool deliverToolTipEvent(QEvent *e) +- { return QWidget::event(e); } +- +- static Window sysTrayWindow; +- static QList trayIcons; +- static QCoreApplication::EventFilter oldEventFilter; +- static bool sysTrayTracker(void *message, long *result); +- static Window locateSystemTray(); +- static Atom sysTraySelection; +- static XVisualInfo sysTrayVisual; ++ QSystemTrayIconSysFactory(); ++ void registerSystemTrayIconPrivate(QSystemTrayIconPrivate *iconPrivate); ++ void unregisterSystemTrayIconPrivate(QSystemTrayIconPrivate *iconPrivate); + +-protected: +- void paintEvent(QPaintEvent *pe); +- void resizeEvent(QResizeEvent *re); +- bool x11Event(XEvent *event); +- void mousePressEvent(QMouseEvent *event); +- void mouseDoubleClickEvent(QMouseEvent *event); +-#ifndef QT_NO_WHEELEVENT +- void wheelEvent(QWheelEvent *event); +-#endif +- bool event(QEvent *e); ++ QAbstractSystemTrayIconSys *create(QSystemTrayIcon *) const; ++ ++ bool isAvailable() const; ++ ++private Q_SLOTS: ++ void refreshTrayIconPrivates(); + + private: +- QPixmap background; +- QSystemTrayIcon *q; +- Colormap colormap; ++ QSystemTrayIconSysFactoryInterface *factory() const; ++ void loadPluginFactory(); ++ ++ QSystemTrayIconSysFactoryInterface *pluginFactory; ++ QSet trayIconPrivates; + }; +-#endif // Q_WS_X11 ++#endif + + QT_END_NAMESPACE + +Index: qt-everywhere-opensource-src-4.8.6/src/gui/util/qsystemtrayicon_x11.cpp +=================================================================== +--- qt-everywhere-opensource-src-4.8.6.orig/src/gui/util/qsystemtrayicon_x11.cpp ++++ qt-everywhere-opensource-src-4.8.6/src/gui/util/qsystemtrayicon_x11.cpp +@@ -38,311 +38,122 @@ + ** $QT_END_LICENSE$ + ** + ****************************************************************************/ ++#ifndef QT_NO_SYSTEMTRAYICON ++ ++#include + +-#include "private/qt_x11_p.h" +-#include "qlabel.h" +-#include "qx11info_x11.h" +-#include "qpainter.h" +-#include "qpixmap.h" +-#include "qbitmap.h" +-#include "qevent.h" +-#include "qapplication.h" +-#include "qlist.h" +-#include "qmenu.h" +-#include "qtimer.h" + #include "qsystemtrayicon_p.h" +-#include "qpaintengine.h" ++#include "qabstractsystemtrayiconsys_p.h" ++#include "qcoreapplication.h" ++#include "qxembedsystemtrayicon_x11_p.h" + +-#ifndef QT_NO_SYSTEMTRAYICON + QT_BEGIN_NAMESPACE + +-Window QSystemTrayIconSys::sysTrayWindow = XNone; +-QList QSystemTrayIconSys::trayIcons; +-QCoreApplication::EventFilter QSystemTrayIconSys::oldEventFilter = 0; +-Atom QSystemTrayIconSys::sysTraySelection = XNone; +-XVisualInfo QSystemTrayIconSys::sysTrayVisual = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +- +-// Locate the system tray +-Window QSystemTrayIconSys::locateSystemTray() +-{ +- Display *display = QX11Info::display(); +- if (sysTraySelection == XNone) { +- int screen = QX11Info::appScreen(); +- QString net_sys_tray = QString::fromLatin1("_NET_SYSTEM_TRAY_S%1").arg(screen); +- sysTraySelection = XInternAtom(display, net_sys_tray.toLatin1(), False); +- } +- +- return XGetSelectionOwner(QX11Info::display(), sysTraySelection); +-} ++Q_GLOBAL_STATIC(QSystemTrayIconSysFactory, qt_guiSystemTrayIconSysFactory) + +-XVisualInfo* QSystemTrayIconSys::getSysTrayVisualInfo() ++QSystemTrayIconSysFactory::QSystemTrayIconSysFactory() ++: pluginFactory(0) + { +- Display *display = QX11Info::display(); +- +- if (!sysTrayVisual.visual) { +- Window win = locateSystemTray(); +- if (win != XNone) { +- Atom actual_type; +- int actual_format; +- ulong nitems, bytes_remaining; +- uchar *data = 0; +- int result = XGetWindowProperty(display, win, ATOM(_NET_SYSTEM_TRAY_VISUAL), 0, 1, +- False, XA_VISUALID, &actual_type, +- &actual_format, &nitems, &bytes_remaining, &data); +- VisualID vid = 0; +- if (result == Success && data && actual_type == XA_VISUALID && actual_format == 32 && +- nitems == 1 && bytes_remaining == 0) +- vid = *(VisualID*)data; +- if (data) +- XFree(data); +- if (vid == 0) +- return 0; +- +- uint mask = VisualIDMask; +- XVisualInfo *vi, rvi; +- int count; +- rvi.visualid = vid; +- vi = XGetVisualInfo(display, mask, &rvi, &count); +- if (vi) { +- sysTrayVisual = vi[0]; +- XFree((char*)vi); +- } +- if (sysTrayVisual.depth != 32) +- memset(&sysTrayVisual, 0, sizeof(sysTrayVisual)); +- } +- } +- +- return sysTrayVisual.visual ? &sysTrayVisual : 0; + } + +-bool QSystemTrayIconSys::sysTrayTracker(void *message, long *result) ++void QSystemTrayIconSysFactory::loadPluginFactory() + { +- bool retval = false; +- if (QSystemTrayIconSys::oldEventFilter) +- retval = QSystemTrayIconSys::oldEventFilter(message, result); +- +- if (trayIcons.isEmpty()) +- return retval; +- +- Display *display = QX11Info::display(); +- XEvent *ev = (XEvent *)message; +- if (ev->type == DestroyNotify && ev->xany.window == sysTrayWindow) { +- sysTrayWindow = locateSystemTray(); +- memset(&sysTrayVisual, 0, sizeof(sysTrayVisual)); +- for (int i = 0; i < trayIcons.count(); i++) { +- if (sysTrayWindow == XNone) { +- QBalloonTip::hideBalloon(); +- trayIcons[i]->hide(); // still no luck +- trayIcons[i]->destroy(); +- trayIcons[i]->create(); +- } else +- trayIcons[i]->addToTray(); // add it to the new tray +- } +- retval = true; +- } else if (ev->type == ClientMessage && sysTrayWindow == XNone) { +- static Atom manager_atom = XInternAtom(display, "MANAGER", False); +- XClientMessageEvent *cm = (XClientMessageEvent *)message; +- if ((cm->message_type == manager_atom) && ((Atom)cm->data.l[1] == sysTraySelection)) { +- sysTrayWindow = cm->data.l[2]; +- memset(&sysTrayVisual, 0, sizeof(sysTrayVisual)); +- XSelectInput(display, sysTrayWindow, StructureNotifyMask); +- for (int i = 0; i < trayIcons.count(); i++) { +- trayIcons[i]->addToTray(); +- } +- retval = true; +- } +- } else if (ev->type == PropertyNotify && ev->xproperty.atom == ATOM(_NET_SYSTEM_TRAY_VISUAL) && +- ev->xproperty.window == sysTrayWindow) { +- memset(&sysTrayVisual, 0, sizeof(sysTrayVisual)); +- for (int i = 0; i < trayIcons.count(); i++) { +- trayIcons[i]->addToTray(); +- } +- } +- +- return retval; +-} +- +-QSystemTrayIconSys::QSystemTrayIconSys(QSystemTrayIcon *q) +- : QWidget(0, Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint), +- q(q), colormap(0) +-{ +- setAttribute(Qt::WA_AlwaysShowToolTips); +- setAttribute(Qt::WA_QuitOnClose, false); +- setAttribute(Qt::WA_NoSystemBackground, true); +- setAttribute(Qt::WA_PaintOnScreen); +- +- static bool eventFilterAdded = false; +- Display *display = QX11Info::display(); +- if (!eventFilterAdded) { +- oldEventFilter = qApp->setEventFilter(sysTrayTracker); +- eventFilterAdded = true; +- Window root = QX11Info::appRootWindow(); +- XWindowAttributes attr; +- XGetWindowAttributes(display, root, &attr); +- if ((attr.your_event_mask & StructureNotifyMask) != StructureNotifyMask) { +- (void) QApplication::desktop(); // lame trick to ensure our event mask is not overridden +- XSelectInput(display, root, attr.your_event_mask | StructureNotifyMask); // for MANAGER selection +- } ++ if (pluginFactory) { ++ return; + } +- if (trayIcons.isEmpty()) { +- sysTrayWindow = locateSystemTray(); +- if (sysTrayWindow != XNone) +- XSelectInput(display, sysTrayWindow, StructureNotifyMask); // track tray events ++#ifndef QT_NO_LIBRARY ++ QFactoryLoader loader(QSystemTrayIconSysFactoryInterface_iid, QLatin1String("/systemtrayicon")); ++ pluginFactory = qobject_cast(loader.instance(QLatin1String("default"))); ++ if (pluginFactory) { ++ // Set parent to ensure factory destructor is called when application ++ // is closed ++ pluginFactory->setParent(QCoreApplication::instance()); ++ connect(pluginFactory, SIGNAL(availableChanged(bool)), SLOT(refreshTrayIconPrivates())); + } +- trayIcons.append(this); +- setMouseTracking(true); +-#ifndef QT_NO_TOOLTIP +- setToolTip(q->toolTip()); +-#endif +- if (sysTrayWindow != XNone) +- addToTray(); ++#endif // QT_NO_LIBRARY + } + +-QSystemTrayIconSys::~QSystemTrayIconSys() ++QSystemTrayIconSysFactoryInterface *QSystemTrayIconSysFactory::factory() const + { +- trayIcons.removeAt(trayIcons.indexOf(this)); +- Display *display = QX11Info::display(); +- if (trayIcons.isEmpty()) { +- if (sysTrayWindow == XNone) +- return; +- if (display) +- XSelectInput(display, sysTrayWindow, 0); // stop tracking the tray +- sysTrayWindow = XNone; ++ if (!pluginFactory) { ++ const_cast(this)->loadPluginFactory(); + } +- if (colormap) +- XFreeColormap(display, colormap); ++ if (pluginFactory && pluginFactory->isAvailable()) { ++ return pluginFactory; ++ } ++ static QXEmbedSystemTrayIconSysFactory def; ++ return def.isAvailable() ? &def : 0; + } + +-void QSystemTrayIconSys::addToTray() ++void QSystemTrayIconSysFactory::refreshTrayIconPrivates() + { +- Q_ASSERT(sysTrayWindow != XNone); +- Display *display = QX11Info::display(); +- +- XVisualInfo *vi = getSysTrayVisualInfo(); +- if (vi && vi->visual) { +- Window root = RootWindow(display, vi->screen); +- Window p = root; +- if (QWidget *pw = parentWidget()) +- p = pw->effectiveWinId(); +- colormap = XCreateColormap(display, root, vi->visual, AllocNone); +- XSetWindowAttributes wsa; +- wsa.background_pixmap = 0; +- wsa.colormap = colormap; +- wsa.background_pixel = 0; +- wsa.border_pixel = 0; +- Window wid = XCreateWindow(display, p, -1, -1, 1, 1, +- 0, vi->depth, InputOutput, vi->visual, +- CWBackPixmap|CWBackPixel|CWBorderPixel|CWColormap, &wsa); +- create(wid); +- } else { +- XSetWindowBackgroundPixmap(display, winId(), ParentRelative); +- } +- +- // GNOME, NET WM Specification +- static Atom netwm_tray_atom = XInternAtom(display, "_NET_SYSTEM_TRAY_OPCODE", False); +- long l[5] = { CurrentTime, SYSTEM_TRAY_REQUEST_DOCK, static_cast(winId()), 0, 0 }; +- XEvent ev; +- memset(&ev, 0, sizeof(ev)); +- ev.xclient.type = ClientMessage; +- ev.xclient.window = sysTrayWindow; +- ev.xclient.message_type = netwm_tray_atom; +- ev.xclient.format = 32; +- memcpy((char *)&ev.xclient.data, (const char *) l, sizeof(l)); +- XSendEvent(display, sysTrayWindow, False, 0, &ev); +- setMinimumSize(22, 22); // required at least on GNOME +-} +- +-void QSystemTrayIconSys::updateIcon() +-{ +- update(); +-} +- +-void QSystemTrayIconSys::resizeEvent(QResizeEvent *re) +-{ +- QWidget::resizeEvent(re); +- updateIcon(); +-} +- +-void QSystemTrayIconSys::paintEvent(QPaintEvent*) +-{ +- QPainter p(this); +- if (!getSysTrayVisualInfo()) { +- const QRegion oldSystemClip = p.paintEngine()->systemClip(); +- const QRect clearedRect = oldSystemClip.boundingRect(); +- XClearArea(QX11Info::display(), winId(), clearedRect.x(), clearedRect.y(), +- clearedRect.width(), clearedRect.height(), False); +- QPaintEngine *pe = p.paintEngine(); +- pe->setSystemClip(clearedRect); +- q->icon().paint(&p, rect()); +- pe->setSystemClip(oldSystemClip); +- } else { +- p.setCompositionMode(QPainter::CompositionMode_Source); +- p.fillRect(rect(), Qt::transparent); +- p.setCompositionMode(QPainter::CompositionMode_SourceOver); +- q->icon().paint(&p, rect()); ++ Q_FOREACH(QSystemTrayIconPrivate *trayIconPrivate, trayIconPrivates) { ++ if (trayIconPrivate->sys) { ++ delete trayIconPrivate->sys; ++ trayIconPrivate->sys = 0; ++ } ++ // When visible is true, sys is usually not 0 but it can be 0 if the ++ // call to install_sys() failed. ++ if (trayIconPrivate->visible) { ++ trayIconPrivate->install_sys(); ++ } + } + } + +-void QSystemTrayIconSys::mousePressEvent(QMouseEvent *ev) ++void QSystemTrayIconSysFactory::registerSystemTrayIconPrivate(QSystemTrayIconPrivate* trayIconPrivate) + { +- QPoint globalPos = ev->globalPos(); +- if (ev->button() == Qt::RightButton && q->contextMenu()) +- q->contextMenu()->popup(globalPos); +- +- if (QBalloonTip::isBalloonVisible()) { +- emit q->messageClicked(); +- QBalloonTip::hideBalloon(); +- } +- +- if (ev->button() == Qt::LeftButton) +- emit q->activated(QSystemTrayIcon::Trigger); +- else if (ev->button() == Qt::RightButton) +- emit q->activated(QSystemTrayIcon::Context); +- else if (ev->button() == Qt::MidButton) +- emit q->activated(QSystemTrayIcon::MiddleClick); ++ trayIconPrivates.insert(trayIconPrivate); + } + +-void QSystemTrayIconSys::mouseDoubleClickEvent(QMouseEvent *ev) ++void QSystemTrayIconSysFactory::unregisterSystemTrayIconPrivate(QSystemTrayIconPrivate* trayIconPrivate) + { +- if (ev->button() == Qt::LeftButton) +- emit q->activated(QSystemTrayIcon::DoubleClick); ++ trayIconPrivates.remove(trayIconPrivate); + } + +-#ifndef QT_NO_WHEELEVENT +-void QSystemTrayIconSys::wheelEvent(QWheelEvent *e) ++QAbstractSystemTrayIconSys *QSystemTrayIconSysFactory::create(QSystemTrayIcon *trayIcon) const + { +- QApplication::sendEvent(q, e); ++ QSystemTrayIconSysFactoryInterface *f = factory(); ++ if (!f) { ++ qWarning("No systemtrayicon available"); ++ return 0; ++ } ++ return f->create(trayIcon); + } +-#endif + +-bool QSystemTrayIconSys::event(QEvent *e) ++bool QSystemTrayIconSysFactory::isAvailable() const + { +- if (e->type() == QEvent::ToolTip) { +- return QApplication::sendEvent(q, e); +- } +- return QWidget::event(e); ++ return factory(); + } + +-bool QSystemTrayIconSys::x11Event(XEvent *event) ++//////////////////////////////////////////////// ++QSystemTrayIconPrivate::~QSystemTrayIconPrivate() + { +- if (event->type == ReparentNotify) +- show(); +- return QWidget::x11Event(event); ++ qt_guiSystemTrayIconSysFactory()->unregisterSystemTrayIconPrivate(this); ++ delete sys; + } + +-//////////////////////////////////////////////////////////////////////////// + void QSystemTrayIconPrivate::install_sys() + { + Q_Q(QSystemTrayIcon); +- if (!sys) +- sys = new QSystemTrayIconSys(q); ++ if (!sys) { ++ // Register ourself even if create() fails: our "sys" will get created ++ // later by refreshTrayIconPrivates() if a systemtray becomes ++ // available. This situation can happen for applications which are ++ // started at login time, while the desktop itself is starting up. ++ qt_guiSystemTrayIconSysFactory()->registerSystemTrayIconPrivate(this); ++ sys = qt_guiSystemTrayIconSysFactory()->create(q); ++ if (!sys) { ++ return; ++ } ++ } ++ sys->updateVisibility(); + } + + QRect QSystemTrayIconPrivate::geometry_sys() const + { +- if (!sys) +- return QRect(); +- return QRect(sys->mapToGlobal(QPoint(0, 0)), sys->size()); ++ if (!sys || !visible) ++ return QRect(); ++ return sys->geometry(); + } + + void QSystemTrayIconPrivate::remove_sys() +@@ -350,35 +161,35 @@ void QSystemTrayIconPrivate::remove_sys( + if (!sys) + return; + QBalloonTip::hideBalloon(); +- sys->hide(); // this should do the trick, but... +- delete sys; // wm may resize system tray only for DestroyEvents +- sys = 0; ++ sys->updateVisibility(); + } + + void QSystemTrayIconPrivate::updateIcon_sys() + { +- if (!sys) ++ if (!sys || !visible) + return; + sys->updateIcon(); + } + + void QSystemTrayIconPrivate::updateMenu_sys() + { +- ++ if (!sys || !visible) ++ return; ++ sys->updateMenu(); + } + + void QSystemTrayIconPrivate::updateToolTip_sys() + { +- if (!sys) ++ if (!sys || !visible) + return; + #ifndef QT_NO_TOOLTIP +- sys->setToolTip(toolTip); ++ sys->updateToolTip(); + #endif + } + + bool QSystemTrayIconPrivate::isSystemTrayAvailable_sys() + { +- return QSystemTrayIconSys::locateSystemTray() != XNone; ++ return qt_guiSystemTrayIconSysFactory()->isAvailable(); + } + + bool QSystemTrayIconPrivate::supportsMessages_sys() +@@ -389,12 +200,9 @@ bool QSystemTrayIconPrivate::supportsMes + void QSystemTrayIconPrivate::showMessage_sys(const QString &message, const QString &title, + QSystemTrayIcon::MessageIcon icon, int msecs) + { +- if (!sys) ++ if (!sys || !visible) + return; +- QPoint g = sys->mapToGlobal(QPoint(0, 0)); +- QBalloonTip::showBalloon(icon, message, title, sys->q, +- QPoint(g.x() + sys->width()/2, g.y() + sys->height()/2), +- msecs); ++ sys->showMessage(message, title, icon, msecs); + } + + QT_END_NAMESPACE +Index: qt-everywhere-opensource-src-4.8.6/src/gui/util/qxembedsystemtrayicon_x11.cpp +=================================================================== +--- /dev/null ++++ qt-everywhere-opensource-src-4.8.6/src/gui/util/qxembedsystemtrayicon_x11.cpp +@@ -0,0 +1,469 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). ++** All rights reserved. ++** Contact: Nokia Corporation (qt-info@nokia.com) ++** ++** This file is part of the QtGui module of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** GNU Lesser General Public License Usage ++** This file may be used under the terms of the GNU Lesser General Public ++** License version 2.1 as published by the Free Software Foundation and ++** appearing in the file LICENSE.LGPL included in the packaging of this ++** file. Please review the following information to ensure the GNU Lesser ++** General Public License version 2.1 requirements will be met: ++** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Nokia gives you certain additional ++** rights. These rights are described in the Nokia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU General ++** Public License version 3.0 as published by the Free Software Foundation ++** and appearing in the file LICENSE.GPL included in the packaging of this ++** file. Please review the following information to ensure the GNU General ++** Public License version 3.0 requirements will be met: ++** http://www.gnu.org/copyleft/gpl.html. ++** ++** Other Usage ++** Alternatively, this file may be used in accordance with the terms and ++** conditions contained in a signed written agreement between you and Nokia. ++** ++** ++** ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++#include "qxembedsystemtrayicon_x11_p.h" ++ ++#ifndef QT_NO_SYSTEMTRAYICON ++ ++#include "private/qt_x11_p.h" ++#include "qapplication.h" ++#include "qevent.h" ++#include "qlist.h" ++#include "qmenu.h" ++#include "qpainter.h" ++#include "qpaintengine.h" ++#include "qsystemtrayicon_p.h" ++#include "qx11info_x11.h" ++ ++QT_BEGIN_INCLUDE_NAMESPACE ++#include ++#include ++#include ++#include ++QT_END_INCLUDE_NAMESPACE ++ ++QT_BEGIN_NAMESPACE ++ ++class QSystemTrayIconWidget : public QWidget ++{ ++public: ++ QSystemTrayIconWidget(QSystemTrayIcon *q, QXEmbedSystemTrayIconSys *s); ++ ~QSystemTrayIconWidget(); ++ ++ static Window locateSystemTray(); ++ ++protected: ++ void paintEvent(QPaintEvent *pe); ++ void resizeEvent(QResizeEvent *re); ++ bool x11Event(XEvent *event); ++ void mousePressEvent(QMouseEvent *event); ++ void mouseDoubleClickEvent(QMouseEvent *event); ++#ifndef QT_NO_WHEELEVENT ++ void wheelEvent(QWheelEvent *event); ++#endif ++ bool event(QEvent *e); ++ ++private: ++ enum { ++ SYSTEM_TRAY_REQUEST_DOCK = 0, ++ SYSTEM_TRAY_BEGIN_MESSAGE = 1, ++ SYSTEM_TRAY_CANCEL_MESSAGE =2 ++ }; ++ ++ void addToTray(); ++ static XVisualInfo* getSysTrayVisualInfo(); ++ ++ static Window sysTrayWindow; ++ static QList trayIcons; ++ static QCoreApplication::EventFilter oldEventFilter; ++ static bool sysTrayTracker(void *message, long *result); ++ static Atom sysTraySelection; ++ static XVisualInfo sysTrayVisual; ++ ++ QSystemTrayIcon *q; ++ QXEmbedSystemTrayIconSys *sys; ++ Colormap colormap; ++}; ++ ++Window QSystemTrayIconWidget::sysTrayWindow = XNone; ++QList QSystemTrayIconWidget::trayIcons; ++QCoreApplication::EventFilter QSystemTrayIconWidget::oldEventFilter = 0; ++Atom QSystemTrayIconWidget::sysTraySelection = XNone; ++XVisualInfo QSystemTrayIconWidget::sysTrayVisual = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; ++ ++QSystemTrayIconWidget::QSystemTrayIconWidget(QSystemTrayIcon* q, QXEmbedSystemTrayIconSys* sys) ++: QWidget(0, Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint) ++, q(q) ++, sys(sys) ++, colormap(0) ++{ ++ setAttribute(Qt::WA_AlwaysShowToolTips); ++ setAttribute(Qt::WA_QuitOnClose, false); ++ setAttribute(Qt::WA_NoSystemBackground, true); ++ setAttribute(Qt::WA_PaintOnScreen); ++ setMouseTracking(true); ++#ifndef QT_NO_TOOLTIP ++ setToolTip(q->toolTip()); ++#endif ++ ++ static bool eventFilterAdded = false; ++ Display *display = QX11Info::display(); ++ if (!eventFilterAdded) { ++ oldEventFilter = qApp->setEventFilter(sysTrayTracker); ++ eventFilterAdded = true; ++ Window root = QX11Info::appRootWindow(); ++ XWindowAttributes attr; ++ XGetWindowAttributes(display, root, &attr); ++ if ((attr.your_event_mask & StructureNotifyMask) != StructureNotifyMask) { ++ (void) QApplication::desktop(); // lame trick to ensure our event mask is not overridden ++ XSelectInput(display, root, attr.your_event_mask | StructureNotifyMask); // for MANAGER selection ++ } ++ } ++ if (trayIcons.isEmpty()) { ++ sysTrayWindow = locateSystemTray(); ++ if (sysTrayWindow != XNone) ++ XSelectInput(display, sysTrayWindow, StructureNotifyMask); // track tray events ++ } ++ trayIcons.append(this); ++ if (sysTrayWindow != XNone) ++ addToTray(); ++} ++ ++QSystemTrayIconWidget::~QSystemTrayIconWidget() ++{ ++ trayIcons.removeAt(trayIcons.indexOf(this)); ++ Display *display = QX11Info::display(); ++ if (trayIcons.isEmpty()) { ++ if (sysTrayWindow == XNone) ++ return; ++ if (display) ++ XSelectInput(display, sysTrayWindow, 0); // stop tracking the tray ++ sysTrayWindow = XNone; ++ } ++ if (colormap) ++ XFreeColormap(display, colormap); ++} ++ ++void QSystemTrayIconWidget::resizeEvent(QResizeEvent *re) ++{ ++ QWidget::resizeEvent(re); ++ update(); ++} ++ ++void QSystemTrayIconWidget::paintEvent(QPaintEvent*) ++{ ++ QPainter p(this); ++ if (!getSysTrayVisualInfo()) { ++ const QRegion oldSystemClip = p.paintEngine()->systemClip(); ++ const QRect clearedRect = oldSystemClip.boundingRect(); ++ XClearArea(QX11Info::display(), winId(), clearedRect.x(), clearedRect.y(), ++ clearedRect.width(), clearedRect.height(), False); ++ QPaintEngine *pe = p.paintEngine(); ++ pe->setSystemClip(clearedRect); ++ q->icon().paint(&p, rect()); ++ pe->setSystemClip(oldSystemClip); ++ } else { ++ p.setCompositionMode(QPainter::CompositionMode_Source); ++ p.fillRect(rect(), Qt::transparent); ++ p.setCompositionMode(QPainter::CompositionMode_SourceOver); ++ q->icon().paint(&p, rect()); ++ } ++} ++ ++void QSystemTrayIconWidget::mousePressEvent(QMouseEvent *ev) ++{ ++ QPoint globalPos = ev->globalPos(); ++ if (ev->button() == Qt::RightButton && q->contextMenu()) ++ q->contextMenu()->popup(globalPos); ++ ++ if (QBalloonTip::isBalloonVisible()) { ++ QMetaObject::invokeMethod(q, "messageClicked"); ++ QBalloonTip::hideBalloon(); ++ } ++ ++ if (ev->button() == Qt::LeftButton) ++ qtsystray_sendActivated(q, QSystemTrayIcon::Trigger); ++ else if (ev->button() == Qt::RightButton) ++ qtsystray_sendActivated(q, QSystemTrayIcon::Context); ++ else if (ev->button() == Qt::MidButton) ++ qtsystray_sendActivated(q, QSystemTrayIcon::MiddleClick); ++} ++ ++void QSystemTrayIconWidget::mouseDoubleClickEvent(QMouseEvent *ev) ++{ ++ if (ev->button() == Qt::LeftButton) ++ qtsystray_sendActivated(q, QSystemTrayIcon::DoubleClick); ++} ++ ++#ifndef QT_NO_WHEELEVENT ++void QSystemTrayIconWidget::wheelEvent(QWheelEvent *e) ++{ ++ sys->sendWheelEventToTrayIcon(e->delta(), e->orientation()); ++} ++#endif ++ ++bool QSystemTrayIconWidget::event(QEvent *e) ++{ ++ if (e->type() == QEvent::ToolTip) { ++ sys->sendToolTipEventToTrayIcon(); ++ } ++ return QWidget::event(e); ++} ++ ++bool QSystemTrayIconWidget::x11Event(XEvent *event) ++{ ++ if (event->type == ReparentNotify) ++ show(); ++ return QWidget::x11Event(event); ++} ++ ++// Locate the system tray ++Window QSystemTrayIconWidget::locateSystemTray() ++{ ++ Display *display = QX11Info::display(); ++ if (sysTraySelection == XNone) { ++ int screen = QX11Info::appScreen(); ++ QString net_sys_tray = QString::fromLatin1("_NET_SYSTEM_TRAY_S%1").arg(screen); ++ sysTraySelection = XInternAtom(display, net_sys_tray.toLatin1(), False); ++ } ++ ++ return XGetSelectionOwner(QX11Info::display(), sysTraySelection); ++} ++ ++XVisualInfo* QSystemTrayIconWidget::getSysTrayVisualInfo() ++{ ++ Display *display = QX11Info::display(); ++ ++ if (!sysTrayVisual.visual) { ++ Window win = locateSystemTray(); ++ if (win != XNone) { ++ Atom actual_type; ++ int actual_format; ++ ulong nitems, bytes_remaining; ++ uchar *data = 0; ++ int result = XGetWindowProperty(display, win, ATOM(_NET_SYSTEM_TRAY_VISUAL), 0, 1, ++ False, XA_VISUALID, &actual_type, ++ &actual_format, &nitems, &bytes_remaining, &data); ++ VisualID vid = 0; ++ if (result == Success && data && actual_type == XA_VISUALID && actual_format == 32 && ++ nitems == 1 && bytes_remaining == 0) ++ vid = *(VisualID*)data; ++ if (data) ++ XFree(data); ++ if (vid == 0) ++ return 0; ++ ++ uint mask = VisualIDMask; ++ XVisualInfo *vi, rvi; ++ int count; ++ rvi.visualid = vid; ++ vi = XGetVisualInfo(display, mask, &rvi, &count); ++ if (vi) { ++ sysTrayVisual = vi[0]; ++ XFree((char*)vi); ++ } ++ if (sysTrayVisual.depth != 32) ++ memset(&sysTrayVisual, 0, sizeof(sysTrayVisual)); ++ } ++ } ++ ++ return sysTrayVisual.visual ? &sysTrayVisual : 0; ++} ++ ++bool QSystemTrayIconWidget::sysTrayTracker(void *message, long *result) ++{ ++ bool retval = false; ++ if (QSystemTrayIconWidget::oldEventFilter) ++ retval = QSystemTrayIconWidget::oldEventFilter(message, result); ++ ++ if (trayIcons.isEmpty()) ++ return retval; ++ ++ Display *display = QX11Info::display(); ++ XEvent *ev = (XEvent *)message; ++ if (ev->type == DestroyNotify && ev->xany.window == sysTrayWindow) { ++ sysTrayWindow = locateSystemTray(); ++ memset(&sysTrayVisual, 0, sizeof(sysTrayVisual)); ++ for (int i = 0; i < trayIcons.count(); i++) { ++ if (sysTrayWindow == XNone) { ++ QBalloonTip::hideBalloon(); ++ trayIcons[i]->hide(); // still no luck ++ trayIcons[i]->destroy(); ++ trayIcons[i]->create(); ++ } else ++ trayIcons[i]->addToTray(); // add it to the new tray ++ } ++ retval = true; ++ } else if (ev->type == ClientMessage && sysTrayWindow == XNone) { ++ static Atom manager_atom = XInternAtom(display, "MANAGER", False); ++ XClientMessageEvent *cm = (XClientMessageEvent *)message; ++ if ((cm->message_type == manager_atom) && ((Atom)cm->data.l[1] == sysTraySelection)) { ++ sysTrayWindow = cm->data.l[2]; ++ memset(&sysTrayVisual, 0, sizeof(sysTrayVisual)); ++ XSelectInput(display, sysTrayWindow, StructureNotifyMask); ++ for (int i = 0; i < trayIcons.count(); i++) { ++ trayIcons[i]->addToTray(); ++ } ++ retval = true; ++ } ++ } else if (ev->type == PropertyNotify && ev->xproperty.atom == ATOM(_NET_SYSTEM_TRAY_VISUAL) && ++ ev->xproperty.window == sysTrayWindow) { ++ memset(&sysTrayVisual, 0, sizeof(sysTrayVisual)); ++ for (int i = 0; i < trayIcons.count(); i++) { ++ trayIcons[i]->addToTray(); ++ } ++ } ++ ++ return retval; ++} ++ ++void QSystemTrayIconWidget::addToTray() ++{ ++ Q_ASSERT(sysTrayWindow != XNone); ++ Display *display = QX11Info::display(); ++ ++ XVisualInfo *vi = getSysTrayVisualInfo(); ++ if (vi && vi->visual) { ++ Window root = RootWindow(display, vi->screen); ++ Window p = root; ++ if (QWidget *pw = parentWidget()) ++ p = pw->effectiveWinId(); ++ colormap = XCreateColormap(display, root, vi->visual, AllocNone); ++ XSetWindowAttributes wsa; ++ wsa.background_pixmap = 0; ++ wsa.colormap = colormap; ++ wsa.background_pixel = 0; ++ wsa.border_pixel = 0; ++ Window wid = XCreateWindow(display, p, -1, -1, 1, 1, ++ 0, vi->depth, InputOutput, vi->visual, ++ CWBackPixmap|CWBackPixel|CWBorderPixel|CWColormap, &wsa); ++ create(wid); ++ } else { ++ XSetWindowBackgroundPixmap(display, winId(), ParentRelative); ++ } ++ ++ // GNOME, NET WM Specification ++ static Atom netwm_tray_atom = XInternAtom(display, "_NET_SYSTEM_TRAY_OPCODE", False); ++ long l[5] = { CurrentTime, SYSTEM_TRAY_REQUEST_DOCK, static_cast(winId()), 0, 0 }; ++ XEvent ev; ++ memset(&ev, 0, sizeof(ev)); ++ ev.xclient.type = ClientMessage; ++ ev.xclient.window = sysTrayWindow; ++ ev.xclient.message_type = netwm_tray_atom; ++ ev.xclient.format = 32; ++ memcpy((char *)&ev.xclient.data, (const char *) l, sizeof(l)); ++ XSendEvent(display, sysTrayWindow, False, 0, &ev); ++ setMinimumSize(22, 22); // required at least on GNOME ++} ++ ++//////////////////////////////////////////////////////////////////////////// ++QXEmbedSystemTrayIconSys::QXEmbedSystemTrayIconSys(QSystemTrayIcon *q) ++: QAbstractSystemTrayIconSys(q) ++, widget(0) ++{ ++} ++ ++QXEmbedSystemTrayIconSys::~QXEmbedSystemTrayIconSys() ++{ ++ delete widget; ++} ++ ++QRect QXEmbedSystemTrayIconSys::geometry() const ++{ ++ if (!widget) ++ return QRect(); ++ return QRect(widget->mapToGlobal(QPoint(0, 0)), widget->size()); ++} ++ ++void QXEmbedSystemTrayIconSys::updateIcon() ++{ ++ if (!widget) ++ return; ++ widget->update(); ++} ++ ++void QXEmbedSystemTrayIconSys::updateToolTip() ++{ ++ if (!widget) ++ return; ++ widget->setToolTip(trayIcon->toolTip()); ++} ++ ++void QXEmbedSystemTrayIconSys::showMessage(const QString &message, const QString &title, ++ QSystemTrayIcon::MessageIcon icon, int msecs) ++{ ++ if (!widget) ++ return; ++ QPoint point = geometry().center(); ++ QBalloonTip::showBalloon(icon, message, title, trayIcon, point, msecs); ++} ++ ++void QXEmbedSystemTrayIconSys::updateVisibility() ++{ ++ bool visible = trayIcon->isVisible(); ++ if (visible && !widget) ++ widget = new QSystemTrayIconWidget(trayIcon, this); ++ else if (!visible && widget) { ++ delete widget; ++ widget = 0; ++ } ++} ++ ++void QXEmbedSystemTrayIconSys::sendToolTipEventToTrayIcon() ++{ ++#ifndef QT_NO_TOOLTIP ++ // Pass the event through QSystemTrayIcon so that it gets a chance to ++ // update the tooltip, then asks widget to show the tooltip ++ Q_ASSERT(widget); ++ QPoint globalPos = QCursor::pos(); ++ QPoint pos = widget->mapFromGlobal(globalPos); ++ QHelpEvent event(QEvent::ToolTip, pos, globalPos); ++ QApplication::sendEvent(trayIcon, &event); ++#endif ++} ++ ++void QXEmbedSystemTrayIconSys::sendWheelEventToTrayIcon(int delta, Qt::Orientation orientation) ++{ ++#ifndef QT_NO_WHEELEVENT ++ Q_ASSERT(widget); ++ QPoint globalPos = QCursor::pos(); ++ QPoint pos = widget->mapFromGlobal(globalPos); ++ QWheelEvent event(pos, globalPos, delta, Qt::NoButton, Qt::NoModifier, orientation); ++ QApplication::sendEvent(trayIcon, &event); ++#endif ++} ++ ++void QXEmbedSystemTrayIconSys::updateMenu() ++{ ++} ++ ++///////////////////////////////////////////////////////////// ++QAbstractSystemTrayIconSys * QXEmbedSystemTrayIconSysFactory::create(QSystemTrayIcon *icon) ++{ ++ return new QXEmbedSystemTrayIconSys(icon); ++} ++ ++bool QXEmbedSystemTrayIconSysFactory::isAvailable() const ++{ ++ return QSystemTrayIconWidget::locateSystemTray() != XNone; ++} ++ ++QT_END_NAMESPACE ++#endif //QT_NO_SYSTEMTRAYICON +Index: qt-everywhere-opensource-src-4.8.6/src/gui/util/qxembedsystemtrayicon_x11_p.h +=================================================================== +--- /dev/null ++++ qt-everywhere-opensource-src-4.8.6/src/gui/util/qxembedsystemtrayicon_x11_p.h +@@ -0,0 +1,104 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). ++** All rights reserved. ++** Contact: Nokia Corporation (qt-info@nokia.com) ++** ++** This file is part of the QtGui module of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:LGPL$ ++** GNU Lesser General Public License Usage ++** This file may be used under the terms of the GNU Lesser General Public ++** License version 2.1 as published by the Free Software Foundation and ++** appearing in the file LICENSE.LGPL included in the packaging of this ++** file. Please review the following information to ensure the GNU Lesser ++** General Public License version 2.1 requirements will be met: ++** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ++** ++** In addition, as a special exception, Nokia gives you certain additional ++** rights. These rights are described in the Nokia Qt LGPL Exception ++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ++** ++** GNU General Public License Usage ++** Alternatively, this file may be used under the terms of the GNU General ++** Public License version 3.0 as published by the Free Software Foundation ++** and appearing in the file LICENSE.GPL included in the packaging of this ++** file. Please review the following information to ensure the GNU General ++** Public License version 3.0 requirements will be met: ++** http://www.gnu.org/copyleft/gpl.html. ++** ++** Other Usage ++** Alternatively, this file may be used in accordance with the terms and ++** conditions contained in a signed written agreement between you and Nokia. ++** ++** ++** ++** ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++#ifndef QXEMBEDSYSTEMTRAYICON_X11_P_H ++#define QXEMBEDSYSTEMTRAYICON_X11_P_H ++ ++// ++// W A R N I N G ++// ------------- ++// ++// This file is not part of the Qt API. It exists for the convenience ++// of a number of Qt sources files. This header file may change from ++// version to version without notice, or even be removed. ++// ++// We mean it. ++// ++ ++#ifndef QT_NO_SYSTEMTRAYICON ++ ++#include "qabstractsystemtrayiconsys_p.h" ++ ++QT_BEGIN_NAMESPACE ++ ++class QSystemTrayIconWidget; ++ ++class QXEmbedSystemTrayIconSys : public QAbstractSystemTrayIconSys ++{ ++public: ++ QXEmbedSystemTrayIconSys(QSystemTrayIcon *); ++ ~QXEmbedSystemTrayIconSys(); ++ ++ QRect geometry() const; ++ ++ void updateVisibility(); ++ ++ void updateIcon(); ++ ++ void updateToolTip(); ++ ++ void updateMenu(); ++ ++ void showMessage(const QString &message, const QString &title, ++ QSystemTrayIcon::MessageIcon icon, int msecs); ++ ++private: ++ friend class QSystemTrayIconWidget; ++ QSystemTrayIconWidget *widget; ++ ++ void sendToolTipEventToTrayIcon(); ++ ++ void sendWheelEventToTrayIcon(int delta, Qt::Orientation orientation); ++}; ++ ++struct QXEmbedSystemTrayIconSysFactory : public QSystemTrayIconSysFactoryInterface ++{ ++ QAbstractSystemTrayIconSys * create(QSystemTrayIcon *trayIcon); ++ bool isAvailable() const; ++}; ++ ++ ++QT_END_NAMESPACE ++ ++#endif // QT_NO_SYSTEMTRAYICON ++ ++#endif // QXEMBEDSYSTEMTRAYICON_X11_P_H ++ +Index: qt-everywhere-opensource-src-4.8.6/src/gui/util/util.pri +=================================================================== +--- qt-everywhere-opensource-src-4.8.6.orig/src/gui/util/util.pri ++++ qt-everywhere-opensource-src-4.8.6/src/gui/util/util.pri +@@ -29,8 +29,13 @@ wince* { + } + + unix:x11 { ++ HEADERS += \ ++ util/qabstractsystemtrayiconsys_p.h \ ++ util/qxembedsystemtrayicon_x11_p.h + SOURCES += \ +- util/qsystemtrayicon_x11.cpp ++ util/qabstractsystemtrayiconsys.cpp \ ++ util/qsystemtrayicon_x11.cpp \ ++ util/qxembedsystemtrayicon_x11.cpp + } + + embedded|qpa { diff --git a/desktop/toolkit/qt/files/opensuse/build-qvfb-tool.diff b/desktop/toolkit/qt/files/opensuse/build-qvfb-tool.diff new file mode 100644 index 0000000000..085811baf8 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/build-qvfb-tool.diff @@ -0,0 +1,13 @@ +Index: tools/tools.pro +=================================================================== +--- tools/tools.pro.orig ++++ tools/tools.pro +@@ -37,6 +37,8 @@ mac { + + embedded:SUBDIRS += kmap2qmap + ++SUBDIRS += qvfb ++ + contains(QT_CONFIG, dbus):SUBDIRS += qdbus + # We don't need these command line utilities on embedded platforms. + !wince*:!symbian:contains(QT_CONFIG, xmlpatterns): SUBDIRS += xmlpatterns xmlpatternsvalidator diff --git a/desktop/toolkit/qt/files/opensuse/fix-moc-from-choking-on-boost-headers.patch b/desktop/toolkit/qt/files/opensuse/fix-moc-from-choking-on-boost-headers.patch new file mode 100644 index 0000000000..ed0f5e83e9 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/fix-moc-from-choking-on-boost-headers.patch @@ -0,0 +1,12 @@ +--- qt-snapshot/src/tools/moc/main.cpp 2013-03-16 19:09:31.954011186 +0100 ++++ qt-snapshot/src/tools/moc/main.cpp 2013-05-28 22:38:39.781681541 +0200 +@@ -190,6 +190,8 @@ int runMoc(int _argc, char **_argv) + + // Workaround a bug while parsing the boost/type_traits/has_operator.hpp header. See QTBUG-22829 + pp.macros["BOOST_TT_HAS_OPERATOR_HPP_INCLUDED"]; ++ pp.macros["BOOST_LEXICAL_CAST_INCLUDED"]; ++ pp.macros["BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION"]; + + QByteArray filename; + QByteArray output; + diff --git a/desktop/toolkit/qt/files/opensuse/fix_assistant_segfault_QTBUG-25324.patch b/desktop/toolkit/qt/files/opensuse/fix_assistant_segfault_QTBUG-25324.patch new file mode 100644 index 0000000000..75bbdb7cf2 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/fix_assistant_segfault_QTBUG-25324.patch @@ -0,0 +1,14 @@ +Index: qt-everywhere-opensource-src-4.8.3/tools/assistant/tools/assistant/mainwindow.cpp +=================================================================== +--- qt-everywhere-opensource-src-4.8.3.orig/tools/assistant/tools/assistant/mainwindow.cpp ++++ qt-everywhere-opensource-src-4.8.3/tools/assistant/tools/assistant/mainwindow.cpp +@@ -945,8 +945,7 @@ void MainWindow::updateApplicationFont() + if (helpEngine.usesAppFont()) + font = helpEngine.appFont(); + +- const QWidgetList &widgets = qApp->allWidgets(); +- foreach (QWidget* widget, widgets) ++ foreach (QWidget* widget, QApplication::allWidgets()) + widget->setFont(font); + } + diff --git a/desktop/toolkit/qt/files/opensuse/handle-tga-files-properly.diff b/desktop/toolkit/qt/files/opensuse/handle-tga-files-properly.diff new file mode 100644 index 0000000000..6fbe0cb7a1 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/handle-tga-files-properly.diff @@ -0,0 +1,56 @@ +Index: src/plugins/imageformats/tga/qtgafile.cpp +=================================================================== +--- src/plugins/imageformats/tga/qtgafile.cpp.orig ++++ src/plugins/imageformats/tga/qtgafile.cpp +@@ -41,6 +41,7 @@ + + #include "qtgafile.h" + ++#include + #include + #include + #include +@@ -266,3 +267,16 @@ QImage QTgaFile::readImage() + // TODO: add processing of TGA extension information - ie TGA 2.0 files + return im; + } ++/** ++ * Checks if device contains a valid tga image, *without* changing device ++ * position. ++ */ ++bool QTgaFile::canRead(QIODevice *device) ++{ ++ QByteArray header = device->peek(HeaderSize); ++ if (header.size() < HeaderSize) ++ return false; ++ QBuffer buffer(&header); ++ QTgaFile tga(&buffer); ++ return tga.isValid(); ++} +Index: src/plugins/imageformats/tga/qtgafile.h +=================================================================== +--- src/plugins/imageformats/tga/qtgafile.h.orig ++++ src/plugins/imageformats/tga/qtgafile.h +@@ -93,6 +93,8 @@ public: + inline QSize size() const; + inline Compression compression() const; + ++ static bool canRead(QIODevice *device); ++ + private: + static inline quint16 littleEndianInt(const unsigned char *d); + +Index: src/plugins/imageformats/tga/qtgahandler.cpp +=================================================================== +--- src/plugins/imageformats/tga/qtgahandler.cpp.orig ++++ src/plugins/imageformats/tga/qtgahandler.cpp +@@ -77,8 +77,7 @@ bool QTgaHandler::canRead(QIODevice *dev + qWarning("QTgaHandler::canRead() called with no device"); + return false; + } +- QTgaFile tga(device); +- return tga.isValid(); ++ return QTgaFile::canRead(device); + } + + bool QTgaHandler::read(QImage *image) diff --git a/desktop/toolkit/qt/files/opensuse/libqt4-libtool-nodate.diff b/desktop/toolkit/qt/files/opensuse/libqt4-libtool-nodate.diff new file mode 100644 index 0000000000..f2b43991a0 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/libqt4-libtool-nodate.diff @@ -0,0 +1,13 @@ +Index: qmake/generators/unix/unixmake2.cpp +=================================================================== +--- qmake/generators/unix/unixmake2.cpp.orig ++++ qmake/generators/unix/unixmake2.cpp +@@ -1301,7 +1301,7 @@ UnixMakefileGenerator::writeLibtoolFile( + QTextStream t(&ft); + t << "# " << lname << " - a libtool library file\n"; + t << "# Generated by qmake/libtool (" << qmake_version() << ") (Qt " +- << QT_VERSION_STR << ") on: " << QDateTime::currentDateTime().toString(); ++ << QT_VERSION_STR << ")"; + t << "\n"; + + t << "# The name that we can dlopen(3).\n" diff --git a/desktop/toolkit/qt/files/opensuse/no-moc-date.diff b/desktop/toolkit/qt/files/opensuse/no-moc-date.diff new file mode 100644 index 0000000000..fdc6b264bc --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/no-moc-date.diff @@ -0,0 +1,26 @@ +--- tools/qdbus/qdbusxml2cpp/qdbusxml2cpp.cpp.orig ++++ tools/qdbus/qdbusxml2cpp/qdbusxml2cpp.cpp +@@ -549,9 +549,11 @@ static void writeProxy(const QString &fi + } else { + includeGuard = QLatin1String("QDBUSXML2CPP_PROXY"); + } ++#if 0 + includeGuard = QString(QLatin1String("%1_%2")) + .arg(includeGuard) + .arg(QDateTime::currentDateTime().toTime_t()); ++#endif + hs << "#ifndef " << includeGuard << endl + << "#define " << includeGuard << endl + << endl; +@@ -855,9 +857,11 @@ static void writeAdaptor(const QString & + } else { + includeGuard = QLatin1String("QDBUSXML2CPP_ADAPTOR"); + } ++#if 0 + includeGuard = QString(QLatin1String("%1_%2")) + .arg(includeGuard) + .arg(QDateTime::currentDateTime().toTime_t()); ++#endif + hs << "#ifndef " << includeGuard << endl + << "#define " << includeGuard << endl + << endl; diff --git a/desktop/toolkit/qt/files/opensuse/qatomic-generic.patch b/desktop/toolkit/qt/files/opensuse/qatomic-generic.patch new file mode 100644 index 0000000000..1f2347fd38 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/qatomic-generic.patch @@ -0,0 +1,21 @@ +Index: qt-everywhere-opensource-src-4.8.4/src/corelib/arch/qatomic_generic.h +=================================================================== +--- qt-everywhere-opensource-src-4.8.4.orig/src/corelib/arch/qatomic_generic.h ++++ qt-everywhere-opensource-src-4.8.4/src/corelib/arch/qatomic_generic.h +@@ -109,6 +109,16 @@ Q_CORE_EXPORT bool QBasicAtomicPointer_t + Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *, void *); + Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *, qptrdiff); + ++inline bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *_q_value, const void *expected_value, const void *newValue) ++{ ++ return QBasicAtomicPointer_testAndSetOrdered(_q_value, const_cast(expected_value), const_cast(newValue)); ++} ++ ++inline void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *_q_value, const void *newValue) ++{ ++ return QBasicAtomicPointer_fetchAndStoreOrdered(_q_value, const_cast(newValue)); ++} ++ + // Reference counting + + inline bool QBasicAtomicInt::ref() diff --git a/desktop/toolkit/qt/files/opensuse/qdbusconnection-no-warning-output.patch b/desktop/toolkit/qt/files/opensuse/qdbusconnection-no-warning-output.patch new file mode 100644 index 0000000000..eed366fd5b --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/qdbusconnection-no-warning-output.patch @@ -0,0 +1,15 @@ +Index: src/dbus/qdbusconnection.cpp +=================================================================== +--- src/dbus/qdbusconnection.cpp.orig ++++ src/dbus/qdbusconnection.cpp +@@ -1110,8 +1110,10 @@ public: + // make sure this connection is running on the main thread + QCoreApplication *instance = QCoreApplication::instance(); + if (!instance) { ++#ifndef QT_NO_DEBUG + qWarning("QDBusConnection: %s D-Bus connection created before QCoreApplication. Application may misbehave.", + type == SessionBus ? "session" : type == SystemBus ? "system" : "generic"); ++#endif + } else if (QDBusConnectionPrivate::d(*this)) { + QDBusConnectionPrivate::d(*this)->moveToThread(instance->thread()); + } diff --git a/desktop/toolkit/qt/files/opensuse/qfatal-noreturn.diff b/desktop/toolkit/qt/files/opensuse/qfatal-noreturn.diff new file mode 100644 index 0000000000..2fafb87e42 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/qfatal-noreturn.diff @@ -0,0 +1,12 @@ +Index: src/corelib/global/qglobal.h +=================================================================== +--- src/corelib/global/qglobal.h.orig ++++ src/corelib/global/qglobal.h +@@ -1772,6 +1772,7 @@ Q_CORE_EXPORT void qCritical(const char + Q_CORE_EXPORT void qFatal(const char *, ...) /* print fatal message and exit */ + #if defined(Q_CC_GNU) && !defined(__INSURE__) + __attribute__ ((format (printf, 1, 2))) ++ __attribute__ ((noreturn)) + #endif + ; + diff --git a/desktop/toolkit/qt/files/opensuse/qlocale_icu-no-warning-output.patch b/desktop/toolkit/qt/files/opensuse/qlocale_icu-no-warning-output.patch new file mode 100644 index 0000000000..f54715e786 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/qlocale_icu-no-warning-output.patch @@ -0,0 +1,61 @@ +From b924fb26f14b38c5a92d7271b2eba73080cfb337 Mon Sep 17 00:00:00 2001 +From: Hrvoje Senjan +Date: Tue, 30 Jul 2013 01:02:38 +0200 +Subject: [PATCH 1/1] qlocale_icu-no-warning-output.patch + +Since openSUSE now has it's own icu so versioning, and +we can't predict what will happen in future, qWarnings +about icu libraries and symbols are now only emmited in +debug builds. This will be usefull regardless of icu versioning. + +--- + src/corelib/tools/qlocale_icu.cpp | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/src/corelib/tools/qlocale_icu.cpp b/src/corelib/tools/qlocale_icu.cpp +index c3e2907..ce09677 100644 +--- a/src/corelib/tools/qlocale_icu.cpp ++++ b/src/corelib/tools/qlocale_icu.cpp +@@ -84,7 +84,9 @@ bool qt_initIcu(const QString &localeString) + QLibrary lib(QLatin1String("icui18n"), QLatin1String(U_ICU_VERSION_SHORT)); + lib.setLoadHints(QLibrary::ImprovedSearchHeuristics); + if (!lib.load()) { ++#ifndef QT_NO_DEBUG + qWarning() << "Unable to load library icui18n" << lib.errorString(); ++#endif + status = ErrorLoading; + return false; + } +@@ -105,7 +107,9 @@ bool qt_initIcu(const QString &localeString) + ptr_ucol_close = 0; + ptr_ucol_strcoll = 0; + ++#ifndef QT_NO_DEBUG + qWarning("Unable to find symbols in icui18n"); ++#endif + status = ErrorLoading; + return false; + } +@@ -114,7 +118,9 @@ bool qt_initIcu(const QString &localeString) + QLibrary ucLib(QLatin1String("icuuc"), QLatin1String(U_ICU_VERSION_SHORT)); + ucLib.setLoadHints(QLibrary::ImprovedSearchHeuristics); + if (!ucLib.load()) { ++#ifndef QT_NO_DEBUG + qWarning() << "Unable to load library icuuc" << ucLib.errorString(); ++#endif + status = ErrorLoading; + return false; + } +@@ -131,7 +137,9 @@ bool qt_initIcu(const QString &localeString) + ptr_u_strToUpper = 0; + ptr_u_strToLower = 0; + ++#ifndef QT_NO_DEBUG + qWarning("Unable to find symbols in icuuc"); ++#endif + status = ErrorLoading; + return false; + } +-- +1.8.3.1 + diff --git a/desktop/toolkit/qt/files/opensuse/qt-debug-timer.diff b/desktop/toolkit/qt/files/opensuse/qt-debug-timer.diff new file mode 100644 index 0000000000..585ba294c6 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/qt-debug-timer.diff @@ -0,0 +1,26 @@ +Index: src/corelib/kernel/qeventdispatcher_unix.cpp +=================================================================== +--- src/corelib/kernel/qeventdispatcher_unix.cpp.orig ++++ src/corelib/kernel/qeventdispatcher_unix.cpp +@@ -592,6 +592,21 @@ int QTimerInfoList::activateTimers() + + if (!firstTimerInfo) { + firstTimerInfo = currentTimerInfo; ++ QObject* o = firstTimerInfo->obj; ++ static int debug_timer = -1; ++ if (debug_timer < 0) ++ debug_timer = getenv("QT_DEBUG_TIMER") ? 1 : 0; ++ if (debug_timer > 0) { ++ QString objPath = o->objectName(); ++ if(objPath.isEmpty()) objPath = QLatin1String("<") + o->parent()->metaObject()->className() + QLatin1String(">"); ++ for (; o->parent(); o = o->parent()) ++ if (!o->parent()->objectName().isEmpty()) ++ objPath.prepend(o->parent()->objectName() + "/"); ++ else ++ objPath.prepend(QLatin1String("<") + o->parent()->metaObject()->className() + QLatin1String(">/")); ++ qDebug("activating %d ms timer for %s", firstTimerInfo->interval.tv_sec * 1000 ++ + firstTimerInfo->interval.tv_usec / 1000, qPrintable(objPath)); ++ } + } else if (firstTimerInfo == currentTimerInfo) { + // avoid sending the same timer multiple times + break; diff --git a/desktop/toolkit/qt/files/opensuse/qt-never-strip.diff b/desktop/toolkit/qt/files/opensuse/qt-never-strip.diff new file mode 100644 index 0000000000..81e9c67e18 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/qt-never-strip.diff @@ -0,0 +1,30 @@ +Index: configure +=================================================================== +--- configure.orig ++++ configure +@@ -65,7 +65,6 @@ OPT_CMDLINE=`echo $@ | sed "s,-v ,,g; s, + + # initialize global variables + QMAKE_SWITCHES= +-QMAKE_VARS= + QMAKE_CONFIG= + QTCONFIG_CONFIG= + QT_CONFIG= +@@ -1625,7 +1624,7 @@ while [ "$#" -gt 0 ]; do + QMakeVar add QMAKE_CFLAGS -pg + QMakeVar add QMAKE_CXXFLAGS -pg + QMakeVar add QMAKE_LFLAGS -pg +- QMAKE_VARS="$QMAKE_VARS CONFIG+=nostrip" ++ QMakeVar add CONFIG nostrip + else + UNKNOWN_OPT=yes + fi +@@ -3359,6 +3358,8 @@ if [ "$OPT_VERBOSE" = "yes" ]; then + fi + fi + ++QMakeVar add CONFIG nostrip ++ + #------------------------------------------------------------------------------- + # tests that don't need qmake (must be run before displaying help) + #------------------------------------------------------------------------------- diff --git a/desktop/toolkit/qt/files/opensuse/use-freetype-default.diff b/desktop/toolkit/qt/files/opensuse/use-freetype-default.diff new file mode 100644 index 0000000000..e7b94a80b2 --- /dev/null +++ b/desktop/toolkit/qt/files/opensuse/use-freetype-default.diff @@ -0,0 +1,40 @@ +Index: src/gui/text/qfontengine_x11.cpp +=================================================================== +--- src/gui/text/qfontengine_x11.cpp.orig ++++ src/gui/text/qfontengine_x11.cpp +@@ -967,6 +967,26 @@ Q_GUI_EXPORT void qt_x11ft_convert_patte + *antialias = b; + } + ++#include ++#include FT_FREETYPE_H ++#include FT_LCD_FILTER_H ++ ++static bool subpixel_rendering_available() ++{ ++ static int implemented = -1; ++ ++ if (implemented >= 0) ++ return implemented; ++ ++ extern FT_Library qt_getFreetype(); ++ FT_Library lib = qt_getFreetype(); ++ ++ if (FT_Err_Unimplemented_Feature == ++ FT_Library_SetLcdFilter(lib, FT_LCD_FILTER_DEFAULT )) ++ return (implemented = false); ++ ++ return (implemented = true); ++} + + QFontEngineX11FT::QFontEngineX11FT(FcPattern *pattern, const QFontDef &fd, int screen) + : QFontEngineFT(fd) +@@ -984,7 +1004,7 @@ QFontEngineX11FT::QFontEngineX11FT(FcPat + canUploadGlyphsToServer = QApplication::testAttribute(Qt::AA_X11InitThreads) || (qApp->thread() == QThread::currentThread()); + + subpixelType = Subpixel_None; +- if (antialias) { ++ if (subpixel_rendering_available() && antialias) { + int subpixel = X11->display ? X11->screens[screen].subpixel : FC_RGBA_UNKNOWN; + if (subpixel == FC_RGBA_UNKNOWN) + (void) FcPatternGetInteger(pattern, FC_RGBA, 0, &subpixel); diff --git a/desktop/toolkit/qt/files/turkish.patch.bz2 b/desktop/toolkit/qt/files/turkish.patch.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..16b3bc68b64b398323790725e122f5b069ee4db2 GIT binary patch literal 35990 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 a*{~zFnVjMU=IDp~Mck226eKv@M + + + + qt + http://qt.nokia.com + + PisiLinux Community + admins@pisilinux.org + + LGPLv2.1 + GPLv3 + library +

Qt toolkit version 4 + Qt is a cross platform GUI toolkit. + http://download.qt-project.org/official_releases/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz + + mariadb-lib + cups-devel + mesa-devel + gtk2-devel + tiff-devel + libSM-devel + libICE-devel + libmng-devel + libXext-devel + alsa-lib-devel + firebird-devel + unixODBC-devel + libXrandr-devel + gstreamer-devel + fontconfig-devel + libXrender-devel + postgresql-server + libjpeg-turbo-devel + firebird-superserver + gst-plugins-base-devel + qtchooser + + + + fedora/qt-everywhere-opensource-src-4.8.0-tp-multilib-optflags.patch + fedora/qt-everywhere-opensource-src-4.8.5-uic_multilib.patch + fedora/qt-everywhere-opensource-src-4.8.5-webcore_debuginfo.patch + fedora/qt-cupsEnumDests.patch + fedora/qt-x11-opensource-src-4.5.1-enable_ft_lcdfilter.patch + fedora/qt-everywhere-opensource-src-4.6.3-glib_eventloop_nullcheck.patch + fedora/qt-everywhere-opensource-src-4.8.1-qt3support_debuginfo.patch + fedora/qt-everywhere-opensource-src-4.8.5-qt_plugin_path.patch + fedora/qt-everywhere-opensource-src-4.8.4-qmake_pkgconfig_requires_private.patch + fedora/qt-x11-opensource-src-4.5.0-fix-qatomic-inline-asm.patch + fedora/qt-everywhere-opensource-src-4.8.5-mysql_config.patch + fedora/qt-everywhere-opensource-src-4.6.2-cups.patch + fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-14467.patch + fedora/qt-everywhere-opensource-src-4.8.3-no_Werror.patch + fedora/qt-everywhere-opensource-src-4.8.0-QTBUG-22037.patch + fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-21900.patch + fedora/qt-everywhere-opensource-src-4.8.5-tds_no_strict_aliasing.patch + fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-4862.patch + fedora/qt-everywhere-opensource-src-4.8.5-QTBUG-35459.patch + fedora/qt-everywhere-opensource-src-4.8.5-qgtkstyle_disable_gtk_theme_check.patch + + fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-34614.patch + fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-37380.patch + fedora/qt-everywhere-opensource-src-4.8.6-QTBUG-38585.patch + + opensuse/qt-never-strip.diff + opensuse/use-freetype-default.diff + opensuse/0191-listview-alternate-row-colors.diff + opensuse/0188-fix-moc-parser-same-name-header.diff + opensuse/0195-compositing-properties.diff + opensuse/0180-window-role.diff + opensuse/0225-invalidate-tabbar-geometry-on-refresh.patch + opensuse/qt-debug-timer.diff + opensuse/qfatal-noreturn.diff + opensuse/no-moc-date.diff + opensuse/libqt4-libtool-nodate.diff + opensuse/build-qvfb-tool.diff + opensuse/handle-tga-files-properly.diff + opensuse/qdbusconnection-no-warning-output.patch + opensuse/fix_assistant_segfault_QTBUG-25324.patch + opensuse/qatomic-generic.patch + opensuse/QSystemTrayicon.diff + opensuse/fix-moc-from-choking-on-boost-headers.patch + opensuse/qlocale_icu-no-warning-output.patch + opensuse/0001-Don-t-crash-on-broken-GIF-images.patch + + CVE-2014-0190.patch + + turkish.patch.bz2 + + mkspecs.patch + + + + + qt + + mesa + tiff + libICE + libSM + libmng + libXext + alsa-lib + gstreamer + fontconfig + libXrender + libjpeg-turbo + qtchooser + + + /etc + /usr/lib/qt4/bin + /usr/bin/qdbus* + /usr/bin/qtconfig + /usr/lib + /usr/share/applications + /usr/lib/qt4/imports + /usr/lib/qt4/templates + /usr/share/qt4/translations/*_tr.* + + + data/qdbusviewer.desktop + data/qtconfig.desktop + + + + + qt-32bit + emul32 + 32-bit shared libraries for qt + emul32 + + mesa-32bit + tiff-32bit + dbus-32bit + zlib-32bit + glib2-32bit + libSM-32bit + libpng-32bit + libmng-32bit + libICE-32bit + libX11-32bit + sqlite-32bit + openssl-32bit + libXext-32bit + freetype-32bit + alsa-lib-32bit + libXrender-32bit + fontconfig-32bit + libjpeg-turbo-32bit + + + uClibc + mesa-32bit + tiff-32bit + dbus-32bit + zlib-32bit + libSM-32bit + glib2-32bit + libX11-32bit + libpng-32bit + libmng-32bit + libICE-32bit + sqlite-32bit + openssl-32bit + libXext-32bit + freetype-32bit + alsa-lib-32bit + libXrender-32bit + fontconfig-32bit + libjpeg-turbo-32bit + qt + + + /usr/lib32 + + + + + qt-webkit + + qt + gstreamer + libXrender + gst-plugins-base + + + /usr/lib/*WebKit* + + + + + qt-webkit-32bit + emul32 + 32-bit shared libraries for qt-webkit + emul32 + + glib2-32bit + libX11-32bit + sqlite-32bit + gstreamer-32bit + libXrender-32bit + gst-plugins-base-32bit + + + qt-webkit + qt-32bit + glib2-32bit + libX11-32bit + sqlite-32bit + gstreamer-32bit + libXrender-32bit + gst-plugins-base-32bit + + + /usr/lib32/*WebKit* + + + + + qt-webkit-devel + Development files for Qt Webkit + + qt-devel + + + /usr/include/Qt/*WebKit* + /usr/include/Qt/*webkit* + /usr/include/QtWebKit + /usr/lib/pkgconfig/*WebKit* + + + + + qt-devel + Development files for Qt + + qt + + mesa-devel + + + + /usr/bin + /usr/include + /usr/share/qt4/mkspecs + /usr/lib/pkgconfig + /usr/lib32/pkgconfig + /usr/share/qt4/q3porting.xml + + + + + qt-l10n + locale + Translation files for Qt library and tools. Supported languages are: da, de, fr, ja, pl, ru, zh_CN, zh_TW + + /usr/share/qt4/translations + + + + + qt-designer + designer + + qt + qt-webkit + + + /usr/bin/designer + /usr/lib/qt4/plugins/designer + /usr/share/applications/designer.desktop + /usr/share/pixmaps/designer.png + + + data/designer.desktop + data/designer.png + + + + + qt-linguist + linguist + + qt + + + /usr/bin/linguist + /usr/share/qt4/phrasebooks + /usr/share/applications/linguist.desktop + /usr/share/pixmaps/linguist.png + + + data/linguist.desktop + data/linguist.png + + + + + qt-docs + assistant + Development documents of Qt and Qt Assistant tool + + qt + qt-webkit + + + /usr/bin/assistant + /usr/share/applications/assistant.desktop + /usr/share/pixmaps/assistant.png + /usr/share/icons + /usr/share/doc + /usr/share/doc/qt4/qch + + + data/assistant.desktop + data/assistant.png + data/hi128-app-qt4-logo.png + data/hi48-app-qt4-logo.png + + + + + qt-docs-html + Development documents of Qt in HTML format + + /usr/share/doc/qt4/html + + + + + qt-demos + qt4-logo + + qt + qt-webkit + mesa + phonon + + + /usr/bin/qtdemo + /usr/lib/qt4/demos + /usr/lib/qt4/examples + /usr/lib/qt4/plugins/designer/libarthurplugin.so + /usr/share/applications/qtdemo.desktop + /usr/tests/qt4 + + + data/qtdemo.desktop + + + + + qt-sql-mysql + + qt + mariadb-lib + + + /usr/lib/qt4/plugins/sqldrivers/libqsqlmysql.so + + + + + qt-sql-postgresql + + qt + postgresql-lib + + + /usr/lib/qt4/plugins/sqldrivers/libqsqlpsql.so + + + + + qt-sql-sqlite + + qt + sqlite + + + /usr/lib/qt4/plugins/sqldrivers/libqsqlite.so + + + + + qt-sql-odbc + + qt + unixODBC + + + /usr/lib/qt4/plugins/sqldrivers/libqsqlodbc.so + + + + + qt-sql-ibase + + qt + firebird-client + + + /usr/lib/qt4/plugins/sqldrivers/libqsqlibase.so + + + + + + 2015-04-09 + 4.8.6 + Rebuild for qt5 + Ayhan Yalçınsoy + ayhanyalcinsoy@pisilinux.org + + + 2014-05-20 + 4.8.6 + Version bump, fix CVE. + Serdar Soytetir + kaptan@pisilinux.org + + + 2014-04-10 + 4.8.5 + Rebuild. + Serdar Soytetir + kaptan@pisilinux.org + + + 2014-02-21 + 4.8.5 + Rebuild for Mariadb. + Serdar Soytetir + kaptan@pisilinux.org + + + 2014-02-01 + 4.8.5 + Rebuild for new libmng. + Serdar Soytetir + kaptan@pisilinux.org + + + 2013-12-14 + 4.8.5 + Re-cleanup qt, fix systemtray issues. + Serdar Soytetir + kaptan@pisilinux.org + + + 2013-12-11 + 4.8.5 + Cleanup some patches, rebuild. + Serdar Soytetir + kaptan@pisilinux.org + + + 2013-08-05 + 4.8.5 + Patched. + Osman Erkan + osman.erkan@pisilinux.org + + + 2013-07-03 + 4.8.5 + Version bump. + Marcin Bojara + marcin@pisilinux.org + + + 2013-03-11 + 4.8.4 + Patch cleanup, add some enhancements. + Serdar Soytetir + kaptan@pisilinux.org + + + 2013-02-15 + 4.8.4 + Add emul32 + Marcin Bojara + marcin@pisilinux.org + + + 2012-12-08 + 4.8.4 + First release + Yusuf Aydemir + yusuf.aydemir@pisilinux.org + + + diff --git a/desktop/toolkit/qt/translations.xml b/desktop/toolkit/qt/translations.xml new file mode 100644 index 0000000000..fc38bd2536 --- /dev/null +++ b/desktop/toolkit/qt/translations.xml @@ -0,0 +1,35 @@ + + + + qt + Qt araç takımı, sürüm 4 + Qt bir çok platformda çalışabilen ve grafiksel kullanıcı arayüzü (GUI) oluşturmaya yarayan bir araç takımıdır. + Qt est une boîte à outils graphique multi-plateforme. + Qt es un toolkit para GUI multiplataforma. + + + + qt-devel + Qt için geliştirme dosyaları + + + + qt-webkit-devel + Qt Webkit için geliştirme dosyaları + + + + qt-l10n + Qt kitaplık ve araçları için dil dosyaları. Desteklenen diller: da, de, fr, ja, pl, ru, zh_CN, zh_TW + + + + qt-docs + Qt için geliştirme belgeleri ve Qt Assistant aracı + + + + qt-docs-html + Qt için HTML biçiminde geliştirme belgeleri + +