--- /dev/null
+diff --git a/README.kde-qt b/README.kde-qt
+new file mode 100644
+index 0000000..db3feb6
+--- /dev/null
++++ b/README.kde-qt
+@@ -0,0 +1,201 @@
++This is a patched version of Qt. It may include changes made by KDE
++and Qt developers that have either not been accepted for inclusion
++into Qt, or have been accepted for a later version of Qt than this
++one.
++
++1. Configuring Qt
++=================
++
++The recommended compile line is:
++
++--default-config-begin--
++
++ ./configure -qt-gif -debug -fast -no-separate-debug-info \
++ -system-libpng -system-libjpeg -system-zlib \
++ -dbus -webkit -plugin-sql-mysql \
++ -nomake examples -nomake demos -prefix <installdir>
++
++--default-config-end--
++
++It contains "-debug", which greatly improves the use for backtraces (but
++also needs a lot more disk space and makes things slower). To build in
++release mode, replace it with "-release".
++
++It also contains "-no-separate-debug-info", which disables separate .debug
++files. Instead, the debug information will be built into the libraries.
++This option is needed when you install Qt.
++
++If you don't install Qt, it can be useful to disable this option,
++thus having separate debug symbol files. With separate debug files, you can
++just move those debug files to another directory to remove Qt debug symbols.
++Moving the files back will enable Qt debug symbols again.
++This is useful if you rarely need to step into Qt functions during debugging,
++because GDB loads much faster and uses less memory without Qt debug symbols.
++In the rare case you need to step into Qt code, you can temporarily enable
++debug symbols again by moving the debug files back. You can even load the Qt
++debug symbols from within GDB on demand, using the "symbol-file" command.
++
++If you are planning to compile Qt using an Icecream cluster you have to
++pass the option -no-pch (no precompiled headers) to configure to make
++distributed compilation work.
++
++2. Compiling Qt
++===============
++
++To compile Qt on a Unix platform, run:
++
++ export MAKEFLAGS=-j2
++ make
++ make install
++
++If your computer has more than one core or processor, you may consider
++increasing the "2" above. If you've got a compile farm available, you
++should adjust the -j argument to match the number of slots in that
++farm.
++
++3. Modifying & rebuilding Qt
++============================
++
++If you make modifications to the Qt source code, you don't need to
++build everything again. Simply go to the directory containing the
++Makefile closest to the files you changed and run "make" again.
++
++For example, if you've modified src/corelib/io/qiodevice.cpp, do:
++
++ cd src/corelib
++ make
++
++If you make a change that is not temporary, you should create a Git
++commit out of it. However, you shouldn't push those changes to
++kde-qt.git. If you have a fix that benefit others, see the "Creating
++kde-qt.git modifications" section below.
++
++4. Building Qt examples and demos
++=================================
++
++The "-nomake examples -nomake demos" arguments to the configure script
++mean that those two sections will not be configured for building,
++which is unneeded for usage of the library. If you want to compile
++the examples or demos later, just enter either directory and type:
++
++ qmake
++ make
++
++5. Build Qt tests
++=================
++
++(Official information: http://qt.gitorious.org/qt/pages/QtAutotestsEnvironment)
++
++In order to run Qt tests, you must have a "developer build" of Qt. For
++that, you need to reconfigure Qt and add the "-developer-build"
++option. That option is technically equivalent to the options:
++
++ -debug -prefix $PWD -DQT_BUILD_INTERNAL
++
++To run a test, go to its source dir in tests/auto/testname. Type
++"make" to build it, then run it (either ./tst_testname, or "make install").
++
++6. Building Qt documentation
++============================
++
++To build and install the documentation, run:
++
++ make docs
++ ./config.status
++ make install
++
++It is necessary to do this once only, even if you rebuild Qt later.
++
++7. Using Qt uninstalled
++=======================
++
++To use without having to install it, configure it as follows:
++
++ ./configure <other configure options> -prefix $PWD
++ make sub-src
++ make sub-tools
++
++Attention: DO NOT run
++
++ make install
++
++If you do, Qt will overwrite your include/ directory with its
++installation.
++
++8. Creating kde-qt.git modifications
++====================================
++
++If you have fixed a bug in Qt or modified it in any way that may
++benefit others, please share your change in the form of a patch. Do
++not commit your changes directly to the main branch because they
++may be lost in a future update if they have not been added to the
++official Qt release.
++
++The exception to the above rule is that if the fix has been accepted
++by Qt Software (and so will appear in the very next release of Qt),
++then it should be simply cherry-picked from the Qt development
++branch. Note that you shouldn't do this for changes that have been
++accepted into a release which is not the very next.
++In this case, you should use the following command:
++
++ git cherry-pick -x SHA1_OF_THE_FIX
++where SHA1_OF_THE_FIX is the SHA-1 of the commit that you want to
++introduce. Then push the change to the server.
++
++Before creating a patch, it is recommended to contact Qt Software
++support via qt-bugs@trolltech.com and explain the situation. There may
++be a solution for the problem already or a new direction that should
++be accounted for.
++
++To create a patch, do the following:
++ a) look at the listing of branches in
++ http://qt.gitorious.org/+kde-developers/qt/kde-qt/commits/HEAD and
++ select the next number.
++
++ b) create a new branch out of a clean, released version of Qt, (for
++ example, 4.5.1), using the number above and a brief description of
++ your fix. For example:
++ git checkout -b patches/0180-window-role v4.5.1
++ You can see the available released versions of Qt with:
++ git tag
++
++ c) make your changes to the Qt source code and verify that it
++ compiles, links and works (please run the respective unit tests).
++
++ c) commit your changes to Git, using the "git commit" command. Please
++ see http://qt.gitorious.org/qt/pages/GitIntroductionWithQt and
++ http://qt.gitorious.org/qt/pages/QtCodingStyle for information on
++ how to create commits
++ Note that you can create multiple commits.
++
++ e) merge the change to the main branch, for example, 4.5.1-patched:
++ git checkout 4.5.1-patched
++ git merge patches/0180-window-role
++
++ f) push the changes you made to your branch and to the main server:
++ git push git@gitorious.org:qt/kde-qt.git 4.5.1-patched patches/0180-window-role
++ (Don't forget to list both branch names)
++
++Don't forget to submit your patch to using the Qt Contribution Model,
++along with the long description of the issue found. See
++http://qt.gitorious.org/qt/pages/QtContributionGuidelines for
++information how. You can submit the branch you've just sent to the
++server.
++
++9. Troubleshooting: Re-configuring and re-compiling
++==================================================
++
++For those updating the source in a directory where Qt has already
++been compiled, you may need to run the following commands from the
++top directory of your Qt sources:
++
++ find . -name '*.moc' | xargs rm
++
++Sometimes ./configure will refuse to run. You may need to:
++ rm .qmake.cache
++
++If you think you may have run "make install" on an install-less Qt
++(srcdir == $QTDIR), run:
++
++ rm -rf include
++ bin/syncqt
+diff --git a/bin/syncqt b/bin/syncqt
+index edabeca..e71d480 100755
+--- a/bin/syncqt
++++ b/bin/syncqt
+@@ -363,9 +363,13 @@ sub fixPaths {
+ $match_dir = $tmp;
+ $i = $slash;
+ }
++ my $cnt_ofs = 0;
++ if($match_dir =~ /^[a-zA-Z]:$/) {
++ $cnt_ofs = 1;
++ }
+ if($match_dir) {
+ my $after = substr($dir, length($match_dir));
+- my $count = ($after =~ tr,/,,);
++ my $count = ($after =~ tr,/,,) - $cnt_ofs;
+ my $dots = "";
+ for(my $i = 0; $i < $count; $i++) {
+ $dots .= "../";
+diff --git a/configure b/configure
+index 4ea1ad0..b28a1fa 100755
+--- a/configure
++++ b/configure
+@@ -960,6 +960,11 @@ while [ "$#" -gt 0 ]; do
+ VAL=`echo $1 | sed 's,-D,,'`
+ fi
+ ;;
++ -isystem)
++ VAR="add_isystempath"
++ shift
++ VAL="$1"
++ ;;
+ -I?*|-I)
+ VAR="add_ipath"
+ if [ "$1" = "-I" ]; then
+@@ -1930,6 +1935,9 @@ while [ "$#" -gt 0 ]; do
+ add_ipath)
+ I_FLAGS="$I_FLAGS -I\"${VAL}\""
+ ;;
++ add_isystempath)
++ I_FLAGS="$I_FLAGS -isystem \"${VAL}\""
++ ;;
+ add_lpath)
+ L_FLAGS="$L_FLAGS -L\"${VAL}\""
+ ;;
+diff --git a/projects.pro b/projects.pro
+index f6c596d..79420d2 100644
+--- a/projects.pro
++++ b/projects.pro
+@@ -131,6 +131,9 @@ unix {
+ DEFAULT_QMAKESPEC ~= s,^.*mkspecs/,,g
+ mkspecs.commands += $(DEL_FILE) $(INSTALL_ROOT)$$mkspecs.path/default; $(SYMLINK) $$DEFAULT_QMAKESPEC $(INSTALL_ROOT)$$mkspecs.path/default
+ }
++win32 {
++ mkspecs.files += $$QT_BUILD_TREE/mkspecs/default
++}
+ INSTALLS += mkspecs
+
+ false:macx { #mac install location
+diff --git a/qmake/property.cpp b/qmake/property.cpp
+index ea4842a..ac54854 100644
+--- a/qmake/property.cpp
++++ b/qmake/property.cpp
+@@ -81,29 +81,32 @@ QMakeProperty::keyBase(bool version) const
+ QString
+ QMakeProperty::value(QString v, bool just_check)
+ {
++ QString ret;
+ if(v == "QT_INSTALL_PREFIX")
+- return QLibraryInfo::location(QLibraryInfo::PrefixPath);
++ ret = QLibraryInfo::location(QLibraryInfo::PrefixPath);
+ else if(v == "QT_INSTALL_DATA")
+- return QLibraryInfo::location(QLibraryInfo::DataPath);
++ ret = QLibraryInfo::location(QLibraryInfo::DataPath);
+ else if(v == "QT_INSTALL_DOCS")
+- return QLibraryInfo::location(QLibraryInfo::DocumentationPath);
++ ret = QLibraryInfo::location(QLibraryInfo::DocumentationPath);
+ else if(v == "QT_INSTALL_HEADERS")
+- return QLibraryInfo::location(QLibraryInfo::HeadersPath);
++ ret = QLibraryInfo::location(QLibraryInfo::HeadersPath);
+ else if(v == "QT_INSTALL_LIBS")
+- return QLibraryInfo::location(QLibraryInfo::LibrariesPath);
++ ret = QLibraryInfo::location(QLibraryInfo::LibrariesPath);
+ else if(v == "QT_INSTALL_BINS")
+- return QLibraryInfo::location(QLibraryInfo::BinariesPath);
++ ret = QLibraryInfo::location(QLibraryInfo::BinariesPath);
+ else if(v == "QT_INSTALL_PLUGINS")
+- return QLibraryInfo::location(QLibraryInfo::PluginsPath);
++ ret = QLibraryInfo::location(QLibraryInfo::PluginsPath);
+ else if(v == "QT_INSTALL_TRANSLATIONS")
+- return QLibraryInfo::location(QLibraryInfo::TranslationsPath);
++ ret = QLibraryInfo::location(QLibraryInfo::TranslationsPath);
+ else if(v == "QT_INSTALL_CONFIGURATION")
+- return QLibraryInfo::location(QLibraryInfo::SettingsPath);
++ ret = QLibraryInfo::location(QLibraryInfo::SettingsPath);
+ else if(v == "QT_INSTALL_EXAMPLES")
+- return QLibraryInfo::location(QLibraryInfo::ExamplesPath);
++ ret = QLibraryInfo::location(QLibraryInfo::ExamplesPath);
+ else if(v == "QT_INSTALL_DEMOS")
+- return QLibraryInfo::location(QLibraryInfo::DemosPath);
+- else if(v == "QMAKE_MKSPECS")
++ ret = QLibraryInfo::location(QLibraryInfo::DemosPath);
++ if(!ret.isEmpty())
++ return QDir::toNativeSeparators(ret);
++ if(v == "QMAKE_MKSPECS")
+ return qmake_mkspec_paths().join(Option::target_mode == Option::TARG_WIN_MODE ? ";" : ":");
+ else if(v == "QMAKE_VERSION")
+ return qmake_version();
+@@ -116,7 +119,7 @@ QMakeProperty::value(QString v, bool just_check)
+ int slash = v.lastIndexOf('/');
+ QVariant var = settings->value(keyBase(slash == -1) + v);
+ bool ok = var.isValid();
+- QString ret = var.toString();
++ ret = var.toString();
+ if(!ok) {
+ QString version = qmake_version();
+ if(slash != -1) {
+diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
+index ac2ad34..58d7df0 100644
+--- a/src/corelib/global/qnamespace.h
++++ b/src/corelib/global/qnamespace.h
+@@ -895,12 +895,10 @@ public:
+ Key_Dead_Horn = 0x01001262,
+
+ // multimedia/internet keys - ignored by default - see QKeyEvent c'tor
+-
+ Key_Back = 0x01000061,
+ Key_Forward = 0x01000062,
+ Key_Stop = 0x01000063,
+ Key_Refresh = 0x01000064,
+-
+ Key_VolumeDown = 0x01000070,
+ Key_VolumeMute = 0x01000071,
+ Key_VolumeUp = 0x01000072,
+@@ -909,7 +907,6 @@ public:
+ Key_BassDown = 0x01000075,
+ Key_TrebleUp = 0x01000076,
+ Key_TrebleDown = 0x01000077,
+-
+ Key_MediaPlay = 0x01000080,
+ Key_MediaStop = 0x01000081,
+ Key_MediaPrevious = 0x01000082,
+@@ -918,13 +915,11 @@ public:
+ #endif
+ Key_MediaNext = 0x01000083,
+ Key_MediaRecord = 0x01000084,
+-
+ Key_HomePage = 0x01000090,
+ Key_Favorites = 0x01000091,
+ Key_Search = 0x01000092,
+ Key_Standby = 0x01000093,
+ Key_OpenUrl = 0x01000094,
+-
+ Key_LaunchMail = 0x010000a0,
+ Key_LaunchMedia = 0x010000a1,
+ Key_Launch0 = 0x010000a2,
+@@ -943,6 +938,98 @@ public:
+ Key_LaunchD = 0x010000af,
+ Key_LaunchE = 0x010000b0,
+ Key_LaunchF = 0x010000b1,
++ Key_MonBrightnessUp = 0x010000b2,
++ Key_MonBrightnessDown = 0x010000b3,
++ Key_KeyboardLightOnOff = 0x010000b4,
++ Key_KeyboardBrightnessUp = 0x010000b5,
++ Key_KeyboardBrightnessDown = 0x010000b6,
++ Key_PowerOff = 0x010000b7,
++ Key_WakeUp = 0x010000b8,
++ Key_Eject = 0x010000b9,
++ Key_ScreenSaver = 0x010000ba,
++ Key_WWW = 0x010000bb,
++ Key_Memo = 0x010000bc,
++ Key_LightBulb = 0x010000bd,
++ Key_Shop = 0x010000be,
++ Key_History = 0x010000bf,
++ Key_AddFavorite = 0x010000c0,
++ Key_HotLinks = 0x010000c1,
++ Key_BrightnessAdjust = 0x010000c2,
++ Key_Finance = 0x010000c3,
++ Key_Community = 0x010000c4,
++ Key_AudioRewind = 0x010000c5,
++ Key_BackForward = 0x010000c6,
++ Key_ApplicationLeft = 0x010000c7,
++ Key_ApplicationRight = 0x010000c8,
++ Key_Book = 0x010000c9,
++ Key_CD = 0x010000ca,
++ Key_Calculator = 0x010000cb,
++ Key_ToDoList = 0x010000cc,
++ Key_ClearGrab = 0x010000cd,
++ Key_Close = 0x010000ce,
++ Key_Copy = 0x010000cf,
++ Key_Cut = 0x010000d0,
++ Key_Display = 0x010000d1,
++ Key_DOS = 0x010000d2,
++ Key_Documents = 0x010000d3,
++ Key_Excel = 0x010000d4,
++ Key_Explorer = 0x010000d5,
++ Key_Game = 0x010000d6,
++ Key_Go = 0x010000d7,
++ Key_iTouch = 0x010000d8,
++ Key_LogOff = 0x010000d9,
++ Key_Market = 0x010000da,
++ Key_Meeting = 0x010000db,
++ Key_MenuKB = 0x010000dc,
++ Key_MenuPB = 0x010000dd,
++ Key_MySites = 0x010000de,
++ Key_News = 0x010000df,
++ Key_OfficeHome = 0x010000e0,
++ Key_Option = 0x010000e1,
++ Key_Paste = 0x010000e2,
++ Key_Phone = 0x010000e3,
++ Key_Calendar = 0x010000e4,
++ Key_Reply = 0x010000e5,
++ Key_Reload = 0x010000e6,
++ Key_RotateWindows = 0x010000e7,
++ Key_RotationPB = 0x010000e8,
++ Key_RotationKB = 0x010000e9,
++ Key_Save = 0x010000ea,
++ Key_Send = 0x010000eb,
++ Key_Spell = 0x010000ec,
++ Key_SplitScreen = 0x010000ed,
++ Key_Support = 0x010000ee,
++ Key_TaskPane = 0x010000ef,
++ Key_Terminal = 0x010000f0,
++ Key_Tools = 0x010000f1,
++ Key_Travel = 0x010000f2,
++ Key_Video = 0x010000f3,
++ Key_Word = 0x010000f4,
++ Key_Xfer = 0x010000f5,
++ Key_ZoomIn = 0x010000f6,
++ Key_ZoomOut = 0x010000f7,
++ Key_Away = 0x010000f8,
++ Key_Messenger = 0x010000f9,
++ Key_WebCam = 0x010000fa,
++ Key_MailForward = 0x010000fb,
++ Key_Pictures = 0x010000fc,
++ Key_Music = 0x010000fd,
++ Key_Battery = 0x010000fe,
++ Key_Bluetooth = 0x010000ff,
++ Key_WLAN = 0x01000100,
++ Key_UWB = 0x01000101,
++ Key_AudioForward = 0x01000102,
++ Key_AudioRepeat = 0x01000103,
++ Key_AudioRandomPlay = 0x01000104,
++ Key_Subtitle = 0x01000105,
++ Key_AudioCycleTrack = 0x01000106,
++ Key_Time = 0x01000107,
++ Key_Hibernate = 0x01000108,
++ Key_View = 0x01000109,
++ Key_TopMenu = 0x0100010a,
++ Key_PowerDown = 0x0100010b,
++ Key_Suspend = 0x0100010c,
++ Key_ContrastAdjust = 0x0100010d,
+
+ Key_MediaLast = 0x0100ffff,
+
+diff --git a/src/corelib/kernel/qeventdispatcher_glib.cpp b/src/corelib/kernel/qeventdispatcher_glib.cpp
+index 87e9728..7f6dbb6 100644
+--- a/src/corelib/kernel/qeventdispatcher_glib.cpp
++++ b/src/corelib/kernel/qeventdispatcher_glib.cpp
+@@ -127,16 +127,11 @@ struct GTimerSource
+ GSource source;
+ QTimerInfoList timerList;
+ QEventLoop::ProcessEventsFlags processEventsFlags;
++ bool runWithIdlePriority;
+ };
+
+-static gboolean timerSourcePrepare(GSource *source, gint *timeout)
++static gboolean timerSourcePrepareHelper(GTimerSource *src, gint *timeout)
+ {
+- gint dummy;
+- if (!timeout)
+- timeout = &dummy;
+-
+- GTimerSource *src = reinterpret_cast<GTimerSource *>(source);
+-
+ timeval tv = { 0l, 0l };
+ if (!(src->processEventsFlags & QEventLoop::X11ExcludeTimers) && src->timerList.timerWait(tv))
+ *timeout = (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
+@@ -146,10 +141,8 @@ static gboolean timerSourcePrepare(GSource *source, gint *timeout)
+ return (*timeout == 0);
+ }
+
+-static gboolean timerSourceCheck(GSource *source)
++static gboolean timerSourceCheckHelper(GTimerSource *src)
+ {
+- GTimerSource *src = reinterpret_cast<GTimerSource *>(source);
+-
+ if (src->timerList.isEmpty()
+ || (src->processEventsFlags & QEventLoop::X11ExcludeTimers))
+ return false;
+@@ -160,9 +153,35 @@ static gboolean timerSourceCheck(GSource *source)
+ return true;
+ }
+
++static gboolean timerSourcePrepare(GSource *source, gint *timeout)
++{
++ gint dummy;
++ if (!timeout)
++ timeout = &dummy;
++
++ GTimerSource *src = reinterpret_cast<GTimerSource *>(source);
++ if (src->runWithIdlePriority) {
++ if (timeout)
++ *timeout = -1;
++ return false;
++ }
++
++ return timerSourcePrepareHelper(src, timeout);
++}
++
++static gboolean timerSourceCheck(GSource *source)
++{
++ GTimerSource *src = reinterpret_cast<GTimerSource *>(source);
++ if (src->runWithIdlePriority)
++ return false;
++ return timerSourceCheckHelper(src);
++}
++
+ static gboolean timerSourceDispatch(GSource *source, GSourceFunc, gpointer)
+ {
+- (void) reinterpret_cast<GTimerSource *>(source)->timerList.activateTimers();
++ GTimerSource *timerSource = reinterpret_cast<GTimerSource *>(source);
++ timerSource->runWithIdlePriority = true;
++ (void) timerSource->timerList.activateTimers();
+ return true; // ??? don't remove, right again?
+ }
+
+@@ -175,6 +194,53 @@ static GSourceFuncs timerSourceFuncs = {
+ NULL
+ };
+
++struct GIdleTimerSource
++{
++ GSource source;
++ GTimerSource *timerSource;
++};
++
++static gboolean idleTimerSourcePrepare(GSource *source, gint *timeout)
++{
++ GIdleTimerSource *idleTimerSource = reinterpret_cast<GIdleTimerSource *>(source);
++ GTimerSource *timerSource = idleTimerSource->timerSource;
++ if (!timerSource->runWithIdlePriority) {
++ // Yield to the normal priority timer source
++ if (timeout)
++ *timeout = -1;
++ return false;
++ }
++
++ return timerSourcePrepareHelper(timerSource, timeout);
++}
++
++static gboolean idleTimerSourceCheck(GSource *source)
++{
++ GIdleTimerSource *idleTimerSource = reinterpret_cast<GIdleTimerSource *>(source);
++ GTimerSource *timerSource = idleTimerSource->timerSource;
++ if (!timerSource->runWithIdlePriority) {
++ // Yield to the normal priority timer source
++ return false;
++ }
++ return timerSourceCheckHelper(timerSource);
++}
++
++static gboolean idleTimerSourceDispatch(GSource *source, GSourceFunc, gpointer)
++{
++ GTimerSource *timerSource = reinterpret_cast<GIdleTimerSource *>(source)->timerSource;
++ (void) timerSourceDispatch(&timerSource->source, 0, 0);
++ return true;
++}
++
++static GSourceFuncs idleTimerSourceFuncs = {
++ idleTimerSourcePrepare,
++ idleTimerSourceCheck,
++ idleTimerSourceDispatch,
++ NULL,
++ NULL,
++ NULL
++};
++
+ struct GPostEventSource
+ {
+ GSource source;
+@@ -235,14 +301,15 @@ QEventDispatcherGlibPrivate::QEventDispatcherGlibPrivate(GMainContext *context)
+ g_main_context_ref(mainContext);
+ } else {
+ QCoreApplication *app = QCoreApplication::instance();
+- if (app && QThread::currentThread() == app->thread()) {
+- mainContext = g_main_context_default();
+- g_main_context_ref(mainContext);
+- } else {
+- mainContext = g_main_context_new();
+- }
++ if (app && QThread::currentThread() == app->thread()) {
++ mainContext = g_main_context_default();
++ g_main_context_ref(mainContext);
++ } else {
++ mainContext = g_main_context_new();
++ }
+ }
+
++ // setup post event source
+ postEventSource = reinterpret_cast<GPostEventSource *>(g_source_new(&postEventSourceFuncs,
+ sizeof(GPostEventSource)));
+ postEventSource->serialNumber = 1;
+@@ -257,14 +324,21 @@ QEventDispatcherGlibPrivate::QEventDispatcherGlibPrivate(GMainContext *context)
+ g_source_set_can_recurse(&socketNotifierSource->source, true);
+ g_source_attach(&socketNotifierSource->source, mainContext);
+
+- // setup timerSource
++ // setup normal and idle timer sources
+ timerSource = reinterpret_cast<GTimerSource *>(g_source_new(&timerSourceFuncs,
+ sizeof(GTimerSource)));
+ (void) new (&timerSource->timerList) QTimerInfoList();
+ timerSource->processEventsFlags = QEventLoop::AllEvents;
++ timerSource->runWithIdlePriority = false;
+ g_source_set_can_recurse(&timerSource->source, true);
+- g_source_set_priority(&timerSource->source, G_PRIORITY_DEFAULT_IDLE);
+ g_source_attach(&timerSource->source, mainContext);
++
++ idleTimerSource = reinterpret_cast<GIdleTimerSource *>(g_source_new(&idleTimerSourceFuncs,
++ sizeof(GIdleTimerSource)));
++ idleTimerSource->timerSource = timerSource;
++ g_source_set_can_recurse(&idleTimerSource->source, true);
++ g_source_set_priority(&idleTimerSource->source, G_PRIORITY_DEFAULT_IDLE);
++ g_source_attach(&idleTimerSource->source, mainContext);
+ }
+
+ QEventDispatcherGlib::QEventDispatcherGlib(QObject *parent)
+@@ -272,12 +346,9 @@ QEventDispatcherGlib::QEventDispatcherGlib(QObject *parent)
+ {
+ }
+
+-QEventDispatcherGlib::QEventDispatcherGlib(GMainContext *mainContext,
+- QObject *parent)
+- : QAbstractEventDispatcher(*(new QEventDispatcherGlibPrivate(mainContext)),
+- parent)
+-{
+-}
++QEventDispatcherGlib::QEventDispatcherGlib(GMainContext *mainContext, QObject *parent)
++ : QAbstractEventDispatcher(*(new QEventDispatcherGlibPrivate(mainContext)), parent)
++{ }
+
+ QEventDispatcherGlib::~QEventDispatcherGlib()
+ {
+@@ -289,6 +360,9 @@ QEventDispatcherGlib::~QEventDispatcherGlib()
+ g_source_destroy(&d->timerSource->source);
+ g_source_unref(&d->timerSource->source);
+ d->timerSource = 0;
++ g_source_destroy(&d->idleTimerSource->source);
++ g_source_unref(&d->idleTimerSource->source);
++ d->idleTimerSource = 0;
+
+ // destroy socket notifier source
+ for (int i = 0; i < d->socketNotifierSource->pollfds.count(); ++i) {
+@@ -324,11 +398,16 @@ bool QEventDispatcherGlib::processEvents(QEventLoop::ProcessEventsFlags flags)
+ // tell postEventSourcePrepare() and timerSource about any new flags
+ QEventLoop::ProcessEventsFlags savedFlags = d->timerSource->processEventsFlags;
+ d->timerSource->processEventsFlags = flags;
+-
++
++ if (!(flags & QEventLoop::EventLoopExec)) {
++ // force timers to be sent at normal priority
++ d->timerSource->runWithIdlePriority = false;
++ }
++
+ bool result = g_main_context_iteration(d->mainContext, canWait);
+ while (!result && canWait)
+ result = g_main_context_iteration(d->mainContext, canWait);
+-
++
+ d->timerSource->processEventsFlags = savedFlags;
+
+ if (canWait)
+diff --git a/src/corelib/kernel/qeventdispatcher_glib_p.h b/src/corelib/kernel/qeventdispatcher_glib_p.h
+index eb7fb75..4103aa3 100644
+--- a/src/corelib/kernel/qeventdispatcher_glib_p.h
++++ b/src/corelib/kernel/qeventdispatcher_glib_p.h
+@@ -98,6 +98,7 @@ protected:
+ struct GPostEventSource;
+ struct GSocketNotifierSource;
+ struct GTimerSource;
++struct GIdleTimerSource;
+
+ class Q_CORE_EXPORT QEventDispatcherGlibPrivate : public QAbstractEventDispatcherPrivate
+ {
+@@ -108,6 +109,7 @@ public:
+ GPostEventSource *postEventSource;
+ GSocketNotifierSource *socketNotifierSource;
+ GTimerSource *timerSource;
++ GIdleTimerSource *idleTimerSource;
+ };
+
+ QT_END_NAMESPACE
+diff --git a/src/corelib/kernel/qeventdispatcher_unix.cpp b/src/corelib/kernel/qeventdispatcher_unix.cpp
+index 897bb49..903b0eb 100644
+--- a/src/corelib/kernel/qeventdispatcher_unix.cpp
++++ b/src/corelib/kernel/qeventdispatcher_unix.cpp
+@@ -423,10 +423,10 @@ bool QTimerInfoList::timerWait(timeval &tm)
+ // Find first waiting timer not already active
+ QTimerInfo *t = 0;
+ for (QTimerInfoList::const_iterator it = constBegin(); it != constEnd(); ++it) {
+- if (!(*it)->inTimerEvent) {
+- t = *it;
+- break;
+- }
++ if (!(*it)->inTimerEvent) {
++ t = *it;
++ break;
++ }
+ }
+
+ if (!t)
+diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp
+index 1ed0332..089ddfc 100644
+--- a/src/corelib/kernel/qobject.cpp
++++ b/src/corelib/kernel/qobject.cpp
+@@ -986,8 +986,16 @@ void QObject::setObjectName(const QString &name)
+ {
+ Q_D(QObject);
+ d->objectName = name;
++#if defined(Q_WS_X11)
++ d->checkWindowRole();
++#endif
+ }
+
++#if defined(Q_WS_X11)
++void QObjectPrivate::checkWindowRole()
++{
++}
++#endif
+
+ #ifdef QT3_SUPPORT
+ /*! \internal
+diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h
+index 6ca4dc8..1551472 100644
+--- a/src/corelib/kernel/qobject_p.h
++++ b/src/corelib/kernel/qobject_p.h
+@@ -83,7 +83,9 @@ extern QSignalSpyCallbackSet Q_CORE_EXPORT qt_signal_spy_callback_set;
+
+ inline QObjectData::~QObjectData() {}
+
+-enum { QObjectPrivateVersion = QT_VERSION };
++// add 0x1000000 to mark it as qt-copy version, with possible modifications
++// in some Q*Private class
++enum { QObjectPrivateVersion = QT_VERSION + 0x1000000 };
+
+ class Q_CORE_EXPORT QObjectPrivate : public QObjectData
+ {
+@@ -144,6 +146,9 @@ public:
+ mutable quint32 connectedSignals;
+
+ QString objectName;
++#if defined(Q_WS_X11)
++ virtual void checkWindowRole();
++#endif
+
+ // Note: you must hold the signalSlotLock() before accessing the lists below or calling the functions
+ struct Connection
+diff --git a/src/dbus/qdbusinternalfilters.cpp b/src/dbus/qdbusinternalfilters.cpp
+index 828e427..8bbdd7b 100644
+--- a/src/dbus/qdbusinternalfilters.cpp
++++ b/src/dbus/qdbusinternalfilters.cpp
+@@ -274,9 +274,23 @@ QDBusMessage qDBusPropertySet(const QDBusConnectionPrivate::ObjectTreeNode &node
+ QDBusAdaptorConnector::AdaptorMap::ConstIterator it;
+ it = qLowerBound(connector->adaptors.constBegin(), connector->adaptors.constEnd(),
+ interface_name);
+- if (it != connector->adaptors.end() && interface_name == QLatin1String(it->interface))
++ if (it != connector->adaptors.end() && interface_name == QLatin1String(it->interface)) {
++ if (value.userType() == qMetaTypeId<QDBusArgument>()) {
++ QDBusArgument valueArg = qvariant_cast<QDBusArgument>(value);
++ if (valueArg.currentType() != -1) {
++ int mid = it->adaptor->metaObject()->property(it->adaptor->metaObject()->indexOfProperty(property_name)).userType();
++ void *null = 0;
++ QVariant valueStore(mid, null);
++ QDBusMetaType::demarshall(valueArg, mid, valueStore.data());
++
++ if (it->adaptor->setProperty(property_name, valueStore))
++ return msg.createReply();
++ }
++ }
++
+ if (it->adaptor->setProperty(property_name, value))
+ return msg.createReply();
++ }
+ }
+ }
+
+diff --git a/src/gui/image/qnativeimage.cpp b/src/gui/image/qnativeimage.cpp
+index 50088df..c1bc794 100644
+--- a/src/gui/image/qnativeimage.cpp
++++ b/src/gui/image/qnativeimage.cpp
+@@ -144,7 +144,7 @@ QImage::Format QNativeImage::systemFormat()
+ #elif defined(Q_WS_X11) && !defined(QT_NO_MITSHM)
+
+ QNativeImage::QNativeImage(int width, int height, QImage::Format format,bool /* isTextBuffer */, QWidget *widget)
+- : xshmimg(0), xshmpm(0)
++ : xshmimg(0)
+ {
+ if (!X11->use_mitshm) {
+ image = QImage(width, height, format);
+@@ -195,11 +195,6 @@ QNativeImage::QNativeImage(int width, int height, QImage::Format format,bool /*
+ shmctl(xshminfo.shmid, IPC_RMID, 0);
+ return;
+ }
+- xshmpm = XShmCreatePixmap(X11->display, DefaultRootWindow(X11->display), xshmimg->data,
+- &xshminfo, width, height, dd);
+- if (!xshmpm) {
+- qWarning() << "QNativeImage: Unable to create shared Pixmap.";
+- }
+ }
+
+
+@@ -208,10 +203,6 @@ QNativeImage::~QNativeImage()
+ if (!xshmimg)
+ return;
+
+- if (xshmpm) {
+- XFreePixmap(X11->display, xshmpm);
+- xshmpm = 0;
+- }
+ XShmDetach(X11->display, &xshminfo);
+ xshmimg->data = 0;
+ XDestroyImage(xshmimg);
+diff --git a/src/gui/image/qnativeimage_p.h b/src/gui/image/qnativeimage_p.h
+index 0f5dc8b..cd3cc3b 100644
+--- a/src/gui/image/qnativeimage_p.h
++++ b/src/gui/image/qnativeimage_p.h
+@@ -90,7 +90,6 @@ public:
+
+ #elif defined(Q_WS_X11) && !defined(QT_NO_MITSHM)
+ XImage *xshmimg;
+- Pixmap xshmpm;
+ XShmSegmentInfo xshminfo;
+
+ #elif defined(Q_WS_MAC)
+diff --git a/src/gui/itemviews/qtreeview.cpp b/src/gui/itemviews/qtreeview.cpp
+index a69ab6a..93f4fd8 100644
+--- a/src/gui/itemviews/qtreeview.cpp
++++ b/src/gui/itemviews/qtreeview.cpp
+@@ -3577,7 +3577,7 @@ QList<QPair<int, int> > QTreeViewPrivate::columnRanges(const QModelIndex &topInd
+ current.first = -2; // -1 is not enough because -1+1 = 0
+ current.second = -2;
+ foreach (int logicalColumn, logicalIndexes) {
+- if (current.second + 1 != logicalColumn) {
++ if (current.second + 1 != logicalColumn && !header->isSectionHidden(current.second + 1)) {
+ if (current.first != -2) {
+ //let's save the current one
+ ret += current;
+diff --git a/src/gui/kernel/qapplication_x11.cpp b/src/gui/kernel/qapplication_x11.cpp
+index 343c71b..45e2b49 100644
+--- a/src/gui/kernel/qapplication_x11.cpp
++++ b/src/gui/kernel/qapplication_x11.cpp
+@@ -1959,7 +1959,7 @@ void qt_init(QApplicationPrivate *priv, int,
+ bool local = displayName.isEmpty() || displayName.lastIndexOf(QLatin1Char(':')) == 0;
+ if (local && (qgetenv("QT_X11_NO_MITSHM").toInt() == 0)) {
+ Visual *defaultVisual = DefaultVisual(X11->display, DefaultScreen(X11->display));
+- X11->use_mitshm = mitshm_pixmaps && ((defaultVisual->red_mask == 0xff0000
++ X11->use_mitshm = ((defaultVisual->red_mask == 0xff0000
+ || defaultVisual->red_mask == 0xf800)
+ && (defaultVisual->green_mask == 0xff00
+ || defaultVisual->green_mask == 0x7e0)
+diff --git a/src/gui/kernel/qkeymapper_x11.cpp b/src/gui/kernel/qkeymapper_x11.cpp
+index 8daa881..37d12c2 100644
+--- a/src/gui/kernel/qkeymapper_x11.cpp
++++ b/src/gui/kernel/qkeymapper_x11.cpp
+@@ -714,47 +714,144 @@ extern bool qt_sm_blockUserInput;
+ #define XK_KP_Delete 0xFF9F
+ #endif
+
+-// the next lines are taken from XFree > 4.0 (X11/XF86keysyms.h), defining some special
++// the next lines are taken on 10/2009 from X.org (X11/XF86keysym.h), defining some special
+ // multimedia keys. They are included here as not every system has them.
+-#define XF86XK_Standby 0x1008FF10
+-#define XF86XK_AudioLowerVolume 0x1008FF11
+-#define XF86XK_AudioMute 0x1008FF12
+-#define XF86XK_AudioRaiseVolume 0x1008FF13
+-#define XF86XK_AudioPlay 0x1008FF14
+-#define XF86XK_AudioStop 0x1008FF15
+-#define XF86XK_AudioPrev 0x1008FF16
+-#define XF86XK_AudioNext 0x1008FF17
+-#define XF86XK_HomePage 0x1008FF18
+-#define XF86XK_Calculator 0x1008FF1D
+-#define XF86XK_Mail 0x1008FF19
+-#define XF86XK_Start 0x1008FF1A
+-#define XF86XK_Search 0x1008FF1B
+-#define XF86XK_AudioRecord 0x1008FF1C
+-#define XF86XK_Back 0x1008FF26
+-#define XF86XK_Forward 0x1008FF27
+-#define XF86XK_Stop 0x1008FF28
+-#define XF86XK_Refresh 0x1008FF29
+-#define XF86XK_Favorites 0x1008FF30
+-#define XF86XK_AudioPause 0x1008FF31
+-#define XF86XK_AudioMedia 0x1008FF32
+-#define XF86XK_MyComputer 0x1008FF33
+-#define XF86XK_OpenURL 0x1008FF38
+-#define XF86XK_Launch0 0x1008FF40
+-#define XF86XK_Launch1 0x1008FF41
+-#define XF86XK_Launch2 0x1008FF42
+-#define XF86XK_Launch3 0x1008FF43
+-#define XF86XK_Launch4 0x1008FF44
+-#define XF86XK_Launch5 0x1008FF45
+-#define XF86XK_Launch6 0x1008FF46
+-#define XF86XK_Launch7 0x1008FF47
+-#define XF86XK_Launch8 0x1008FF48
+-#define XF86XK_Launch9 0x1008FF49
+-#define XF86XK_LaunchA 0x1008FF4A
+-#define XF86XK_LaunchB 0x1008FF4B
+-#define XF86XK_LaunchC 0x1008FF4C
+-#define XF86XK_LaunchD 0x1008FF4D
+-#define XF86XK_LaunchE 0x1008FF4E
+-#define XF86XK_LaunchF 0x1008FF4F
++#define XF86XK_MonBrightnessUp 0x1008FF02
++#define XF86XK_MonBrightnessDown 0x1008FF03
++#define XF86XK_KbdLightOnOff 0x1008FF04
++#define XF86XK_KbdBrightnessUp 0x1008FF05
++#define XF86XK_KbdBrightnessDown 0x1008FF06
++#define XF86XK_Standby 0x1008FF10
++#define XF86XK_AudioLowerVolume 0x1008FF11
++#define XF86XK_AudioMute 0x1008FF12
++#define XF86XK_AudioRaiseVolume 0x1008FF13
++#define XF86XK_AudioPlay 0x1008FF14
++#define XF86XK_AudioStop 0x1008FF15
++#define XF86XK_AudioPrev 0x1008FF16
++#define XF86XK_AudioNext 0x1008FF17
++#define XF86XK_HomePage 0x1008FF18
++#define XF86XK_Mail 0x1008FF19
++#define XF86XK_Start 0x1008FF1A
++#define XF86XK_Search 0x1008FF1B
++#define XF86XK_AudioRecord 0x1008FF1C
++#define XF86XK_Calculator 0x1008FF1D
++#define XF86XK_Memo 0x1008FF1E
++#define XF86XK_ToDoList 0x1008FF1F
++#define XF86XK_Calendar 0x1008FF20
++#define XF86XK_PowerDown 0x1008FF21
++#define XF86XK_ContrastAdjust 0x1008FF22
++#define XF86XK_Back 0x1008FF26
++#define XF86XK_Forward 0x1008FF27
++#define XF86XK_Stop 0x1008FF28
++#define XF86XK_Refresh 0x1008FF29
++#define XF86XK_PowerOff 0x1008FF2A
++#define XF86XK_WakeUp 0x1008FF2B
++#define XF86XK_Eject 0x1008FF2C
++#define XF86XK_ScreenSaver 0x1008FF2D
++#define XF86XK_WWW 0x1008FF2E
++#define XF86XK_Sleep 0x1008FF2F
++#define XF86XK_Favorites 0x1008FF30
++#define XF86XK_AudioPause 0x1008FF31
++#define XF86XK_AudioMedia 0x1008FF32
++#define XF86XK_MyComputer 0x1008FF33
++#define XF86XK_LightBulb 0x1008FF35
++#define XF86XK_Shop 0x1008FF36
++#define XF86XK_History 0x1008FF37
++#define XF86XK_OpenURL 0x1008FF38
++#define XF86XK_AddFavorite 0x1008FF39
++#define XF86XK_HotLinks 0x1008FF3A
++#define XF86XK_BrightnessAdjust 0x1008FF3B
++#define XF86XK_Finance 0x1008FF3C
++#define XF86XK_Community 0x1008FF3D
++#define XF86XK_AudioRewind 0x1008FF3E
++#define XF86XK_BackForward 0x1008FF3F
++#define XF86XK_Launch0 0x1008FF40
++#define XF86XK_Launch1 0x1008FF41
++#define XF86XK_Launch2 0x1008FF42
++#define XF86XK_Launch3 0x1008FF43
++#define XF86XK_Launch4 0x1008FF44
++#define XF86XK_Launch5 0x1008FF45
++#define XF86XK_Launch6 0x1008FF46
++#define XF86XK_Launch7 0x1008FF47
++#define XF86XK_Launch8 0x1008FF48
++#define XF86XK_Launch9 0x1008FF49
++#define XF86XK_LaunchA 0x1008FF4A
++#define XF86XK_LaunchB 0x1008FF4B
++#define XF86XK_LaunchC 0x1008FF4C
++#define XF86XK_LaunchD 0x1008FF4D
++#define XF86XK_LaunchE 0x1008FF4E
++#define XF86XK_LaunchF 0x1008FF4F
++#define XF86XK_ApplicationLeft 0x1008FF50
++#define XF86XK_ApplicationRight 0x1008FF51
++#define XF86XK_Book 0x1008FF52
++#define XF86XK_CD 0x1008FF53
++#define XF86XK_Calculater 0x1008FF54
++#define XF86XK_Clear 0x1008FF55
++#define XF86XK_ClearGrab 0x1008FE21
++#define XF86XK_Close 0x1008FF56
++#define XF86XK_Copy 0x1008FF57
++#define XF86XK_Cut 0x1008FF58
++#define XF86XK_Display 0x1008FF59
++#define XF86XK_DOS 0x1008FF5A
++#define XF86XK_Documents 0x1008FF5B
++#define XF86XK_Excel 0x1008FF5C
++#define XF86XK_Explorer 0x1008FF5D
++#define XF86XK_Game 0x1008FF5E
++#define XF86XK_Go 0x1008FF5F
++#define XF86XK_iTouch 0x1008FF60
++#define XF86XK_LogOff 0x1008FF61
++#define XF86XK_Market 0x1008FF62
++#define XF86XK_Meeting 0x1008FF63
++#define XF86XK_MenuKB 0x1008FF65
++#define XF86XK_MenuPB 0x1008FF66
++#define XF86XK_MySites 0x1008FF67
++#define XF86XK_News 0x1008FF69
++#define XF86XK_OfficeHome 0x1008FF6A
++#define XF86XK_Option 0x1008FF6C
++#define XF86XK_Paste 0x1008FF6D
++#define XF86XK_Phone 0x1008FF6E
++#define XF86XK_Reply 0x1008FF72
++#define XF86XK_Reload 0x1008FF73
++#define XF86XK_RotateWindows 0x1008FF74
++#define XF86XK_RotationPB 0x1008FF75
++#define XF86XK_RotationKB 0x1008FF76
++#define XF86XK_Save 0x1008FF77
++#define XF86XK_Send 0x1008FF7B
++#define XF86XK_Spell 0x1008FF7C
++#define XF86XK_SplitScreen 0x1008FF7D
++#define XF86XK_Support 0x1008FF7E
++#define XF86XK_TaskPane 0x1008FF7F
++#define XF86XK_Terminal 0x1008FF80
++#define XF86XK_Tools 0x1008FF81
++#define XF86XK_Travel 0x1008FF82
++#define XF86XK_Video 0x1008FF87
++#define XF86XK_Word 0x1008FF89
++#define XF86XK_Xfer 0x1008FF8A
++#define XF86XK_ZoomIn 0x1008FF8B
++#define XF86XK_ZoomOut 0x1008FF8C
++#define XF86XK_Away 0x1008FF8D
++#define XF86XK_Messenger 0x1008FF8E
++#define XF86XK_WebCam 0x1008FF8F
++#define XF86XK_MailForward 0x1008FF90
++#define XF86XK_Pictures 0x1008FF91
++#define XF86XK_Music 0x1008FF92
++#define XF86XK_Battery 0x1008FF93
++#define XF86XK_Bluetooth 0x1008FF94
++#define XF86XK_WLAN 0x1008FF95
++#define XF86XK_UWB 0x1008FF96
++#define XF86XK_AudioForward 0x1008FF97
++#define XF86XK_AudioRepeat 0x1008FF98
++#define XF86XK_AudioRandomPlay 0x1008FF99
++#define XF86XK_Subtitle 0x1008FF9A
++#define XF86XK_AudioCycleTrack 0x1008FF9B
++#define XF86XK_Time 0x1008FF9F
++#define XF86XK_Select 0x1008FFA0
++#define XF86XK_View 0x1008FFA1
++#define XF86XK_TopMenu 0x1008FFA2
++#define XF86XK_Suspend 0x1008FFA7
++#define XF86XK_Hibernate 0x1008FFA8
++
++
+ // end of XF86keysyms.h
+
+ // Special keys used by Qtopia, mapped into the X11 private keypad range.
+@@ -942,10 +1039,8 @@ static const unsigned int KeyTbl[] = {
+ XK_dead_hook, Qt::Key_Dead_Hook,
+ XK_dead_horn, Qt::Key_Dead_Horn,
+
+- // Special multimedia keys
+- // currently only tested with MS internet keyboard
+-
+- // browsing keys
++ // Special keys from X.org - This include multimedia keys,
++ // wireless/bluetooth/uwb keys, special launcher keys, etc.
+ XF86XK_Back, Qt::Key_Back,
+ XF86XK_Forward, Qt::Key_Forward,
+ XF86XK_Stop, Qt::Key_Stop,
+@@ -955,8 +1050,6 @@ static const unsigned int KeyTbl[] = {
+ XF86XK_OpenURL, Qt::Key_OpenUrl,
+ XF86XK_HomePage, Qt::Key_HomePage,
+ XF86XK_Search, Qt::Key_Search,
+-
+- // media keys
+ XF86XK_AudioLowerVolume, Qt::Key_VolumeDown,
+ XF86XK_AudioMute, Qt::Key_VolumeMute,
+ XF86XK_AudioRaiseVolume, Qt::Key_VolumeUp,
+@@ -965,13 +1058,106 @@ static const unsigned int KeyTbl[] = {
+ XF86XK_AudioPrev, Qt::Key_MediaPrevious,
+ XF86XK_AudioNext, Qt::Key_MediaNext,
+ XF86XK_AudioRecord, Qt::Key_MediaRecord,
+-
+- // launch keys
+ XF86XK_Mail, Qt::Key_LaunchMail,
+ XF86XK_MyComputer, Qt::Key_Launch0,
+- XF86XK_Calculator, Qt::Key_Launch1,
++ XF86XK_Calculator, Qt::Key_Calculator,
++ XF86XK_Memo, Qt::Key_Memo,
++ XF86XK_ToDoList, Qt::Key_ToDoList,
++ XF86XK_Calendar, Qt::Key_Calendar,
++ XF86XK_PowerDown, Qt::Key_PowerDown,
++ XF86XK_ContrastAdjust, Qt::Key_ContrastAdjust,
+ XF86XK_Standby, Qt::Key_Standby,
+-
++ XF86XK_MonBrightnessUp, Qt::Key_MonBrightnessUp,
++ XF86XK_MonBrightnessDown, Qt::Key_MonBrightnessDown,
++ XF86XK_KbdLightOnOff, Qt::Key_KeyboardLightOnOff,
++ XF86XK_KbdBrightnessUp, Qt::Key_KeyboardBrightnessUp,
++ XF86XK_KbdBrightnessDown, Qt::Key_KeyboardBrightnessDown,
++ XF86XK_PowerOff, Qt::Key_PowerOff,
++ XF86XK_WakeUp, Qt::Key_WakeUp,
++ XF86XK_Eject, Qt::Key_Eject,
++ XF86XK_ScreenSaver, Qt::Key_ScreenSaver,
++ XF86XK_WWW, Qt::Key_WWW,
++ XF86XK_Sleep, Qt::Key_Sleep,
++ XF86XK_LightBulb, Qt::Key_LightBulb,
++ XF86XK_Shop, Qt::Key_Shop,
++ XF86XK_History, Qt::Key_History,
++ XF86XK_AddFavorite, Qt::Key_AddFavorite,
++ XF86XK_HotLinks, Qt::Key_HotLinks,
++ XF86XK_BrightnessAdjust, Qt::Key_BrightnessAdjust,
++ XF86XK_Finance, Qt::Key_Finance,
++ XF86XK_Community, Qt::Key_Community,
++ XF86XK_AudioRewind, Qt::Key_AudioRewind,
++ XF86XK_BackForward, Qt::Key_BackForward,
++ XF86XK_ApplicationLeft, Qt::Key_ApplicationLeft,
++ XF86XK_ApplicationRight, Qt::Key_ApplicationRight,
++ XF86XK_Book, Qt::Key_Book,
++ XF86XK_CD, Qt::Key_CD,
++ XF86XK_Calculater, Qt::Key_Calculator,
++ XF86XK_Clear, Qt::Key_Clear,
++ XF86XK_ClearGrab, Qt::Key_ClearGrab,
++ XF86XK_Close, Qt::Key_Close,
++ XF86XK_Copy, Qt::Key_Copy,
++ XF86XK_Cut, Qt::Key_Cut,
++ XF86XK_Display, Qt::Key_Display,
++ XF86XK_DOS, Qt::Key_DOS,
++ XF86XK_Documents, Qt::Key_Documents,
++ XF86XK_Excel, Qt::Key_Excel,
++ XF86XK_Explorer, Qt::Key_Explorer,
++ XF86XK_Game, Qt::Key_Game,
++ XF86XK_Go, Qt::Key_Go,
++ XF86XK_iTouch, Qt::Key_iTouch,
++ XF86XK_LogOff, Qt::Key_LogOff,
++ XF86XK_Market, Qt::Key_Market,
++ XF86XK_Meeting, Qt::Key_Meeting,
++ XF86XK_MenuKB, Qt::Key_MenuKB,
++ XF86XK_MenuPB, Qt::Key_MenuPB,
++ XF86XK_MySites, Qt::Key_MySites,
++ XF86XK_News, Qt::Key_News,
++ XF86XK_OfficeHome, Qt::Key_OfficeHome,
++ XF86XK_Option, Qt::Key_Option,
++ XF86XK_Paste, Qt::Key_Paste,
++ XF86XK_Phone, Qt::Key_Phone,
++ XF86XK_Reply, Qt::Key_Reply,
++ XF86XK_Reload, Qt::Key_Reload,
++ XF86XK_RotateWindows, Qt::Key_RotateWindows,
++ XF86XK_RotationPB, Qt::Key_RotationPB,
++ XF86XK_RotationKB, Qt::Key_RotationKB,
++ XF86XK_Save, Qt::Key_Save,
++ XF86XK_Send, Qt::Key_Send,
++ XF86XK_Spell, Qt::Key_Spell,
++ XF86XK_SplitScreen, Qt::Key_SplitScreen,
++ XF86XK_Support, Qt::Key_Support,
++ XF86XK_TaskPane, Qt::Key_TaskPane,
++ XF86XK_Terminal, Qt::Key_Terminal,
++ XF86XK_Tools, Qt::Key_Tools,
++ XF86XK_Travel, Qt::Key_Travel,
++ XF86XK_Video, Qt::Key_Video,
++ XF86XK_Word, Qt::Key_Word,
++ XF86XK_Xfer, Qt::Key_Xfer,
++ XF86XK_ZoomIn, Qt::Key_ZoomIn,
++ XF86XK_ZoomOut, Qt::Key_ZoomOut,
++ XF86XK_Away, Qt::Key_Away,
++ XF86XK_Messenger, Qt::Key_Messenger,
++ XF86XK_WebCam, Qt::Key_WebCam,
++ XF86XK_MailForward, Qt::Key_MailForward,
++ XF86XK_Pictures, Qt::Key_Pictures,
++ XF86XK_Music, Qt::Key_Music,
++ XF86XK_Battery, Qt::Key_Battery,
++ XF86XK_Bluetooth, Qt::Key_Bluetooth,
++ XF86XK_WLAN, Qt::Key_WLAN,
++ XF86XK_UWB, Qt::Key_UWB,
++ XF86XK_AudioForward, Qt::Key_AudioForward,
++ XF86XK_AudioRepeat, Qt::Key_AudioRepeat,
++ XF86XK_AudioRandomPlay, Qt::Key_AudioRandomPlay,
++ XF86XK_Subtitle, Qt::Key_Subtitle,
++ XF86XK_AudioCycleTrack, Qt::Key_AudioCycleTrack,
++ XF86XK_Time, Qt::Key_Time,
++ XF86XK_Select, Qt::Key_Select,
++ XF86XK_View, Qt::Key_View,
++ XF86XK_TopMenu, Qt::Key_TopMenu,
++ XF86XK_Bluetooth, Qt::Key_Bluetooth,
++ XF86XK_Suspend, Qt::Key_Suspend,
++ XF86XK_Hibernate, Qt::Key_Hibernate,
+ XF86XK_Launch0, Qt::Key_Launch2,
+ XF86XK_Launch1, Qt::Key_Launch3,
+ XF86XK_Launch2, Qt::Key_Launch4,
+diff --git a/src/gui/kernel/qkeysequence.cpp b/src/gui/kernel/qkeysequence.cpp
+index 03de530..97591a4 100644
+--- a/src/gui/kernel/qkeysequence.cpp
++++ b/src/gui/kernel/qkeysequence.cpp
+@@ -396,47 +396,139 @@ static const struct {
+ { Qt::Key_Menu, QT_TRANSLATE_NOOP("QShortcut", "Menu") },
+ { Qt::Key_Help, QT_TRANSLATE_NOOP("QShortcut", "Help") },
+
+- // Multimedia keys
+- { Qt::Key_Back, QT_TRANSLATE_NOOP("QShortcut", "Back") },
+- { Qt::Key_Forward, QT_TRANSLATE_NOOP("QShortcut", "Forward") },
+- { Qt::Key_Stop, QT_TRANSLATE_NOOP("QShortcut", "Stop") },
+- { Qt::Key_Refresh, QT_TRANSLATE_NOOP("QShortcut", "Refresh") },
+- { Qt::Key_VolumeDown, QT_TRANSLATE_NOOP("QShortcut", "Volume Down") },
+- { Qt::Key_VolumeMute, QT_TRANSLATE_NOOP("QShortcut", "Volume Mute") },
+- { Qt::Key_VolumeUp, QT_TRANSLATE_NOOP("QShortcut", "Volume Up") },
+- { Qt::Key_BassBoost, QT_TRANSLATE_NOOP("QShortcut", "Bass Boost") },
+- { Qt::Key_BassUp, QT_TRANSLATE_NOOP("QShortcut", "Bass Up") },
+- { Qt::Key_BassDown, QT_TRANSLATE_NOOP("QShortcut", "Bass Down") },
+- { Qt::Key_TrebleUp, QT_TRANSLATE_NOOP("QShortcut", "Treble Up") },
+- { Qt::Key_TrebleDown, QT_TRANSLATE_NOOP("QShortcut", "Treble Down") },
+- { Qt::Key_MediaPlay, QT_TRANSLATE_NOOP("QShortcut", "Media Play") },
+- { Qt::Key_MediaStop, QT_TRANSLATE_NOOP("QShortcut", "Media Stop") },
+- { Qt::Key_MediaPrevious,QT_TRANSLATE_NOOP("QShortcut", "Media Previous") },
+- { Qt::Key_MediaNext, QT_TRANSLATE_NOOP("QShortcut", "Media Next") },
+- { Qt::Key_MediaRecord, QT_TRANSLATE_NOOP("QShortcut", "Media Record") },
+- { Qt::Key_HomePage, QT_TRANSLATE_NOOP("QShortcut", "Home Page") },
+- { Qt::Key_Favorites, QT_TRANSLATE_NOOP("QShortcut", "Favorites") },
+- { Qt::Key_Search, QT_TRANSLATE_NOOP("QShortcut", "Search") },
+- { Qt::Key_Standby, QT_TRANSLATE_NOOP("QShortcut", "Standby") },
+- { Qt::Key_OpenUrl, QT_TRANSLATE_NOOP("QShortcut", "Open URL") },
+- { Qt::Key_LaunchMail, QT_TRANSLATE_NOOP("QShortcut", "Launch Mail") },
+- { Qt::Key_LaunchMedia, QT_TRANSLATE_NOOP("QShortcut", "Launch Media") },
+- { Qt::Key_Launch0, QT_TRANSLATE_NOOP("QShortcut", "Launch (0)") },
+- { Qt::Key_Launch1, QT_TRANSLATE_NOOP("QShortcut", "Launch (1)") },
+- { Qt::Key_Launch2, QT_TRANSLATE_NOOP("QShortcut", "Launch (2)") },
+- { Qt::Key_Launch3, QT_TRANSLATE_NOOP("QShortcut", "Launch (3)") },
+- { Qt::Key_Launch4, QT_TRANSLATE_NOOP("QShortcut", "Launch (4)") },
+- { Qt::Key_Launch5, QT_TRANSLATE_NOOP("QShortcut", "Launch (5)") },
+- { Qt::Key_Launch6, QT_TRANSLATE_NOOP("QShortcut", "Launch (6)") },
+- { Qt::Key_Launch7, QT_TRANSLATE_NOOP("QShortcut", "Launch (7)") },
+- { Qt::Key_Launch8, QT_TRANSLATE_NOOP("QShortcut", "Launch (8)") },
+- { Qt::Key_Launch9, QT_TRANSLATE_NOOP("QShortcut", "Launch (9)") },
+- { Qt::Key_LaunchA, QT_TRANSLATE_NOOP("QShortcut", "Launch (A)") },
+- { Qt::Key_LaunchB, QT_TRANSLATE_NOOP("QShortcut", "Launch (B)") },
+- { Qt::Key_LaunchC, QT_TRANSLATE_NOOP("QShortcut", "Launch (C)") },
+- { Qt::Key_LaunchD, QT_TRANSLATE_NOOP("QShortcut", "Launch (D)") },
+- { Qt::Key_LaunchE, QT_TRANSLATE_NOOP("QShortcut", "Launch (E)") },
+- { Qt::Key_LaunchF, QT_TRANSLATE_NOOP("QShortcut", "Launch (F)") },
++ // Special keys
++ // Includes multimedia, launcher, lan keys ( bluetooth, wireless )
++ // window navigation
++ { Qt::Key_Back, QT_TRANSLATE_NOOP("QShortcut", "Back") },
++ { Qt::Key_Forward, QT_TRANSLATE_NOOP("QShortcut", "Forward") },
++ { Qt::Key_Stop, QT_TRANSLATE_NOOP("QShortcut", "Stop") },
++ { Qt::Key_Refresh, QT_TRANSLATE_NOOP("QShortcut", "Refresh") },
++ { Qt::Key_VolumeDown, QT_TRANSLATE_NOOP("QShortcut", "Volume Down") },
++ { Qt::Key_VolumeMute, QT_TRANSLATE_NOOP("QShortcut", "Volume Mute") },
++ { Qt::Key_VolumeUp, QT_TRANSLATE_NOOP("QShortcut", "Volume Up") },
++ { Qt::Key_BassBoost, QT_TRANSLATE_NOOP("QShortcut", "Bass Boost") },
++ { Qt::Key_BassUp, QT_TRANSLATE_NOOP("QShortcut", "Bass Up") },
++ { Qt::Key_BassDown, QT_TRANSLATE_NOOP("QShortcut", "Bass Down") },
++ { Qt::Key_TrebleUp, QT_TRANSLATE_NOOP("QShortcut", "Treble Up") },
++ { Qt::Key_TrebleDown, QT_TRANSLATE_NOOP("QShortcut", "Treble Down") },
++ { Qt::Key_MediaPlay, QT_TRANSLATE_NOOP("QShortcut", "Media Play") },
++ { Qt::Key_MediaStop, QT_TRANSLATE_NOOP("QShortcut", "Media Stop") },
++ { Qt::Key_MediaPrevious, QT_TRANSLATE_NOOP("QShortcut", "Media Previous") },
++ { Qt::Key_MediaNext, QT_TRANSLATE_NOOP("QShortcut", "Media Next") },
++ { Qt::Key_MediaRecord, QT_TRANSLATE_NOOP("QShortcut", "Media Record") },
++ { Qt::Key_HomePage, QT_TRANSLATE_NOOP("QShortcut", "Home Page") },
++ { Qt::Key_Favorites, QT_TRANSLATE_NOOP("QShortcut", "Favorites") },
++ { Qt::Key_Search, QT_TRANSLATE_NOOP("QShortcut", "Search") },
++ { Qt::Key_Standby, QT_TRANSLATE_NOOP("QShortcut", "Standby") },
++ { Qt::Key_OpenUrl, QT_TRANSLATE_NOOP("QShortcut", "Open URL") },
++ { Qt::Key_LaunchMail, QT_TRANSLATE_NOOP("QShortcut", "Launch Mail") },
++ { Qt::Key_LaunchMedia, QT_TRANSLATE_NOOP("QShortcut", "Launch Media") },
++ { Qt::Key_Launch0, QT_TRANSLATE_NOOP("QShortcut", "Launch (0)") },
++ { Qt::Key_Launch1, QT_TRANSLATE_NOOP("QShortcut", "Launch (1)") },
++ { Qt::Key_Launch2, QT_TRANSLATE_NOOP("QShortcut", "Launch (2)") },
++ { Qt::Key_Launch3, QT_TRANSLATE_NOOP("QShortcut", "Launch (3)") },
++ { Qt::Key_Launch4, QT_TRANSLATE_NOOP("QShortcut", "Launch (4)") },
++ { Qt::Key_Launch5, QT_TRANSLATE_NOOP("QShortcut", "Launch (5)") },
++ { Qt::Key_Launch6, QT_TRANSLATE_NOOP("QShortcut", "Launch (6)") },
++ { Qt::Key_Launch7, QT_TRANSLATE_NOOP("QShortcut", "Launch (7)") },
++ { Qt::Key_Launch8, QT_TRANSLATE_NOOP("QShortcut", "Launch (8)") },
++ { Qt::Key_Launch9, QT_TRANSLATE_NOOP("QShortcut", "Launch (9)") },
++ { Qt::Key_LaunchA, QT_TRANSLATE_NOOP("QShortcut", "Launch (A)") },
++ { Qt::Key_LaunchB, QT_TRANSLATE_NOOP("QShortcut", "Launch (B)") },
++ { Qt::Key_LaunchC, QT_TRANSLATE_NOOP("QShortcut", "Launch (C)") },
++ { Qt::Key_LaunchD, QT_TRANSLATE_NOOP("QShortcut", "Launch (D)") },
++ { Qt::Key_LaunchE, QT_TRANSLATE_NOOP("QShortcut", "Launch (E)") },
++ { Qt::Key_LaunchF, QT_TRANSLATE_NOOP("QShortcut", "Launch (F)") },
++ { Qt::Key_MonBrightnessUp, QT_TRANSLATE_NOOP("QShortcut", "Monitor Brightness Up") },
++ { Qt::Key_MonBrightnessDown, QT_TRANSLATE_NOOP("QShortcut", "Monitor Brightness Down") },
++ { Qt::Key_KeyboardLightOnOff, QT_TRANSLATE_NOOP("QShortcut", "Keyboard Light On/Off") },
++ { Qt::Key_KeyboardBrightnessUp, QT_TRANSLATE_NOOP("QShortcut", "Keyboard Brightness Up") },
++ { Qt::Key_KeyboardBrightnessDown, QT_TRANSLATE_NOOP("QShortcut", "Keyboard Brightness Down") },
++ { Qt::Key_PowerOff, QT_TRANSLATE_NOOP("QShortcut", "Power Off") },
++ { Qt::Key_WakeUp, QT_TRANSLATE_NOOP("QShortcut", "Wake Up") },
++ { Qt::Key_Eject, QT_TRANSLATE_NOOP("QShortcut", "Eject") },
++ { Qt::Key_ScreenSaver, QT_TRANSLATE_NOOP("QShortcut", "Screensaver") },
++ { Qt::Key_WWW, QT_TRANSLATE_NOOP("QShortcut", "WWW") },
++ { Qt::Key_Sleep, QT_TRANSLATE_NOOP("QShortcut", "Sleep") },
++ { Qt::Key_LightBulb, QT_TRANSLATE_NOOP("QShortcut", "LightBulb") },
++ { Qt::Key_Shop, QT_TRANSLATE_NOOP("QShortcut", "Shop") },
++ { Qt::Key_History, QT_TRANSLATE_NOOP("QShortcut", "History") },
++ { Qt::Key_AddFavorite, QT_TRANSLATE_NOOP("QShortcut", "Add Favorite") },
++ { Qt::Key_HotLinks, QT_TRANSLATE_NOOP("QShortcut", "Hot Links") },
++ { Qt::Key_BrightnessAdjust, QT_TRANSLATE_NOOP("QShortcut", "Adjust Brightness") },
++ { Qt::Key_Finance, QT_TRANSLATE_NOOP("QShortcut", "Finance") },
++ { Qt::Key_Community, QT_TRANSLATE_NOOP("QShortcut", "Community") },
++ { Qt::Key_AudioRewind, QT_TRANSLATE_NOOP("QShortcut", "Audio Rewind") },
++ { Qt::Key_BackForward, QT_TRANSLATE_NOOP("QShortcut", "Back Forward") },
++ { Qt::Key_ApplicationLeft, QT_TRANSLATE_NOOP("QShortcut", "Application Left") },
++ { Qt::Key_ApplicationRight, QT_TRANSLATE_NOOP("QShortcut", "Application Right") },
++ { Qt::Key_Book, QT_TRANSLATE_NOOP("QShortcut", "Book") },
++ { Qt::Key_CD, QT_TRANSLATE_NOOP("QShortcut", "CD") },
++ { Qt::Key_Calculator, QT_TRANSLATE_NOOP("QShortcut", "Calculator") },
++ { Qt::Key_Clear, QT_TRANSLATE_NOOP("QShortcut", "Clear") },
++ { Qt::Key_ClearGrab, QT_TRANSLATE_NOOP("QShortcut", "Clear Grab") },
++ { Qt::Key_Close, QT_TRANSLATE_NOOP("QShortcut", "Close") },
++ { Qt::Key_Copy, QT_TRANSLATE_NOOP("QShortcut", "Copy") },
++ { Qt::Key_Cut, QT_TRANSLATE_NOOP("QShortcut", "Cut") },
++ { Qt::Key_Display, QT_TRANSLATE_NOOP("QShortcut", "Display") },
++ { Qt::Key_DOS, QT_TRANSLATE_NOOP("QShortcut", "DOS") },
++ { Qt::Key_Documents, QT_TRANSLATE_NOOP("QShortcut", "Documents") },
++ { Qt::Key_Excel, QT_TRANSLATE_NOOP("QShortcut", "Spreadsheet") },
++ { Qt::Key_Explorer, QT_TRANSLATE_NOOP("QShortcut", "Browser") },
++ { Qt::Key_Game, QT_TRANSLATE_NOOP("QShortcut", "Game") },
++ { Qt::Key_Go, QT_TRANSLATE_NOOP("QShortcut", "Go") },
++ { Qt::Key_iTouch, QT_TRANSLATE_NOOP("QShortcut", "iTouch") },
++ { Qt::Key_LogOff, QT_TRANSLATE_NOOP("QShortcut", "Logoff") },
++ { Qt::Key_Market, QT_TRANSLATE_NOOP("QShortcut", "Market") },
++ { Qt::Key_Meeting, QT_TRANSLATE_NOOP("QShortcut", "Meeting") },
++ { Qt::Key_MenuKB, QT_TRANSLATE_NOOP("QShortcut", "Keyboard Menu") },
++ { Qt::Key_MenuPB, QT_TRANSLATE_NOOP("QShortcut", "Menu PB") },
++ { Qt::Key_MySites, QT_TRANSLATE_NOOP("QShortcut", "My Sites") },
++ { Qt::Key_News, QT_TRANSLATE_NOOP("QShortcut", "News") },
++ { Qt::Key_OfficeHome, QT_TRANSLATE_NOOP("QShortcut", "Home Office") },
++ { Qt::Key_Option, QT_TRANSLATE_NOOP("QShortcut", "Option") },
++ { Qt::Key_Paste, QT_TRANSLATE_NOOP("QShortcut", "Paste") },
++ { Qt::Key_Phone, QT_TRANSLATE_NOOP("QShortcut", "Phone") },
++ { Qt::Key_Reply, QT_TRANSLATE_NOOP("QShortcut", "Reply") },
++ { Qt::Key_Reload, QT_TRANSLATE_NOOP("QShortcut", "Reload") },
++ { Qt::Key_RotateWindows, QT_TRANSLATE_NOOP("QShortcut", "Rotate Windows") },
++ { Qt::Key_RotationPB, QT_TRANSLATE_NOOP("QShortcut", "Rotation PB") },
++ { Qt::Key_RotationKB, QT_TRANSLATE_NOOP("QShortcut", "Rotation KB") },
++ { Qt::Key_Save, QT_TRANSLATE_NOOP("QShortcut", "Save") },
++ { Qt::Key_Send, QT_TRANSLATE_NOOP("QShortcut", "Send") },
++ { Qt::Key_Spell, QT_TRANSLATE_NOOP("QShortcut", "Spellchecker") },
++ { Qt::Key_SplitScreen, QT_TRANSLATE_NOOP("QShortcut", "Split Screen") },
++ { Qt::Key_Support, QT_TRANSLATE_NOOP("QShortcut", "Support") },
++ { Qt::Key_TaskPane, QT_TRANSLATE_NOOP("QShortcut", "Task Panel") },
++ { Qt::Key_Terminal, QT_TRANSLATE_NOOP("QShortcut", "Terminal") },
++ { Qt::Key_Tools, QT_TRANSLATE_NOOP("QShortcut", "Tools") },
++ { Qt::Key_Travel, QT_TRANSLATE_NOOP("QShortcut", "Travel") },
++ { Qt::Key_Video, QT_TRANSLATE_NOOP("QShortcut", "Video") },
++ { Qt::Key_Word, QT_TRANSLATE_NOOP("QShortcut", "Word Processor") },
++ { Qt::Key_Xfer, QT_TRANSLATE_NOOP("QShortcut", "XFer") },
++ { Qt::Key_ZoomIn, QT_TRANSLATE_NOOP("QShortcut", "Zoom In") },
++ { Qt::Key_ZoomOut, QT_TRANSLATE_NOOP("QShortcut", "Zoom Out") },
++ { Qt::Key_Away, QT_TRANSLATE_NOOP("QShortcut", "Away") },
++ { Qt::Key_Messenger, QT_TRANSLATE_NOOP("QShortcut", "Messenger") },
++ { Qt::Key_WebCam, QT_TRANSLATE_NOOP("QShortcut", "WebCam") },
++ { Qt::Key_MailForward, QT_TRANSLATE_NOOP("QShortcut", "Mail Forward") },
++ { Qt::Key_Pictures, QT_TRANSLATE_NOOP("QShortcut", "Pictures") },
++ { Qt::Key_Music, QT_TRANSLATE_NOOP("QShortcut", "Music") },
++ { Qt::Key_Battery, QT_TRANSLATE_NOOP("QShortcut", "Battery") },
++ { Qt::Key_Bluetooth, QT_TRANSLATE_NOOP("QShortcut", "Bluetooth") },
++ { Qt::Key_WLAN, QT_TRANSLATE_NOOP("QShortcut", "Wireless") },
++ { Qt::Key_UWB, QT_TRANSLATE_NOOP("QShortcut", "Ultra Wide Band") },
++ { Qt::Key_AudioForward, QT_TRANSLATE_NOOP("QShortcut", "Audio Forward") },
++ { Qt::Key_AudioRepeat, QT_TRANSLATE_NOOP("QShortcut", "Audio Repeat") },
++ { Qt::Key_AudioRandomPlay, QT_TRANSLATE_NOOP("QShortcut", "Audio Random Play") },
++ { Qt::Key_Subtitle, QT_TRANSLATE_NOOP("QShortcut", "Subtitle") },
++ { Qt::Key_AudioCycleTrack, QT_TRANSLATE_NOOP("QShortcut", "Audio Cycle Track") },
++ { Qt::Key_Time, QT_TRANSLATE_NOOP("QShortcut", "Time") },
++ { Qt::Key_Select, QT_TRANSLATE_NOOP("QShortcut", "Select") },
++ { Qt::Key_View, QT_TRANSLATE_NOOP("QShortcut", "View") },
++ { Qt::Key_TopMenu, QT_TRANSLATE_NOOP("QShortcut", "Top Menu") },
++ { Qt::Key_Suspend, QT_TRANSLATE_NOOP("QShortcut", "Suspend") },
++ { Qt::Key_Hibernate, QT_TRANSLATE_NOOP("QShortcut", "Hibernate") },
+
+ // --------------------------------------------------------------
+ // More consistent namings
+@@ -991,10 +1083,10 @@ int QKeySequencePrivate::decodeString(const QString &str, QKeySequence::Sequence
+
+ QList<QModifKeyName> modifs;
+ if (nativeText) {
+- modifs << QModifKeyName(Qt::CTRL, QShortcut::tr("Ctrl").toLower().append(QLatin1Char('+')))
+- << QModifKeyName(Qt::SHIFT, QShortcut::tr("Shift").toLower().append(QLatin1Char('+')))
+- << QModifKeyName(Qt::ALT, QShortcut::tr("Alt").toLower().append(QLatin1Char('+')))
+- << QModifKeyName(Qt::META, QShortcut::tr("Meta").toLower().append(QLatin1Char('+')));
++ modifs << QModifKeyName(Qt::CTRL, QShortcut::tr("Ctrl", "Ctrl key, used for shortcuts").toLower().append(QLatin1Char('+')))
++ << QModifKeyName(Qt::SHIFT, QShortcut::tr("Shift", "Shift key, used for shortcuts").toLower().append(QLatin1Char('+')))
++ << QModifKeyName(Qt::ALT, QShortcut::tr("Alt", "Alt key, used for shortcuts").toLower().append(QLatin1Char('+')))
++ << QModifKeyName(Qt::META, QShortcut::tr("Meta", "Meta key, used for shortcuts").toLower().append(QLatin1Char('+')));
+ }
+ modifs += *gmodifs; // Test non-translated ones last
+
+@@ -1086,7 +1178,7 @@ QString QKeySequence::encodeString(int key)
+ static inline void addKey(QString &str, const QString &theKey, QKeySequence::SequenceFormat format)
+ {
+ if (!str.isEmpty())
+- str += (format == QKeySequence::NativeText) ? QShortcut::tr("+")
++ str += (format == QKeySequence::NativeText) ? QShortcut::tr("+", "Symbol used to concatenate keys in shortcuts")
+ : QString::fromLatin1("+");
+ str += theKey;
+ }
+@@ -1111,13 +1203,13 @@ QString QKeySequencePrivate::encodeString(int key, QKeySequence::SequenceFormat
+ {
+ // On other systems the order is Meta, Control, Alt, Shift
+ if ((key & Qt::META) == Qt::META)
+- s = nativeText ? QShortcut::tr("Meta") : QString::fromLatin1("Meta");
++ s = nativeText ? QShortcut::tr("Meta", "Meta key, used for shortcuts") : QString::fromLatin1("Meta");
+ if ((key & Qt::CTRL) == Qt::CTRL)
+- addKey(s, nativeText ? QShortcut::tr("Ctrl") : QString::fromLatin1("Ctrl"), format);
++ addKey(s, nativeText ? QShortcut::tr("Ctrl", "Ctrl key, used for shortcuts") : QString::fromLatin1("Ctrl"), format);
+ if ((key & Qt::ALT) == Qt::ALT)
+- addKey(s, nativeText ? QShortcut::tr("Alt") : QString::fromLatin1("Alt"), format);
++ addKey(s, nativeText ? QShortcut::tr("Alt", "Alt key, used for shortcuts") : QString::fromLatin1("Alt"), format);
+ if ((key & Qt::SHIFT) == Qt::SHIFT)
+- addKey(s, nativeText ? QShortcut::tr("Shift") : QString::fromLatin1("Shift"), format);
++ addKey(s, nativeText ? QShortcut::tr("Shift", "Shift key, used for shortcuts") : QString::fromLatin1("Shift"), format);
+ }
+
+
+@@ -1132,7 +1224,7 @@ QString QKeySequencePrivate::encodeString(int key, QKeySequence::SequenceFormat
+ p += QChar((key-0x10000)%400+0xdc00);
+ }
+ } else if (key >= Qt::Key_F1 && key <= Qt::Key_F35) {
+- p = nativeText ? QShortcut::tr("F%1").arg(key - Qt::Key_F1 + 1)
++ p = nativeText ? QShortcut::tr("F%1", "Fx key, used for shortcuts").arg(key - Qt::Key_F1 + 1)
+ : QString::fromLatin1("F%1").arg(key - Qt::Key_F1 + 1);
+ } else if (key) {
+ int i=0;
+diff --git a/src/gui/kernel/qwidget_p.h b/src/gui/kernel/qwidget_p.h
+index 145d7bb..db943fc 100644
+--- a/src/gui/kernel/qwidget_p.h
++++ b/src/gui/kernel/qwidget_p.h
+@@ -360,6 +360,7 @@ public:
+
+ #if defined(Q_WS_X11)
+ void setWindowRole();
++ virtual void checkWindowRole();
+ void sendStartupMessage(const char *message) const;
+ void setNetWmWindowTypes();
+ void x11UpdateIsOpaque();
+diff --git a/src/gui/kernel/qwidget_x11.cpp b/src/gui/kernel/qwidget_x11.cpp
+index 4cc255d..927d739 100644
+--- a/src/gui/kernel/qwidget_x11.cpp
++++ b/src/gui/kernel/qwidget_x11.cpp
+@@ -719,6 +719,11 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
+ 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<char *>(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();
+@@ -769,32 +774,40 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
+ // 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
++ 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
+ 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()) {
+@@ -2765,6 +2778,17 @@ void QWidgetPrivate::setWindowRole()
+ (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)
+ QPaintEngine *QWidget::paintEngine() const
+ {
+diff --git a/src/gui/painting/qwindowsurface_raster.cpp b/src/gui/painting/qwindowsurface_raster.cpp
+index e077d0d..424e525 100644
+--- a/src/gui/painting/qwindowsurface_raster.cpp
++++ b/src/gui/painting/qwindowsurface_raster.cpp
+@@ -220,9 +220,16 @@ void QRasterWindowSurface::flush(QWidget *widget, const QRegion &rgn, const QPoi
+
+ QRect br = rgn.boundingRect().translated(offset);
+ #ifndef QT_NO_MITSHM
+- if (d_ptr->image->xshmpm) {
+- XCopyArea(X11->display, d_ptr->image->xshmpm, widget->handle(), d_ptr->gc,
+- br.x(), br.y(), br.width(), br.height(), wbr.x(), wbr.y());
++ if (d_ptr->image->xshmimg && (br.width() * br.height() > 65536)) {
++ const QImage &src = d->image->image;
++ br = br.intersected(src.rect());
++ // Hack to make sure we satisify the PutImage() constraints in the X server,
++ // since the doShmPutImage() route currently forces a migration to system ram.
++ wbr.setX(wbr.x() - br.x());
++ br.setX(0);
++ br.setWidth(src.width());
++ XShmPutImage(X11->display, widget->handle(), d_ptr->gc, d_ptr->image->xshmimg,
++ br.x(), br.y(), wbr.x(), wbr.y(), br.width(), br.height(), False);
+ XSync(X11->display, False);
+ } else
+ #endif
+diff --git a/src/gui/widgets/qmenu.cpp b/src/gui/widgets/qmenu.cpp
+index 7793b80..5e5c7cf 100644
+--- a/src/gui/widgets/qmenu.cpp
++++ b/src/gui/widgets/qmenu.cpp
+@@ -280,7 +280,7 @@ void QMenuPrivate::calcActionRects(QMap<QAction*, QRect> &actionRects, QList<QAc
+
+
+ if (!sz.isEmpty()) {
+- max_column_width = qMax(max_column_width, sz.width());
++ max_column_width = qMax(q->minimumWidth(), qMax(max_column_width, sz.width()));
+ //wrapping
+ if (!scroll &&
+ y+sz.height()+vmargin > dh - (q->style()->pixelMetric(QStyle::PM_MenuDesktopFrameWidth, 0, q) * 2)) {
+diff --git a/src/gui/widgets/qtabbar.cpp b/src/gui/widgets/qtabbar.cpp
+index 8a87b75..0fbc116 100644
+--- a/src/gui/widgets/qtabbar.cpp
++++ b/src/gui/widgets/qtabbar.cpp
+@@ -675,8 +675,8 @@ void QTabBarPrivate::refresh()
+ layoutTabs();
+ makeVisible(currentIndex);
+ q->update();
+- q->updateGeometry();
+ }
++ q->updateGeometry();
+ }
+
+ /*!
+diff --git a/src/tools/moc/main.cpp b/src/tools/moc/main.cpp
+index d1cb82c..54537e5 100644
+--- a/src/tools/moc/main.cpp
++++ b/src/tools/moc/main.cpp
+@@ -94,7 +94,13 @@ static QByteArray combinePath(const char *infile, const char *outfile)
+ inSplitted.prepend(QLatin1String(".."));
+ }
+ inSplitted.append(inFileInfo.fileName());
++#ifdef Q_WS_WIN
++ const QString rel = inSplitted.join(QLatin1String("/"));
++ const QString abs = inFileInfo.absoluteFilePath();
++ return QFile::encodeName(rel.length() < abs.length() ? rel : abs);
++#else
+ return QFile::encodeName(inSplitted.join(QLatin1String("/")));
++#endif
+ }
+
+