summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/comm/keypebble/krfbdecoder.cpp79
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
@@ -206,13 +206,13 @@ void KRFBDecoder::gotDesktopName()
206{ 206{
207 assert( info ); 207 assert( info );
208 assert( currentState == AwaitingDesktopName ); 208 assert( currentState == AwaitingDesktopName );
209 209
210 qWarning( "Got desktop name" ); 210 qWarning( "Got desktop name" );
211 211
212 disconnect( con, SIGNAL( gotEnoughData() ), 212 disconnect( con, SIGNAL( gotEnoughData() ),
213 this, SLOT( gotDesktopName() ) ); 213 this, SLOT( gotDesktopName() ) );
214 214
215 char *buf = new char[ info->nameLength + 1 ]; 215 char *buf = new char[ info->nameLength + 1 ];
216 CHECK_PTR( buf ); 216 CHECK_PTR( buf );
217 217
218 con->read( buf, info->nameLength ); 218 con->read( buf, info->nameLength );
@@ -260,13 +260,13 @@ void KRFBDecoder::decidePixelFormat()
260 chosenDepth = bestDepth; 260 chosenDepth = bestDepth;
261 261
262 qWarning( "Screen depth=%d, server depth=%d, best depth=%d, " \ 262 qWarning( "Screen depth=%d, server depth=%d, best depth=%d, " \
263 "eight bit %d, chosenDepth=%d", 263 "eight bit %d, chosenDepth=%d",
264 screenDepth, 264 screenDepth,
265 info->depth, 265 info->depth,
266 bestDepth, 266 bestDepth,
267 con->options()->colors256, chosenDepth ); 267 con->options()->colors256, chosenDepth );
268 268
269 format->depth = chosenDepth; 269 format->depth = chosenDepth;
270 270
271 // If we're using the servers native depth 271 // If we're using the servers native depth
272 if ( chosenDepth == info->depth ) { 272 if ( chosenDepth == info->depth ) {
@@ -370,13 +370,13 @@ void KRFBDecoder::sendUpdateRequest( bool incremental )
370void KRFBDecoder::gotUpdateHeader() 370void KRFBDecoder::gotUpdateHeader()
371{ 371{
372 assert( currentState == AwaitingUpdate ); 372 assert( currentState == AwaitingUpdate );
373 373
374 // qWarning( "Got update header" ); 374 // qWarning( "Got update header" );
375 375
376 disconnect( con, SIGNAL( gotEnoughData() ), 376 disconnect( con, SIGNAL( gotEnoughData() ),
377 this, SLOT( gotUpdateHeader() ) ); 377 this, SLOT( gotUpdateHeader() ) );
378 378
379 CARD8 msgType; 379 CARD8 msgType;
380 con->read( &msgType, 1 ); 380 con->read( &msgType, 1 );
381 381
382 if ( msgType != UpdateId ) { 382 if ( msgType != UpdateId ) {
@@ -394,13 +394,13 @@ void KRFBDecoder::gotUpdateHeader()
394 QString protocolError = tr( "Protocol Error: Message Id %1 was " 394 QString protocolError = tr( "Protocol Error: Message Id %1 was "
395 "found when expecting an update " 395 "found when expecting an update "
396 "message." ).arg( msg ); 396 "message." ).arg( msg );
397 currentState = Error; 397 currentState = Error;
398 emit error( protocolError ); 398 emit error( protocolError );
399 } 399 }
400 return; 400 return;
401 } 401 }
402 402
403 CARD8 padding; 403 CARD8 padding;
404 con->read( &padding, 1 ); 404 con->read( &padding, 1 );
405 405
406 con->read( &noRects, 2 ); 406 con->read( &noRects, 2 );
@@ -417,13 +417,13 @@ void KRFBDecoder::gotUpdateHeader()
417void KRFBDecoder::gotRectHeader() 417void KRFBDecoder::gotRectHeader()
418{ 418{
419 assert( currentState == AwaitingRectHeader ); 419 assert( currentState == AwaitingRectHeader );
420 420
421 // qWarning( "Got rect header" ); 421 // qWarning( "Got rect header" );
422 422
423 disconnect( con, SIGNAL( gotEnoughData() ), 423 disconnect( con, SIGNAL( gotEnoughData() ),
424 this, SLOT( gotRectHeader() ) ); 424 this, SLOT( gotRectHeader() ) );
425 425
426 con->read( &x, 2 ); 426 con->read( &x, 2 );
427 x = Swap16IfLE( x ); 427 x = Swap16IfLE( x );
428 con->read( &y, 2 ); 428 con->read( &y, 2 );
429 y = Swap16IfLE( y ); 429 y = Swap16IfLE( y );
@@ -433,13 +433,13 @@ void KRFBDecoder::gotRectHeader()
433 con->read( &h, 2 ); 433 con->read( &h, 2 );
434 h = Swap16IfLE( h ); 434 h = Swap16IfLE( h );
435 435
436 con->read( &encoding, 4 ); 436 con->read( &encoding, 4 );
437 437
438 // CARD32 encodingLocal = Swap32IfLE( encoding ); 438 // CARD32 encodingLocal = Swap32IfLE( encoding );
439 // qWarning( "Rect: x=%d, y= %d, w=%d, h=%d, encoding=%ld", 439 // qWarning( "Rect: x=%d, y= %d, w=%d, h=%d, encoding=%ld",
440 // x, y, w, h, encodingLocal ); 440 // x, y, w, h, encodingLocal );
441 441
442 // 442 //
443 // Each encoding needs to be handled differently. Some require 443 // Each encoding needs to be handled differently. Some require
444 // waiting for more data, but others like a copyrect do not. 444 // waiting for more data, but others like a copyrect do not.
445 // Our constants have already been byte swapped, so we use 445 // Our constants have already been byte swapped, so we use
@@ -517,21 +517,21 @@ void KRFBDecoder::getRawRectChunk( int lines )
517} 517}
518 518
519void KRFBDecoder::gotRawRectChunk() 519void KRFBDecoder::gotRawRectChunk()
520{ 520{
521 assert( currentState == AwaitingRawRectChunk ); 521 assert( currentState == AwaitingRawRectChunk );
522 522
523 disconnect( con, SIGNAL( gotEnoughData() ), 523 disconnect( con, SIGNAL( gotEnoughData() ),
524 this, SLOT( gotRawRectChunk() ) ); 524 this, SLOT( gotRawRectChunk() ) );
525 525
526 // qWarning( "Got raw rect chunk" ); 526 // qWarning( "Got raw rect chunk" );
527 527
528 // 528 //
529 // Read the rect data and copy it to the buffer. 529 // Read the rect data and copy it to the buffer.
530 // 530 //
531 531
532 // TODO: Replace this! 532 // TODO: Replace this!
533 int count = lines * w * format->bpp / 8; 533 int count = lines * w * format->bpp / 8;
534 char *hack = new char[ count ]; 534 char *hack = new char[ count ];
535 con->read( hack, count ); 535 con->read( hack, count );
536 buf->drawRawRectChunk( hack, x, y, w, lines ); 536 buf->drawRawRectChunk( hack, x, y, w, lines );
537 delete hack; 537 delete hack;
@@ -717,13 +717,13 @@ void KRFBDecoder::gotServerCutText()
717 CHECK_PTR( cutbuf ); 717 CHECK_PTR( cutbuf );
718 718
719 con->read( cutbuf, serverCutTextLen ); 719 con->read( cutbuf, serverCutTextLen );
720 cutbuf[ serverCutTextLen ] = '\0'; 720 cutbuf[ serverCutTextLen ] = '\0';
721 721
722 /* For some reason QApplication::clipboard()->setText() segfaults when called 722 /* For some reason QApplication::clipboard()->setText() segfaults when called
723 * from within keypebble's mass of signals and slots 723 * from within keypebble's mass of signals and slots
724 qWarning( "Server cut: %s", cutbuf ); 724 qWarning( "Server cut: %s", cutbuf );
725 725
726 QString cutText( cutbuf ); // DANGER!! 726 QString cutText( cutbuf ); // DANGER!!
727 qApp->clipboard()->setText( cutText ); 727 qApp->clipboard()->setText( cutText );
728 */ 728 */
729 729
@@ -795,47 +795,36 @@ void KRFBDecoder::sendKeyReleaseEvent( QKeyEvent *event )
795 con->write( &padding, 2 ); 795 con->write( &padding, 2 );
796 con->write( &key, 4 ); 796 con->write( &key, 4 );
797 } 797 }
798} 798}
799 799
800 800
801
802
803//
804// The RFB protocol spec says 'For most ordinary keys, the 'keysym'
805// is the same as the corresponding ASCII value.', but doesn't
806// elaborate what the most ordinary keys are. The spec also lists
807// a set (possibly subset, it's unspecified) of mappings for
808// "other common keys" (backspace, tab, return, escape, etc).
809//
801int KRFBDecoder::toKeySym( QKeyEvent *k ) 810int KRFBDecoder::toKeySym( QKeyEvent *k )
802{ 811{
803 int ke = 0;
804
805 ke = k->ascii();
806 // Markus: Crappy hack. I dont know why lower case letters are
807 // not defined in qkeydefs.h. The key() for e.g. 'l' == 'L'.
808 // This sucks. :-(
809
810 if ( (ke == 'a') || (ke == 'b') || (ke == 'c') || (ke == 'd')
811 || (ke == 'e') || (ke == 'f') || (ke == 'g') || (ke == 'h')
812 || (ke == 'i') || (ke == 'j') || (ke == 'k') || (ke == 'l')
813 || (ke == 'm') || (ke == 'n') || (ke == 'o') || (ke == 'p')
814 || (ke == 'q') || (ke == 'r') || (ke == 's') || (ke == 't')
815 || (ke == 'u') || (ke == 'v') ||( ke == 'w') || (ke == 'x')
816 || (ke == 'y') || (ke == 'z') ) {
817 ke = k->key();
818 ke = ke + 0x20;
819 return ke;
820 }
821 812
822 // qkeydefs = xkeydefs! :-) 813 //
823 if ( ( k->key() >= 0x0a0 ) && k->key() <= 0x0ff ) 814 // Try and map these "other common keys" first.
824 return k->key(); 815 //
825 816 if ((k->key() >= Qt::Key_Escape) && (k->key() <= Qt::Key_F12)) {
826 if ( ( k->key() >= 0x20 ) && ( k->key() <= 0x7e ) ) 817 for(int i = 0; keyMap[i].keycode != 0; i++) {
827 return k->key(); 818 if (k->key() == keyMap[i].keycode) {
828 819 return keyMap[i].keysym;
829 // qkeydefs != xkeydefs! :-( 820 }
830 // This is gonna suck :-( 821 }
831 822 }
832 int i = 0;
833 while ( keyMap[i].keycode ) {
834 if ( k->key() == keyMap[i].keycode )
835 return keyMap[i].keysym;
836 i++;
837 }
838 823
839 return 0; 824 //
825 // If these keys aren't matched, return the ascii code and let the
826 // server figure it out. We don't return k->key(), as the data in
827 // key differs between input methods, and we don't want special cases.
828 //
829 return k->ascii();
840} 830}
841