📄 qkeyboard_qws.cpp
字号:
{ Qt::Key_6, '6' , '6' , 0xffff }, { Qt::Key_Plus, '+' , '+' , 0xffff }, { Qt::Key_1, '1' , '1' , 0xffff }, { Qt::Key_2, '2' , '2' , 0xffff }, // 80 { Qt::Key_3, '3' , '3' , 0xffff }, { Qt::Key_0, '0' , '0' , 0xffff }, { Qt::Key_Period, '.' , '.' , 0xffff }, { Qt::Key_unknown, 0xffff , 0xffff , 0xffff }, { Qt::Key_unknown, 0xffff , 0xffff , 0xffff }, { Qt::Key_unknown, 0xffff , 0xffff , 0xffff }, { Qt::Key_F11, 0xffff , 0xffff , 0xffff }, { Qt::Key_F12, 0xffff , 0xffff , 0xffff }, { Qt::Key_unknown, 0xffff , 0xffff , 0xffff }, { Qt::Key_unknown, 0xffff , 0xffff , 0xffff }, // 90 { 0, 0xffff , 0xffff , 0xffff }};#endifstatic const int keyMSize = sizeof(keyM)/sizeof(QWSServer::KeyMap)-1;#if !defined(_OS_QNX6_)/*! \class QWSKeyboardHandler qkeyboard_qws.h \brief Keyboard driver/handler for Qt/Embedded The keyboard driver/handler handles events from system devices and generates key events. A QWSKeyboardHandler will usually open some system device in its constructor, create a QSocketNotifier on that opened device and when it receives data, it will call processKeyEvent() to send the event to Qt/Embedded for relaying to clients.*//*! Subclasses call this to send a key event. The server may additionally filter it before sending it on to applications. <ul> <li>\a unicode is the Unicode value for the key, or 0xFFFF is none is appropriate. <li>\a keycode is the Qt keycode for the key (see Qt::Key). for the list of codes). <li>\a modifiers is the set of modifier keys (see Qt::Modifier). <li>\a isPress says whether this is a press or a release. <li>\a autoRepeat says whether this event was generated by an auto-repeat mechanism, or an actual key press. </ul>*/void QWSKeyboardHandler::processKeyEvent(int unicode, int keycode, int modifiers, bool isPress, bool autoRepeat){ qwsServer->processKeyEvent( unicode, keycode, modifiers, isPress, autoRepeat );}class QWSPC101KeyboardHandler : public QWSKeyboardHandler{ Q_OBJECTpublic: QWSPC101KeyboardHandler(); virtual ~QWSPC101KeyboardHandler(); void doKey(uchar scancode);private slots: void autoRepeat();private: bool shift; bool alt; bool ctrl;#if defined(QT_QWS_CUSTOM) bool meta; bool fn; bool numLock;#endif bool caps; bool extended; int modifiers; int prevuni; int prevkey;#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) // Could be used by other subclasses QTimer* repeater; int repeatdelay, repeatperiod;#endif};void QWSPC101KeyboardHandler::autoRepeat(){#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) processKeyEvent( prevuni, prevkey, modifiers, FALSE, TRUE ); processKeyEvent( prevuni, prevkey, modifiers, TRUE, TRUE ); repeater->start(repeatperiod);#endif}class QWSTtyKeyboardHandler : public QWSPC101KeyboardHandler{ Q_OBJECTpublic: QWSTtyKeyboardHandler(); virtual ~QWSTtyKeyboardHandler();private slots: void readKeyboardData();private: struct termios origTermData;};class QWSUsbKeyboardHandler : public QWSPC101KeyboardHandler{ Q_OBJECTpublic: QWSUsbKeyboardHandler(); virtual ~QWSUsbKeyboardHandler();private slots: void readKeyboardData();private: int fd;};class QWSVr41xxButtonsHandler : public QWSKeyboardHandler{ Q_OBJECTpublic: QWSVr41xxButtonsHandler(); virtual ~QWSVr41xxButtonsHandler(); bool isOpen() { return buttonFD > 0; }private slots: void readKeyboardData();private: QString terminalName; int buttonFD; int kbdIdx; int kbdBufferLen; unsigned char *kbdBuffer; QSocketNotifier *notifier;};class QWSVFbKeyboardHandler : public QWSKeyboardHandler{ Q_OBJECTpublic: QWSVFbKeyboardHandler(); virtual ~QWSVFbKeyboardHandler(); bool isOpen() { return fd > 0; }private slots: void readKeyboardData();private: QString terminalName; int fd; int kbdIdx; int kbdBufferLen; unsigned char *kbdBuffer; QSocketNotifier *notifier;};static void vtSwitchHandler(int /*sig*/){#if !defined(_OS_FREEBSD_) if (vtActive) { qwsServer->enablePainting(false); qt_screen->save(); if (ioctl(kbdFD, VT_RELDISP, 1) == 0) { vtActive = false; qwsServer->closeMouse(); } else { qwsServer->enablePainting(true); } usleep(200000); } else { if (ioctl(kbdFD, VT_RELDISP, VT_ACKACQ) == 0) { qwsServer->enablePainting(true); vtActive = true; qt_screen->restore(); qwsServer->openMouse(); qwsServer->refresh(); } } signal(VTSWITCHSIG, vtSwitchHandler);#endif}//// PC-101 type keyboards//QWSPC101KeyboardHandler::QWSPC101KeyboardHandler(){ shift = false; alt = false; ctrl = false; extended = false; prevuni = 0; prevkey = 0; caps = FALSE;#if defined(QT_QWS_CUSTOM) meta = FALSE; fn = FALSE; numLock = FALSE; sharp_kbdctl_modifstat st; int dev = ::open("/dev/sharp_kbdctl", O_RDWR); if( dev >= 0 ) { memset(&st, 0, sizeof(st)); st.which = 3; int ret = ioctl(dev, SHARP_KBDCTL_GETMODIFSTAT, (char*)&st); if( !ret ) numLock = (bool)st.stat; ::close(dev); }#endif#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) repeatdelay = 400; repeatperiod = 80; repeater = new QTimer(this); connect(repeater, SIGNAL(timeout()), this, SLOT(autoRepeat()));#endif}QWSPC101KeyboardHandler::~QWSPC101KeyboardHandler(){}void QWSPC101KeyboardHandler::doKey(uchar code){ int keyCode = Qt::Key_unknown; bool release = false; int keypad = 0;#if !defined(QT_QWS_CUSTOM) if (code == 224) { // extended extended = true; return; }#endif if (code & 0x80) { release = true; code &= 0x7f; } if (extended) { switch (code) { case 72: keyCode = Qt::Key_Up; break; case 75: keyCode = Qt::Key_Left; break; case 77: keyCode = Qt::Key_Right; break; case 80: keyCode = Qt::Key_Down; break; case 82: keyCode = Qt::Key_Insert; break; case 71: keyCode = Qt::Key_Home; break; case 73: keyCode = Qt::Key_Prior; break; case 83: keyCode = Qt::Key_Delete; break; case 79: keyCode = Qt::Key_End; break; case 81: keyCode = Qt::Key_Next; break; case 28: keyCode = Qt::Key_Enter; break; case 53: keyCode = Qt::Key_Slash; break; } } else {#if defined(QT_QWS_CUSTOM) if ( fn && !meta && (code >= 0x42 && code <= 0x52) ) { ushort unicode=0; int scan=0; if ( code == 0x42 ) { unicode='X'-'@'; scan=Key_X; } // Cut else if ( code == 0x43 ) { unicode='C'-'@'; scan=Key_C; } // Copy else if ( code == 0x44 ) { unicode='V'-'@'; scan=Key_V; } // Paste else if ( code == 0x52 ) { unicode='Z'-'@'; scan=Key_Z; } // Undo if ( scan ) { processKeyEvent( unicode, scan, ControlButton, !release, FALSE ); return; } }#endif if (code < keyMSize) { keyCode = QWSServer::keyMap()[code].key_code; }#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) // need autorepeat implemented here? bool repeatable = TRUE;#if defined(QT_QWS_IPAQ) || defined(QT_QWS_EBX) && !defined(QT_QWS_CUSTOM) switch (code) { case 0x7a: case 0x7b: case 0x7c: case 0x7d: keyCode = code - 0x7a + Key_F9; repeatable = FALSE; break; case 0x79: keyCode = Key_SysReq; repeatable = FALSE; break; case 0x78: keyCode = Key_Escape; repeatable = FALSE; break; case 0x60: keyCode = Key_Return; break; case 0x67: keyCode = Key_Right; break; case 0x69: keyCode = Key_Up; break; case 0x6a: keyCode = Key_Down; break; case 0x6c: keyCode = Key_Left; break; }#endif#if defined(QT_QWS_CUSTOM) if ( release && ( keyCode == Key_F34 || keyCode == Key_F35 ) ) return; // no release for power and light keys if ( keyCode >= Key_F1 && keyCode <= Key_F35 || keyCode == Key_Escape || keyCode == Key_Home || keyCode == Key_Shift || keyCode == Key_Meta ) repeatable = FALSE;#endif if ( qt_screen->isTransformed() && keyCode >= Qt::Key_Left && keyCode <= Qt::Key_Down ) { keyCode = xform_dirkey(keyCode); } if ( repeatable && !release ) repeater->start(repeatdelay,TRUE); else repeater->stop();#endif } /* Keypad consists of extended keys 53 and 28, and non-extended keys 55 and 71 through 83. */ if ( extended ? (code == 53 || code == 28) : (code == 55 || ( code >= 71 && code <= 83 )) ) keypad = Qt::Keypad; // Virtual console switching int term = 0; if (ctrl && alt && keyCode >= Qt::Key_F1 && keyCode <= Qt::Key_F10) term = keyCode - Qt::Key_F1 + 1; else if (ctrl && alt && keyCode == Qt::Key_Left) term = QMAX(vtQws - 1, 1); else if (ctrl && alt && keyCode == Qt::Key_Right) term = QMIN(vtQws + 1, 10); if (term && !release) { ctrl = false; alt = false;#if !defined(_OS_FREEBSD_) ioctl(kbdFD, VT_ACTIVATE, term);#endif return; }#if defined(QT_QWS_CUSTOM) // Ctrl-Alt-Delete exits qws if (ctrl && alt && keyCode == Qt::Key_Delete) { qApp->quit(); }#else // Ctrl-Alt-Backspace exits qws if (ctrl && alt && keyCode == Qt::Key_Backspace) { qApp->quit(); }#endif#if defined(QT_QWS_CUSTOM) if (keyCode == Qt::Key_F22) { /* Fn key */ fn = !release; } else if ( keyCode == Key_NumLock ) { if ( release ) numLock = !numLock; } else#endif if (keyCode == Qt::Key_Alt) { alt = !release; } else if (keyCode == Qt::Key_Control) { ctrl = !release; } else if (keyCode == Qt::Key_Shift) { shift = !release;#if defined(QT_QWS_CUSTOM) } else if (keyCode == Qt::Key_Meta) { meta = !release;#endif } else if ( keyCode == Qt::Key_CapsLock && release ) { caps = !caps; } if (keyCode != Qt::Key_unknown) { bool bAlt = alt; bool bCtrl = ctrl; bool bShift = shift; int unicode = 0; if (code < keyMSize) { if (!extended) { bool bCaps = caps ^ shift;#if defined(QT_QWS_CUSTOM) if (fn) { if ( shift ) { bCaps = bShift = FALSE; bCtrl = TRUE; } if ( meta ) { bCaps = bShift = TRUE; bAlt = TRUE; } } else if ( meta ) { bCaps = bShift = TRUE; } if ( code > 40 && caps ) { // fn-keys should only react to shift, not caps bCaps = bShift = shift; } if ( numLock ) { if ( keyCode != Key_Space && keyCode != Key_Tab ) bCaps = bShift = FALSE; } if ( keyCode == Key_Delete && (bAlt || bCtrl) ) { keyCode = Key_BraceLeft; unicode = '['; bCaps = bShift = bAlt = bCtrl = FALSE; } else if (keyCode == Qt::Key_F31 && bCtrl) { keyCode = Key_QuoteLeft; unicode = '`'; } else#endif if (bCtrl) unicode = QWSServer::keyMap()[code].ctrl_unicode ? QWSServer::keyMap()[code].ctrl_unicode : 0xffff; else if (bCaps) unicode = QWSServer::keyMap()[code].shift_unicode ? QWSServer::keyMap()[code].shift_unicode : 0xffff; else unicode = QWSServer::keyMap()[code].unicode ? QWSServer::keyMap()[code].unicode : 0xffff; } else { if ( code == 53 ) unicode = '/'; } } modifiers = 0; if ( bAlt ) modifiers |= AltButton; if ( bCtrl ) modifiers |= ControlButton; if ( bShift ) modifiers |= ShiftButton; if ( keypad ) modifiers |= Keypad; // looks wrong -- WWA bool repeat = FALSE; if (prevuni == unicode && prevkey == keyCode && !release)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -