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); |