⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qkeyboard_qws.cpp

📁 qte2.3.2版本,但是里面没有configure文件.需要重新添加
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    {	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 + -