comparison src/com/five_ten_sg/connectbot/service/TerminalKeyListener.java @ 53:e872762ec105 tn5250

start tn5250 integration
author Carl Byington <carl@five-ten-sg.com>
date Wed, 11 Jun 2014 13:37:02 -0700
parents 0e3fc85d0586
children a7e660661e08
comparison
equal deleted inserted replaced
52:0e3fc85d0586 53:e872762ec105
89 protected boolean hardKeyboard = false; 89 protected boolean hardKeyboard = false;
90 protected boolean hardKeyboardHidden; 90 protected boolean hardKeyboardHidden;
91 protected String customKeyboard = null; 91 protected String customKeyboard = null;
92 92
93 protected int metaState = 0; 93 protected int metaState = 0;
94 private int mDeadKey = 0; 94 protected int mDeadKey = 0;
95 95
96 // TODO add support for the new API. 96 // TODO add support for the new API.
97 private ClipboardManager clipboard = null; 97 private ClipboardManager clipboard = null;
98 private boolean selectingForCopy = false; 98 private boolean selectingForCopy = false;
99 private final SelectionArea selectionArea; 99 private final SelectionArea selectionArea;
116 updateKeymode(); 116 updateKeymode();
117 updateCustomKeymap(); 117 updateCustomKeymap();
118 } 118 }
119 119
120 public void sendEscape() { 120 public void sendEscape() {
121 buffer.write(0x1b); 121 buffer.keyPressed(vt320.KEY_ESCAPE, ' ', getStateForBuffer());
122 } 122 }
123 123
124 protected void sendEncoded(String s) { 124 protected void sendEncoded(String s) {
125 buffer.write(s.getBytes(encoding)); 125 byte [] b = null;
126 try {
127 b = s.getBytes(encoding);
128 }
129 catch (UnsupportedEncodingException e){
130 }
131 if (b != null) buffer.write(b);
126 } 132 }
127 133
128 /** 134 /**
129 * Handle onKey() events coming down from a {@link com.five_ten_sg.connectbot.TerminalView} above us. 135 * Handle onKey() events coming down from a {@link com.five_ten_sg.connectbot.TerminalView} above us.
130 * Modify the keys to make more sense to a host then pass it to the vt320. 136 * Modify the keys to make more sense to a host then pass it to the vt320.
174 return true; 180 return true;
175 } 181 }
176 else if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT 182 else if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT
177 && (metaState & META_TAB) != 0) { 183 && (metaState & META_TAB) != 0) {
178 metaState &= ~(META_TAB | META_TRANSIENT); 184 metaState &= ~(META_TAB | META_TRANSIENT);
179 buffer.write(0x09); 185 buffer.keyPressed(vt320.KEY_TAB, ' ', getStateForBuffer());
180 return true; 186 return true;
181 } 187 }
182 } 188 }
183 else if (PreferenceConstants.KEYMODE_LEFT.equals(keymode)) { 189 else if (PreferenceConstants.KEYMODE_LEFT.equals(keymode)) {
184 if (keyCode == KeyEvent.KEYCODE_ALT_LEFT 190 if (keyCode == KeyEvent.KEYCODE_ALT_LEFT
188 return true; 194 return true;
189 } 195 }
190 else if (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT 196 else if (keyCode == KeyEvent.KEYCODE_SHIFT_LEFT
191 && (metaState & META_TAB) != 0) { 197 && (metaState & META_TAB) != 0) {
192 metaState &= ~(META_TAB | META_TRANSIENT); 198 metaState &= ~(META_TAB | META_TRANSIENT);
193 buffer.write(0x09); 199 buffer.keyPressed(vt320.KEY_TAB, ' ', getStateForBuffer());
194 return true; 200 return true;
195 } 201 }
196 } 202 }
197 203
198 return false; 204 return false;
315 if (!sendCtrl && sendFunctionKey(keyCode)) 321 if (!sendCtrl && sendFunctionKey(keyCode))
316 return true; 322 return true;
317 } 323 }
318 else if ((orgMetaState & KeyEvent.META_ALT_ON) != 0) { 324 else if ((orgMetaState & KeyEvent.META_ALT_ON) != 0) {
319 sendMeta = true; 325 sendMeta = true;
320 buffer.write(0x1b); 326 sendEscape();
321 } 327 }
322 328
323 if (sendMeta || sendCtrl) { 329 if (sendMeta || sendCtrl) {
324 buffer.write(k); 330 buffer.write(k);
325 return true; 331 return true;
340 buffer.write(k); 346 buffer.write(k);
341 347
342 return true; 348 return true;
343 } 349 }
344 else if ((orgMetaState & KeyEvent.META_ALT_ON) != 0) { 350 else if ((orgMetaState & KeyEvent.META_ALT_ON) != 0) {
345 buffer.write(0x1b); 351 sendEscape();
346 buffer.write(k); 352 buffer.write(k);
347 return true; 353 return true;
348 } 354 }
349 } 355 }
350 356
416 } 422 }
417 423
418 // look for special chars 424 // look for special chars
419 switch (keyCode) { 425 switch (keyCode) {
420 case KEYCODE_ESCAPE: 426 case KEYCODE_ESCAPE:
421 buffer.write(0x1b); 427 sendEscape();
422 return true; 428 return true;
423 429
424 case KeyEvent.KEYCODE_TAB: 430 case KeyEvent.KEYCODE_TAB:
425 buffer.write(0x09); 431 buffer.keyPressed(vt320.KEY_TAB, ' ', getStateForBuffer());
426 return true; 432 return true;
427 433
428 case KEYCODE_PAGE_DOWN: 434 case KEYCODE_PAGE_DOWN:
429 buffer.keyPressed(vt320.KEY_PAGE_DOWN, ' ', getStateForBuffer()); 435 buffer.keyPressed(vt320.KEY_PAGE_DOWN, ' ', getStateForBuffer());
430 metaState &= ~META_TRANSIENT; 436 metaState &= ~META_TRANSIENT;
477 PreferenceConstants.HWBUTTON_ESC); 483 PreferenceConstants.HWBUTTON_ESC);
478 return (handleShortcut(v, hwbuttonShortcut)); 484 return (handleShortcut(v, hwbuttonShortcut));
479 485
480 case KeyEvent.KEYCODE_DEL: 486 case KeyEvent.KEYCODE_DEL:
481 if ((metaState & META_ALT_MASK) != 0) { 487 if ((metaState & META_ALT_MASK) != 0) {
482 buffer.keyPressed(vt320.KEY_INSERT, ' ', 488 buffer.keyPressed(vt320.KEY_INSERT, ' ', getStateForBuffer());
483 getStateForBuffer());
484 } 489 }
485 else { 490 else {
486 buffer.keyPressed(vt320.KEY_BACK_SPACE, ' ', 491 buffer.keyPressed(vt320.KEY_BACK_SPACE, ' ', getStateForBuffer());
487 getStateForBuffer());
488 } 492 }
489 493
490 metaState &= ~META_TRANSIENT; 494 metaState &= ~META_TRANSIENT;
491 return true; 495 return true;
492 496
500 selectionArea.decrementColumn(); 504 selectionArea.decrementColumn();
501 bridge.redraw(); 505 bridge.redraw();
502 } 506 }
503 else { 507 else {
504 if ((metaState & META_ALT_MASK) != 0) { 508 if ((metaState & META_ALT_MASK) != 0) {
505 buffer.keyPressed(vt320.KEY_HOME, ' ', 509 buffer.keyPressed(vt320.KEY_HOME, ' ', getStateForBuffer());
506 getStateForBuffer());
507 } 510 }
508 else { 511 else {
509 buffer.keyPressed(vt320.KEY_LEFT, ' ', 512 buffer.keyPressed(vt320.KEY_LEFT, ' ', getStateForBuffer());
510 getStateForBuffer());
511 } 513 }
512 514
513 metaState &= ~META_TRANSIENT; 515 metaState &= ~META_TRANSIENT;
514 bridge.tryKeyVibrate(); 516 bridge.tryKeyVibrate();
515 } 517 }
521 selectionArea.decrementRow(); 523 selectionArea.decrementRow();
522 bridge.redraw(); 524 bridge.redraw();
523 } 525 }
524 else { 526 else {
525 if ((metaState & META_ALT_MASK) != 0) { 527 if ((metaState & META_ALT_MASK) != 0) {
526 buffer.keyPressed(vt320.KEY_PAGE_UP, ' ', 528 buffer.keyPressed(vt320.KEY_PAGE_UP, ' ', getStateForBuffer());
527 getStateForBuffer());
528 } 529 }
529 else { 530 else {
530 buffer.keyPressed(vt320.KEY_UP, ' ', 531 buffer.keyPressed(vt320.KEY_UP, ' ', getStateForBuffer());
531 getStateForBuffer());
532 } 532 }
533 533
534 metaState &= ~META_TRANSIENT; 534 metaState &= ~META_TRANSIENT;
535 bridge.tryKeyVibrate(); 535 bridge.tryKeyVibrate();
536 } 536 }
542 selectionArea.incrementRow(); 542 selectionArea.incrementRow();
543 bridge.redraw(); 543 bridge.redraw();
544 } 544 }
545 else { 545 else {
546 if ((metaState & META_ALT_MASK) != 0) { 546 if ((metaState & META_ALT_MASK) != 0) {
547 buffer.keyPressed(vt320.KEY_PAGE_DOWN, ' ', 547 buffer.keyPressed(vt320.KEY_PAGE_DOWN, ' ', getStateForBuffer());
548 getStateForBuffer());
549 } 548 }
550 else { 549 else {
551 buffer.keyPressed(vt320.KEY_DOWN, ' ', 550 buffer.keyPressed(vt320.KEY_DOWN, ' ', getStateForBuffer());
552 getStateForBuffer());
553 } 551 }
554 552
555 metaState &= ~META_TRANSIENT; 553 metaState &= ~META_TRANSIENT;
556 bridge.tryKeyVibrate(); 554 bridge.tryKeyVibrate();
557 } 555 }
563 selectionArea.incrementColumn(); 561 selectionArea.incrementColumn();
564 bridge.redraw(); 562 bridge.redraw();
565 } 563 }
566 else { 564 else {
567 if ((metaState & META_ALT_MASK) != 0) { 565 if ((metaState & META_ALT_MASK) != 0) {
568 buffer.keyPressed(vt320.KEY_END, ' ', 566 buffer.keyPressed(vt320.KEY_END, ' ', getStateForBuffer());
569 getStateForBuffer());
570 } 567 }
571 else { 568 else {
572 buffer.keyPressed(vt320.KEY_RIGHT, ' ', 569 buffer.keyPressed(vt320.KEY_RIGHT, ' ', getStateForBuffer());
573 getStateForBuffer());
574 } 570 }
575 571
576 metaState &= ~META_TRANSIENT; 572 metaState &= ~META_TRANSIENT;
577 bridge.tryKeyVibrate(); 573 bridge.tryKeyVibrate();
578 } 574 }
610 else if (PreferenceConstants.HWBUTTON_CTRL.equals(shortcut)) { 606 else if (PreferenceConstants.HWBUTTON_CTRL.equals(shortcut)) {
611 showMetakeyToast(v, PreferenceConstants.HWBUTTON_CTRL); 607 showMetakeyToast(v, PreferenceConstants.HWBUTTON_CTRL);
612 metaPress(META_CTRL_ON); 608 metaPress(META_CTRL_ON);
613 } 609 }
614 else if (PreferenceConstants.HWBUTTON_TAB.equals(shortcut)) { 610 else if (PreferenceConstants.HWBUTTON_TAB.equals(shortcut)) {
615 buffer.write(0x09); 611 buffer.keyPressed(vt320.KEY_TAB, ' ', getStateForBuffer());
616 } 612 }
617 else if (PreferenceConstants.HWBUTTON_CTRLA_SPACE.equals(shortcut)) { 613 else if (PreferenceConstants.HWBUTTON_CTRLA_SPACE.equals(shortcut)) {
618 buffer.write(0x01); 614 buffer.write(0x01);
619 buffer.write(' '); 615 buffer.write(' ');
620 } 616 }
621 else if (PreferenceConstants.HWBUTTON_CTRLA.equals(shortcut)) { 617 else if (PreferenceConstants.HWBUTTON_CTRLA.equals(shortcut)) {
622 buffer.write(0x01); 618 buffer.write(0x01);
623 } 619 }
624 else if (PreferenceConstants.HWBUTTON_ESC.equals(shortcut)) { 620 else if (PreferenceConstants.HWBUTTON_ESC.equals(shortcut)) {
625 showMetakeyToast(v, PreferenceConstants.HWBUTTON_ESC); 621 showMetakeyToast(v, PreferenceConstants.HWBUTTON_ESC);
626 buffer.write(0x1b); 622 sendEscape();
627 } 623 }
628 else if (PreferenceConstants.HWBUTTON_ESC_A.equals(shortcut)) { 624 else if (PreferenceConstants.HWBUTTON_ESC_A.equals(shortcut)) {
629 buffer.write(0x1b); 625 sendEscape();
630 buffer.write('a'); 626 buffer.write('a');
631 } 627 }
632 else { 628 else {
633 return (false); 629 return (false);
634 } 630 }
899 } 895 }
900 } 896 }
901 } 897 }
902 else { 898 else {
903 if ((metaState & META_CTRL_ON) != 0) { 899 if ((metaState & META_CTRL_ON) != 0) {
904 buffer.write(0x1b); 900 sendEscape();
905 metaState &= ~META_CTRL_ON; 901 metaState &= ~META_CTRL_ON;
906 } 902 }
907 else 903 else
908 metaPress(META_CTRL_ON); 904 metaPress(META_CTRL_ON);
909 } 905 }
910 906
911 bridge.redraw(); 907 bridge.redraw();
912 } 908 }
913 909
914 private boolean customKeymapAction(View v, int keyCode, KeyEvent event) { 910 protected boolean customKeymapAction(View v, int keyCode, KeyEvent event) {
915 if (bridge == null || customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_DISABLED)) 911 if (bridge == null || customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_DISABLED))
916 return false; 912 return false;
917 913
918 byte c = 0x00; 914 byte c = 0x00;
919 int termKey = 0; 915 int termKey = 0;
939 if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_ASUS_TF)) { 935 if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_ASUS_TF)) {
940 // Check to see whether this is the back button on the 936 // Check to see whether this is the back button on the
941 // screen (-1) or the Asus Transformer Keyboard Dock. 937 // screen (-1) or the Asus Transformer Keyboard Dock.
942 // Treat the HW button as ESC. 938 // Treat the HW button as ESC.
943 if (event.getDeviceId() > 0) { 939 if (event.getDeviceId() > 0) {
944 buffer.write(0x1b); 940 sendEscape();
945 return true; 941 return true;
946 } 942 }
947 } 943 }
948 944
949 default: 945 default:
1033 } 1029 }
1034 else if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_SGH_I927)) { 1030 else if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_SGH_I927)) {
1035 // Samsung Captivate Glide (SGH-i927) 1031 // Samsung Captivate Glide (SGH-i927)
1036 if (keyCode == 115) { 1032 if (keyCode == 115) {
1037 // .com key = ESC 1033 // .com key = ESC
1038 c = 0x1b; 1034 c = 0x00;
1035 termKey = vt320.KEY_ESCAPE;
1039 return true; 1036 return true;
1040 } 1037 }
1041 else if (keyCode == 116) { 1038 else if (keyCode == 116) {
1042 // Microphone key = TAB 1039 // Microphone key = TAB
1043 c = 0x09; 1040 c = 0x00;
1041 termKey = vt320.KEY_TAB;
1044 } 1042 }
1045 else if ((metaState & META_ALT_MASK) != 0 && (metaState & META_SHIFT_MASK) != 0) { 1043 else if ((metaState & META_ALT_MASK) != 0 && (metaState & META_SHIFT_MASK) != 0) {
1046 switch (keyCode) { 1044 switch (keyCode) {
1047 case KeyEvent.KEYCODE_O: 1045 case KeyEvent.KEYCODE_O:
1048 c = 0x5B; 1046 c = 0x5B;
1064 } 1062 }
1065 else if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_SGH_I927_ICS)) { 1063 else if (customKeyboard.equals(PreferenceConstants.CUSTOM_KEYMAP_SGH_I927_ICS)) {
1066 // Samsung Captivate Glide (SGH-i927) Ice Cream Sandwich (4.0.x) 1064 // Samsung Captivate Glide (SGH-i927) Ice Cream Sandwich (4.0.x)
1067 if (keyCode == 226) { 1065 if (keyCode == 226) {
1068 // .com key = ESC 1066 // .com key = ESC
1069 c = 0x1b; 1067 c = 0x00;
1068 termKey = vt320.KEY_ESCAPE;
1070 } 1069 }
1071 else if (keyCode == 220) { 1070 else if (keyCode == 220) {
1072 // Microphone key = TAB 1071 // Microphone key = TAB
1073 c = 0x09; 1072 c = 0x00;
1073 termKey = vt320.KEY_TAB;
1074 } 1074 }
1075 else if ((metaState & META_ALT_MASK) != 0 && (metaState & META_SHIFT_MASK) != 0) { 1075 else if ((metaState & META_ALT_MASK) != 0 && (metaState & META_SHIFT_MASK) != 0) {
1076 switch (keyCode) { 1076 switch (keyCode) {
1077 case KeyEvent.KEYCODE_O: 1077 case KeyEvent.KEYCODE_O:
1078 c = 0x5B; 1078 c = 0x5B;