src/gui/kernel/qapplication_s60.cpp
changeset 19 fcece45ef507
parent 18 2f34d5167611
child 22 79de32ba3296
equal deleted inserted replaced
18:2f34d5167611 19:fcece45ef507
    50 #include "qt_s60_p.h"
    50 #include "qt_s60_p.h"
    51 #include "private/qevent_p.h"
    51 #include "private/qevent_p.h"
    52 #include "qstring.h"
    52 #include "qstring.h"
    53 #include "qdebug.h"
    53 #include "qdebug.h"
    54 #include "qimage.h"
    54 #include "qimage.h"
       
    55 #include "qcombobox.h"
    55 #include "private/qkeymapper_p.h"
    56 #include "private/qkeymapper_p.h"
    56 #include "private/qfont_p.h"
    57 #include "private/qfont_p.h"
    57 #ifndef QT_NO_STYLE_S60
    58 #ifndef QT_NO_STYLE_S60
    58 #include "private/qs60style_p.h"
    59 #include "private/qs60style_p.h"
    59 #endif
    60 #endif
   595         */
   596         */
   596 
   597 
   597         TUint s60Keysym = QApplicationPrivate::resolveS60ScanCode(keyEvent.iScanCode,
   598         TUint s60Keysym = QApplicationPrivate::resolveS60ScanCode(keyEvent.iScanCode,
   598                 keyEvent.iCode);
   599                 keyEvent.iCode);
   599         int keyCode;
   600         int keyCode;
   600         if (s60Keysym >= 0x20 && s60Keysym < ENonCharacterKeyBase) {
   601         if (s60Keysym == EKeyNull){ //some key events have 0 in iCode, for them iScanCode should be used
       
   602             keyCode = qt_keymapper_private()->mapS60ScanCodesToQt(keyEvent.iScanCode);
       
   603         } else if (s60Keysym >= 0x20 && s60Keysym < ENonCharacterKeyBase) {
   601             // Normal characters keys.
   604             // Normal characters keys.
   602             keyCode = s60Keysym;
   605             keyCode = s60Keysym;
   603         } else {
   606         } else {
   604             // Special S60 keys.
   607             // Special S60 keys.
   605             keyCode = qt_keymapper_private()->mapS60KeyToQt(s60Keysym);
   608             keyCode = qt_keymapper_private()->mapS60KeyToQt(s60Keysym);
   962         QApplication::setActiveWindow(qwidget->window());
   965         QApplication::setActiveWindow(qwidget->window());
   963         qwidget->d_func()->setWindowIcon_sys(true);
   966         qwidget->d_func()->setWindowIcon_sys(true);
   964         qwidget->d_func()->setWindowTitle_sys(qwidget->windowTitle());
   967         qwidget->d_func()->setWindowTitle_sys(qwidget->windowTitle());
   965 #ifdef Q_WS_S60
   968 #ifdef Q_WS_S60
   966         // If widget is fullscreen/minimized, hide status pane and button container otherwise show them.
   969         // If widget is fullscreen/minimized, hide status pane and button container otherwise show them.
   967         CEikStatusPane* statusPane = S60->statusPane();
   970         CEikStatusPane *statusPane = S60->statusPane();
   968         CEikButtonGroupContainer* buttonGroup = S60->buttonGroupContainer();
   971         CEikButtonGroupContainer *buttonGroup = S60->buttonGroupContainer();
   969         TBool visible = !(qwidget->windowState() & (Qt::WindowFullScreen | Qt::WindowMinimized));
   972         TBool visible = !(qwidget->windowState() & (Qt::WindowFullScreen | Qt::WindowMinimized));
   970         if (statusPane)
   973         if (statusPane)
   971             statusPane->MakeVisible(visible);
   974             statusPane->MakeVisible(visible);
   972         if (buttonGroup)
   975         if (buttonGroup) {
   973             buttonGroup->MakeVisible(visible);
   976             // Visibility
       
   977             const TBool isFullscreen = qwidget->windowState() & Qt::WindowFullScreen;
       
   978             const TBool cbaVisibilityHint = qwidget->windowFlags() & Qt::WindowSoftkeysVisibleHint;
       
   979             buttonGroup->MakeVisible(visible || (isFullscreen && cbaVisibilityHint));
       
   980 
       
   981             // Responsiviness
       
   982             CEikCba *cba = static_cast<CEikCba *>( buttonGroup->ButtonGroup() ); // downcast from MEikButtonGroup
       
   983             TUint cbaFlags = cba->ButtonGroupFlags();
       
   984             if(qwidget->windowFlags() & Qt::WindowSoftkeysRespondHint)
       
   985                 cbaFlags |= EAknCBAFlagRespondWhenInvisible;
       
   986             else
       
   987                 cbaFlags &= ~EAknCBAFlagRespondWhenInvisible;
       
   988             cba->SetButtonGroupFlags(cbaFlags);
       
   989         }
   974 #endif
   990 #endif
   975     } else if (QApplication::activeWindow() == qwidget->window()) {
   991     } else if (QApplication::activeWindow() == qwidget->window()) {
   976         if (CCoeEnv::Static()->AppUi()->IsDisplayingMenuOrDialog()) {
   992         if (CCoeEnv::Static()->AppUi()->IsDisplayingMenuOrDialog()) {
   977             QWidget *fw = QApplication::focusWidget();
   993             QWidget *fw = QApplication::focusWidget();
   978             if (fw) {
   994             if (fw) {
   986         QApplication::setActiveWindow(0);
  1002         QApplication::setActiveWindow(0);
   987     }
  1003     }
   988     // else { We don't touch the active window unless we were explicitly activated or deactivated }
  1004     // else { We don't touch the active window unless we were explicitly activated or deactivated }
   989 }
  1005 }
   990 
  1006 
       
  1007 void QSymbianControl::handleClientAreaChange()
       
  1008 {
       
  1009     const bool cbaVisibilityHint = qwidget->windowFlags() & Qt::WindowSoftkeysVisibleHint;
       
  1010     if (qwidget->isFullScreen() && !cbaVisibilityHint) {
       
  1011         SetExtentToWholeScreen();
       
  1012     } else if (qwidget->isMaximized() || (qwidget->isFullScreen() && cbaVisibilityHint)) {
       
  1013         TRect r = static_cast<CEikAppUi*>(S60->appUi())->ClientRect();
       
  1014         SetExtent(r.iTl, r.Size());
       
  1015     } else if (!qwidget->isMinimized()) { // Normal geometry
       
  1016         if (!qwidget->testAttribute(Qt::WA_Resized)) {
       
  1017             qwidget->adjustSize();
       
  1018             qwidget->setAttribute(Qt::WA_Resized, false); //not a user resize
       
  1019         }
       
  1020         if (!qwidget->testAttribute(Qt::WA_Moved) && qwidget->windowType() != Qt::Dialog) {
       
  1021             TRect r = static_cast<CEikAppUi*>(S60->appUi())->ClientRect();
       
  1022             SetPosition(r.iTl);
       
  1023             qwidget->setAttribute(Qt::WA_Moved, false); // not really an explicit position
       
  1024         }
       
  1025     }
       
  1026 }
       
  1027 
   991 void QSymbianControl::HandleResourceChange(int resourceType)
  1028 void QSymbianControl::HandleResourceChange(int resourceType)
   992 {
  1029 {
   993     switch (resourceType) {
  1030     switch (resourceType) {
   994     case KInternalStatusPaneChange:
  1031     case KInternalStatusPaneChange:
   995         if (qwidget->isFullScreen()) {
  1032         handleClientAreaChange();
   996             SetExtentToWholeScreen();
       
   997         } else if (qwidget->isMaximized()) {
       
   998             TRect r = static_cast<CEikAppUi*>(S60->appUi())->ClientRect();
       
   999             SetExtent(r.iTl, r.Size());
       
  1000         }
       
  1001         if (IsFocused() && IsVisible()) {
  1033         if (IsFocused() && IsVisible()) {
  1002             qwidget->d_func()->setWindowIcon_sys(true);
  1034             qwidget->d_func()->setWindowIcon_sys(true);
  1003             qwidget->d_func()->setWindowTitle_sys(qwidget->windowTitle());
  1035             qwidget->d_func()->setWindowTitle_sys(qwidget->windowTitle());
  1004         }
  1036         }
  1005         break;
  1037         break;
  1007         // font change event
  1039         // font change event
  1008         break;
  1040         break;
  1009 #ifdef Q_WS_S60
  1041 #ifdef Q_WS_S60
  1010     case KEikDynamicLayoutVariantSwitch:
  1042     case KEikDynamicLayoutVariantSwitch:
  1011     {
  1043     {
  1012         if (qwidget->isFullScreen()) {
  1044         handleClientAreaChange();
  1013             SetExtentToWholeScreen();
       
  1014         } else if (qwidget->isMaximized()) {
       
  1015             TRect r = static_cast<CEikAppUi*>(S60->appUi())->ClientRect();
       
  1016             SetExtent(r.iTl, r.Size());
       
  1017         }
       
  1018         break;
  1045         break;
  1019     }
  1046     }
  1020 #endif
  1047 #endif
  1021     default:
  1048     default:
  1022         break;
  1049         break;
  1225         err = repository->Get(KAknAvkonTransparencyEnabled, value);
  1252         err = repository->Get(KAknAvkonTransparencyEnabled, value);
  1226         if(err == KErrNone) {
  1253         if(err == KErrNone) {
  1227             S60->avkonComponentsSupportTransparency = (value==1) ? true : false;
  1254             S60->avkonComponentsSupportTransparency = (value==1) ? true : false;
  1228         }
  1255         }
  1229     }
  1256     }
  1230 #endif    
  1257 #endif
  1231 
  1258 
  1232     if (touch) {
  1259     if (touch) {
  1233         QApplicationPrivate::navigationMode = Qt::NavigationModeNone;
  1260         QApplicationPrivate::navigationMode = Qt::NavigationModeNone;
  1234     } else {
  1261     } else {
  1235         QApplicationPrivate::navigationMode = Qt::NavigationModeKeypadDirectional;
  1262         QApplicationPrivate::navigationMode = Qt::NavigationModeKeypadDirectional;
  1380     app_do_modal = qt_modal_stack != 0;
  1407     app_do_modal = qt_modal_stack != 0;
  1381 }
  1408 }
  1382 
  1409 
  1383 void QApplicationPrivate::openPopup(QWidget *popup)
  1410 void QApplicationPrivate::openPopup(QWidget *popup)
  1384 {
  1411 {
       
  1412     if (popup && qobject_cast<QComboBox *>(popup->parentWidget()))
       
  1413         static_cast<QSymbianControl *>(popup->effectiveWinId())->FadeBehindPopup(ETrue);
       
  1414 
  1385     if (!QApplicationPrivate::popupWidgets)
  1415     if (!QApplicationPrivate::popupWidgets)
  1386         QApplicationPrivate::popupWidgets = new QWidgetList;
  1416         QApplicationPrivate::popupWidgets = new QWidgetList;
  1387     QApplicationPrivate::popupWidgets->append(popup);
  1417     QApplicationPrivate::popupWidgets->append(popup);
  1388 
       
  1389 
  1418 
  1390     // Cancel focus widget pointer capture and long tap timer
  1419     // Cancel focus widget pointer capture and long tap timer
  1391     if (QApplication::focusWidget()) {
  1420     if (QApplication::focusWidget()) {
  1392         static_cast<QSymbianControl*>(QApplication::focusWidget()->effectiveWinId())->CancelLongTapTimer();
  1421         static_cast<QSymbianControl*>(QApplication::focusWidget()->effectiveWinId())->CancelLongTapTimer();
  1393         QApplication::focusWidget()->effectiveWinId()->SetPointerCapture(false);
  1422         QApplication::focusWidget()->effectiveWinId()->SetPointerCapture(false);
  1423     }
  1452     }
  1424 }
  1453 }
  1425 
  1454 
  1426 void QApplicationPrivate::closePopup(QWidget *popup)
  1455 void QApplicationPrivate::closePopup(QWidget *popup)
  1427 {
  1456 {
       
  1457     if (popup && qobject_cast<QComboBox *>(popup->parentWidget()))
       
  1458         static_cast<QSymbianControl *>(popup->effectiveWinId())->FadeBehindPopup(EFalse);
       
  1459 
  1428     if (!QApplicationPrivate::popupWidgets)
  1460     if (!QApplicationPrivate::popupWidgets)
  1429         return;
  1461         return;
  1430     QApplicationPrivate::popupWidgets->removeAll(popup);
  1462     QApplicationPrivate::popupWidgets->removeAll(popup);
  1431 
  1463 
  1432     // Cancel pointer capture and long tap for this popup
  1464     // Cancel pointer capture and long tap for this popup
  1446                 QWidgetPrivate::keyboardGrabber->grabKeyboard();
  1478                 QWidgetPrivate::keyboardGrabber->grabKeyboard();
  1447 
  1479 
  1448         QWidget *fw = QApplicationPrivate::active_window ? QApplicationPrivate::active_window->focusWidget()
  1480         QWidget *fw = QApplicationPrivate::active_window ? QApplicationPrivate::active_window->focusWidget()
  1449               : q_func()->focusWidget();
  1481               : q_func()->focusWidget();
  1450           if (fw) {
  1482           if (fw) {
       
  1483               if(fw->window()->isModal()) // restore pointer capture for modal window
       
  1484                   fw->effectiveWinId()->SetPointerCapture(true);
       
  1485 
  1451               if (fw != q_func()->focusWidget()) {
  1486               if (fw != q_func()->focusWidget()) {
  1452                   fw->setFocus(Qt::PopupFocusReason);
  1487                   fw->setFocus(Qt::PopupFocusReason);
  1453               } else {
  1488               } else {
  1454                   QFocusEvent e(QEvent::FocusIn, Qt::PopupFocusReason);
  1489                   QFocusEvent e(QEvent::FocusIn, Qt::PopupFocusReason);
  1455                   q_func()->sendEvent(fw, &e);
  1490                   q_func()->sendEvent(fw, &e);