この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m
そのため情報が古い可能性があります。ご了承ください。m(_ _)m
android端末(P-01D)+bluetoothキーボード(BK-2000BTII)+BlueKeyboard JP+sshクライアント(ConnectBot)で、サーバの再起動くらい出来るようにしようとしたけど、コントロール(ctrl)キーが効かなくて困ったのでConnectBotを改造してみた。
参考にしたサイトは↓
- Android 3.1 on Asus Transformerで本気でサーバー管理するためのConnectBot | JUMPERZ.NET Blog
- android is01+ConnectBotでCTRLとESCが入力出来るようになりました – mk18のプログラミング日記
改造した点は、
- ctrlキーを効くように
- ‘/'キーが押しづらいので、右のshiftキーを'/'キーに
BK-2000BTIIは、↓
ConnectBotのソースは、connectbot/connectbot · GitHub で公開されている。ライセンスは、apache License 2.0とのこと。
ctrl、右側shift、'/'キーのキーコード、スキャンコードをログ出力させて、調査した所
keyCode | meta | scanCode | |
ctrl | 0 | 0 | 327 |
右側shift | 0 | 129 | 54 |
‘/' | 76 | 0 | 53 |
だった。
改造したソースは、↓。
13-12-15 13:47% git diff | col -b
diff --git a/src/org/connectbot/service/TerminalKeyListener.java b/src/org/connectbot/service/TerminalKeyListener.java
index 3f82259..61858bd 100644
--- a/src/org/connectbot/service/TerminalKeyListener.java
+++ b/src/org/connectbot/service/TerminalKeyListener.java
@@ -79,6 +79,7 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
private boolean volumeKeysChangeFontSize;
private int ourMetaState = 0;
+ private int ctrlFlag = 0;
private int mDeadKey = 0;
@@ -133,6 +134,24 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
final boolean controlNumbersAreFKeys = controlNumbersAreFKeysOnSoftKeyboard &&
!interpretAsHardKeyboard;
+ if (keyCode ==0
+ && event.getScanCode() == 327
+ && event.getAction() == KeyEvent.ACTION_UP) {
+ ctrlFlag = 0;
+ ourMetaState &= ~OUR_CTRL_ON;
+ bridge.redraw();
+ return true;
+ }
+
+ if (keyCode == 0
+ && event.getScanCode() == 54){
+ event = new KeyEvent(event.getDownTime(), event.getEventTime(),
+ event.getAction(), 76,
+ event.getRepeatCount(), 0,
+ event.getDeviceId(), 53,
+ event.getFlags());
+ }
+
// Ignore all key-up events except for the special keys
if (event.getAction() == KeyEvent.ACTION_UP) {
if (rightModifiersAreSlashAndTab) {
@@ -258,6 +277,16 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
return true;
}
+ if(keyCode == 0){
+ if(event.getScanCode() == 327
+ && event.getAction() == KeyEvent.ACTION_DOWN){
+ ctrlFlag = 1;
+ metaPress(OUR_CTRL_ON);
+ bridge.redraw();
+ return true;
+ }
+ }
+
int derivedMetaState = event.getMetaState();
if ((ourMetaState & OUR_SHIFT_MASK) != 0)
derivedMetaState |= KeyEvent.META_SHIFT_ON;
@@ -267,8 +296,11 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
derivedMetaState |= HC_META_CTRL_ON;
if ((ourMetaState & OUR_TRANSIENT) != 0) {
- ourMetaState &= ~OUR_TRANSIENT;
- bridge.redraw();
+ if(ctrlFlag != 0){
+ } else{
+ ourMetaState &= ~OUR_TRANSIENT;
+ bridge.redraw();
+ }
}
// Test for modified numbers becoming function keys
@@ -550,3 +582,4 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
this.encoding = encoding;
}
}
diff --git a/src/org/connectbot/service/TerminalKeyListener.java b/src/org/connectbot/service/TerminalKeyListener.java
index 3f82259..61858bd 100644
--- a/src/org/connectbot/service/TerminalKeyListener.java
+++ b/src/org/connectbot/service/TerminalKeyListener.java
@@ -79,6 +79,7 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
private boolean volumeKeysChangeFontSize;
private int ourMetaState = 0;
+ private int ctrlFlag = 0;
private int mDeadKey = 0;
@@ -133,6 +134,24 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
final boolean controlNumbersAreFKeys = controlNumbersAreFKeysOnSoftKeyboard &&
!interpretAsHardKeyboard;
+ if (keyCode ==0
+ && event.getScanCode() == 327
+ && event.getAction() == KeyEvent.ACTION_UP) {
+ ctrlFlag = 0;
+ ourMetaState &= ~OUR_CTRL_ON;
+ bridge.redraw();
+ return true;
+ }
+
+ if (keyCode == 0
+ && event.getScanCode() == 54){
+ event = new KeyEvent(event.getDownTime(), event.getEventTime(),
+ event.getAction(), 76,
+ event.getRepeatCount(), 0,
+ event.getDeviceId(), 53,
+ event.getFlags());
+ }
+
// Ignore all key-up events except for the special keys
if (event.getAction() == KeyEvent.ACTION_UP) {
if (rightModifiersAreSlashAndTab) {
@@ -258,6 +277,16 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
return true;
}
+ if(keyCode == 0){
+ if(event.getScanCode() == 327
+ && event.getAction() == KeyEvent.ACTION_DOWN){
+ ctrlFlag = 1;
+ metaPress(OUR_CTRL_ON);
+ bridge.redraw();
+ return true;
+ }
+ }
+
int derivedMetaState = event.getMetaState();
if ((ourMetaState & OUR_SHIFT_MASK) != 0)
derivedMetaState |= KeyEvent.META_SHIFT_ON;
@@ -267,8 +296,11 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
derivedMetaState |= HC_META_CTRL_ON;
if ((ourMetaState & OUR_TRANSIENT) != 0) {
- ourMetaState &= ~OUR_TRANSIENT;
- bridge.redraw();
+ if(ctrlFlag != 0){
+ } else{
+ ourMetaState &= ~OUR_TRANSIENT;
+ bridge.redraw();
+ }
}
// Test for modified numbers becoming function keys
@@ -550,3 +582,4 @@ public class TerminalKeyListener implements OnKeyListener, OnSharedPreferenceCha
this.encoding = encoding;
}
}
ctrlFlagを追加して使ってるのは、emacsライクなキーバインドを常用している関係で、連続でctrlキーを使えるように無理やり。