組み込みAndroid

開発奮闘記

7.マウスカーソルを表示させる

今回はマウスを使ってみたいということで、マウスカーソルを表示できるようにしたいと思います。
まぁ当然今回もネットで調査調査〜なわけですね。

結果を先に言ってしまうとマウスカーソル出ました。
出たんですよ出てしまったんですよ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カードにコピーして動作確認してください。
ちょっと色が薄くて分かりにくいかも知れませんが三角形のマウスカーソルが表示されます。

 8.ネットワークを設定する