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 0000000000..bfb642dc2d
Binary files /dev/null and b/desktop/toolkit/qt/files/data/assistant.png differ
diff --git a/desktop/toolkit/qt/files/data/designer.desktop b/desktop/toolkit/qt/files/data/designer.desktop
new file mode 100644
index 0000000000..3415a53936
--- /dev/null
+++ b/desktop/toolkit/qt/files/data/designer.desktop
@@ -0,0 +1,132 @@
+[Desktop Entry]
+Encoding=UTF-8
+Exec=/usr/lib/qt4/bin/designer
+Name=Qt4 Designer
+Name[af]=Qt4 Ontwerper
+Name[ar]=مصمم Qt4
+Name[bn]=কিউ-টি ডিসাইনার
+Name[br]=Ergrafer Qt4
+Name[ca]=Dissenyador Qt4
+Name[cs]=Qt4 designer
+Name[cy]=Dylunydd Qt4
+Name[de]=Qt4-Designer
+Name[eo]=Qt4-Desegnilo
+Name[es]=Diseñador Qt4
+Name[eu]=Qt4 diseinatzailea
+Name[fa]=Qt4 طراح
+Name[gl]=Deseñador de Qt4
+Name[hi]=क्यूटी डिज़ाइनर
+Name[hr]=Qt4 Dizajner
+Name[hsb]=Qt4 designer
+Name[is]=Qt4 hönnuðurinn
+Name[it]=Designer Qt4
+Name[ja]=Qt4 デザイナー
+Name[km]=កម្មវិធីរចនា Qt4
+Name[ko]=Qt4 디자이너
+Name[lo]=ອອກແບບສ່ວນຕິດຕໍ່ຜູ້ໃຊ້ສຳຫັລບ Qt4
+Name[lv]=Qt4 Dizainers
+Name[mk]=Qt4-Дизајнер
+Name[mn]=Qt4-Дизайнер
+Name[ms]=Pembantu Qt4
+Name[mt]=Diżinjatur Qt4
+Name[nds]=Qt4-Designer
+Name[nso]=Mohlami wa Qt4
+Name[oc]=Dessinador Qt4
+Name[pa]=Qt4 ਡਿਜ਼ਾਈਨਰ
+Name[rw]=Umuhanzi Qt4
+Name[sl]=Snovalnik Qt4
+Name[ss]=Umhleli weQt4
+Name[sv]=Qt4 designer
+Name[ta]=Qt4 வடிவமைப்பாளர்
+Name[tg]=Тароҳи Qt4
+Name[th]=ออกแบบส่วนติดต่อผู้ใช้สำหรับ Qt4
+Name[tr]=Qt4 Tasarımcı
+Name[tt]=Qt4 Tözüçe
+Name[uk]=Дизайнер Qt4
+Name[uz]=Qt43 дизайнер
+Name[ven]=Qt4 Mufhati
+Name[vi]=Trình thiết kế Qt4
+Name[xh]=Umyili we Qt4
+Name[zh_CN]=Qt4 设计器
+Name[zh_TW]=Qt4 設計師
+Name[zu]=Umakhi we-Qt4
+GenericName=Interface Designer
+GenericName[af]=Koppelvlak Ontwerper
+GenericName[ar]=مصمم واجهات إستخدام
+GenericName[az]=Ara Üz Tərtibçisi
+GenericName[bn]=ইন্টারফেস পরিকল্পনা
+GenericName[br]=Ergrafer etrefas
+GenericName[bs]=Qt4 alat za dizajniranje interfejsa
+GenericName[ca]=Dissenyador d'interfícies
+GenericName[cs]=Návrhář rozhraní
+GenericName[cy]=Dylunydd Rhyngwyneb
+GenericName[da]=Grænsefladedesigner
+GenericName[de]=Schnittstellendesigner
+GenericName[el]=Σχεδιαστής διασυνδέσεων
+GenericName[eo]=Interfacdesegnilo
+GenericName[es]=Diseñador de interfaces
+GenericName[et]=Kasutajaliidese disainer
+GenericName[eu]=Interfaze diseinatzailea
+GenericName[fa]=طراح واسط
+GenericName[fi]=Käyttöliittymäsuunnittelija
+GenericName[fo]=Nýtaramótssniðari
+GenericName[fr]=Concepteur d'interface
+GenericName[fy]=Ynterface-ûntwerper
+GenericName[ga]=Dearthóir Comhéadain
+GenericName[gl]=Deseñador de Interfaces
+GenericName[he]=מעצב ממשקים
+GenericName[hi]=इंटरफेस डिज़ाइनर
+GenericName[hr]=Dizajner sučelja
+GenericName[hu]=Felülettervező
+GenericName[id]=Perancang Antarmuka
+GenericName[is]=Viðmótshönnun
+GenericName[it]=Disegnatore di interfacce
+GenericName[ja]=インターフェースデザイナー
+GenericName[km]=កម្មវិធីរចនាចំណុចប្រទាក់
+GenericName[ko]=인터페이스 디자이너
+GenericName[lo]=ເຄື່ອງມືອອກແບບສ່ວນຕິດຕໍ່ຜູ້ໃຊ້
+GenericName[lt]=Sąsajos kūrimo programa
+GenericName[lv]=Saskarnes Dizainers
+GenericName[mk]=Дизајнер на интерфејси
+GenericName[mn]=Гадаргуун дизайнер
+GenericName[ms]=Pereka Antaramuka
+GenericName[mt]=Diżinjatur tal-interfaċċji
+GenericName[nb]=Utforming av grensesnitt
+GenericName[nds]=Koppelsteed-Maker
+GenericName[nl]=Interface-ontwerper
+GenericName[nn]=Utforming av grensesnitt
+GenericName[nso]=Mohlami wa Interface
+GenericName[pa]=ਇੰਟਰਫੇਸ਼ ਡਿਜ਼ਾਈਨਰ
+GenericName[pl]=Projektant interfejsu
+GenericName[pt]=Editor de Interfaces
+GenericName[pt_BR]=Interface do Designer
+GenericName[ro]=Dezvoltator de interfeţe
+GenericName[ru]=Редактор интерфейса приложений Qt4
+GenericName[rw]=Umuhanzi w'Imigaragarire
+GenericName[se]=Laktahábmejeaddji
+GenericName[sk]=Návrh rozhrania
+GenericName[sl]=Snovalnik vmesnikov
+GenericName[sr]=Дизајнер интерфејса
+GenericName[sr@Latn]=Dizajner interfejsa
+GenericName[ss]=Umhleli wesichumanisi
+GenericName[sv]=Gränssnittseditor
+GenericName[ta]=முகப்புப் வடிவமைப்பாளர்
+GenericName[tg]=Тароҳи робита
+GenericName[th]=เครื่องมือออกแบบส่วนติดต่อผู้ใช้
+GenericName[tr]=Arayüz tasarım programı
+GenericName[tt]=Yözara Tözegeç
+GenericName[uk]=Дизайн інтерфейсу
+GenericName[uz]=Интерфейс дизайнери
+GenericName[ven]=Muvhati wa nga Phanda
+GenericName[vi]=Trình thiết kế giao diện
+GenericName[wa]=Dessineu d' eterfaces
+GenericName[xh]=Umyili Wezojongongano
+GenericName[zh_CN]=界面设计器
+GenericName[zh_TW]=界面設計師
+GenericName[zu]=Umakhi Womxhumanisi
+X-KDE-StartupNotify=true
+MimeType=application/x-designer;
+Icon=designer
+Terminal=false
+Type=Application
+Categories=Qt;Development;
diff --git a/desktop/toolkit/qt/files/data/designer.png b/desktop/toolkit/qt/files/data/designer.png
new file mode 100644
index 0000000000..5ebc4a9729
Binary files /dev/null and b/desktop/toolkit/qt/files/data/designer.png differ
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 0000000000..b8f8263bbe
Binary files /dev/null and b/desktop/toolkit/qt/files/data/hi128-app-qt4-logo.png differ
diff --git a/desktop/toolkit/qt/files/data/hi48-app-qt4-logo.png b/desktop/toolkit/qt/files/data/hi48-app-qt4-logo.png
new file mode 100644
index 0000000000..b8ede18d92
Binary files /dev/null and b/desktop/toolkit/qt/files/data/hi48-app-qt4-logo.png differ
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 0000000000..47c9f17a4f
Binary files /dev/null and b/desktop/toolkit/qt/files/data/linguist.png differ
diff --git a/desktop/toolkit/qt/files/data/phonon-gstreamer.svg b/desktop/toolkit/qt/files/data/phonon-gstreamer.svg
new file mode 100644
index 0000000000..26998462f1
--- /dev/null
+++ b/desktop/toolkit/qt/files/data/phonon-gstreamer.svg
@@ -0,0 +1,54 @@
+
+
+
+
+]>
+
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 0000000000..16b3bc68b6
Binary files /dev/null and b/desktop/toolkit/qt/files/turkish.patch.bz2 differ
diff --git a/desktop/toolkit/qt/pspec.xml b/desktop/toolkit/qt/pspec.xml
new file mode 100644
index 0000000000..9218907c19
--- /dev/null
+++ b/desktop/toolkit/qt/pspec.xml
@@ -0,0 +1,496 @@
+
+
+
+
+ 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
+
+