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 | 79 |
1 files changed, 34 insertions, 45 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 @@ -208,9 +208,9 @@ void KRFBDecoder::gotDesktopName() assert( currentState == AwaitingDesktopName ); qWarning( "Got desktop name" ); - disconnect( con, SIGNAL( gotEnoughData() ), + disconnect( con, SIGNAL( gotEnoughData() ), this, SLOT( gotDesktopName() ) ); char *buf = new char[ info->nameLength + 1 ]; CHECK_PTR( buf ); @@ -262,9 +262,9 @@ void KRFBDecoder::decidePixelFormat() qWarning( "Screen depth=%d, server depth=%d, best depth=%d, " \ "eight bit %d, chosenDepth=%d", screenDepth, info->depth, - bestDepth, + bestDepth, con->options()->colors256, chosenDepth ); format->depth = chosenDepth; @@ -372,9 +372,9 @@ void KRFBDecoder::gotUpdateHeader() assert( currentState == AwaitingUpdate ); // qWarning( "Got update header" ); - disconnect( con, SIGNAL( gotEnoughData() ), + disconnect( con, SIGNAL( gotEnoughData() ), this, SLOT( gotUpdateHeader() ) ); CARD8 msgType; con->read( &msgType, 1 ); @@ -396,9 +396,9 @@ void KRFBDecoder::gotUpdateHeader() "message." ).arg( msg ); currentState = Error; emit error( protocolError ); } - return; + return; } CARD8 padding; con->read( &padding, 1 ); @@ -419,9 +419,9 @@ void KRFBDecoder::gotRectHeader() assert( currentState == AwaitingRectHeader ); // qWarning( "Got rect header" ); - disconnect( con, SIGNAL( gotEnoughData() ), + disconnect( con, SIGNAL( gotEnoughData() ), this, SLOT( gotRectHeader() ) ); con->read( &x, 2 ); x = Swap16IfLE( x ); @@ -435,9 +435,9 @@ void KRFBDecoder::gotRectHeader() con->read( &encoding, 4 ); // CARD32 encodingLocal = Swap32IfLE( encoding ); - // qWarning( "Rect: x=%d, y= %d, w=%d, h=%d, encoding=%ld", + // qWarning( "Rect: x=%d, y= %d, w=%d, h=%d, encoding=%ld", // x, y, w, h, encodingLocal ); // // Each encoding needs to be handled differently. Some require @@ -519,17 +519,17 @@ void KRFBDecoder::getRawRectChunk( int lines ) void KRFBDecoder::gotRawRectChunk() { assert( currentState == AwaitingRawRectChunk ); - disconnect( con, SIGNAL( gotEnoughData() ), + disconnect( con, SIGNAL( gotEnoughData() ), this, SLOT( gotRawRectChunk() ) ); // qWarning( "Got raw rect chunk" ); // // Read the rect data and copy it to the buffer. // - + // TODO: Replace this! int count = lines * w * format->bpp / 8; char *hack = new char[ count ]; con->read( hack, count ); @@ -719,9 +719,9 @@ void KRFBDecoder::gotServerCutText() 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 + * from within keypebble's mass of signals and slots qWarning( "Server cut: %s", cutbuf ); QString cutText( cutbuf ); // DANGER!! qApp->clipboard()->setText( cutText ); @@ -797,45 +797,34 @@ void KRFBDecoder::sendKeyReleaseEvent( QKeyEvent *event ) } } + + +// +// 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 ) - return keyMap[i].keysym; - i++; - } + // + // 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; + } + } + } - 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(); } - |