当前位置: 首页 > news >正文

RK 11.0 多屏模式下修改鼠标进入方式

要求:主屏在左,副屏在右。这种排列情况下鼠标仅可通过主屏的最右侧移入副屏的最左侧,或从副屏的最左侧移入主屏最右侧。

1.RK默认设计
1.1 RK的代码设计是当sys.mouse.presentation=1时,鼠标在屏幕边缘的时候就会移入另一个屏幕
  • frameworks/native/services/inputflinger/reader/mapper/CursorInputMapper.cpp
void CursorInputMapper::sync(nsecs_t when) {...if (mSource == AINPUT_SOURCE_MOUSE) {if (moved || scrolled || buttonsChanged) {mPointerController->setPresentation(PointerControllerInterface::PRESENTATION_POINTER);if (moved) {mPointerController->move(deltaX, deltaY);}if (buttonsChanged) {mPointerController->setButtonState(currentButtonState);}mPointerController->unfade(PointerControllerInterface::TRANSITION_IMMEDIATE);}mPointerController->getPosition(&xCursorPosition, &yCursorPosition);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, xCursorPosition);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);char mMousePresentation[PROPERTY_VALUE_MAX] = {0};property_get("sys.mouse.presentation", mMousePresentation, "0");if (strcmp(mMousePresentation, "1") == 0) {displayId = mDisplayId;float minX, minY, maxX, maxY;if (mPointerController->getBounds(&minX, &minY, &maxX, &maxY)) {// 如果鼠标位置在屏幕四周边缘,进入另外的屏幕,重新赋值displayIdif (xCursorPosition==minX||xCursorPosition==maxX||yCursorPosition==minY||yCursorPosition==maxY{displayId=getPolicy()->notifyDisplayIdChanged();mDisplayId=displayId;}}}else{displayId = mPointerController->getDisplayId();}} else {pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, deltaX);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, deltaY);displayId = ADISPLAY_ID_NONE;}
}
1.2 鼠标进入不同屏,默认居中显示
  • frameworks/base/libs/input/PointerController.cpp
void PointerController::setDisplayViewport(const DisplayViewport& viewport) {...// Reset cursor position to center if size or display changed.if (oldViewport.displayId != viewport.displayId|| oldDisplayWidth != newDisplayWidth|| oldDisplayHeight != newDisplayHeight) {float minX, minY, maxX, maxY;if (getBoundsLocked(&minX, &minY, &maxX, &maxY)) {mLocked.pointerX = (minX + maxX) * 0.5f;mLocked.pointerY = (minY + maxY) * 0.5f;// Reload icon resources for density may be changed.loadResourcesLocked();} else {mLocked.pointerX = 0;mLocked.pointerY = 0;}fadeOutAndReleaseAllSpotsLocked();} else if (oldViewport.orientation != viewport.orientation) {
}
2.修改鼠标进入方式

hdmi接入状态

  • /frameworks/base/services/core/java/com/android/server/WiredAccessoryManager.java
public Pair<Integer, Integer> parseState(ExtconInfo extconInfo, String status) {...if (status.contains("HDMI")){SystemProperties.set("hdmi.plugged", status.contains("HDMI=1") ? "1":"0");}
}
2.1 主屏在左,副屏在右边模式下修改鼠标进入方式
  • frameworks/native/services/inputflinger/reader/mapper/CursorInputMapper.cpp
void CursorInputMapper::sync(nsecs_t when) {...if (mSource == AINPUT_SOURCE_MOUSE) {if (moved || scrolled || buttonsChanged) {mPointerController->setPresentation(PointerControllerInterface::PRESENTATION_POINTER);if (moved) {mPointerController->move(deltaX, deltaY);}if (buttonsChanged) {mPointerController->setButtonState(currentButtonState);}mPointerController->unfade(PointerControllerInterface::TRANSITION_IMMEDIATE);}mPointerController->getPosition(&xCursorPosition, &yCursorPosition);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, xCursorPosition);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);char mMousePresentation[PROPERTY_VALUE_MAX] = {0};property_get("sys.mouse.presentation", mMousePresentation, "0");if (strcmp(mMousePresentation, "1") == 0) {//displayId = mDisplayId;char mHdmiPlugged[PROPERTY_VALUE_MAX] = {0};property_get("hdmi.plugged", mHdmiPlugged, "0");if (strcmp(mHdmiPlugged, "1") == 0){displayId = mDisplayId;} else {// 鼠标在副屏时,拔掉hdmi导致鼠标没有功能,强制id为主屏0displayId = 0;}  float minX, minY, maxX, maxY;if (mPointerController->getBounds(&minX, &minY, &maxX, &maxY)){// 鼠标在主屏屏幕右边缘位置,重新赋值displayId,位置改变if (displayId == 0 && xCursorPosition==maxX) {displayId=getPolicy()->notifyDisplayIdChanged();mDisplayId=displayId;// 设置鼠标在副屏左侧显示if ((strcmp(mHdmiPlugged, "1") == 0)){mPointerController->setPosition(minX+10, yCursorPosition);}}// 鼠标在副屏屏幕左边缘位置,重新赋值displayId,位置改变((主屏id默认为0,副屏id切换后递增))if (displayId != 0 && xCursorPosition==minX){displayId=getPolicy()->notifyDisplayIdChanged();mDisplayId=displayId;// 设置鼠标在主屏右侧显示mPointerController->setPosition(maxX-10, yCursorPosition);}} }else{displayId = mPointerController->getDisplayId();}} else {pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, deltaX);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, deltaY);displayId = ADISPLAY_ID_NONE;}
}

相关文章:

  • Web3 知识体系架构图
  • Shell编程规范与变量
  • VMware安装Windows11
  • ISCC——AI
  • getters的使用
  • uniapp开发微信小程序问题集锦(1)
  • Hadoop概览以及编译hadoop说明
  • SpringBoot高级原理详解
  • 【MyBatis】MyBatis解析全局配置文件源码详解
  • 深度神经网络详解
  • 同旺科技 FLUKE ADPT 隔离版发布 ---- 3
  • pycharm配置python开发环境—miniconda+black+gitlab
  • 【sass插值语句 #{}简介以及使用方法】
  • TG5032CGN TCXO 超高稳定10pin端子型适用于汽车动力转向控制器
  • 以及Spring中为什么会出现IOC容器?@Autowired和@Resource注解?
  • conda常用的命令
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java-详解HashMap
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • springMvc学习笔记(2)
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 大数据与云计算学习:数据分析(二)
  • 后端_ThinkPHP5
  • 离散点最小(凸)包围边界查找
  • 爬虫模拟登陆 SegmentFault
  • 物联网链路协议
  • 一份游戏开发学习路线
  • k8s使用glusterfs实现动态持久化存储
  • ​Java并发新构件之Exchanger
  • ​虚拟化系列介绍(十)
  • #单片机(TB6600驱动42步进电机)
  • $.each()与$(selector).each()
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (42)STM32——LCD显示屏实验笔记
  • (C++哈希表01)
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)SvelteKit教程:hello world
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net 高效开发之不可错过的实用工具
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • ::什么意思
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布
  • [Algorithm][动态规划][两个数组的DP][正则表达式匹配][交错字符串][两个字符串的最小ASCII删除和][最长重复子数组]详细讲解