Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 13|回复: 5
打印 上一主题 下一主题

修改鼠标的移动区间

[复制链接]

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
跳转到指定楼层
楼主
发表于 2016-5-19 15:15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
修改鼠标的移动区间
回复

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
沙发
 楼主| 发表于 2016-5-20 14:34:34 | 只看该作者
文件:
./base/libs/input/PointerController.cpp
加入debug信息
#define DEBUG_POINTER_UPDATES 1
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
板凳
 楼主| 发表于 2016-5-20 22:57:55 | 只看该作者
修改文件:
PointerController.cpp
=================================
bool PointerController::getBoundsLocked(float* outMinX, float* outMinY,
        float* outMaxX, float* outMaxY) const {
    if (mLocked.displayWidth <= 0 || mLocked.displayHeight <= 0) {
        return false;
    }

    *outMinX = 0;
    *outMinY = 0;
    switch (mLocked.displayOrientation) {
    case DISPLAY_ORIENTATION_90:
    case DISPLAY_ORIENTATION_270:
        *outMaxX = mLocked.displayHeight - 1;
        *outMaxY = mLocked.displayWidth - 1;
        break;
    default:
        *outMaxX = mLocked.displayWidth/2 - 1;        //zcfdebug
        *outMaxY = mLocked.displayHeight - 1;
        break;
    }
    return true;
}
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
地板
 楼主| 发表于 2016-5-30 23:27:33 | 只看该作者
画鼠标和触摸屏光标流程

1. 画鼠标光标流程
    设置新的Mouse Cursor位置与画Mouse Cursor是异步的。

[cpp] view plain copy
InputReader::loopOnce->  
InputReader::processEventsLocked->  
InputReader::processEventsForDeviceLocked->  
InputDevice::process(numMappers=1)->  
InputMapper::process(CursorInputMapper::process)->  
CursorInputMapper::sync->  
PointerController::move (偏移量)->  
  PointerController::setPositionLocked(绝对值)  
    PointerController::updatePointerLocked  
       *SpriteController:penTransaction()  
       *SpriteController::SpriteImpl::setLayer(int32_t layer)  
       *SpriteController::SpriteImpl::setPosition(float x, float y) (绝对值,画光标的屏幕坐标)  
          SpriteController::SpriteImpl::invalidateLocked->(如果位置有变,则调用此函数)  
            SpriteController::invalidateSpriteLocked               
       *SpriteController::SpriteImpl::setAlpha(float alpha)  
       *SpriteController::SpriteImpl::setVisible(bool visible)  
       *SpriteController::SpriteImpl::setIcon(const SpriteIcon& icon)   
       *SpriteController::closeTransaction()(发送MSG_UPDATE_SPRITES消息给SpriteController)  
  
  
画光标:  
SpriteController::handleMessage(const Message& message)->  
   SpriteController::doUpdateSprites()(真正负责画光标)   


1.1 Log信息(移动鼠标)
[cpp] view plain copy
D/InputReader(  369): InputReader::loopOnce call InputReader::processEventsLocked  
D/InputReader(  369): InputReader::processEventsLocked call InputReader::processEventsForDeviceLocked  
D/InputReader(  369): InputReader::processEventsForDeviceLocked call InputDevice::process  
D/InputReader(  369): InputDevice::process call InputMapper::process, numMappers=1  
D/InputReader(  369): CursorInputMapper::process call CursorInputMapper->sync  
D/InputReader(  370): CursorInputMapper::sync call mPointerController->move  
D/PointerController(  370): Move pointer by deltaX=-2.000, deltaY=0.000  
D/PointerController(  370): PointerController::updatePointerLocked start...  
D/Sprites (  370): openTransaction  
D/Sprites (  370): setLayer,layer=0  
D/Sprites (  370): setPosition,x=1050.746338,y=534.966919  
D/Sprites (  370): invalidateLocked  
D/Sprites (  370): invalidateSpriteLocked  
D/Sprites (  370): setAlpha,alpha=1.000000  
D/Sprites (  370): setVisible,old=1,visible=1  
D/Sprites (  370): closeTransaction  
D/Sprites (  370): closeTransaction, send MSG_UPDATE_SPRITES  
D/PointerController(  370): ointerController::updatePointerLocked end...  
D/PointerController(  370): PointerController::updatePointerLocked start...  
D/Sprites (  370): openTransaction  
D/Sprites (  370): setLayer,layer=0  
D/Sprites (  370): setPosition,x=1050.746338,y=534.966919  
D/Sprites (  370): setAlpha,alpha=1.000000  
D/Sprites (  370): setVisible,old=1,visible=1  
D/Sprites (  370): closeTransaction  
D/PointerController(  370): PointerController::updatePointerLocked end...  
D/PointerController(  370): getPosition x=1050.746, y=534.967  
D/Sprites (  370): handleMessage  
D/Sprites (  370): doUpdateSprites  

2. 画触摸屏光标流程
[cpp] view plain copy
InputReader::loopOnce->  
InputReader::processEventsLocked->  
InputReader::processEventsForDeviceLocked->  
InputDevice::process(numMappers=1)->  
InputMapper::process(SingleTouchInputMapper::process->TouchInputMapper::process)->  
TouchInputMapper::sync->  
SingleTouchInputMapper::syncTouch(获取touch数据)->  
TouchInputMapper::dispatchPointerUsage->  
TouchInputMapper::dispatchPointerStylus->  
PointerController::setPosition->  
  PointerController::setPositionLocked(绝对值)  
    PointerController::updatePointerLocked  
       *SpriteController:penTransaction()  
       *SpriteController::SpriteImpl::setLayer(int32_t layer)  
       *SpriteController::SpriteImpl::setPosition(float x, float y) (绝对值,画光标的屏幕坐标)  
          SpriteController::SpriteImpl::invalidateLocked->(如果位置有变,则调用此函数)  
            SpriteController::invalidateSpriteLocked               
       *SpriteController::SpriteImpl::setAlpha(float alpha)  
       *SpriteController::SpriteImpl::setVisible(bool visible)  
       *SpriteController::SpriteImpl::setIcon(const SpriteIcon& icon)   
       *SpriteController::closeTransaction()(发送MSG_UPDATE_SPRITES消息给SpriteController)  
  
  
画光标:  
SpriteController::handleMessage(const Message& message)->  
   SpriteController::doUpdateSprites()(真正负责画光标)   



2.1 产生Touch Move和Touch Button的实例代码
[cpp] view plain copy
#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <string.h>  
#include <fcntl.h>  
#include <android/log.h>  
  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
  
#include <sys/stat.h>  
#include "uinput.h"  
  
  
#define LOG_TAG "TOUCH_TEST"  
#define ALOGI(fmt, args...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, fmt, ##args)  
#define ALOGD(fmt, args...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, fmt, ##args)  
#define ALOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, fmt, ##args)  
  
#define BUTTON_DOWN 1  
#define BUTTON_UP   0  
  
  
/* global variable */  
static int uinput_fd = -1;   
struct uinput_user_dev uinput; // uInput device structure   
  
/* Setup the uinput device */   
int setup_uinput_device()   
{   
   //int i=0;   
   int ret;  
     
   // Open the input device   
   uinput_fd = open("/dev/uinput", O_WRONLY | O_NDELAY);   
   if (uinput_fd < 0){   
      ALOGE("Unable to open /dev/uinput/n");   
      return -1;   
   }   
     
   memset(&uinput,0,sizeof(uinput)); // Intialize the uInput device to NULL   
   strncpy(uinput.name, "vtouch", UINPUT_MAX_NAME_SIZE);   
   uinput.id.version = 4;   
   uinput.id.bustype = BUS_USB;   
  
  
   uinput.absmin[ABS_X] = 0;  
   uinput.absmax[ABS_X] = 1280;   
   uinput.absmin[ABS_Y] = 0;  
   uinput.absmax[ABS_Y] = 720;   
     
   // Setup the uinput device   
   ret = ioctl(uinput_fd, UI_SET_EVBIT, EV_ABS);   
   if(ret){  
      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
  
   ret = ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY);   
   if(ret){  
      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
  
   ret = ioctl(uinput_fd, UI_SET_ABSBIT, ABS_X);  
   if(ret){  
      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
     
   ret = ioctl(uinput_fd, UI_SET_ABSBIT, ABS_Y);  
   if(ret){  
      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
  
   ret = ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOUCH);  
   if(ret){  
      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
  
   ret = ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOOL_MOUSE);  
   if(ret){  
      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
  
   ret = ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOOL_PEN);  
   if(ret){  
      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
  
   ret = ioctl(uinput_fd, UI_SET_KEYBIT, KEY_BACK);  
   if(ret){  
      ALOGE("ioctl fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
  
   /*     
    ioctl(uinput_fd, UI_SET_EVBIT, EV_KEY);   
    ioctl(uinput_fd, UI_SET_EVBIT, EV_REL);   
      
    ioctl(uinput_fd, UI_SET_RELBIT, REL_X);   
    ioctl(uinput_fd, UI_SET_RELBIT, REL_Y);   
   
    for (i=0; i < 256; i++) {   
       ioctl(uinput_fd, UI_SET_KEYBIT, i);   
    }   
      
    ioctl(uinput_fd, UI_SET_KEYBIT, BTN_MOUSE);   
    ioctl(uinput_fd, UI_SET_KEYBIT, BTN_TOUCH);   
    ioctl(uinput_fd, UI_SET_KEYBIT, BTN_MOUSE);   
    ioctl(uinput_fd, UI_SET_KEYBIT, BTN_LEFT);   
    ioctl(uinput_fd, UI_SET_KEYBIT, BTN_MIDDLE);   
    ioctl(uinput_fd, UI_SET_KEYBIT, BTN_RIGHT);   
    ioctl(uinput_fd, UI_SET_KEYBIT, BTN_FORWARD);   
    ioctl(uinput_fd, UI_SET_KEYBIT, BTN_BACK);   
    */   
  
     
   // Create input device into input sub-system   
   if(write(uinput_fd, &uinput, sizeof(uinput))== -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
        
   if(ioctl(uinput_fd, UI_DEV_CREATE))   
   {   
      ALOGE("Unable to create UINPUT device.");   
      return -1;   
   }   
     
   return 0;   
}   
  
/* Destroy the uinput device */   
int destroy_uinput_device()   
{  
   // Destroy the uinput device  
   ioctl(uinput_fd, UI_DEV_DESTROY);   
     
   // Close the uinput device   
   close(uinput_fd);  
}  
  
int write_touch_move(int x, int y)   
{   
   struct input_event event;   
   int ret;  
     
   // Move pointer to (0,0) location   
   memset(&event, 0, sizeof(event));   
  
   gettimeofday(&event.time, NULL);   
  
   event.type = EV_ABS;  
   event.code = ABS_X;  
   event.value = x;  
   ret = write(uinput_fd,&event,sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
        
   event.type = EV_ABS;  
   event.code = ABS_Y;  
   event.value = y;  
   ret = write(uinput_fd,&event,sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
  
   event.type = EV_KEY;  
   event.code = BTN_TOOL_PEN;   
   event.value = 1;  
   ret = write(uinput_fd,&event,sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
     
  
   event.type = EV_SYN;   
   event.code = SYN_REPORT;   
   event.value = 0;   
   ret = write(uinput_fd, &event, sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
   return 0;  
}   
  
  
int write_touch_hide(void)   
{   
   struct input_event event;   
   int ret;  
     
   // Move pointer to (0,0) location   
   memset(&event, 0, sizeof(event));   
  
   gettimeofday(&event.time, NULL);   
  
   event.type = EV_ABS;  
   event.code = ABS_X;  
   event.value = 0;  
   ret = write(uinput_fd,&event,sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
        
   event.type = EV_ABS;  
   event.code = ABS_Y;  
   event.value = 0;  
   ret = write(uinput_fd,&event,sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
  
   event.type = EV_KEY;  
   event.code = BTN_TOOL_PEN;   
   event.value = 0;  
   ret = write(uinput_fd,&event,sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
     
  
   event.type = EV_SYN;   
   event.code = SYN_REPORT;   
   event.value = 0;   
   ret = write(uinput_fd, &event, sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
   return 0;  
}  
  
  
  
int write_key(int key, int down)   
{   
   struct input_event event;   
   int ret;  
     
   // Move pointer to (0,0) location   
   memset(&event, 0, sizeof(event));   
  
   gettimeofday(&event.time, NULL);   
  
   event.type = EV_KEY;  
   event.code = key;   
   event.value = down;  
   ret = write(uinput_fd,&event,sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
     
  
   event.type = EV_SYN;   
   event.code = SYN_REPORT;   
   event.value = 0;   
   ret = write(uinput_fd, &event, sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
   return 0;  
}  
  
int write_touch_button(int x, int y, int down)   
{   
   struct input_event event;   
   int ret;  
     
   // Move pointer to (0,0) location   
   memset(&event, 0, sizeof(event));   
  
   gettimeofday(&event.time, NULL);   
  
   event.type = EV_ABS;  
   event.code = ABS_X;  
   event.value = x;  
   ret = write(uinput_fd,&event,sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
        
   event.type = EV_ABS;  
   event.code = ABS_Y;  
   event.value = y;  
   ret = write(uinput_fd,&event,sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
     
   event.type = EV_KEY;  
   event.code = BTN_TOUCH;   
   event.value = down;  
   ret = write(uinput_fd,&event,sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
  
   event.type = EV_SYN;   
   event.code = SYN_REPORT;   
   event.value = 0;   
   ret = write(uinput_fd, &event, sizeof(event));  
   if(ret == -1){  
      ALOGE("write fail:%s(%d)",__FUNCTION__,__LINE__);  
      return -1;     
   }  
   return 0;  
}  
  
  
  
#define DIS_PIXEL 1  
#define DUR_TIME  5  
  
int main(int argc, char** argv) {  
   int i;  
   // Initialize uinput device  
   if(setup_uinput_device()){  
      ALOGE("setup uinput device fail");  
      return -1;     
   }  
  
   // Send gsensor event  
   int write_count=0;  
   int count =0;  
   int x=0,y=0;  
  
   count = 0;  
   while(1){  // for touch screen  
     
        x = 10;  
        y = 10;  
         
        while(x <1270){  
            write_touch_move(x,y);  
            x+=DIS_PIXEL;  
            usleep(DUR_TIME*1000);  
        }  
         
        y+=DIS_PIXEL;  
        while(y < 710){  
            write_touch_move(x,y);  
            y+=DIS_PIXEL;  
            usleep(DUR_TIME*1000);              
        }  
  
        x -=DIS_PIXEL;  
        while(x > 10){  
            write_touch_move(x,y);  
            x-=DIS_PIXEL;  
            usleep(DUR_TIME*1000);              
        }         
  
        /*
        y -=DIS_PIXEL;
        while(y > 10){
            write_touch_move(x,y);
            y-=DIS_PIXEL;
            usleep(DUR_TIME*1000);            
        }  
        */  
         
        write_touch_hide();  
  
        sleep(5);  
         
        /*
        count++;
        if(count>5){
            while(1){
                sleep(60);
            }
                 
        }
        */  
   }     
  
   // Destroy uinput device   
   destroy_uinput_device();  
   return 0;  
}  



2.2 log信息
[cpp] view plain copy
D/InputReader(  356): SingleTouchInputMapper::process  
D/InputReader(  356): type=3,code=0,value=500  
D/InputReader(  356): SingleTouchInputMapper::process  
D/InputReader(  356): type=3,code=1,value=500  
D/InputReader(  356): SingleTouchInputMapper::process  
D/InputReader(  356): type=0,code=0,value=0  
D/InputReader(  356): call sync...  
D/InputReader(  356): sync mDeviceMode=3  
D/InputReader(  356): SingleTouchInputMapper::syncTouch, isToolActive=1  
D/InputReader(  356): syncTouch: pointerCount 1 -> 1, touching ids 0x00000000 -> 0x00000000, hovering ids 0x80000000 -> 0x80000000  
D/InputReader(  356): sync Line:4107  
D/InputReader(  356): sync Line:4110  
D/InputReader(  356): sync Line:4127  
D/InputReader(  356): sync Line:4139,pointerUsage=2  
D/InputReader(  356): sync Line:4150,pointerUsage=2  
D/InputReader(  356): dispatchPointerUsage mPointerUsage=2  
D/Sprites (  356):  setPosition,x=499.609680,y=499.306519  
D/Sprites (  356):  setPosition,x=499.609680,y=499.306519  
D/Sprites (  356):  setPosition:x=499.609680,y=499.306519  
D/Sprites (  356):  setPosition:hotx=6.000000,hoty=6.000000  
  
D/InputReader(  356): SingleTouchInputMapper::process  
D/InputReader(  356): type=3,code=0,value=600  
D/InputReader(  356): SingleTouchInputMapper::process  
D/InputReader(  356): type=3,code=1,value=600  
D/InputReader(  356): SingleTouchInputMapper::process  
D/InputReader(  356): type=0,code=0,value=0  
D/InputReader(  356): call sync...  
D/InputReader(  356): sync mDeviceMode=3  
D/InputReader(  356): SingleTouchInputMapper::syncTouch, isToolActive=1  
D/InputReader(  356): syncTouch: pointerCount 1 -> 1, touching ids 0x00000000 -> 0x00000000, hovering ids 0x80000000 -> 0x80000000  
D/InputReader(  356): sync Line:4107  
D/InputReader(  356): sync Line:4110  
D/InputReader(  356): sync Line:4127  
D/InputReader(  356): sync Line:4139,pointerUsage=2  
D/InputReader(  356): sync Line:4150,pointerUsage=2  
D/InputReader(  356): dispatchPointerUsage mPointerUsage=2  
D/Sprites (  356):  setPosition,x=599.531616,y=599.167847  
D/Sprites (  356):  setPosition,x=599.531616,y=599.167847  
D/Sprites (  356):  setPosition:x=599.531616,y=599.167847  
D/Sprites (  356):  setPosition:hotx=6.000000,hoty=6.000000
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
5#
 楼主| 发表于 2016-5-31 13:53:29 | 只看该作者
GLES部分的内容好像没有在复制那个地方出现
回复 支持 反对

使用道具 举报

1198

主题

2060

帖子

7058

积分

超级版主

Rank: 8Rank: 8

积分
7058
6#
 楼主| 发表于 2016-6-1 20:13:11 | 只看该作者
鼠标显示的时候,到底做了一个什么动作,导致导航栏消失的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Comsenz Inc.

GMT+8, 2025-12-15 01:41 , Processed in 0.013362 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表