今回はマウスを使ってみたいということで、マウスカーソルを表示できるようにしたいと思います。
まぁ当然今回もネットで調査調査~なわけですね。
結果を先に言ってしまうとマウスカーソル出ました。
出たんですよ出てしまったんですよwww
いろいろ調べてみたら以下の4ファイルを弄ればなんとなくよさげな感じ。
・1ファイル目
最初のファイルは"omap3_beagle_android_defconfig"になります。
ファイルの在り処は <作業用ディレクトリ>/kernel/arch/arm/configs
このファイルの
# Userland interfacesの
# CONFIG_INPUT_MOUSEDEV is not setを
CONFIG_INPUT_MOUSEDEV=yに変更。
次に
# Input Device Driversの
# CONFIG_INPUT_MOUSE is not setを
CONFIG_INPUT_MOUSE=yに変更。
・2ファイル目
KeyInputQueue.javaになります。
ファイルの在り処は <作業用ディレクトリ>/frameworks/base/services/java/com/android/server
これが意外と手が入ってしまっているのでちょっと見づらいかも・・・
public abstract class KeyInputQueueに
static final int UPKEY_KEYWORD = 19;
static final int DOWNKEY_KEYWORD = 20;
と
int mCx;
int mCy;
の宣言を追加
さらに
public void setDisplay()に
mCx = (mDisplay.getWidth() - 20) / 2;
mCy = (mDisplay.getHeight() - 20) / 2;
を追加。
290行付近の
if (ev.scancode == RawInputEvent.BTN_MOUSE &&
(classes&RawInputEvent.CLASS_TRACKBALL) != 0) { ~~~ }
を以下のように変更
if (ev.scancode == RawInputEvent.BTN_MOUSE) {
if ((classes&RawInputEvent.CLASS_TRACKBALL) != 0) {
di.mRel.changed = true;
di.mRel.down = ev.value != 0;
} else if ((classes&RawInputEvent.CLASS_MOUSE) != 0) {
di.mAbs.changed = true;
di.mAbs.down=ev.value != 0;
}
}
次に315行付近の
else if (ev.type == RawInputEvent.EV_REL &&
(classes&RawInputEvent.CLASS_TRACKBALL) != 0) { ~~~ }
を以下のように変更
else if (ev.type == RawInputEvent.EV_REL ) {
if ((classes&RawInputEvent.CLASS_TRACKBALL) != 0) {
// Add this relative movement into our
totals.
if (ev.scancode == RawInputEvent.REL_X) {
di.mRel.changed = true;
di.mRel.x += ev.value;
} else if (ev.scancode == RawInputEvent.REL_Y)
{
di.mRel.changed = true;
di.mRel.y += ev.value;
}
} else if ((classes&RawInputEvent.CLASS_MOUSE) != 0) {
// Log.i(TAG, "Reaches Mouse X,Y code");
if (ev.scancode == RawInputEvent.REL_X) {
di.mAbs.changed = true;
mCx = mCx + (int)ev.value;
mCx = ((mCx < 0) ? 0 :(mCx>=
mDisplay.getWidth() ?(mDisplay.getWidth()-1):mCx));
di.mAbs.x = mCx;
} else if (ev.scancode ==
RawInputEvent.REL_Y)
{
di.mAbs.changed = true;
mCy = mCy + (int)ev.value;
mCy = ((mCy < 0) ? 0 :(mCy>=
mDisplay.getHeight()?(mDisplay.getHeight() - 1):mCy));
di.mAbs.y = mCy;
} else if
((classes&RawInputEvent.CLASS_MOUSE) != 0) {
// Log.i(TAG,"Reaches Mouse
Wheel code");
if (ev.scancode ==
RawInputEvent.REL_WHEEL){
boolean
down;
int keycode;
if (ev.value !=
0)
{
down
=
true;
di.mDownTime
= curTime;
} else {
down
=
false;
}
if (ev.value < 0){
keycode
= rotateKeyCodeLocked(DOWNKEY_KEYWORD);
} else
if(ev.value > 0){
keycode
= rotateKeyCodeLocked(UPKEY_KEYWORD);
} else {
keycode
= rotateKeyCodeLocked(ev.keycode);
}
addLocked(di,
curTime, ev.flags,
RawInputEvent.CLASS_KEYBOARD,
newKeyEvent(di,
di.mDownTime, curTime, down,
keycode,
0, scancode,
((ev.flags
& WindowManagerPolicy.FLAG_WOKE_HERE) != 0)
?
KeyEvent.FLAG_WOKE_HERE : 0));
addLocked(di,
curTime, ev.flags,
RawInputEvent.CLASS_KEYBOARD,
newKeyEvent(di,
di.mDownTime, curTime, !down,
keycode,
0, scancode,
((ev.flags
& WindowManagerPolicy.FLAG_WOKE_HERE) != 0)
?
KeyEvent.FLAG_WOKE_HERE : 0));
}
}
}
}
さらに340行付近の
addLocked(di, curTime, ev.flags,
RawInputEvent.CLASS_TOUCHSCREEN, me);
を以下のように変更
if ((classes & RawInputEvent.CLASS_TOUCHSCREEN) != 0) {
addLocked(di, curTime, ev.flags,
RawInputEvent.CLASS_TOUCHSCREEN,
me);
} else if ((classes & RawInputEvent.CLASS_MOUSE) != 0) {
addLocked(di, curTime, ev.flags,
RawInputEvent.CLASS_MOUSE,
me);
}
・3ファイル目
RawInputEvent.javaになります。
ファイルの在り処は <作業用ディレクトリ>
/frameworks/base/core/java/android/view
public class RawInputEventに
public static final int CLASS_MOUSE= 0x00000010;を追加
・4ファイル目
EventHub.hになります。
ファイルの在り処は <作業用ディレクトリ>/frameworks/base/include/ui
class EventHub : public RefBaseの中のenumの宣言の
CLASS_TRACKBALL = 0x00000008の後ろに
CLASS_MOUSE = 0x00000010を追加
この後、以下のコマンドでandroidとカーネルのビルドを行います。
$ make
と
$ make CROSS_COMPILE=arm-eabi- ARCH=arm uImage
最後に5章の説明にあるuImageとRFSを再度SDカードにコピーして動作確認してください。
ちょっと色が薄くて分かりにくいかも知れませんが三角形のマウスカーソルが表示されます。