src/gui/widgets/qmenubar.cpp
changeset 3 41300fa6a67c
parent 0 1918ee327afb
child 4 3b1da2848fc7
child 7 f7bc934e204c
child 18 2f34d5167611
--- a/src/gui/widgets/qmenubar.cpp	Tue Jan 26 12:42:25 2010 +0200
+++ b/src/gui/widgets/qmenubar.cpp	Tue Feb 02 00:43:10 2010 +0200
@@ -332,34 +332,31 @@
         QPoint pos(q->mapToGlobal(QPoint(adjustedActionRect.left(), adjustedActionRect.bottom() + 1)));
         QSize popup_size = activeMenu->sizeHint();
 
-        QRect screenRect = QApplication::desktop()->screenGeometry(pos);
+        //we put the popup menu on the screen containing the bottom-center of the action rect
+        QRect screenRect = QApplication::desktop()->screenGeometry(pos + QPoint(adjustedActionRect.width() / 2, 0));
+        pos = QPoint(qMax(pos.x(), screenRect.x()), qMax(pos.y(), screenRect.y()));
 
         const bool fitUp = (q->mapToGlobal(adjustedActionRect.topLeft()).y() >= popup_size.height());
         const bool fitDown = (pos.y() + popup_size.height() <= screenRect.bottom());
+        const bool rtl = q->isRightToLeft();
         const int actionWidth = adjustedActionRect.width();
 
         if (!fitUp && !fitDown) { //we should shift the menu
-            bool shouldShiftToRight = !q->isRightToLeft();
-            if (q->isRightToLeft() && popup_size.width() > pos.x())
+            bool shouldShiftToRight = !rtl;
+            if (rtl && popup_size.width() > pos.x())
                 shouldShiftToRight = true;
             else if (actionWidth + popup_size.width() + pos.x() > screenRect.right())
                 shouldShiftToRight = false;
 
-            if (shouldShiftToRight)
-                pos.rx() += actionWidth;
-            else
-                pos.rx() -= popup_size.width();
-        } else if (q->isRightToLeft()) {
-            pos.setX(pos.x()-(popup_size.width() - actionWidth));
-        }
-
-        if(pos.x() < screenRect.x()) {
-            pos.setX(screenRect.x());
-        } else {
-            const int off = pos.x()+popup_size.width() - screenRect.right();
-            if(off > 0)
-                pos.setX(qMax(screenRect.x(), pos.x()-off));
-
+            if (shouldShiftToRight) {
+                pos.rx() += actionWidth + (rtl ? popup_size.width() : 0);
+            } else {
+                //shift to left
+                if (!rtl)
+                    pos.rx() -= popup_size.width();
+            }
+        } else if (rtl) {
+            pos.rx() += actionWidth;
         }
 
         if(!defaultPopDown || (fitUp && !fitDown))
@@ -739,6 +736,9 @@
         if(wce_menubar)
             q->hide();
     }
+    else {
+        QApplication::setAttribute(Qt::AA_DontUseNativeMenuBar, true);
+    }
 #endif
 #ifdef Q_WS_S60
     symbianCreateMenuBar(q->parentWidget());
@@ -1489,7 +1489,8 @@
     break;
     case QEvent::ShortcutOverride: {
         QKeyEvent *kev = static_cast<QKeyEvent*>(e);
-        if (kev->key() == Qt::Key_Escape) {
+        //we only filter out escape if there is a current action
+        if (kev->key() == Qt::Key_Escape && d->currentAction) {
             e->accept();
             return true;
         }
@@ -1937,7 +1938,7 @@
     if (qt_wince_is_mobile())
         if (d->defaultAction) {
             disconnect(d->defaultAction, SIGNAL(changed()), this, SLOT(_q_updateDefaultAction()));
-            disconnect(d->defaultAction, SIGNAL(destroyed ()), this, SLOT(_q_updateDefaultAction()));
+            disconnect(d->defaultAction, SIGNAL(destroyed()), this, SLOT(_q_updateDefaultAction()));
         }
 #endif
     d->defaultAction = act;