Mercurial > 510Connectbot
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; |