author | zecke <zecke> | 2004-03-02 21:04:44 (UTC) |
---|---|---|
committer | zecke <zecke> | 2004-03-02 21:04:44 (UTC) |
commit | dcf196abd97485cd9634d6ac135028a605c54fb5 (patch) (side-by-side diff) | |
tree | a424872b45f52418e4c84148c7ed4cfcc0b1a681 | |
parent | 0a67659dce57ac1475841838369e924f2441e991 (diff) | |
download | opie-dcf196abd97485cd9634d6ac135028a605c54fb5.zip opie-dcf196abd97485cd9634d6ac135028a605c54fb5.tar.gz opie-dcf196abd97485cd9634d6ac135028a605c54fb5.tar.bz2 |
Fix key handling bug 1268
-rw-r--r-- | noncore/comm/keypebble/krfbdecoder.cpp | 59 |
1 files changed, 24 insertions, 35 deletions
diff --git a/noncore/comm/keypebble/krfbdecoder.cpp b/noncore/comm/keypebble/krfbdecoder.cpp index 2c9ad71..db95154 100644 --- a/noncore/comm/keypebble/krfbdecoder.cpp +++ b/noncore/comm/keypebble/krfbdecoder.cpp @@ -609,233 +609,222 @@ void KRFBDecoder::handleRRERect() void KRFBDecoder::handleCoRRERect() { qWarning( "CoRRE not implemented" ); } void KRFBDecoder::handleHexTileRect() { qWarning( "HexTile not implemented" ); } void KRFBDecoder::sendMouseEvent( QMouseEvent *e ) { // Deal with the buttons if ( e->type() != QEvent::MouseMove ) { buttonMask = 0; if ( e->type() == QEvent::MouseButtonPress ) { if ( e->button() & LeftButton ) buttonMask |= 0x01; if ( e->button() & MidButton ) buttonMask |= 0x04; if ( e->button() & RightButton ) buttonMask |= 0x02; } else if ( e->type() == QEvent::MouseButtonRelease ) { if ( e->button() & LeftButton ) buttonMask &= 0x06; if ( e->button() & MidButton ) buttonMask |= 0x03; if ( e->button() & RightButton ) buttonMask |= 0x05; } } // HACK: Scaling CARD16 x = Swap16IfLE( e->x() * con->options()->scaleFactor ); CARD16 y = Swap16IfLE( e->y() * con->options()->scaleFactor ); con->write( &PointerEventId, 1 ); con->write( &buttonMask, 1 ); con->write( &x, 2 ); con->write( &y, 2 ); } void KRFBDecoder::sendCutEvent( const QString &unicode ) { // // Warning: There is a bug in the RFB protocol because there is no way to find // out the codepage in use on the remote machine. This could be fixed by requiring // the remote server to use utf8 etc. but for now we have to assume they're the // same. I've reported this problem to the ORL guys, but they apparantly have no // immediate plans to fix the issue. :-( (rich) // CARD8 padding[3]; QCString text = unicode.local8Bit(); CARD32 length = text.length(); length = Swap32IfLE( length ); con->write( &ClientCutTextId, 1 ); con->write( &padding, 3 ); con->write( &length, 4 ); con->write( text.data(), length ); } void KRFBDecoder::gotServerCut() { qWarning( "Got server cut" ); currentState = AwaitingServerCutLength; connect( con, SIGNAL( gotEnoughData() ), SLOT( gotServerCutLength() ) ); con->waitForData( ServerCutLenLength ); } void KRFBDecoder::gotServerCutLength() { assert( currentState = AwaitingServerCutLength ); disconnect( con, SIGNAL( gotEnoughData() ), this, SLOT( gotServerCutLength() ) ); CARD8 padding[3]; con->read( padding, 3 ); con->read( &serverCutTextLen, 4 ); serverCutTextLen = Swap32IfLE( serverCutTextLen ); currentState = AwaitingServerCutText; connect( con, SIGNAL( gotEnoughData() ), SLOT( gotServerCutText() ) ); con->waitForData( serverCutTextLen ); } void KRFBDecoder::gotServerCutText() { assert( currentState = AwaitingServerCutText ); disconnect( con, SIGNAL( gotEnoughData() ), this, SLOT( gotServerCutText() ) ); // // Warning: There is a bug in the RFB protocol because there is no way to find // out the codepage in use on the remote machine. This could be fixed by requiring // the remote server to use utf8 etc. but for now we have to assume they're the // same. I've reported this problem to the ORL guys, but they apparantly have no // immediate plans to fix the issue. :-( (rich) // char *cutbuf = new char[ serverCutTextLen + 1 ]; CHECK_PTR( cutbuf ); con->read( cutbuf, serverCutTextLen ); cutbuf[ serverCutTextLen ] = '\0'; /* For some reason QApplication::clipboard()->setText() segfaults when called * from within keypebble's mass of signals and slots qWarning( "Server cut: %s", cutbuf ); QString cutText( cutbuf ); // DANGER!! qApp->clipboard()->setText( cutText ); */ delete cutbuf; // Now wait for the update (again) if ( oldState == AwaitingUpdate ) { currentState = AwaitingUpdate; connect( con, SIGNAL( gotEnoughData() ), SLOT( gotUpdateHeader() ) ); con->waitForData( UpdateHeaderLength ); } else if ( oldState == Idle ) { currentState = Idle; } else { qWarning( "Async handled in weird state" ); currentState = oldState; }; } void KRFBDecoder::gotBell() { qWarning( "Got server bell" ); buf->soundBell(); // Now wait for the update (again) if ( oldState == AwaitingUpdate ) { currentState = AwaitingUpdate; connect( con, SIGNAL( gotEnoughData() ), SLOT( gotUpdateHeader() ) ); con->waitForData( UpdateHeaderLength ); } else if ( oldState == Idle ) { currentState = Idle; } else { qWarning( "Async handled in weird state" ); currentState = oldState; }; } void KRFBDecoder::sendKeyPressEvent( QKeyEvent *event ) { int key; key = toKeySym( event ); if ( key ) { key = Swap32IfLE( key ); CARD8 mask = true; CARD16 padding = 0; con->write( &KeyEventId, 1 ); con->write( &mask, 1 ); con->write( &padding, 2 ); con->write( &key, 4 ); } } void KRFBDecoder::sendKeyReleaseEvent( QKeyEvent *event ) { int key; key = toKeySym( event ); if ( key ) { key = Swap32IfLE( key ); CARD8 mask = false; CARD16 padding = 0; con->write( &KeyEventId, 1 ); con->write( &mask, 1 ); con->write( &padding, 2 ); con->write( &key, 4 ); } } + + +// +// The RFB protocol spec says 'For most ordinary keys, the 'keysym' +// is the same as the corresponding ASCII value.', but doesn't +// elaborate what the most ordinary keys are. The spec also lists +// a set (possibly subset, it's unspecified) of mappings for +// "other common keys" (backspace, tab, return, escape, etc). +// int KRFBDecoder::toKeySym( QKeyEvent *k ) { - int ke = 0; - - ke = k->ascii(); - // Markus: Crappy hack. I dont know why lower case letters are - // not defined in qkeydefs.h. The key() for e.g. 'l' == 'L'. - // This sucks. :-( - - if ( (ke == 'a') || (ke == 'b') || (ke == 'c') || (ke == 'd') - || (ke == 'e') || (ke == 'f') || (ke == 'g') || (ke == 'h') - || (ke == 'i') || (ke == 'j') || (ke == 'k') || (ke == 'l') - || (ke == 'm') || (ke == 'n') || (ke == 'o') || (ke == 'p') - || (ke == 'q') || (ke == 'r') || (ke == 's') || (ke == 't') - || (ke == 'u') || (ke == 'v') ||( ke == 'w') || (ke == 'x') - || (ke == 'y') || (ke == 'z') ) { - ke = k->key(); - ke = ke + 0x20; - return ke; - } - - // qkeydefs = xkeydefs! :-) - if ( ( k->key() >= 0x0a0 ) && k->key() <= 0x0ff ) - return k->key(); - - if ( ( k->key() >= 0x20 ) && ( k->key() <= 0x7e ) ) - return k->key(); - - // qkeydefs != xkeydefs! :-( - // This is gonna suck :-( - - int i = 0; - while ( keyMap[i].keycode ) { - if ( k->key() == keyMap[i].keycode ) + + // + // Try and map these "other common keys" first. + // + if ((k->key() >= Qt::Key_Escape) && (k->key() <= Qt::Key_F12)) { + for(int i = 0; keyMap[i].keycode != 0; i++) { + if (k->key() == keyMap[i].keycode) { return keyMap[i].keysym; - i++; } - - return 0; + } } + // + // If these keys aren't matched, return the ascii code and let the + // server figure it out. We don't return k->key(), as the data in + // key differs between input methods, and we don't want special cases. + // + return k->ascii(); +} |