summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel
diff options
context:
space:
mode:
authorOlivier Goffart <ogoffart@trolltech.com>2009-10-29 08:10:27 (GMT)
committerOlivier Goffart <ogoffart@trolltech.com>2009-10-29 08:10:41 (GMT)
commitdf37b2e9023bc2cebe00c77be6040019cfdc24b6 (patch)
tree06739d09b63dd673b510a5af31de7c30407bed6e /src/gui/kernel
parentf32abd2b9febdeadeb5536d0318f77be4180f142 (diff)
parentcabfa68f3e37e79a18775a9970f6d166e75ece07 (diff)
downloadQt-df37b2e9023bc2cebe00c77be6040019cfdc24b6.zip
Qt-df37b2e9023bc2cebe00c77be6040019cfdc24b6.tar.gz
Qt-df37b2e9023bc2cebe00c77be6040019cfdc24b6.tar.bz2
Merge commit origin/4.6 into team-widgets/4.6
Diffstat (limited to 'src/gui/kernel')
-rw-r--r--src/gui/kernel/qapplication.cpp4
-rw-r--r--src/gui/kernel/qapplication_mac.mm37
-rw-r--r--src/gui/kernel/qapplication_s60.cpp13
-rw-r--r--src/gui/kernel/qcocoaview_mac.mm24
-rw-r--r--src/gui/kernel/qdesktopwidget.cpp5
-rw-r--r--src/gui/kernel/qgesture.cpp6
-rw-r--r--src/gui/kernel/qsoftkeymanager.cpp6
-rw-r--r--src/gui/kernel/qstandardgestures.cpp1
-rw-r--r--src/gui/kernel/qt_s60_p.h2
-rw-r--r--src/gui/kernel/qwidget_mac.mm11
-rw-r--r--src/gui/kernel/qwidget_s60.cpp9
11 files changed, 55 insertions, 63 deletions
diff --git a/src/gui/kernel/qapplication.cpp b/src/gui/kernel/qapplication.cpp
index 7c38d4b..85b055e 100644
--- a/src/gui/kernel/qapplication.cpp
+++ b/src/gui/kernel/qapplication.cpp
@@ -940,12 +940,8 @@ void QApplicationPrivate::initialize()
graphics_system = QGraphicsSystemFactory::create(graphics_system_name);
#endif
#ifndef QT_NO_WHEELEVENT
-#ifdef Q_OS_MAC
- QApplicationPrivate::wheel_scroll_lines = 1;
-#else
QApplicationPrivate::wheel_scroll_lines = 3;
#endif
-#endif
initializeMultitouch();
}
diff --git a/src/gui/kernel/qapplication_mac.mm b/src/gui/kernel/qapplication_mac.mm
index 771cddc..84e0d50 100644
--- a/src/gui/kernel/qapplication_mac.mm
+++ b/src/gui/kernel/qapplication_mac.mm
@@ -1697,15 +1697,14 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event
// (actually two events; one for horizontal and one for vertical).
// As a results of this, and to make sure we dont't receive duplicate events,
// we try to detect when this happend by checking the 'compatibilityEvent'.
- const int scrollFactor = 4 * 8;
SInt32 mdelt = 0;
GetEventParameter(event, kEventParamMouseWheelSmoothHorizontalDelta, typeSInt32, 0,
sizeof(mdelt), 0, &mdelt);
- wheel_deltaX = mdelt * scrollFactor;
+ wheel_deltaX = mdelt;
mdelt = 0;
GetEventParameter(event, kEventParamMouseWheelSmoothVerticalDelta, typeSInt32, 0,
sizeof(mdelt), 0, &mdelt);
- wheel_deltaY = mdelt * scrollFactor;
+ wheel_deltaY = mdelt;
GetEventParameter(event, kEventParamEventRef, typeEventRef, 0,
sizeof(compatibilityEvent), 0, &compatibilityEvent);
} else if (ekind == kEventMouseWheelMoved) {
@@ -1718,31 +1717,11 @@ QApplicationPrivate::globalEventProcessor(EventHandlerCallRef er, EventRef event
GetEventParameter(event, kEventParamMouseWheelAxis, typeMouseWheelAxis, 0,
sizeof(axis), 0, &axis);
- // The 'new' event has acceleration applied by the OS, while the old (on
- // Carbon only), has not. So we introduce acceleration here to be consistent.
- // The acceleration is trying to respect both pixel based and line scrolling,
- // which turns out to be rather difficult.
- int linesToScroll = mdelt > 0 ? 1 : -1;
- static QTime t;
- int elapsed = t.elapsed();
- t.restart();
- if (elapsed < 20)
- linesToScroll *= 120;
- else if (elapsed < 30)
- linesToScroll *= 60;
- else if (elapsed < 50)
- linesToScroll *= 30;
- else if (elapsed < 100)
- linesToScroll *= 6;
- else if (elapsed < 200)
- linesToScroll *= 3;
- else if (elapsed < 300)
- linesToScroll *= 2;
-
+ // Remove acceleration, and use either -120 or 120 as delta:
if (axis == kEventMouseWheelAxisX)
- wheel_deltaX = linesToScroll * 120;
+ wheel_deltaX = qBound(-120, int(mdelt * 10000), 120);
else
- wheel_deltaY = linesToScroll * 120;
+ wheel_deltaY = qBound(-120, int(mdelt * 10000), 120);
}
}
@@ -2695,11 +2674,7 @@ int QApplication::keyboardInputInterval()
void QApplication::setWheelScrollLines(int n)
{
- Q_UNUSED(n);
- // On Mac, acceleration is handled by the OS. Multiplying wheel scroll
- // deltas with n will not be as cross platform as one might think! So
- // we choose to go native in this case (and let wheel_scroll_lines == 1).
- // QApplicationPrivate::wheel_scroll_lines = n;
+ QApplicationPrivate::wheel_scroll_lines = n;
}
int QApplication::wheelScrollLines()
diff --git a/src/gui/kernel/qapplication_s60.cpp b/src/gui/kernel/qapplication_s60.cpp
index 689429e..30bf99a 100644
--- a/src/gui/kernel/qapplication_s60.cpp
+++ b/src/gui/kernel/qapplication_s60.cpp
@@ -1030,6 +1030,14 @@ QApplication::QApplication(QApplication::QS60MainApplicationFactory factory, int
void qt_init(QApplicationPrivate * /* priv */, int)
{
if (!CCoeEnv::Static()) {
+ // The S60 framework creates a new trap handler which will render any existing traps
+ // invalid as long as it is active. This means that all code in main() that occurs after
+ // the QApplication construction needs to be surrounded by a new trap, despite having
+ // an outer one already. To avoid this, we save the original trap handler here, and set
+ // it back after the S60 framework is constructed. Then we restore it right before the S60
+ // framework destruction.
+ TTrapHandler *origTrapHandler = User::TrapHandler();
+
// The S60 framework has not been initalized. We need to do it.
TApaApplicationFactory factory(S60->s60ApplicationFactory ?
S60->s60ApplicationFactory : newS60Application);
@@ -1041,6 +1049,8 @@ void qt_init(QApplicationPrivate * /* priv */, int)
QT_TRAP_THROWING(coe->ConstructAppFromCommandLineL(factory,*commandLine));
delete commandLine;
+ S60->s60InstalledTrapHandler = User::SetTrapHandler(origTrapHandler);
+
S60->qtOwnsS60Environment = true;
} else {
S60->qtOwnsS60Environment = false;
@@ -1195,6 +1205,9 @@ void qt_cleanup()
S60->wsSession().SetPointerCursorMode(EPointerCursorNone);
if (S60->qtOwnsS60Environment) {
+ // Restore the S60 framework trap handler. See qt_init().
+ User::SetTrapHandler(S60->s60InstalledTrapHandler);
+
CEikonEnv* coe = CEikonEnv::Static();
coe->PrepareToExit();
// The CEikonEnv itself is destroyed in here.
diff --git a/src/gui/kernel/qcocoaview_mac.mm b/src/gui/kernel/qcocoaview_mac.mm
index d49c150..ecc6bc9 100644
--- a/src/gui/kernel/qcocoaview_mac.mm
+++ b/src/gui/kernel/qcocoaview_mac.mm
@@ -795,23 +795,23 @@ extern "C" {
const EventRef carbonEvent = (EventRef)[theEvent eventRef];
const UInt32 carbonEventKind = carbonEvent ? ::GetEventKind(carbonEvent) : 0;
- if (carbonEventKind == kEventMouseScroll) {
+ const bool scrollEvent = carbonEventKind == kEventMouseScroll;
+
+ if (scrollEvent) {
// The mouse device containts pixel scroll wheel support (Mighty Mouse, Trackpad).
// Since deviceDelta is delivered as pixels rather than degrees, we need to
// convert from pixels to degrees in a sensible manner.
// It looks like four degrees per pixel behaves most native.
// Qt expects the unit for delta to be 1/8 of a degree:
- const int scrollFactor = 4 * 8;
- deltaX = (int)[theEvent deviceDeltaX] * scrollFactor;
- deltaY = (int)[theEvent deviceDeltaY] * scrollFactor;
- deltaZ = (int)[theEvent deviceDeltaZ] * scrollFactor;
- } else { // carbonEventKind == kEventMouseWheelMoved
- // Mouse wheel deltas seem to tick in at increments of 0.1.
- // Qt widgets expect the delta to be a multiple of 120.
- const int scrollFactor = 10 * 120;
- deltaX = [theEvent deltaX] * scrollFactor;
- deltaY = [theEvent deltaY] * scrollFactor;
- deltaZ = [theEvent deltaZ] * scrollFactor;
+ deltaX = [theEvent deviceDeltaX];
+ deltaY = [theEvent deviceDeltaY];
+ deltaZ = [theEvent deviceDeltaZ];
+ } else {
+ // carbonEventKind == kEventMouseWheelMoved
+ // Remove acceleration, and use either -120 or 120 as delta:
+ deltaX = qBound(-120, int([theEvent deltaX] * 10000), 120);
+ deltaY = qBound(-120, int([theEvent deltaY] * 10000), 120);
+ deltaZ = qBound(-120, int([theEvent deltaZ] * 10000), 120);
}
if (deltaX != 0) {
diff --git a/src/gui/kernel/qdesktopwidget.cpp b/src/gui/kernel/qdesktopwidget.cpp
index b1e1008..c6d5000 100644
--- a/src/gui/kernel/qdesktopwidget.cpp
+++ b/src/gui/kernel/qdesktopwidget.cpp
@@ -40,12 +40,11 @@
****************************************************************************/
#include "qglobal.h"
-
-QT_BEGIN_NAMESPACE
-
#include "qdesktopwidget.h"
#include "qwidget_p.h"
+QT_BEGIN_NAMESPACE
+
const QRect QDesktopWidget::screenGeometry(const QWidget *widget) const
{
QRect rect = QWidgetPrivate::screenGeometry(widget);
diff --git a/src/gui/kernel/qgesture.cpp b/src/gui/kernel/qgesture.cpp
index ecdd661..a161876 100644
--- a/src/gui/kernel/qgesture.cpp
+++ b/src/gui/kernel/qgesture.cpp
@@ -142,12 +142,6 @@ QGesture::~QGesture()
\brief whether the gesture has a hot-spot
*/
-/*!
- \property QGesture::targetObject
- \brief the target object which will receive the gesture event if the hotSpot is
- not set
-*/
-
Qt::GestureType QGesture::gestureType() const
{
return d_func()->gestureType;
diff --git a/src/gui/kernel/qsoftkeymanager.cpp b/src/gui/kernel/qsoftkeymanager.cpp
index 6116a5e..75c321e 100644
--- a/src/gui/kernel/qsoftkeymanager.cpp
+++ b/src/gui/kernel/qsoftkeymanager.cpp
@@ -189,7 +189,8 @@ bool QSoftKeyManager::event(QEvent *e)
} while (source);
QSoftKeyManagerPrivate::softKeySource = source;
- QSoftKeyManagerPrivate::updateSoftKeys_sys(softKeys);
+ if (source)
+ QSoftKeyManagerPrivate::updateSoftKeys_sys(softKeys);
return true;
}
return false;
@@ -237,7 +238,8 @@ void QSoftKeyManagerPrivate::updateSoftKeys_sys(const QList<QAction*> &softkeys)
}
}
- if (needsExitButton)
+ Qt::WindowType sourceWindowType = QSoftKeyManagerPrivate::softKeySource->window()->windowType();
+ if (needsExitButton && sourceWindowType != Qt::Dialog && sourceWindowType != Qt::Popup)
QT_TRAP_THROWING(nativeContainer->SetCommandL(2, EAknSoftkeyExit, qt_QString2TPtrC(QSoftKeyManager::tr("Exit"))));
nativeContainer->DrawDeferred(); // 3.1 needs an extra invitation
diff --git a/src/gui/kernel/qstandardgestures.cpp b/src/gui/kernel/qstandardgestures.cpp
index a136379..dec2311 100644
--- a/src/gui/kernel/qstandardgestures.cpp
+++ b/src/gui/kernel/qstandardgestures.cpp
@@ -140,7 +140,6 @@ void QPanGestureRecognizer::reset(QGesture *state)
QGestureRecognizer::reset(state);
}
-/*! \internal */
/*
bool QPanGestureRecognizer::event(QEvent *event)
{
diff --git a/src/gui/kernel/qt_s60_p.h b/src/gui/kernel/qt_s60_p.h
index e25bc81..789d89e 100644
--- a/src/gui/kernel/qt_s60_p.h
+++ b/src/gui/kernel/qt_s60_p.h
@@ -124,6 +124,8 @@ public:
static inline CAknTitlePane* titlePane();
static inline CAknContextPane* contextPane();
static inline CEikButtonGroupContainer* buttonGroupContainer();
+
+ TTrapHandler *s60InstalledTrapHandler;
#endif
};
diff --git a/src/gui/kernel/qwidget_mac.mm b/src/gui/kernel/qwidget_mac.mm
index d08f8a9..95c0bed 100644
--- a/src/gui/kernel/qwidget_mac.mm
+++ b/src/gui/kernel/qwidget_mac.mm
@@ -3390,12 +3390,19 @@ void QWidgetPrivate::hide_sys()
w = q->parentWidget()->window();
if(!w || (!w->isVisible() && !w->isMinimized())) {
#ifndef QT_MAC_USE_COCOA
- for(WindowPtr wp = GetFrontWindowOfClass(kDocumentWindowClass, true);
- wp; wp = GetNextWindowOfClass(wp, kDocumentWindowClass, true)) {
+ for (WindowPtr wp = GetFrontWindowOfClass(kMovableModalWindowClass, true);
+ wp; wp = GetNextWindowOfClass(wp, kMovableModalWindowClass, true)) {
if((w = qt_mac_find_window(wp)))
break;
}
if (!w){
+ for (WindowPtr wp = GetFrontWindowOfClass(kDocumentWindowClass, true);
+ wp; wp = GetNextWindowOfClass(wp, kDocumentWindowClass, true)) {
+ if((w = qt_mac_find_window(wp)))
+ break;
+ }
+ }
+ if (!w){
for(WindowPtr wp = GetFrontWindowOfClass(kSimpleWindowClass, true);
wp; wp = GetNextWindowOfClass(wp, kSimpleWindowClass, true)) {
if((w = qt_mac_find_window(wp)))
diff --git a/src/gui/kernel/qwidget_s60.cpp b/src/gui/kernel/qwidget_s60.cpp
index abf5ba5..cb615fe 100644
--- a/src/gui/kernel/qwidget_s60.cpp
+++ b/src/gui/kernel/qwidget_s60.cpp
@@ -564,8 +564,13 @@ void QWidgetPrivate::lower_sys()
Q_Q(QWidget);
Q_ASSERT(q->testAttribute(Qt::WA_WState_Created));
- if (q->internalWinId())
- q->internalWinId()->DrawableWindow()->SetOrdinalPosition(-1);
+ if (q->internalWinId()) {
+ // If toplevel widget, lower app to background
+ if (q->isWindow())
+ S60->wsSession().SetWindowGroupOrdinalPosition(S60->windowGroup().Identifier(), -1);
+ else
+ q->internalWinId()->DrawableWindow()->SetOrdinalPosition(-1);
+ }
if (!q->isWindow())
invalidateBuffer(q->rect());