Ignore:
Timestamp:
Aug 28, 2009, 7:46:09 PM (16 years ago)
Author:
Dmitry A. Kuminov
Message:

gui: Implemented QKeyMapper (#33).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gui/kernel/qapplication_pm.cpp

    r134 r136  
    508508#if defined(QT_DEBUGMSGFLOW)
    509509        {
    510             QString str = qStrQMSG(qmsg);
     510            QDbgStr str = qStrQMSG(qmsg);
    511511            if (!str.isEmpty())
    512                 qDebug() << "*** [W]" << str.toUtf8().constData();
     512                qDebug() << "*** [W]" << str;
    513513        }
    514514#endif
     
    602602        } else {
    603603            switch(msg) {
     604
     605            case WM_CHAR: { // keyboard event
     606                QWidget *g = QWidget::keyboardGrabber();
     607                if (g)
     608                    widget = (QETWidget*)g;
     609                else if (QApplication::activePopupWidget())
     610                    widget = (QETWidget*)QApplication::activePopupWidget()->focusWidget()
     611                           ? (QETWidget*)QApplication::activePopupWidget()->focusWidget()
     612                           : (QETWidget*)QApplication::activePopupWidget();
     613                else if (qApp->focusWidget())
     614                    widget = (QETWidget*)QApplication::focusWidget();
     615                else if (widget->internalWinId() == WinQueryFocus(HWND_DESKTOP)) {
     616                    // We faked the message to go to exactly that widget.
     617                    widget = (QETWidget*)widget->window();
     618                }
     619                if (widget->isEnabled()) {
     620                    bool result =
     621#if !defined (QT_NO_SESSIONMANAGER)
     622                        sm_blockUserInput ? true :
     623#endif
     624                        qt_keymapper_private()->translateKeyEvent(widget, qmsg, g != 0);
     625                    if (result)
     626                        return (MRESULT)TRUE;
     627                }
     628                break;
     629            }
    604630
    605631            case WM_PAINT: { // paint event
     
    811837#if defined(QT_DEBUGMSGFLOW)
    812838        {
    813             QString str = qStrQMSG(qmsg);
     839            QDbgStr str = qStrQMSG(qmsg);
    814840            if (!str.isEmpty())
    815                 qDebug() << "*** [F]" << str.toUtf8().constData();
     841                qDebug() << "*** [F]" << str;
    816842        }
    817843#endif
     
    10331059 *****************************************************************************/
    10341060
    1035 // State holder for LWIN/RWIN and ALTGr keys
    1036 // (ALTGr is also necessary since OS/2 doesn't report ALTGr as KC_ALT)
    1037 static int qt_extraKeyState = 0;
    1038 
    10391061static int mouseButtonState()
    10401062{
     
    11221144            bst |= Qt::ControlModifier;
    11231145    }
    1124     if ((qt_extraKeyState & Qt::AltModifier))
     1146    if (qt_keymapper_private()->extraKeyState & Qt::AltModifier)
    11251147        bst |= Qt::AltModifier;
    1126     if (qt_extraKeyState & Qt::MetaModifier)
     1148    if (qt_keymapper_private()->extraKeyState & Qt::MetaModifier)
    11271149        bst |= Qt::MetaModifier;
    11281150
     
    15471569        state |= Qt::ShiftModifier;
    15481570    if (WinGetKeyState(HWND_DESKTOP, VK_ALT) & 0x8000 ||
    1549         (qt_extraKeyState & Qt::AltModifier))
     1571        (qt_keymapper_private()->extraKeyState & Qt::AltModifier))
    15501572        state |= Qt::AltModifier;
    15511573    if (WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x8000)
    15521574        state |= Qt::ControlModifier;
    1553     if (qt_extraKeyState & Qt::MetaModifier)
     1575    if (qt_keymapper_private()->extraKeyState & Qt::MetaModifier)
    15541576        state |= Qt::MetaModifier;
    15551577
     
    19091931    switch (qmsg.msg) {
    19101932
     1933    myCaseBegin(WM_CHAR)
     1934        USHORT fl = SHORT1FROMMP(qmsg.mp1);
     1935        UCHAR repeat = CHAR3FROMMP(qmsg.mp1);
     1936        UCHAR scan = CHAR4FROMMP(qmsg.mp1);
     1937        USHORT ch = SHORT1FROMMP(qmsg.mp2);
     1938        USHORT vk = SHORT2FROMMP(qmsg.mp2);
     1939        str += QString().
     1940            sprintf(" rep %02d scan %02X ch %04X (%ls) vk %04X",
     1941                    repeat, scan, ch, (ch > 32 && ch < 254) ?
     1942                    QString::fromLocal8Bit((char *)&ch, 1).utf16() :
     1943                    QString(QChar(' ')).utf16(), vk);
     1944        QString flstr;
     1945        myDefFlagEx(fl, KC_CHAR, flstr, "CHAR");
     1946        myDefFlagEx(fl, KC_VIRTUALKEY, flstr, "VIRT");
     1947        myDefFlagEx(fl, KC_SCANCODE, flstr, "SCAN");
     1948        myDefFlagEx(fl, KC_SHIFT, flstr, "SHIFT");
     1949        myDefFlagEx(fl, KC_CTRL, flstr, "CTRL");
     1950        myDefFlagEx(fl, KC_ALT, flstr, "ALT");
     1951        myDefFlagEx(fl, KC_KEYUP, flstr, "UP");
     1952        myDefFlagEx(fl, KC_PREVDOWN, flstr, "PREVDWN");
     1953        myDefFlagEx(fl, KC_LONEKEY, flstr, "LONE");
     1954        myDefFlagEx(fl, KC_DEADKEY, flstr, "DEAD");
     1955        myDefFlagEx(fl, KC_COMPOSITE, flstr, "COMP");
     1956        myDefFlagEx(fl, KC_INVALIDCOMP, flstr, "INVCMP");
     1957        myDefFlagEx(fl, KC_TOGGLE, flstr, "TGGL");
     1958        myDefFlagEx(fl, KC_INVALIDCHAR, flstr, "INVCHR");
     1959        str += QString().sprintf(" KC(%04X,", fl) + flstr + QCStr(")");
     1960        break;
     1961    myCaseEnd()
     1962
    19111963    myCaseBegin(WM_PAINT)
    19121964        break;
Note: See TracChangeset for help on using the changeset viewer.